← 返回 Quant Digests · 站点首页

别把这份 2026 新 repo 只读成“trend-vs-MR 课程作业”:对 short-cycle desk,更该先测的是「vol-normalized TSMOM × turnover-penalized cap allocator」这条完整 raw alpha

更新时间:2026-04-01 16:23 UTC 研究时间:2026-04-01 16:26 UTC 类型:2026 GitHub 新仓库 source audit(`README.md` + `Code.ipynb` + `Report.pdf` + GitHub API metadata) 主题标签:raw-alpha/trend/momentum/time-series/vol-normalized/tanh/turnover-penalized/cap-constrained/multi-asset/binance/majors/btc/eth/bnb/xrp/ada/doge/15m/5m/3m/1m/repo/public-data/cost 证据类型:2026 GitHub 新仓库 source audit(README + notebook 公式/回测输出 + repo metadata)

源文件:research/quant_digests/2026-04-01_1626_tsmom-turnover-cap-shell-alpha.md

1. 这次看了什么

这次主材料不是论文,而是一份 2026-03-30 创建 的 GitHub 新仓库:mhtkrmz (2026), _crypto-alpha-comparison_。headline 看起来像“趋势 vs 均值回复”的课程项目,但对我们 desk 真正更值得 intake 的,不是它在讲两派孰优孰劣,而是它把一条 可直接复现的多资产 TSMOM 完整策略骨架 写得非常清楚:

翻成人话: 它不是在说“趋势永远比反转好”,而是在说“如果你真要做短中短周期的多资产 raw alpha,至少该把信号、仓位、换手惩罚、风险协方差、成本放进同一个壳子里比较”。

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

这篇 digest 的主角不是 repo 里的 mean reversion 支线,而是它更清楚、也更适合当前 desk 主线的那条 trend-following raw alpha

翻成人话: base alpha 就是“波动率调整后的趋势延续”:涨得又稳又持续的币,应该比刚刚乱冲的币拿到更高的持续性仓位。

所以这轮它明确属于:

3. 为什么这轮值得写,而不是继续补一个只会服务别人的 gate

结合当前学习主线,这轮值得写有三个原因:

  1. 它正好补的是主线缺口。 LEARNING_TRACK.mdFACTOR_BACKLOG.md 里,趋势/动量一直是明确优先级,但当前 backlog 里更偏“方向过滤 / breakout / ATR 概念”,而缺一张真正把 raw alpha + sizing + risk + turnover + cost 串起来的完整趋势策略卡。
  2. 它不是抽象论文,而是公开 repo。 数据、公式、参数网格、验证 / 测试切分、成本估计都能直接抄成最小实验。
  3. 它提供了一个很值钱的对照。 在同样的组合壳子下,repo 里的 cross-sectional mean reversion 基本跑不出来,而 TSMOM 至少在 pre-cost / validation 上明显更强。这对 desk 很重要,因为它能帮助我们少走“均值回复幻觉 + 执行壳子没统一”的弯路。

4. 这次看的主来源

4.1 主来源(repo)

4.2 这轮实际看的关键文件

5. 这条 raw alpha 在代码里到底怎么定义

5.1 数据宇宙非常朴素,但够做 clean replication

repo 从 Binance 公共 1h K 线下载这 6 个币:

样本区间是:

这很重要,因为它不是拿几周数据讲故事,而是拿了一个跨牛熊、跨 regime 的中等长度样本。

5.2 repo 直接把趋势信号公式写出来了

Code.ipynb 里的核心函数是:

几个关键点:

  1. 不是裸收益排序。 它先做了波动率归一化,避免高波动币因为“涨跌更猛”天然压过别的币。
  2. 不是二元多空。 tanh 把仓位信号做成连续值,强趋势拿更大仓位,弱趋势拿更小仓位。
  3. 不是只看 signal,不管执行。 后面它不是简单 equal-weight,而是直接塞进带惩罚项的组合优化器。

5.3 组合壳子本身也是这份 repo 最值钱的部分

run_strategy(...) 每根 bar 解的问题是:

  1. max_w mu'w - 0.5*lambda*w'Sw - 0.5*kappa||w - w_prev||^2
  2. 约束:||w||_1 <= 1
  3. 名义仓位:theta = gross_cap * w

翻成人话:

这对 desk 的价值非常直接: 它已经把“信号强度”和“能不能低换手、低冲击地抱住仓位”放到同一层处理。

5.4 参数网格也很适合直接迁移

repo 的固定设置:

趋势 lookback grid:

mean reversion lookback grid:

turnover penalty grid:

这意味着: 这份 repo 不是“给你一个结论”,而是直接给你一张能搬到 15m/5m/3m/1m 的实验模板。

6. 最值得拿走的硬数据点

6.1 validation 上,趋势分支明显比反转分支更像样

repo 在统一壳子下给出的最佳 validation 组合:

Trend-following

Mean reversion

这组数非常值钱,因为它说明在同一 universe、同一 gross cap、同一 risk shell 下: 反转不但没赢,换手还更高;趋势至少在 validation 上是又强又更省换手。

6.2 test 不是爆炸优秀,但至少没有 validation 那么像幻觉

最佳 locked 参数在 test 上:

Trend-following

Mean reversion

这里要注意两点:

  1. 反转 test 看起来“意外转正”,但因为 validation 全面为负,所以更像 sample luck,而不是稳健 alpha。
  2. 趋势 test sharpe 只有 0.34,说明这不是“闭眼就上的神策略”,而是 值得继续加 friction ladder、改时间尺度、换执行壳子 的 raw alpha 候选。

6.3 它给了一个很实用的滑点标尺

repo 用 Roll / Corwin-Schultz 做了资产级滑点估计,最后选出的统一标尺是:

并且 notebook 里展示的资产级估计里,至少可以看到:

翻成人话: 这份 repo 最有价值的一点,不是回测赚了多少,而是它逼你承认“多资产短周期 alpha 的成本壳必须先写进去”。

6.4 全样本净值一上成本,问题立刻暴露

在 Part 4 的 fixed-100k-cap 模式下:

Trend-following

Mean reversion

这组数字的 desk 读法不是“趋势一定稳赚”,而是:

7. 对当前 desk,最该偷的不是“趋势赢了”,而是这 3 个具体组件

7.1 组件一:vol-normalized momentum,而不是裸 return 排名

这能直接补当前主线里对“多周期动量”的理解:

7.2 组件二:turnover penalty 要从第一天就跟 alpha 写在一起

repo 最有启发的一点不是 Sharpe 2.52,而是: 同样的 alpha,如果你不惩罚换手,最终可能只是把 gross edge 全喂给滑点。

这和当前 FACTOR_BACKLOG.md 里强调的 post-cost 评估是完全一致的,而且比“先出信号、后补成本”更像能进实盘候选池的写法。

7.3 组件三:用同一 allocator 比 raw alpha,而不是每条策略都带不同壳子

很多 repo 看起来像在比较 signal,实际上比较的是:

这份 repo 的好处是: 它先把壳子固定,再比较 trend vs MR。 这让“哪条 raw alpha 更值得继续”这个问题变得更干净。

8. 这份 repo 为什么仍然不能直接照抄进实盘

8.1 时间尺度不是我们现在的默认主战场

repo 的 native 实验是 1h。这对当前以 5m / 15m 为主、也接受 1m / 3m 的 desk 来说,不是最终答案。

但它仍然很有用,因为:

8.2 资本约束写法有点“作业式”而不是 production-ready

它设:

这会让回测读起来更像“固定 gross exposure assignment”,而不是一个真正受保证金 / 爆仓 / 资金曲线约束的 production shell。

所以: 它是完整策略定义,不等于 production-ready portfolio engine。

8.3 mean reversion 支线不该被误读成“又一条可用候选”

从 validation 来看,这条 cross-sectional MR 在这套壳子里基本是输家。

因此更合理的 desk 读法是:

9. 对 15m / 5m / 3m / 1m 的最小实验怎么做

9.1 先做 15m,因为它最像“保留趋势信息但不至于太慢”

第一版最小实验建议:

执行口径:

9.2 再下钻到 5m

如果 15m 还能留边,再把同一骨架搬到 5m

这里最重要的不是追高 Sharpe,而是看: 同样的 vol-normalized TSMOM,在更快 bar 上还能不能在成本后留下稳定边。

9.3 3m / 1m 不建议直接上 full allocator,先做 alpha-existence

更快周期建议先降级:

不然会过早把“执行噪音 + 组合噪音 + 成本噪音”全揉在一起。

10. 下一步怎么测(必须落地)

10.1 第一优先级:把 repo 的 trend 分支单独移植到 desk 默认框架

不是复刻整个 trend-vs-MR 作业,而是只移植:

目标: 先确认“vol-normalized TSMOM + turnover penalty”在 15m 上是否仍有成本后生存空间。

10.2 第二优先级:做一个公平对照

用完全同一壳子,只换 alpha:

  1. vol-normalized TSMOM
  2. 当前 desk 自带的 multi-timeframe momentum baseline
  3. 一个简单 XS lagged-return continuation baseline

只比较:

这样才能知道: 值得搬的,到底是“repo 的 alpha”,还是“repo 的 allocator shell”。

10.3 第三优先级:做 friction cliff 图

最值得先画的不是净值,而是:

因为这类策略最怕的不是“均值收益不够高”,而是: 一旦从 4 bps 滑到 8 bps,就整条曲线掉下悬崖。

11. 一句话结论

这份 2026 新 repo 真正值得 desk intake 的,不是“趋势赢了反转”,而是那条能直接搬到 15m/5m 的完整骨架:vol-normalized TSMOM 信号 + turnover-penalized cap allocator + 明确 friction shell。

12. 它是怎么证明这件事的

它靠的是公开 Binance 多资产样本上的统一壳子回测与成本估计:先把 trend 和 MR 放进同一优化器比较,再把滑点壳接进去,看谁还能活。