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

ptrade 平台如何盘前过滤 ST 股、停牌股与退市股?(附 Python 源码)

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

问题描述

ptrade 选股防坑指南:盘前判断 ST 股、停牌股及退市风险股票
怎样在 ptrade 中使用 get_stock_status 实时查询多只股票当前的 ST、停牌或退市状态?

解决方案

ptrade 选股防坑指南:盘前精准识别 ST、停牌及退市股

在量化交易中,买入 ST 股停牌股面临退市的股票 往往会导致策略出现非预期的交易失败、资金占用甚至严重亏损。因此,在每日盘前或下单前进行股票状态过滤是量化策略的“刚需”操作。

ptrade 提供了两个非常实用的 API 来解决这个问题:get_stock_status(状态查询)和 filter_stock_by_status(一键过滤)。


一、核心接口介绍

1. get_stock_status — 获取股票状态信息

该接口用于获取指定日期股票的 ST、停牌、退市属性。

  • 函数原型get_stock_status(stocks, query_type='ST', query_date=None)
  • 参数说明
    • stocks (list[str]/str):股票代码列表或单只股票,例如 ['000001.SZ', '600570.SS']
    • query_type (str):查询类型,支持:
      • 'ST':查询是否属于 ST 股票。
      • 'HALT':查询是否停牌。
      • 'DELISTING':查询是否退市。
    • query_date (str):查询日期,格式为 YYYYmmdd。默认为 None(表示当前交易日)。
  • 返回值:返回 dict 类型,Key 为股票代码,Value 为 TrueFalse。若无数据则返回 None

2. filter_stock_by_status — 过滤指定状态的股票代码(推荐盘前使用)

如果您想直接剔除这些异常股票,使用 filter_stock_by_status 会更加高效。注意:该函数仅支持在 before_trading_start 模块中调用。

  • 函数原型filter_stock_by_status(stocks, filter_type=["ST", "HALT", "DELISTING"], query_date=None)
  • 返回值:返回一个已剔除符合任一指定状态标的的股票列表(list)。

二、实战代码示例

以下是一个完整的 ptrade 策略模板,展示了如何在盘前事件 before_trading_start 中使用这两种方法过滤股票池:

def initialize(context):
    # 初始化股票池(示例:包含普通股、ST股、停牌股等)
    g.security_list = ['000001.SZ', '600570.SS', '600397.SS', '600701.SS']
    set_universe(g.security_list)

def before_trading_start(context, data):
    log.info("------ 盘前股票状态检查开始 ------")
    
    # 方法一:使用 get_stock_status 逐项获取状态并手动过滤
    st_dict = get_stock_status(g.security_list, query_type='ST')
    halt_dict = get_stock_status(g.security_list, query_type='HALT')
    delisting_dict = get_stock_status(g.security_list, query_type='DELISTING')
    
    active_stocks = []
    for stock in g.security_list:
        is_st = st_dict.get(stock, False)
        is_halt = halt_dict.get(stock, False)
        is_delisting = delisting_dict.get(stock, False)
        
        log.info(f"股票 {stock} 状态 -> ST: {is_st}, 停牌: {is_halt}, 退市风险: {is_delisting}")
        
        # 剔除 ST、停牌及退市股
        if not is_st and not is_halt and not is_delisting:
            active_stocks.append(stock)
            
    log.info(f"方法一手动过滤后的安全股票池: {active_stocks}")
    
    # 方法二:使用 filter_stock_by_status 一键过滤(更简洁,推荐!)
    # 过滤条件包括:ST、停牌、退市、退市整理期('DELISTING_SORTING')
    safe_stocks = filter_stock_by_status(g.security_list, filter_type=["ST", "HALT", "DELISTING", "DELISTING_SORTING"])
    log.info(f"方法二一键过滤后的安全股票池: {safe_stocks}")
    
    # 将过滤后的安全股票池存入全局变量,供盘中交易使用
    g.trade_stocks = safe_stocks
    set_universe(g.trade_stocks)

def handle_data(context, data):
    # 盘中仅对过滤后的安全股票进行交易
    for stock in g.trade_stocks:
        # 策略交易逻辑...
        pass

三、量化防坑避堵小贴士

  1. 避免盘中频繁调用get_stock_status 涉及基础数据查询,在 handle_data(尤其是分钟或 tick 级别)中频繁调用会增加耗时。建议在 before_trading_start 中一次性完成过滤,并将结果保存在 g 全局变量中。
  2. 退市整理期过滤:在注册制下,退市整理期的股票风险极高。使用 filter_stock_by_status 时,建议将 "DELISTING_SORTING" 写入 filter_type 参数中一并过滤。
  3. 新股上市初期过滤:新股上市前几天波动剧烈且不适用常规技术指标,可以通过 get_stock_info 获取 listed_date(上市日期),计算上市天数,剔除上市未满 90 天的新股。