凯利公式、固定 2% 风险法与回撤熔断——比选股更决定生死的那件事
一个纯离线的仓位计算器 scripts/position_sizing.py。输入一个策略的历史胜率和盈亏比(内置第 4 课的真实回测结果:8 笔交易、胜率 12%),它回答三个问题:
前面十四课我们都在回答"买什么、什么时候买"。这节课回答"买多少、什么时候必须停下来"。对实盘来说,后者更重要。
先看一个思想实验。两个交易者用同一个策略,胜率赔率完全一样:A 每笔押本金的 2%,B 每笔押 50%。连亏 5 笔之后(任何策略都会遇到连亏 5 笔),A 还剩 90% 本金,B 只剩 3%——B 已经事实上出局了,哪怕策略本身是好的。决定你能不能活到策略兑现期望的,不是策略,是仓位。
这也是为什么本系列到第 15 课才讲仓位:前面的课给了你"信号从哪来",但信号再好,仓位错了照样死。仓位管理就三件事,对应今天的三个工具:
| 问题 | 工具 | 一句话 |
|---|---|---|
| 这策略配不配占用本金? | 凯利公式 | 期望为负的策略,最优仓位是零 |
| 单笔最多亏多少? | 固定 2% 风险法 | 先把亏损钉死,再反推股数 |
| 连亏时谁来踩急刹车? | 回撤熔断 | 回撤 10% 减半仓,20% 清仓 |
凯利公式(Kelly criterion)出自贝尔实验室 1956 年的一篇论文,回答的问题是:一个有利可图的赌局,每把应该押本金的多大比例,长期增长率才最大?形式很简单:
f* = p − (1−p) / b
p = 胜率
b = 盈亏比(平均盈利 ÷ 平均亏损)
f* = 最优仓位比例
推导和出处见 Wikipedia: Kelly criterion。你现在不需要会推导,只需要会代入——脚本替你算。
动手运行:
cd "$HOME/AI Project/Quant Learning"
source .venv/bin/activate
python scripts/position_sizing.py
第一部分输出(我已在你的环境实测通过,数字是真实运行结果):
==========================================================
第一部分:凯利公式 —— 这个策略该下多大的注?
==========================================================
数据:第 4 课双均线策略真实回测,8 笔交易 1 胜 7 负
平均盈利 12,153 元,平均亏损 35,547 元
【第 4 课策略】胜率 12.5%,盈亏比 0.34
凯利仓位 f* = p - (1-p)/b = 0.125 - 0.875/0.342 = -2.43
结论:凯利值为负——数学上的最优仓位是 0(负值对应做空,A 股散户做不到)。
这个策略任何仓位下的期望收益都是负的:根本不该上场。
【对照示例:胜率 45%、盈亏比 2.0 的策略】胜率 45.0%,盈亏比 2.00
凯利仓位 f* = p - (1-p)/b = 0.450 - 0.550/2.000 = +0.17
结论:满仓凯利 17.5%,半凯利 8.8%——实盘建议用半凯利(见下文)。
第 4 课我们只看到"-23.79%,跑输买入持有",这节课凯利公式给了更狠的判词:这个策略的最优仓位不是小仓、不是半仓,是零。胜率 12.5%、赢一次赚 1.2 万、输一次亏 3.6 万——数学上没有任何仓位能让它的期望转正。回头看第 7 课的参数扫描(16 组全亏)和第 14 课的真实性修正,结论是同一条:在茅台 2024 年这种行情里,双均线策略连"上场资格"都没有。凯利公式的第一用途不是算仓位,是验资格。
对照示例里,胜率 45%、盈亏比 2.0 的策略算出满仓凯利 17.5%。但请注意这个计算的两个前提,缺一个公式就失效:
正因为 p 和 b 是估计值,而凯利对高估胜率极其敏感(高估一倍的策略,满仓凯利会走向破产,半凯利只是少赚),实盘的标准做法是半凯利(half-Kelly):算出 f* 后只押一半,用理论上一部分增长率换取对估计误差的免疫力。这不是保守,是承认"我不知道真实的 p 和 b"的工程姿态——和第 8 课"风控独立于策略"是同一种姿态:不相信任何单一环节的乐观估计。
脚本支持算你自己的策略(假设你将来有个胜率 50%、盈亏比 1.5 的策略):
python scripts/position_sizing.py --win-rate 0.50 --payoff 1.5
凯利要求你能估出胜率和赔率——很多场景估不出(比如一次基于研报的 discretionary 买入)。这时候用更朴素的规则:固定风险法。规则只有一条:单笔交易,止损触发时的亏损不得超过本金的一个固定比例(常见取 1%–2%,本课用 2%)。
注意顺序是反的:先定"最多亏多少",再算"能买多少股"。脚本第二部分的实测输出:
==========================================================
第二部分:固定 2% 风险法 —— 单笔最多亏本金的 2%
==========================================================
本金 1,000,000 元,单笔风险预算 = 本金 × 2% = 20,000 元
示例标的:茅台 2024-12-31 收盘价 1435.70 元(data/600519_qfq_2024.csv 最后一天)
止损幅度 每股止损额 可买股数 持仓市值 占本金
3% 43.07 400 574,280 57.4%
5% 71.79 200 287,140 28.7%
8% 114.86 100 143,570 14.4%
这张表有三个反直觉的地方,值得逐个看懂:
固定比例风险法的系统化讨论见范·撒普《通向财务自由之路》(Trade Your Way to Financial Freedom)——"R 倍数"体系的第一块砖,本课的 2% 就是 1R。
前两道工具管"单笔"。但策略层面还有另一种死法:策略进入失效期,连亏不止——可能是行情变了(第 4 课:趋势策略遇上震荡市),也可能是你的前提错了。你不可能靠理智在连亏中保持判断,所以把刹车规则提前写好:净值从历史高点回撤超过 10% → 仓位减半;超过 20% → 清仓离场;回撤收窄到 5% 以内 → 恢复满仓。
脚本第三部分把这套规则应用到第 4 课双均线策略的真实净值曲线上(逐日重放,成本口径同第 7 课),实测结果:
==========================================================
第三部分:回撤熔断模拟 —— 回撤 10% 减半仓,20% 清仓
==========================================================
场景:第 4 课双均线策略净值曲线(2024-01-02 ~ 2024-12-31)
规则:回撤 >10% 仓位减半,>20% 清仓,收复到 5% 以内恢复满仓
熔断事件日志:
2024-07-25 回撤 -10.5% → 减半仓(回撤超 10%)
无熔断 有熔断
总收益 -25.8% -18.3%
最大回撤 -27.2% -19.1%
读法:7 月 25 日回撤击穿 10%,熔断器把仓位砍半;此后策略继续亏(10 月那笔 -61,959 的大亏就在减半仓的保护下只造成了一半伤害),全年最大回撤从 -27.2% 压到 -19.1%。这个策略全年没击穿 20% 的清仓线——如果真击穿了,熔断器会强制你停下来,回到第 7 课的四步循环重新审假设,而不是继续加仓"摊低成本"。
熔断不是免费的:恢复满仓要等回撤收窄,反弹最肥的一段经常踏空——9 月底政策行情那种 V 型反转,熔断状态下只能半仓参与。这就是"活着"的门票钱。你买的不是收益,是"不会在失控状态下做决策"。
连亏中的人脑会分泌大量"这次不一样""快反弹了""再扛一扛"。熔断规则的价值恰恰在于它不和你商量:回撤到线就执行,和第 6 课的异动监控一样,机器负责不知疲倦地盯,人负责事先定规则、事后复盘。这正是 Agent 辅助决策系统的正确分工——Agent 可以帮你盯净值、报回撤、执行降仓,但阈值必须是你事先定的。
现在把第 8 课和本课拼起来,你的实盘辅助决策系统在"下单"这个动作前有两道闸:
| 第一道闸:风控检查器(第 8 课) | 第二道闸:仓位规则(本课) | |
|---|---|---|
| 回答的问题 | 能不能交易? | 买多少? |
| 检查内容 | 黑名单、停牌、涨跌停、流动性、持仓限制 | 凯利值验资格、2% 风险定上限、熔断器管全程 |
| 关键属性 | 独立于策略与 Agent,策略说"能买"不算数 | 独立于信号强度,"特别看好"不加仓 |
两道闸的共同点是独立:策略负责"买什么",闸负责"活下来"。信号越强、Agent 越自信,闸越不能松——因为最危险的时刻,恰恰是系统里每个组件都在说"买"的时刻。
用--win-rate和--payoff参数给第 7 课参数扫描里"最优"的 3/60 参数算一次凯利值(它的交易次数太少,这本身就是问题——想想为什么样本少时凯利值不可信)。再把脚本里的DD_HALF改成 0.05、DD_STOP改成 0.10 重跑,看熔断收紧后总收益和最大回撤怎么变,体会"门票钱"的价格。
凭记忆作答,答错会显示解析。
第 16 课 · 策略组合与相关性:一个策略会失效,几个低相关的策略组合起来会怎样?用前面课程攒下的策略做组合,看相关性如何摊平回撤——以及为什么"看起来不相关"的 Agent 信号可能在同一次暴跌里一起失灵。
有任何不清楚的地方(比如凯利公式怎么代入、熔断模拟的状态机、两道闸怎么和第 8 课的代码对接),直接问我——我是你的老师。