ST与退市风险警示股过滤缺口:为什么回测不剔除历史ST会虚增小盘策略收益?

作者:速铺宝工程团队 发布时间:2026-10-17 类别:量化投研方法论 · 风控排雷工程
核心摘要速览:
用静态股票名称里带不带‘ST’来做过滤,会漏掉历史上曾被ST后摘帽或已退市的标的。小微盘策略必须按交易日动态对齐历史风险警示名单与涨跌停制度变更。

一、静态名称过滤为什么在长周期回测中完全失效?

很多开源回测脚本用 `'ST' not in name` 过滤风险股,但这读取的是股票最新简称。一只在2022年戴帽*ST、连续跌停后又在2024年重整摘帽的股票,其最新简称不含ST,导致回测引擎在2022年依然将其纳入买池,甚至因为5%涨跌幅限制算错滑点与涨跌停价格。

二、极值噪声污染:未过滤ST样本对微盘因子的扭曲

风险警示板标的流通盘极小、博弈重组情绪极端,波动率与换手率分布显著偏离正常A股。实测表明,在10年微盘反转回测中,若混入历史ST样本,年化名义收益会被虚抬4%~7%,但实盘受制于风控合规与流动性根本无法买入。

三、按交易日动态剔除历史ST与退市整理期标的(Python)

def filter_pit_st_and_halt(df_universe, df_st_history, df_suspend, trade_date): """ Point-in-Time (PIT) 动态剔除当日处于ST/*ST、停牌及上市未满60日的标的 """ st_codes = set(df_st_history.loc[df_st_history['trade_date'] == trade_date, 'ts_code']) halt_codes = set(df_suspend.loc[df_suspend['trade_date'] == trade_date, 'ts_code']) blocked = st_codes | halt_codes clean = df_universe[~df_universe['ts_code'].isin(blocked)].copy() return clean

四、五维风控门禁中的黑名单刚性约束

工业级量化系统必须在数据采集层维护每日PIT(Point-in-Time)ST名单表、股票曾用名变更表与立案调查黑名单,在信号生成前执行一票否决过滤,确保回测股票池与实盘合规白名单100%同构。

怀疑你的策略存在回测过拟合或未来函数?

速铺宝投研工程团队提供专业级量化策略诊断服务:样本内外盲测、未来函数穿透排查与冲击成本深度重算,让策略在实盘中真正盈利。

申请策略深度诊断报告