问题描述
出现nan值的SuspendFlag为1,实际它没有停牌
解决方案
在 QMT 平台中获取历史数据时,如果遇到未停牌的股票出现 nan 值或空值,且 SuspendFlag 显示为 1(停牌状态),通常不是因为平台的限制或数据源本身不稳定,而是由于本地数据缺失或参数设置不当导致的。以下是具体原因分析及解决方法:
一、 出现 NaN 值及 SuspendFlag 异常的原因
-
本地历史数据未补充完整(最常见原因)
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'),但本地的除权除息因子表未更新,可能导致计算复权价格时出现异常空值。 -
新股上市或退市时间不匹配
请求的时间区间包含了该股票尚未上市或已经退市的日期,这些日期的数据自然为空。
二、 解决方法
1. 手动补充本地数据(关键步骤)
在运行策略或回测之前,必须确保本地数据完整:
- 打开 QMT 客户端,进入 【数据管理】 -> 【补充数据】。
- 选择您策略中需要的市场、品种(如沪深A股)以及对应的周期(如日线、1分钟线)。
- 设定好时间范围,点击下载补充。确保出现
nan的股票数据已被完整下载。
2. 检查并调整 API 参数
在代码中获取数据时,确保开启了停牌填充功能(通常默认开启,但建议显式声明):
# 使用 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 # 开启订阅,确保能拉取到最新数据
)
3. 补充财务及除权数据
如果您使用了复权方式获取数据,请在【数据管理】中同时补充财务数据和除权除息数据,以保证复权因子的正确计算。
总结
QMT 出现未停牌股票返回 nan 且 SuspendFlag=1 的现象,90% 以上是因为本地对应周期的 K 线数据缺失。请务必养成在回测或实盘前,通过客户端【数据管理】工具补充完整历史数据的习惯。如果补充数据后仍有问题,建议检查请求的时间区间是否超出了股票的实际存续期。