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

QMT 平台如何获取股票历史 ST 记录并进行策略剔除?(附 Python 源码)

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

问题描述

qmt 策略风险规避:利用 get_his_st_data 剔除历史上曾经 ST 的股票
如何在 qmt 中获取某只股票的历史 ST 记录?

解决方案

QMT 策略风险规避:利用 get_his_st_data 剔除历史 ST 股票

在量化投资中,规避具有退市风险或财务异常的 *ST/ST/PT 股票是构建稳健选股策略的重要一步。QMT 平台提供了专门的接口 ContextInfo.get_his_st_data,用于获取某只股票的历史 ST 记录。本文将详细介绍该接口的使用方法,并展示如何在策略初始化时剔除历史上曾经被 ST 的股票。


1. 接口介绍:ContextInfo.get_his_st_data()

1.1 语法说明

ContextInfo.get_his_st_data(stockCode)

1.2 参数说明

  • stockCodestring 类型,股票代码,必须是带市场后缀的格式,例如 '000004.SZ''600000.SH'

1.3 返回值

  • 返回一个 dict(字典)对象,包含该股票的历史 ST 变动详情。其 key 通常为 'ST', '*ST', 'PT' 等。如果该股票历史上面从未被 ST,则返回空字典 {}

2. 基础使用示例

您可以在 init 函数中直接调用此接口来查看某只股票的历史 ST 状态:

#coding:gbk

def init(ContextInfo):
    # 获取股票代码“000004.SZ”的历史 ST 记录
    st_history = ContextInfo.get_his_st_data('000004.SZ')
    print("000004.SZ 的历史 ST 记录为:", st_history)
    
    # 判断是否曾经被 ST
    if st_history:
        print("该股票历史上曾被 ST/PT/ *ST")
    else:
        print("该股票历史清白,从未被 ST")

3. 实战应用:在股票池中动态剔除历史 ST 股票

在实际编写选股策略时,我们通常需要对整个股票池(如沪深300)进行过滤。以下是一个完整的 QMT 策略框架,展示了如何在初始化时过滤掉历史上任何曾被 ST 的股票:

#coding:gbk

def init(ContextInfo):
    # 1. 设定初始股票池(以沪深300成分股为例)
    # 注意:获取历史成分股需要下载历史数据
    raw_universe = ContextInfo.get_stock_list_in_sector('沪深300')
    
    clean_universe = []
    
    # 2. 循环遍历股票池,剔除历史上曾被 ST 的股票
    for stock in raw_universe:
        st_dict = ContextInfo.get_his_st_data(stock)
        # 如果返回的字典为空 {},说明历史清白,保留该股票
        if not st_dict:
            clean_universe.append(stock)
        else:
            print(f"剔除历史 ST 股票: {stock}, 历史记录: {st_dict}")
            
    # 3. 重新设定过滤后的安全股票池
    ContextInfo.set_universe(clean_universe)
    print(f"原始股票池数量: {len(raw_universe)},过滤后安全股票池数量: {len(clean_universe)}")

def handlebar(ContextInfo):
    # 获取当前过滤后的股票池
    current_universe = ContextInfo.get_universe()
    
    # 在此处编写您的核心交易逻辑
    pass

4. 注意事项

  1. 数据补充:在使用 get_his_st_data 接口前,请确保已通过 QMT 客户端的 “数据管理” 功能补充了对应品种的历史数据与基础数据,否则可能无法正确获取历史 ST 状态。
  2. 回测与实盘:该接口在回测模式和实盘/模拟运行模式下均完全支持,是构建基本面安全边界的常用工具。