← 返回 Quant Digests · 站点首页

别把 15m 动量继续写成固定 lookback 均线:这份 2026 新 repo 更适合先测的是「vol-normalized ROC shock × EMA displacement × volume confirmation」这条完整 raw alpha

更新时间:2026-04-02 03:39 UTC 研究时间:2026-04-02 03:44 UTC 类型:2026 GitHub 新仓库 source audit(`walk_forward_optimization.py` + `README.md` + GitHub API metadata)+ 2022 crypto TA 成本文献作 sanity anchor 主题标签:raw-alpha/trend/momentum/single-asset/roc-shock/vol-normalized/ema-displacement/volume-confirmation/walk-forward/optuna/trailing-stop/binance/btc/15m/5m/3m/1m/repo/public-data/cost 证据类型:2026 GitHub repo source audit(主证据)+ 2022 论文元数据(成本诚实性背景)

源文件:research/quant_digests/2026-04-02_0344_volnorm-rocshock-ema-volume-alpha.md

1. 这次看了什么

一句话核心结论

这轮更值得 intake 的,不是“又一个动量回测脚本”,而是 repo 已经写成完整策略骨架的一条 directional raw alpha:ROC > k×ROC_std 的异常收益冲击,只有在 price > EMA + m×EMA_stdvolume > volume_MA 时才入场,随后用 EMA 跌回/穿回 + trailing stop 出场。

一句话它是怎么证明的

证明方式不是论文 headline,而是源码直接把 alpha 的四层都摆出来了:波动标准化冲击阈值、趋势位移确认、成交量确认、walk-forward 参数搜索。 这让它比“单纯 RSI/MA 交叉”更像一张可直接下场做最小实验的完整策略卡。

2. base alpha 是什么

这次的 base alpha 很清楚

  1. ROC = (P_t - P_{t-L}) / P_{t-L} 衡量最近一段价格加速度;
  2. 不是看绝对 ROC,而是看它相对自己近期波动是否异常:ROC > k × rolling_std(ROC) 才算真正的 upward shock,ROC < -k × rolling_std(ROC) 才算 downward shock;
  3. 只有当价格已经明显站上/跌破均线结构,且成交量高于自身均量时,才承认这次 shock 不是噪音;
  4. 入场后不赌固定持有期,而是让价格继续跑,直到 跌回 EMA / 涨回 EMA 或被 trailing stop 赶出去。

翻成人话:它不是“均线多头就买”,而是“只有当异常强的收益冲击,已经穿透均线结构且有量能支持时,才去吃接下来那一小段延续”。

3. 为什么这轮值得写

4. 来源信息

主工程来源

成本诚实性背景来源(不是这条 alpha 的主证据)

5. repo 具体是怎么把这条 alpha 写出来的

5.1 数据与 frequency

walk_forward_optimization.py 直接读:

然后先做一次 desk 友好的降采样:

这点很重要:repo 的输入虽然是 1m,但 alpha 判定主框架其实已经落在 15m。 这正好贴近我们当前 desk 默认主频。

5.2 Train / test shell:不是随便挑一组参数就宣布胜利

repo 把 walk-forward 明确写成:

也就是说,它不是在全样本上找最优参数然后自我感动,而是至少有一个滚动 OOS 壳子

5.3 Entry:异常收益冲击 × 均线位移 × 放量确认

源码里 long 条件是:

short 则完全镜像:

这条设计里,真正的 alpha 本体 是第一条: ROC 相对自身波动显著异常

后面几条更像 admission / confirmation:

所以更准确的 desk 读法应该是: raw alpha = shock continuation;EMA / volume / displacement 是 admission layer,而不是 alpha 本体本身。

5.4 Exit:不是固定 hold,而是结构失效就走

repo 的出场没有搞太多花活:

这比“永远持有 N 根 bar”更适合短周期 desk,因为它自然允许:

5.5 Sizing 与成本:很粗,但至少不是零

代码里:

翻成更直观的口径:

这里要非常诚实:

所以它更像一张 alpha existence card,而不是可直接拿去实盘的成本口径。

6. 5 个最值得记住的硬数据点

  1. 主频其实已经是 15m,不是 repo 简介里那句“1m 数据”本身。 因为源码先把 1m 聚合成了 15m 再判信号。
  2. walk-forward 不是装饰。 训练/测试壳子是 6m train / 3m test / 3m step
  3. 参数搜索空间很宽。 EMA_length / volume_ma_period / roc_period / roc_std_window 全都在 10~300 间搜索。
  4. 冲击阈值不是固定 return,而是波动标准化阈值。 roc_threshold0.5~10.0,避免把不同波动环境下的同样绝对涨跌幅混为一谈。
  5. 位移确认与风控也被参数化了。 ema_threshold1~5 个 rolling std,trailing_pct0.5%~10%

这 5 个点说明:repo 最值钱的不只是“做 momentum”,而是它把 冲击、确认、退出、WFO 四层都工程化了。

7. desk 最该偷走的,不是“Optuna 优化”这几个字

如果按 repo 自己的包装去读,很容易把重点放在参数搜索。但对我们更值钱的其实是下面这条 skeleton:

也就是说,Optuna 只是外壳,alpha 内核是“异常冲击后的短段延续”。

8. 和当前 1m / 3m / 5m / 15m 的关系

8.1 这条线和我们当前主频是对得上的

repo 的判定层本来就是 15m。因此它最适合:

8.2 不要错翻成“任何短涨跌都追”

真正可 desk 化的翻法不是:

而是:

8.3 它属于哪类 raw alpha

它不是 pairs,不是 carry,不是 funding,也不是单纯 breakout 画线。 它更接近:

9. 最小可复现实验

实验 A:15m baseline existence test(最优先)

先回答一个最朴素的问题:after-cost 下,shock continuation 在 15m perp 上到底有没有生存空间。

实验 B:5m execution refinement

若实验 A 成立,再做:

实验 C:shared veto / overlay(不要反客为主)

在 alpha 本体成立后,再叠:

  1. 高 funding 逆向拥挤 veto;
  2. 重大 news / liquidation cascade veto;
  3. 超高 realized vol 环境下降杠杆。

注意顺序:先验证 raw alpha,再加 overlay;不要让 overlay 冒充 alpha。

10. 下一步怎么测

  1. 先做“去优化版”复刻。 不要一上来就大网格 + Optuna;先固定 1~2 组合理参数,看 existence。否则很容易把 WFO 壳子误当成 alpha。
  2. 优先测 cross-asset transfer。 repo 只喂了 BTCUSDT_1m.csv;我们更该看 BTC 以外,ETH / SOL / BNB 是否也有类似结构。
  3. 先把成本打厚。 repo 默认约 4bps round-trip 太乐观;desk 版 first pass 应至少看 10~30bps
  4. 把 alpha 与 admission 拆开做 ablation。 依次比较:
  1. 比较 fixed hold vs structure exit。 很多 shock alpha 的好坏不止取决于 entry,也取决于“要不要让赢家多跑一段”。

11. 这条线最容易错在哪

12. 对当前项目的直接意义

这条主题值得进研究池,因为它满足当前高优先级条件:

如果要一句话概括:这份 repo 最值钱的不是“自动调参”,而是它把一条 short-cycle directional raw alpha 诚实拆成了四层:异常冲击结构确认量能确认结构失效退出

13. 来源链接

主来源

背景来源