📑 查看全课大纲(第 30 / 59 节)
- 1.量化投资必备基础知识
- 2.趋势型策略及模型原理
- 3.均值回复型策略及模型原理
- 4.配对交易策略及模型原理
- 5.量化策略研发流程与基本技能
- 6.常用的量化平台概述及如何选择
- 7.如何量化一个主观策略思路
- 8.常用技术指标及指标计算过程
- 9.如何编写指标代码
- 10.指标的物理意义
- 11.技术指标的应用技巧
- 12.更多的交易决策
- 13.编写程序去量化一个趋势型技术指标
- 14.编写趋势型技术指标的性能评价
- 15.策略对交易成本和持仓周期的影响
- 16.股票池策略的原理及基本框架
- 17.基于多因子分析的股票池设计与实现
- 18.股票池的性能评估
- 19.使用定制化财务因子构建股票池
- 20.趋势型策略原理及股票池机制的设计
- 21.趋势型择时信号的设计方法与编程实现
- 22.趋势型策略的回测与性能评估
- 23.优化趋势型策略的思路及方法
- 24.量化体系中的风险控制思想
- 25.风险的度量-波动率
- 26.常用的风险控制方法
- 27.实现止盈止损模块以提高策略性能
- 28.策略性能的评估与优化
- 29.探讨波动率与风险的关系
- 30.量化策略中的经典资金管理模型
- 31.用python编程实现资金管理模块
- 32.构建一个完善的量化交易策略
- 33.趋势型量化策略必备的期货知识
- 34.期货量化工具介绍
- 35.商品期货趋势型策略原理
- 36.用TB编写商品期货趋势型策略(上)
- 37.用TB编写商品期货趋势型策略(下)
- 38.分析优化商品期货趋势型策略的方法思路
- 39.期货交易策略的注意事项
- 40.均值回复型策略的原理
- 41.A股市场有没有稳定的均值回复效应?
- 42.编写一个均值回复型股票量化策略
- 43.编写多空组合策略进行策略改进
- 44.在策略中实现头寸管理进行策略优化
- 45.套利策略原理及常见套利类型
- 46.用MC开发一个跨品种套利交易策略(上)
- 47.用MC开发一个跨品种套利交易策略(下)
- 48.统计套利之股票配对交易策略
- 49.实盘中的细节问题:加减仓
- 50.关于高频交易
- 51.如何评价实盘量化策略的性能
- 52.量化系统的工作过程及研发流程
- 53.运气or实力
- 54.量化实盘交易需要满足什么条件
- 55.未来函数的坑
- 56.实盘数据接口异常的自动报警
- 57.交易系统的压力测试
- 58.自动运行的交易策略,什么时候需要人工干预
- 59.预案准备和实盘心理建设
量化策略中的经典资金管理模型
约 35 分钟
📺 正在播放小象官方高清录播(支持倍速与清晰度调节)
量化策略中的经典资金管理模型
小象实战讲义 · 进阶量化交易实战:迭代式的量化策略研发 本讲义仅用于编程与量化方法教学,不构成任何投资建议。
资金管理决定了量化交易者是成为复利奇迹还是走向破产归零。即便是一个期望收益为正的交易策略,如果不加节制地重仓下注,根据大数定律终将遭遇几何破产。本节系统推导凯利公式(Kelly Criterion)、固定比例风险模型(Fixed Fractional / CPR)以及最优 f 模型的数学机理。
💡 核心导读
- 三大经典资金管理模型体系:
- 凯利公式最优下注比例(Kelly Criterion):理论上实现长期对数财富增长率最大化的最优杠杆杠杆比例;
- 半凯利与分数凯利(Fractional Kelly):由于实盘参数估计存在误差,通常采用 作为稳健下注比例;
- CPR 固定比例风险模型(Constant Proportion Risk):单笔交易最大允许亏损金额严格锁定在总资本的固定比例(如 )。
┌─────────────────────────────────────────────────────────────┐
│ 资金管理模型与头寸规模计算拓扑图 │
└──────────────────────────────┬──────────────────────────────┘
│
┌─────────────────────────────┼─────────────────────────────┐
▼ ▼ ▼
┌─────────────────────────┐ ┌─────────────────────────┐ ┌─────────────────────────┐
│ 凯利公式 (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 │
└─────────────────────────┘ └─────────────────────────┘ └─────────────────────────┘一、凯利公式的数学推导与破产临界点
设单笔交易胜率为 ,失败概率为 ,获胜时的盈亏比为 。每笔下注占当前资本比例为 。经过 轮交易后的几何复合增长率为:
对 求导令 ,解得使复合增长率最大化的最优下注比例:
当 时,策略复合增长率将跌入负值区间,必将导致破产。
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)规定每次交易承担的绝对风险金额为总资金的固定比例 (如 )。单只标的的买入股数由每股止损距离 决定:
注意该公式只约束了「风险敞口」,并未约束「资金占用」。A 股现货账户无杠杆,当止损距离极窄( 很小)时,公式算出的股数对应市值可能超过总资金,实际下单时必须再取 作为资金上限。
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
========================================================本章小结
- 永远使用分数凯利(Half-Kelly):实战中参数估计具有不确定性,半凯利能在牺牲微小几何增长的同时大幅降低回撤深度。
- 严防过度杠杆引发几何破产:当下注比例超过理论最优值 2 倍时,长期的期望复合增长率必然衰减为负。
- 结合 ATR 动态核算股数:通过 CPR 模型让每笔交易承担等量资本风险,实现不同波动率标的间的风险平价。
📋 行动清单 (Action Checklist)
- 运行凯利公式仿真测试代码,修改胜率与盈亏比观察最优下注比例变化;
- 编写结合单品种最大仓位限制与 CPR 资金模型的头寸规模综合分配器;
- 预习下一节,掌握用 Python 面向对象编程实现完整的资金管理模块。
— 小象教研组
配套学习资源与课件
🎁 免费学习资源
领取《小象 11GB VIP 课件资料包与大厂真题手册》
包含全套实战 Jupyter 源码、清洗后数据集、大厂高频面试真题与专属学员答疑交流群。
- ✔完整 Python / 数据分析 Jupyter 实战源码
- ✔大厂真实业务数据集与练习题
- ✔微信扫码添加课程顾问,免费获取网盘下载链接
微信扫码添加顾问