🚀 AI 一键生成 ptrade 策略代码

PTrade 交易必备:如何用 get_stock_status 实时判断股票是否 ST 或停牌?

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

问题描述

在买入一只股票之前,我想先确认一下它今天是不是ST或者停牌了,用哪个函数可以查?

解决方案

在 PTrade 中,查询股票是否为 ST 或停牌状态,主要使用 get_stock_status 函数。

此外,如果您需要对一个股票列表进行批量过滤(直接剔除 ST 和停牌的股票),也可以使用 filter_stock_by_status 函数。

以下是这两个函数的详细用法和代码示例。

1. 基础查询函数:get_stock_status

该函数用于查询指定日期股票的 ST、停牌、退市属性。

函数签名:
get_stock_status(stocks, query_type='ST', query_date=None)

参数说明:

  • stocks: 股票代码(字符串或列表),例如 '600570.SS'['600570.SS', '000001.SZ']
  • query_type: 查询类型。
    • 'ST': 查询是否为 ST 股票。
    • 'HALT': 查询是否停牌。
    • 'DELISTING': 查询是否退市。
  • query_date: 查询日期(字符串 'YYYYMMDD'),默认为 None(取当前回测或交易时间)。

返回值:
返回一个字典 dict,Key 是股票代码,Value 是布尔值(True 表示是 ST 或停牌,False 表示正常)。


2. 策略代码示例

以下代码展示了如何在下单前检查单只股票是否为 ST 或停牌。

def initialize(context):
    # 设置我们要操作的股票
    g.security = '600570.SS'
    set_universe(g.security)

def handle_data(context, data):
    stock = g.security
    
    # 1. 查询是否为 ST
    # 返回格式为 {'600570.SS': False},所以需要通过 [stock] 获取具体布尔值
    is_st_dict = get_stock_status(stock, query_type='ST')
    is_st = is_st_dict.get(stock, False)
    
    # 2. 查询是否停牌
    is_halt_dict = get_stock_status(stock, query_type='HALT')
    is_halt = is_halt_dict.get(stock, False)
    
    # 3. 判断逻辑:只有既不是ST也不是停牌时,才进行买入
    if is_st:
        log.info("股票 %s 是ST股,跳过交易" % stock)
    elif is_halt:
        log.info("股票 %s 正在停牌,跳过交易" % stock)
    else:
        log.info("股票 %s 状态正常,准备买入" % stock)
        # 检查资金并下单
        order(stock, 100)

3. 进阶:批量过滤函数 filter_stock_by_status

如果您有一个股票池(列表),想要一次性剔除所有 ST、停牌或退市的股票,使用 filter_stock_by_status 会更加高效。该函数通常在 before_trading_start 中使用。

代码示例:

def initialize(context):
    # 假设这是我们的初始股票池
    g.stock_list = ['600570.SS', '000001.SZ', '600000.SS']
    set_universe(g.stock_list)

def before_trading_start(context, data):
    # 一次性过滤掉 ST、停牌、退市的股票
    # 返回的 g.tradeable_stocks 是一个清洗后的列表
    g.tradeable_stocks = filter_stock_by_status(g.stock_list, filter_type=["ST", "HALT", "DELISTING"])
    
    log.info("今日可交易股票列表: %s" % g.tradeable_stocks)

def handle_data(context, data):
    # 只对过滤后的股票进行操作
    for stock in g.tradeable_stocks:
        order(stock, 100)

Q&A

Q1: get_stock_status 返回的字典中,如果股票代码不存在或输入错误,Value 会是什么?
A1: 如果没有查询到相关数据或者输入有误,对应的 Value 为 None。在代码中建议使用 .get(stock, False) 来避免空值报错。

Q2: 回测时 get_stock_status 会用到未来数据吗?
A2: 不会。如果不传入 query_date,它默认使用回测当前的日期(context.blotter.current_dt),获取的是当时的历史状态。

Q3: filter_stock_by_status 可以只过滤停牌,不过滤 ST 吗?
A3: 可以。通过调整 filter_type 参数即可。例如:filter_stock_by_status(stocks, filter_type=["HALT"]) 仅过滤停牌股票。

Q4: 为什么有时候 get_stock_status 查询停牌返回 False,但下单还是失败提示停牌?
A4: get_stock_status 获取的是当天的停牌状态。如果股票在盘中临时停牌(如临时停牌一小时),日线级别的数据可能无法即时反映。但在大多数日线回测和常规交易场景中,该函数是准确的。对于高频交易,建议结合 get_snapshot 查看 trade_status 字段。