我用 Claude Code 的 oh-my-claudecode(OMC) 插件跑了几轮量化研究。我的目标是让 Ralph 持续提出假设、写策略、跑回测,然后把每一次成功或失败留下来。最后选出的跨资产 IBS 候选,在覆盖 2016–2024 年的 2,264 个交易日里,扣费后年化收益为 12.51%,验证期为 8.86%。IBS 是已有的指标,这次研究要发现的是:它搬到新的 ETF 组合之后,什么样的入场、离场和仓位规则还能通过事先设定的检验? OMC Ralph 技能文档
我怎样给 Ralph 设任务
我先把资产范围、训练与验证切分、交易成本、比较基线和通过门槛写进研究简报。策略只提交目标仓位,统一由同一个引擎计算收益和成本。下面是根据第五轮简报整理的启动指令:
/oh-my-claudecode:ralph 按 ROUND5_BRIEF.md 研究跨资产日线均值回归。
每个想法先写假设,只用 TRAIN 选参数,再实现一个策略文件。
每个文件跑一次 python -m lab.check,记录成绩与失败项。
最多 20 个策略文件。按事先写好的规则选择候选,汇报所有结果。
若没有候选通过,写明没有改善。独立留出评估由我执行。
Ralph 每轮先在 results/ideas.md 写下为什么可能有优势,再实现返回目标权重的 weights(data, ...)。python -m lab.selftest 检查工具链,python -m lab.check strategies/<idea>.py 才对策略评分。评分器把训练和验证的指标、参数、通过状态以及策略文件的哈希写到 results/checks.jsonl。它会看扣费后 Sharpe、相对等敞口买入持有的超额收益、剔除最佳十天后的结果,以及改动参数后表现是否还能过线。
可以把整个循环压成一行:
研究简报 → 记录假设 → 训练期选参数 → 实现仓位函数 → 固定规则评分 → 记录通过或失败
与 IBS 有关的研究轮次
| 轮次 | 核心想法 | 结果与下一步 |
|---|---|---|
| 1 · 开放搜索 | 试波动率择时、月末效应和 ETF 动量轮动。 | 30 个文件,0 个通过。后半轮的标的和参数受验证期结果影响,后来固定了资产池,并规定每个想法只正式评分一次。 |
| 3 · 改进日线 IBS | 在固定 12 只美股 ETF 上测试入场阈值和离场逻辑。 | 20 个文件,16 个通过。选中 IBS < 0.12、最多持仓 7 日的版本。验证 Sharpe 从 0.91 升至 1.02,年化净收益从 9.18% 降至 8.66%。 |
| 4 · 改测分钟线 | 用 SPY 分钟线测试早盘均值回归、跳空回补和尾盘策略。 | 11 个文件,0 个通过。训练期最高 Sharpe 为 0.71。 |
| 5 · 跨资产迁移 | 在 16 只 ETF 上测试收紧 IBS 阈值、换离场规则和按波动率配仓。 | 10 个文件,5 个通过。按训练期 Sharpe 选中 IBS < 0.08、最多持仓 5 日、逆波动率配仓的版本。 |
从失败记录到 IBS 候选
IBS 衡量什么
IBS(Internal Bar Strength)=(收盘价 − 最低价)÷(最高价 − 最低价)。如果当天最低 100、最高 110、收盘 100.7,IBS 就是 0.07,收盘落在当天区间底部的 7% 处。这个位置只描述当天的价格区间,前一日收盘价没有参与计算。遇到最高价等于最低价的日线,代码把 IBS 记为缺失,当天不触发新的入场。这个指标在股票 ETF 上已有研究。 Pagonidis,《The IBS Effect》
从信号到仓位
第五轮在同一组 16 只 ETF 上比较两个日线版本,覆盖商品、国债、信用债、国际股票和美股。模型仅做多。
| 规则 | 等权基线 | 逆波动率候选 |
|---|---|---|
| 入场 | 空仓时 IBS < 0.12 | 空仓时 IBS < 0.08 |
| 离场 | 收盘高于前一交易日最高价,或持仓满 7 个交易日 | 同一价格条件,或持仓满 5 个交易日 |
| 仓位 | 在持仓标的之间等权 | 按过去 20 个交易日收益率标准差的倒数分配 |
| 单标的权重上限 | 1/6 | 1/6 |
候选版本先对持仓标的的逆波动率权重做归一化,再将单标的权重截到 1/6。截掉的部分不再分给其他标的,因此组合可以保留现金。逆波动率会降低高波动标的的相对权重,但计算中没有使用标的间的相关性。多个相关 ETF 同时触发信号时,单标的上限仍可能留下集中风险。
回测结果
训练期为 2016–2021 年,验证期为 2022–2024 年。引擎用当日收盘形成目标仓位,用当日收盘至下一交易日收盘的价格变化计收益,并按每日权重变化扣除费用。成本假设为单边 2 个基点,另加每股 0.005 美元价差及滑点和 0.0035 美元佣金。
| 指标 | 等权基线 | 逆波动率候选 |
|---|---|---|
| 训练期 Sharpe | 1.11 | 1.548 |
| 验证期 Sharpe | 0.55 | 0.911 |
| 验证期年化净收益 | 6.9% | 8.9% |
| 验证期平均仓位 | 69% | 48% |
完整回测期的年化净收益
我用同一引擎在同一组 16 只 ETF 上复跑了基线和候选。项目数据覆盖 2016 年 1 月 4 日至 2024 年 12 月 31 日,合计九个日历年、2,264 个交易日。按引擎每年 252 个交易日的口径复利年化,候选为 12.51%(累计 +188.30%),基线为 12.21%(累计 +181.43%)。整段包含训练期。现有数据无法给出同组标的的完整十年年化结果。
| 年份 | 等权基线净收益 | 逆波动率候选净收益 |
|---|---|---|
| 2016 | +8.20% | +11.03% |
| 2017 | +14.94% | +7.32% |
| 2018 | -5.07% | +4.29% |
| 2019 | +19.93% | +15.67% |
| 2020 | +54.55% | +54.58% |
| 2021 | +5.50% | +0.68% |
| 2022 | +6.09% | +14.11% |
| 2023 | +6.12% | +2.47% |
| 2024 | +8.28% | +10.23% |
和 SPY 买入持有比较
三条曲线以 1 为起点。竖虚线标出 2022 年验证期的开始。
| 2016–2024 年 | 逆波动率 IBS | 等权 IBS | SPY 满仓持有 |
|---|---|---|---|
| 年化收益 | 12.51% | 12.21% | 14.47% |
| 累计收益 | +188.30% | +181.43% | +236.75% |
| 最大回撤 | −12.93% | −12.97% | −33.79% |
| Sharpe | 1.32 | 0.91 | 0.86 |
| 平均敞口 | 43.55% | 65.71% | 100% |
全段满仓 SPY 的年化收益更高,逆波动率 IBS 的回撤更小、Sharpe 更高。验证期里,候选年化为 8.86%,满仓 SPY 为 8.67%。若按评分器的口径,将 SPY 每日收益乘以候选在验证期的平均敞口(47.58%),SPY 年化为 4.43%,候选高出 4.43 个百分点。
SPY 采用与项目评分器一致的收盘到收盘价格序列,未扣交易费。两条 IBS 曲线已扣回测模型内的交易成本。
参数与候选选择
候选版本验证期最大回撤为 −12.9%。将入场阈值、持仓天数、波动率窗口和仓位上限分别上下调整 20%,得到的八组相邻参数在验证期的 Sharpe 介于 0.609 和 0.977。这说明参数附近并非只有一个组合能超过研究设定的 0.5 门槛。由于候选同时改了入场阈值、最长持仓和仓位算法,上表只能衡量三项改动的合并效果。
另一个版本在 IBS 回到 0.8 上方时出场,验证期 Sharpe 达到 1.138。第五轮事先写下的规则是在通过检查的策略中按训练期 Sharpe 选主候选,因此保留了训练期得分更高的逆波动率版本。把这个选择过程写下来,可以让读者看清哪个成绩用于选策略,哪个成绩用于检验。
结果还有哪些边界
回测使用最终日线计算 IBS,并用同一收盘价模拟成交。实盘收盘单需要提前提交,最后几分钟的价格变化可能改变信号和仓位。成本模型也不能解决信号确认与下单时间的冲突。
验证期只有三年。多轮筛选、ETF 样本的幸存者偏差,以及不同市场环境下的相关性变化,都可能抬高开发阶段的成绩。研究计划另留了 2025 年 1 月至 2026 年 11 月、12 只未参与开发的标的做最终检验。本文的结果截至开发与验证,项目报告未给出这组留出样本的成绩。
下一步怎么确认 Alpha
我会把选中的文件冻结,再交给独立留出集。对我来说,Ralph 的产出是一组有记录、可复跑的候选和失败案例。Alpha 是否成立,还要看冻结策略在新标的、新时间段以及可执行成交条件下的表现。
项目来源:Strategy Lab 第五轮研究报告、结构化检查记录、策略实现和日线回测引擎。