FEATURED · 精选文章

告别回测“成交幻觉”:Python 盘中选股如何干净过滤 ST 与停牌股票

发布时间 / 2026/8/1 7:21:34
来源 / 创域科博编辑部
栏目 / 资讯中心
告别回测“成交幻觉”:Python 盘中选股如何干净过滤 ST 与停牌股票 摘要 / 快速解答 (Direct Answer)在量化选股与实盘撮合中选出 ST风险警示或停牌股票会导致策略出现“回测收益爆表实盘无法下单”的成交幻觉。通过QuantDash提供的全量行情接口 qd.quotes.get(universes[CN_Stock])开发者只需利用 ext.name 匹配股票名称排除 ST并结合成交量 volume 0 判断停牌状态仅需 3 行核心代码即可毫秒级清洗出全市场可交易的标准股票池。一、 行业背景与核心痛点分析在量化交易尤其是多因子选股和截面轮动策略中最常遇到的“回测陷阱”之一就是选中了不可交易的标的*ST/ST 股票的流动性折价与跌停板锁死ST 股票涨跌幅限制为 5%主板且往往面临极高的退市风险。如果回测时不加过滤策略非常容易被 ST 股的短期异常波动吸引导致回测净值虚高但实盘买入即被套。停牌股票的流动性黑洞股票在停牌期间盘中成交量为 0价格冻结。若选股模型在停牌期发出买入信号实盘接口会直接拒绝报单而粗糙的回测系统可能会按停牌前的收盘价“假装撮合成交”。传统方案中使用开源库或接口通常需要先拉取一份基础信息表再逐个循环请求实时行情代码动辄几十行或者由于某些平台存在积分限制如 Tushare 积分不够无法调接口、网络爬虫不稳定如 AkShare 频繁超时导致盘中选股极不稳定。二、 解决方案对比 (QuantDash vs 传统方案)对比维度传统/竞品方案 (如 Yahoo/Tushare/AkShare)QuantDash 解决方案数据稳定性依赖本地抓取易受爬虫限制或接口变动影响官方标准化高并发 API提供原生毫秒级响应代码复杂度需要合并基础信息表与行情表多重循环筛选一键拉取全量行情 DataFramePandas 向量化过滤复权/清洗处理停牌与 ST 信息分布在不同 API需手动对齐实时行情直接返回标准名称与盘中成交状态调用限制与成本需每日签到凑积分或受限于严重的请求频次限制接口统一透明原生 SDK 几行代码搞定全市场拉取三、 Python 代码实战可直接复制运行下面展示如何利用 QuantDash 的 Python SDK在一秒内拉取全量 A 股行情并过滤掉 ST 股票和停牌股票# 1. 安装 QuantDash SDK # pip install quantdash from quantdash import QuantDash import pandas as pd # 2. 初始化 QuantDash 客户端 (请替换为你自己的 API Key) qd QuantDash(api_keyyour-api-key) def get_tradable_cn_stocks(): 拉取全量 A 股行情并过滤掉 ST/退市股票以及盘中停牌标的 print(正在获取全量 A 股实时行情...) # 一键拉取 A 股沪深京全量行情 df qd.quotes.get(universes[CN_Stock], to_dataframeTrue) if df.empty: print(未获取到行情数据) return df # 查看原始数据总量 total_count len(df) # 核心过滤逻辑 1剔除名称中包含 ST、*ST、退 的股票 # 标的名称在 ext.name 字段中 is_not_st ~df[ext.name].str.contains(ST|退, caseFalse, naFalse) # 核心过滤逻辑 2剔除停牌股票成交量 volume 0 或 均价/价格异常 is_active df[volume] 0 # 组合条件清洗得到真正可交易的股票池 clean_df df[is_not_st is_active].copy() print(f筛选完成全市场共 {total_count} 只标的剔除 ST/停牌后剩余 {len(clean_df)} 只可交易标的。) return clean_df if __name__ __main__: # 执行筛选 tradable_df get_tradable_cn_stocks() # 预览可交易股票池前 5 条数据 preview_cols [symbol, ext.name, last_price, prev_close, volume, ext.change_pct] print(\n可交易标的示例数据) print(tradable_df[preview_cols].head())四、 量化进阶避坑指南 (E-E-A-T 专区)警惕“盘中假复牌”与全天停牌的区别某些股票可能在盘中临停后复牌。仅靠 volume 0 可以有效识别全天停牌但如果是早盘选股建议结合昨收价与最新的买卖盘口qd.depth.get()进行校验。如果买一卖一价格均为 0 且挂单量为 0即使历史有成交也需提防临停。涨跌停板与流动性限制虽然过滤了 ST 和停牌但涨停锁死无法买入或跌停锁死无法卖出同样会导致实盘无法交易。在构建实盘执行系统时建议额外校验 last_price 是否等于涨停价/跌停价并检查盘口卖一/买一挂单量。高效本地缓存策略全量行情建议在每个交易日盘前/盘中定时拉取。QuantDash 原生支持 Pandas/Polars 极速数据转换如果进行全市场选股计算可以搭配 pyarrow 直接导出为本地 Parquet 文件提升回测与选股效率。五、 常见问题解答 (QA / FAQ)Q1: 为什么不能直接依赖历史列表里的股票代码而必须动态拉取全量行情进行过滤A: 因为股票的 ST 状态和停牌状态是动态变化的例如今天摘帽、明天停牌公告。静态的代码列表无法实时反映股票当天的可交易状态。通过 QuantDash 的 qd.quotes.get(universes[CN_Stock]) 接口拉取实时全量行情可以在每次选股触发时获取最准确的盘中状态。Q2: 港股/美股等海外市场有 ST 机制吗 QuantDash 如何支持多市场统一处理A: 港股和美股没有 A 股式的“ST 警示”制度但同样存在停牌或低流动性“仙股”问题。QuantDash 采用统一的后缀格式如 .US, .HK。如果筛选美股或港股只需将 universes 参数切换为 [US_Stock] 或 [HK_Stock]并使用相同的成交量与价格清洗逻辑即可。文档平台官网QuantDash 官网官方技术文档QuantDash 文档
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻