2、数据源与接入方式:主流数据提供商、API接入、WebSocket与RESTful

做港股Level2行情,第一步不是写代码,而是搞清楚数据从哪来。

我刚开始接触这个领域时,以为直接连港交所就行了。后来发现,事情没那么简单。港交所的原始数据流,普通人根本拿不到。你得通过持牌的数据服务商来中转。

说白了,这就是个「数据批发」的生意。港交所把原始行情卖给几家一级服务商,服务商再加工、分发给我们这些量化玩家。

2.1 主流数据提供商:谁家的数据靠谱?

目前港股Level2行情市场,主要有三股势力。我分别说说我的使用感受。

提供商 数据源类型 延迟水平 费用(月) 我的评价
港交所(HKEX) 原始行情(OMD) < 10ms 极高(机构级) 最原始、最干净,但门槛太高
捷利(Jazzy) Level2 深度行情 50-100ms 中等 性价比之王,个人量化首选
万得(Wind) 综合金融数据 200-500ms 数据全,但行情延迟偏高

港交所(HKEX):这是源头。他们提供OMD(Orion Market Data)接口,延迟最低。但我个人不建议小团队直接对接。为什么?因为你需要租用港交所机房的托管服务器,年费动辄几十万港币。我见过一个私募朋友硬着头皮上了,结果运维成本比数据费还高。

捷利(Jazzy):这是香港本土的数据商,专注港股。我个人习惯用捷利的Level2数据做回测。他们的API设计得很「接地气」,文档清晰,支持WebSocket和RESTful两种方式。费用方面,个人版大概几百港币一个月,对于做策略研究来说,完全够用。

万得(Wind):国内金融圈的老大哥。数据覆盖面确实广,但行情延迟是个硬伤。如果你做的是T+0高频交易,万得的200ms延迟会让你抓狂。不过,如果你需要同时看A股、港股、美股,万得的一站式服务还是有价值的。

我的建议:做高频策略,优先考虑捷利或直接对接港交所OMD。做中低频或回测研究,万得也够用。别为了省几百块钱,选了不靠谱的小数据商——数据断流一次,你的策略可能就崩了。

2.2 API接入方式:RESTful vs WebSocket

接入方式就两种:RESTful和WebSocket。很多人搞不清什么时候该用哪个。我简单说说。

RESTful API:就是「你问一句,它答一句」。你发一个HTTP请求,它返回当前快照数据。适合做历史数据查询、盘后分析、定时任务。

WebSocket:是「长连接,持续推送」。你连上后,服务器有变化就主动推给你。适合做实时行情监控、高频交易。

为什么会这样?因为RESTful每次请求都要建立TCP连接,开销大。WebSocket保持长连接,延迟低很多。

避坑指南:我曾经犯过一个错误——用RESTful去轮询Level2逐笔成交数据。结果每秒请求几百次,直接被服务商封了IP。后来改成WebSocket,问题就解决了。记住:实时行情用WebSocket,历史数据用RESTful

2.3 WebSocket实时流:代码实战

以捷利数据为例,我写一个简单的WebSocket订阅代码。嗯,这里要注意,连接前需要先获取token。

import websocket
import json

# 捷利WebSocket地址(示例)
WS_URL = "wss://api.jazzy.hk/v2/ws"
TOKEN = "your_token_here"

def on_message(ws, message):
    data = json.loads(message)
    # 处理行情数据
    print(f"股票: {data['code']}, 最新价: {data['last_price']}")

def on_error(ws, error):
    print(f"连接异常: {error}")

def on_close(ws, close_status_code, close_msg):
    print("连接关闭")

def on_open(ws):
    # 订阅腾讯控股的Level2行情
    subscribe_msg = {
        "action": "subscribe",
        "channels": ["quote"],
        "codes": ["00700"]
    }
    ws.send(json.dumps(subscribe_msg))
    print("订阅成功")

# 启动连接
ws = websocket.WebSocketApp(
    WS_URL,
    on_open=on_open,
    on_message=on_message,
    on_error=on_error,
    on_close=on_close
)
ws.run_forever()

这段代码的核心逻辑很简单:建立连接 → 发送订阅请求 → 接收推送数据。你想想看,整个流程其实就三步。但实际生产环境中,你需要处理断线重连、心跳维持、数据去重等问题。

2.4 RESTful快照:什么时候用?

RESTful快照适合做「看一眼」的操作。比如你开盘前想拉一下所有持仓股的盘口数据,用RESTful就比WebSocket方便。

import requests

# 捷利RESTful快照接口(示例)
url = "https://api.jazzy.hk/v2/snapshot"
params = {
    "codes": "00700,09988,03690",
    "fields": "last_price,bid,ask,volume"
}
headers = {
    "Authorization": f"Bearer {TOKEN}"
}

response = requests.get(url, params=params, headers=headers)
data = response.json()

for stock in data['data']:
    print(f"{stock['code']}: 买一价{stock['bid']}, 卖一价{stock['ask']}")

我个人习惯在策略启动前,先用RESTful拉一次全量快照,初始化状态。然后切换到WebSocket接收增量更新。这样既保证了初始数据的完整性,又降低了实时延迟。

注意:RESTful接口通常有频率限制。捷利的免费版限制每秒5次请求,付费版每秒30次。别超了,超了会被限流。我曾经在压力测试时没注意这个限制,结果整个策略停了10分钟。

2.5 知识体系总览

下面这张图,是我梳理的本章核心逻辑。数据从港交所出发,经过服务商加工,最终通过两种方式到达你的策略引擎。

港股Level2行情数据流架构 港交所 OMD 数据服务商(捷利、万得等) WebSocket 实时流 RESTful 快照 量化策略引擎 / 实时监控系统

从这张图你可以看到,数据流是单向的、分层的。每一层都有它的职责和瓶颈。我个人建议,如果你刚开始做港股量化,先从「捷利+WebSocket」这个组合入手。成本低,上手快,等策略跑通了再考虑升级到港交所直连。

核心要点回顾:

  • 港交所是数据源头,但门槛高;捷利性价比高,适合个人;万得数据全但延迟大
  • 实时行情用WebSocket,历史数据/快照用RESTful
  • WebSocket需要处理断线重连和心跳,RESTful要注意频率限制
  • 生产环境建议:RESTful初始化 + WebSocket增量更新

嗯,数据源和接入方式就聊到这。下一节我们会深入Level2行情的数据结构,看看那些逐笔成交、十档盘口到底长什么样。


专注资料整理