五年10倍!用Claude Code打造“攻击性”行业轮动策略
# Claude Code 开发100个量化策略:行业ETF轮动策略
朋友们,利用"Claude Code开发100个量化策略"系列又更新了!前两期我们分别讲了经典的海龟交易策略和稳健的全天候策略,反响热烈。
至于为什么一段时间没有更这个系列呢,是因为猫哥之前一直用Ptrade,现在正在陆续切换到QMT,所以这几天一直在熟悉接口规范、数据结构啥的。
Ptrade vs QMT 平台对比
关于Ptrade和QMT的对比,猫哥目前也是有一定的心得:
-
Ptrade:运行在券商服务器上
- 优点:获取行情很快延迟很低,适合高频、打板类的策略
- 缺点:服务器资源有限,回测速度比较慢
-
QMT:运行在本地电脑上
- 优点:回测速度很快
- 缺点:获取行情的速度可能就比不上Ptrade
- 适合:低频的、需要大量回测的策略,例如因子投资、ETF轮动这种
所以猫哥也会视策略的不同,选择合适的平台进行回测和交易。
行业ETF轮动策略详解
什么是轮动策略?
说到轮动策略,很多朋友可能不太熟悉。简单来说,就是在一篮子资产中,定期挑选表现最好的进行持仓,表现差的就踢出去。
为什么轮动策略有效呢? 这背后有几个市场逻辑:
- 动量效应:涨得好的资产短期内往往会继续涨(趋势延续)
- 行业轮动:经济周期不同阶段,不同行业表现差异巨大
- 相对强弱:同一时期总有强势板块和弱势板块
今天我们要实现的策略,就是在9个行业ETF中,每天计算它们的"动量得分",然后选出得分最高的持仓。
注意:因为股票池是固定的,所以一定程度上有过拟合的问题,股池以偏向科技类ETF居多,适合最近的市场风格,但是未来的市场风格能不能继续这样演绎下去,就见仁见智了。
策略核心逻辑
💡 核心亮点1:斜率动量打分
传统的动量策略往往只看涨跌幅,比如"买入过去20天涨幅最大的"。但这个策略更聪明,它用的是线性回归斜率。
什么意思呢? 举个例子:
- ETF-A:20天涨了10%,但走势曲折,今天涨明天跌
- ETF-B:20天也涨了10%,但走势流畅,稳步上涨
虽然涨幅一样,但ETF-B的趋势更稳定,未来继续上涨的概率更大。线性回归斜率就是用来量化这种"趋势稳定性"的。
更妙的是,策略还乘以了R²(决定系数)。R²越大,说明价格走势越接近一条直线,趋势越清晰。这样就能筛选出既涨得快、又涨得稳的优质标的。
代码实现:
# 计算斜率动量得分
x = np.arange(1, N_DAYS + 1) # 时间序列
y = df['close'] / df['close'].iloc[0] # 价格归一化
lr = LinearRegression()
lr.fit(x.reshape(-1, 1), y)
slope = lr.coef_[0] # 斜率
r_squared = lr.score(x.reshape(-1, 1), y) # R²
# 最终得分 = 斜率 × R² × 10000
score = 10000 * slope * r_squared
💡 核心亮点2:RSRS择时系统
光会选股还不够,还得知道什么时候该买、什么时候该躲。
这就要靠RSRS择时指标了。RSRS全称是"阻力支撑相对强度",由光大证券在2017年发布的研报《基于阻力支撑相对强度的市场择时》中提出。
计算步骤:
对过去18天的最高价和最低价做线性回归
得到的斜率代表"上涨空间相对下跌空间的大小"
计算这个斜率在过去600天中的Z-score(标准分)
再乘以R²修正,得到最终的RSRS得分
# 计算RSRS指标
high_data = data['high'].values
low_data = data['low'].values
_, slope, r2 = get_ols_regression(low_data, high_data)
# 计算Z-score
rsrs_score = get_zscore(slope_series) * r2
SRS得分的含义:
大于0.7:市场处于强势,支撑远大于阻力,可以买入
小于-0.7:市场处于弱势,阻力远大于支撑,应该清仓
-0.7到0.7之间:震荡行情,保持现状
但光靠RSRS还不够,策略还加入了20日均线过滤:
# 均线信号
today_MA = close_data.iloc[MEAN_DIFF_DAY:].mean() # 当前均线
before_MA = close_data.iloc[:-MEAN_DIFF_DAY].mean() # 5天前的均线
# 综合判断
if rsrs_score > 0.7 and today_MA > before_MA:
signal = "BUY" # RSRS强势 + 均线上升 = 买入
elif rsrs_score < -0.7 and today_MA < before_MA:
signal = "SELL" # RSRS弱势 + 均线下降 = 清仓
else:
signal = "KEEP" # 维持现状
这种双重确认机制,有效降低了虚假信号。只有当市场真正转强或转弱时,才会发出交易信号。
🛠️ 如何用Claude Code开发?
好了,讲完策略原理,该说说怎么用AI开发了。
猫哥这次的开发过程也是全程AI辅助,几乎没怎么手动改代码。
关于AI写量化策略,猫哥最近也有自己的心得体会,大体分为两种方式,第二种最简单。
第一种方式
你脑海中有一个想法,但是没有现成的代码,所以需要给AI提出非常详细的需求描述,例如:
整体的逻辑是什么
-
如何选股
-
如何交易
-
如何设置参数
-
函数应该如何命名
-
如何处理异常
-
如何持久化交易数据等等
需要AI先阅读QMT的文档,然后根据你的需求去写代码(最好写一个完整的需求文档),相当于从头开始,不建议这样做。
第二种方式
你已经有了一个完整的QMT代码,虽然这个代码的交易逻辑可能跟你脑海中的想法不一样,但是在数据获取、交易下单、异常处理等模块,已经写好了现成的代码,直接就可以在其他代码里用。
例如之前猫哥写了这样一篇文章:
十年26倍,ETF乖离动量轮动策略了解一下
这个代码是做宽基ETF轮动,例如创业板ETF、国债ETF、纳指ETF等等,那么我这次想做行业ETF是不是就改一下股票池就可以?
此外这个代码是基于90日均线的乖离率做线性回归,但我觉得行业ETF的价格波动更剧烈想改成价格的线性回归,是不是直接让AI改就可以?
prompt示例:
将 ETF乖离动量轮动策略.py 的ETF动量评分方式,修改为直接对股价本身做线性回归。
StockAPI 2025 全景介绍
stockapi是一个专业的股票数据分析与量化交易接口平台。把行情、指标与特色数据“一条链路”拉到本地
定位
StockAPI 是一套面向量化交易者、财经 App 与内部投研系统的「一站式股票数据接口」;2025 版本在原有实时行情基础上,补全了技术指标、集合竞价、龙虎榜三大刚需模块,并全部提供 REST/JSON 与 WebSocket 双协议。
stockapi官网(www.stockapi.com.cn)
股票数据接口文档
1. 板块、概念成分股列表
接口说明:接口说明:板块、概念个股列表复盘必备工具
更新时间:交易日17:00
接口地址:
https://stockapi.com.cn/v1/base/bkList?bkCode=BK1036&pageNo=1&pageSize=50
2.1 板块代码
接口地址:
https://stockapi.com.cn/v1/base/bk
-
2.2 板块、概念历史资金流
接口地址:
https://stockapi.com.cn/v1/base/bkFlowHistory?bkCode=BK1036 -
2.3 概念代码
接口地址:
https://stockapi.com.cn/v1/base/gn -
2.4 逐笔明细
接口地址:
https://stockapi.com.cn/v1/base/second?code=601088&all=1 -
2.5 分时成交量
接口地址:
https://stockapi.com.cn/v1/base/min?code=601088&all=1 -
2.6 实时五档委托单
接口地址:
https://stockapi.com.cn/v1/base/wudang?code=601088
浙公网安备 33010602011771号