头寸规模计算:基于ATR的动态仓位与波动率调整
头寸规模,说白了就是你每次开仓该下多少手。
很多新手容易犯一个错误:觉得只要方向看对了,仓位大小无所谓。我早期做CTA策略时也这么想,结果有一次趋势判断完全正确,但因为仓位太重,中间一个回调就被打爆了。嗯,从那以后我才真正意识到——头寸规模才是风控的第一道防线。
为什么不能用固定手数?
你想想看,不同品种的波动率天差地别。
螺纹钢一天波动1%和甲醇一天波动3%,风险完全不是一个量级。如果你用固定手数去交易,遇到高波动品种,一次亏损可能就吃掉你半个月的利润。
所以,我们需要一种动态调整仓位的方法。让仓位大小和当前市场的波动率挂钩——波动大时少下点,波动小时多下点。
基于ATR的动态仓位
ATR(Average True Range)是最常用的波动率指标。它衡量的是过去一段时间内,价格的平均波动幅度。
我个人习惯用20日ATR。为什么是20?因为一个月大概有20个交易日,这个周期能较好地反映近期波动特征。
核心公式很简单:
头寸规模 = 账户总风险金额 / (ATR × 每手合约乘数)
举个例子:
- 账户总资金:100万
- 单笔风险比例:2%(即每笔最多亏2万)
- 螺纹钢ATR(20):80点
- 每手合约乘数:10吨/手
计算过程:
头寸规模 = 20000 / (80 × 10) = 25手
也就是说,当前波动率下,你最多开25手螺纹钢。
核心逻辑:ATR越大,说明市场越动荡,你开的仓位就越小。这样能保证每笔亏损金额基本一致,不会因为波动率突变而爆仓。
基于波动率的仓位调整
ATR方法虽然好用,但它有一个局限:它只考虑了价格波动的绝对值,没有考虑波动率的相对变化。
比如,某品种的ATR从50涨到了100,翻了一倍。按照ATR方法,你的仓位应该减半。但问题是——这个品种的波动率是突然放大的,还是长期趋势性的变化?
我建议引入波动率比率的概念:
波动率比率 = 当前ATR / 基准ATR
基准ATR可以取过去60日或120日的均值。当波动率比率大于1.5时,说明波动异常放大,仓位需要进一步缩减。
我在项目中遇到过这种情况:2022年3月,镍期货的ATR突然从3000飙到12000。如果只用ATR方法,仓位会缩减到原来的1/4。但加上波动率比率后,你会发现比率已经超过4.0,这时候应该直接空仓观望。
避坑指南:我曾经在波动率比率超过3.0时还坚持开仓,结果当天就被反向波动打穿止损。后来我给自己定了一条铁律:波动率比率超过2.5,暂停所有新开仓。
完整的仓位计算流程
下面是我实际策略中用的完整流程:
- 计算当前ATR:取20日ATR
- 计算基准ATR:取60日ATR均值
- 计算波动率比率:当前ATR / 基准ATR
- 判断是否异常:比率 > 2.5 则不开仓
- 计算基础仓位:风险金额 / (ATR × 乘数)
- 波动率调整:基础仓位 × (1 / 波动率比率)
- 最终仓位:取整后,不超过账户总资金的30%
小技巧:我习惯把波动率比率做成一个动态调整系数。比如比率1.0时仓位100%,比率1.5时仓位66%,比率2.0时仓位50%。这样调整起来更平滑,不会因为某一天的ATR突变导致仓位剧烈波动。
代码实现示例
下面是一个Python实现的简化版本:
def calculate_position_size(capital, risk_pct, atr_current, atr_baseline, multiplier):
# 单笔风险金额
risk_amount = capital * risk_pct
# 波动率比率
vol_ratio = atr_current / atr_baseline
# 异常波动判断
if vol_ratio > 2.5:
return 0 # 不开仓
# 基础仓位
base_size = risk_amount / (atr_current * multiplier)
# 波动率调整
adjusted_size = base_size * (1 / vol_ratio)
# 取整
final_size = int(adjusted_size)
# 仓位上限检查
max_size = int(capital * 0.3 / (atr_current * multiplier))
final_size = min(final_size, max_size)
return final_size
不同波动率场景下的仓位对比
| 场景 | 当前ATR | 基准ATR | 波动率比率 | 基础仓位 | 调整后仓位 |
|---|---|---|---|---|---|
| 低波动 | 40 | 50 | 0.8 | 50手 | 62手 |
| 正常波动 | 50 | 50 | 1.0 | 40手 | 40手 |
| 高波动 | 80 | 50 | 1.6 | 25手 | 15手 |
| 异常波动 | 150 | 50 | 3.0 | 13手 | 0手 |
你看,低波动时仓位可以放大到62手,高波动时缩减到15手,异常波动直接不开仓。这就是动态调整的魅力——让仓位和风险匹配,而不是和你的情绪匹配。
本章知识体系
下面这张图帮你理清整个头寸规模计算的逻辑:
这张图把整个流程串起来了。你从左边三个输入开始,经过风险金额计算、波动率比率判断,最后要么不开仓,要么输出调整后的仓位。
记住一句话:仓位不是你想下多少就下多少,而是市场允许你下多少。波动率就是市场的脾气,顺着它来,你才能活得久。
核心总结:
- ATR动态仓位:让每笔亏损金额一致
- 波动率比率调整:应对异常波动
- 异常波动时:宁可错过,不要做错
- 仓位上限:永远不要超过总资金的30%
公众号:蓝海资料掘金营,微信deep3321