3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 QMT 平台中获取历史数据时,如果遇到未停牌的股票出现 nan 值或空值,且 SuspendFlag 显示为 1(停牌状态),通常不是因为平台的限制或数据源本身不稳定,而是由于本地数据缺失或参数设置不当导致的。以下是具体原因分析及解决方法:
本地历史数据未补充完整(最常见原因)
QMT 的历史数据获取函数(如 get_history_data、get_market_data 等)主要依赖于本地客户端缓存的数据。如果您在代码中请求了某只股票在特定时间段的数据,但该数据并未提前下载到本地,QMT 底层在读取不到数据时,会默认该时间段没有交易,从而将其标记为停牌(SuspendFlag=1),并返回 nan 或空值。
skip_paused 参数设置问题
在调用 get_history_data 或 get_market_data 时,有一个参数 skip_paused(是否停牌填充)。
False,当遇到本地没有数据的 K 线时,系统不会用前一交易日的数据进行填充,而是直接返回 nan。True,如果该股票在本地完全没有更早的历史数据作为基准来填充,依然会返回 nan。除权除息或复权数据未更新
如果您请求的是复权数据(如 dividend_type='front'),但本地的除权除息因子表未更新,可能导致计算复权价格时出现异常空值。
新股上市或退市时间不匹配
请求的时间区间包含了该股票尚未上市或已经退市的日期,这些日期的数据自然为空。
在运行策略或回测之前,必须确保本地数据完整:
nan 的股票数据已被完整下载。在代码中获取数据时,确保开启了停牌填充功能(通常默认开启,但建议显式声明):
# 使用 get_history_data 时,确保 skip_paused=True
his_data = ContextInfo.get_history_data(100, '1d', 'close', skip_paused=True)
# 推荐使用更稳定的 get_market_data_ex 接口
data = ContextInfo.get_market_data_ex(
fields=['open', 'high', 'low', 'close'],
stock_code=['000001.SZ'],
period='1d',
start_time='20230101',
end_time='20231001',
dividend_type='front',
fill_data=True, # 停牌填充
subscribe=True # 开启订阅,确保能拉取到最新数据
)
如果您使用了复权方式获取数据,请在【数据管理】中同时补充财务数据和除权除息数据,以保证复权因子的正确计算。
QMT 出现未停牌股票返回 nan 且 SuspendFlag=1 的现象,90% 以上是因为本地对应周期的 K 线数据缺失。请务必养成在回测或实盘前,通过客户端【数据管理】工具补充完整历史数据的习惯。如果补充数据后仍有问题,建议检查请求的时间区间是否超出了股票的实际存续期。