惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

IT之家
IT之家
Recent Announcements
Recent Announcements
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
The GitHub Blog
The GitHub Blog
MyScale Blog
MyScale Blog
爱范儿
爱范儿
GbyAI
GbyAI
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
美团技术团队
Y
Y Combinator Blog
博客园 - 叶小钗
Apple Machine Learning Research
Apple Machine Learning Research
Martin Fowler
Martin Fowler
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
罗磊的独立博客
M
MIT News - Artificial intelligence
博客园 - Franky
V
Visual Studio Blog
I
InfoQ
V
V2EX
Hugging Face - Blog
Hugging Face - Blog
腾讯CDC
博客园 - 司徒正美
L
LangChain Blog

博客园 - Leone-

GitHub 61.7k+⭐智能体,当你的私人股票分析师:Daily_stock_analysis 不用懂编程!3种方法搭建WorkBuddy工作台,打工人必备效率神器 上班没空盯盘?61.7K星免费开源AI每天自动推送分析 :Daily_stock_analysis Workbuddy猜出宇树科技上市的价格 我翻了上百个连板票,启动前都干过一件反人性的事:回调5天 我把WorkBuddy变成了A股研究员:每天自动盯50只股票 用 Workbuddy 做一个自己的“每日工作台” 用WorkBuddy「个人工作台」,从0搭一套自己的工作管理系统 把行情软件旁边的 WorkBuddy,养成了一个盘后A股投研台 WorkBuddy保姆级使用指南 我用WorkBuddy盯A股异动,盘中不用一直看屏幕 个人量化从0到1:我跑了2年的系统,告诉你什么才是靠谱的 为什么有的人总能抓住市场热点? 五种形态一个答案,找到适合你性格的那一招重复一万遍 我花了三个月,复盘81只十倍股的K线,终于找到了它们的共同点 把一种模式练一万遍:主力流入+缩量回调+二次突破 我用WorkBuddy搭了一套“A股复盘助手”,每天10分钟看懂当天行情 我用WorkBuddy盯100只股票,每天只看发生变化的 我用WorkBuddy做A股“情绪周期雷达”,提前发现市场正在退潮 “大盘环境判定+主流板块识别+个股买点触发”:三位一体决策框架 猫抓配合N_m3u8DL-RE实现m3u8下载 量化交易入门与工具选择:一份面向个人投资者的专业指南 炒股保命纪律:高位不做正T,低位不做反T!这不是建议,是铁律! A股回测用Rust重写|akquant全栈实战 阿里刚开源了一个代码审查工具,两年揪出数百万个Bug 向内聚焦自身,减少精神内耗,全程专注自我成长与最终结果 华为韬定律8家核心公司梳理,先进封装+晶圆代工+底层硬核全解析 暴涨10%+,江波龙这玩笑开大了 我用 AI Agent 写了个"美股看门狗",每天早上替我分析 A 股方向 为什么电脑用久了会变得越来越卡顿,其背后的计算机原理是什么?
全市场 ETF 动量分析脚本
Leone- · 2026-04-24 · via 博客园 - Leone-

最近在 AI 的帮助下,写了一个全市场 ETF 动量分析脚本。其实这个脚本很早就已经写好了,但最近比较忙,一直没时间整理发推文。

在 ETF 轮动策略中,常见的做法是使用固定的 ETF 候选池。但这种方式存在一个明显的问题:行情是不断变化的,固定的候选池很难覆盖不同时段的市场机会。

动态ETF候选池

如果从长周期来看,固定候选池确实可以抓住大趋势。但另一方面,我们能不能做一个“动态 ETF 候选池”? 从理论上讲,动态候选池应该更有机会捕捉阶段性行情。

手动分析全市场ETF来构建动态ETF候选池,几乎不太可能:

  • 全市场 ETF 数量很多,手动筛选不太现实
  • 只看涨幅,容易选到短期冲高、溢价过高、或者流动性差的品种
  • 多只看起来都很强的 ETF,可能高度相关,最终组合并没有真正分散

所以,我们需要一个自动化工具,来帮助我们在某个交易日快速完成全市场 ETF 的分析和筛选。

构建动态候选池的思路

该自动化分析工具的大致思路是:从全市场 ETF 出发,做动量分析,并筛选出动量分散、相关性较低的一组 ETF。

以下是基于Tushare数据来实现这个思路的主要步骤:

1. 获取历史某日的全市场 ETF 列表

使用 Tushare 的 fund_basic() 接口获取 ETF 列表:

pro.fund_basic(market="E")

然后筛选出满足以下条件的基金:

  • list_date <= trading_date
  • 尚未退市(delist_date 为空或 ≥ trading_date
  • 名称中包含 ETF 或 LOF (如果不喜欢LOF,也可以把LOF去掉)

2. 获取 ETF 行情数据

使用 fund_daily() 接口获取行情数据,包括:open, high, low, close, pre_close, vol, amount 等字段。

虽然接口本身不支持复权,但返回的数据提供了 pre_close字段,因此我们可以自行实现前复权或后复权逻辑。

3. 动量打分计算

这里采用的是对数价格的线性回归方法来计算动量:

最终得分定义为:

score = annualized_returns × r_squared

核心代码如下:

y = np.log(prices)
x = np.arange(len(y), dtype=float)

# 等权线形回归
slope, intercept = np.polyfit(x, y, 1)
annualized_returns = math.pow(math.exp(slope), 250) - 1
r_squared = 1 - (sum((y - (slope * x + intercept))**2) / ((len(y) - 1) * np.var(y, ddof=1)))
score = annualized_returns * r_squared

这种方式可以同时考虑:

  • 收益强度
  • 趋势稳定性

相比单纯涨幅,更稳健。

当然也可以用其他的一些动量指标,比如非等权平均、动态回溯窗口进行回归等。

4. 相关性控制(核心步骤)

全市场 ETF 中,很多高动量标的其实属于同一类资产(例如同一行业或同一指数),如果不做处理,最终选出来的组合可能高度集中。

因此,我们可以通过相关性分析来进行筛选。筛选逻辑如下:

  1. 按动量得分从高到低排序
  2. 第一只 ETF 直接入选
  3. 后续 ETF 需满足:与已选 ETF 的相关性均低于阈值
  4. 若与任意已选 ETF 相关性过高,则跳过
  5. 直到选到特定数量的ETF

这本质上是在做一个“去相关”的动量组合构建。

5. 热力图功能

为了直观地感受最终筛选的ETF的动量变化,我新增了热力图功能,用于可视化最终入选 ETF 的历史动量得分变化

这样,我们就可以很直观地看到:

  • 哪些 ETF 是持续强势
  • 哪些只是阶段性爆发

6. 相关性可视化

另外我单独写了一个相关性分析脚本,用于分析给定 ETF 列表中,两两之间的相关性。以帮助更细致地理解:

  • 组合内部是否真正分散
  • 是否存在“看起来不同,本质一样”的 ETF

7. 其他细节处理

在实际实现中,还做了一些比较重要的过滤和风控处理:

  1. 剔除低波动 ETF(如债券、货币、固收类)
  2. 剔除流动性较差的 ETF(基于近期成交额均值)
  3. 风控过滤:
  • 剔除近期出现大跌的 ETF
  • 对溢价过高的 ETF 进行惩罚

8. 后记

整体来看,这个脚本的核心目标是:

从“全市场”中,自动构建一个“高动量 + 低相关 + 可交易”的 ETF 组合候选池

相比传统固定池策略,更加灵活,也更贴近真实市场结构。

不过,其具体效果如何,还是得测试测试才知道,目前完全靠这个来实现整套ETF轮动策略的自动化还是不太安全,更多的是进行辅助分析,最终还是需要人来分析把关。