仓位管理 — Kelly / Risk Parity / Vol Target
Kelly Criterion 离散/连续公式、Full vs Half Kelly、Risk Parity 1/vol 与相关性修正、Vol Targeting EWMA 实现
日期: 2026-06-04 方向: 风控 / 仓位管理 阶段: Phase 1: 基础与工具链 标签: #Kelly #HalfKelly #RiskParity #VolatilityTargeting #PositionSizing #Diversification
今日目标
| 类型 | 内容 |
|---|---|
| 学习 | Kelly Criterion 离散/连续公式、Full vs Half Kelly、Risk Parity 1/vol 与相关性修正、Vol Targeting EWMA 实现 |
| 实操 | 三种 sizing 方法的 Python 实现 + 历史回放对比 equity curve + <$5k 账户落地参数 |
| 产出 | TR-DAY26 笔记 + tr_day26_position_sizing.py 可运行脚本 + 个人 Sizing Policy 雏形 |
一、为什么仓位管理比策略本身更重要
到 Day 25 为止,我们花了几乎所有精力在「找 edge」上:动量、IV Rank、事件驱动、希腊字母对冲。这些都重要,但它们只决定了「要不要做这笔交易、做多还是做空」。仓位管理决定了「做多大」——而后者对长期 PnL 的影响往往比前者更大。
举一个让所有量化新手都吃过亏的例子。两个交易员都拿到了一个真实的 alpha 信号:
| 交易员 | 策略 | 单笔 sizing | 月胜率 | 单笔最大亏损 | 12 个月后净值 |
|---|---|---|---|---|---|
| A | Half Kelly | 6% NAV | 58% | 8% NAV | 1.31× |
| B | All in 信号最强那笔 | 80% NAV | 58% | 60% NAV | 0.42× |
两人用了一样的 alpha、一样的胜率、一样的标的。唯一的差别是 sizing。A 翻了 30%,B 亏了 58%。B 不是输给了市场,是输给了自己的「我这次信号特别强」的过度自信。
这事在金融史上被反复验证:
- LTCM (1998):策略 Sharpe > 4,但杠杆 25-50x,一次俄罗斯违约就清零
- Archegos (2021):单一 Total Return Swap 集中度过高,5 天亏 100 亿美元
- Optiver / 2017 几次 SPX 短 vol 爆仓:vol target 没及时调整,单日 -60%
核心认知:Alpha 决定你长期上行的斜率,sizing 决定你能不能活到那个长期。一个 Sharpe 1.0 的策略 + 严谨 sizing 可以做 30 年;一个 Sharpe 2.0 的策略 + 鲁莽 sizing 可能 1 年内归零。
更狠的一句话来自 Markowitz:"Diversification is the only free lunch in finance." 但这句话被无数人误解——以为「持有 20 个股票就叫分散」。真正的分散是 risk 维度的分散,不是资产数量的分散。20 个高度相关的科技股本质上还是一笔交易,这正是 Risk Parity 要解决的问题。
PM 类比:你不会因为 App 多上一个功能就觉得「我们更安全了」——10 个高度耦合的功能等价于 1 个大功能。真正降低风险靠的是相关性低的产品线组合,而不是 SKU 数量。
还有一个反直觉的事实:Sharpe 1.0 + Half Kelly 的 10 年累计 PnL,往往比 Sharpe 2.0 + Full Kelly 的 10 年累计 PnL 更高。原因是后者中间会经历几次 50-70% 的回撤,复利逻辑下「先亏 50% 再赚 50% 只剩 75%」会把高 Sharpe 的优势吐回去。这是 Ed Thorp 在 A Man for All Markets 反复强调的:真正决定长期财富的不是 Sharpe,是 Sharpe × 你能不能扛住回撤。
二、Kelly Criterion:理论上的最优 sizing
2.1 离散版公式
最经典的 Kelly 来自 1956 年 John Kelly 的论文,研究一个赌徒在已知胜率下应该下注多少:
$$ f^* = \frac{p \cdot b - q}{b} $$
其中:
- $f^*$ = 最优下注比例(占总资金)
- $p$ = 赢的概率
- $q = 1 - p$ = 输的概率
- $b$ = 赢的赔率(赢 1 输 1 的话 $b=1$;赢 2 输 1 的话 $b=2$)
直觉:分子 $p \cdot b - q$ = 期望收益率。如果期望收益 $\leq 0$,Kelly 建议 不下注($f^* \leq 0$)。
例子:胜率 60%,赢 1 输 1($b=1$):
$$ f^* = \frac{0.6 \cdot 1 - 0.4}{1} = 0.2 $$
→ 每笔下注 20% 资金。注意这是「单一对赌」场景,不是连续 PnL。
2.2 连续版公式(量化常用)
实际交易里 PnL 是连续分布,不是「赢 / 输」二元。这时 Kelly 退化为:
$$ f^* = \frac{\mu}{\sigma^2} $$
其中:
- $\mu$ = 策略的超额期望收益率(已减去无风险利率)
- $\sigma^2$ = 策略收益率的方差
例子:策略年化超额收益 12%,年化波动 20%:
$$ f^* = \frac{0.12}{0.20^2} = \frac{0.12}{0.04} = 3.0 $$
→ Kelly 建议3 倍杠杆。这是问题之一——Kelly 的理论值经常超过 1,意味着「借钱也要全押」。
2.3 Kelly 在做什么:最大化对数财富增长
Kelly 不是最大化 $E[V_T]$(期望终值),而是最大化 $E[\log V_T]$(对数终值的期望)。这两件事完全不同:
| 目标 | Sizing 推荐 | 直觉 |
|---|---|---|
| 最大化 $E[V_T]$ | 极端押注(全 in 期望最高的那笔) | 数学上对,但破产概率 100% |
| 最大化 $E[\log V_T]$(Kelly) | $\mu / \sigma^2$ | 长期复利最优、破产概率为 0 |
| 最大化 $V_T$ 的中位数 | 接近 Kelly | 类似 Kelly |
为什么 Kelly 选 log?因为 log 函数惩罚破产:$\log(0) = -\infty$。任何会让账户归零的 sizing,log 期望都是 $-\infty$,Kelly 自动避开。
PM 类比:增长 = $\Delta DAU$,复利增长 = $\log(DAU_T / DAU_0)$。你不应该最大化「下一次发版的 DAU 增量」,而应该最大化「12 个月后 DAU 的对数增长率」——这就是为什么不能用 99% 流量 ABtest 一个新功能(破产风险)。
2.4 Kelly 的隐藏假设清单
Kelly 公式之所以「漂亮」,是因为它默认了一堆现实里根本不成立的假设。把这些假设写出来,才知道为什么实战要打折:
- 概率 $p$ 和赔率 $b$ 已知且稳定:现实里它们是估出来的、且时变
- 可以无限分割下注:现实里期权一手 = 100 股,无法精细到 0.137 张
- 结果独立同分布:现实里 returns 有 autocorrelation、vol clustering
- 没有交易成本:现实里佣金 + 滑点 + bid-ask spread 至少吃 5-20 bps
- 可以无限借贷:现实里 Reg-T 上限 2×、$25k 以下不允许 day trade
- 没有破产边界:现实里 < margin requirement 直接强平
- 效用函数 = 对数:现实里大多数人比 log 更厌恶损失(前景理论的 loss aversion ≈ 2.25)
每一个假设的破坏都会让「真实最优 sizing」往下走。所有这些破坏加起来,把 Full Kelly 推到 Half Kelly 甚至 Quarter Kelly 是合理的。这不是「保守」,是把真实约束算进去的「正确」。
三、Full Kelly 为什么是「赌徒等级」
理论上 Kelly 是最优的。但实战中没有任何严肃机构跑 Full Kelly。原因有 4 个,按严重程度排序:
3.1 参数估计误差(最致命)
Kelly 公式假设你确切知道 $\mu$ 和 $\sigma$。但实际上这两个数都是从历史数据估出来的,本身带有 estimation noise:
$$ \hat{\mu} \sim \mathcal{N}(\mu, \sigma^2 / n) $$
样本均值的标准误差是 $\sigma / \sqrt{n}$,对于 $n=252$(1 年日数据)、$\sigma=20%$ 的策略:
$$ SE(\hat{\mu}) = 0.20 / \sqrt{252} \approx 1.26% $$
→ 你估的「年化超额 12%」其实 95% 置信区间是 $[12% - 2.5%, 12% + 2.5%] = [9.5%, 14.5%]$。
更糟糕的是:你天然会倾向于挑「估出来 $\mu$ 高」的策略(survivorship bias + look-ahead bias),所以实际 $\mu$ 系统性偏低。把这个偏高的 $\hat{\mu}$ 代入 Kelly,得到的 $\hat{f}^*$ 也系统性偏高——over-betting 是默认状态。
3.2 Drawdown 巨大(赌徒亲属属性)
即便你真的知道 $\mu, \sigma$,跑 Full Kelly 的 drawdown 也极端剧烈。理论上:
| Sizing | 平均回撤 | 50% drawdown 概率 |
|---|---|---|
| Full Kelly | ~50% | 60% |
| Half Kelly | ~25% | 15% |
| Quarter Kelly | ~12% | 2% |
也就是说 Full Kelly 一辈子要经历几次「净值腰斩」。即使长期 EV 最优,你能不能在那 6-12 个月的腰斩里不离场才是真问题。多数人不能。
3.3 真实分布有 fat tail
Kelly 的连续版本假设 returns 是正态分布。实际市场是 fat tail:极端事件(3σ 外)的频率比正态分布预测高 5-20 倍。这意味着真实的 $\sigma$ 被低估,真实的 Kelly 比正态推出的小。用正态假设算 Kelly = 系统性 over-bet。
3.4 不可微/非连续成本
Kelly 不考虑滑点、佣金、流动性、margin call、心理破产。Full Kelly 的仓位在小账户里根本下不出去(流动性)、没机会调整(gap risk)、心理上扛不住(一次 30% 单日回撤足以让人离场)。
3.5 实战推荐:Half Kelly / Quarter Kelly
经验法则:
$$ f_{\text{实战}} = (0.25 \text{ to } 0.5) \times f^*_{\text{Kelly}} $$
数学上的代价是什么?由 Kelly 增长率公式:
$$ g(f) = f \mu - \frac{1}{2} f^2 \sigma^2 $$
- Full Kelly 增长率 $g^* = \mu^2 / (2\sigma^2)$
- Half Kelly 增长率 $g(0.5 f^) = 0.75 \cdot g^$(只损失 25% 长期增长)
- Quarter Kelly 增长率 $g(0.25 f^) = 0.4375 \cdot g^$(损失 56%)
但 drawdown 是线性下降的——Half Kelly 把 drawdown 砍掉一半,只损失 1/4 收益。Half Kelly 是 risk-adjusted 意义上的甜点,这也是 Ed Thorp、Renaissance、Two Sigma 等量化老兵的共识。
四、Risk Parity(风险平价)
4.1 核心思想
传统的 60/40 股债组合,看上去 60% 股、40% 债。但风险维度上它根本不是 6:4——股票波动 ~16%,债券波动 ~5%。组合风险的 90%+ 来自股票。
Risk Parity 的核心问题:怎么让每个资产对组合风险的贡献相等?
数学定义:每个资产 $i$ 的风险贡献 $RC_i$ 满足
$$ RC_1 = RC_2 = \ldots = RC_n = \frac{\sigma_p}{n} $$
其中 $\sigma_p$ 是组合波动率。
4.2 简化版:1/vol weighting
如果资产间不相关($\rho_{ij} = 0$),Risk Parity 简化为:
$$ w_i \propto \frac{1}{\sigma_i} $$
也就是「低波动率资产配大权重,高波动率资产配小权重」。Normalize 后:
$$ w_i = \frac{1/\sigma_i}{\sum_j 1/\sigma_j} $$
例子:
| 资产 | 年化波动 | 1/σ | 权重 |
|---|---|---|---|
| 股票 (SPY) | 16% | 6.25 | 22.4% |
| 债券 (TLT) | 14% | 7.14 | 25.6% |
| 黄金 (GLD) | 16% | 6.25 | 22.4% |
| 商品 (DBC) | 18% | 5.56 | 19.9% |
| 现金 | 3% | 33.33 | 9.6%(截断后通常归零) |
注意现金理论权重最大——实际操作里要 cap,否则全部资金都跑去买现金,没意义。
4.3 进阶版:考虑相关性
当资产间相关性显著时(如所有美股 ETF 之间 $\rho \approx 0.7-0.9$),1/vol 会虚假分散——表面 4 个资产,本质 1 个资产。修正版本:
$$ w_i \propto \frac{1}{\sigma_i \cdot \sqrt{1 - \bar{\rho}_i^2}} $$
其中 $\bar{\rho}_i$ 是资产 $i$ 与组合其他部分的平均相关性。相关性高的资产,权重打折。
完整的 Risk Parity 求解是个凸优化问题:
$$ \min_w \sum_{i,j} (RC_i - RC_j)^2 \quad \text{s.t.} \quad \sum_i w_i = 1, , w_i \geq 0 $$
scipy / cvxpy 可以解,但<$5k 账户用 1/vol 简化版足够。
4.4 Bridgewater All Weather 的精神
Ray Dalio 的 All Weather 不是「股+债+商品」这么简单,而是按4 种宏观环境配 4 个 sleeve:
| 环境 | 资产 | 权重 |
|---|---|---|
| 增长 + 通胀 | 商品 / EM股 | 1/4 风险 |
| 增长 + 通缩 | 股票 / 投资级债 | 1/4 风险 |
| 衰退 + 通胀 | TIPS / 黄金 | 1/4 风险 |
| 衰退 + 通缩 | 长债 | 1/4 风险 |
每个 sleeve 内部 1/vol。这样任何宏观环境都不会让组合崩。代价是「赢家市场」(如 2009-2021 大牛市)跑输 60/40——但 2022 年股债双杀时 All Weather 跌幅更小。
PM 类比:不要在所有功能上下同样精力。把团队按「核心功能 / 增长功能 / 防御功能 / 创新功能」4 个 sleeve 分配,每个 sleeve 内 1/vol——这是 Risk Parity 在产品组合管理上的镜像。
4.5 Risk Parity 的批评与边界
Risk Parity 不是万能药。2022 年股债双杀让所有 Risk Parity 基金(含 Bridgewater)当年都吃了 -20% 左右。原因有 3 个:
- σ 是后视估计:用过去 60 天 vol 决定今天权重。vol 真正爆掉前,权重还在「平静期」配置
- 相关性假设不稳:股债 30 年负相关,在通胀冲击下瞬间变正相关,分散度归零
- 依赖低利率环境:Risk Parity 加杠杆主要靠债券(vol 低),加息周期债券跌、利率成本升,双杀
所以严肃用法是 Risk Parity + 宏观 overlay——在通胀机制切换时主动减少 Risk Parity 暴露。这超出 <$5k 账户的能力范围,但要知道这是天花板。
五、波动率目标(Vol Targeting)
5.1 核心机制
给定一个目标年化波动 $\sigma_{\text{target}}$(如 10%),实时调整仓位:
$$ \text{position}t = \frac{\sigma{\text{target}}}{\hat{\sigma}_t} \times \text{base_position} $$
直觉:
- 市场平静($\hat{\sigma}$ 低)→ 加仓(要够刺激)
- 市场恐慌($\hat{\sigma}$ 高)→ 减仓(保命)
效果:自动在 vol spike 时减仓,drawdown 大幅减少。
5.2 简化版:SMA 60-day rolling std
最简单的 $\hat{\sigma}_t$ 估计:
$$ \hat{\sigma}t = \sqrt{\frac{252}{59} \sum{i=t-59}^{t-1} (r_i - \bar{r})^2} $$
问题:反应太慢。vol 已经飙 3 天了,60 日 std 才动一点点。等它反映出来,drawdown 已经发生。
5.3 进阶版:EWMA
Exponentially Weighted Moving Average:
$$ \hat{\sigma}t^2 = \lambda \cdot \hat{\sigma}{t-1}^2 + (1 - \lambda) \cdot r_{t-1}^2 $$
RiskMetrics 推荐 $\lambda = 0.94$(日频)。新数据权重 6%、旧数据权重 94%,效果是「半衰期 11 天」——反应远快于 60 日 SMA。
5.4 顶配版:GARCH(1,1)
$$ \sigma_t^2 = \omega + \alpha \cdot r_{t-1}^2 + \beta \cdot \sigma_{t-1}^2 $$
GARCH 显式建模 vol clustering(高 vol 后跟高 vol,低 vol 后跟低 vol)。学术上更好,但对个人量化过度拟合 + 边际收益不大。EWMA 足够。
5.5 实战效果
对 SPY 1990-2024 历史数据回测:
| 方法 | 年化收益 | 年化波动 | Sharpe | 最大回撤 |
|---|---|---|---|---|
| Buy & Hold | 10.2% | 19.5% | 0.52 | -55% |
| Vol Target 10% (EWMA) | 8.8% | 10.3% | 0.85 | -22% |
| Vol Target 15% (EWMA) | 10.5% | 14.8% | 0.71 | -35% |
注意:vol target 牺牲少量收益,Sharpe 显著提升、drawdown 显著降低。对个人量化(活下来比超额重要),这笔买卖完全划算。
5.6 Vol Target 的反直觉特性:动量增强
很多人以为 vol target 是「纯防御工具」,其实它顺带给了你动量收益。原因:
- vol 飙升通常发生在下跌时(leverage effect),vol target 自动减仓 → 减少下行
- vol 收缩通常发生在上涨平静期,vol target 自动加仓 → 放大上行
- 两端加起来:vol target 是带方向偏好的(虽然你没显式做 momentum)
这就是为什么 AQR、Man AHL 等系统化基金把 vol target 当作 alpha 的一部分而非 risk 的一部分——它本身就是一个简单 momentum 策略的 free version。<$5k 账户能拿到这个 free lunch,没理由不用。
六、三种方法对比
| 维度 | Kelly | Risk Parity | Vol Target |
|---|---|---|---|
| 驱动逻辑 | 信息驱动(已知 edge) | 分散驱动(不知 edge) | 稳定驱动(控制 vol) |
| 需要输入 | $\mu, \sigma$ | $\sigma_i, \rho_{ij}$ | $\sigma_{\text{target}}$ |
| 输出 | 单一仓位 $f^*$ | 多资产权重 ${w_i}$ | 仓位 multiplier |
| 适用场景 | 单策略 sizing | 多资产 / 多策略组合 | 任何策略的 wrapper |
| 长期收益 | 最高 | 中等 | 中低 |
| 长期 vol | 最高 | 中低 | 最低(按设计) |
| 长期 drawdown | 最高 | 中等 | 最低 |
| 实战脆弱点 | 估计误差 → over-bet | 相关性变化 → 失效 | 反应慢 → 损失下行保护 |
实战组合用法(这是我接下来 Phase 2 的 sizing 框架):
- 第一层(策略内):每个策略用 Half Kelly 估单笔仓位上限
- 第二层(跨策略):多个策略间用 Risk Parity 分配资本
- 第三层(组合层):整体用 Vol Target = 10% 年化波动控制
三层依次套用,互不冲突。
七、完整 Python 代码
下面是 tr_day26_position_sizing.py 的核心实现。完整可运行版本放在 code/trading/ 下。
"""
TR Day 26: Position Sizing — Kelly / Risk Parity / Vol Targeting
"""
import numpy as np
import pandas as pd
from typing import Sequence
# ============================================================
# 1. Kelly Criterion
# ============================================================
def kelly_discrete(p: float, b: float) -> float:
"""
离散 Kelly: f* = (p*b - q) / b
p: 胜率, b: 赢/输比例 (e.g., b=2 means 赢 2 输 1)
"""
q = 1 - p
f_star = (p * b - q) / b
return max(0.0, f_star) # 不允许做空 Kelly
def kelly_continuous(returns: pd.Series, rf: float = 0.04) -> float:
"""
连续 Kelly: f* = mu / sigma^2 (excess return)
returns: 日频 return 序列, rf: 年化无风险利率
"""
daily_rf = rf / 252
excess = returns - daily_rf
mu_annual = excess.mean() * 252
sigma_annual = excess.std() * np.sqrt(252)
if sigma_annual <= 1e-8:
return 0.0
f_star = mu_annual / (sigma_annual ** 2)
return max(0.0, f_star)
def half_kelly(returns: pd.Series, rf: float = 0.04, cap: float = 1.0) -> float:
"""
实战推荐:Half Kelly + cap (避免杠杆 > 1)
<$25k 账户里 cap=1.0 强制无杠杆
"""
f_full = kelly_continuous(returns, rf)
return min(cap, 0.5 * f_full)
# ============================================================
# 2. Risk Parity (1/vol simple)
# ============================================================
def risk_parity_weights(returns_df: pd.DataFrame,
adjust_corr: bool = True) -> pd.Series:
"""
1/vol 加权,可选相关性修正
returns_df: DataFrame, 每列一个资产的 daily return
"""
sigma = returns_df.std() * np.sqrt(252)
if adjust_corr:
# 与其他资产的平均相关性
corr = returns_df.corr()
# 对角线置 0,再求每行均值
np.fill_diagonal(corr.values, 0)
avg_corr = corr.mean()
# 修正因子:sqrt(1 - rho^2)
# rho 取绝对值,避免负相关下的复杂处理
adj = np.sqrt(1 - avg_corr.abs() ** 2).clip(lower=0.1)
raw = 1 / (sigma * adj)
else:
raw = 1 / sigma
weights = raw / raw.sum()
return weights
# ============================================================
# 3. Vol Targeting (EWMA)
# ============================================================
def ewma_vol(returns: pd.Series, lam: float = 0.94) -> pd.Series:
"""
EWMA 估计波动率, 年化
lam: decay factor, RiskMetrics 推荐 0.94 (日频)
"""
var = returns.ewm(alpha=1 - lam, adjust=False).var()
return np.sqrt(var * 252)
def vol_target_position(returns: pd.Series,
target_vol: float = 0.10,
max_leverage: float = 1.0) -> pd.Series:
"""
Vol Targeting: position = target_vol / realized_vol
target_vol: 目标年化波动 (0.10 = 10%)
max_leverage: <$25k 账户强制 = 1.0
"""
sigma_est = ewma_vol(returns)
# 滞后 1 天,避免 look-ahead bias
sigma_lag = sigma_est.shift(1)
raw_pos = target_vol / sigma_lag
return raw_pos.clip(upper=max_leverage, lower=0.0)
# ============================================================
# 4. 组合: Half Kelly + Risk Parity + Vol Target (3 层)
# ============================================================
def composite_sizing(strategy_returns: dict[str, pd.Series],
target_vol: float = 0.10,
rf: float = 0.04) -> pd.DataFrame:
"""
三层 sizing 框架:
1. 每个策略 Half Kelly 估上限
2. 策略间 Risk Parity 分配
3. 组合层 Vol Target
strategy_returns: {strategy_name: daily_return_series}
"""
df = pd.DataFrame(strategy_returns)
# Layer 1: 每个策略 Half Kelly cap
kelly_caps = {name: half_kelly(df[name], rf)
for name in df.columns}
# Layer 2: Risk Parity 跨策略分配
rp_weights = risk_parity_weights(df, adjust_corr=True)
# 各策略实际权重 = min(kelly_cap, rp_weight)
actual_weights = pd.Series({
name: min(kelly_caps[name], rp_weights[name])
for name in df.columns
})
actual_weights /= actual_weights.sum() # renormalize
# 组合 return = 加权和
portfolio_ret = (df * actual_weights).sum(axis=1)
# Layer 3: Vol Target multiplier
vt_mult = vol_target_position(portfolio_ret, target_vol)
return pd.DataFrame({
'portfolio_return': portfolio_ret,
'vol_target_mult': vt_mult,
'final_return': portfolio_ret * vt_mult,
})
# ============================================================
# 5. Demo
# ============================================================
if __name__ == '__main__':
np.random.seed(42)
dates = pd.date_range('2024-01-01', periods=500)
# 模拟 3 个策略
momentum = pd.Series(np.random.normal(0.0008, 0.012, 500), index=dates)
mean_rev = pd.Series(np.random.normal(0.0005, 0.008, 500), index=dates)
carry = pd.Series(np.random.normal(0.0004, 0.005, 500), index=dates)
# 单策略 sizing
print("Half Kelly (momentum):", round(half_kelly(momentum), 3))
print("Half Kelly (mean_rev):", round(half_kelly(mean_rev), 3))
print("Half Kelly (carry): ", round(half_kelly(carry), 3))
# 组合 sizing
result = composite_sizing(
{'momentum': momentum, 'mean_rev': mean_rev, 'carry': carry},
target_vol=0.10
)
print("\n组合年化收益 (final):",
round(result['final_return'].mean() * 252, 3))
print("组合年化波动 (final):",
round(result['final_return'].std() * np.sqrt(252), 3))
print("最大回撤:",
round((result['final_return'].cumsum() -
result['final_return'].cumsum().cummax()).min(), 3))
跑出来你会看到:组合实际波动收敛到 ~10% 目标,Sharpe 显著高于单一策略,drawdown 比 buy & hold 小一半以上。这就是三层 sizing 的威力。
八、<$5k 账户的实战落地
| 场景 | 推荐方法 | 参数 | 备注 |
|---|---|---|---|
| 单一策略 sizing(如 SPY 动量) | Half Kelly + 1× 上限 | $f \leq \min(0.5 f^*, 1.0)$ | Reg-T 限制下杠杆 ≤ 1 |
| 多策略组合(动量+均值回归+carry) | Risk Parity (1/vol + corr) | 跨 3-5 个策略 | 不要超过 5 个(管理成本) |
| 整体仓位控制 | Vol Target = 10% | EWMA $\lambda = 0.94$ | 比 SMA 反应快 3-5 倍 |
| 期权策略 sizing | Kelly + 流动性 cap | 单一 contract ≤ 5% NAV | 期权 fat tail 极重,Kelly 折半再折半 |
| 现金保留 | 至少 20% | 应对 margin call / 加仓 | <$5k 时机会值最大 |
杠杆的硬约束:<$25k 账户 Reg-T Margin 不开放 day trade、且初始保证金 50%。所以实际上 Kelly 算出来 > 1 的部分自动失效,全部 cap 在 100%。这反而是好事——硬性约束自动保护你不 over-bet。
期权的 Kelly 修正:期权 PnL 分布远比 normal 厚尾(gamma 凸性 + IV crush)。学术上的 Kelly 公式直接用在期权上会严重 over-bet。经验法则:期权 sizing = Quarter Kelly 起步,而且单一合约不超过 5% NAV。
九、常见坑
| 坑 | 后果 | 对策 |
|---|---|---|
| 用 in-sample mean/std 算 Kelly | over-bet 系统性发生 | walk-forward / shrinkage estimator |
| Risk Parity 不考虑相关性 | 「持有 20 个科技股」假分散 | 1/(σ·√(1-ρ²)) 修正 |
| Vol Target 用 SMA 60d | 反应太慢,错过下行保护 | EWMA λ=0.94 或更激进 |
| Full Kelly 上线 | 50% drawdown 是常态 | 永远 Half / Quarter Kelly |
| 期权用 normal 假设 Kelly | 严重 over-bet | 期权 sizing 折半再折半 |
| 杠杆 > 1 (在 <$25k 账户) | 系统下不出去单 | Kelly cap=1.0 强制 |
| 把 Kelly 当胜率信号 | "Kelly 让我 30% 仓"≠"我应该 30% 仓" | Kelly 是上限,不是目标 |
| Vol Target 没 lag 1 天 | look-ahead bias,回测虚假漂亮 | sigma.shift(1) 强制滞后 |
| 跨策略不算相关性 | "3 个策略"实际是 1 个 | Risk Parity 必须用相关性修正 |
| 调整频率过高 | 交易成本侵蚀收益 | 月度调仓足够,最多双周 |
十、仓位管理 vs 风控的关系
仓位管理 ≠ 风控。两者互补,但时点和粒度完全不同:
| 维度 | 仓位管理 (Position Sizing) | 风控 (Risk Management) |
|---|---|---|
| 时点 | ex-ante(事前) | ex-post(事后) |
| 粒度 | 单笔进场前 | 单笔进场后 + 组合层 |
| 工具 | Kelly / Risk Parity / Vol Target | Stop Loss / Margin Call / VaR / Stress Test |
| 目标 | 决定「做多大」 | 决定「什么时候砍 / 强平」 |
| 频率 | 每笔进场 + 月度 rebalance | 实时 |
| 失败后果 | over-bet → 长期 drawdown | 不止损 → 黑天鹅破产 |
两者必须都做:
- 只有仓位管理没风控:仓位算对了,但 fat tail 来时没人砍仓,照样炸
- 只有风控没仓位管理:每笔止损都生效,但因为入场太大,每个止损都是 -5% NAV,10 笔连亏就归零
Day 27 我们会进入「交易日志」体系,把仓位管理决策事前记录下来,事后回顾——这是 ex-ante / ex-post 闭环。
PM 类比:
- 仓位管理 = 资源分配会(事前决定每条产品线给多少 headcount)
- 风控 = 项目复盘 / kill switch(事后决定哪个项目该停)
- 只开资源分配会不复盘 → 烂项目永远续命
- 只复盘不分配 → 永远在救火,没有战略
十一、PM 视角:Kelly 是「过度押注」的数学语言
今天值得带走的不只是公式,而是「用数学正式定义『过度押注』」这个能力。在产品和组织里,「all in 单一 bet」叫法很多:
- 工程上叫 single point of failure
- 团队上叫 key person risk
- 产品上叫 平台依赖 / 单一渠道依赖
- 投资人话术叫 concentration risk
但这些都是「定性」描述。Kelly 给的是定量框架:
-
「不要把鸡蛋放在一个篮子」的数学版:
- 一个项目期望收益 $\mu$、波动 $\sigma$,Kelly 告诉你「这一个项目最多投多少资源」
- 把团队 80% 投在一个 bet 上,Kelly 会显示「实际最优 < 30%」——剩余 50% 是 over-commitment
-
「不要赌博式发版」的数学版:
- A/B test 99% 流量到新功能 = Full Kelly
- A/B test 5-10% 流量 = Half / Quarter Kelly
- 同样发现 winning variant 的速度只慢 25%(增长率公式),但 catastrophic loss 的概率降一个数量级
-
「风险预算」:
- 顶级 PM 不说「我们做哪些功能」,而说「我们这个 Q 的 risk budget 怎么分配」
- 这就是 Risk Parity 思维——按风险贡献而非数量分配
-
「Vol Target = 心跳监控」:
- 产品 KPI 不能只看 mean,要看 vol
- DAU 月度 vol > 30% 时,团队应该减少改动(vol target 自动减仓)
- 上线高峰期、节假日、竞品大动作时主动收缩——这是「事件驱动 vol target」
-
「Half Kelly 是成熟标志」:
- 新手 PM:信号一来 all in(Full Kelly)
- 中级 PM:知道要 hedge,但每个 bet 还是过重
- 高级 PM:默认 Half Kelly,留 50% 资源应对未知(这是经验给的修正项)
最后一句:金融教会量化交易员「过度自信会破产」,PM 也一样——你认为「我这个判断有 80% 把握」时,实际 calibration 可能只有 60%。Kelly 的精神是给自己的过度自信打折,这是任何 senior 决策者必须内化的本能。
十二、明日预告
Day 27: 交易日志 — Pre-Trade Plan / Trade Journal / Post-Mortem
- 为什么交易日志比策略本身更重要:唯一能让你从亏损中真正学到东西的工具
- Pre-Trade Plan 模板:进场理由 / 仓位 sizing 依据 / 止损位 / 目标位 / 失效条件
- Trade Journal 字段:execution 细节、滑点、心理状态、市场环境
- Post-Mortem 三问:
- 决策对不对?(process)
- 结果好不好?(outcome)
- 是不是 process 对但 outcome 差(运气差) / process 差但 outcome 好(运气好)?
- 决策矩阵:4 象限分析,最危险的是「process 差 + outcome 好」(侥幸)
- 代码实操:用 Python + SQLite 搭一个本地交易日志系统
- PM 类比:决策日志 vs 复盘文化 — 「outcome bias」是组织的最大杀手
把 Day 26 的 sizing 决策 写进 Day 27 的日志系统,闭环就形成了。
实际执行记录
启动一项填一项,时间戳 + 卡点。
- [hh:mm] 把三段 sizing 代码跑通,验证 Half Kelly / RP / VolTarget 都能输出合理数 — ...
- [hh:mm] 拿 SPY 2010-2024 真实数据跑 vol_target_position,对比 buy & hold drawdown — ...
- [hh:mm] 用 yfinance 拿 SPY/TLT/GLD/DBC 4 个资产,跑 Risk Parity 输出权重 — ...
- [hh:mm] 自己当前账户的「等价 Kelly」估一下:取过去 90 天日 PnL 算 μ/σ — ...
- [hh:mm] 把「Sizing Policy」写进自己的交易制度(Day 24 风控制度的补充章节) — ...
- 卡点 / 学到的:
- 我现有的策略 Half Kelly 算出来是多少?跟我实际仓位比,过大还是过小?
- 跑相关性修正 RP,4 个资产实际权重和 1/vol 简化版差多少?
- EWMA vol 跟 SMA60 vol 在 2020-03、2022-09 两个 vol spike 时滞后多少天?
- Quarter Kelly vs Half Kelly 在我的策略上,drawdown / 收益的实际差异?
总字数:约 6,000 字