问题描述
用C.get_market_data_ex()取ETF和中证全指的日收盘价数据,竟然多出两个周六来,大受震撼,客服看看怎么回事?5月16日和4月25日是周六。附图是代码和输出日志。
解决方案
在使用 QMT 平台的 ContextInfo.get_market_data_ex() 函数获取日线数据时,如果发现返回的数据中包含了周六(如 5 月 16 日和 4 月 25 日)等非交易日的数据,这通常是由以下几个原因引起的:
1. 本地数据未更新或存在脏数据
QMT 的 get_market_data_ex() 函数在默认情况下(subscribe=True)会结合本地数据和订阅数据。如果本地历史数据中存在脏数据(例如由于某些测试或异常情况写入了非交易日的数据),函数就会将其读取出来。
解决方法:
- 清理并重新下载数据: 在 QMT 客户端的【数据管理】中,清除相关品种(ETF 和中证全指)的本地历史数据,然后重新下载完整的日线数据。
- 检查数据源: 确保下载的数据源是官方提供的标准行情数据。
2. 停牌填充(fill_data)参数的影响
虽然文档中提到 fill_data 参数暂不可用,但在某些版本中,如果该参数被激活或底层逻辑有变,可能会尝试对缺失的日期进行填充。如果逻辑判断有误,可能会将非交易日也进行了填充。
解决方法:
- 尝试在调用函数时显式设置
fill_data=False,观察是否还能获取到周六的数据。data = ContextInfo.get_market_data_ex( ['close'], ['510300.SH', '000985.SH'], period='1d', fill_data=False )
3. 周期(period)参数设置不当
如果 period 参数设置的不是标准的 '1d',而是某些自定义的多日线(如 'md')或者跟随主图周期('follow'),而主图周期设置有误,可能会导致时间戳解析出现偏差。
解决方法:
- 确保明确指定
period='1d'。
4. 平台版本 Bug
如果以上排查都无法解决问题,这极有可能是 QMT 平台特定版本中的一个 Bug,导致在处理某些特定品种(如指数或 ETF)的日线数据时,未能正确过滤非交易日。
建议:
- 联系客服/技术支持: 将您的 QMT 版本号、完整的复现代码以及日志截图提供给国信/QMT 的技术支持人员,以便他们进行底层排查。
- 代码层面过滤: 作为临时解决方案,您可以在获取到数据后,使用 Python 的
datetime模块或pandas过滤掉非交易日的数据。
临时过滤代码示例:
import pandas as pd
def handlebar(ContextInfo):
if not ContextInfo.is_last_bar():
return
data = ContextInfo.get_market_data_ex(
['close'], ['510300.SH'], period='1d'
)
if '510300.SH' in data:
df = data['510300.SH']
# 将 index 转换为 datetime 对象
df.index = pd.to_datetime(df.index)
# 过滤掉周六 (5) 和周日 (6)
df = df[df.index.dayofweek < 5]
print(df)
总结来说,首先尝试清理并重新下载本地数据,如果问题依旧,建议在代码中加入日期过滤逻辑,并及时向官方反馈该异常。