第二章:数据源接入——获取实时行情数据的常用接口
做量化交易,第一件事就是搞定数据。没有数据,策略就是空中楼阁。
我个人习惯把数据源分成两类:一类是免费开源的,比如 Tushare、AKShare;另一类是商业平台,比如聚宽、米筐。各有各的玩法,今天咱们重点聊聊实时行情怎么拿。
2.1 三大常用接口:Tushare、AKShare、聚宽
先说说我自己的选择逻辑。如果你只是做研究、回测,AKShare 完全够用,免费且数据全。但如果你要跑实盘,我建议用 Tushare Pro 或者聚宽——稳定性和速度更有保障。
| 接口 | 类型 | 实时行情 | 费用 | 我的评价 |
|---|---|---|---|---|
| Tushare Pro | HTTP RESTful | 支持(需积分) | 部分免费/付费 | 数据质量高,文档清晰 |
| AKShare | HTTP RESTful | 支持(免费) | 完全免费 | 适合研究,偶尔有延迟 |
| 聚宽(JoinQuant) | WebSocket + REST | 支持(实盘环境) | 按量付费 | 实盘首选,延迟低 |
避坑提醒:我曾经在 Tushare 上踩过一个坑——免费 token 的调用频率限制很严格,每秒只能请求 2 次。如果你写了个循环去拉全市场数据,直接就被封了。后来我改成用多线程+延时队列才解决。
2.2 WebSocket vs RESTful API——到底选哪个?
这个问题我经常被问到。说白了,两者最大的区别就一句话:谁主动。
- RESTful API:你问一句,它答一句。典型的「一问一答」模式。
- WebSocket:你连上后,它主动推数据给你。典型的「你躺着,它干活」模式。
为什么会这样?因为 HTTP 协议本身是无状态的,每次请求都要建立连接。而 WebSocket 是长连接,一旦建立,服务器可以随时把数据推过来。
我举个例子你就明白了。如果你要监控某只股票的逐笔成交,用 RESTful API 你得每秒轮询一次,不仅浪费带宽,还可能错过中间的数据。而 WebSocket 一连接,每笔成交都会实时推送给你。
我的建议:做盘口异动预警,必须用 WebSocket。RESTful 只适合拿历史数据或者做定时任务。我在实盘项目中,WebSocket 的延迟能做到 50ms 以内,RESTful 至少 200ms+。
2.3 数据格式解析:JSON 和 Pandas DataFrame
拿到数据后,怎么处理?嗯,这里要注意——大部分接口返回的都是 JSON 格式。
JSON 长这样:
{
"code": "000001",
"name": "平安银行",
"price": 12.35,
"volume": 1234567,
"timestamp": "2025-01-15 14:30:00"
}
看着挺直观对吧?但如果你要分析,JSON 不够方便。我习惯第一时间把它转成 Pandas DataFrame。
代码很简单:
import pandas as pd
import requests
# 拿数据
url = "http://api.tushare.pro/market/snapshot"
params = {"token": "你的token", "code": "000001"}
resp = requests.get(url, params=params)
# 转成 DataFrame
data = resp.json()
df = pd.DataFrame(data["data"]["items"], columns=data["data"]["columns"])
# 看一眼
print(df.head())
转成 DataFrame 后,你就可以用 Pandas 那一套强大的工具了——筛选、聚合、计算指标,都非常方便。
注意:不同接口返回的 JSON 结构不一样。Tushare 的返回格式是嵌套的,AKShare 的则扁平一些。我建议你每次拿到数据后,先打印一下原始 JSON,看看结构再写解析代码。我曾经因为没看结构,直接按固定索引取值,结果接口升级后全崩了。
2.4 本章知识体系总览
下面这张图是我自己画的,把数据源接入的核心逻辑串起来了。你一看就明白。
嗯,数据源这块其实不难,但细节很多。你想想看,如果连数据都拿不对,后面的策略分析全是白搭。所以这一章我讲得比较细,希望你一次就搞定。
一句话总结:选对接口(Tushare/聚宽),用对方式(WebSocket),解析对格式(DataFrame),你的实时行情数据就稳了。