Summary: 仓位计算是交易系统中最被忽视的变量。本文详解固定分数法、ATR波动率调整法和凯利公式三种具体方法,附带手工交易和EA量化的计算示例、代码模板及月度风控检查清单。




最被忽视的变量:仓位计算

大多数交易者痴迷于入场信号。然而,针对期货和外汇市场的广泛研究显示,对长期资金曲线影响最大的变量不是入场规则也不是出场规则,而是仓位计算。CME集团在2017年针对10,000个模拟交易账户的研究表明:使用系统化仓位计算的交易者,在500笔交易后的账户存活率比使用固定手数的交易者高出73%。

本文覆盖三种具体的仓位计算方法,适用于手工主观交易者和自动化EA策略,从简单到数学最优依次展开。

方法一:固定分数法(基础款)

这是行业标准方法,原因很简单——它有效。每笔交易承担固定百分比的账户净值风险,大多数策略建议0.5%到2%。

计算公式:
```
仓位大小 = (账户净值 × 单笔风险%) / (止损点数 × 每标准手点值)
```

逐步计算示例:
  • 账户净值:10,000美元

  • 单笔风险:1%(即100美元风险)

  • 止损点数:50点

  • 每标准手点值:10美元(多数直盘货币对)

  • 计算:100美元 / (50点 × 10美元) = 0.2标准手(即2迷你手)


  • 为什么有效: 亏损时期仓位自动缩小,盈利时期仓位自动扩大,而波动率环境恰恰通常也需要这样的调整。

    EA实现方法: 大多数平台可使用`NormalizeDouble()`函数进行手数计算。伪代码如下:
    ```python
    def calculate_lot_size(account_balance, risk_percent, stop_pips, pip_value):
    risk_amount = account_balance * (risk_percent / 100)
    pip_risk = stop_pips * pip_value
    lot_size = risk_amount / pip_risk
    return round(lot_size * 100) / 100 # 保留两位小数,以迷你手为单位
    ```

    方法二:波动率调整法(用于震荡策略)

    固定止损点在波动率变化时会失效。使用平均真实波幅(ATR)来归一化仓位大小,可以在不同市场环境下保持一致的风险暴露。

    基于ATR的公式:
    ```
    仓位大小 = (账户净值 × 风险%) / (ATR × 每标准手点值 × 波动率倍数)
    ```

    波动率倍数通常为2倍或3倍ATR。以使用3倍ATR止损的波段交易策略为例:

    当前EURUSD示例(日线ATR = 85点):
  • 账户:20,000美元

  • 风险:1.5%(300美元)

  • ATR:85点

  • 止损:3 × 85 = 255点

  • 每标准手点值:10美元

  • 计算:300美元 / (255点 × 10美元) = 0.117标准手(约0.12手)


  • 当波动率翻倍(ATR变为170点): 同样计算得出0.058手。仓位自动减半,尽管止损幅度扩大,但美元风险保持不变。

    方法三:修正凯利公式(数学最优但有风险)

    凯利准则根据胜率和盈亏比计算最优下注比例。但完整凯利对外汇交易来说过于激进,专业人士通常使用分数凯利(25%到50%)。

    凯利公式(交易版简化):
    ```
    f = W - (1-W)/R
    ```
    其中:
  • W = 胜率(小数形式,例如0.55表示55%)

  • R = 平均盈利 / 平均亏损


  • 计算示例:
  • 策略胜率:60%(0.60)

  • 平均盈利:80点

  • 平均亏损:50点

  • R = 80/50 = 1.6

  • f = 0.60 - (0.40)/1.6 = 0.60 - 0.25 = 0.35(即35%的资金)


  • 这意味着每笔交易建议投入35%的资金——在外汇中显然是鲁莽的。解决方案:使用分数凯利。

    分数凯利(取完整凯利的25%):
    0.35 × 0.25 = 0.0875(每笔8.75%)
    结合最大回撤约束后,进一步降至每笔2-3%。

    关键警告: 凯利公式假设你确切知道自己的胜率和盈亏比。现实中,这些都只是带有显著抽样误差的估计值。始终使用计算出的凯利值的25-50%,然后将结果上限设为每笔3%的风险。

    心理约束:最大回撤法则

    任何仓位计算方法,如果允许的回撤超过了你的情绪承受能力,都是无效的。以下规则不受数学计算的影响:

    最大仓位限制 = 最大可承受回撤 / (预期连续亏损次数 × 平均单笔亏损率)

    示例:
  • 最大可承受回撤:账户的20%

  • 预期连续亏损次数(基于回测):8次

  • 平均单笔亏损率:2%(如果使用2%风险)

  • 计算:20% / (8 × 2%) = 20% / 16% = 1.25(可接受)


  • 如果计算结果低于1.0,则必须降低单笔风险。

    为EA建立完整的风险框架

    对于自动化系统,建议实施以下三个层次:

    第一层:单笔风险上限
    趋势跟踪系统最高2%,均值回归系统最高1%(后者通常有更长的回撤期)。

    第二层:日亏损上限
    若当日亏损达到起始净值的6%,暂停交易24小时。

    第三层:周亏损上限
    若累计亏损达到净值峰值的15%,暂停交易一周。

    MQL5代码示例:
    ```mql5
    double CalculateDynamicLot(double riskPercent, double stopPips)
    {
    double accountEquity = AccountInfoDouble(ACCOUNT_EQUITY);
    double riskAmount = accountEquity * riskPercent / 100.0;
    double pipValue = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_VALUE);
    double lotSize = riskAmount / (stopPips * pipValue);

    // 应用最大手数限制
    double maxLot = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MAX);
    double minLot = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN);
    lotSize = MathMax(minLot, MathMin(lotSize, maxLot));

    // 按步长取整
    double step = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_STEP);
    lotSize = MathFloor(lotSize / step) * step;

    return lotSize;
    }
    ```

    常见的仓位计算错误

    1. 马丁格尔翻倍法: 亏损后加倍仓位虽然能快速回本,但会导致灾难性回撤。在50%胜率系统中连续10次亏损的概率只有0.1%,但一旦发生,账户归零。

    2. 固定手数不调整净值: 一个在5000美元账户上使用0.1手的交易者,单笔风险为2%。亏损后账户变成3000美元,同样的0.1手风险变成了3.3%——在亏损期间反而放大了风险。

    3. 忽略相关品种的叠加风险: 同时交易EURUSD和GBPUSD,风险翻倍但机会并未翻倍。对于相关性高的货币对,应将合计仓位向下调整30-50%。

    月度仓位检查清单

    每月末复盘以下指标:
  • [ ] 平均单笔风险(应与目标风险相差±0.2%以内)

  • [ ] 最大单日亏损(不应超过日均亏损的2倍)

  • [ ] 连续亏损次数(与回测最大值对比)

  • [ ] 当前净值回撤幅度

  • [ ] 根据当前回撤调整的风险值(若回撤超过10%,风险降低20-30%)


  • 付诸实践

    第一个月使用0.5%的单笔风险进行固定分数法。记录每笔交易的实际风险百分比。50笔交易后,计算你真实的胜率和盈亏比,然后应用分数凯利(25%乘数)来判断能否将风险提高到1%。大多数交易者会发现自己的实际绩效指标低于预期——这是有价值的信息,而不是失败。

    参考来源:
    Van K. Tharp,《交易之道:通向财务自由之路》(2006),第12章仓位计算。Ralph Vince,《资金管理的数学》(1992)。CME集团,“不同仓位计算方法下的交易者存活率”(2017白皮书)。John L. Kelly Jr.,“信息率的新解释”(1956)。CFTC关于杠杆与风险的投资者教育材料,2025年3月更新。
    ```