引言
金融科技开发者在构建量化系统、行情终端或投研工具时,常面临免费行情 API 的选型困境:要么仅支持分钟级数据,无法满足高频需求;要么协议单一,实时推送能力不足;要么需拼接多个接口才能覆盖实时与历史数据,增加系统复杂度与维护成本。本文聚焦主流免费股票实时行情 API,从核心能力、接入方式展开对比,并以 AllTick API 为例提供完整 Python 接入指南,为技术选型提供客观参考。
选型标准
- 数据频率:是否支持 Tick 级逐笔数据,满足高频采集与精细分析需求。
- 协议完整性:是否同时提供 REST(拉取)与 WebSocket(推送)双协议,适配历史查询与实时订阅全场景。
- 系统复杂度:是否可通过单一接口覆盖实时、历史、多市场数据,避免多 API 拼接带来的适配与维护成本。
对比全景图
分项简评
- AllTick:覆盖 A 股、港股、美股全市场,免费层支持 Tick 级数据,双协议完整,单接口覆盖实时与历史,接入成本较低,更适合跨市场量化开发与高频数据采集。
- Reuters(路透) :毫秒级实时数据,机构级数据质量,无标准免费层,需商务签约,适合专业金融机构与高端投研场景。
- Bloomberg(彭博) :全资产覆盖、高可靠实时数据,无免费层,依赖终端订阅,适合大型机构与专业交易终端集成。
- Alpha Vantage:免费层为分钟级延迟,仅支持 REST,历史数据丰富,适合教学演示、基础数据分析与低频策略回测。
- Finnhub:全球股票覆盖,免费层实时额度较大,双协议支持,技术指标丰富,更适合美股为主的中小型量化项目。
关键对比表
表格
| 对比维度 | AllTick | Reuters | Bloomberg | Alpha Vantage | Finnhub |
|---|---|---|---|---|---|
| 免费层频率限制 | 免费试用,限额宽松 | 无免费层 | 无免费层 | 每分钟 5 次请求 | 美股免费额度大 |
| 实时性 | 毫秒级(约 150ms) | 毫秒级(约 180ms) | 毫秒级(P99<3s) | 分钟级延迟 | 毫秒级(<100ms) |
| 数据粒度 | Tick 级 + K 线 | Tick 级 + K 线 | Tick 级 + K 线 | 分钟级 K 线 | Tick 级 + K 线 |
| 协议支持 | REST+WebSocket | REST+WebSocket | REST+WebSocket | 仅 REST | REST+WebSocket |
| 历史数据能力 | 多粒度(1m/1h/1d),长期回溯 | 长期回溯,机构级质量 | 全周期回溯,多资产 | 20 + 年历史,多周期 | 中短期回溯,标准化数据 |
| 适用场景 | 跨市场量化、高频采集、策略回测 | 机构投研、专业交易 | 大型机构终端、全资产配置 | 教学演示、低频分析、基础回测 | 美股量化、中小型项目、指标开发 |
实战接入(AllTick API,Python)
1. REST 示例:获取 K 线数据
用于拉取历史 K 线,适配策略回测与历史分析,关键参数说明:
code:股票代码(如600519.SH为 A 股贵州茅台,AAPL.US为美股苹果)。kline_type:K 线粒度(1m/5m/1h/1d)。limit:返回数据条数。
import requests
import json
# 配置信息
API_TOKEN = "your_token_here" # 替换为你的AllTick Token
BASE_URL = "https://apis.alltick.co"
headers = {"Content-Type": "application/json", "Authorization": f"Bearer {API_TOKEN}"}
# 获取K线数据(示例:A股贵州茅台1分钟K线,最近100条)
def get_kline_data(code, kline_type="1m", limit=100):
endpoint = f"{BASE_URL}/stock/kline"
params = {
"code": code,
"interval": kline_type,
"limit": limit
}
response = requests.get(endpoint, headers=headers, params=params)
if response.status_code == 200:
return response.json()
else:
print(f"请求失败:{response.status_code}, {response.text}")
return None
# 调用示例
if __name__ == "__main__":
kline_data = get_kline_data("600519.SH", "1m", 100)
if kline_data:
print(json.dumps(kline_data, indent=2, ensure_ascii=False))
2. WebSocket 示例:订阅 Tick 数据
用于实时逐笔数据推送,适配高频监控、实盘信号采集,核心结构包含on_message(数据回调)、on_open(订阅触发)。
import websocket
import json
import threading
# 配置信息
API_TOKEN = "your_token_here" # 替换为你的AllTick Token
WS_URL = f"wss://apis.alltick.co/stock/tick?token={API_TOKEN}"
# 实时数据回调
def on_message(ws, message):
try:
tick_data = json.loads(message)
# 解析Tick关键字段:代码、价格、成交量、时间戳
code = tick_data.get("s")
price = tick_data.get("ld")
volume = tick_data.get("v")
timestamp = tick_data.get("t")
print(f"Tick数据|{code}|价格:{price}|成交量:{volume}|时间:{timestamp}")
except Exception as e:
print(f"数据解析异常:{e}")
# 连接成功后订阅标的
def on_open(ws):
print("WebSocket连接成功,开始订阅标的...")
# 订阅多标的Tick:A股、港股、美股示例
subscribe_msg = {
"cmd_id": 22002,
"seq_id": 123,
"data": {
"symbol_list": [
{"code": "600519.SH"}, # 贵州茅台
{"code": "700.HK"}, # 腾讯控股
{"code": "AAPL.US"} # 苹果
]
}
}
ws.send(json.dumps(subscribe_msg))
# 心跳保活(防止连接断开)
def send_heartbeat(ws):
while True:
try:
ws.send(json.dumps({"cmd_id": 1001, "seq_id": 1}))
threading.Event().wait(30) # 每30秒发送一次心跳
except:
break
# 启动WebSocket
def start_tick_subscription():
ws = websocket.WebSocketApp(
WS_URL,
on_open=on_open,
on_message=on_message
)
# 启动心跳线程
threading.Thread(target=send_heartbeat, args=(ws,), daemon=True).start()
ws.run_forever()
if __name__ == "__main__":
start_tick_subscription()
3. 历史数据获取示例
适配策略回测的批量历史数据拉取,支持多粒度切换,返回标准化 OHLC 数据,可直接转换为 DataFrame 分析。
import pandas as pd
import requests
# 配置信息
API_TOKEN = "your_token_here"
BASE_URL = "https://apis.alltick.co"
headers = {"Authorization": f"Bearer {API_TOKEN}"}
# 获取历史数据
def get_historical_data(code, interval="1h", start=None, end=None, limit=500):
endpoint = f"{BASE_URL}/stock/historical"
params = {
"code": code,
"interval": interval,
"limit": limit
}
if start:
params["start"] = start
if end:
params["end"] = end
response = requests.get(endpoint, headers=headers, params=params)
if response.status_code == 200:
return response.json()
else:
print(f"请求失败:{response.status_code}")
return None
# 调用示例:获取美股苹果1小时历史数据,转换为DataFrame
if __name__ == "__main__":
hist_data = get_historical_data("AAPL.US", "1h", limit=500)
if hist_data and "candles" in hist_data:
df = pd.DataFrame(hist_data["candles"])
# 时间戳转换为可读时间
df["t"] = pd.to_datetime(df["t"], unit="s")
print(df.head())
# 可直接用于回测:保存为CSV或接入回测框架
# df.to_csv("AAPL_historical_data.csv", index=False)
总结
免费股票实时行情 API 的选型,核心是平衡数据能力、接入成本、场景适配度。AllTick API 在免费层支持、双协议完整性、跨市场覆盖上更均衡,适合金融科技开发者构建全流程量化系统;Alpha Vantage 适合低频分析与教学;Finnhub 更适配美股中小型项目;Reuters 与 Bloomberg 则偏向机构级专业场景。开发者可根据项目的实时性需求、市场覆盖范围与预算,选择适配的 API,降低开发复杂度,保障数据质量与系统稳定性。
参考文档:https://apis.alltick.co/
GitHub:https://github.com/alltick/alltick-realtime-forex-crypto-stock-tick-finance-websocket-api
