源文件:research/quant_digests/2026-04-02_0344_volnorm-rocshock-ema-volume-alpha.md
walk_forward_optimization.py + README.md + GitHub API metadata)+ 2022 crypto TA 成本文献作 sanity anchor这轮更值得 intake 的,不是“又一个动量回测脚本”,而是 repo 已经写成完整策略骨架的一条 directional raw alpha:ROC > k×ROC_std 的异常收益冲击,只有在 price > EMA + m×EMA_std 且 volume > volume_MA 时才入场,随后用 EMA 跌回/穿回 + trailing stop 出场。
证明方式不是论文 headline,而是源码直接把 alpha 的四层都摆出来了:波动标准化冲击阈值、趋势位移确认、成交量确认、walk-forward 参数搜索。 这让它比“单纯 RSI/MA 交叉”更像一张可直接下场做最小实验的完整策略卡。
这次的 base alpha 很清楚:
ROC = (P_t - P_{t-L}) / P_{t-L} 衡量最近一段价格加速度;ROC > k × rolling_std(ROC) 才算真正的 upward shock,ROC < -k × rolling_std(ROC) 才算 downward shock;翻成人话:它不是“均线多头就买”,而是“只有当异常强的收益冲击,已经穿透均线结构且有量能支持时,才去吃接下来那一小段延续”。
pairs / stat-arb / carry / cross-market 已经很多;这条线补的是一个更容易直接落到执行层的单币方向性 raw alpha。LEARNING_TRACK.md 里一直在补 多周期动量、量价确认、ATR/止损、市场状态过滤;FACTOR_BACKLOG.md 里也明确提到 trailing stop / volume / EMA 结构这些组件值得被抽成正式对象;SigmaFlowX(GitHub owner);当前唯一提交作者显示为 Dmitrii BakaevCrypto-Momentum-Driven-Strategy2025-11-15T07:57:38Z,pushed 2026-01-31T06:56:53Z,default branch mainwalk_forward_optimization.pyREADME.md(内容几乎为空,核心证据主要在代码)walk_forward_optimization.py 直接读:
BTCUSDT_1m.csv然后先做一次 desk 友好的降采样:
1m OHLCV 聚合成 15mopen=first,high=max,low=min,close=last,volume=sum这点很重要:repo 的输入虽然是 1m,但 alpha 判定主框架其实已经落在 15m。 这正好贴近我们当前 desk 默认主频。
repo 把 walk-forward 明确写成:
6 个月 train3 个月 test3 个月也就是说,它不是在全样本上找最优参数然后自我感动,而是至少有一个滚动 OOS 壳子。
源码里 long 条件是:
curr_roc > roc_threshold * curr_roc_stdcurr_price > curr_emacurr_vol > curr_vol_macurr_roc > roc_prevcurr_price > curr_ema + ema_threshold * ema_stdshort 则完全镜像:
curr_roc < -roc_threshold * curr_roc_stdcurr_price < curr_emacurr_vol > curr_vol_macurr_roc < roc_prevcurr_price < curr_ema - ema_threshold * ema_std这条设计里,真正的 alpha 本体 是第一条: ROC 相对自身波动显著异常。
后面几条更像 admission / confirmation:
price vs EMA:方向结构别和 shock 打架;volume > volume_MA:别在无量时追;curr_roc > roc_prev:要求冲击还在加速;price > EMA + m×EMA_std:要求不是刚碰到均线,而是已经明显偏离。所以更准确的 desk 读法应该是: raw alpha = shock continuation;EMA / volume / displacement 是 admission layer,而不是 alpha 本体本身。
repo 的出场没有搞太多花活:
price < EMA 或 price < trailing_stopprice > EMA 或 price > trailing_stop这比“永远持有 N 根 bar”更适合短周期 desk,因为它自然允许:
代码里:
risk_percent = 10fee = 0.022 * fee / 100翻成更直观的口径:
这里要非常诚实:
10% 更像固定 notional fraction,不是完整风险预算;4 bps 对很多真实 perp 执行场景都偏乐观;所以它更像一张 alpha existence card,而不是可直接拿去实盘的成本口径。
15m,不是 repo 简介里那句“1m 数据”本身。 因为源码先把 1m 聚合成了 15m 再判信号。6m train / 3m test / 3m step。EMA_length / volume_ma_period / roc_period / roc_std_window 全都在 10~300 间搜索。roc_threshold 搜 0.5~10.0,避免把不同波动环境下的同样绝对涨跌幅混为一谈。ema_threshold 搜 1~5 个 rolling std,trailing_pct 搜 0.5%~10%。这 5 个点说明:repo 最值钱的不只是“做 momentum”,而是它把 冲击、确认、退出、WFO 四层都工程化了。
如果按 repo 自己的包装去读,很容易把重点放在参数搜索。但对我们更值钱的其实是下面这条 skeleton:
也就是说,Optuna 只是外壳,alpha 内核是“异常冲击后的短段延续”。
repo 的判定层本来就是 15m。因此它最适合:
15m:做主实验与 first verdict;5m:细化入场时机、做 execution refinement;1m / 3m:只在确认 15m after-cost 活着后,再用于更细的追价/回撤优化。真正可 desk 化的翻法不是:
而是:
它不是 pairs,不是 carry,不是 funding,也不是单纯 breakout 画线。 它更接近:
BTC / ETH / SOL / BNB 永续;可先从 BTC+ETH 起步15mroc_period ∈ {12, 24, 36, 48}(约 3h / 6h / 9h / 12h)ROC / rolling_std(ROC) > k 做多;< -k 做空,k ∈ {1.0, 1.5, 2.0, 2.5}price > EMA_L / < EMA_Lvolume > rolling_volume_ma|price - EMA| / rolling_std(price) > mEMA cross-back vs 1.0% / 1.5% / 2.0% trailing vs 二者并用6 / 10 / 14 / 20 / 30 bps先回答一个最朴素的问题:after-cost 下,shock continuation 在 15m perp 上到底有没有生存空间。
若实验 A 成立,再做:
15m signal confirmed 后,比较5m 立即追;5m 小回踩后追;VWAP pullback 进;在 alpha 本体成立后,再叠:
注意顺序:先验证 raw alpha,再加 overlay;不要让 overlay 冒充 alpha。
BTCUSDT_1m.csv;我们更该看 BTC 以外,ETH / SOL / BNB 是否也有类似结构。4bps round-trip 太乐观;desk 版 first pass 应至少看 10~30bps。这样才知道 edge 到底来自哪一层。
这条主题值得进研究池,因为它满足当前高优先级条件:
如果要一句话概括:这份 repo 最值钱的不是“自动调参”,而是它把一条 short-cycle directional raw alpha 诚实拆成了四层:异常冲击、结构确认、量能确认、结构失效退出。