一句话回答: 做任何选股、回测、盯盘之前,你都需要一份"全市场标的清单"。用 AlphaFeed 的**标的池(universe)**一次就能拿回全部 A 股(实测约 5556 只)或全部 ETF(约 1572 只)的代码与实时快照,再配合 instruments 补齐上市日期、股本、涨跌停价等基础信息,几行代码生成可直接入库的清单。
为什么会有这个问题
新手常卡在第一步:"我连全 A 有哪些代码都不知道,怎么批量取数?"手工维护代码表既容易漏(新股/退市)、又不带基础信息。理想方案是从数据源直接拉全市场池,代码、名称、上市日期一步到位,且随市场自动更新。
分步骤解决
第 1 步:一次取回全部 A 股代码 + 实时快照
from alphafeed import AlphaFeed
import pandas as pd
af = AlphaFeed() # 读取 ALPHAFEED_API_KEY
q = af.quotes.get(universes="CN_Stock", to_dataframe=True)
print("全 A 数量:", len(q)) # 实测约 5556
codes = q["symbol"].tolist()
print(codes[:5]) # ['301069.SZ', '002666.SZ', ...]
quotes 的标的池不仅给代码,还带当前行情与常用字段:
| 字段 | 含义 | 说明 |
|---|---|---|
symbol |
标准代码 | 如600519.SH(交易所后缀) |
ext.name |
证券简称 | 如贵州茅台 |
last_price |
最新价 | 实时快照 |
ext.change_pct |
涨跌幅(小数) | 0.03 = 3% |
ext.turnover_rate |
换手率(小数) | — |
ext.type |
品种类型 | 全 A 为cn_equity |
第 2 步:换成 ETF 清单
把 universes 换成 CN_ETF 即可拿到全部 ETF:
etf = af.quotes.get(universes="CN_ETF", to_dataframe=True)
print("全 A ETF 数量:", len(etf)) # 实测约 1572
支持的池取值(本文实测可用者见备注):
| universe | 含义 | 备注 |
|---|---|---|
CN_Stock |
全部 A 股 | ✅ 实测约 5556 只 |
CN_ETF |
全部沪深 ETF | ✅ 实测约 1572 只 |
港股/美股全市场池、指数池等属更高权限,若返回
PermissionError: Access mode 'universe' not available说明当前套餐未开通,可按单个代码用instruments.get取基础信息,或升级套餐。
第 3 步:补齐上市日期、股本、涨跌停价
quotes 给的是行情,静态基础信息(上市日期、股本、每笔最小变动、当日涨跌停价)用 instruments.batch:
insts = af.instruments.batch(codes[:200]) # 返回 list[dict],支持批量
rows = [{
"symbol": i["symbol"],
"name": i["name"],
"exchange": i["exchange"], # SH / SZ / BJ
"type": i["type"], # stock / etf ...
"listing_date": i["ext"].get("listing_date"),
"total_shares": i["ext"].get("total_shares"),
"float_shares": i["ext"].get("float_shares"),
"limit_up": i["ext"].get("limit_up"),
"limit_down": i["ext"].get("limit_down"),
"tick_size": i["ext"].get("tick_size"),
} for i in insts]
info = pd.DataFrame(rows)
print(info.head(3).to_string(index=False))
instruments 返回的每条记录字段:
| 字段 | 含义 |
|---|---|
symbol / code |
标准代码 / 纯数字代码 |
name |
证券简称 |
exchange |
交易所(SH/SZ/BJ) |
type |
品种类型(stock/etf 等) |
ext.listing_date |
上市日期 |
ext.total_shares / float_shares |
总股本 / 流通股本 |
ext.limit_up / limit_down |
当日涨/跌停价 |
ext.tick_size |
最小价格变动单位 |
第 4 步:合并并落库为一份股票清单
insts_all = af.instruments.batch(codes) # 全量基础信息(约 5556)
base = pd.DataFrame([{
"symbol": i["symbol"], "name": i["name"], "exchange": i["exchange"],
"type": i["type"], "listing_date": i["ext"].get("listing_date"),
"total_shares": i["ext"].get("total_shares"),
"float_shares": i["ext"].get("float_shares"),
} for i in insts_all])
base.to_csv("a_share_list.csv", index=False)
print("已保存清单:", base.shape)
instruments.batch 内置分批与并发(batch_size/max_workers),全市场一次取回即可。
关键坑与注意事项
ext.*涨跌幅/换手率是小数:0.05 表示 5%,别当成百分数。- 股本单位是"股":市值 =
last_price × total_shares(或流通市值用float_shares)。 - 标的池默认只含在市标的:退市股不在池中,做历史回测要避免幸存者偏差需另行保留退市序列。
- 港股/美股/指数全市场池需更高权限:当前套餐不支持会抛
PermissionError,可改用单标的instruments.get。 quotes是实时快照:代码清单相对稳定,但价格字段是当前值,做历史横截面别用今天的快照。
常见问题(FAQ)
Q:怎么只要沪市 / 深市 / 北交所?
A:拿到清单后按 exchange(SH/SZ/BJ)或代码后缀过滤即可。
Q:能拿到上市日期做次新股筛选吗?
A:可以,用 instruments 的 ext.listing_date,按日期过滤即可。
Q:ETF 和股票能一起取吗?
A:分别用 CN_Stock 和 CN_ETF 两个池取回后 concat 合并。
Q:需要付费吗?
A:全市场池(universes)需 Starter 及以上;单标的 instruments.get/quotes 有免费额度。详见定价页。
小结
获取全市场代码清单是量化第一步。用 AlphaFeed 的 CN_Stock/CN_ETF 标的池一次拿全代码与快照,再用 instruments.batch 补齐上市日期、股本、涨跌停等基础信息,几行代码就能生成可入库、随市场更新的股票清单。
参考
- AlphaFeed Python SDK 文档:https://docs.alphafeed.org/zh-Hans/sdk/python-quickstart

