问题描述
code_list = ["000001.SZ"]
xtdata.download_financial_data(code_list)
xtdata.download_financial_data 会 Hang, 不返回。请问如何解决?
调用其他 API 没有问题,说明本地环境是 OK 的
解决方案
在 QMT (迅投) 平台的 xtquant 独立环境中,调用 xtdata.download_financial_data 出现卡死(Hang)且不返回的情况,通常与数据量过大导致阻塞、未指定具体财务表或底层数据服务响应超时有关。既然其他 API 调用正常,说明基础连接没有问题。您可以尝试以下几种方法来解决此问题:
1. 指定具体的财务数据表 (table_list)
如果不指定具体的财务表,底层可能会尝试下载该股票所有的财务数据(包括资产负债表、利润表、现金流量表等所有历史数据),数据量极大,容易导致假死或长时间阻塞。建议明确指定需要下载的表名。
修改后的代码示例:
import xtdata
code_list = ["000001.SZ"]
# 指定需要下载的财务表,例如利润表(ASHAREINCOME)和资产负债表(ASHAREBALANCESHEET)
table_list = ['ASHAREINCOME', 'ASHAREBALANCESHEET']
print("开始下载财务数据...")
xtdata.download_financial_data(code_list, table_list=table_list)
print("财务数据下载完成!")
2. 增加回调函数 (Callback) 查看进度
为了确认函数是否真的卡死,还是只是在后台缓慢下载,可以传入一个 callback 函数。这样每次下载一部分数据时,都会打印进度,避免主线程看起来像卡死一样。
代码示例:
import xtdata
def on_progress(data):
print(f"下载进度更新: {data}")
code_list = ["000001.SZ"]
table_list = ['ASHAREINCOME']
print("开始异步/带回调下载...")
xtdata.download_financial_data(code_list, table_list=table_list, callback=on_progress)
3. 检查 QMT 客户端的数据下载中心
xtdata 的下载接口本质上是向本地运行的 QMT 客户端发送下载指令。如果 QMT 客户端内部的“数据管理”任务队列已经卡住,或者网络与迅投数据服务器断开,也会导致 Python 端 Hang 住。
- 排查方法:打开 QMT 客户端,进入【数据管理】 -> 【数据下载】,手动尝试下载一下“000001.SZ”的财务数据,看是否能正常下载。如果客户端也卡住,请重启 QMT 客户端。
4. 替代方案:在策略内部使用 ContextInfo
如果您是在 QMT 客户端内部的策略编辑器中运行代码,建议直接使用内置的 ContextInfo.get_financial_data 接口,而不是调用 xtdata.download_financial_data。内置接口直接读取本地缓存,效率更高且不会阻塞。
def handlebar(ContextInfo):
fieldList = ['ASHAREINCOME.net_profit_incl_min_int_inc']
stockList = ['000001.SZ']
# 直接获取,无需显式 download
data = ContextInfo.get_financial_data(fieldList, stockList, '20220101', '20230101')
print(data)
总结:最常见的 Hang 死原因是未指定 table_list 导致全量下载超时。请务必加上 table_list 参数,并配合 callback 观察执行状态。