波动指标:ATR 与布林带
ATR 是尺子不是信号;布林带的两种相反解读,只有一种被数据支持
同一个"股价上穿布林带上轨",市面上有两种完全相反的解读:
- 趋势派:突破上轨 = 强势确认,买入
- 回归派:触及上轨 = 超买,卖出
两种说法流传了几十年,各有各的支持者,各有各的赚钱故事。但它们不可能同时对。
这一节让 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.153pp | 4.41 | 0.0000 * |
| 5 日 | 6634 | +0.551% | +0.280% | +0.271pp | 3.31 | 0.0009 * |
| 10 日 | 6609 | +0.929% | +0.558% | +0.372pp | 3.14 | 0.0017 * |
| 20 日 | 6596 | +1.757% | +1.128% | +0.628pp | 3.59 | 0.0003 * |
下穿下轨(2σ):
| 持有期 | 信号次数 | 差值 | t 值 | p 值 |
|---|---|---|---|---|
| 1 日 | 5033 | -0.243pp | -6.44 | 0.0000 * |
| 5 日 | 5032 | -0.294pp | -3.62 | 0.0003 * |
| 10 日 | 5027 | -0.300pp | -2.79 | 0.0053 * |
| 20 日 | 5020 | +0.054pp | 0.37 | 0.7108 |
裁决
趋势派赢。
- 上轨突破后显著上涨(4/4 显著)
- 下轨破位后显著下跌(1/5/10 日显著,20 日转为不显著)
回归派的说法——"触及上轨是超买该卖"——在数据上是反的。
而这个方向,和上一节 RSI 的结论完全一致:短中期内趋势延续,而不是均值回归。
两个"不同"的指标给出同一个结论。你可能会觉得这是相互印证。
下一节会告诉你不是。RSI6 与布林带位置的相关系数是 0.942——它们本来就是同一个东西的不同写法。所谓"多指标共振",很多时候是同一条信息被数了两遍。
📌 免责:本课为技术教学,所有统计与组合结果均为历史模拟且不计交易成本,不构成投资建议;标的为沪深300 成分股按代码序取样,非精选。
三个结论:
- True Range 必须考虑跳空:比
high-low高 4.3%,而差距集中在 13276 个跳空日——恰恰是最需要正确度量风险的日子 - ATR 是尺子不是信号:倒数加权把波动降 6.4%、回撤改善 1.1pp,但年化也降 1.16pp,夏普基本持平,而且不计成本——它买到的是"更平稳"而非"更赚"
- 布林带对决:趋势派赢。上轨突破后显著上涨(4/4),下轨破位后显著下跌;回归派的解读在数据上是反的
方向与上一节 RSI 完全一致。而这个"一致",下一节会被重新解释——它可能不是印证,是重复计数。
下一节讲量价:OBV 与"资金流向"。先说一个事实——每一笔成交都同时有买方和卖方,成交量本身没有方向。所谓"资金流入",是把成交量按涨跌贴符号后的人为定义。那 OBV 到底有没有信息?数据会给出一个相当干净的答案。
🔎 来源与核验· 3 条,点开核对
