全球股票实时API选型对比:美股、A股、港股个人开发者怎么选
跨市场量化策略写了一半,发现美股数据用一个接口、A股用另一个、港股还得再申请一个;免费接口昨天还能跑,今天字段就变了;所谓”实时行情”,实际延迟十几秒。个人做全球股票策略,最容易低估的不是策略难度,而是多市场数据源的工程成本决定了策略能跑多远。
这篇文章不堆接口名单,直接回答三个问题:历史回测用什么,盘中行情用什么,跨市场统一数据又该怎么搭。
先说结论:不要迷信”一个数据源包打天下”
个人开发者做全球股票,比较稳妥的方案不是找到一个万能API,而是按需求分层:
| 数据层 | 主要用途 | 适合的选择 |
|---|---|---|
| 历史研究层 | 日线、财务、指数成分、因子研究 | 本地数据库+免费历史接口 |
| 盘中行情层 | 实时快照、K线、跨市场比价 | 统一格式的实时行情API |
| 交易验证层 | 持仓、委托、成交 | 券商交易接口 |
历史数据追求完整和可复现,实时数据追求延迟与稳定,交易数据必须以券商回报为准。
如果你只做日频选股,没必要为毫秒行情买单;如果策略依赖跨市场比价、盘口或实时资金流,免费网页数据再省钱也可能把策略做废。
常见全球股票数据源横向对比
| 数据源 | 覆盖市场 | 实时能力 | 接口稳定性 | 使用成本 | 更适合谁 |
|---|---|---|---|---|---|
| Yahoo Finance | 全球主要市场 | 较弱(延迟明显) | 依赖网页,偶尔限流 | 低 | 学习、原型验证、低频分析 |
| Alpha Vantage | 美股为主 | 一般 | 较规范,但调用频率受限 | 免费额度有限 | 美股日频研究、入门项目 |
| Tushare Pro | A股为主 | 一般 | 较规范 | 按积分权限 | A股因子研究、财务分析 |
| AKShare | A股+部分海外 | 一般 | 依赖上游网页 | 低 | 多市场探索、数据抓取 |
| iTick | 美股/A股/港股/日股/印股 | 较强 | API化接入 | 需申请Token | 跨市场策略、实时监控、多市场并行 |
这里没有绝对排名。数据源是否好用,取决于你的策略频率、市场范围、预算和容错能力。
只做日频选股和做跨市场实时比价讨论”哪个数据源最好”,就像自行车和赛车讨论哪种轮胎最好,场景根本不同。
免费数据源:适合研究,不宜裸奔进生产
Yahoo Finance和AKShare这类免费源最大的优势是覆盖面广、上手快。股票、基金、指数都能在一个Python包里调用,很适合验证想法。
它们的不确定性也很明显:部分接口封装自公开网页,上游页面结构、参数或反爬策略发生变化,接口可能随之失效。Yahoo Finance的免费接口经常限流,高频调用会被封IP;AKShare的部分字段依赖网页解析,页面一改就挂。
适合它们的任务包括:
快速验证一个因子有没有研究价值
抓取低频公开数据做一次性分析
学习不同市场的代码格式和交易规则
不建议把单一免费接口直接放进无人值守的实盘链路。真要使用,至少要增加本地缓存、字段校验、异常告警和备用源。
免费的数据不一定便宜。你花三天修复字段变化,成本很可能已经超过一年的接口费用。
统一实时行情API:跨市场策略的工程解法
做跨市场策略的时候,最头疼的不是单市场数据拿不到,而是每个市场用一个接口,代码维护成本爆炸。美股用一个SDK,A股用另一个,港股还要再申请一个Token,时间戳格式不一样,字段命名不一样,出了问题都不知道查哪头。
统一实时行情API的思路是:用一套接口格式、一个认证Token,覆盖多个市场。看几个实际能力:
import requests
API_BASE = "https://api.itick.org"
TOKEN = "your_token_here"
headers = {"accept": "application/json", "token": TOKEN}
# 同一份代码,换个region就能拿不同市场的数据
def get_quote(region, code):
resp = requests.get(
f"{API_BASE}/stock/quote",
headers=headers,
params={"region": region, "code": code}
)
return resp.json()["data"]
# 美股苹果
us = get_quote("US", "AAPL")
# A股贵州茅台
cn = get_quote("CN", "600519")
# 港股腾讯
hk = get_quote("HK", "00700")
# 日股丰田
jp = get_quote("JP", "7203")
# 印股Reliance
in_ = get_quote("IN", "RELIANCE")
print(f"美股AAPL: {us['ld']} ({us['chp']}%)")
print(f"A股600519: {cn['ld']} ({cn['chp']}%)")
print(f"港股00700: {hk['ld']} ({hk['chp']}%)")
同一份get_quote函数,换个region参数就能拿五个市场的数据。这种统一格式对跨市场策略开发来说,工程价值很大——不用维护五套代码,出了问题查一个接口就行。
WebSocket实时推送也是统一格式:
import json
import websocket
WS_URL = "wss://api.itick.org/stock"
TOKEN = "your_token_here"
authenticated = False
def on_message(ws, message):
global authenticated
payload = json.loads(message)
# 等鉴权成功
if payload.get("resAc") == "auth" and payload.get("code") == 1 and not authenticated:
authenticated = True
# 同时订阅美股和港股
ws.send(json.dumps({
"ac": "subscribe",
"params": "AAPL$US,00700$HK",
"types": "quote"
}))
return
data = payload.get("data") or {}
if data.get("type") == "quote":
print(f"{data['s']}: {data['ld']} ({data['chp']}%)")
ws = websocket.WebSocketApp(WS_URL, header=[f"token: {TOKEN}"], on_message=on_message)
ws.run_forever()
一个WebSocket连接同时订阅美股和港股,不用维护两个连接。这种统一设计在做跨市场实时监控的时候特别省心。
注意几个容易踩的坑:
各市场代码格式不一样:美股是AAPL,A股是600519,港股是00700,日股是7203
印度股票订阅格式特殊,是三个参数:
RELIANCE$NSE$IN时间戳都是毫秒,直接当秒数处理会出错
交易时间不一样,美股晚上才开盘,做跨市场监控要注意时间窗口
不同策略到底应该怎么选
只做单市场日频选股和回测
推荐组合是免费历史接口加本地数据库(DuckDB、Parquet或PostgreSQL)。行情收盘后增量更新一次即可,不需要持续轮询实时接口。
预算非常有限时,用免费源建主库,再用实时API补充盘中数据。
做多市场对比和跨市场监控
这时候统一实时行情API的价值就出来了。历史数据可以用免费源,但盘中实时监控需要一个稳定、格式统一的接口。不然你美股用一个SDK、A股用另一个,代码维护成本会吃掉你做策略的时间。
做AH股溢价、中美比价这类跨市场价差策略
这类策略需要同时拿两个市场的实时价格,时间戳一致性很重要。用两个不同接口的数据,时间戳对不上,算出来的价差不准。统一接口的好处是两边的数据来自同一个服务,时间戳一致性好很多。
准备长期实盘
生产环境不要只有一个行情源。主数据源负责实时决策,备用数据源负责监控和故障切换,券商成交回报负责校准真实持仓。三个来源都不一致时,应暂停开仓,而不是猜哪个数字正确。
选型建议总结
预算接近零、还在学习阶段:用免费接口,先把研究流程和本地数据仓库跑通。
主要研究单市场日频因子和财务数据:用单市场的专业历史接口做研究主库,免费接口补充缺失字段。
做跨市场对比、AH溢价、多市场实时监控:重点测试统一格式的实时行情API,用历史主库补齐长期样本。
个人量化的数据源终极选型,不是选最贵的,也不是选接口最多的,而是选一个与你的策略频率匹配、能够被验证、发生故障时还能退出的系统。
数据决定回测是否可信,风控决定实盘能活多久。策略代码,反而常常是最容易的那一部分。
接口的具体参数和返回字段说明,可以参考官方文档对照着写,比自己猜参数靠谱多了。
GitHub:https://github.com/itick-org/
本作品采用《CC 协议》,转载必须注明作者和本文链接
关于 LearnKu