我用 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/61/6

候选版本先对持仓标的的逆波动率权重做归一化,再将单标的权重截到 1/6。截掉的部分不再分给其他标的,因此组合可以保留现金。逆波动率会降低高波动标的的相对权重,但计算中没有使用标的间的相关性。多个相关 ETF 同时触发信号时,单标的上限仍可能留下集中风险。

回测结果

训练期为 2016–2021 年,验证期为 2022–2024 年。引擎用当日收盘形成目标仓位,用当日收盘至下一交易日收盘的价格变化计收益,并按每日权重变化扣除费用。成本假设为单边 2 个基点,另加每股 0.005 美元价差及滑点和 0.0035 美元佣金。

指标等权基线逆波动率候选
训练期 Sharpe1.111.548
验证期 Sharpe0.550.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 买入持有比较

2016–2024 年累计净值。SPY 期末约为本金的 3.37 倍,逆波动率 IBS 为 2.88 倍,等权 IBS 为 2.81 倍。

三条曲线以 1 为起点。竖虚线标出 2022 年验证期的开始。

2016–2024 年逆波动率 IBS等权 IBSSPY 满仓持有
年化收益12.51%12.21%14.47%
累计收益+188.30%+181.43%+236.75%
最大回撤−12.93%−12.97%−33.79%
Sharpe1.320.910.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 第五轮研究报告、结构化检查记录、策略实现和日线回测引擎。