🚀 AI 一键生成 ptrade 策略代码

在 PTrade 策略中如何有效剔除 ST、停牌或已退市的股票?

ptrade | 发布时间: 2025/11/25
以下内容由 EasyQuant 生成。

问题描述

在我的选股逻辑中,如何把ST股、当天停牌的股票或者已经退市的股票从股票池里剔除出去?

解决方案

在PTrade中,剔除ST股、停牌股和退市股最简单且推荐的方法是使用内置函数 filter_stock_by_status

该函数专门用于根据指定的状态(如ST、停牌、退市)过滤股票列表。

以下是具体的实现方法和代码示例:

方法一:使用 filter_stock_by_status(推荐)

这是最简洁的方法,通常在 before_trading_start 函数中调用,用于每日开盘前更新股票池。

函数说明:
filter_stock_by_status(stocks, filter_type=["ST", "HALT", "DELISTING"], query_date=None)

  • stocks: 原始股票代码列表。
  • filter_type: 需要剔除的类型列表。默认包含 ST (ST股), HALT (停牌), DELISTING (退市)。

代码示例:

def initialize(context):
    # 初始化时设置一个初始股票池,例如沪深300
    # 注意:get_index_stocks 建议在 before_trading_start 中调用以获取最新成分股
    # 这里仅作演示初始化变量
    g.security = [] 

def before_trading_start(context, data):
    # 1. 获取原始股票池(例如获取沪深300成分股)
    # 注意:get_index_stocks 不应在 initialize 中调用
    raw_stocks = get_index_stocks('000300.SS')
    
    # 2. 使用 filter_stock_by_status 剔除 ST、停牌、退市股票
    # filter_type 参数默认就是 ["ST", "HALT", "DELISTING"],也可以显式写出来
    g.security = filter_stock_by_status(raw_stocks, filter_type=["ST", "HALT", "DELISTING"])
    
    # 3. 设置最终的股票池
    set_universe(g.security)
    
    log.info("原始股票数量: %d, 剔除后股票数量: %d" % (len(raw_stocks), len(g.security)))

def handle_data(context, data):
    # 在这里执行交易逻辑,此时 g.security 已经是剔除过的干净列表
    pass

方法二:使用 get_stock_status(手动过滤)

如果你需要更精细的控制(例如只想剔除ST,但保留停牌股,或者需要知道具体是因为什么原因被剔除),可以使用 get_stock_status 函数手动编写循环逻辑。

代码示例:

def initialize(context):
    g.security = []

def before_trading_start(context, data):
    # 1. 获取原始股票池
    raw_stocks = get_index_stocks('000300.SS')
    
    # 2. 获取股票状态信息
    # 查询是否ST
    is_st = get_stock_status(raw_stocks, 'ST')
    # 查询是否停牌
    is_halt = get_stock_status(raw_stocks, 'HALT')
    # 查询是否退市
    is_delisting = get_stock_status(raw_stocks, 'DELISTING')
    
    clean_stocks = []
    
    # 3. 遍历并筛选
    for stock in raw_stocks:
        # 如果是ST、停牌或退市,则跳过
        if is_st[stock] or is_halt[stock] or is_delisting[stock]:
            continue
        clean_stocks.append(stock)
    
    g.security = clean_stocks
    set_universe(g.security)
    log.info("筛选完成,剩余股票数量:%d" % len(g.security))

def handle_data(context, data):
    pass

总结

  • 一般情况:直接使用 方法一 (filter_stock_by_status),代码简洁且运行效率高。
  • 特殊需求:如果需要对被剔除的股票做统计或特殊处理,再考虑使用方法二。