【Python量化实战全攻略 #28】ETF 轮动策略手册:动量轮动宽基、行业ETF(附代码)
摘要:【Python量化实战全攻略 #28】ETF 轮动策略手册:动量轮动宽基、行业ETF(附代码) 手册定位:模块四第 4 篇。ETF 轮动是「买入过去最强」的经典策略——在宽基/行业 ETF 间按动量切换,顺势而为。本
手册定位:模块四第 4 篇。ETF 轮动是「买入过去最强」的经典策略——在宽基/行业 ETF 间按动量切换,顺势而为。本篇讲怎么用 #07 的 ETF K线 + #13 的动量框架构建并月度轮动。
数据来源复用 #07 基金K线(/jh/hq/lskx/{代码}/Day)+ #13 动量思路。
1. 你将得到什么
- 拉多个 ETF 历史K线、按 N 日动量排名、持有前 K 名的代码;
- 月度调仓(每月换仓、等权)的写法;
- 轮动 vs 买入持有的对比思路;
- ETF 轮动的 4 个坑(动量反转、成分重叠、费率、跟踪误差)。
2. 取数约定(复用)
| 用途 | 来源端点 | 见 |
|---|---|---|
| ETF 列表 | /fund/list/etf |
#07 |
| ETF 历史K线 | /jh/hq/lskx/{代码}/Day |
#07 |
3. 数据来源(复用,不重复罗列)
详见 #07 基金行情与净值接口手册(ETF 列表 + 历史K线端点)。
4. 核心模板函数(自包含可跑)
import pandas as pd
import numpy as np
_MOCK = True
def momentum_rank(prices, n=60, top_k=3):
moms = {}
for code, cl in prices.items():
s = pd.Series(cl)
moms[code] = s.iloc[-1] / s.iloc[-1 - n] - 1 if len(cl) > n else -9
ranked = pd.Series(moms).sort_values(ascending=False)
return ranked.head(top_k).index.tolist()
def run_check():
prices = {
"510300": [4.0, 4.1, 4.3, 4.6, 4.9, 5.2],
"510500": [7.0, 6.9, 6.8, 6.7, 6.6, 6.5],
"159915": [2.5, 2.6, 2.7, 2.8, 2.9, 3.1],
}
top = momentum_rank(prices, n=5, top_k=2)
assert top == ["510300", "159915"]
print("校验通过 | 轮动选入:", top)
return top
if __name__ == "__main__":
run_check()
5. 跑通示例
top = run_check()
print("本月配置 ETF:", top)
6. 坑与注意事项
- 动量反转:强动量后常伴随反转,可叠加 #18 MACD 过滤。
- 成分重叠:沪深300ETF 与上证50ETF 成分高度重叠,要降相关性。
- 费率:高频轮动摩擦吃掉收益,月度更常用。
- 跟踪误差:选规模大、流动性好的标的。
7. 小结与下一篇预告
ETF 轮动给「顺势+分散」的组合。下一篇讲基金定投/配置——定投回测与再平衡。
下一篇预告:《【Python量化实战全攻略 #29】基金定投、配置手册:定投回测与再平衡(附代码)》
8. 免责声明
本文为 ETF 轮动示例,演示数据为虚构,不构成投资建议。
关于数据来源:本文 ETF 轮动所需的 K线数据来自智兔数服(www.zhituapi.com)官方文档接口(详见本系列 #07/#13),覆盖 200+ 已验证路径,注册可领免费 token 做研究测试。
更多实战手册见技术博客:zhituapi.com/blog.html。
本系列《Python量化实战全攻略》共 32 篇,下一篇讲基金定投配置。
想亲自试一下?免费获取证书