源文件:research/quant_digests/2026-04-01_1626_tsmom-turnover-cap-shell-alpha.md
log(P_t / P_{t-L}) / (σ_t * √L) 经过 tanh 压缩后,映射成连续多空目标仓位README.md + Code.ipynb + Report.pdf + GitHub API metadata)这次主材料不是论文,而是一份 2026-03-30 创建 的 GitHub 新仓库:mhtkrmz (2026), _crypto-alpha-comparison_。headline 看起来像“趋势 vs 均值回复”的课程项目,但对我们 desk 真正更值得 intake 的,不是它在讲两派孰优孰劣,而是它把一条 可直接复现的多资产 TSMOM 完整策略骨架 写得非常清楚:
1h OHLCV 抓 6 个 liquid majors;trend_following 和 mean_reversion;翻成人话: 它不是在说“趋势永远比反转好”,而是在说“如果你真要做短中短周期的多资产 raw alpha,至少该把信号、仓位、换手惩罚、风险协方差、成本放进同一个壳子里比较”。
这篇 digest 的主角不是 repo 里的 mean reversion 支线,而是它更清楚、也更适合当前 desk 主线的那条 trend-following raw alpha:
L 根 bar 的对数收益 log(P_t / P_{t-L});σ_t * √L,把不同币、不同波动状态下的动量强度归一到同一量纲;tanh 压缩极端值,避免单个极端趋势把仓位直接拉满;mu = signal * sigma1,再进入带换手惩罚和风险惩罚的仓位分配器。翻成人话: base alpha 就是“波动率调整后的趋势延续”:涨得又稳又持续的币,应该比刚刚乱冲的币拿到更高的持续性仓位。
所以这轮它明确属于:
raw alphatrend / momentumtime-series结合当前学习主线,这轮值得写有三个原因:
LEARNING_TRACK.md 和 FACTOR_BACKLOG.md 里,趋势/动量一直是明确优先级,但当前 backlog 里更偏“方向过滤 / breakout / ATR 概念”,而缺一张真正把 raw alpha + sizing + risk + turnover + cost 串起来的完整趋势策略卡。2026-03-30T12:20:22Z,pushed 2026-03-30T12:24:35ZREADME.mdCode.ipynbReport.pdfrepo 从 Binance 公共 1h K 线下载这 6 个币:
BTCUSDTETHUSDTBNBUSDTXRPUSDTADAUSDTDOGEUSDT样本区间是:
1h bars这很重要,因为它不是拿几周数据讲故事,而是拿了一个跨牛熊、跨 regime 的中等长度样本。
Code.ipynb 里的核心函数是:
make_trend_mu(close_df, sigma1_df, lookback)signal_t ~ tanh( log(P_t / P_{t-L}) / (sigma_t * sqrt(L)) )mu = signal * sigma1几个关键点:
tanh 把仓位信号做成连续值,强趋势拿更大仓位,弱趋势拿更小仓位。run_strategy(...) 每根 bar 解的问题是:
max_w mu'w - 0.5*lambda*w'Sw - 0.5*kappa||w - w_prev||^2||w||_1 <= 1theta = gross_cap * w翻成人话:
mu'w:你想追 alphalambda*w'Sw:但要怕波动 / 协方差风险kappa||w-w_prev||^2:还要怕频繁调仓带来的换手与成本||w||_1 <= 1:总 gross 暴露不能无限开这对 desk 的价值非常直接: 它已经把“信号强度”和“能不能低换手、低冲击地抱住仓位”放到同一层处理。
repo 的固定设置:
STARTING_CAPITAL = 10,000 USDTGROSS_CAP = 100,000 USDTVOL_COV_WIN = 168(1 周 1h bar)RISK_AVERSION = 15.0COV_SHRINK = 0.2560% / 20% / 20%趋势 lookback grid:
24 / 72 / 168 / 336 barsmean reversion lookback grid:
4 / 8 / 12 / 24 barsturnover penalty grid:
0.02 / 0.05 / 0.10这意味着: 这份 repo 不是“给你一个结论”,而是直接给你一张能搬到 15m/5m/3m/1m 的实验模板。
repo 在统一壳子下给出的最佳 validation 组合:
Trend-following
336 bars0.02validation_sharpe = 2.5225validation_cum_pnl_usdt = 223,220validation_avg_turnover_usdt = 2,533Mean reversion
24 bars0.10validation_sharpe = -1.2071validation_cum_pnl_usdt = -69,136validation_avg_turnover_usdt = 7,461这组数非常值钱,因为它说明在同一 universe、同一 gross cap、同一 risk shell 下: 反转不但没赢,换手还更高;趋势至少在 validation 上是又强又更省换手。
最佳 locked 参数在 test 上:
Trend-following
test_sharpe = 0.3430test_cum_pnl_usdt = 21,368.6test_avg_turnover_usdt = 2,522.6Mean reversion
test_sharpe = 0.6227test_cum_pnl_usdt = 17,714.8test_avg_turnover_usdt = 6,246.8这里要注意两点:
0.34,说明这不是“闭眼就上的神策略”,而是 值得继续加 friction ladder、改时间尺度、换执行壳子 的 raw alpha 候选。repo 用 Roll / Corwin-Schultz 做了资产级滑点估计,最后选出的统一标尺是:
s = 0.00086777 decimal per trade8.6777 bps one-way并且 notebook 里展示的资产级估计里,至少可以看到:
5.23 bps5.97 bps6.92 bps9.06 bps10.41 bps翻成人话: 这份 repo 最有价值的一点,不是回测赚了多少,而是它逼你承认“多资产短周期 alpha 的成本壳必须先写进去”。
在 Part 4 的 fixed-100k-cap 模式下:
Trend-following
333,853 USDT243,432 USDT90,421 USDT70.05 bars(约 2.92 天)Mean reversion
-141,851 USDT-354,509 USDT212,658 USDT29.42 bars(约 1.23 天)这组数字的 desk 读法不是“趋势一定稳赚”,而是:
这能直接补当前主线里对“多周期动量”的理解:
repo 最有启发的一点不是 Sharpe 2.52,而是: 同样的 alpha,如果你不惩罚换手,最终可能只是把 gross edge 全喂给滑点。
这和当前 FACTOR_BACKLOG.md 里强调的 post-cost 评估是完全一致的,而且比“先出信号、后补成本”更像能进实盘候选池的写法。
很多 repo 看起来像在比较 signal,实际上比较的是:
这份 repo 的好处是: 它先把壳子固定,再比较 trend vs MR。 这让“哪条 raw alpha 更值得继续”这个问题变得更干净。
repo 的 native 实验是 1h。这对当前以 5m / 15m 为主、也接受 1m / 3m 的 desk 来说,不是最终答案。
但它仍然很有用,因为:
它设:
10k100k这会让回测读起来更像“固定 gross exposure assignment”,而不是一个真正受保证金 / 爆仓 / 资金曲线约束的 production shell。
所以: 它是完整策略定义,不等于 production-ready portfolio engine。
从 validation 来看,这条 cross-sectional MR 在这套壳子里基本是输家。
因此更合理的 desk 读法是:
15m / 5m / 3m / 1m 的最小实验怎么做15m,因为它最像“保留趋势信息但不至于太慢”第一版最小实验建议:
BTC / ETH / BNB / SOL / XRP / ADA15mmom_L = log(P_t / P_{t-L})z_L = mom_L / (σ_t * √L)signal = tanh(z_L)mu = signal.shift(1) * sigma11-bar return std,再 shift 196 / 192 bars96 / 192 / 384 / 672 / 1344 bars0.02 / 0.05 / 0.10 / 0.201x 和 2x 两档,不要一上来就学 repo 的 10x执行口径:
15m bar close 计算目标仓位2 / 4 / 6 / 8 / 10 bps one-way5m如果 15m 还能留边,再把同一骨架搬到 5m:
96 / 288 / 576 / 86496 / 288这里最重要的不是追高 Sharpe,而是看: 同样的 vol-normalized TSMOM,在更快 bar 上还能不能在成本后留下稳定边。
3m / 1m 不建议直接上 full allocator,先做 alpha-existence更快周期建议先降级:
signal 分层后的 forward return monotonicity不然会过早把“执行噪音 + 组合噪音 + 成本噪音”全揉在一起。
不是复刻整个 trend-vs-MR 作业,而是只移植:
make_trend_murun_strategy 的目标函数结构turnover_penaltygross cap + friction ladder目标: 先确认“vol-normalized TSMOM + turnover penalty”在 15m 上是否仍有成本后生存空间。
用完全同一壳子,只换 alpha:
vol-normalized TSMOM只比较:
这样才能知道: 值得搬的,到底是“repo 的 alpha”,还是“repo 的 allocator shell”。
最值得先画的不是净值,而是:
L、不同 kappa因为这类策略最怕的不是“均值收益不够高”,而是: 一旦从 4 bps 滑到 8 bps,就整条曲线掉下悬崖。
这份 2026 新 repo 真正值得 desk intake 的,不是“趋势赢了反转”,而是那条能直接搬到 15m/5m 的完整骨架:vol-normalized TSMOM 信号 + turnover-penalized cap allocator + 明确 friction shell。
它靠的是公开 Binance 多资产样本上的统一壳子回测与成本估计:先把 trend 和 MR 放进同一优化器比较,再把滑点壳接进去,看谁还能活。