问题描述
/
解决方案
在QMT量化交易平台中,调用API(如 get_market_data_ex、get_financial_data、get_stock_list_in_sector 等)时如果无法获取数据,通常是由以下几个常见原因导致的。请按照以下步骤进行排查和解决:
1. 未补充本地历史数据(最常见原因)
QMT 平台的许多数据接口(特别是历史行情数据、财务数据和多因子数据)依赖于本地数据缓存。如果本地没有下载对应的数据,接口将返回空值或报错。
解决办法:
- 打开 QMT 客户端,点击顶部菜单栏的**【数据管理】或【操作】 -> 【数据管理】**。
- 选择**【补充数据】**。
- 根据你的策略需求,勾选对应的市场、品种、数据周期(如日线、分钟线)以及时间范围。
- 如果使用的是
get_financial_data,请务必勾选并下载财务数据。 - 如果使用的是多因子接口,请在补充数据中勾选多因子数据。
- 点击下载,等待数据补充完成后,重新运行策略。
2. 股票代码格式不正确
QMT API 对股票代码的格式有严格要求,必须包含市场后缀。
解决办法:
确保传入的股票代码格式为 stockcode.market,例如:
- 平安银行:
000001.SZ(不能只写000001) - 浦发银行:
600000.SH - 沪深300指数:
000300.SH
3. 未设置基础股票池 (Universe)
部分旧版接口(如 get_history_data)在调用前,必须先通过 ContextInfo.set_universe() 设定基础股票池,否则无法获取数据。
解决办法:
在 init 函数中初始化股票池:
def init(ContextInfo):
ContextInfo.set_universe(['000001.SZ', '600000.SH'])
注:新版接口 get_market_data_ex 可以直接传入 stock_code 列表,不强制依赖 universe,但仍需确保本地有数据。
4. 财务数据接口 (get_financial_data) 的特殊要求
财务数据除了需要提前下载外,还需要注意参数的正确性。
解决办法:
- 检查
fieldList字段名是否正确,必须使用官方文档中提供的英文表名和字段名,例如['ASHAREBALANCESHEET.fix_assets']。 - 检查
report_type参数:默认为announce_time(按公告期取数),如果需要按报告期取数,需显式设置为report_time。
5. 板块成分股接口 (get_stock_list_in_sector) 的注意事项
该接口依赖于客户端左侧板块列表中的板块名称。
解决办法:
- 确保传入的
sectorname(如'沪深300')在客户端的板块列表中真实存在。 - 确保传入的
realtime(时间戳)格式正确,通常可以通过ContextInfo.get_bar_timetag(index)获取当前 K 线的时间戳传入。
6. 订阅开关未开启 (针对 get_market_data_ex)
在使用 get_market_data_ex 时,如果需要获取实时更新的数据,需要注意 subscribe 参数。
解决办法:
确保 subscribe=True(默认即为 True)。如果设置为 False,则只读取本地已有数据,不会进行数据订阅。
总结:遇到 QMT 无法获取数据的问题,90% 以上是因为没有在【数据管理】中下载对应的本地数据。养成在回测或运行策略前先补充数据的习惯,可以避免绝大多数的数据获取问题。