halo 的技术博客

返回

止损这件事,最难的不是”要不要设”,而是”设多远”。固定百分比止损(比如”跌 8% 就走”)有个绕不过去的死穴:它对趋势的长短一无所知。趋势刚起步时,8% 的空间可能还不够一次正常回调,你会被震出场;趋势走了半年、赚了 60% 时,8% 的止损又意味着你要眼睁睁把最后 8 个百分点的利润全部回吐才肯离场。同一把尺子,量所有阶段,注定顾此失彼。

结论先放这:抛物线 SAR(Parabolic Stop And Reverse,Wilder 1978)用一个会自我加速的追踪止损来解决这个矛盾。 它的止损点(SAR)随趋势推进不断上移,而且趋势每创一次新高,追得就更快一点——用一个加速因子 AF 实现”趋势越确立,止损收得越紧”。在自洽合成数据上,SAR 追踪止损的 Sharpe 0.40、最大回撤 −12.4%,全面优于固定 8% 追踪止损(Sharpe −0.00、回撤 −28.7%)和买入持有(Sharpe −0.22、回撤 −29.2%);但代价是在震荡市里它会被价格反复穿越、来回翻边(68 笔交易 vs 固定止损的 13 笔)。附完整 Python 与六类真实陷阱(高阶)。

抛物线 SAR:多头时点在价格下方(绿)、空头时点在价格上方(红)。价格穿过 SAR 即翻边

一、SAR 的核心:一个会加速的追踪点#

SAR 在图上就是一串点:趋势向上时,点画在价格下方,随价格上移充当移动止损;趋势向下时,点画在价格上方。一旦价格触碰到 SAR 点,趋势判定翻转(Stop And Reverse——止损并反手),点跳到价格另一侧重新开始。

递推公式极简:

SAR_{i+1} = SAR_i + AF × (EP - SAR_i)
plaintext
  • EP(Extreme Point,极值点):当前趋势中出现过的最高价(上升趋势)或最低价(下降趋势)。
  • AF(Acceleration Factor,加速因子):从 0.02 起步,每当创出新的极值点就 +0.02,封顶 0.20。

这个公式的几何含义是:SAR 每天朝极值点 EP 靠近一步,步长比例就是 AF。趋势刚开始时 AF=0.02,SAR 慢慢跟;随着不断创新高,AF 一路涨到 0.20,SAR 追得越来越急——趋势越强,止损收得越紧。这正是固定止损做不到的自适应性。

那两行 min(cur, low[i-1], low[i-2]) / max(...) 是 Wilder 原版里容易被忽略的约束:SAR 永远不能穿到最近两根 K 线的价格区间里,否则它会在正常波动里过早触发。这是 SAR 抗噪的关键护栏。

二、加速因子如何”焊住”价格#

把 AF 单独画出来,能看清 SAR 的动态:

加速因子 AF 让 SAR 越涨越快地贴近价格:上图价格与 SAR 追踪线,下图 AF 逐级抬升到 0.20 封顶

看下半张图的阶梯:每次价格创新高,AF 就跳一级,从 0.02、0.04、0.06 一路爬。对应到上半张图,SAR 线(蓝)和价格(黑)之间的缝隙越来越窄——趋势走得越久,止损贴得越紧,锁定的利润越多。等 AF 到了 0.20 封顶,SAR 几乎是”焊”在价格屁股后面,一个正常回调就能触发离场。

这套机制的哲学很清晰:趋势初期给足呼吸空间(AF 小、止损松),趋势成熟后锁死利润(AF 大、止损紧)。 它假设趋势越老越脆弱,越接近尾声越该收紧——这个假设在强趋势里很有效,在假突破里则会送你几张来回车票。

三、回测:SAR 追踪止损 vs 固定百分比止损#

拿最直接的对照实验:都做趋势跟随、只做多。SAR 版本按 trend==1 持仓、翻边即离场;固定止损版本用 20 日突破入场、用固定 8% 的追踪止损(从持仓最高点回撤 8% 离场):

def backtest_fixed_stop(stop_pct=0.08, win=20):
    pos = np.zeros(n); cur = 0; entry_peak = 0
    for i in range(1, n):
        if cur == 0:
            lo = max(0, i - win - 1)
            if i > win and close[i-1] >= np.max(close[lo:i-1]):   # 突破入场
                cur = 1; entry_peak = close[i-1]
        else:
            entry_peak = max(entry_peak, close[i-1])
            if close[i-1] < entry_peak * (1 - stop_pct):          # 回撤触止损
                cur = 0
        pos[i] = cur
    return np.cumprod(1 + pos * ret), pos
python

合成 700 天、趋势与震荡交替的行情上:

SAR 追踪止损 vs 固定 8% 止损 vs 买入持有:SAR 净值更稳、回撤更浅

策略年化收益Sharpe最大回撤交易次数
抛物线 SAR+4.6%0.40−12.4%68
固定 8% 止损−0.0%−0.00−28.7%13
买入持有−3.5%−0.22−29.2%

三点值得说:

  1. SAR 的风控优势是真的。 最大回撤 −12.4%,只有固定止损(−28.7%)和买入持有(−29.2%)的一半不到。自适应收紧的追踪止损,确实把”利润回吐”控制得更好。
  2. 固定 8% 止损几乎白干(Sharpe −0.00)——它的问题正是开头说的:8% 这个距离在趋势初期太紧(被震出)、在回调里又太松(等确认离场时已回吐大半)。
  3. 代价是交易频繁:SAR 打了 68 笔,是固定止损 13 笔的 5 倍多。在震荡市里,价格反复穿越 SAR,翻边、翻边、再翻边,每次翻边都是一笔亏损的小交易。这就是 SAR 最大的软肋——它在无趋势的市场里会被凌迟

四、AF 步长敏感性:贴得越紧,割得越勤#

AF 步长(默认 0.02)直接决定 SAR 追价的激进程度。扫一遍 0.005~0.05:

AF 步长敏感性:步长越大 SAR 追得越紧、交易越频繁,但未必更赚

规律很清楚:步长越大,SAR 贴价越紧,交易次数越多(图上每个点标了笔数)。更紧的止损意味着更快锁利、也意味着更容易被正常波动扫出。这里没有普适最优——激进的短线用大步长快进快出,耐心的趋势跟随用小步长给趋势更多空间。关键是别在历史数据上抠出那个最高点然后当真,那是过拟合。

五、六类真实陷阱#

  1. SAR 是纯趋势工具,震荡市是它的坟场。 68 vs 13 的交易次数差距就是证据。在横盘里 SAR 会被价格反复穿越,每次翻边都亏一点手续费和滑点。实盘里务必配一个趋势过滤器(比如 ADX>25 才启用 SAR),别让它在无趋势时空转。

  2. “Stop And Reverse”的反手假设很激进。 Wilder 原版是止损后立刻反向开仓(多翻空、空翻多)。但翻边点常常就是假突破的位置,无脑反手会在震荡市里两头挨打。本文回测只做多不反手(trend==-1 时空仓),实盘中”反手”要格外谨慎。

  3. 初始化影响头几笔。 SAR 的起始趋势方向、初始 EP 和 SAR 值有一定任意性(本文用 sar[0]=low[0]、初始设为多头)。前几十根 K 线的信号不可全信,回测时最好丢弃 warmup 段再统计指标。

  4. 日线粒度掩盖了日内触发顺序。 SAR 触发用的是当日 high/low,但一根日 K 里价格先摸高还是先破低,日线数据无从还原。若同一天既该加速又该翻边,实际成交价可能与回测假设差很多。高波动品种上这个偏差不可忽视。

  5. look-ahead 泄漏。 SAR 的翻边判定依赖当日 high/low,必须在下一根 K 才能按新方向建仓(本文用 trend[i-1] 决定第 i 天仓位)。若拿当日翻边信号在当日收盘价成交还算合理,但拿当日 SAR 决定当日开盘就买,就偷看了未来。

  6. 封顶 AF 决定了”能追多紧”。 AF 上限(默认 0.20)是隐藏的关键参数。上限太高,SAR 会在强趋势里贴得过死、频繁被小回调扫出;上限太低,趋势尾部利润回吐控制不住。0.20 是 Wilder 经验值,不是普适真理。

结语#

抛物线 SAR 的价值,不在于它能多赚,而在于它把”止损该设多远”这个静态难题,变成了一个随趋势自适应的动态过程:趋势幼小时松、趋势壮大时紧。它在明确趋势里是一台优秀的利润锁定机器(回撤只有固定止损的一半),但在震荡市里会被反复翻边割得体无完肤。用好它的唯一正确姿势,是先用别的工具确认”现在有趋势”,再让 SAR 去管”什么时候该走”——让专业的工具干专业的事。

抛物线 SAR 与追踪止损:用加速因子把出场点焊在价格上
https://blog.halo26812.eu.org/blog/parabolic-sar-trailing
Author halo
Published at 2026年7月16日
版权声明 CC BY-NC-SA 4.0
Comment seems to stuck. Try to refresh?✨