股票行情API是金融科技领域常见的应用之一,但今天介绍的是实时数据接口,它和普通的行情接口的区别主要在于数据的实时性,基本搞量化交易的都会用到。我们对国内外比较知名的实时接口做了详细的对比测评,可以直接看以下结果:
1、Alpha Vantage
Alpha Vantage是YCombinator孵化的项目,在国外量化圈的知名度比较高,它支持多个市场,包括股票、指数、外汇和加密货币等。缺点是只支持HTTP,没有WebSocket订阅。
价格:149.99美金/月,无HTTP请求次数限制
2、Infoway
Infoway API提供了港股、美股、A股、外汇、期货、加密货币的实时报价与历史数据拉取,它的优点是有免费套餐,而且同时支持HTTP和Websocket,个人和企业都能用。详情请查看Infoway API官网
3、Yahoo Finance API
老牌的股票行情API,数据齐全,但延时非常高。
价格:35美金/月,每个月15万次HTTP请求(没有WS订阅)
4、IEX Cloud
IEX Cloud是一个专注于美国市场的股票行情API,提供HTTP+Websock订阅,但价格太贵。
价格:1500美金/月,不包含历史数据,历史数据要加200刀。
6、Xignite
Xignite是面向B端的产品,它的优点是数据覆盖面广,提供了全球范围内的资产类别,包括股票、债券、期货、外汇等都有。但如果没有美国公司主体是无法申请的。
价格:$12000/年,包含一年的历史数据,5年数据$17000/年。注意是美金,价格很贵。
7、Intrinio
Intrinio也是面向企业客户的,个人或者没有资质无法申请,而且只有纳斯达克的数据,所以比Xignite要便宜。
价格:美股实时数据$2100/年,不包含历史数据。高频数据接口$6000刀一年。
股票API接口如何选?
首先看你的查询方法,获取实时行情可以通过HTTP请求或者WS订阅。这两者的主要区别是频次和延迟。HTTP的请求频次是有限制的,延时会高一点,适合用来拉取一些历史数据、日K线等,而WS是长连接,只要连接没有断开(你可以向服务端发送心跳保持连接),行情价格有更新会直接推送过来,适合用来做实盘交易。而我们上面提到的产品中,并不是每家都支持websocket。所以挑选行情API时最好搞清楚你需要使用哪种查询方式,如果不确定,那无脑选择两种都支持的。
【推荐阅读】Java接入实时外汇行情API - 原创教程
要注意请求频率
此外,也要看你的请求频率,各家的接口一般都会对查询频率做限制,否则服务器会绷不住。比如HTTP请求,一般会限制一分钟60次,也就是理论上来说一秒可以查一次,但是有些服务商会对每天的请求数量做个上限,比如Alpha Vantage,一天是10万次请求就封顶了。如果你请求得比较频繁,建议选择限制比较宽松的,比如Infoway API,最高能一分钟1200次请求,不设每日上限。
对于WebSocket连接,各家的限制也不一样,一般是限制一个连接能订阅的股票数量,比如IEX Cloud只运行一个WS查询10个股票,Infoway API根据套餐不同可支持50-500个。
代码示例
下面给出HTTP和WS订阅的代码示例,供各位参考。
HTTP请求
import requests
api_url = 'https://data.infoway.io/stock/batch_kline/1/10/002594.SZ%2C00285.HK%2CTSLA.US'
# 请先在官网申请免费Token: https://infoway.io
# 详细对接文档:https://docs.infoway.io
# 设置请求头
headers = {
'User-Agent': 'Mozilla/5.0',
'Accept': 'application/json',
'apiKey': 'yourApikey'
}
# 发送GET请求
response = requests.get(api_url, headers=headers)
# 输出结果
print(f"HTTP code: {response.status_code}")
print(f"message: {response.text}")
Websocket
import asyncio
import json
import websockets
WS_URL = "wss://data.infoway.io/ws?business=crypto&apikey=yourApikey"
# 请先在官网申请免费Token: https://infoway.io
# 详细对接文档:https://docs.infoway.io
async def connect_and_receive():
async with websockets.connect(WS_URL) as websocket:
# 发送初始消息
init_message = {
"code": 10000,
"trace": "01213e9d-90a0-426e-a380-ebed633cba7a",
"data": {"codes": "BTCUSDT"}
}
await websocket.send(json.dumps(init_message))
# 设置ping任务
async def send_ping():
while True:
await asyncio.sleep(30)
ping_message = {
"code": 10010,
"trace": "01213e9d-90a0-426e-a380-ebed633cba7a"
}
await websocket.send(json.dumps(ping_message))
# 启动ping任务协程
ping_task = asyncio.create_task(send_ping())
try:
# 持续接收消息
while True:
message = await websocket.recv()
print(f"Message received: {message}")
except websockets.exceptions.ConnectionClosedOK:
print("Connection closed normally")
finally:
# 取消ping任务
ping_task.cancel()
# 运行主函数
asyncio.run(connect_and_receive())
常见问题
是否有完全免费的接口?
如果是延时接口,是有免费的,比如雅虎的yfinance,数据量比较全面,但是行情数据并非实时,一般存在5-10分钟的延迟。如果是做量化研究,yfinance完全可以满足要求。而实盘交易,或者是交易所,则不建议使用免费的接口。商用的实时接口一般有提供免费试用,可以先从试用开始。
个人是否能开商用接口?
个人使用的话建议避开Xignite和Intrinio,这两个都只服务企业客户,个人是无法通过他们的审核的。如果不想走麻烦的审核流程,可以选择Infoway API,也能商用,无需审核。
有没有能查询多个市场的接口?
Infoway API可以查询多个市场,包含A股,港股,美股,外汇,加密货币,商品期货等。一个接口就能查询多个市场。具体教程可以看这篇文章。
Top comments (0)