← 返回目录
p2.3动手⏱ 约 15 分钟

波动指标:ATR 与布林带

ATR 是尺子不是信号;布林带的两种相反解读,只有一种被数据支持

🔎 最后验证 2026-07📚 来源:跳空影响、ATR 仓位与布林带对决于 2026-07-31 在 ECS 实测(50 只沪深300 成分股,2010-01-04~2026-07-29),输出见 code/outputs/stdout.txt🧰 pandas 3.0.5、numpy 2.5.1、scipy 1.18.0
为什么学这个

同一个"股价上穿布林带上轨",市面上有两种完全相反的解读:

  • 趋势派:突破上轨 = 强势确认,买入
  • 回归派:触及上轨 = 超买,卖出

两种说法流传了几十年,各有各的支持者,各有各的赚钱故事。但它们不可能同时对。

这一节让 50 只标的的数据来裁决。顺便讲清楚 ATR——一个被广泛误用的指标:它根本不是买卖信号,而是一把尺子。

💡 打个比方

温度计不告诉你该穿什么衣服,它只告诉你现在多少度。

"该穿羽绒服还是短袖"是决策,"现在 5 度"是度量。把温度计当成穿衣指南,你会得到很多互相矛盾的结论——因为同样是 5 度,有人要跑步有人要午睡。

ATR 是温度计。它度量波动,不指示方向。

一、True Range 为什么必须考虑跳空

最朴素的波动度量是 high - low。但它漏掉了一整类风险:

def true_range(g):
    pc = g["close"].shift(1)
    return pd.concat([(g["high"] - g["low"]).abs(),
                      (g["high"] - pc).abs(),     # ← 跳空高开
                      (g["low"] - pc).abs()], axis=1).max(axis=1)

实测(50 只标的):

仅用 high-low 的日均波幅   7.5729
完整 True Range 的日均波幅 7.8960  (高 4.3%)
TR 比 high-low 大 20% 以上的交易日:13276 个 ← 这些全是跳空日

平均只差 4.3%,听起来不多。但关键在于差在哪里:

13276 个跳空日——而跳空日往往是出消息的日子,也正是你最需要正确度量风险的日子。只用 high-low,等于在最危险的那些天里系统性低估风险。

二、ATR 的正确用途:仓位尺子

很多人把 ATR 当信号用("ATR 放大说明要变盘")。它的正确用途是决定仓位大小:波动大的标的,少放钱;波动小的,多放钱——让每个标的贡献相近的风险。

实测:50 只标的组合,等权 vs ATR 倒数加权(每日再平衡,不计成本)

年化年化波动最大回撤夏普
等权仓位11.49%22.23%-45.6%0.52
ATR 倒数加权10.33%20.82%-44.5%0.50

诚实的结论:

  • 波动率降低 6.4%,最大回撤改善 1.1pp —— 风险控制确实起作用了
  • 但年化也降了 1.16pp,夏普 0.52 → 0.50,基本持平
  • 也就是说:它买到的是"更平稳",不是"更赚"
⚠️ 避坑

这张表还有一个更大的问题:它不计交易成本。

等波动率加权需要每日再平衡——波动率天天在变,权重就天天在变。而等权组合只需要偶尔调整。

回想 p0.2 的死亡线方法:一个策略能承受多少成本,取决于它的换手率。等波动率加权的换手率远高于等权。真实成本下,这 6.4% 的波动率改善很可能被交易成本吃光,甚至变成净负。

P5.7 会用死亡线方法把这笔账算完。在那之前,请把这张表理解为"上限估计",而不是"可实现结果"。

🔧 动手做:high-low 漏掉的那部分波动,正是最要命的(5 分钟)

python volatility_indicators.py,对比"只用当日 high-low"和"完整 True Range"(把隔夜跳空也算进去)。

你会看到(实测):50 只标的,只用 high-low 的日均波幅 7.57,完整 True Range 7.90(高 4.3%);而在跳空剧烈的日子,TR 比 high-low 大 20% 以上。

想明白:high-low 只量了"当天盘中"的波动,漏掉了隔夜跳空——而跳空恰恰发生在最危险的时候(利空低开、涨停一字)。ATR 用 True Range 就是为了把这部分算进去。ATR 是尺子(量波动、定仓位),不是信号——别拿它当买卖点。

三、布林带对决:趋势派 vs 回归派

上穿上轨(2σ) —— 趋势派说买入(应显著为正),回归派说卖出(应显著为负):

持有期信号次数信号后均值基准均值差值t 值p 值
1 日6638+0.208%+0.055%+0.153pp4.410.0000 *
5 日6634+0.551%+0.280%+0.271pp3.310.0009 *
10 日6609+0.929%+0.558%+0.372pp3.140.0017 *
20 日6596+1.757%+1.128%+0.628pp3.590.0003 *

下穿下轨(2σ):

持有期信号次数差值t 值p 值
1 日5033-0.243pp-6.440.0000 *
5 日5032-0.294pp-3.620.0003 *
10 日5027-0.300pp-2.790.0053 *
20 日5020+0.054pp0.370.7108

裁决

趋势派赢。

  • 上轨突破后显著上涨(4/4 显著)
  • 下轨破位后显著下跌(1/5/10 日显著,20 日转为不显著)

回归派的说法——"触及上轨是超买该卖"——在数据上是反的

而这个方向,和上一节 RSI 的结论完全一致:短中期内趋势延续,而不是均值回归。

两个"不同"的指标给出同一个结论。你可能会觉得这是相互印证。

下一节会告诉你不是。RSI6 与布林带位置的相关系数是 0.942——它们本来就是同一个东西的不同写法。所谓"多指标共振",很多时候是同一条信息被数了两遍。

❓ 测验
你打算用 ATR 倒数加权替代等权,来降低组合风险。实盘前最该补做的一件事是?
✏️ 填空
True Range 取三者的最大值,其中两项用到前一日收盘价,专门为了处理 ___ 日的风险。

📌 免责:本课为技术教学,所有统计与组合结果均为历史模拟且不计交易成本,不构成投资建议;标的为沪深300 成分股按代码序取样,非精选。

✅ 小结

三个结论:

  1. True Range 必须考虑跳空:比 high-low 高 4.3%,而差距集中在 13276 个跳空日——恰恰是最需要正确度量风险的日子
  2. ATR 是尺子不是信号:倒数加权把波动降 6.4%、回撤改善 1.1pp,但年化也降 1.16pp,夏普基本持平,而且不计成本——它买到的是"更平稳"而非"更赚"
  3. 布林带对决:趋势派赢。上轨突破后显著上涨(4/4),下轨破位后显著下跌;回归派的解读在数据上是反的

方向与上一节 RSI 完全一致。而这个"一致",下一节会被重新解释——它可能不是印证,是重复计数。

下一节讲量价:OBV 与"资金流向"。先说一个事实——每一笔成交都同时有买方和卖方,成交量本身没有方向。所谓"资金流入",是把成交量按涨跌贴符号后的人为定义。那 OBV 到底有没有信息?数据会给出一个相当干净的答案。

下一节 → 量价指标:OBV 与「资金流向」这个说法
🔎 来源与核验· 3 条,点开核对
本节每个关键论断都对应一个可追溯的来源 —— 这是本课程"靠谱、不过时"的底线。
「50 只标的:仅用 high-low 的日均波幅 7.5729,完整 True Range 7.8960(高 4.3%);TR 比 high-low 大 20% 以上的交易日 13276 个」
📚 本节 code/volatility_indicators.py,2026-07-31 于 ECS 实测,输出见 code/outputs/stdout.txt✓ 已核验 2026-07
「50 只标的组合(2010-01-05~2026-07-29,每日再平衡,不计成本):等权 年化 11.49%/波动 22.23%/回撤 -45.6%/夏普 0.52;ATR 倒数加权 年化 10.33%/波动 20.82%/回撤 -44.5%/夏普 0.50」
📚 同上实测✓ 已核验 2026-07
「布林带上穿上轨(2σ)后 1/5/10/20 日差值 +0.153/+0.271/+0.372/+0.628pp,p 值 0.0000/0.0009/0.0017/0.0003,全部显著为正;下穿下轨后 1/5/10 日 -0.243/-0.294/-0.300pp 显著为负,20 日 +0.054pp 不显著」
📚 同上实测(Welch t 检验)✓ 已核验 2026-07
组合结果不计交易成本;等波动率加权换手率远高于等权,真实成本下的净效果见 P5.7。
智图软件的赞赏码
都看到这了,打个赏呗!
接下来 · p2.4
量价指标:OBV 与「资金流向」
继续读下一节 →