← 返回 Quant Digests · 站点首页

别把 PCA 只当老教材因子分解:对 crypto short-cycle desk,更该先测的是「eigenportfolio residual s-score fade」这条 cross-sectional raw alpha

更新时间:2026-04-02 11:24 UTC 类型:2026 GitHub 新 repo source audit(`README.txt` + `src/pca_engine.py` + `src/residual_model.py` + `src/ou_estimator.py` + `src/s_score.py` + `src/strategy.py` + `src/backtester.py` + `main.py`)+ 2010 *Quantitative Finance* 经典论文元数据 + Binance USDⓈ-M `15m` 本地最小 sanity check 主题标签:raw-alpha/cross-sectional/relative-value/stat-arb/mean-reversion/pca/eigenportfolio/residual/ou/s-score/market-neutral/binance-perpetual/top-basket/15m/5m/3m/1m/repo/paper/public-data/cost 证据类型:repo-first(完整策略骨架)+ classic-paper grounding + public-data quick check

源文件:research/quant_digests/2026-04-02_1124_pca-eigenportfolio-residual-statarb-alpha.md

1. 先回答一句:这篇东西的 base alpha 是什么?

base alpha 很清楚:cross-sectional residual mean reversion。

不是“PCA 可以解释市场结构”这种研究口号;真正能交易的是:

> 先用前两条主成分把一篮子币的共同波动剥掉,再去抓某个币相对这两个公共因子的异常偏离;当偏离过大,就赌它往篮子均值方向回。

所以它是 raw alpha,而不是 filter / regime / overlay。

---

2. 为什么这轮值得写它

最近 digest 池里已经有很多:

“全市场 residualized 之后再做 cross-sectional mean reversion” 这条线,反而没有被系统地写进素材池。

这轮值得 intake 的原因有四个:

  1. 它是完整 raw alpha 壳子,不是解释性材料。
  1. 它扩的是 raw alpha 素材池,不是继续给 breakout 找 confirmation。
  1. 它和现有 pairs 方向互补。
  1. 它对 5m / 15m 的 desk transfer 很自然。

如果问:“它为什么比继续补一篇 filter 更值?” 答案很简单: 因为它本身就是一条可以独立下注的 alpha,而不是拿来给别的策略当门卫。

---

3. 这次看的主来源

3.1 主来源:2026 新 repo(主)

3.2 理论地基:经典论文(辅)

3.3 最小实验数据源(公开可得)

---

4. repo 里最值钱的,不是“PCA”两个字,而是完整的 residual mean-reversion pipeline

这份 repo 的价值,不在于它说了一个大家都知道的词:PCA。 真正值钱的是它把一条完整的 alpha 链条写实了:

  1. rolling PCA 因子构建
  2. 单币对前两因子的回归残差
  3. 残差积分过程的 OU 参数估计
  4. s-score 打分
  5. 阈值开平仓
  6. 组合回测

翻成人话: 不是先拍脑袋找一对 coin 的价差,而是先让全市场自己长出两个共同因子,再看哪几个币相对这个共振框架偏得最离谱。

这比“手工 pairs shortlist + z-score fade”更像一条可批量化、可扩 universe 的 stat-arb 主线。

---

5. 代码级拆解:这条 raw alpha 到底怎么成型

5.1 PCA 层:先把共振因子提出来

src/pca_engine.py 里最关键的参数是:

repo 默认数据是:

这意味着原 repo 的原始时间尺度是:

对 desk 的翻译就是: 先做“全市场共同运动”的压缩,再做单币相对偏离,而不是直接拿原始价格硬做 mean reversion。

5.2 Residual 层:不是看绝对收益,而是看“剥离因子后的 idiosyncratic move”

src/residual_model.py 对每个 token 做:

r_i = beta0 + beta1 * F1 + beta2 * F2 + eps_i

也就是:

实现细节:

这一步是整条 alpha 的灵魂: 它交易的不是“币涨多了会跌”,而是“币相对市场共振涨太多/跌太多,可能会回”。

5.3 OU / s-score 层:把 residual 变成“可交易偏离分数”

src/ou_estimator.py 先把 residual 累积成 X_t = cumsum(eps),再拟合:

X_{t+1} = a + b * X_t + error

0 < b < 1,再换成 OU 参数:

然后 src/s_score.py 用:

s = (X_t - m) / sigma_eq

也就是说,s-score 不是普通 z-score,而是“相对 OU 平衡点的标准化偏离”。

这对 short-cycle desk 的意义是:

5.4 Trading rule:repo 已经给出开平仓阈值

src/strategy.py 默认参数:

翻成人话:

这已经是一条 完整 raw alpha 策略骨架,不是只给你一个因子图表。

5.5 回测器也暴露了最核心的现实问题:repo 默认没算成本

README.txt 明写:

这件事非常重要。 因为这类 residual mean reversion 策略最容易出现的情况就是:

> gross 有 edge,net 被 turnover 吃掉。

所以这条线能不能进实盘,不取决于“PCA 很高级”,而取决于:

---

6. 这条 alpha 为什么是 raw alpha,而不是 filter

因为它的入场逻辑本身已经闭环了:

  1. 提取公共因子;
  2. 找单币 residual 偏离;
  3. 用 OU / s-score 判断偏离是否够极端;
  4. 直接开仓赌回归。

它不是:

它自己就是一条完整下注逻辑。

所以分类上应该放在: raw alpha / cross-sectional / relative-value / stat-arb / mean reversion

而不是 filter / overlay。

---

7. 对当前 desk,更值得拿走的不是 hourly 原样复刻,而是这三个 desk 化改写

repo 用的是 hourly;我们真正该拿走的是下面三个 desk 化方向:

7.1 15m:第一优先的移植层

这条线最自然的第一站其实是 15m

7.2 5m:如果想更快,要先做 sparse + cooldown

5m 可以做,但别直接把 hourly repo 粗暴降采样:

7.3 1m / 3m:更像 fast admission layer,而不是整篮子主壳

1m / 3m 上直接全篮子滚动翻仓,很容易死于:

所以更合理的是:

---

8. 我做的 Binance 15m 最小 sanity check:raw alpha 有影子,但 turnover 明显是第一杀手

为了避免这轮变成纯 repo 摘抄,我补了一版 repo-inspired 的公开数据 existence check

8.1 实验口径(简化版)

  1. rolling 240 bars PCA(取前 2 因子)
  2. 单币对因子回归取 residual
  3. residual 累积后拟合 OU
  4. 用 repo 默认 ±1.25 s-score 开仓思路
  5. 等权组合持有下一根 bar

> 注意:这不是严格复现 repo,也不是 production backtest;只是为了回答一句:这条壳子在公开 15m 数据上有没有“先活一下”的迹象。

8.2 最关键的结果

我认为最有信息量的 5 个数字是:

  1. 样本可交易观测数:1258
  2. active ratio:82.7%
  3. 成本前 cumulative return:+4.77%
  4. 成本前年化 Sharpe:4.03
  5. 若按每个 active bar 粗加 5 bps 成本,累计直接掉到 -37.7%

另外,把“新开仓事件”单独拿出来看:

8.3 这组数字说明什么

说明两件事同时成立:

#### A. raw alpha 不是假的 如果完全没东西,gross 不会先站起来。 所以“公共因子剥离后做 residual fade”这条路,有继续研究价值

#### B. 但当前壳子过于密,执行会先把你杀掉 active ratio 82.7% 基本已经说明:

所以它不是“明天可上线”,但它是: 值得继续拆成更适合 desk 的 residual stat-arb 素材。

---

9. 对 short-cycle desk,真正该落地成哪版策略

我建议别照抄 repo 的“全 universe 全时点同强度翻仓”,而是改成下面这版。

9.1 Universe

先用最液体的 8~20 个永续:

9.2 Sampling

9.3 Factor / residual

9.4 Entry

不要全篮子同时上,先做:

9.5 Exit

比 repo 更适合 desk 的版本:

9.6 Sizing

9.7 Cost

至少做三层:

因为这条线最怕的不是预测不准,而是 预测太频繁

---

10. 它和现有 pairs / XS / stat-arb 素材池的关系

这条线的价值,在于它能补足一个很实用的中间层:

所以它既不是老式 pairs 的重复,也不是普通 loser-winner reversal 的重复。 它更像:

> 用“全市场共同因子剥离”来提高 mean reversion 命中的纯度。

这很适合进入我们当前的 cross-sectional / relative-value / stat-arb 素材池。

---

11. 失败模式与要避开的坑

11.1 把 gross edge 当可交易 edge

这条线最容易犯的错就是:

11.2 把 hourly 参数原样砸进 5m

1h 下放到 5m / 15m,不是简单改 interval。 窗长、阈值、cooldown、holding 都要重估。

11.3 不做 neutralization

如果不控制市场 beta,最后可能只是:

11.4 让 universe 太杂

低流动、小币、跳价大、盘口差的标的会把 residual 估计搞脏。 第一轮一定要先做高流动篮子。

---

12. 一句话结论

如果只带走一句话,我会带走这句:

别把 PCA 只当“老教材因子分解”;对 crypto short-cycle desk,更值得快检的是「先剥掉全市场共振,再做单币 residual s-score fade」这条 cross-sectional raw alpha。

它的优点是:

它的现实约束也同样清楚:

所以它该进研究池,但应该以 sparse / cost-aware / neutralized 的 desk 版本继续推进,而不是把 repo 原样当答案。

---

13. 下一步怎么测(直接执行版)

  1. 先做 15m 正式最小实验:top20 USDT perps,比较 240 bars vs 960 bars 两种窗长继承方式。
  2. 把 entry 改成 sparse ranking:每根 bar 只交易 top-2 / top-4 |s|,并扫 |s| 阈值 1.5 / 1.75 / 2.0
  3. 固定回答成本问题:maker / hybrid / taker 三档 cost ladder,别只看 gross。
  4. 做 neutralization ablation
  1. 检查持有期真半衰期:比较 next-1 / next-2 / next-4 bars,确认它是不是只活一根 bar。
  2. 如果 15m 有戏,再下放到 5m;若 5m turnover 爆炸,就把 1m / 3m 限定成 admission / refresh 层,而不是主壳。

---

14. 文件信息