← 返回《初阶量化交易:策略编写及系统搭建》
📑 查看全课大纲(第 27 / 38 节)

仓位管理的工程实现

约 36 分钟

📺 正在播放小象官方高清录播(支持倍速与清晰度调节)

仓位管理的工程实现:头寸规模模型与凯利公式

小象实战讲义 · 初阶量化交易:策略编写及系统搭建 本讲义仅用于编程与量化方法教学,不构成任何投资建议。

在量化交易与专业资产管理领域,流传着一个经典共识:“初学者寻找入场信号,进阶者关注出场风控,而大师决定仓位头寸(Position Sizing)“。即便一个交易策略拥有优异的胜率与盈亏比,若仓位管理不当(如下注过重遭遇连续亏损击穿本金,或下注过轻错失战略复利机会),都会导致策略在实盘中迅速夭折。

本讲系统解构期望收益公式与博弈论中的凯利公式(Kelly Criterion);深入探讨范·撒普(Van Tharp)经典的**“随机入市策略实验”**;并严密对比工业界三大经典头寸规模模型——固定金额单手模型、等价值交易单元模型与 CPR 百分比风险模型的数学原理与工程实现。


💡 核心导读

  • 期望收益(Expected Value)与盈利核心六要素
    • 交易系统的核心期望值: E=pW(1p)LE = p \cdot W - (1 - p) \cdot L 其中 pp 为胜率,WW 为平均盈利额,LL 为平均亏损额。
    • 六大要素:胜率、盈亏比、头寸规模(Position Sizing)、总资金量、交易机会频率与交易摩擦成本。
  • 凯利公式(Kelly Criterion)的最优下注法则f=bpqb=p(b+1)1bf^* = \frac{bp - q}{b} = \frac{p(b + 1) - 1}{b}
    • ff^*:现有总资金中每次投入的最佳比例;
    • bb:盈亏比(期望平均盈利 / 可能平均亏损);
    • pp:获胜概率(胜率),q=1pq = 1 - p 为失败概率。
    • 启示:若 bpq0bp - q \le 0,数学期望为负,最佳下注比例 f0f^\le 0,坚决空仓观望!*
  • 随机入市策略实验的启示(Random Entry System)
    • 仅凭抛硬币随机决定做多还是做空,只要严格叠加 3×ATR3 \times ATR 跟踪止损与 1%1% 总风险 CPR 头寸规模法则,在全品种测试中依然能战胜市场并获得稳定收益;
    • 量化启示:出场风控与头寸管理比入场点更加决定策略的终极命运。
  • 三大工业级头寸规模模型对比
    1. 固定金额交易一个单位(Fixed Unit Model):每份资金只买 1 手(100 股),导致高价股占用极大市值、低价股仅占微小市值,资金利用率极度不均;
    2. 等价值交易单元(Equal Value Units):将总资金均分为 NN 份(如 10 份,每份 10 万元),按股价动态折算股数(工行买 2 万股,茅台买 100 股),各标的占用等额市值;
    3. CPR 百分比风险模型(Percent Risk Model,机构首选)P(头寸股数)=C(账户总资金)×R%(单笔总风险比例)Rshare(每股最大承受亏损)P (\text{头寸股数}) = \frac{C (\text{账户总资金}) \times R% (\text{单笔总风险比例})}{R_{share} (\text{每股最大承受亏损})} 注:不论标的股价 10 元还是 1000 元,不论止损幅宽 3% 还是 10%,单笔交易触发止损时的实际亏损金额恒定等于总本金的 1%1%
┌─────────────────────────────────────────────────────────────┐
│                    三大头寸规模模型核心逻辑对比                 │
└──────────────────────────────┬──────────────────────────────┘

 ┌─────────────────────────────┼─────────────────────────────┐
 ▼                             ▼                             ▼
┌──────────────────┐   ┌──────────────────┐   ┌──────────────────┐
│ 模型 1: 固定单手 │   │ 模型 2: 等价值   │   │ 模型 3: CPR 风险 │
├──────────────────┤   ├──────────────────┤   ├──────────────────┤
│ • 每份资金买 1手 │   │ • 每份资金等市值 │   │ • 锁定最大亏损 1%│
│ • 茅台买 7.5万   │   │ • 工行买 10万元  │   │ • 波动大则买少   │
│ • 工行买 500元   │   │ • 茅台买 10万元  │   │ • 波动小则买多   │
│ • 极度失衡       │   │ • 市值均衡       │   │ • 风险完全恒定   │
└──────────────────┘   └──────────────────┘   └──────────────────┘

一、CPR 百分比风险模型的计算实例

假设账户总资产 C=1,000,000C = 1,000,000 元,单笔交易允许承受的最大风险比例 R%=1%R% = 1%(即单笔最大允许亏损 10,000 元):

  • 标的 A(海康威视):当前股价 P0=40.0P_0 = 40.0 元,根据支撑位设定初始止损线为 5%-5%(每股风险 Rshare=40×5%=2.0R_{share} = 40 \times 5% = 2.0 元);
  • 计算允许买入股数Shares=1,000,000×1%2.0=10,0002.0=5,000 股Shares = \frac{1,000,000 \times 1%}{2.0} = \frac{10,000}{2.0} = 5,000 \text{ 股}
  • 实际建仓金额40×5,000=200,00040 \times 5,000 = 200,000 元(占总资金 20%20% 仓位);
  • 风控校验:若价格跌破止损线(下跌 5% 卖出),亏损金额为 5,000×2.0=10,0005,000 \times 2.0 = 10,000 元,精确等于总资金的 1%1%

二、加仓方式与组合资金上限

  • 金字塔式加仓(Pyramid Adding):首次建仓基准仓位(如 50%),当行情朝盈利方向突破时逐步减半加仓(如 30%、20%),确保综合持仓成本始终低于市场现价;
  • 单标的资金上限(Single Asset Cap):单只标的建仓市值不得超过总资金的 20%20% ~ 30%30%,防范单一黑天鹅击穿组合。

📝 动手练一练

下面我们用 Python 编写一段 三大头寸规模模型对比测算引擎,直观验证固定单手、等价值单元与 CPR 百分比风险模型在资金占用与最大潜在亏损上的根本差异:

import pandas as pd
import numpy as np

def calculate_position_sizing(total_capital=1000000.0, stock_price=40.0, stop_loss_pct=0.05, total_risk_pct=0.01, num_slots=10, max_position_pct=0.30):
    """
    三大经典仓位管理与头寸规模模型对比:
    1. 模型 1: 固定金额交易 1 手 (100 股)
    2. 模型 2: 等价值交易单元 (每份 Capital / num_slots)
    3. 模型 3: CPR 百分比风险模型 (Position = (Capital * Risk%) / (Price * SL%))
       叠加单标的资金上限: 最终股数 = min(CPR 原始股数, 资金上限股数)
    """
    # 1. 模型 1: 固定买 1 手 (100 股)
    m1_shares = 100
    m1_value = m1_shares * stock_price
    m1_risk = m1_value * stop_loss_pct
    
    # 2. 模型 2: 等价值交易单元 (10 万元均分)
    slot_capital = total_capital / num_slots
    m2_shares = int(slot_capital / stock_price / 100) * 100  # 按手整除
    m2_value = m2_shares * stock_price
    m2_risk = m2_value * stop_loss_pct
    
    # 3. 模型 3: CPR 百分比风险模型 (锁定单笔最大风险为总资金 1%)
    total_allowed_risk = total_capital * total_risk_pct
    risk_per_share = stock_price * stop_loss_pct
    m3_shares_raw = total_allowed_risk / risk_per_share
    # 单标的资金上限: 止损过窄时 CPR 股数会急剧放大, 必须叠加 min(·, 资金上限) 防集中暴露
    max_shares_by_cap = (total_capital * max_position_pct) / stock_price
    m3_shares = int(min(m3_shares_raw, max_shares_by_cap) / 100) * 100
    m3_value = m3_shares * stock_price
    m3_risk = m3_shares * risk_per_share
    
    res = pd.DataFrame([
        {'Model': '模型 1: 固定单手 (100股)', 'Shares': m1_shares, 'Capital_Used': m1_value, 'Max_Loss_Value': m1_risk, 'Risk_Pct_Of_Total': m1_risk / total_capital * 100.0},
        {'Model': '模型 2: 等价值单元 (10万)', 'Shares': m2_shares, 'Capital_Used': m2_value, 'Max_Loss_Value': m2_risk, 'Risk_Pct_Of_Total': m2_risk / total_capital * 100.0},
        {'Model': '模型 3: CPR 百分比风险 (1%)', 'Shares': m3_shares, 'Capital_Used': m3_value, 'Max_Loss_Value': m3_risk, 'Risk_Pct_Of_Total': m3_risk / total_capital * 100.0}
    ])
    return res

def test_position_run():
    res = calculate_position_sizing(total_capital=1000000.0, stock_price=40.0, stop_loss_pct=0.05, total_risk_pct=0.01)
    print("================ 三大头寸规模模型测算与对比 ================")
    print(res[['Model', 'Shares', 'Capital_Used', 'Max_Loss_Value', 'Risk_Pct_Of_Total']])
    print("----------------------------------------------------------")
    print("量化精要: CPR 模型将单笔实际最大亏损锁定在精确的 10,000 元 (总本金的 1%)!")
    print("不论标的价格高低与止损宽窄,CPR 模型确保组合风险始终恒定可控!")
    print("==========================================================")

if __name__ == "__main__":
    test_position_run()

运行结果输出:

================ 三大头寸规模模型测算与对比 ================
                     Model  Shares  Capital_Used  Max_Loss_Value  Risk_Pct_Of_Total
0     模型 1: 固定单手 (100股)     100        4000.0           200.0               0.02
1     模型 2: 等价值单元 (10万)    2500      100000.0          5000.0               0.50
2  模型 3: CPR 百分比风险 (1%)    5000      200000.0         10000.0               1.00
----------------------------------------------------------
量化精要: CPR 模型将单笔实际最大亏损锁定在精确的 10,000 元 (总本金的 1%)!
不论标的价格高低与止损宽窄,CPR 模型确保组合风险始终恒定可控!
==========================================================

📌 资金上限的约束作用:本例止损宽度 5% 时,CPR 原始股数 5,000 股、建仓市值 20 万元(占总资金 20%),未触及 30% 上限;若将止损收窄至 2%,CPR 原始股数将放大至 12,500 股(市值 50 万元、占总资金 50%),此时 30% 资金上限生效,实际建仓被截断为 7,500 股(单笔风险随之降至 6,000 元)——这正是「单标的上限」防范集中暴露的机械体现。


本章小结

  1. 领悟头寸管理决定生死:入场信号决定短期盈亏概率,而头寸规模决定策略能否在经历连续挫败后依然存活。
  2. 掌握 CPR 风险模型:以账户总风险比例与个股止损幅度为基准倒算头寸股数,使单笔潜在损失恒定受控。
  3. 结合凯利公式动态调优:根据历史策略实际胜率与盈亏比动态测算最佳下注系数,杜绝盲目重仓。

📋 行动清单 (Action Checklist)

  • 运行本讲头寸规模代码,测试当单笔止损幅度收窄至 2% 或放大至 10% 时 CPR 买入股数的动态变化;
  • 在自己的量化交易系统中废弃固定股数下单逻辑,升级为等价值或 CPR 风险模型;
  • 预习下一讲,学习如何搭建一个标准的双均线基础策略框架,为后续分步优化奠定基准。

— 小象教研组

配套学习资源与课件
  • 第4章课件:仓位管理和风险控制功能实现(PDF · 1.3MB)
    下载
  • 开发环境准备:软件安装指导(PDF · 0.9MB · 建议第3章动手实践前先通读)
    下载
  • 量化入门推荐书单(PDF · 318KB)
    下载
🎁 免费学习资源

领取《小象 11GB VIP 课件资料包与大厂真题手册》

包含全套实战 Jupyter 源码、清洗后数据集、大厂高频面试真题与专属学员答疑交流群。

  • 完整 Python / 数据分析 Jupyter 实战源码
  • 大厂真实业务数据集与练习题
  • 微信扫码添加课程顾问,免费获取网盘下载链接
微信二维码:扫码添加课程顾问微信扫码添加顾问