Python如何快速接入聚合数据行情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值,具体说明如下:

根据你的需求,选择相应的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 asyncioimport jsonimport 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())来运行整个协程。