🚀 AI 一键生成 qmt 策略代码

QMT 平台调用 xtdata.download_financial_data 卡死不返回怎么办?

qmt | 发布时间: 2026/5/25
以下内容由 EasyQuant 生成。

问题描述

函数xtdata.download_financial_data会hang

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 观察执行状态。