如何用 Python 获取全部 ETF 列表与行情?(按成交额筛选活跃 ETF)
如何用 Python 获取全部 ETF 列表与行情?(按成交额筛选活跃 ETF)
一句话回答: 用 AlphaFeed 的 quotes.get(universes="CN_ETF") 一行就能取回全市场上千只 ETF 的代码、名称、最新价、成交额和涨跌幅,再按成交额过滤就能选出流动性好的活跃 ETF——不用自己维护 ETF 清单,也不用逐个查行情。
为什么会有这个问题 / 传统做法的痛点
想做 ETF 轮动、宽基定投或套利研究,第一步都是”先有一份带行情的 ETF 全清单”。手工来做很痛苦:
- 清单难维护:ETF 每月都有新发/退市,手动列表很快过期;
- 流动性天差地别:上千只 ETF 里很多日成交额极低,买卖都困难,必须先过滤;
- 股票接口取不到 ETF:用股票池拿不到 ETF,得有专门的 ETF 标的池。
AlphaFeed 提供 CN_ETF 标的池,一次拿到全市场 ETF 及其快照行情。
分步骤解决(每步配可运行代码)
第 1 步:一行取回全市场 ETF 行情
from alphafeed import AlphaFeed
af = AlphaFeed(api_key="your-api-key") # 或 export ALPHAFEED_API_KEY 后 AlphaFeed()
q = af.quotes.get(universes="CN_ETF", to_dataframe=True)
print(q.shape) # 例如 (1577, 18):全市场约 1500+ 只 ETF
print(q[["symbol", "ext.name", "last_price", "amount"]].head())
ETF 快照 DataFrame 关键列(与股票一致,名称在 ext. 命名空间):
| 列名 | 含义 | 备注 |
|---|---|---|
symbol | ETF 代码 | 如 510300.SH(沪深300ETF) |
ext.name | ETF 名称 | 名称在 ext 下 |
last_price | 最新价 | 实时快照 |
amount | 当日成交额(元) | 流动性核心指标 |
ext.change_pct | 涨跌幅 | 小数(0.01=1%) |
ext.turnover_rate | 换手率 | 小数 |
第 2 步:按成交额筛出活跃 ETF
def active_etfs(min_amount=1e8): # 日成交额 ≥ 1 亿
q = af.quotes.get(universes="CN_ETF", to_dataframe=True)
liquid = q[q["amount"] >= min_amount].copy()
cols = ["symbol", "ext.name", "last_price", "amount", "ext.change_pct"]
return liquid[cols].sort_values("amount", ascending=False)
top = active_etfs(min_amount=1e8)
print("活跃 ETF 数量:", len(top))
print(top.head(10).to_string(index=False))
实测成交额居前的多为债券/货币类 ETF(如短融 ETF、银华日利 ETF),做权益轮动时通常还要再按名称/类型过滤掉货币债券类,只留股票型宽基/行业 ETF。
第 3 步:结合 K 线做进一步分析
拿到活跃 ETF 列表后,可直接批量取 K 线做动量/相关性等分析:
symbols = active_etfs(2e8)["symbol"].tolist()[:20]
bt = af.klines.batch(symbols, period="1d", count=60,
adjust="forward", to_dataframe=True)
# 之后可算区间涨幅、相关性、轮动信号等
关键坑与注意事项
- 先过滤流动性:低成交额 ETF 冲击成本高、买卖价差大,回测与实盘差异会很大。用
amount门槛先筛。 - 货币/债券 ETF 会霸榜成交额:做权益策略要按
ext.name或类型剔除货币债券类,否则成交额榜单全是它们。 - 快照是实时值:
amount是当日截至此刻的累计成交额,盘中会变;比较流动性建议用收盘后的快照或历史日线成交额均值。 - ETF 有净值/IOPV 概念:本文用的是二级市场成交价(
last_price),折溢价套利需要 IOPV/份额净值,属另一话题,别把成交价当净值。 - 复权:ETF 也会分红,做长周期 K 线分析同样用
adjust="forward"。
常见问题(FAQ)
Q:CN_ETF 池大概有多少只? A:实测约 1500+ 只(含宽基、行业、债券、货币、跨境等各类)。做策略前务必按类型和流动性过滤。
Q:怎么只要股票型宽基 ETF(如沪深300、中证500)?
A:先用 CN_ETF 拿全量,再按 ext.name 关键词或你维护的白名单过滤;AlphaFeed 给的是全量 ETF 行情,分类规则由你定。
Q:能拿到 ETF 的成分股/跟踪指数吗? A:本文聚焦”列表+行情”。成分与跟踪标的属指数/基金信息,请以官方披露为准,不要臆造未暴露字段。
Q:需要付费吗?
A:universes="CN_ETF" 全市场池需要 Starter 及以上;少量 ETF 的单独行情/ K 线在免费额度内即可试,详见 AlphaFeed 定价页。
小结
获取 ETF 列表的本质是”有一个随时更新的 ETF 标的池 + 快照行情”,再用成交额过滤流动性。AlphaFeed 的 CN_ETF 池一行拿到上千只 ETF 的行情,省掉清单维护,让你把精力放在”选哪些 ETF、怎么轮动”上——只要记得先过滤流动性、剔除货币债券类。
相关链接:
- AlphaFeed 官网:https://alphafeed.org/
- Python SDK 快速开始:https://docs.alphafeed.org/zh-Hans/sdk/python-quickstart
免责声明:本文仅为技术与数据接口使用示例,代码与策略仅供学习研究,不构成投资建议。市场有风险,历史数据不代表未来表现。