← 返回《进阶量化交易实战:迭代式的量化策略研发》
📑 查看全课大纲(第 30 / 59 节)
  1. 1.量化投资必备基础知识
  2. 2.趋势型策略及模型原理
  3. 3.均值回复型策略及模型原理
  4. 4.配对交易策略及模型原理
  5. 5.量化策略研发流程与基本技能
  6. 6.常用的量化平台概述及如何选择
  7. 7.如何量化一个主观策略思路
  8. 8.常用技术指标及指标计算过程
  9. 9.如何编写指标代码
  10. 10.指标的物理意义
  11. 11.技术指标的应用技巧
  12. 12.更多的交易决策
  13. 13.编写程序去量化一个趋势型技术指标
  14. 14.编写趋势型技术指标的性能评价
  15. 15.策略对交易成本和持仓周期的影响
  16. 16.股票池策略的原理及基本框架
  17. 17.基于多因子分析的股票池设计与实现
  18. 18.股票池的性能评估
  19. 19.使用定制化财务因子构建股票池
  20. 20.趋势型策略原理及股票池机制的设计
  21. 21.趋势型择时信号的设计方法与编程实现
  22. 22.趋势型策略的回测与性能评估
  23. 23.优化趋势型策略的思路及方法
  24. 24.量化体系中的风险控制思想
  25. 25.风险的度量-波动率
  26. 26.常用的风险控制方法
  27. 27.实现止盈止损模块以提高策略性能
  28. 28.策略性能的评估与优化
  29. 29.探讨波动率与风险的关系
  30. 30.量化策略中的经典资金管理模型
  31. 31.用python编程实现资金管理模块
  32. 32.构建一个完善的量化交易策略
  33. 33.趋势型量化策略必备的期货知识
  34. 34.期货量化工具介绍
  35. 35.商品期货趋势型策略原理
  36. 36.用TB编写商品期货趋势型策略(上)
  37. 37.用TB编写商品期货趋势型策略(下)
  38. 38.分析优化商品期货趋势型策略的方法思路
  39. 39.期货交易策略的注意事项
  40. 40.均值回复型策略的原理
  41. 41.A股市场有没有稳定的均值回复效应?
  42. 42.编写一个均值回复型股票量化策略
  43. 43.编写多空组合策略进行策略改进
  44. 44.在策略中实现头寸管理进行策略优化
  45. 45.套利策略原理及常见套利类型
  46. 46.用MC开发一个跨品种套利交易策略(上)
  47. 47.用MC开发一个跨品种套利交易策略(下)
  48. 48.统计套利之股票配对交易策略
  49. 49.实盘中的细节问题:加减仓
  50. 50.关于高频交易
  51. 51.如何评价实盘量化策略的性能
  52. 52.量化系统的工作过程及研发流程
  53. 53.运气or实力
  54. 54.量化实盘交易需要满足什么条件
  55. 55.未来函数的坑
  56. 56.实盘数据接口异常的自动报警
  57. 57.交易系统的压力测试
  58. 58.自动运行的交易策略,什么时候需要人工干预
  59. 59.预案准备和实盘心理建设

量化策略中的经典资金管理模型

约 35 分钟

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

量化策略中的经典资金管理模型

小象实战讲义 · 进阶量化交易实战:迭代式的量化策略研发 本讲义仅用于编程与量化方法教学,不构成任何投资建议。

资金管理决定了量化交易者是成为复利奇迹还是走向破产归零。即便是一个期望收益为正的交易策略,如果不加节制地重仓下注,根据大数定律终将遭遇几何破产。本节系统推导凯利公式(Kelly Criterion)、固定比例风险模型(Fixed Fractional / CPR)以及最优 f 模型的数学机理。

💡 核心导读

  • 三大经典资金管理模型体系
    • 凯利公式最优下注比例(Kelly Criterion):理论上实现长期对数财富增长率最大化的最优杠杆杠杆比例;
    • 半凯利与分数凯利(Fractional Kelly):由于实盘参数估计存在误差,通常采用 f/2f^* / 2 作为稳健下注比例;
    • CPR 固定比例风险模型(Constant Proportion Risk):单笔交易最大允许亏损金额严格锁定在总资本的固定比例(如 1%2%1% \sim 2%)。
┌─────────────────────────────────────────────────────────────┐
│                    资金管理模型与头寸规模计算拓扑图              │
└──────────────────────────────┬──────────────────────────────┘

 ┌─────────────────────────────┼─────────────────────────────┐
 ▼                             ▼                             ▼
┌─────────────────────────┐   ┌─────────────────────────┐   ┌─────────────────────────┐
│ 凯利公式 (Kelly <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mi>f</mi><mo>∗</mo></msup></mrow><annotation encoding="application/x-tex">f^*</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.1076em;">f</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6887em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mbin mtight">∗</span></span></span></span></span></span></span></span></span></span></span>)  │   │ 分数凯利 (Half-Kelly)   │   │ 固定比例风险 CPR 模型   │
├─────────────────────────┤   ├─────────────────────────┤   ├─────────────────────────┤
│ • <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mi>f</mi><mo>∗</mo></msup><mo>=</mo><mo stretchy="false">(</mo><mi>b</mi><mi>p</mi><mo>−</mo><mi>q</mi><mo stretchy="false">)</mo><mi mathvariant="normal">/</mi><mi>b</mi></mrow><annotation encoding="application/x-tex">f^* = (b p - q) / b</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.1076em;">f</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6887em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mbin mtight">∗</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal">b</span><span class="mord mathnormal">p</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">q</span><span class="mclose">)</span><span class="mord">/</span><span class="mord mathnormal">b</span></span></span></span> │   │ • <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mo>=</mo><mn>0.5</mn><mo>×</mo><msup><mi>f</mi><mo>∗</mo></msup></mrow><annotation encoding="application/x-tex">f = 0.5 \times f^*</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.1076em;">f</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">0.5</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.1076em;">f</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6887em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mbin mtight">∗</span></span></span></span></span></span></span></span></span></span></span>  │   │ • 风险限额 = Equity * 1%│
│ • 最大化长期对数财富增长│   │ • 牺牲微小收益换回撤减半│   │ • Position = Risk / ATR │
└─────────────────────────┘   └─────────────────────────┘   └─────────────────────────┘

一、凯利公式的数学推导与破产临界点

设单笔交易胜率为 pp,失败概率为 q=1pq = 1 - p,获胜时的盈亏比为 bb。每笔下注占当前资本比例为 ff。经过 NN 轮交易后的几何复合增长率为:

g(f)=pln(1+bf)+qln(1f)g(f) = p \ln(1 + b f) + q \ln(1 - f)

g(f)g(f) 求导令 g(f)=0g’(f) = 0,解得使复合增长率最大化的最优下注比例:

f=bpqb=p(b+1)1bf^* = \frac{b p - q}{b} = \frac{p(b+1) - 1}{b}

f>2ff > 2 f^* 时,策略复合增长率将跌入负值区间,必将导致破产。

import pandas as pd
import numpy as np

def calculate_kelly_fraction(win_rate: float, profit_loss_ratio: float, safety_factor: float = 0.5) -> dict:
    """
    计算完全凯利与分数凯利最优仓位比例
    """
    p = win_rate
    q = 1.0 - p
    b = profit_loss_ratio
    
    full_kelly = (b * p - q) / b if b > 0 else 0.0
    full_kelly = max(0.0, full_kelly)
    
    fractional_kelly = full_kelly * safety_factor
    
    return {
        'Full_Kelly': float(full_kelly),
        'Fractional_Kelly': float(fractional_kelly),
        'Expected_Log_Growth': float(p * np.log(1 + b * fractional_kelly) + q * np.log(max(1e-6, 1 - fractional_kelly)))
    }

二、CPR 固定比例风险模型与 ATR 仓位动态计算

固定比例风险模型(CPR)规定每次交易承担的绝对风险金额为总资金的固定比例 RpctR_{pct}(如 1.5%1.5%)。单只标的的买入股数由每股止损距离 ΔPstop\Delta P_{\text{stop}} 决定:

Position Size=Total Equity×RpctEntry PriceStop Price=Total Equity×Rpctk×ATR\text{Position Size} = \frac{\text{Total Equity} \times R_{pct}}{\text{Entry Price} - \text{Stop Price}} = \frac{\text{Total Equity} \times R_{pct}}{k \times ATR}

注意该公式只约束了「风险敞口」,并未约束「资金占用」。A 股现货账户无杠杆,当止损距离极窄(k×ATRk \times ATR 很小)时,公式算出的股数对应市值可能超过总资金,实际下单时必须再取 min(风险股数, Total Equity/Price)\min(\text{风险股数},\ \lfloor \text{Total Equity} / \text{Price} \rfloor) 作为资金上限。

def calculate_cpr_position_size(equity: float, risk_pct: float, current_price: float, atr: float, atr_multiplier: float = 2.0) -> int:
    """
    计算基于 CPR 固定风险与 ATR 止损的买入股数
    """
    risk_amount = equity * risk_pct
    stop_distance = atr * atr_multiplier
    
    if stop_distance <= 0:
        return 0
        
    shares = int(risk_amount / stop_distance)
    # A 股现货账户无杠杆: 持仓市值不得超过总资金, 防止窄止损时算出超资仓位
    max_shares_by_equity = int(equity / current_price)
    shares = min(shares, max_shares_by_equity)
    # 按 100 股整手向下取整
    shares = (shares // 100) * 100
    return shares

📝 动手练一练

编写 Python 仿真测试,对比半凯利与过度下注(f = 0.6)在 100 轮投掷硬币交易中的净值增长轨迹:

import pandas as pd
import numpy as np

def run_money_management_test():
    np.random.seed(42)
    # 模拟胜率 50%,盈亏比 2.0 的优质策略(理论全凯利 f* = (2*0.5 - 0.5)/2 = 0.25)
    p = 0.50
    b = 2.0
    kelly_info = calculate_kelly_fraction(win_rate=p, profit_loss_ratio=b, safety_factor=0.5)
    
    n_trades = 100
    outcomes = np.random.choice([b, -1.0], size=n_trades, p=[p, 1-p])
    
    # 模拟半凯利与过度下注 (f = 0.6)
    equity_half_kelly = [1.0]
    equity_overbet = [1.0]
    
    f_half = kelly_info['Fractional_Kelly']
    f_over = 0.60
    
    for r in outcomes:
        equity_half_kelly.append(equity_half_kelly[-1] * (1.0 + f_half * r))
        equity_overbet.append(max(1e-4, equity_overbet[-1] * (1.0 + f_over * r)))
        
    print("================ 经典资金管理模型仿真验证 ================")
    print(f"理论满仓凯利比例 f*   : {kelly_info['Full_Kelly']*100:.2f}%")
    print(f"稳健半凯利下注比例 f/2: {kelly_info['Fractional_Kelly']*100:.2f}%")
    print(f"半凯利 100 轮终态净值 : {equity_half_kelly[-1]:.4f}")
    print(f"过度下注 100 轮终态净值: {equity_overbet[-1]:.4f}")
    assert equity_half_kelly[-1] > equity_overbet[-1], "半凯利资金管理未能胜过过度下注!"
    print("✅ 凯利公式与资金管理模型验证 PASS")
    print("========================================================")

if __name__ == '__main__':
    run_money_management_test()

运行结果输出:

================ 经典资金管理模型仿真验证 ================
理论满仓凯利比例 f*   : 25.00%
稳健半凯利下注比例 f/2: 12.50%
半凯利 100 轮终态净值 : 257.4004
过度下注 100 轮终态净值: 0.2788
✅ 凯利公式与资金管理模型验证 PASS
========================================================

本章小结

  1. 永远使用分数凯利(Half-Kelly):实战中参数估计具有不确定性,半凯利能在牺牲微小几何增长的同时大幅降低回撤深度。
  2. 严防过度杠杆引发几何破产:当下注比例超过理论最优值 2 倍时,长期的期望复合增长率必然衰减为负。
  3. 结合 ATR 动态核算股数:通过 CPR 模型让每笔交易承担等量资本风险,实现不同波动率标的间的风险平价。

📋 行动清单 (Action Checklist)

  • 运行凯利公式仿真测试代码,修改胜率与盈亏比观察最优下注比例变化;
  • 编写结合单品种最大仓位限制与 CPR 资金模型的头寸规模综合分配器;
  • 预习下一节,掌握用 Python 面向对象编程实现完整的资金管理模块。

— 小象教研组

配套学习资源与课件
  • 第6章课件:量化体系中的资金管理(PDF · 1.2MB)
    下载
  • 第6章配套代码包(Python 重构版 · 已实测)(ZIP · 5KB)
    下载
  • 第6章原始代码包(历史资料)(ZIP · 13KB)
    下载
🎁 免费学习资源

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

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

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