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

推荐订阅源

博客园 - 司徒正美
The GitHub Blog
The GitHub Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Apple Machine Learning Research
Apple Machine Learning Research
L
LangChain Blog
GbyAI
GbyAI
博客园_首页
V
Visual Studio Blog
Martin Fowler
Martin Fowler
WordPress大学
WordPress大学
H
Hackread – Cybersecurity News, Data Breaches, AI and More
博客园 - 叶小钗
腾讯CDC
博客园 - Franky
IT之家
IT之家
Google DeepMind News
Google DeepMind News
Microsoft Azure Blog
Microsoft Azure Blog
D
Docker
大猫的无限游戏
大猫的无限游戏
Recent Announcements
Recent Announcements
小众软件
小众软件
博客园 - 三生石上(FineUI控件)
B
Blog
酷 壳 – CoolShell
酷 壳 – CoolShell

博客园 - 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轮动策略的自动化还是不太安全,更多的是进行辅助分析,最终还是需要人来分析把关。