源文件:research/quant_digests/2026-04-11_1940_rl-dynamicscaling-pairs-shell.md
README.md + envs/env_gridsearch.py + envs/env_rl.py + envs/mock_trading.py)+ Binance USDⓈ-M 15m/5m portability probe这次看的是 Hongshen Yang, Abdul Malik (2024), _Reinforcement Learning Pair Trading: A Dynamic Scaling Approach_, Journal of Risk and Financial Management,以及作者公开的 repo Hongshen-Yang/pair-trading-envs。
这篇东西最容易被误读成:
> “又一个把 RL 套到交易上、让 agent 自己学买卖。”
但如果按 desk 视角拆开看,它真正清楚的地方其实是:
> base alpha 仍然是 pair spread mean reversion;RL 真正想解决的是“仓位要不要 all-in、能不能按偏离强弱动态缩放”。
Crossref 摘要给的原文关键信息也支持这个读法:作者用 BTC-GBP / BTC-EUR 的 1m 数据、共 263,520 条样本,传统非 RL pair trading 年化约 8.33%,RL 版年化约 9.94% ~ 31.53%。所以 paper 的亮点不是重新发明 alpha,本质上还是在同一条 spread fade 上,讨论 dynamic scaling 有没有价值。
envs/env_gridsearch.py 给的是很清楚的 baseline:
OPEN_THRE=1.6、CLOS_THRE=0.4;zscore > open 时做 short leg0 / long leg1;zscore < -open 时做反向;|zscore| <= close 时平仓。翻成人话就是:先承认 alpha 本体就是“价差拉太开,后面更容易收回来”。
envs/env_rl.py 里有两条路:
RL_FixAmt_PairTrade:动作还是离散 {开反向, 平, 开正向};RL_FreeAmt_PairTrade:动作变成连续 [-1, 1],本质是目标仓位大小。这就很关键: repo 并没有把 raw alpha 改成别的东西,而是在问——同样的 spread reversion,仓位该不该动态缩放。
因为一旦把连续仓位真的逐 bar 重调,最先爆炸的往往不是预测,而是:
所以这份材料最值得先偷的,不一定是 PPO / SAC / DQN 本身,而是: 能不能把“偏离越大、仓位越大”做成一个更克制的 clipped sizing shell。
15m/5m 上,dynamic sizing 到底有没有用?我没有复现原文的 RL 训练,而是把 repo 的想法改写成 desk 更快能验证的三种壳:
ETH/SOL、XRP/ADA、DOGE/ADA、ETH/BNB、XRP/DOGE、BTC/ETH15m(近 90d)和 5m(近 45d)entry=1.6、exit=0.44 bps三种模式:
|z| 大小给 0.25~1.0 的 clipped 仓位,持有期间不频繁重调;|z| 连续调目标仓位,最接近 repo 的 free-amount 思路。本地 artifact:
/root/clawd/jerry/momentum/reports/artifacts/literature/rl_pair_dynamic_scaling_probe_summary_2026-04-11.csv/root/clawd/jerry/momentum/reports/artifacts/literature/rl_pair_dynamic_scaling_probe_detail_2026-04-11.csv先看 6 对资产的平均结果:
#### 15m
fixed:平均累计收益约 -4.26%,平均换手约 331xscaled_entry:平均累计收益约 -0.80%,平均换手约 111xcontinuous:平均累计收益约 -16.78%,平均换手约 683x#### 5m
fixed:平均累计收益约 +1.05%,平均换手约 186xscaled_entry:平均累计收益约 +0.59%,平均换手约 56.5xcontinuous:平均累计收益约 -15.85%,平均换手约 604x一句话: 同一条 pairs raw alpha,在 5m/15m 上最先死掉的不是信号方向,而是 continuous re-sizing 的换手。
几个更有代表性的 pair:
BTC/ETH 15m:fixed:约 -4.44%scaled_entry:约 +0.15%325x 降到 106.8xETH/BNB 15m:fixed:约 -7.51%scaled_entry:约 -0.44%XRP/DOGE 5m:fixed:约 +0.63%scaled_entry:约 +1.01%这说明 repo 对 desk 最可迁移的,不是“continuous control agent”,而是:
> pair MR alpha 可以保留,但 sizing 最好离散化、区间化、clip 化。
最近 intake 里我们已经补了很多 pairs / stat-arb raw alpha,但大多还停在:
这篇补的是另一层: 同一条 raw alpha,仓位表达怎么写,才不会被成本先杀死。
所以它不是单纯 overlay 话题,因为它服务的对象非常明确:
5m/15m pairs、basket residual fade、甚至后续 funding/basis convergence shell|z| 不到开仓带、不在高相关 / 可回归 pair、或成本阈值不过线时不做4bps/side 压测先别急着真训练 RL。更合理的下一步是:
[-1,1];5m/15m pairs shell 上做 固定仓位 vs clipped 分档仓位 的正式 friction ladder;corr / half-life / residual-vol 合格的窗口启用 sizing shell;BTC-GBP / BTC-EUR 1m,更像同一 underlying 的 cross-quote pair;我这里用的是 cross-asset perp pairs,所以是 portability,不是 strict replication。别把这篇 paper 的卖点理解成“RL 会替你找到新 alpha”;它真正对 desk 有价值的是:pairs 的 raw alpha 还是 spread fade,但仓位最好做成 clipped dynamic sizing,而不是 continuous 来回拧。