为了账号安全,请及时绑定邮箱和手机立即绑定

Python 基于 WebSocket 获取 XAGUSD 白银实时报价|贵金属行情采集完整实训方案

实训背景说明

在金融量化实训、大宗商品数据分析课程中,白银 XAG/USD 是高频教学标的。本次实训任务为搭建白银实时行情采集程序,用于课程内波动因子计算、短期价格回测、流动性指标统计。最开始我选用定时 HTTP 轮询方案完成基础演示,但实操后发现该方案无法适配白银高波动行情,存在数据缺失、接口限流等实训 bug。结合课程多次上机调试经验,对比轮询与 WebSocket 长连接两种方案,整理标准化实训流程、常见踩坑点与可直接用于作业的 Python 代码。

一、实训需求与两种采集方案对比

本次实训核心需求:持续获取白银逐笔成交 Tick,保证数据完整连续,支撑课堂 K 线合成、量化指标演算。实训中主要存在两种数据获取方式:

  1. HTTP 定时轮询(入门简易方案)课程初期入门演示会使用该方式,固定间隔调用接口拉取报价,但缩短刷新周期后会暴露明显缺陷:

  • 时效性不足:白银受美元、大宗商品消息影响波动剧烈,轮询采样会丢失关键价格拐点,回测作业结果失真;

  • 接口压力过大:若同步监控黄金、原油等多个品种,高频请求极易触发限流,实训程序频繁报错中断。

  1. WebSocket 长连接(课程推荐标准方案)将数据交互逻辑从客户端主动拉取,改为服务端主动推送,全程保持单条长连接,无重复无效请求,完美匹配贵金属实时行情实训需求,也是课后大作业、课程设计的最优实现方式。

二、贵金属 WebSocket 订阅标准化实训流程

主流贵金属行情 API 的长连接订阅流程统一,课堂上分为三步教学:

  1. 建立 WebSocket 持久连接;

  2. 组装订阅报文,指定标的代码与数据类型;

  3. 持续监听推送消息,解析价格、成交量、时间戳核心字段。

实训注意细节:部分接口区分XAG/USDXAGUSD两种标的格式,格式错误会直接订阅失败;推送数据分为 trade 逐笔成交、tick 盘口深度两类,基础行情实训选用 trade 类型即可。

三、上机实训高频踩坑点(课程重点提醒)

经过多轮课堂实操,整理三类极易导致实训数据断层的问题,也是课后作业高频扣分点:

  1. 剧烈行情下自动断连:非农、利率数据公布时段白银报价推送频次激增,无重连逻辑会直接中断数据流,作业出现大片空白数据;

  2. 缺少心跳保活逻辑:仅发送一次订阅指令,长时间无交互会被服务端主动断开连接,程序看似运行实则无新数据;

  3. 标的代码格式不匹配:混用XAG/USDXAGUSD,订阅请求无返回,初学者很难定位报错原因。

若忽略以上三点,回测、指标计算类实训作业会出现系统性数据偏差,作业得分大幅降低。

四、课程实训完整 Python 代码实现

课内实训统一使用 AllTick API 作为贵金属数据源,报文结构简洁,无需复杂鉴权逻辑,适配课堂快速调试、课后作业复刻。整体实现逻辑:初始化 WebSocket 客户端,连接成功后发送白银订阅指令,配置消息接收、异常捕获、连接关闭回调,实时打印成交数据。

实训可直接复制代码

import websocket
import json

# 接收并解析实时行情回调
def on_message(ws, msg):
    data = json.loads(msg)
    ticker = data.get("symbol")
    deal_price = data.get("price")
    trade_vol = data.get("volume")
    print(f"标的:{ticker} 实时价格:{deal_price} 单笔成交量:{trade_vol}")

# 连接创建后发送订阅指令
def on_open(ws):
    sub_payload = json.dumps({
        "action": "subscribe",
        "symbol": "XAGUSD",
        "type": "trade",
        "id": 1
    })
    ws.send(sub_payload)

# 捕获程序运行异常
def on_error(ws, err):
    print("长连接发生异常:", err)

# 监听连接关闭事件
def on_close(ws, code, info):
    print("WebSocket连接已中断")

if __name__ == "__main__":
    ws_client = websocket.WebSocketApp(
        url="wss://api.alltick.co/ws",
        on_open=on_open,
        on_message=on_message,
        on_error=on_error,
        on_close=on_close
    )
    ws_client.run_forever()

运行代码后持续输出白银逐笔成交信息,秒级更新行情,无重复请求,满足课程实时数据采集全部要求。

五、高阶拓展实训优化思路(课程加分拓展内容)

基础代码仅能实现基础数据接收,想要完成高分课程设计、长期不间断采集实训,可补充三层优化逻辑:

  1. 异步队列缓冲:新增独立消息队列缓存 Tick 数据,多线程分离接收与数据处理,避免高波动行情主线程阻塞丢数据;

  2. 心跳 + 自动重连封装:增加定时心跳报文,检测断连后自动重建连接并重新订阅,实现 7×24 小时稳定采集;

  3. 时间戳数据校验:通过时间戳连续性判断数据缺口,自动记录缺失时间段,方便回测实训补全数据。

白银波动频繁、流动性充足,拓展逻辑完善后,实训程序的数据完整性、稳定性会大幅提升,可作为课程设计亮点。

六、实训总结与方案选型建议

  1. 简易课堂演示、单次短时练习:可临时使用 HTTP 轮询,代码简单上手快;

  2. 量化回测、长期行情采集、期末课程设计:必须选用 WebSocket 长连接方案,保证数据连续无缺失。

实训核心知识点:贵金属行情 API 本质是持续数据流通道,而非单次查询接口。长连接方案是金融量化实训的标准采集方式,熟练掌握订阅、异常处理逻辑,是后续大宗商品、外汇策略实训的基础。


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
Python工程师
手记
粉丝
0
获赞与收藏
0

关注作者,订阅最新文章

阅读免费教程

  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

举报

0/150
提交
取消