如何接入实时股票行情接口?

7 阅读2分钟

实时股票行情接口是一种通过网络接口传输方式,向用户实时提供股市交易数据的技术工具。它通常由专业的数据服务商或交易所提供,用户可以通过编程方式连接接口,获取包括但不限于以下信息:

  • 最新成交价(last price)
  • 买卖盘口(bid/ask)
  • 成交量和成交额(volume/value)
  • 每笔成交记录(tick)
  • 实时K线图数据(K-line)

不同的数据供应商能提供的数据源是不一样的,有些只单独提供美股,而一些更专业的产品则可以覆盖更广泛的市场,包括外汇、期货等。

实时行情接口是如何工作的?

实时行情接口常用两种技术实现方式:

方式描述优点
HTTP轮询定时发起请求,获取最新数据实现简单,适合快照类查询
WebSocket推送与服务器建立连接,实时接收更新数据实时性强,适合高频数据接收

对于真正的实时场景,如交易系统、CFD平台、图表更新,WebSocket是主流选择。

HTTP和WebSocket的区别

以下是两者的详细对比:

项目HTTPWebSocket
实时性
适合用途快照、历史数据实时订阅、推送
延迟较高
服务端压力高(频繁请求)低(只推送变动)
编程复杂度简单略高,需要维持连接

如果你只是偶尔查询数据,首选HTTP,如果对实时性要求特别高,选WS订阅。

如何接入实时股票行情接口?

先按照这个地址申请一个免费token: Infoway.io

按照下面代码建立连接

HTTP查询

import requests
 
api_url = 'https://data.infoway.io/stock/batch_kline/1/10/002594.SZ%2C00285.HK%2CTSLA.US'
 
# 设置请求头
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"
 
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())