利用Infoway API接入实时股票行情API的方法

5 阅读5分钟

随着金融科技的发展,越来越多的投资者、交易平台和量化交易团队开始使用股票行情API来获取市场数据。然而,很多人虽然听说过行情API,却并不清楚不同类型的接口之间有何区别,适合用于哪些场景。本文将系统地介绍几种常见的股票行情接口,帮助您建立对行情API的全面理解。

一、延迟行情接口(主流平台的默认选择)

延迟行情(Delayed Market Data)是最普遍、成本最低的行情接口形式。其核心特征是存在时间延迟,通常为15分钟。这意味着,当你在查看一只股票的价格时,实际成交可能已经发生在15分钟前。

这种数据类型广泛应用于:

  • 投资者教育平台
  • 免费的行情展示网站
  • 证券公司App的普通行情模块(如雪球、同花顺等)

延迟行情对普通散户投资者来说已经足够使用,但对于需要及时决策的量化交易者、套利系统或高频交易场景来说,这类数据明显滞后,不具备实战价值。

二、实时行情接口:量化交易专用

实时行情接口(Real-Time Market Data API)是专业交易系统必不可少的组成部分。该接口可以提供毫秒级更新的市场数据,涵盖以下常见字段:

  • 实时价格(Last Price)
  • 实时成交量(Volume)
  • 涨跌幅、涨跌额
  • 委买委卖盘数据(可选)

实时数据的价值主要体现在:

  • 量化交易与高频交易:策略对数据延迟极其敏感,实时性直接影响盈利能力。
  • 自动化交易系统:用于触发买卖信号,实现毫秒级下单。
  • 智能投顾与算法模型:模型需要即时反馈市场变化做出响应。

值得注意的是,实时行情往往涉及更高的数据费用和技术门槛,需要考虑数据许可和合规问题。

三、历史行情接口

历史行情接口(Historical Market Data API)用于获取某一资产过去特定时间段内的市场表现。典型的数据字段包括:

  • 开盘价(Open)
  • 收盘价(Close)
  • 最高价(High)
  • 最低价(Low)
  • 成交量(Volume)
  • 调整收盘价(Adjusted Close)

主要应用场景包括:

  • 策略回测:验证某一量化策略在过去市场中的表现。
  • 技术分析:构建技术指标,如MACD、RSI、均线等。
  • 因子研究:提取基本面、情绪面或技术因子进行选股模型开发。

高质量的历史数据是构建稳健交易系统的基础,其准确性与完整性尤为重要。

四、聚合实时行情接口:跨市场、多资产的一体化数据服务

在更专业的应用场景中,实时聚合行情接口(Real-Time Aggregated Market Data API)应运而生。该类接口不仅提供单一市场的实时数据,更支持跨资产类型、跨市场的一站式数据获取。

主要特征包括:

  • 多市场支持:股票、外汇、期货、加密资产等
  • 多品种聚合:统一接口获取多个标的
  • 深度数据整合:Level 2订单簿、逐笔成交(Tick-by-Tick)

应用场景主要包括:

  • 跨市场套利策略:需要同时获取多个市场的价格数据进行比较与交易。
  • 全球量化交易平台:在一个策略框架中集成多个国家的金融市场。
  • 终端资讯系统:为投资者提供全资产数据聚合视图。

实时聚合接口是机构级客户的首选,但同时也对数据处理能力、网络性能和授权合规提出更高要求。

五、代码示例

下面我们展示的是实时聚合行情接口Infoway API的调用示例,使用前请在官网申请免费的API Key。

HTTP请求

import requests

api_url = 'https://data.infoway.io/stock/batch_kline/1/10/002594.SZ%2C00285.HK%2CTSLA.US'

# 设置请求头
# 需在官网申请免费API Key: www.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

# 美股行情的websocket订阅地址
WS_URL = "wss://data.infoway.io/ws?business=stock&apikey=yourApiKey"

# 请先在官网https://infoway.io 申请免费API key

async def connect_and_receive():
    async with websockets.connect(WS_URL) as websocket:
        # 发送初始化消息,这里订阅的是苹果股票的1分钟K线数据
        init_message = {
            "code": 10004,  # K线请求协议号
            "trace": "423afec425004bd8a5e02e1ba5f9b2b0",  # 可追溯ID(随机字符串)
            "data": {
                "arr": [
                    {
                        "type": 1,  # 1分钟K线
                        "codes": "AAPL"  # 订阅的股票代码
                    }
                ]
            }
        }
        await websocket.send(json.dumps(init_message))

        # 设置ping任务
        async def send_ping():
            while True:
                await asyncio.sleep(30)
                ping_message = {
                    "code": 10010,
                    "trace": "423afec425004bd8a5e02e1ba5f9b2b0"
                }
                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())

返回示例

{
    "c": "150.00",         // 当前价格
    "h": "150.20",         // 最高价
    "l": "149.80",         // 最低价
    "o": "149.90",         // 开盘价
    "pca": "0.00",         // 价格变化
    "pfr": "0.00%",        // 价格变化百分比
    "s": "AAPL",           // 股票代码
    "t": 1747550648097,    // 时间戳
    "ty": 1,               // K线类型:1 表示1分钟K线
    "v": "0.34716",        // 交易量
    "vw": "35923.5149678"  // 加权平均价格
}