🚀 AI 一键生成 qmt 策略代码
立即体验

QMT平台如何使用is_suspended_stock过滤停牌股票?(附Python风控源码)

qmt | 发布时间: 2026/8/8
以下内容由 EasyQuant 生成。

问题描述

qmt 交易风控:使用 is_suspended_stock 自动剔除停牌股
编写QMT策略时,如何用is_suspended_stock过滤停牌股票防止下单失败?

解决方案

QMT交易风控:使用 is_suspended_stock 自动剔除停牌股

在进行实盘或模拟盘量化交易时,如果策略试图对已经停牌的股票下达交易指令,会导致柜台直接拒单(废单)。频繁的废单不仅会占用系统资源,还可能干扰策略的正常运行逻辑。

QMT 平台提供了内置的 ContextInfo.is_suspended_stock() 函数,可以帮助我们在下单前实时检测股票的停牌状态,从而在策略中自动剔除停牌股,做好交易风控。


1. is_suspended_stock 函数 API 详解

用法

ContextInfo.is_suspended_stock(stockcode)

参数

  • stockcode (string): 股票代码,必须是带市场后缀的完整代码格式,例如 '600004.SH''000002.SZ'

返回值

  • bool:
    • True: 该股票当前处于停牌状态。
    • False: 该股票当前未停牌(可正常交易)。

2. 实战策略源码:自动过滤停牌股

以下是一个完整的 QMT 策略示例。该策略在 init 中设定股票池,并在 handlebar 中循环检测股票池,自动剔除停牌股票,仅对正常交易的股票进行下单操作。

#encoding:gbk

def init(ContextInfo):
    # 1. 设定初始股票池
    ContextInfo.stock_pool = ['600000.SH', '600004.SH', '000002.SZ', '000001.SZ']
    ContextInfo.set_universe(ContextInfo.stock_pool)
    
    # 2. 设定交易账号(请替换为您的真实/模拟账号)
    ContextInfo.account_id = '6000000248'
    ContextInfo.set_account(ContextInfo.account_id)
    
    print("【初始化】策略启动,初始股票池:", ContextInfo.stock_pool)

def handlebar(ContextInfo):
    # 仅在最后一根K线(最新Tick驱动)时执行交易逻辑
    if not ContextInfo.is_last_bar():
        return
        
    active_stocks = []
    suspended_stocks = []
    
    # 循环检测股票池中的停牌状态
    for stock in ContextInfo.stock_pool:
        if ContextInfo.is_suspended_stock(stock):
            suspended_stocks.append(stock)
        else:
            active_stocks.append(stock)
            
    # 打印风控日志
    if suspended_stocks:
        print(f"【交易风控】检测到停牌股: {suspended_stocks},已自动拦截并剔除。")
    
    # 仅对未停牌的股票执行交易逻辑
    for stock in active_stocks:
        print(f"【交易执行】股票 {stock} 状态正常,准备发送买入委托...")
        # 示例:以最新价买入 100 股
        passorder(23, 1101, ContextInfo.account_id, stock, 5, -1, 100, '风控买入', 1, ContextInfo)

3. 交易风控最佳实践建议

  1. 多重风控结合:除了使用 is_suspended_stock 过滤停牌股外,建议在下单前配合 get_trade_detail_data 查询账户可用资金,确保双重保险。
  2. 历史回测填充:在回测模式下,QMT 的 get_market_dataget_history_data 默认有 skip_paused 参数。如果设为 True,系统会自动用停牌前一天的价格填充停牌日数据,但实盘中必须使用 is_suspended_stock 进行拦截。
  3. ST股与退市警示:对于高风险股票,还可以结合 ContextInfo.get_his_st_data(stockCode) 获取ST历史,进一步完善策略的黑名单机制。