返回交易笔记
TR Day 26

仓位管理 — Kelly / Risk Parity / Vol Target

Kelly Criterion 离散/连续公式、Full vs Half Kelly、Risk Parity 1/vol 与相关性修正、Vol Targeting EWMA 实现

2026-06-04
Phase 1: 基础与工具链
KellyHalfKellyRiskParityVolatilityTargetingPositionSizingDiversification

日期: 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 个月后净值
AHalf Kelly6% NAV58%8% NAV1.31×
BAll in 信号最强那笔80% NAV58%60% NAV0.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 公式之所以「漂亮」,是因为它默认了一堆现实里根本不成立的假设。把这些假设写出来,才知道为什么实战要打折:

  1. 概率 $p$ 和赔率 $b$ 已知且稳定:现实里它们是估出来的、且时变
  2. 可以无限分割下注:现实里期权一手 = 100 股,无法精细到 0.137 张
  3. 结果独立同分布:现实里 returns 有 autocorrelation、vol clustering
  4. 没有交易成本:现实里佣金 + 滑点 + bid-ask spread 至少吃 5-20 bps
  5. 可以无限借贷:现实里 Reg-T 上限 2×、$25k 以下不允许 day trade
  6. 没有破产边界:现实里 < margin requirement 直接强平
  7. 效用函数 = 对数:现实里大多数人比 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.2522.4%
债券 (TLT)14%7.1425.6%
黄金 (GLD)16%6.2522.4%
商品 (DBC)18%5.5619.9%
现金3%33.339.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 个:

  1. σ 是后视估计:用过去 60 天 vol 决定今天权重。vol 真正爆掉前,权重还在「平静期」配置
  2. 相关性假设不稳:股债 30 年负相关,在通胀冲击下瞬间变正相关,分散度归零
  3. 依赖低利率环境: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 & Hold10.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,没理由不用。


六、三种方法对比

维度KellyRisk ParityVol 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 框架):

  1. 第一层(策略内):每个策略用 Half Kelly 估单笔仓位上限
  2. 第二层(跨策略):多个策略间用 Risk Parity 分配资本
  3. 第三层(组合层):整体用 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 倍
期权策略 sizingKelly + 流动性 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 算 Kellyover-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 TargetStop 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 给的是定量框架:

  1. 「不要把鸡蛋放在一个篮子」的数学版

    • 一个项目期望收益 $\mu$、波动 $\sigma$,Kelly 告诉你「这一个项目最多投多少资源」
    • 把团队 80% 投在一个 bet 上,Kelly 会显示「实际最优 < 30%」——剩余 50% 是 over-commitment
  2. 「不要赌博式发版」的数学版

    • A/B test 99% 流量到新功能 = Full Kelly
    • A/B test 5-10% 流量 = Half / Quarter Kelly
    • 同样发现 winning variant 的速度只慢 25%(增长率公式),但 catastrophic loss 的概率降一个数量级
  3. 「风险预算」

    • 顶级 PM 不说「我们做哪些功能」,而说「我们这个 Q 的 risk budget 怎么分配」
    • 这就是 Risk Parity 思维——按风险贡献而非数量分配
  4. 「Vol Target = 心跳监控」

    • 产品 KPI 不能只看 mean,要看 vol
    • DAU 月度 vol > 30% 时,团队应该减少改动(vol target 自动减仓)
    • 上线高峰期、节假日、竞品大动作时主动收缩——这是「事件驱动 vol target」
  5. 「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 三问
    1. 决策对不对?(process)
    2. 结果好不好?(outcome)
    3. 是不是 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 字