本地Python脚本连接Polygon.io Stocks WebSocket无数据输出问题
问题排查与修复方案
1. 修正订阅代码(逐秒聚合的正确格式)
你当前订阅的AM.TSLA是分钟级聚合数据的标识,如果需要逐秒聚合数据,应使用A.TSLA(A代表Second Aggregates)作为订阅字符串。
2. 修正run()方法的调用方式
代码中ws_client.run(handle_msg)存在错误,run()方法不需要传入消息处理函数——你已经通过ws_client.on_message = handle_msg绑定了回调,重复传入会导致逻辑冲突。应改为:
ws_client.run()
3. 明确指定市场类型(可选但推荐)
创建WebSocketClient时,显式指定market="stocks",确保连接到正确的股票数据流频道:
ws_client = WebSocketClient(api_key=api_key, market="stocks", subscriptions=["A.TSLA"])
4. 确认测试时段是否为美股交易时段
逐秒聚合数据仅在美股常规交易时段(美东时间9:30-16:00)实时推送,盘前/盘后时段数据频率极低或无数据,非交易时段运行脚本自然不会有数据流输出。
5. 增强日志适配客户端版本
部分版本的Polygon Python客户端中,消息数据的属性可能不是m.json而是m.data,可以修改回调函数兼容两种情况:
def handle_msg(msg): print("Received raw message:", msg) if isinstance(msg, list): for m in msg: try: print("Parsed data:", m.json) except AttributeError: print("Parsed data:", m.data) else: try: print("Parsed data:", msg.json) except AttributeError: print("Parsed data:", msg.data)
修复后的完整代码
import pandas as pd import sys import json sys.path.insert(0, '/wamp64/www/market-data/py/client-python') from polygon import WebSocketClient from polygon.websocket.models import WebSocketMessage from typing import List def on_open(ws): print("WebSocket connection opened.") def handle_msg(msg): print("Received raw message:", msg) if isinstance(msg, list): for m in msg: try: print("Parsed message data:", m.json) except AttributeError: print("Parsed message data:", m.data) else: try: print("Parsed message data:", msg.json) except AttributeError: print("Parsed message data:", msg.data) def on_close(ws): print("Connection closed") def on_error(ws, error): print("Error:", error) def main(): print("Starting WebSocket client...") # Polygon API key api_key = '####' # 创建WebSocket客户端,指定市场类型与正确的订阅 ws_client = WebSocketClient(api_key=api_key, market="stocks", subscriptions=["A.TSLA"]) print("获取A.TSLA逐秒聚合数据...") # 绑定回调函数 ws_client.on_open = on_open ws_client.on_message = handle_msg ws_client.on_close = on_close ws_client.on_error = on_error # 启动客户端(无需重复传入回调) ws_client.run() print("WebSocket客户端运行中...按Enter停止监听。") try: input() finally: ws_client.close() print("WebSocket连接已关闭。") if __name__ == "__main__": main()
内容的提问来源于stack exchange,提问作者Alexnl
相关产品推荐
相关产品推荐

