拒绝轮询!用 Python + WebSocket 打造实时港股行情看板

22 阅读2分钟

作为一名兼职做量化的后端开发,我对数据的实时性有洁癖。看着控制台里不断跳动的 Log,才有一种掌控市场的安全感。今天分享一下如何用 Python 优雅地搞定港股实时数据。

Why WebSocket? HTTP 请求是“请求-响应”模式,Header 开销大,延迟高。而 WebSocket 是全双工通信,一旦建立连接,服务器有新行情直接推过来,这就好比“你可以不买,但我必须得吆喝”。对于股价这种毫秒级变动的数据,WebSocket 是唯一正解。

数据源的选择: 不要试图去解析网页端的 WebSocket 协议,那个加密参数能让你逆向到头秃。专业的事交给专业的 API。我目前项目里挂的是 AllTick API,主要是看中它的 API 设计比较符合 RESTful 和 Websocket 的现代标准,对接起来没什么心智负担。

核心逻辑实现: 我们将使用 websocket-client 这个库。这里有个 trick:为了避免阻塞,我们最好配合 threading 或者 multiprocessing 来处理数据展示。

代码时刻: 以下代码展示了如何订阅一个 Token 并实时打印价格变动:

Python

import websocket
import json
 
def on_message(ws, message):
    data = json.loads(message)
    print(data)
 
def on_error(ws, error):
    print(error)
 
def on_close(ws, close_status_code, close_msg):
    print("Closed")
 
def on_open(ws):
    print("Connected to the WebSocket")
 
ws_url = "wss://api.alltick.co/realtime/marketdata"
ws = websocket.WebSocketApp(ws_url, on_message=on_message, on_error=on_error, on_close=on_close)
ws.on_open = on_open
ws.run_forever()

def process_data(data):
    symbol = data['symbol']
    price = data['price']
    change = data['change']
    print(f"Stock: {symbol}, Price: {price}, Change: {change}%")
 
def on_message(ws, message):
    data = json.loads(message)
    process_data(data)

性能优化(进阶): 如果你订阅了上百只股票,单纯的 print 肯定不行。建议引入 Redis

  • WebSocket 进程只负责写 Redis。
  • Web/UI 进程从 Redis 读数据渲染前端。 这样就把IO密集型任务和计算/渲染密集型任务解耦了。

希望这个 Demo 能帮你快速搭建起自己的行情监控系统!

Gemini_Generated_Image_8stqw68stqw68stq.jpg