news 2026/10/26 5:15:49

SAR抛物线转向指标:动态止损原理、Python实现与量化回测

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SAR抛物线转向指标:动态止损原理、Python实现与量化回测

1. 先掰开揉碎:SAR到底是一条什么线

1.1 它不是在预测价格,而是在替你跟住价格

第一次把 SAR 指标拖到 K 线图上,绝大多数人的第一反应是:这条点状线怎么像粘在价格背后的一根橡皮筋,价格往上冲,它就在下方一路小跑跟着;价格涨得越久,它贴得越紧,直到某天价格回头轻轻一碰,它瞬间翻到价格上方去。这个直觉是对的,而且比很多公式推导更接近它的本质。

SAR 的全称是Parabolic SAR,中文通常叫抛物线转向指标,也有翻译成停损转向点的。名字里三个词已经把它的全部秘密说完了:抛物线描述的是它随时间加速逼近价格的轨迹形状,转向描述的是它会在价格触碰时掉头,停损点则直接点明了它最初的设计用途——它本来就不是一个进场信号发生器,而是一条会自己加速的移动止损线。

这个出身很重要。很多人拿 SAR 做量化,第一件事就是把它当均线用:翻多就买、翻空就卖,然后回测一看,胜率勉强四成,手续费吃掉一大半,于是得出结论"SAR 没用"。问题不在指标,在于用错了定位。SAR 的设计目标是在趋势中尽可能保住浮盈,同时容忍一定的回撤空间,它对趋势的跟随是有代价的——在震荡行情里它会反复翻转,把止损空间打得很碎。

所以我在实际项目里给 SAR 的角色定位是:趋势状态标记器 + 动态止损锚点,而不是独立的开仓触发器。这个定位一旦定下来,后面所有的参数选择、过滤条件、仓位设计都顺理成章了。

它适合谁?做趋势跟踪、做日内波段、做期货和加密资产的量化同学,都值得把 SAR 认真拆一遍;只做价值投资、持仓周期以季度计的朋友,这个指标对你意义有限,它的加速因子设计决定了它天生属于中短周期。

1.2 加速因子:SAR的油门踩得有多狠

SAR 跟普通均线最大的差别,就在加速因子 AF(Acceleration Factor)这个变量上。均线是等权平滑,今天和一个月前的数据权重是一样的,或者按指数衰减但衰减率固定。SAR 不一样,它有一个会随行情进展而不断变大的系数。

规则很简单:AF 从一个很小的初始值(行业惯例是 0.02)开始,价格每创出一次趋势方向上的新极值,AF 就加上一个步长(同样是 0.02),一直加到上限 0.2 就封顶。这意味着什么?一轮上涨刚开始的时候,AF 只有 0.02,SAR 距离价格很远,给你留足了呼吸空间;等这轮涨势走了很久,价格不断新高,AF 一路加到 0.2,SAR 追赶的速度提升十倍,这时候它几乎贴着价格走,价格稍微回撤一点就会触发翻转。

这是 SAR 最精妙的设计:趋势越成熟,止损越紧。它把"让利润奔跑"和"保护既得利润"这两个矛盾的需求,用一条加速曲线调和在了一起。

用生活化的类比:AF 就像你跟朋友逛街时的距离。刚出门(趋势初期),你们可以隔得远一点,各自看各自的橱窗;逛得越久、越接近目的地(趋势成熟),你就跟得越紧,生怕他拐个弯不见了。上限 0.2 相当于规定"再紧也不能贴着脸",防止一次正常回踩就把你甩下车。

这个 0.02 / 0.02 / 0.2 的组合被写进了几乎所有主流软件的默认值,但它不是唯一的正确答案,只是几十年前手工绘图时代的经验值。后面我会专门用一节讲参数敏感度,那部分才是量化落地的关键。

1.3 和均线、ATR止损放在一起看,差别在哪

很多人问,既然都是止损线,我用均线或者 ATR 通道不香吗?做过对比就知道三者性格完全不同,我用一张表说清楚:

维度SAR移动均线ATR 通道止损
距离价格的方式加速逼近,非线性等距平移,线性固定倍数波动率,恒定
对趋势成熟的反应越久越紧无反应无反应
翻转信号频率高低极低
震荡市表现频繁翻转,噪声大反复穿越,假信号相对稳定
跳空缺口处理容易失真平滑吸收自适应
参数敏感度高中低
最适合的场景中短周期趋势跟踪、止损锚点趋势判定、大方向过滤仓位与风险预算

从这个对比能看出一条明确的工程结论:SAR 适合管"什么时候下车",不适合单独管"什么时候上车"。它翻转过于频繁,单独作为开仓信号会在横盘区被反复摩擦;但作为持仓过程中的止损锚点,它的加速特性是均线替代不了的。

我自己的习惯配置是:用一条中长周期均线或者 ADX 判断大方向是否值得参与,用 SAR 决定具体止损位置,用 ATR 决定拿多少仓位。三个工具各司其职,谁也不越界。这个分工在后面第 4 章会展开成完整规则。

2. 把公式摊开:五个变量如何在每根K线上滚动

2.1 只有四个量在轮转

SAR 的递推公式看起来吓人,拆开其实只有四个量在转:前一期的 SAR 值、极值点 EP、加速因子 AF、当前趋势方向。

核心递推式只有一行:

SAR(t+1) = SAR(t) + AF × (EP - SAR(t))

这个式子的几何含义非常直观:新的 SAR 点,是在旧 SAR 点的基础上,朝着极值点 EP 的方向,走完两者距离的 AF 倍。AF 越小,走得越慢;AF 越大,越接近 EP。因为 AF 会单调递增到上限,这个"每期走固定比例"的过程累积起来,轨迹就是一条抛物线——这也是名字的由来。

四个量的更新逻辑分别是:

  • EP(Extreme Point,极值点):上升趋势中记录自本轮趋势开始以来的最高价,下降趋势中记录最低价。每创一次新极值就更新。
  • AF:初始 0.02,每次 EP 被刷新时加 0.02,封顶 0.2。注意只有 EP 刷新才加,价格没创新高、没创新低的时候 AF 不动。
  • 趋势方向:当 SAR 被价格实际穿越时翻转。上升趋势中,若当期最低价跌破当期 SAR 值,翻转为下降趋势。
  • SAR 的新值:按递推式计算,然后施加极值约束(下面细说)。

极值约束这一条在教科书写得很含糊,但它决定了你算出来的 SAR 和行情软件对不对得上,必须单独讲。

2.2 极值约束:SAR不能跑到最近两期的另一侧去

规则是:上升趋势中,新的 SAR 不能高于前两根 K 线的最低价;下降趋势中,新的 SAR 不能高于……准确说不能低于前两根 K 线的最高价。

为什么要有这条约束?因为如果某一轮涨势非常猛烈,EP 和 SAR 之间的距离被拉得很大,按公式递推出来的 SAR 有可能一下子跳到最近两根 K 线的价格区间里面去,甚至超过最近的最低价。那就等于说"止损位设在了已经被跌破的位置",逻辑上自相矛盾。

这条约束的作用相当于给 SAR 加了一个"不许穿墙"的护栏,让它始终待在最近两期价格区间的外侧。实现的时候就是一句min或max:

# 上升趋势 sar_candidate = min(sar_candidate, low[i-1], low[i-2]) # 下降趋势 sar_candidate = max(sar_candidate, high[i-1], high[i-2])

看着简单,但它有个副作用:约束会覆盖掉 AF 的加速效果。趋势极其陡峭的时候,SAR 会被这条约束顶住,实际移动速度慢于公式预期,跟价格之间的距离比你想的要宽。这一点在做止损距离统计的时候会明显感觉得到。

2.3 反转那根K线上,SAR取什么值

这是第二个几乎所有人第一次实现都会搞错的地方。

反转发生时,新的 SAR 值不等于按递推式算出来的那个穿价的值,而是直接取上一轮的 EP。上升趋势转下降时,新 SAR = 之前的最高点 EP;下降转上升时,新 SAR = 之前的最低点 EP。同时 EP 重置为当根 K 线的极值(反转后的新方向极值),AF 重置回 0.02。

为什么这么设计?因为趋势反转意味着之前的极值区域变成了未来的阻力/支撑,把止损锚点直接放在那个位置,是最符合逻辑的选择。如果按递推式算,反而会得到一个莫名其妙的位置。

我见过不少人写的版本是"反转时把 SAR 设为当前收盘价",回测跑出来的曲线完全不一样,信号数量能差出百分之三四十。对数的时候一定要盯住这段。

2.4 初始值怎么定,很多人第一步就错了

递推总得有个起点。常见做法有两种:

第一种,用前两根 K 线判断初始方向:如果第二根的中点高于第一根的中点,认为初始处于上升趋势,初始 SAR 取前两根的最低价,初始 EP 取前两根的最高价;反之亦然。

第二种,直接人为指定初始方向,比如默认从上升趋势开始。这种做法在长样本上影响可以忽略,但在短周期、高频翻转的品种上,前几十根的信号可能完全是错的。

我的建议是:永远用前两根 K 线的相对位置自动判断初始方向,并且把前 N 根(比如 20 根)的 SAR 值标记为预热期,不参与信号统计。递推类指标的初始误差会沿着链条传播,虽然 SAR 有极值约束会自我纠正,但预热期省掉几行代码的麻烦,能避免后面回测对不上数时的一堆排查。

3. 用Python把SAR算出来:完整实现与三个高频错误

3.1 一个可以直接跑的版本

我把上面所有规则落成代码,输入是一个含high、low列的 DataFrame,输出带趋势方向、AF、EP 的完整结果。这套写法我在多个项目里用过,和主流行情软件的数值能够对上(差异在小数点后两位,属于浮点与前后复权口径的差别)。

import numpy as np import pandas as pd def parabolic_sar(df, af_start=0.02, af_step=0.02, af_max=0.2): high = df["high"].to_numpy(dtype=float) low = df["low"].to_numpy(dtype=float) n = len(high) sar = np.full(n, np.nan) trend = np.zeros(n, dtype=int) af_arr = np.full(n, np.nan) ep_arr = np.full(n, np.nan) if n < 3: return pd.DataFrame({"sar": sar, "trend": trend, "af": af_arr, "ep": ep_arr}, index=df.index) # 初始方向:用前两根K线中点比较 is_up = (high[1] + low[1]) >= (high[0] + low[0]) if is_up: ep = max(high[0], high[1]) sar[1] = min(low[0], low[1]) trend[1] = 1 else: ep = min(low[0], low[1]) sar[1] = max(high[0], high[1]) trend[1] = -1 af = af_start af_arr[1] = af ep_arr[1] = ep for i in range(2, n): prev_sar = sar[i - 1] cur_sar = prev_sar + af * (ep - prev_sar) if is_up: cur_sar = min(cur_sar, low[i - 1], low[i - 2]) if low[i] < cur_sar: # 向下反转 is_up = False cur_sar = ep # 取上一轮最高点 ep = low[i] af = af_start else: if high[i] > ep: ep = high[i] af = min(af + af_step, af_max) else: cur_sar = max(cur_sar, high[i - 1], high[i - 2]) if high[i] > cur_sar: # 向上反转 is_up = True cur_sar = ep # 取上一轮最低点 ep = high[i] af = af_start else: if low[i] < ep: ep = low[i] af = min(af + af_step, af_max) sar[i] = cur_sar trend[i] = 1 if is_up else -1 af_arr[i] = af ep_arr[i] = ep return pd.DataFrame({"sar": sar, "trend": trend, "af": af_arr, "ep": ep_arr}, index=df.index)

调用很简单:

res = parabolic_sar(df) df["sar"] = res["sar"] df["sar_trend"] = res["trend"] df["sar_flip"] = df["sar_trend"].diff().ne(0) & df["sar_trend"].notna()

af和ep这两列一定要输出,它们是排错时的关键线索。回测发现问题时,先看 AF 是不是到了 0.2 就卡住了,再看 EP 有没有跟着新高新低更新,基本能定位八成问题。

3.2 错误一:约束顺序写反,结果全盘偏移

最常见的实现错误,是把极值约束和反转判断的顺序搞混,或者拿当期(第 i 根)的低点去约束当期算出来的 SAR。

正确的做法是:先用前两根(i-1、i-2)的低点做约束,得到当期 SAR,再拿当期的低点去和这个 SAR 比较判断是否反转。因为当期的 SAR 是给"下一根"用的参考位,约束不能用当期的数据,否则就是典型的未来函数。

我早期写过一个版本,直接用low[i]参与约束,看起来只是细节差异,实际回测年化能虚高一大截,因为 SAR 提前知道了当期最低点,永远不会被跌破。这个坑非常隐蔽,因为它不报错,只是让结果好得不真实。

3.3 错误二:反转当根直接赋值,后续链条断裂

第二个错误我在两个团队的项目里都见过。反转时把 SAR 设成了 EP,但忘了同时重置 EP 和 AF。结果就是:翻转后的第一根,AF 还停留在 0.2(上一轮涨势累积到顶的值),SAR 一上来就贴着价格跑,下一根立刻又翻转,来回打脸。

必须三条一起做:

is_up = not is_up cur_sar = ep # 取旧EP ep = low[i] # EP重置为新方向的极值 af = af_start # AF重置为0.02

少做任何一条,翻转后的前几根都是错的。这类 bug 在图形上看不出来,只在信号统计里表现为"翻转后立刻反向翻转"的比例异常高。

3.4 错误三:数据口径不对齐,两套结果永远对不上

SAR 用的是最高价和最低价,这两个字段对数据口径极其敏感。几个必须确认的点:

  • 复权方式:用不复权数据算出的 SAR,和用前复权数据算出的 SAR,在除权日附近会完全脱节。做回测必须用前复权,或者用后复权但记得交易价格也要对应口径。
  • 时间周期:日线 SAR 和分钟 SAR 是两套东西。跨周期混用(比如用日线 SAR 指导 15 分钟入场)在逻辑上说得通,但回测时必须严格对齐时间戳,避免用未收盘的日线数据。
  • 合成 K 线的起点:从周线数据合成月线,和从日线数据合成月线,起止点可能不同,算出来的 SAR 会有差异。做多周期策略时统一从最小周期向上聚合。

一个实用的对数技巧:拿某一段明显单边上涨的行情(比如连续创新高十五根以上的区间),两端数据各算一遍。真突破区间里 AF 应该能一路加到上限 0.2 并保持住,如果算出来的 AF 中途反复重置,说明趋势方向判断出了问题,往回查初始值和反转逻辑。

4. 把SAR变成可交易信号:从裸翻转到三层过滤

4.1 裸翻转信号的收益结构是什么样

先说清楚裸信号能做什么、不能做什么,这决定了后面要不要加过滤。

把sar_trend直接当作方向信号,次日开盘按信号方向持仓,这个策略的收益特征非常典型:在单边趋势里表现极好,在横盘里被反复止损。它有一个很有意思的性质——盈亏比通常不错,但胜率偏低,因为它的止盈机制就是"等反转",反转之前的所有回撤都被吃掉了,反转时又往往把浮盈吐回去一大截。

我用过的几组数据能说明问题(不同市场差异很大,这里只说结构):裸 SAR 反转策略的胜率普遍在 30%~45% 区间,盈亏比能做到 2 以上才不亏钱。而实际回测中,扣掉手续费和滑点后,裸信号在多数流动性好的品种上都是负期望。这不是 SAR 的错,是因为翻转次数太多,交易成本被放大了。

结论很清楚:裸翻转信号只能作为方向底稿,必须经过滤和止损优化才有交易价值。

4.2 第一层过滤:趋势强度不够就别参与

最直接有效的过滤是 ADX。ADX 低于某个阈值时,说明市场处于无趋势状态,此时 SAR 的翻转大概率是噪声。常用阈值是 20,保守一点用 25。

from collections import deque def adx(high, low, close, n=14): up = high.diff() dn = -low.diff() plus_dm = np.where((up > dn) & (up > 0), up, 0.0) minus_dm = np.where((dn > up) & (dn > 0), dn, 0.0) tr = pd.concat([high - low, (high - close.shift()).abs(), (low - close.shift()).abs()], axis=1).max(axis=1) atr_ = tr.ewm(alpha=1/n, adjust=False).mean() pdi = 100 * pd.Series(plus_dm, index=high.index).ewm(alpha=1/n, adjust=False).mean() / atr_ mdi = 100 * pd.Series(minus_dm, index=high.index).ewm(alpha=1/n, adjust=False).mean() / atr_ dx = 100 * (pdi - mdi).abs() / (pdi + mdi) return dx.ewm(alpha=1/n, adjust=False).mean(), pdi, mdi

第二层是大周期方向一致性。日线 SAR 翻多,但周线 SAR 还在空头,这种信号的可靠性明显低于两周期共振。实现上把周线趋势向前填充到日线,只做与周线同向的信号。

第三层是波动率门槛。ATR 占价格比例过低的品种(比如长期波动率低于 0.5% 的),SAR 的翻转几乎全是噪声,赚的钱不够覆盖成本,直接排除。

三层过滤叠上去,信号数量通常只剩裸信号的三到五成,但胜率和期望值的改善非常显著。

4.3 SAR天生就是止损线,别浪费这个特性

很多人用 SAR 做信号,却另起一套止损逻辑,比如固定 2% 止损——这等于把 SAR 最有价值的部分扔掉了。

正确用法是:入场后,止损位直接锚定在当前 SAR 值上,每根 K 线更新。上升趋势中,SAR 会随着 AF 加速逐步上移,浮盈越多止损越紧,这是一套天然的移动止盈机制。

实操上要注意两点。第一,SAR 值是"点"不是"线",实盘要以收盘确认为准,盘中刺穿 SAR 但收盘拉回的情况非常常见,用盘中价止损会被打得很惨。第二,SAR 距离价格的比例要设一个上限,比如初始止损距离不超过 8%,超过就说明入场位置太差,干脆不入场。这条规则能挡掉很多"信号出现时价格已经跑远"的追高单。

4.4 仓位:用ATR把单笔风险固定住

止损位有了,仓位就好算了。目标是把每笔交易的最大亏损控制在一个固定比例(比如总权益的 1%)。

止损距离 = |入场价 - 当前SAR| 单笔风险金额 = 总权益 × 风险比例 仓位数量 = 单笔风险金额 / 止损距离 仓位上限 = 总权益 × 单品种上限比例 最终仓位 = min(仓位数量, 仓位上限)

这个算法看着朴素,但它解决了一个大问题:SAR 的止损距离是变化的(趋势初期宽、成熟期窄),如果仓位固定,风险敞口就完全不可控。按距离反推仓位,能让每笔交易的风险始终一致。

需要注意,SAR 距离在趋势成熟期可能非常窄(AF 已经到 0.2),反推出来的仓位会非常大,容易触及单品种上限。所以上限那一步不能省,否则会在最不该重仓的时候重仓。

4.5 完整规则表

把上面所有内容整合成一张可以直接照着写的规则表:

环节规则说明
方向过滤ADX > 20 且 日线 SAR = 周线 SAR 方向缺一不交易
入场SAR 翻转当根收盘确认,次日开盘入场不用盘中价
入场拒绝初始止损距离 > 8%追高保护
止损收盘跌破 SAR 则次日开盘平仓盘中刺穿不动
加减仓不加减,一次性建仓避免复杂度
仓位按 ATR/SAR 距离反推,单笔风险 1%设单品种上限
反向信号已有多头遇到 SAR 翻空,先平再多不做空避免过度交易
冷却同一方向翻转后 3 根 K 线内不再开仓杀震荡

表格最后一行"冷却期"是我加了很久才加上的,效果意外地好。横盘区 SAR 可能连着翻转三四次,加一个最小持仓周期或冷却期,能砍掉一大半的垃圾交易。

5. 参数敏感度与回测陷阱:SAR最容易翻车的两个地方

5.1 AF的步长和上限,到底该怎么调

0.02 / 0.02 / 0.2 这组默认值不是神圣不可侵犯的,但它被无数人验证过,说明鲁棒性尚可。我做过一轮系统性的参数扫描,把结果整理成下面这张定性表:

AF 起始AF 步长AF 上限行为特征适用场景
0.020.020.20标准行为,跟随与稳固平衡通用默认
0.010.010.10极慢,止损极宽,翻转极少长周期趋势
0.050.050.30激进,快速贴价,翻转多短线、高波动品种
0.020.040.20中期加速快,后面慢抓突破初期
0.020.020.10封顶早,后期不再收紧防止过早离场

调参的核心原则是:变化要在一个区间内保持稳健,而不是在某一个点上表现突出。如果 AF 步长从 0.02 改到 0.025,回测年化从 15% 掉到 4%,那这个参数就是过拟合的,直接放弃。真正的有效参数,应该是在一个连续区间内结果都比较平稳。

我一般做法是画出参数热力图,横轴步长、纵轴上限,看收益分布的"高原"在哪里,选高原中心而不是最高峰。最高峰大概率是噪声。

5.2 回测里最容易踩的六个坑

未来函数。前面说过三次了,这里再强调:SAR 的计算只能用当前及历史数据,反转判断用当期 K 线,但 SAR 值本身是给下一根用的。信号执行必须shift(1)。

手续费低估。SAR 翻转频率高,双边手续费加滑点按万分之三算,一年翻几十次就是几个点的成本。我见过不少回测把手续费设成万分之一,实盘直接腰斩。宁可设高一点。

停牌与涨跌停。信号出现但当天无法成交(一字板、停牌),回测里如果不做处理,等于假设你总能在理想价位买到。处理方式是:信号日的下一根 K 线若成交量为零或价格等于涨跌停价,顺延到第一个可成交的 K 线。

数据幸存者偏差。只用当前还在交易的标的做回测,会系统性高估收益。这个在股票池里尤其明显,需要把退市、长期停牌的标的也纳入样本。

参数在同一段数据上调。调参、验证必须用不同时间段,或者用滚动窗口做样本外检验。这一点人人都知道,但真做的时候图省事的人不少。

忽略资金容量。小资金做的策略,放大到一定规模后滑点会吃掉全部收益。SAR 这种高频翻转策略对容量尤其敏感,回测时最好按保守的滑点模型估一遍。

5.3 滚动样本外检验:我是怎么做的

单次样本外检验的说服力有限,因为你可能恰好抽到一段好行情。我用的是滚动窗口:把十年数据切成若干个三年窗口,每两年做参数搜索,后一年做验证,窗口向前滚动一年,循环。

评估指标不能只看年化收益,要看各窗口的收益一致性。我的判断标准是:如果滚动窗口里超过六成的窗口是正收益,且最大回撤不超过单一窗口的 40%,这个策略才算有初步的稳健性。只看总收益的评估方式,很容易被某一年的爆发掩盖掉其余年份的持续亏损。

这套流程跑下来很慢,但能过滤掉绝大多数看上去很美的东西。

6. 震荡市与跳空:SAR在真实行情里的失真场景

6.1 横盘区为什么会被反复打脸

SAR 在震荡区间的表现,是所有人对它最大的怨念。原因不复杂:它的翻转条件是"价格跌破/突破 SAR",而在窄幅区间里,价格每隔几根 K 线就会触及一次 SAR,于是翻转、翻转、再翻转。

更麻烦的是,每次翻转都会把 AF 重置为 0.02,SAR 重新远离价格,然后下一次翻转又在不远处发生。结果就是在同一个价格区间里连续做错四五次,每次亏一点,累积起来能吃掉一整轮趋势的利润。

处理方式有几种,我按有效性排序:ADX 过滤是最直接的一层;最小持仓周期(比如进场后至少持有 5 根 K 线才允许新信号生效)是第二层;波动率比值过滤(当前 ATR 除以长周期 ATR,比值过低的区间视为无趋势)是第三层。

一个实操细节:ADX 是滞后指标,它的上升往往意味着趋势已经走了一段。所以我不会等 ADX 掉头才平仓,ADX 只用在入场过滤上,出场仍然交给 SAR。用滞后指标做出场,几乎一定会把利润吐回去。

6.2 跳空缺口下的SAR失真

SAR 的递推依赖连续的价格序列,遇到跳空缺口会失真。典型场景:上升趋势中,某天大幅低开并跌破 SAR,按规则应该反转为空头,SAR 直接跳到之前的最高点——这个位置可能离当前价格非常远,导致空头信号刚出现,止损距离就大得离谱。

我的处理方式是加一条跳空过滤:如果开盘价与前一日的 SAR 之间出现超过一定比例的缺口(比如 2%),当根 K 线不执行翻转,等收盘确认。如果收盘仍在 SAR 另一侧,下一根再翻转。

这条规则的本质是把"盘中穿越"和"确认穿越"区分开。跳空造成的穿越往往缺乏后续动能,回补的概率不低,等一根 K 线确认能过滤掉相当一部分假破位。

6.3 长影线怎么处理

带长影线的 K 线是 SAR 的另一类克星。比如上升趋势中出现一根下影线极长的 K 线,最低价远低于 SAR,触发了翻转,但收盘价却回到了高位,甚至创了新高。按规则翻转已经发生了,多头被止损出局,随后价格继续上涨。

这类信号的根源在于用最低价判断穿越,而低点可能是瞬间的流动性事件。两种改进思路:一是用收盘价判断穿越(close替代low),代价是反应变慢;二是要求穿越必须伴随收盘确认,本质同上。

我试过两种,结论是在波动率高的品种上用收盘价判断,在流动性好、点差小的品种上用最低价判断。这是个需要根据标的特性做的选择,没有通用答案。

7. 最后分享几条我自己的使用心得

用 SAR 这些年,有几个体会是文档里不会写、但实操中很难绕开的。

第一条,SAR 的价值主要在"退出",不在"进入"。把它当止损线用,配合一个独立的入场逻辑(均线突破、通道突破都行),整体表现明显好于把它作为双向信号源。这个结论在我试过的品种里相当稳定。

第二条,别在同一个策略里同时用两个以上会翻转的指标。SAR 加抛物线转向加超级趋势,看起来三重确认很稳,实际是三个高相关信号的叠加,过滤效果远不如一个趋势指标加一个波动率指标来得实在。

第三条,先做图形验证,再做数据验证。任何 SAR 实现写完后,先拿一段明显的单边行情画出来看形状——抛物线应该平滑加速、紧密跟随,不应该出现锯齿状的跳跃。图形上一眼能看出的毛病,用统计数据可能要排查半天。

第四条,参数别一会调这个一会调那个。AF 起始值、步长、上限三个参数是联动的,单独调一个往往会得到误判。要调就在固定另外两个的前提下动一个,记录清楚每组配置的完整结果,别凭印象对比。

还有一点关于预期管理。SAR 这类趋势跟踪工具,天生是"少数大赚覆盖多数小亏"的收益结构,胜率不会好看,连续亏损期可能很长。如果你的资金性质或者心理承受能力撑不住连续二三十笔小亏,那这个工具再好用也不适合你。工具要匹配自己的实际情况,这一点比任何参数优化都重要。

行情数据、回测结果都只代表历史统计,任何策略在未来的表现都存在不确定性,实际投入前务必用充分的小规模样本做验证,并把最大回撤按回测值的两倍来预估自己的承受能力。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/26 5:15:41

YOLOv5在道路缺陷检测中的应用与实践

1. 项目概述&#xff1a;当YOLO遇上道路缺陷检测去年帮学弟调试毕业设计时&#xff0c;我们尝试用YOLOv5检测校园路面的裂缝和坑洼。当模型成功标出第一处龟裂时&#xff0c;那种"机器真的能看懂路面"的震撼感&#xff0c;让我意识到目标检测在基建维护中的巨大潜力。…

作者头像 李华
网站建设 2026/10/26 5:15:21

JavaScript数组方法:从循环到函数式编程的演进

1. 从循环到链式调用的范式迁移十年前我刚接触JavaScript时&#xff0c;处理数组数据最常用的方式就是for循环。那时候的代码看起来总是冗长而重复&#xff0c;每个项目里都充斥着类似这样的片段&#xff1a;const numbers [1, 2, 3, 4, 5]; let sum 0; for (let i 0; i <…

作者头像 李华
网站建设 2026/10/26 5:15:21

轻型AI中台:面向财务对账与业财协同的低代码数据治理方案

1. 为什么“轻型AI中台”不是又一个PPT概念&#xff0c;而是财务与运营团队的止痛药上周三下午四点十七分&#xff0c;我坐在客户财务总监办公室里&#xff0c;听她第三次重复同一句话&#xff1a;“我们光是核对销售单和回款单&#xff0c;每月就要抽调两个人、连续干十一天—…

作者头像 李华
网站建设 2026/10/26 5:15:01

数据驱动建模在多体系统中的应用与实践

1. 项目概述&#xff1a;多体系统数据驱动建模的核心价值多体系统建模在工程仿真、机器人控制、生物力学等领域有着广泛应用。传统基于物理定律的建模方法需要精确知道系统各部件的质量、刚度、阻尼等参数&#xff0c;这在复杂系统中往往难以实现。数据驱动建模通过直接从系统输…

作者头像 李华
网站建设 2026/10/26 5:13:35

Cheat Engine内存修改工具从入门到精通

1. 为什么我们需要内存搜索工具十年前我第一次接触游戏修改时&#xff0c;用的是一个叫FPE的古老工具。那时候为了找到《仙剑奇侠传》里李逍遥的体力值地址&#xff0c;需要反复输入变化的数值进行筛选&#xff0c;整个过程就像在黑暗中摸索。直到后来发现了Cheat Engine&#…

作者头像 李华
网站建设 2026/10/26 5:13:17

基于矢量的形状编码与分类:从设计思路到实操细节的完整指南

地图泛化这个方向&#xff0c;做过的人都知道痛在哪里。矢量数据不像栅格影像那样规整&#xff0c;一条道路、一栋建筑、一片水域&#xff0c;在数据层面就是一堆带属性的坐标点序列&#xff0c;采样密度不均匀、节点数量差异巨大、几何形态千变万化。传统做法靠人工写规则做化…

作者头像 李华