相关性管理 — 因子 + 期权 + 现金
相关性如何吃掉「分散」的实际效用、rolling correlation、tail correlation、effective N、stress test 设计
日期: 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.0 | 1.73 | +73% | 真正分散,理想状态 |
| 0.2 | 1.46 | +46% | 还不错,有效益 |
| 0.3 | 1.34 | +34% | 边际收益开始递减 |
| 0.5 | 1.22 | +22% | 一般水平,勉强值得做三条腿 |
| 0.7 | 1.11 | +11% | 几乎没意义,多承担运营成本 |
| 0.8 | 1.07 | +7% | 基本相当于单策略 |
| 1.0 | 1.00 | 0% | 完全无效,三条腿白上 |
这张表的杀伤力:你以为自己在做组合管理,实际上 ρ = 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 Wheel | 0.52 | 两个都 long-biased(市场 β 高) | 偏高,意外不大 |
| 双因子 vs IC+LLM | 0.18 | IC 是 market-neutral,但财报日有方向性溢出 | 较低,符合预期 |
| Wheel vs IC+LLM | 0.21 | underlying 不同(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 shift | noise 大,单日异常会扭曲 | 日度告警 |
| 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.3 | 9-10 月内全部 → 0.7-0.9 | 「市场流动性危机」时所有 alpha 共塌 |
| 2020 March COVID | 跨资产 ρ 较低 | 3 月 16-23 日 stocks / bonds / gold / crypto 同跌 | 「all-asset risk-off」 |
| 2022 stagflation | bond 一般负相关 equity | 2022 全年 stocks + bonds 同跌 -10%/-15% | 通胀冲击下传统对冲失效 |
| 2023 Mar SVB | 银行股 sector-specific | 区域银行股 + 短债 + USDC 同时 stress | 流动性传染 |
金融 PM 视角:这就像消费业务里「经济衰退时所有 SKU 都跌」。平时你以为 SaaS 卖给金融客户 / 广告 / 零售三条业务线分散,衰退一来三条业务线一起塌——它们的失败相关性比你算的 customer overlap 高得多。
5.2 为什么相关性会飙升
三个机制:
- 流动性传染:人在恐慌时砸的是能砸的,不是该砸的。大宗、可空、流动性好的资产被无差别抛售,导致原本无关的资产同跌。
- 去杠杆螺旋:margin call → 强平 → 价格下跌 → 更多 margin call。这个过程不挑资产,所有杠杆头寸同时被推向出口。
- 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 个完全独立 | 2 | 0 | 2.00 |
| 2 个完全相同 | 2 | 1 | 1.00 |
| 3 个等权 ρ=0.5 | 3 | 0.5 | 1.50 |
| 3 个等权 ρ=0.3 | 3 | 0.3 | 1.88 |
| Phase 2 实测 normal | 3 | - | 2.18 |
| Phase 2 实测 tail | 3 | - | 1.42 |
| 10 个等权 ρ=0.3 | 10 | 0.3 | 2.83 |
| 10 个等权 ρ=0.0 | 10 | 0 | 10.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.2 | 2008 / 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 | 低 | 看策略 | 不可(机构产品) |
| 现金 / SGOV | 0 | 零波动 | 必须 |
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) |
| Wheel | 25% | premium income,long-biased | 与因子 0.5 |
| IC + LLM | 15% | market-neutral,event-driven | 与因子 0.2 |
| 现金 / SGOV | 20% | dry powder + 流动性 buffer | 0 |
| VIX OTM call ladder | 5% | tail hedge | 与所有 -0.7 |
| GLD | 5% | 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.85 | tail 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 看下来:
- Phase 2 最大的脆弱点是 stagflation,不是 GFC。心智上要纠正:黑天鹅不一定长得像 2008。
- VIX hedge 在急跌 scenario 几乎完美,在慢跌 scenario 是负担。配置量不能太大(≤5%)。
- 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 hedge | tail N_eff < 1.5 | SPY 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 correlation | normal 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 视角,相关性管理和业务组合管理是同一件事:
- SaaS 公司的「三条业务线」:卖给金融客户 / 广告客户 / 零售客户。平时看 customer 没重叠,分散度高;衰退一来 ARR 同时跌——customer 不同,经济周期暴露相同。这就是 portfolio 的 latent factor exposure。
- 零售集团的「多 SKU」:母婴 + 美妆 + 家电。看着无关,但 2020 疫情期间「线下渠道」是共同 factor,全部停摆。这种 latent factor 通常只在 stress 时显形。
- 金融机构「分散投资」:跨行业贷款看似分散,但都依赖「企业还款能力」这个 macro factor,衰退时同时坏账。Basel III 的 IRB 模型里 asset correlation 参数就是在量化这件事。
- 正确的「分散」:要去找真正不同的 factor——比如 SaaS 公司加一条「政府订单」业务(经济周期反相关);零售集团加一条「廉价必需品」业务(衰退反而火)。
迁移到交易:不要只问「我有几条腿」,要问「我的 latent factor exposure 真的不同吗」。三条腿都 long-biased equity,本质上是「一条腿穿了三套衣服」。
-
「保险」 vs 「alpha」要分开会计:tail hedge 长期负 carry 是常态,不能用 Sharpe 评估它——就像公司不能用 ROI 评估买的火灾保险。这是金融 PM 在传统业务里早就该有的直觉,但很多人迁移到交易时反而忘了。
-
「相关性矩阵」就是「业务线之间的依赖图」:在企业架构里,我们会画 service dependency graph,识别 single-point-of-failure。在 portfolio 里,相关性矩阵起的就是这个作用——只不过单位从「调用次数」换成了「return co-movement」。两者都是用来回答同一个问题:「最坏情况下,几条腿同时挂?」。我在 Phase 4(DeFi 协议风险)里也会复用这个框架——多协议 yield 看似分散,实际上都暴露在「Ethereum 主网 + USDC peg + DeFi 同质流动性」三个 latent factor 上,crisis 时同样会 ρ → 1。
-
「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] 卡点 / 学到的:
今日完成度:理论 ✓ / 代码 ✓ / 实操(你自己执行)/ 笔记 ✓