Python如何快速接入聚合數(shù)據(jù)行情API
聚合数据行情API,指的是一个接口即可提供多个不同交易品种的行情数据查询,这种接口,可以让你同时查询A股、美股、外汇等多种资产的行情数据。无论你需要实时获取某个品种的报价,还是需要获取历史数据,API都能为你提供丰富的资源。今天,我将分享如何用Python来调用infoway API。
一、批量查询K线
查询多个交易品种的实时K线数据非常简单。查询的地址结构如下:
https://data.infoway.io/common/batch_kline/{klineType}/{klineNum}/{codes}
其中,URL包含了三个主要部分,分别是klineType
、klineNum
和codes
。我们来逐个详细解析这些部分的含义。
1.1 klineType
(K线时间类型)
klineType
表示你想要查询的K线的时间间隔(即每根K线的时间跨度)。不同的时间跨度对应着不同的klineType
值,具体说明如下:
类型 | 描述 |
---|---|
1 | 1分钟k线 |
2 | 5分钟k线 |
3 | 15分钟k线 |
4 | 30分钟k线 |
5 | 1小时k线 |
6 | 2小时k线 |
7 | 4小时k线 |
8 | 1日k线 |
9 | 1周k线 |
10 | 1月k线 |
11 | 1季k线 |
12 | 1年k线 |
根据你的需求,选择相应的klineType
来指定你想要查询的K线类型。例如,如果你想查询5分钟K线数据,klineType
应设置为2
。
1.2 klineNum
(K线数量)
klineNum
表示你想要查询的K线数量。该参数允许你指定查询多少根K线,最大支持500根K线。例如,如果你需要获取过去500根1分钟K线数据,klineNum
应设置为500
。
1.3 codes
(交易品种代码)
codes
部分包含了你需要查询的多个交易品种代码,多个交易品种代码之间通过%2C
(逗号的URL编码)进行分隔。每个交易品种代码代表一个资产类别的标识符,如 USDCNY
(美元对人民币)、XAUAUD
(黄金对澳元)等。
你可以查询多个交易品种的数据,只需要在codes
中列出所有品种代码,并使用逗号分隔。例如,查询 USDCNY
、XAUAUD
和 CN50
三个交易品种的K线数据,codes
应设置为 USDCNY%2CXAUAUD%2CCN50
。
1.4 代码示例:
import requests
# 设置API的URL,查询多个交易品种的实时K线数据
url = "https://data.infoway.io/common/batch_kline/1/10/USDCNY%2CXAUAUD%2CCN50"
# 设置请求头,包含密钥,可以在官网https://infoway.io申请
headers = {
'User-Agent': 'Mozilla/5.0',
'Accept': 'application/json',
'apiKey': 'yourApikey' # 请替换为你实际的API Key
}
# 发送GET请求
response = requests.get(url, headers=headers)
# 输出HTTP响应状态和返回的内容
print(f"HTTP code: {response.status_code}")
print(f"message: {response.text}")
# 如果请求成功,进一步解析返回的JSON数据
if response.status_code == 200:
data = response.json() # 解析JSON响应内容
for item in data['data']:
print(f"交易品种: {item['s']}")
for kline in item['respList']:
print(f"时间戳: {kline['t']}, 开盘价: {kline['o']}, 最高价: {kline['h']}, 最低价: {kline['l']}, 收盘价: {kline['c']}, 成交量: {kline['v']}, 加权平均价: {kline['vw']}")
else:
print("请求失败,无法获取数据")
返回结果如下:
{
"ret": 200,
"msg": "success",
"traceId": "43fe7163-abb2-4a59-b6b2-2af4dc8c4141",
"data": [
{
"s": "XAUAUD",
"respList": [
{
"t": "1750177320",
"h": "5190.07400",
"o": "5187.17600",
"l": "5187.17600",
"c": "5190.07400",
"v": "7.0",
"vw": "36324.7220",
"pc": "0.07%",
"pca": "3.78600"
},
{
"t": "1750177260",
"h": "5187.41400",
"o": "5186.28800",
"l": "5186.28800",
"c": "5187.41400",
"v": "13.0",
"vw": "67425.1220",
"pc": "0.01%",
"pca": "0.52400"
}
]
},
{
"s": "USDCNY",
"respList": [
{
"t": "1750175580",
"h": "7.18400",
"o": "7.18400",
"l": "7.18400",
"c": "7.18400",
"v": "1.0",
"vw": "7.1840",
"pc": "0.00%",
"pca": "0.00030"
},
{
"t": "1750175280",
"h": "7.18370",
"o": "7.18370",
"l": "7.18370",
"c": "7.18370",
"v": "1.0",
"vw": "7.18370",
"pc": "0.00%",
"pca": "0.00010"
}
]
},
{
"s": "CN50",
"respList": [
{
"t": "1750177320",
"h": "13441.17000",
"o": "13441.17000",
"l": "13440.17000",
"c": "13440.17000",
"v": "2.0",
"vw": "26881.340",
"pc": "-0.01%",
"pca": "-2.00000"
},
{
"t": "1750177260",
"h": "13442.17000",
"o": "13442.17000",
"l": "13441.17000",
"c": "13441.17000",
"v": "2.0",
"vw": "26883.340",
"pc": "-0.01%",
"pca": "-1.00000"
}
]
}
]
}
二、WebSocket订阅行情数据
除了通过HTTP请求查询行情数据外,还可以使用WebSocket订阅实时行情数据。这种方式适合需要实时数据推送的场景,例如在量化交易系统中,你可以通过WebSocket持续接收市场行情数据,而不需要频繁地发送HTTP请求。
接下来,我们来看一下如何使用WebSocket来连接并订阅行情数据:
import asyncio
import json
import websockets
# WebSocket连接URL,包含API密钥
#密钥请在官网https://infoway.io申请
WS_URL = "wss://data.infoway.io/ws?business=crypto&apikey=yourApikey"
async def connect_and_receive():
async with websockets.connect(WS_URL) as websocket:
# 发送初始消息,订阅特定品种(此处是BTCUSDT)
init_message = {
"code": 10000,
"trace": "01213e9d-90a0-426e-a380-ebed633cba7a",
"data": {"codes": "BTCUSDT"}
}
await websocket.send(json.dumps(init_message))
# 设置ping任务,定期发送ping消息保持连接
async def send_ping():
while True:
await asyncio.sleep(30) # 每30秒发送一次ping消息
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:
# 持续接收WebSocket返回的消息
while True:
message = await websocket.recv()
print(f"Message received: {message}")
except websockets.exceptions.ConnectionClosedOK:
print("Connection closed normally")
finally:
# 取消ping任务
ping_task.cancel()
# 启动主协程来运行WebSocket连接
asyncio.run(connect_and_receive())
2.1 WebSocket连接URL:
WS_URL = "wss://data.infoway.io/ws?business=crypto&apikey=yourApikey"
这个URL是WebSocket的连接地址,其中business=crypto
表示我们需要订阅加密货币的行情数据(你可以根据实际需求修改这个参数),apikey=yourApikey
是你的API密钥,必须替换为你自己的API密钥。
2.2 发送初始订阅消息:
我们需要发送一条初始消息来指定需要订阅的品种,在这个例子中我们订阅的是BTCUSDT
。消息格式如下:
{
"code": 10000,
"trace": "01213e9d-90a0-426e-a380-ebed633cba7a",
"data": {"codes": "BTCUSDT"}
}
这里的code
是消息类型,trace
是消息的跟踪ID,data
中包含我们需要订阅的品种代码(此处是BTCUSDT
)。
2.3 发送ping消息:
为了保持WebSocket连接活跃,我们定期发送ping消息。WebSocket连接在不活跃时可能会被关闭,因此我们每隔30秒发送一次ping消息。格式如下:
{
"code": 10010,
"trace": "01213e9d-90a0-426e-a380-ebed633cba7a"
}
2.4 接收实时消息:
在主循环中,程序通过await websocket.recv()
持续接收从WebSocket服务器推送的实时数据。每当接收到数据时,我们会打印出来。可以根据自己的需求处理这些数据,例如提取行情信息、执行交易决策等。
2.5 异常处理与关闭连接:
如果连接被正常关闭,websockets.exceptions.ConnectionClosedOK
异常会被捕获,程序会输出"Connection closed normally"。
最后,我们取消了ping_task
任务,以确保关闭WebSocket连接时能正常清理资源。
2.6 使用asyncio运行:
由于WebSocket是异步的,因此我们使用asyncio.run(connect_and_receive())
来运行整个协程。
共同學(xué)習(xí),寫下你的評論
評論加載中...
作者其他優(yōu)質(zhì)文章