问题描述
在测试中无法读取换手率数据?那位大神帮忙看看。
解决方案
在 QMT 平台中使用 ContextInfo.get_turnover_rate 获取换手率数据失败,通常是由以下几个常见原因导致的。请按照以下步骤进行排查和修复:
1. 未补充本地历史数据(最常见原因)
QMT 的 get_turnover_rate 函数依赖于本地的日线行情数据。如果本地没有对应时间段的数据,函数将返回空值或报错。
解决方法:
在 QMT 客户端中,点击顶部菜单栏的 “数据管理” -> “补充数据”,选择你需要测试的股票品种(如沪深A股)和对应的时间段(日线数据),进行数据下载补充。
2. 参数格式传递错误
请严格检查传入函数的参数类型和格式是否符合官方 API 文档的要求:
stock_list:必须是一个 列表 (list),即使只查询一只股票,也要写成['000001.SZ']。startTime和endTime:必须是 字符串 (string),且格式为YYYYMMDD(如'20170101')。- 股票代码格式:必须包含市场后缀,如
.SH(上交所)或.SZ(深交所)。
3. 正确的代码示例
以下是一个标准的调用示例,建议在 handlebar 中进行测试:
#coding:gbk
def init(ContextInfo):
# 初始化时可以设置股票池
ContextInfo.set_universe(['000002.SZ', '600000.SH'])
def handlebar(ContextInfo):
# 确保只在最后一根K线打印,避免日志过多
if ContextInfo.is_last_bar():
stock_list = ['000002.SZ']
start_time = '20230101'
end_time = '20230110'
# 获取换手率数据
turnover_df = ContextInfo.get_turnover_rate(stock_list, start_time, end_time)
print("换手率数据获取结果:")
print(turnover_df)
4. 进阶排查建议
- 检查返回值类型:该函数返回的是一个
pandas.DataFrame。如果打印出来是空的 DataFrame,说明代码执行成功,但本地确实没有该时间段的数据。 - 停牌股票:如果查询的时间段内股票处于停牌状态,换手率数据可能为空(NaN)。
- 替代方案:如果
get_turnover_rate依然无法满足需求,可以通过ContextInfo.get_market_data获取volume(成交量),再通过ContextInfo.get_last_volume获取流通股本,自行计算换手率(换手率 = 成交量 / 流通股本)。