真实波幅均值(ATR,Average True Range)是量化交易里最常出现的波动率指标。它由技术交易之父 J. Welles Wilder 于 1978 年提出,一句话就能理解:把一段时间内的最大价格波动“平均化”,帮助交易者看清市场的“身体语言”。无论你在股票、期货还是数字货币市场,只要会用 ATR,就能更聪明地分配资金、设置止损、动态调整仓位。下文将拆解三大实战场景,并提供可复制代码与常见疑问速查表。
精准资金分配:让每只合约“同权波动”
很多投资者喜欢把钱平均分到数个品种,却忽略了波动差异——
10 万元保证金买入 A 品种,日波幅 1%,和 10 万元买入日波幅 5% 的 B 品种,风险完全不对等。ATR 可以轻松拉平这种差异:
- 先把 1% 本金作为一个风险单位;
- 计算每手合约对应的 ATR×合约乘数;
- 用风险单位除以该值,得出应开手数。
示例
- 100 万本金,风险单位=1 万
- 黄金主力 AU2308:ATR 6.6,手数=10000÷(6.6×1000)≈1 手
- 螺纹 RB2308:ATR 27.3,手数=10000÷(27.3×10)≈4 手
👉 点此查看 ATR 计算过程中的超清数据接口示例,5 分钟跑通代码,立即开始量化测试。
资金分配完成后,“篮子”里的每个头寸在同等正常波动下,对总净值的影响被控制在 ±1% 以内。
动态止损:用 ATR 取代僵硬的“8%铁律”
以 8% 固定止损举例:
- 对慢腾腾的红利股,8% 可能 过宽;
- 对高杠杆的原油合约,8% 又显得 太窄。
利用 ATR 可以把止损价与当前波动同步伸缩:
- 多仓进场价:P
- 止损价:P - m×ATR(m 称为碰止损系数,常用 2 ~ 3)
- 顺势加仓价:P + 0.5×ATR
优点
✓ 小波动停止回吐,大波动不被震出
✓ 无需反复人工调节,完全交由算法
代码片段
# 触发止损
if quote.last_price <= entry_price - 2 * current_atr:
target_pos.set_target_volume(0)仓位再平衡:波动收缩时加杠杆,扩大时减杠杆
市场盘整会导致 ATR 持续走低。若仍用最初计算的 3 手螺纹,实际风险占资金比例已悄悄下降至 0.7%。闲置保证金与低杠杆都不是高效率的做法。
步骤:
- 取最近的 ATR_new=20
- 重新计算所需手数=10000÷(20×10)=5 手
- 补开 2 手,使成本价边缘风险回到 1% 刻度
熊市、震荡市皆可低买叠加,牛市、井喷时反向操作即可减仓锁定利润。
ATR 计算公式拆解
简短三步即可实时计算:
- True Range 真实波幅
TR = max( H - L, |H - C_prev|, |C_prev - L| ) - ATR14
ATR14 = TR14 的简单移动平均
用任何语言的 pandas 两行就能完成:
tr = np.maximum.reduce((high-low, np.abs(high-prev_close), np.abs(prev_close-low)))
atr = tr.rolling(14).mean()入门案例:黄金多头的“加仓-止损”策略
import tqsdk
SYMBOL = "COMEX.au2308"
RISK_ATR_RATIO = 0.5 # 加仓触发
STOP_ATR_RATIO = 2 # 止损触发
api = tqsdk.TqApi()
klines = api.get_kline_serial(SYMBOL, 24*60*60, 100)
atr_val = tqsdk.ta.ATR(klines,14).atr.iloc[-1]
position = api.get_position(SYMBOL)
quote = api.get_quote(SYMBOL)
trades = api.get_trade(SYMBOL)
# 首次开仓
if position.pos_long == 0:
api.insert_order(SYMBOL, "BUY", "OPEN", 1)
while True:
api.wait_update()
if position.pos_long > 0:
if quote.last_price >= trades[-1].trade_price + RISK_ATR_RATIO * atr_val:
# 加仓
api.insert_order(SYMBOL, "BUY", "OPEN", 1)
elif quote.last_price <= trades[-1].trade_price - STOP_ATR_RATIO * atr_val:
# 止损
api.insert_order(SYMBOL, "SELL", "CLOSE", position.pos_long)👉 复制上面代码,立即进入零成本期货模拟账户体验连续加仓与止损,真实感受 ATR 的节律。
常见问题(FAQ)
Q1:ATR 与波动率百分比指标有何区别?
ATR 使用的是绝对金额波动,可同时兼容不同价格的品种;而 VIX、历史波动率等则是百分比概念,适合同一资产的纵向比较。
Q2:为什么有时 14 日 ATR 仍然过拟合?
震荡行情的突变会使 14 日窗口偏高。可使用 EMA-ATR 或 Chandelier Exit 等平滑算法缓解。
Q3:ATR 参数到底该选多少天?
日内交易可缩短至 7~10 日;波段或长线可扩到 21~30 日。先回溯三年数据,找出一对夏普最高、回撤最小的组合即可。
Q4:能否将 ATR 用于止盈?
可以。反向设置:将多单止盈价设为 P + m×ATR,移动止盈也适用,称为 Trailing ATR Stop。
Q5:ATR 指标的盲区在哪?
- 当日出现跳空极限行情,ATR 滞后;2. 极端消息导致涨停跌停,ATR 无法反映流动性缺口。
Q6:想通过 ATR 做期权波动率交易,可行吗?
ATR 作为历史波动率的近似值,可和隐含波动率 IV 构成 IV-ATR 差值套利。需注意期权二阶风险。
通过本文,你已掌握:
- 用 ATR 做资金、止损、仓位的三连精准管理
- 能迅速写出可运行的加仓与止损脚本
下一步实操只需三步:打开模拟交易所 → 复制代码 → 观察 ATR 全程如何保护你的资本。