3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在量化交易中,过滤停牌股是一个非常基础且关键的步骤。如果策略在盘中对已经停牌的股票发出下单指令,不仅会导致委托失败、占用系统资源,还可能影响策略的整体运行效率。
QMT(迅投极速量化交易系统)提供了内置的 ContextInfo.is_suspended_stock() 函数,可以帮助开发者快速、准确地判定某只股票在当前 Bar(K线)对应的时间是否处于停牌状态。
ContextInfo.is_suspended_stock(stockcode)
'600004.SH' 或 '000002.SZ'。True:表示该股票在当前时间点处于停牌状态。False:表示该股票处于正常交易状态。在 handlebar 函数中,我们可以直接传入股票代码来打印其停牌状态:
#coding:gbk
def init(ContextInfo):
# 设定基础股票池
ContextInfo.set_universe(['600004.SH', '000002.SZ'])
def handlebar(ContextInfo):
# 判定 600004.SH 是否停牌
is_suspended = ContextInfo.is_suspended_stock('600004.SH')
if is_suspended:
print('600004.SH 当前处于停牌状态')
else:
print('600004.SH 当前交易正常')
在实际的量化选股或轮动策略中,我们通常需要遍历整个股票池,动态剔除掉当天停牌的股票,只对可交易的股票进行信号计算和下单。以下是一个完整的过滤模板:
#coding:gbk
def init(ContextInfo):
# 1. 设定初始股票池(例如沪深300成分股或自定义组合)
ContextInfo.stock_list = ['600000.SH', '600004.SH', '000001.SZ', '000002.SZ']
ContextInfo.set_universe(ContextInfo.stock_list)
def handlebar(ContextInfo):
# 只在最后一根 K 线(最新行情)执行过滤和交易逻辑
if not ContextInfo.is_last_bar():
return
# 2. 动态筛选未停牌的股票
active_stocks = []
for stock in ContextInfo.stock_list:
if not ContextInfo.is_suspended_stock(stock):
active_stocks.append(stock)
else:
print(f"股票 {stock} 今日停牌,已自动过滤。")
print(f"今日可交易股票池: {active_stocks}")
# 3. 后续的策略逻辑(例如对 active_stocks 进行指标计算与下单)
for stock in active_stocks:
# 示例:如果满足买入条件,则调用 passorder 下单
# passorder(23, 1101, '您的资金账号', stock, 5, -1, 100, ContextInfo)
pass
is_suspended_stock 依赖于本地的历史行情数据和实时推送。在回测或实盘运行前,请务必通过 QMT 客户端的 “数据管理” 功能补充对应品种的历史数据。get_market_data 或 get_market_data_ex 获取行情,可以通过设置 skip_paused=True 参数,让系统自动用停牌前一天的价格填充停牌日的空缺值,避免数据出现 NaN 导致计算报错。