头寸规模计算:基于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,暂停所有新开仓。

完整的仓位计算流程

下面是我实际策略中用的完整流程:

  1. 计算当前ATR:取20日ATR
  2. 计算基准ATR:取60日ATR均值
  3. 计算波动率比率:当前ATR / 基准ATR
  4. 判断是否异常:比率 > 2.5 则不开仓
  5. 计算基础仓位:风险金额 / (ATR × 乘数)
  6. 波动率调整:基础仓位 × (1 / 波动率比率)
  7. 最终仓位:取整后,不超过账户总资金的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 / 基准ATR 步骤1:计算风险金额 = 总资金 × 风险比例 步骤2:计算波动率比率 = 当前ATR / 基准ATR 判断:波动率比率 > 2.5? 不开仓(仓位=0) 计算调整后仓位 最终开仓手数

这张图把整个流程串起来了。你从左边三个输入开始,经过风险金额计算、波动率比率判断,最后要么不开仓,要么输出调整后的仓位。

记住一句话:仓位不是你想下多少就下多少,而是市场允许你下多少。波动率就是市场的脾气,顺着它来,你才能活得久。

核心总结:

  • ATR动态仓位:让每笔亏损金额一致
  • 波动率比率调整:应对异常波动
  • 异常波动时:宁可错过,不要做错
  • 仓位上限:永远不要超过总资金的30%

公众号:蓝海资料掘金营,微信deep3321