利用 WebSocket 技术构建实时金融数据应用

·

在当今快速变化的金融环境中,实时数据已成为开发高效应用的关键要素。借助 WebSocket 技术,开发人员能够建立双向、低延迟的数据通信通道,为股票、ETF 和加密货币等多种资产提供持续更新的信息流,从而打造流畅且响应迅速的用户体验。

WebSocket 支持服务端与客户端之间的全双工通信,避免了传统轮询方式的延迟与资源浪费,特别适合对实时性要求极高的金融场景。


WebSocket 连接与授权

建立 WebSocket 连接时,需通过 apikey 参数进行身份验证。只需在连接地址中附加有效的 API 密钥,即可获得数据访问权限。

示例连接地址格式如下:

wss://ws.finazon.io/v1?apikey=你的API密钥

连接成功后,即可开始订阅各类金融市场数据。


服务限制说明

使用 WebSocket 接口时,需注意以下默认限制:

若您的应用需要更高限制,可联系技术支持申请调整。


快速开始:订阅实时数据

以下是一个使用 Python 连接并订阅实时数据的示例。该示例演示了如何订阅 OKX 数据集上的 BTC/USDT 交易对的分钟 K 线数据。

首先,确保安装必要的库:

pip install websocket-client rel

随后,使用以下代码建立连接并订阅数据:

import json
import rel
import websocket

dataset = 'okx'
tickers = ['BTC/USDT']
api_key = '你的API密钥'

def on_message(wsapp, message):
    print(f'收到消息: {message}')

def on_error(wsapp, error):
    print(f'发生错误: {error}')

def on_close(wsapp, close_status_code, close_msg):
    print('连接已关闭')

def on_open(wsapp):
    print('连接已开启')
    subscribe(wsapp, dataset, tickers)

def subscribe(wsapp, dataset, tickers):
    sub_request = {
        'event': 'subscribe',
        'dataset': dataset,
        'tickers': tickers,
        'channel': 'bars',
        'frequency': '1s',
        'aggregation': '1m'
    }
    wsapp.send(json.dumps(sub_request))

if __name__ == '__main__':
    ws = websocket.WebSocketApp(f'wss://ws.finazon.io/v1?apikey={api_key}',
                                on_open=on_open,
                                on_message=on_message,
                                on_error=on_error)
    ws.run_forever(dispatcher=rel, reconnect=5, ping_interval=30, ping_timeout=10)
    rel.signal(2, rel.abort)
    rel.dispatch()

👉 获取实时金融数据流工具


订阅参数详解

发起订阅时,需在请求体中配置以下关键参数:

订阅请求示例

{
    "event": "subscribe",
    "dataset": "okx",
    "tickers": ["BTC/USDT", "INX/USDT"],
    "channel": "bars",
    "frequency": "1s",
    "aggregation": "1m",
    "request_id": 106
}

订阅成功响应

服务器返回成功响应,表示已接受订阅请求。

{
    "status": "success",
    "code": "SUCCESS_SUBSCRIPTION",
    "data": ["BTC/USDT", "INX/USDT"],
    "request_id": 106
}

K 线数据推送示例

订阅成功后,将收到如下格式的实时 K 线数据更新:

{
    "d": "okx",
    "p": "okx",
    "ch": "bars",
    "f": "1s",
    "aggr": "1m",
    "s": "BTC/USDT",
    "t": 1699540020,
    "o": 220.06,
    "h": 220.13,
    "l": 219.92,
    "c": 219.96,
    "v": 4572
}

各字段含义如下:


取消订阅与连接管理

如需取消订阅特定交易对的数据,可发送 unsubscribe 事件请求。

取消订阅请求

{
    "event": "unsubscribe",
    "dataset": "okx",
    "tickers": ["BTC/USDT"],
    "channel": "bars",
    "frequency": "1s",
    "aggregation": "1m",
    "request_id": 107
}

取消订阅响应

{
    "status": "success",
    "code": "SUCCESS_UNSUBSCRIPTION",
    "data": ["BTC/USDT"],
    "request_id": 107
}

心跳检测与连接保活

为确保连接活跃,客户端可定期向服务器发送心跳消息:

心跳请求

{
    "event": "heartbeat",
    "request_id": 108
}

心跳响应

{
    "event": "heartbeat",
    "status": "success",
    "request_id": 108
}

此外,WebSocket 协议本身支持 Ping/Pong 控制帧(操作码 0x9 和 0xA),可用于底层连接保活。客户端发送 Ping 帧后,服务器将回复一个包含相同数据负载的 Pong 帧。

重置所有订阅

发送 reset 事件可清除当前连接上的所有活跃订阅,服务器不会对此消息作出回复。

{
    "event": "reset",
    "request_id": 109
}

常见问题

WebSocket 连接是否支持历史数据获取?
WebSocket 主要用于传输实时数据流。如需获取历史数据,通常需配合使用专门的 RESTful API 接口。

连接意外断开后如何自动恢复?
示例代码中的 reconnect=5 参数设置了 5 秒重连延迟。在实际应用中,建议实现重连逻辑并处理连接状态变更,以确保业务的连续性。

如何选择合适的数据频率和聚合周期?
frequency 决定数据推送的频率,而 aggregation 决定如何聚合生成 K 线。例如,设置 frequency='1s'aggregation='1m' 表示每秒接收一次数据,但这些数据会被聚合计算为每分钟一根的 K 线。

订阅的交易对数量会影响性能吗?
从连接层面的消息数限制来看,订阅更多交易对会消耗更多消息额度。建议根据实际需求精选交易对,并优化客户端的数据处理逻辑。

除了K线,还能订阅哪些类型的数据?
除了 bars (K线),通常还可以订阅实时成交(trades)、订单簿深度(depth)等频道。具体可用的频道类型需查阅相应数据集的文档。

👉 探索更多实时数据策略与应用


WebSocket 技术为金融应用提供了强大的实时数据基础。通过稳定、高效的连接,开发者能够构建出高度响应、用户体验卓越的金融产品,实时捕捉市场变化。