问题描述
如题,
from xtquant import xtdata, xtconstant
xtdata.enable_hello = False
"""
table_list
'Balance' #资产负债表
'Income' #利润表
'CashFlow' #现金流量表
'Capital' #股本表
'Holdernum' #股东数
'Top10holder' #十大股东
'Top10flowholder' #十大流通股东
'Pershareindex' #每股指标
report_type
'report_time' #截止日期
'announce_time' #披露日期
"""
stock_list = ['300750.SZ']
table_list = ['Balance', 'Income', 'CashFlow', 'Capital', 'Holdernum' 'Pershareindex']
start_time = '20231231'
end_time = '20240930'
xtdata.download_financial_data(stock_list=stock_list, table_list=table_list,start_time=start_time,end_time=end_time) # 下载财务数据到本地
xtdata.get_financial_data(stock_list=stock_list, table_list=table_list, start_time=start_time,end_time=end_time, report_type='report_time')
获取不到财务数据,卡住不动。是国金证券 QMT 没有这个接口的权限吗?
解决方案
在使用 QMT (xtquant) 获取财务数据时,遇到 xtdata.get_financial_data 卡死不动的情况,通常不是因为券商(如国金证券)没有权限,而是由代码细节错误、客户端未启动或数据未正确下载引起的。请按照以下步骤进行排查和解决:
1. 检查代码中的语法拼写错误(最可能的原因)
在您提供的代码中,table_list 列表存在一个明显的语法遗漏:
table_list = ['Balance', 'Income', 'CashFlow', 'Capital', 'Holdernum' 'Pershareindex']
注意 'Holdernum' 和 'Pershareindex' 之间缺少了一个逗号。在 Python 中,相邻的字符串会被自动拼接,这会导致实际传入的表名变成了 'HoldernumPershareindex'。底层 C++ 接口在解析这个不存在的表名时可能会陷入死循环或引发未捕获的异常,从而导致程序卡死。
修改为:
table_list = ['Balance', 'Income', 'CashFlow', 'Capital', 'Holdernum', 'Pershareindex']
2. 确保 QMT 客户端已登录并正常运行
xtquant 的 xtdata 模块并不是直接连接云端服务器,而是依赖于本地正在运行的 QMT 客户端作为数据代理。如果您的 QMT 客户端没有打开,或者没有成功登录,xtdata.download_financial_data 和 get_financial_data 就会因为无法与本地终端通信而一直阻塞等待。
- 解决办法:请确保国金证券 QMT 终端已启动,并且账号处于正常登录状态。
3. 手动补充财务数据
虽然您使用了 xtdata.download_financial_data,但有时由于网络波动或请求量过大,代码下载可能会卡住。建议先通过 QMT 客户端界面手动下载一次数据,以验证数据源是否正常:
- 操作路径:打开 QMT 客户端 -> 点击右下角或菜单栏的【数据管理】 -> 【补充数据】 -> 选择【财务数据】 -> 设定好时间范围并点击下载。
- 下载完成后,再运行您的 Python 脚本直接调用
get_financial_data(可暂时注释掉 download 语句测试)。
4. 权限问题说明
基础的财务数据(如资产负债表、利润表等)在绝大多数券商的 QMT 版本中都是默认开放的,不需要额外申请高级权限。只有极少数特色因子数据(如 Level-2 逐笔、特定的 AI 预测因子)才需要额外开通权限。因此,卡死问题基本可以排除是权限限制导致的。
修正后的完整测试代码
from xtquant import xtdata
xtdata.enable_hello = False
stock_list = ['300750.SZ']
# 修复了缺失逗号的问题
table_list = ['Balance', 'Income', 'CashFlow', 'Capital', 'Holdernum', 'Pershareindex']
start_time = '20231231'
end_time = '20240930'
print("开始下载财务数据...")
# 如果卡死,可以尝试先在 QMT 终端手动下载,然后注释掉下面这行
xtdata.download_financial_data(stock_list=stock_list, table_list=table_list, start_time=start_time, end_time=end_time)
print("下载完成,开始获取数据...")
data = xtdata.get_financial_data(stock_list=stock_list, table_list=table_list, start_time=start_time, end_time=end_time, report_type='report_time')
print("获取成功:")
print(data)
如果修改代码并确保 QMT 客户端运行后仍然卡死,建议检查 QMT 安装目录下的 userdata_mini/datadir 路径是否有读写权限,或者尝试重启 QMT 客户端及 Python 环境。