🚀 AI 一键生成 qmt 策略代码

QMT 策略避坑:如何检测并过滤当日停牌的股票?

qmt | 发布时间: 2025/12/20
以下内容由 EasyQuant 生成。

问题描述

怎么在交易前判断这只股票今天是不是停牌了?

解决方案

在 QMT 中,判断一只股票当天是否停牌,最直接且推荐的方法是使用 ContextInfo.is_suspended_stock() 函数。

核心函数说明

  • 函数名ContextInfo.is_suspended_stock(stockcode)
  • 参数stockcode (字符串),格式为 代码.市场,例如 '600000.SH'
  • 返回值:布尔值 (bool)。
    • True:表示该股票当前停牌。
    • False:表示该股票未停牌(正常交易)。

代码示例

以下是一个完整的策略示例,展示如何在 handlebar 函数中遍历股票池并判断是否停牌:

# -*- coding: gbk -*-

def init(ContextInfo):
    # 设置股票池,这里以浦发银行(正常)和一只历史上曾停牌的股票为例
    # 注意:实际运行时请根据需要设置股票池
    ContextInfo.set_universe(['600000.SH', '000001.SZ'])
    print("策略初始化完成")

def handlebar(ContextInfo):
    # 获取当前周期对应的K线索引
    index = ContextInfo.barpos
    # 获取当前K线的时间(方便回测时观察)
    timetag = ContextInfo.get_bar_timetag(index)
    date_str = timetag_to_datetime(timetag, '%Y-%m-%d')
    
    # 获取股票池
    stock_list = ContextInfo.get_universe()
    
    for stock in stock_list:
        # 【核心代码】判断是否停牌
        is_suspended = ContextInfo.is_suspended_stock(stock)
        
        if is_suspended:
            print(f"日期: {date_str}, 股票: {stock} -> 处于停牌状态,跳过交易")
            # 在这里可以执行跳过逻辑,例如 continue
        else:
            print(f"日期: {date_str}, 股票: {stock} -> 交易正常,可以执行下单逻辑")
            # 在这里编写下单逻辑,例如:
            # if <你的交易条件>:
            #     order_shares(stock, 100, ContextInfo, 'account_id')

注意事项

  1. 回测模式:该函数会根据历史数据准确返回当天的停牌状态。如果股票在回测的某一天是停牌的,函数会返回 True
  2. 实盘/模拟交易:该函数会根据当天的实时基础数据返回状态。
  3. 数据补充:在回测前,请确保已通过“数据管理”下载了对应品种的日线数据基础信息,以保证停牌状态判断的准确性。

常见问答 (Q&A)

Q: 除了 is_suspended_stock,还有其他方式判断停牌吗?
A: 有。你可以使用 ContextInfo.get_full_tick([stock_code]) 获取最新的分笔数据,返回的字典中包含 stockStatus 字段,也可以用来辅助判断股票状态,但 is_suspended_stock 更加直接和常用。

Q: 如果股票停牌了,我发送了下单指令会怎样?
A: 如果股票处于停牌状态,交易所通常会拒单,或者订单会处于“废单”或“未报”状态。但在策略层面先进行判断并拦截,可以避免产生大量无效的报错日志,逻辑更严谨。

Q: 这个函数能判断盘中临时停牌吗?
A: is_suspended_stock 主要用于判断全天停牌或基于日线级别的停牌状态。如果是盘中临时停牌(如熔断或临时公告),建议结合 get_full_tick 查看实时的 stockStatus 或成交量变化。