3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在量化交易实盘或回测过程中,停牌股票是一个常见的“陷阱”。如果策略未对停牌股进行过滤,可能会导致以下问题:
迅投 QMT 平台提供了便捷的 API 函数 ContextInfo.is_suspended_stock(),可以帮助我们在策略运行中实时检测并剔除停牌股票。本文将为您详细介绍其使用方法及完整的过滤代码模板。
ContextInfo.is_suspended_stock()ContextInfo.is_suspended_stock(stock_code)stock_code (string):股票代码,必须是带市场后缀的格式,例如 '600004.SH' 或 '000002.SZ'。True:该股票当前处于停牌状态。False:该股票当前未停牌,可正常交易。以下是一个完整的 QMT 策略示例。该策略在 init 中设定初始股票池,在 handlebar 中循环遍历股票池,利用 ContextInfo.is_suspended_stock 剔除停牌股,仅对正常交易的股票进行买入操作。
#encoding:gbk
def init(ContextInfo):
# 1. 设定初始股票池
ContextInfo.stock_list = ['600000.SH', '600004.SH', '000001.SZ', '000002.SZ']
ContextInfo.set_universe(ContextInfo.stock_list)
# 2. 设定交易账号(请替换为您的实际账号)
ContextInfo.account_id = '6000000248'
ContextInfo.set_account(ContextInfo.account_id)
print("【系统初始化】股票池设置完毕,初始股票:", ContextInfo.stock_list)
def handlebar(ContextInfo):
# 只在最后一根 K 线(或最新 Tick)执行交易逻辑
if not ContextInfo.is_last_bar():
return
active_stocks = []
suspended_stocks = []
# 遍历股票池,过滤停牌股
for stock in ContextInfo.stock_list:
if ContextInfo.is_suspended_stock(stock):
suspended_stocks.append(stock)
else:
active_stocks.append(stock)
# 打印过滤结果
if suspended_stocks:
print(f"【停牌警报】以下股票当前处于停牌状态,已自动过滤:{suspended_stocks}")
# 3. 仅对未停牌的股票执行交易逻辑
for stock in active_stocks:
print(f"【交易信号】股票 {stock} 状态正常,准备发送买入委托...")
# 示例:使用最新价买入 100 股
passorder(23, 1101, ContextInfo.account_id, stock, 5, -1, 100, '停牌过滤策略', 1, ContextInfo)
ContextInfo.get_market_data 或 ContextInfo.get_market_data_ex 获取历史行情时,参数 skip_paused 默认为 True(自动填充未停牌前的价格)。如果您需要严格识别停牌期间无交易数据的情况,可以将其设为 False,此时停牌日的行情数据将返回 NaN。is_suspended_stock 进行一次清洗,生成一个“今日可交易股票池”,再输入选股模型中计算因子,这样可以大幅提升策略的运行效率。