3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在量化交易中,买入 ST 股、停牌股 或 面临退市的股票 往往会导致策略出现非预期的交易失败、资金占用甚至严重亏损。因此,在每日盘前或下单前进行股票状态过滤是量化策略的“刚需”操作。
ptrade 提供了两个非常实用的 API 来解决这个问题:get_stock_status(状态查询)和 filter_stock_by_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 为 True 或 False。若无数据则返回 None。如果您想直接剔除这些异常股票,使用 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
get_stock_status 涉及基础数据查询,在 handle_data(尤其是分钟或 tick 级别)中频繁调用会增加耗时。建议在 before_trading_start 中一次性完成过滤,并将结果保存在 g 全局变量中。filter_stock_by_status 时,建议将 "DELISTING_SORTING" 写入 filter_type 参数中一并过滤。get_stock_info 获取 listed_date(上市日期),计算上市天数,剔除上市未满 90 天的新股。