ATR

一句话:ATR(Average True Range)是「一根 K 线平均能波动多大」的滚动平均 —— 它只回答幅度,不回答方向。

用在哪里:第4层 波动率与止损 —— 止损距离 = 1.5~3 × 日线ATR(交易目录说明 四条硬规则第 1 条);它也直接决定你这笔能买多少。

本文数据快照:2026-09-19(北京时间日线收盘后),OKX 公开 API,已收盘 K 线 1D×3266(2017-10-11 ~ 2026-09-19)、4H×6599、1H×3899。现价 2,271(2.78%)**,4H ATR14 = $892(1.09%)。换个时点跑数字会变,看法不变。


一、它解决什么问题:让止损距离跟着市场的呼吸走

新手定止损最自然的方式是「拍一个数」:3%、5%。问题是波动率是变化的 ——

同一个「3%」,在平静期是 1.4 个 ATR(够远),在动荡期只有 0.6 个 ATR(必被扫)。止损不是被趋势打败的,是被波动率打败的。

ATR 的作用就是把「3%」换成「1.5 个 ATR」:距离随市场自动放大缩小,而止损的含义(被随机波动扫掉的概率)保持恒定。

二、怎么算:三步,没有玄学

① 先算真实波幅 TR(True Range)—— 取三个数的最大值:

TR = max( 当天最高 − 当天最低 ,
          |当天最高 − 昨天收盘| ,
          |当天最低 − 昨天收盘| )

后两项是为跳空准备的:如果今天开盘直接跳到昨天收盘之外,光用「最高−最低」会低估真实波动。

② 再取 14 根的平均:ATR(14) = 最近 14 个 TR 的简单平均(SMA14,本项目口径)。

最近 14 根日线的真实数字(atr_study.py A 段,节选最后 4 根):

日期高低前收H−L|H−前收||L−前收|TR
2026-09-1677,34974,95676,5062,3938431,5502,393
2026-09-1777,16775,05575,7892,1121,3787342,112
2026-09-1881,15576,25876,7804,8974,3755224,897
2026-09-1981,95380,56980,7291,3841,2241601,384

看第 3 行:09-18 那天 H−L 是 4,897,而 |H−前收| 是 4,375 —— 这天是从下往上爆拉(开 76,780 → 高 81,155),TR 取 4,897。

ATR 里混着这种「一天走完平时两天路」的日子 —— 所以它不是「平均振幅」,而是「平均最坏情况」。

③ 口径可以不同,但必须固定:同一份数据,SMA14 与 Wilder(EMA)14 的中位差 +2.55%,极端时刻能差 −33% ~ +66%(波动突变时 Wilder 反应更慢,因为它记住更久的历史)。

口径当前值
SMA14(本项目)$2,271
Wilder14$2,358(+3.84%)

两个数字都「对」。但混着用会让止损距离差几个百分点 —— 所以判断卡、daily_card.py、本卡全部用 SMA14。

三、ATR 自己也在变(固定百分比止损为什么失效)

近 300 天与全样本的日线 ATR%(每个数都是「那一天的 ATR ÷ 那一天的收盘价」,不是拿今天的 ATR 去除历史价格):

P5P25中位P75P95最小最大
近 300 天2.16%2.59%3.26%4.02%4.99%1.41%7.40%
全样本(3246 天)2.23%3.17%4.20%5.63%10.11%1.20%18.97%

把倍数折算成百分比距离(近 300 天):

止损口径P5中位P95最小最大
1.5×日线ATR3.23%4.89%7.49%2.12%11.10%
3.0×日线ATR6.47%9.78%14.98%——

同一个「1.5×ATR」,从 2.1% 到 11.1% 都出现过(差 5.2 倍)。 这就是为什么硬规则写的是「1.5 ×日线ATR」,而不是「止损 5%」。

参考:1.5×日线ATR 落在 4~8% 这个「甜点区」的时间占 近 300 天 67.3% / 全样本 57.5%(中位 4.89% / 6.29%)—— 剩下四成时间它在甜点区之外,该跟着变的是仓位,不是止损。

四、【核心】同一套规则,换成 ATR 再看被扫概率

规则:入场 = 任意一根日线收盘,止损 = 入场 − X,之后 N 根日线的最低价 ≤ 止损就算被扫。没有方向过滤,测的纯粹是「距离够不够」。样本 3246 根日线(2017-10 ~ 2026-09):

止损口径样本3 天内被扫10 天内被扫
0.5×ATR315360.0%77.6%
1.0×ATR315332.4%57.1%
1.5×ATR315316.9%39.6%
2.0×ATR31538.8%28.5%
3.0×ATR31533.8%14.5%
固定 2%315362.1%78.4%
固定 3%315347.8%68.9%
固定 5%315327.2%52.3%
固定 8%315312.8%32.4%

读法(两个方向都要看):

  • 从 0.5×ATR 到 3×ATR,被扫概率从 60% 掉到 3.8% —— 止损距离的每一档都真实地换来生存率。
  • 但固定百分比也能「打折实现」同样的效果:固定 8%(12.8%)比 1.5×ATR(16.9%)看起来更不容易被扫。这不是固定百分比更好,而是它换了个更远的距离而已 —— 而 8% 在低波动期(ATR% 2.16%)相当于 3.7 个 ATR,仓位会被压到几乎没意义(见第六节 ⑤)。

ATR 的价值不在「更不容易被扫」,而在「被扫概率不随行情波动漂移」。

五、被扫之后又涨回去:「假扫」占比

同一批被扫的样本,再往后 10 天内最高价 ≥ 入场价,就算「假扫」:

止损口径3 天内被扫其中假扫占比
0.5×ATR60.0%78.5%
1.0×ATR32.4%63.2%
1.5×ATR16.9%48.7%
2.0×ATR8.8%37.8%
3.0×ATR3.8%23.3%

止损越近,扫掉之后价格又走对的比例越高 —— 0.5×ATR 的止损有 78.5% 是假扫。这不是说止损该无限放远(放远 → 仓位变小 → 风险金额虽不变但 2R 的绝对收益也砍半),而是说:止损近 = 你在为随机波动交学费。

六、五个最容易误解的地方(都有反向数据)

① 用未收盘 K 线算 ATR,会低估约 47%

用 1H 数据把每个日线拆成 24 段,只用前 12 小时算 TR,与全天对比(162 个完整日线,2026-04-11 ~ 09-19):

P25中位P75
半天 TR ÷ 全天 TR0.520.670.86
  • 单根 K 线:全天区间的中位完成度只有 67%(最差的一天只完成了 11%)
  • 按「最近 14 天」的平均口径:半天 ATR 2,271 → 低估 47%

含义:盘中看到 ATR 就下单,你用的止损距离偏小;收盘后重算,距离会突然变大。daily_card.py 因此固定剔除最后一根未收盘 K 线(confirm == "0")。

② ATR 只管幅度,完全不含方向

按当日 ATR% 把交易日分成三组,看次日:

组当日 ATR% 中位次日平均|涨跌|次日上涨占比次日日均涨跌
低 1/32.78%1.51%51.9%+0.125%
中 1/34.14%2.01%52.7%+0.109%
高 1/36.30%2.98%52.1%+0.107%

高波动组的幅度几乎翻倍(1.51% → 2.98%),但上涨占比与日均涨跌几乎不动。

(52% 这个绝对值是样本本身的基础概率 —— BTC 这九年整体偏多头;要看的不是 52%,而是三组之间没有差别。)

ATR 大的时候,市场只是走得更远,不是更可能上涨。 把「ATR 放大」当买入理由是错的 —— 这正是 2026-09-19 判断卡 里那句「真空带里价格跑得快,不等于现在是入场点」。

③ ATR 是「过去 14 天的平均」,波动率突变时它慢半拍

21 天窗口下日线 ATR 的变化率:

P5中位P95最大最小
−44.3%−3.9%+127.9%+379.4%−68.3%
  • ATR 21 天翻倍以上(+128%)发生在 P95;最极端的一次 21 天涨了 379%
  • 从低分位(≤P25 2,853):中位 39 天,样本只有 3 次(最短 25 天)—— 小样本,不要当规律

含义:波动率刚放大时 ATR 还没跟上,此时 1.5×ATR 是偏小的。ATR 只会慢慢变大,不会提前预告。

④ 两张「被扫概率表」看起来矛盾,其实是样本期不同

同一套规则、同一个 3% 止损,只换样本窗口:

样本3% 止损 3 天内被扫该期日线 ATR% 中位
全样本(3246 天)47.7%4.20%
近 1000 天41.0%3.42%
近 300 天39.7%3.26%

同一口径往前几天跑,就是此前记录里的 40.5% —— 同一件事。

同一句「止损 3% 有 40% 概率被扫」,在高波动期是错的:全样本是 47.7%。 引用被扫概率时必须写明样本期 —— 这就是 ATR 存在的理由。

⑤ 止损放太远,仓位会被压到没意义(真金白银)

按单笔风险 15 USDT(300 USDT 账户的 5%)、现价 $81,647:

止损口径止损距离名义仓位账户杠杆5x 下 杠杆×止损
4H ATR ×1.5(日内)$1,338(1.64%)$9163.05x8.2% ✅
日线 ATR ×1.5(波段)$3,406(4.17%)$3601.20x20.9% ✅
日线 ATR ×3$6,812(8.34%)$1800.60x41.7% ✅

止损距离翻一倍,仓位就砍一半 —— 风险金额不变,但赚到 2R 的绝对收益也砍一半。所以硬规则写的是「1.5~3×ATR」,不是「越远越好」。

七、用哪个周期的 ATR:跟持仓时长走

一天有 6 根 4H,波动按时间的平方根累积 → 日线 ATR 应该 ≈ 4H ATR × √6 = 2.449。实测(6586 根 4H,约 3 年):

口径值
日线 ATR ÷ 4H ATR(中位)2.61
理论值 √62.449(差 +6.5%)
当前实测892 = 2.55
持仓时长用哪个 ATR当前对应止损(×1.5)
几小时(日内)4H ATR约 1.6%
1~3 天(波段,本项目)日线 ATR约 4.2%
一周以上日线 ATR(×3~4)8%+

最常见的错误:用 4H ATR 算出 1.6% 的止损,却准备持仓两三天。两天 ≈ 1.6% × √8 ≈ 4.5%,1.6% 覆盖不了持仓期的正常波动 —— 结果是被随机波动扫掉,而不是被趋势打败。

八、记忆口诀

ATR = 平均「最坏情况」,不是平均振幅(跳空那天它取 |H−前收|) 它量的是幅度,不是方向 —— ATR 翻倍 ≠ 要涨 固定百分比会骗你,ATR 不骗你:波动率变,距离跟着变 止损距离 ÷ 仓位 = 反比:放远一倍,买少一半 ATR 只记得昨天以前的 14 天,突变时它慢半拍

九、自己复现

python3 ~/trading/scripts/atr_study.py              # A~J 十段全部统计(用缓存,约 2 秒)
python3 ~/trading/scripts/atr_study.py --refresh    # 重新拉 1D/4H/1H
python3 ~/trading/scripts/daily_card.py             # 第4层就是当前 ATR 与合规止损区间
python3 ~/trading/scripts/position_calc.py --entry 81647 --stop 78241 --target 88459 --atr 2271 --fee 0.07
# ↑ 复现第六节⑤ 第一行:止损 1.50×ATR($3,406 / 4.17%)→ 名义仓位 $359.57 / 账户 1.20 倍 / 杠杆×止损 20.9%

各段口径写在脚本输出里;样本量不足的地方(第六节 ③ 的 3 次)已在正文标注。

十、相关