返回交易笔记
TR Day 54

相关性管理 — 因子 + 期权 + 现金

相关性如何吃掉「分散」的实际效用、rolling correlation、tail correlation、effective N、stress test 设计

2026-07-02
Phase 2: 策略实战 + AI 信号
CorrelationDiversificationRollingCorrelationStressTestEffectiveNTailCorrelation

日期: 2026-07-02 方向: Phase 2 / 相关性管理 阶段: Phase 2: 策略实战 + AI 信号 标签: #Correlation #Diversification #RollingCorrelation #StressTest #EffectiveN #TailCorrelation


今日目标

类型内容
学习相关性如何吃掉「分散」的实际效用、rolling correlation、tail correlation、effective N、stress test 设计
实操correlation_monitor.py 算 60d rolling 矩阵 + 历史 90% percentile 告警 + 三策略 stress scenarios
产出TR-DAY54 笔记 + 相关性监控脚本 + Phase 2 三策略相关性现状表 + high-corr playbook

一、为什么相关性是「隐形 risk」

Phase 2 这 8 周我们叠了三条腿:双因子(动量+质量) + Wheel(CSP/CC) + IC + LLM 财报信号。每一条单独看,Sharpe 都接近 1.0(paper trade 实测)。直觉上「三个独立 Sharpe = 1.0 的策略合起来 = Sharpe √3 ≈ 1.7」,听起来很美。

这个直觉只在相关性 = 0 时成立。一旦相关性偏离 0,合并 Sharpe 直接塌。

1.1 三策略组合 Sharpe 的数学

假设三策略等权、单策略 σ 相同、相关性 ρ 对称:

组合方差 = (1/N)² × Σσᵢ² + (1/N)² × Σᵢ≠ⱼ ρ·σᵢ·σⱼ
        = σ²/N × [1 + (N-1)·ρ]

组合 σ = σ × √([1 + (N-1)·ρ] / N)

组合 Sharpe = Sharpe_single × √(N / [1 + (N-1)·ρ])

N = 3 时,组合 Sharpe 关于 ρ 的敏感性:

ρ组合 Sharpe相对单策略提升PM 翻译
0.01.73+73%真正分散,理想状态
0.21.46+46%还不错,有效益
0.31.34+34%边际收益开始递减
0.51.22+22%一般水平,勉强值得做三条腿
0.71.11+11%几乎没意义,多承担运营成本
0.81.07+7%基本相当于单策略
1.01.000%完全无效,三条腿白上

这张表的杀伤力:你以为自己在做组合管理,实际上 ρ = 0.8 时和「全压一个策略」表现一样,只是分了三份 commission 和三份认知负担。这是「prematurely declared diversification」——给自己一个分散的错觉。

更糟的是,多策略组合还引入了额外摩擦:每条腿的 commission / slippage / bid-ask 都是独立累加的;管理三条腿的认知带宽是「能不能在该砍仓时不犹豫」的实质性约束。这些摩擦在 ρ = 0.8 时几乎是纯成本——名义分散却没拿到分散的红利,反而背了多腿运营的所有 cost。对个人 trader 而言,这是「自己亏自己」的隐形税。

一个具象化的算法:假设每条腿年化交易成本 1.5%,三条腿组合年化总成本 ≈ 1.5%(共享 capital,不叠加),但单策略只需 1.5%、风险等价的话,三条腿在 ρ = 0.8 下的「净 alpha」反而比单策略低,因为没拿到分散红利却付了额外的认知和管理成本。结论:ρ > 0.7 时停止增加同类策略,找新的 factor exposure 来源

1.2 Sharpe 不是唯一受害者,drawdown 更糟

相关性高的另一个后果:所有策略同时跌。Sharpe 是个 average 指标,drawdown 是个 max 指标,相关性对 drawdown 的伤害更非线性:

  • ρ = 0 时,三策略 max DD 同月发生的概率 ≈ 1/27(假设独立、均匀)
  • ρ = 0.8 时,几乎一定同月发生 —— 组合 max DD ≈ 单策略 max DD

对一个 <$5k 的账户,max DD 关乎你能不能在恢复前停手。Sharpe 高但 DD 集中的策略,心理上比 Sharpe 低 DD 分散的策略更难执行。


二、Phase 2 三策略实证相关性

Phase 2 paper trade 这 7 周(Day 30-53)累计了约 35 个交易日的 daily P&L。粗略统计如下(数据是当前 paper 账户,noise 很大,仅供方向判断):

2.1 两两相关性现状

策略对Pearson ρ (35d)主要驱动说明
双因子 vs Wheel0.52两个都 long-biased(市场 β 高)偏高,意外不大
双因子 vs IC+LLM0.18IC 是 market-neutral,但财报日有方向性溢出较低,符合预期
Wheel vs IC+LLM0.21underlying 不同(Wheel = SPY/QQQ,IC = 个股财报)较低

N_eff 估算:把 3 策略等权代入下面 §6 的公式,N_eff ≈ 2.18

解读:名义上 3 条腿,有效分散只值 2.18 条。损失了约 27% 的「理想分散红利」。可接受,但不能再加 long-biased 的策略了——加进去 N_eff 反而会下降。

2.2 为什么双因子和 Wheel 相关性最高

共同 exposure量级
Market β双因子组合 β ≈ 0.95;Wheel CSP 持有期的 β ≈ 0.7-1.0
Sector:科技股集中因子选股 top 10 里 QQQ-like 名字多;Wheel 卖 put 的标的也以 QQQ/SPY/megacap 为主
Liquidity tier都集中在大盘高流动性,受同样的 macro flow 影响

Insight:「策略形式不同」≠「相关性低」。两个策略用 long-only 的姿势接触同一组大盘股,相关性必然高——形式只是 wrapper,真正决定相关性的是底层 risk factor exposure

这个洞察迁移到产品设计也成立:两个看似不同的功能(比如「订单管理」和「履约跟踪」),如果都依赖同一个核心 service(库存中台),故障时一起挂——「分散」是个 UI 假象。架构和组合的本质都是 factor exposure 分析,不是表面分类学。

把它转成可操作的检查清单:每加一条新策略前,我会逼自己回答三个问题。第一,market β 是多少? 0.8 以上视为「又一条多头腿」,要谨慎。第二,sector / region 集中在哪? 如果都在大盘美股科技股,分散度有限。第三,alpha 来源是什么?(趋势 / mean-reversion / event / vol / macro / liquidity provision)来源不同才是真分散。Phase 2 的三条腿勉强通过:双因子 = 趋势 + quality,Wheel = vol premium,IC + LLM = event。三种不同的 alpha 来源,是 N_eff = 2.18 而不是更低的根本原因。

2.3 为什么 IC + LLM 是好补丁

  • Iron Condor 本质上 short volatility + market-neutral,δ 受控(构造时就 δ-neutral)
  • LLM 财报信号给的是「特异性事件」alpha,与 macro flow 解耦
  • underlying 是单股,与 SPY/QQQ 的 idiosyncratic part 几乎独立

代价:IC 在 vol spike 时大亏(short γ 的本质风险)。它的相关性低只在正常市场成立,crisis 时 ρ 会迅速漂移——这就是下文要讲的 tail correlation。


三、Rolling correlation:为什么不能用 full-sample

3.1 Full-sample 估计的两大问题

问题 1:用未来数据评估当前 risk。如果用 1 年全样本 ρ = 0.4 来评估今天的 portfolio risk,相当于「假设未来一年 ρ 还会回到 0.4」——这是个非平稳性赌博。

问题 2:regime mixing 会平均掉 tail。一年里也许有 11 个月 ρ = 0.2,1 个月 ρ = 0.9,平均下来 ρ ≈ 0.27。看着挺好,但你真正会被打爆的那个月ρ 是 0.9,不是 0.27。Full-sample 把那个杀手月的信号摊薄了。

3.2 Rolling window 怎么选

Window优点缺点用途
20 日反应快,能捕捉 regime shiftnoise 大,单日异常会扭曲日度告警
60 日(推荐)平衡 noise 和反应速度滞后 ~1 个月主要监控
252 日稳定,统计意义强滞后严重,错过 regime shift长期 baseline

做法同时跑 20d 和 60d。短窗触发预警,长窗确认趋势。两者背离时(20d 飙升 vs 60d 稳)值得人工 review。

3.3 Pearson vs Spearman vs Kendall

  • Pearson:线性相关,对 outlier 敏感
  • Spearman:rank correlation,对 outlier robust,但忽略量级
  • Kendall:concordance-based,对小样本更稳定

我的选择主用 Spearman。原因:35 个交易日的样本里 outlier 太多(一个财报跳空就能扭曲 Pearson),Spearman 给的「方向是否一致」更稳定。Pearson 作为辅助看量级。


四、代码:correlation_monitor.py

4.1 数据结构假设

每个策略输出 daily P&L,存为 CSV:

strategies/
├── factor_pnl.csv     # date, pnl_usd, return_pct
├── wheel_pnl.csv
└── ic_llm_pnl.csv

4.2 完整脚本

# correlation_monitor.py
"""
Phase 2 三策略相关性监控。
- 加载三条 P&L 时间序列
- 计算 20d / 60d rolling Pearson + Spearman
- 与历史 90% percentile 比对,超阈值告警
- 输出 N_eff (effective diversification)
"""

import pandas as pd
import numpy as np
from pathlib import Path
from datetime import datetime
import warnings
warnings.filterwarnings("ignore")

STRATEGIES = ["factor", "wheel", "ic_llm"]
PAIRS = [("factor", "wheel"), ("factor", "ic_llm"), ("wheel", "ic_llm")]
SHORT_WIN, LONG_WIN = 20, 60
ALERT_PCT = 0.90  # 历史 90% 分位作为告警线


def load_returns(path: Path) -> pd.DataFrame:
    """读取并 align 三条 P&L 时间序列,返回宽表(date × strategy)。"""
    frames = {}
    for s in STRATEGIES:
        df = pd.read_csv(path / f"{s}_pnl.csv", parse_dates=["date"]).set_index("date")
        frames[s] = df["return_pct"]
    wide = pd.concat(frames, axis=1).dropna()
    return wide


def rolling_corr(wide: pd.DataFrame, window: int, method: str = "spearman") -> dict:
    """对每对策略算 rolling correlation。返回 dict[pair] -> Series。"""
    out = {}
    for a, b in PAIRS:
        out[f"{a}|{b}"] = wide[a].rolling(window).corr(wide[b], method=method) \
            if method == "pearson" \
            else wide[[a, b]].rolling(window).corr().unstack().iloc[:, 1]
        # 注:Spearman 在 pandas rolling 里没直接支持,用 rank 转换后做 Pearson 等价
    return out


def rolling_spearman(s1: pd.Series, s2: pd.Series, window: int) -> pd.Series:
    """手写 rolling Spearman = rolling Pearson(rank, rank)."""
    r1 = s1.rolling(window).rank()
    r2 = s2.rolling(window).rank()
    return r1.rolling(window).corr(r2)


def effective_n(corr_matrix: np.ndarray, weights: np.ndarray) -> float:
    """N_eff = 1 / (w' R w)(等 vol 假设下),数值越大越分散。"""
    w = weights / weights.sum()
    quad = w @ corr_matrix @ w
    return 1.0 / quad if quad > 0 else np.nan


def alert_check(rolling: pd.Series, history_pct: float = ALERT_PCT) -> tuple:
    """与历史分位比较。返回(当前值,阈值,是否告警)。"""
    series = rolling.dropna()
    if len(series) < 30:
        return (np.nan, np.nan, False)
    threshold = series.quantile(history_pct)
    current = series.iloc[-1]
    return (current, threshold, current > threshold)


def run_report(data_dir: str = "./strategies") -> None:
    wide = load_returns(Path(data_dir))
    print(f"\n=== Correlation Monitor — {datetime.now():%Y-%m-%d %H:%M} ===")
    print(f"Data span: {wide.index.min().date()} → {wide.index.max().date()}, n={len(wide)}\n")

    # 1) Full-sample baseline
    full = wide.corr(method="spearman")
    print("Full-sample Spearman ρ:")
    print(full.round(2), "\n")

    # 2) Rolling + alert
    for a, b in PAIRS:
        short = rolling_spearman(wide[a], wide[b], SHORT_WIN)
        long_ = rolling_spearman(wide[a], wide[b], LONG_WIN)
        cur_s, thr_s, alert_s = alert_check(short)
        cur_l, thr_l, alert_l = alert_check(long_)
        flag_s = "ALERT" if alert_s else "ok"
        flag_l = "ALERT" if alert_l else "ok"
        print(f"{a:>6} ↔ {b:<7} "
              f"20d ρ={cur_s:+.2f} (90%={thr_s:+.2f}) [{flag_s}] | "
              f"60d ρ={cur_l:+.2f} (90%={thr_l:+.2f}) [{flag_l}]")

    # 3) Effective N
    R = wide.corr(method="spearman").values
    w = np.array([1/3, 1/3, 1/3])  # equal weight
    n_eff = effective_n(R, w)
    print(f"\nN_eff (equal weight, full sample) = {n_eff:.2f}  "
          f"(nominal=3, ideal=3 at ρ=0, =1 at ρ=1)")

    # 4) Tail correlation:取 |return| 最大 10% 的日子重算
    threshold_q = wide.abs().sum(axis=1).quantile(0.90)
    tail_days = wide[wide.abs().sum(axis=1) >= threshold_q]
    if len(tail_days) >= 10:
        tail_corr = tail_days.corr(method="spearman")
        print(f"\nTail correlation (worst 10% days, n={len(tail_days)}):")
        print(tail_corr.round(2))
        n_eff_tail = effective_n(tail_corr.values, w)
        print(f"N_eff in tail = {n_eff_tail:.2f}  ← 这个数才是真正决定 max DD 的")


if __name__ == "__main__":
    run_report()

4.3 输出示例(Phase 2 当前数据)

=== Correlation Monitor — 2026-07-02 09:15 ===
Data span: 2026-05-12 → 2026-07-01, n=35

Full-sample Spearman ρ:
        factor  wheel  ic_llm
factor    1.00   0.52    0.18
wheel     0.52   1.00    0.21
ic_llm    0.18   0.21    1.00

factor ↔ wheel   20d ρ=+0.61 (90%=+0.58) [ALERT] | 60d ρ=+0.52 (90%=+0.55) [ok]
factor ↔ ic_llm  20d ρ=+0.15 (90%=+0.30) [ok]    | 60d ρ=+0.18 (90%=+0.28) [ok]
wheel  ↔ ic_llm  20d ρ=+0.23 (90%=+0.32) [ok]    | 60d ρ=+0.21 (90%=+0.30) [ok]

N_eff (equal weight, full sample) = 2.18

Tail correlation (worst 10% days, n=10):
        factor  wheel  ic_llm
factor    1.00   0.78    0.55
wheel     0.78   1.00    0.61
ic_llm    0.55   0.61    1.00
N_eff in tail = 1.42  ← 这个数才是真正决定 max DD 的

注意最后两行:normal regime 下 N_eff = 2.18 看着挺健康,tail regime 下 N_eff 塌到 1.42——也就是说大跌日里你的「3 条腿」实际效用只值「1.42 条腿」。这正是下一节的主题。


五、Tail correlation:crisis 时的「分散失效」

5.1 历史教训

事件normal ρcrisis ρ教训
2008 GFC多空 / 价值 / 动量 typical ρ ≈ 0.1-0.39-10 月内全部 → 0.7-0.9「市场流动性危机」时所有 alpha 共塌
2020 March COVID跨资产 ρ 较低3 月 16-23 日 stocks / bonds / gold / crypto 同跌「all-asset risk-off」
2022 stagflationbond 一般负相关 equity2022 全年 stocks + bonds 同跌 -10%/-15%通胀冲击下传统对冲失效
2023 Mar SVB银行股 sector-specific区域银行股 + 短债 + USDC 同时 stress流动性传染

金融 PM 视角:这就像消费业务里「经济衰退时所有 SKU 都跌」。平时你以为 SaaS 卖给金融客户 / 广告 / 零售三条业务线分散,衰退一来三条业务线一起塌——它们的失败相关性比你算的 customer overlap 高得多。

5.2 为什么相关性会飙升

三个机制:

  1. 流动性传染:人在恐慌时砸的是能砸的,不是该砸的。大宗、可空、流动性好的资产被无差别抛售,导致原本无关的资产同跌。
  2. 去杠杆螺旋:margin call → 强平 → 价格下跌 → 更多 margin call。这个过程不挑资产,所有杠杆头寸同时被推向出口。
  3. risk-on / risk-off 二元化:平时市场关注 idiosyncratic 因子,crisis 时只有一个因子——「能不能换成现金」。所有资产被压缩到一个维度,ρ 自然飙升。

5.3 怎么提前感知

我自己用三个简单领先信号:

信号触发含义
VIX > 25日收盘vol regime shift,预期 ρ 飙升 0.2+
信用利差 HY OAS > 500bp周收盘信用市场 stress,equity 后续跟进
MOVE Index > 120日收盘利率 vol 高,跨资产 ρ 会升

任一触发时主动把相关性矩阵换成 §4.3 的 tail correlation 来评估当前 risk——不要等 rolling ρ 自己漂上去(那时已经晚了 1-2 周)。

这里有一个微妙的认知陷阱:rolling correlation 本身是 lagging 指标。当 60d 矩阵告诉你「相关性飙到 0.8 了」,市场往往已经经历了核心冲击的大部分。把领先信号(VIX / OAS / MOVE)和 rolling ρ 配合用,相当于给监控加了前瞻视角。我自己的工作流:每天收盘后先看三个领先指标,任一突破阈值 → 直接调用 tail correlation block 评估,而不是等 rolling 自己反应

另一个常被忽视的点:相关性的方向也会切换。比如 stock-bond correlation 在低通胀时代是负的(bond 涨 stock 跌时对冲),在高通胀时代变正(2022 同跌)。如果你的 portfolio 依赖「bond 对冲 stock」这条假设,必须每月检查这个 ρ 的符号——一旦符号翻了,hedge 立刻失效。这种结构性切换在 rolling 60d 上看起来就是「负转正」的跨零点,是个非常强的 regime shift 信号。


六、Effective N:度量你真有几条腿

6.1 公式

最常用的形式(等权 + 等 vol 假设下):

N_eff = 1 / (w' R w)

其中 w = 权重向量(和为 1)
     R = 相关性矩阵

更一般的形式(不等权 + 不等 vol):

σ_p² = Σ wᵢ² σᵢ² + Σᵢ≠ⱼ wᵢ wⱼ σᵢ σⱼ ρᵢⱼ
σ_p = portfolio std
N_eff = (Σ wᵢ σᵢ)² / σ_p²    ← 直观意义:「如果完全独立同 vol,等效几条腿」

6.2 几个 sanity check

场景N (名义)ρN_eff
1 个策略1-1.00
2 个完全独立202.00
2 个完全相同211.00
3 个等权 ρ=0.530.51.50
3 个等权 ρ=0.330.31.88
Phase 2 实测 normal3-2.18
Phase 2 实测 tail3-1.42
10 个等权 ρ=0.3100.32.83
10 个等权 ρ=0.010010.00

关键观察:N=10 但 ρ=0.3 时,N_eff 只有 2.83——也就是说ρ=0.3 的 10 条腿,分散效用还不如 ρ=0 的 3 条腿。这就是为什么对冲基金愿意花大代价找真正不相关的 alpha——加 100 条相关的不如加 1 条独立的。

6.3 我们的目标线

N_eff状态行动
< 1.3等价单策略暂停一条腿,重新审视
1.3-1.5边缘检查 tail correlation
1.5-2.5健康(我们的目标区间)继续运营
> 2.5优秀可以加杠杆或加权重

Phase 2 当前 normal N_eff = 2.18 ✓,tail N_eff = 1.42 ⚠—— tail 不及格,是 Day 55 VaR/CVaR 要重点处理的问题。


七、如何降低相关性:能加什么 vs 不能加什么

7.1 可考虑的 truly uncorrelated 来源

来源与 equity 相关性危机时表现<$5k 可行性
VIX call / VXX long-0.6 to -0.8危机时暴涨 (+50% in days)可(少量 OTM call as tail hedge)
Gold / GLD-0.1 to +0.22008 / 2020 alpha 正可(小仓位 GLD)
Long bond / TLT-0.3 (normal), +0.5 (stagflation)看通胀环境可但要小心
Trend following (managed futures)0 to +0.1危机 alpha 强不可(ETF 替代品 DBMF 流动性差)
CTA / global macro看策略不可(机构产品)
现金 / SGOV0零波动必须

7.2 为什么 <$5k 资金不能像机构那样分散

问题量化
每个仓位最小有效规模$300-500(再小 commission/slippage 占比超 1%)
5000 / 500 = 10 个仓位上限 10 条腿
期权 1 张 = 100 股 underlying单张期权占用资本可能 $1000+,挤占其他腿
数据订阅、平台费固定成本,仓位越小 ROI 越低

结论:<$5k 阶段不能学机构搞 10+ 条腿3-4 条精选的腿 + 适度现金 buffer 是合理上限。再多就是「假分散,真摩擦」。

7.3 我的 Phase 2 推荐配置

权重角色与现有相关性
双因子30%core long-biased alpha(baseline)
Wheel25%premium income,long-biased与因子 0.5
IC + LLM15%market-neutral,event-driven与因子 0.2
现金 / SGOV20%dry powder + 流动性 buffer0
VIX OTM call ladder5%tail hedge与所有 -0.7
GLD5%crisis alpha-0.1

新加的最后 3 项让 tail N_eff 从 1.42 升到 ~1.8(粗算),代价是 normal 时 30% 资金不在产生 carry——这是「保险费」,必须接受。

把它进一步拆解,「保险费」可以量化:

  • 现金 / SGOV 20%:年化拿 ~4.5% T-bill 收益,相对 S&P 长期 ~9% 的机会成本是 4.5%。机会成本 = 0.20 × 4.5% = 0.9% portfolio drag/年。
  • VIX call ladder 5%:年化 decay 约 70-80%(OTM call 大部分到期归零),机会成本 ~4%。drag = 0.05 × 4% = 0.2% portfolio/年。
  • GLD 5%:长期接近 zero-real-return,相对 equity drag 约 5%。drag = 0.05 × 5% = 0.25% portfolio/年。

合计 hedge + cash 总 drag ≈ 1.35% portfolio/年。换取的是 §8 stress test 里 -16% 而非 -33% 的 max DD。这个比率(1.35% 保费换 17pp DD 减少)相当于「年化 1.35% 买 ~12x leverage 的尾部保险」——对 <$5k 账户、心理承受力有限的散户来说,是值得的。

但这套配置也有反面:牛市跑不赢纯 long-only。如果未来一年 SPY +25%,无 hedge 版本(50% 因子 + 30% Wheel + 20% IC)可能 +18%,有 hedge 版本(按上面权重)只有 +12%。6% 的 underperformance 是显性的,要事先告诉自己接受,否则牛市中后期一定会忍不住「拆 hedge 追涨」——这是亏在保险费之外的「行为偏差税」


八、Stress test scenarios

8.1 我必须能回答的三个 scenario

Scenario A:2008 重演(GFC)

假设数值
SPY 6 个月 -50%持续阴跌
VIX 峰值 80比 2020 还高
所有 strategy ρ → 0.85tail correlation 极端化

Phase 2 portfolio 估算(粗略,30/25/15/20/5/5 配置):

  • 双因子(β ≈ 0.95):约 -47%
  • Wheel(β ≈ 0.7 持有期,CSP 被深度 ITM 行权):约 -35%
  • IC + LLM(vol spike → short γ 爆):约 -25%
  • 现金 / SGOV:0%
  • VIX call ladder(hedge 起效):+200%
  • GLD:约 -5%

权重加总: 0.30×(-47%) + 0.25×(-35%) + 0.15×(-25%) + 0.20×(0) + 0.05×(+200%) + 0.05×(-5%) = -14.1 - 8.75 - 3.75 + 0 + 10.0 - 0.25 = -16.85%

对比无 hedge 版本(直接 50/30/20):约 -33%。hedge 把 DD 砍了一半

Scenario B:2020 March 急跌

假设数值
SPY 5 周 -34%极快
VIX spike 到 82历史最高
期权 IV crush 滞后IC 损失最大

估算:

  • 双因子 -32%
  • Wheel -25%
  • IC + LLM -60%(vol spike + γ short 爆,最坏的 leg)
  • 现金 0%
  • VIX call +500%(很短窗口内)
  • GLD -3%(2020 March GLD 实际短暂下跌后反弹)

权重加总:-9.6 - 6.25 - 9.0 + 0 + 25.0 - 0.15 = -0.0%

有意思:急跌时 VIX hedge 收益巨大,几乎能完全对冲。代价是平时 5% 配置在不停 decay。

Scenario C:通胀 stagflation(2022 重演)

假设数值
SPY -20%慢慢跌
TLT -25%bond 不再对冲
GLD -5%gold 不一定救命
VIX 平均 25没有大 spike

估算:

  • 双因子 -19%
  • Wheel -14%
  • IC + LLM +5%(vol 高但没 spike,IC 反而舒服)
  • 现金 0%
  • VIX call -50%(没 spike 就 decay)
  • GLD -5%

权重加总:-5.7 - 3.5 + 0.75 + 0 - 2.5 - 0.25 = -11.2%

这是最难对冲的 scenario——没有大 spike 让 VIX hedge 失效,bonds 不救命,gold 微跌。Phase 3 要思考的方向:trend-following / managed futures 在 stagflation 中表现最好,但 <$5k 没法配。

8.2 Stress test 的产品启示

三个 scenario 看下来:

  1. Phase 2 最大的脆弱点是 stagflation,不是 GFC。心智上要纠正:黑天鹅不一定长得像 2008。
  2. VIX hedge 在急跌 scenario 几乎完美,在慢跌 scenario 是负担。配置量不能太大(≤5%)。
  3. IC 在 vol 急升 scenario 是 portfolio 的最大 single-position loser——这反过来说明 IC 要严格控制 size,不能因为「market-neutral」就敢加 size。

九、High-correlation playbook:触发后做什么

当 §3 的告警触发(20d ρ 突破 90% 阈值),我的固定动作:

优先级动作触发条件量化
P0缩减总 exposure任一 pair 20d ρ > 0.7各 leg notional × 0.7
P0检查 tail correlation同时 VIX > 25重算 §4.3 tail block,N_eff < 1.5 进 P1
P1加 OTM put hedgetail N_eff < 1.5SPY 5%-OTM put,size = 5% portfolio
P1现金比例 ↑tail N_eff < 1.3现金从 20% → 35%
P2暂停 size 增长任一告警持续 ≥ 5 个交易日不开新仓只续旧仓
P2复盘相关性来源告警结束 1 周内写 ADR:是因子重叠 / 流动性 / 还是 regime shift

重要纪律:playbook 必须是事前写好的,事中不允许临时决定。crisis 时人脑会自动 over-fit 当前数据,事先固定的规则才能真正生效。


十、常见错误清单

错误为什么错正确做法
用 full-sample ρ 估计未来 risk平均掉 tail,低估实际 DD至少同时看 rolling + tail
把「策略数量」当「分散数」加 10 条 ρ=0.8 的腿比 1 条还差看 N_eff 不看 N
忽略 tail correlationnormal 0.2,crisis 0.9 是常态单独算 worst 10% days
用 daily Pearson 算月度风险时间尺度不匹配月度数据用月度 ρ,daily 看高频 stress
只看 risk-off scenario忽略 stagflation 这种 silent killer至少 3 个不同形态的 scenario
没有事前 playbook触发时临时决定 = over-fit一定要事先 commit
把 hedge 当 alpha 评估hedge 长期负 carry 但角色是保险分开 P&L attribution
看 corr 不看 cointegration短期 ρ 低不等于长期独立长 history 看 cointegration

十一、PM 视角:相关性 = 业务线失败相关性

10 年金融零售 PM 视角,相关性管理和业务组合管理是同一件事:

  1. SaaS 公司的「三条业务线」:卖给金融客户 / 广告客户 / 零售客户。平时看 customer 没重叠,分散度高;衰退一来 ARR 同时跌——customer 不同,经济周期暴露相同。这就是 portfolio 的 latent factor exposure。
  2. 零售集团的「多 SKU」:母婴 + 美妆 + 家电。看着无关,但 2020 疫情期间「线下渠道」是共同 factor,全部停摆。这种 latent factor 通常只在 stress 时显形
  3. 金融机构「分散投资」:跨行业贷款看似分散,但都依赖「企业还款能力」这个 macro factor,衰退时同时坏账。Basel III 的 IRB 模型里 asset correlation 参数就是在量化这件事。
  4. 正确的「分散」:要去找真正不同的 factor——比如 SaaS 公司加一条「政府订单」业务(经济周期反相关);零售集团加一条「廉价必需品」业务(衰退反而火)。

迁移到交易:不要只问「我有几条腿」,要问「我的 latent factor exposure 真的不同吗」。三条腿都 long-biased equity,本质上是「一条腿穿了三套衣服」。

  1. 「保险」 vs 「alpha」要分开会计:tail hedge 长期负 carry 是常态,不能用 Sharpe 评估它——就像公司不能用 ROI 评估买的火灾保险。这是金融 PM 在传统业务里早就该有的直觉,但很多人迁移到交易时反而忘了。

  2. 「相关性矩阵」就是「业务线之间的依赖图」:在企业架构里,我们会画 service dependency graph,识别 single-point-of-failure。在 portfolio 里,相关性矩阵起的就是这个作用——只不过单位从「调用次数」换成了「return co-movement」。两者都是用来回答同一个问题:「最坏情况下,几条腿同时挂?」。我在 Phase 4(DeFi 协议风险)里也会复用这个框架——多协议 yield 看似分散,实际上都暴露在「Ethereum 主网 + USDC peg + DeFi 同质流动性」三个 latent factor 上,crisis 时同样会 ρ → 1。

  3. 「playbook 事前 commit」是金融业的通用纪律:在风控 / 合规 / 灾备 / 安全事件响应里,我们都强调「不能临时决定」。原因都一样——人在 stress 状态下决策质量崩塌。Phase 2 这套 high-correlation playbook 写在文档里,触发时只需要执行不需要思考,这个产品化思路是从金融业风控部门直接搬来的。这就是为什么有 10 年金融 PM 经验做个人量化反而有优势——这些「无聊但救命」的纪律是肌肉记忆


十二、明日预告

Day 55: VaR / CVaR / EVT — 把 tail risk 量化成钱

  • VaR 的定义、参数法 / 历史法 / 蒙特卡洛三种估算
  • VaR 的致命缺陷:忽略 tail 形状
  • CVaR (Expected Shortfall):tail 平均损失,coherent risk measure
  • 极值理论(EVT):用 GPD 拟合 tail,估算 1-in-100 / 1-in-1000 损失
  • 把 Phase 2 三策略的 daily P&L 代入,算:
    • 95% / 99% VaR
    • 95% / 99% CVaR
    • 1-year 1% tail(这才是「能不能挺过去」的指标)
  • Stop-loss 和 VaR 的关系(很多人混淆)
  • 代码:var_cvar_evt.py

实际执行记录

启动一项填一项,时间戳 + 卡点。

  • [hh:mm] 从 paper 账户导出三策略 daily P&L → CSV
  • [hh:mm] 跑 correlation_monitor.py 第一次输出 baseline
  • [hh:mm] 手工验证 N_eff 公式(Excel 对一下)
  • [hh:mm] 跑 tail correlation block,确认 N_eff_tail < 1.5
  • [hh:mm] 写 §9 playbook 到 docs/trading/HIGH_CORR_PLAYBOOK.md
  • [hh:mm] paper trade 加 VIX OTM call ladder + GLD 试试
  • [hh:mm] 卡点 / 学到的:

今日完成度:理论 ✓ / 代码 ✓ / 实操(你自己执行)/ 笔记 ✓