3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在量化投资中,动态选股是构建策略的重要基石。如果我们在回测历史策略时,直接使用当前的指数成分股,就会引入未来函数(Look-ahead Bias),导致回测结果失真。QMT 平台提供了强大的 ContextInfo.get_sector() 接口,允许开发者根据历史时间戳动态获取当时的指数成分股。
ContextInfo.get_sector 用于获取板块或指数的成分股。通过传入历史毫秒级时间戳,可以精准获取该时间点的历史成分股。
ContextInfo.get_sector(sector, realtime)
sector (string): 指数或板块代码,必须是 'stock.market' 形式。例如:
'000300.SH''000905.SH''000016.SH'realtime (number): 毫秒级时间戳。如果缺省,则默认获取当前最新成分股。在回测中,我们通常传入当前 K 线的时间戳。list),代码格式为 '000002.SZ' 形式。init 函数中设置基准、初始资金等。handlebar 中,利用 ContextInfo.get_bar_timetag(ContextInfo.barpos) 获取当前 Bar 的时间戳。ContextInfo.get_sector,获取当时真实的沪深300成分股列表。以下是一个简单的动态选股回测框架,展示了如何在每日回测中动态获取沪深300成分股并打印:
#coding:gbk
def init(ContextInfo):
# 设置回测基准为沪深300
ContextInfo.benchmark = '000300.SH'
# 设定交易账号
ContextInfo.set_account('6000000248')
print("策略初始化完成")
def handlebar(ContextInfo):
# 获取当前 K 线的索引
bar_index = ContextInfo.barpos
# 获取当前 K 线对应时间的时间戳(毫秒)
current_timetag = ContextInfo.get_bar_timetag(bar_index)
# 将时间戳转换为可读的日期格式(用于日志输出)
current_date = timetag_to_datetime(current_timetag, '%Y-%m-%d')
# 动态获取当前日期下的沪深300指数成分股
hs300_stocks = ContextInfo.get_sector('000300.SH', current_timetag)
# 打印当前日期和成分股数量
print(f"当前日期: {current_date}, 沪深300历史成分股数量: {len(hs300_stocks)}")
# 示例:展示前5只成分股代码
if len(hs300_stocks) > 0:
print(f"部分成分股示例: {hs300_stocks[:5]}")
# ---------------------------------------------------------
# 选股与交易逻辑(此处可根据您的策略自由扩展)
# 例如:在成分股中筛选 PE < 20 且今日涨幅大于 2% 的股票进行买入
# ---------------------------------------------------------
get_sector 的 realtime 参数是当前 Bar 的时间戳(即 ContextInfo.get_bar_timetag(ContextInfo.barpos)),切勿不传参或传入未来的时间戳。#coding:gbk 或 #encoding:gbk,以防止中文注释导致编译报错。