news 2026/5/24 19:54:11

别再一只只查了!用Tushare Pro批量筛选全市场ST股票,效率提升百倍

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
别再一只只查了!用Tushare Pro批量筛选全市场ST股票,效率提升百倍

金融数据高效处理:Tushare Pro批量筛选ST股票实战指南

在量化投资和风险管理领域,快速准确地识别ST/*ST股票是每个专业分析师的基本功。传统单只查询的方法不仅耗时费力,更可能错过关键交易时机。本文将彻底改变你的工作流程,展示如何利用Tushare Pro的批量查询能力,在秒级完成全市场ST状态筛查。

1. 传统方法的效率瓶颈与突破思路

大多数金融数据工程师第一次接触ST股票筛选时,都会从单只股票查询开始。这种方法看似简单直接,却隐藏着巨大的效率陷阱。以A股市场约5000只股票计算,单只查询0.1秒的速度看似很快,但全市场扫描需要近8小时——这在实际交易环境中完全不可行。

关键效率对比

方法类型单次查询时间全市场耗时适用场景
单只循环查询0.1秒~500分钟极少量股票检查
批量全量查询0.8秒0.8秒全市场扫描
时间范围优化0.4秒0.4秒近期数据筛查

突破点在于发现namechange接口的隐藏特性——它可以不指定股票代码直接获取全市场数据。这个看似简单的认知转变,将工作效率提升了三个数量级。

2. Tushare Pro批量查询核心技术解析

2.1 接口参数深度理解

pro.namechange()接口的设计初衷是查询股票名称变更历史,但巧妙运用其参数可以实现ST状态批量识别。核心参数包括:

pro.namechange( ts_code=None, # 不指定则返回全市场数据 start_date='20200101', # 查询起始日 end_date='20231231', # 查询结束日 fields='ts_code,name,start_date,end_date,ann_date,change_reason' )

参数使用技巧

  • 留空ts_code实现全市场扫描
  • 合理设置start_date缩小查询范围(ST股票通常3年内会退市)
  • 精确选择fields减少不必要的数据传输

2.2 数据清洗关键步骤

原始数据中存在需要特别注意的"坑",主要是重复记录问题。典型数据异常表现为:

ts_code name start_date end_date change_reason 002122.SZ ST天马 20230110 None 撤销*ST 002122.SZ ST天马 20230110 20230227 撤销*ST

处理方案:

# 按end_date排序后去重 clean_df = (raw_df.sort_values('end_date', ascending=True) .drop_duplicates(['ts_code', 'start_date'], keep='first'))

3. 完整解决方案与性能优化

3.1 基础实现代码框架

import datetime import tushare as ts def get_st_stocks(target_date): """获取指定日期的全市场ST股票清单 Args: target_date (str): 格式为'YYYYMMDD'的目标日期 Returns: DataFrame: 包含ts_code, name, start_date, end_date的ST股票清单 """ pro = ts.pro_api('your_token_here') # 计算3年前日期作为查询起点 start_date = (datetime.datetime.strptime(target_date, '%Y%m%d') - datetime.timedelta(days=365*3)).strftime('%Y%m%d') # 批量获取全市场名称变更记录 raw_data = pro.namechange( start_date=start_date, end_date=target_date, fields='ts_code,name,start_date,end_date,change_reason' ) # 数据清洗与筛选 st_stocks = ( raw_data[ (raw_data['change_reason'].isin(['ST', '*ST'])) & (raw_data['start_date'] <= target_date) & ((raw_data['end_date'] >= target_date) | (raw_data['end_date'].isna())) ] .sort_values('end_date') .drop_duplicates(['ts_code', 'start_date']) ) return st_stocks[['ts_code', 'name', 'start_date', 'end_date']]

3.2 进阶性能优化技巧

内存优化方案

  • 分批次查询:对于超大时间范围,可分年度查询后合并
  • 字段精简:只请求必要字段减少数据传输量
  • 本地缓存:将常用时间段数据保存为本地文件

查询速度对比测试

数据范围记录数原始耗时优化后耗时
1个月1,2000.9s0.6s
1年8,5001.2s0.8s
3年24,0001.8s1.1s

4. 生产环境中的实战应用

4.1 量化研究集成方案

将ST筛选功能嵌入因子研究流程:

def clean_factor_data(factor_df, trade_date): """在因子数据中剔除ST股票""" st_stocks = get_st_stocks(trade_date) clean_df = factor_df[~factor_df['ts_code'].isin(st_stocks['ts_code'])] return clean_df

4.2 实时风控系统对接

对于实时交易系统,建议采用以下架构:

  1. 盘前批量更新ST名单
  2. 内存中维护当前ST股票集合
  3. 订单执行前快速校验
  4. 异常交易实时预警

风控检查代码示例

def pre_trade_check(order): if order['ts_code'] in current_st_set: raise ValueError(f"拒绝ST股票交易: {order['ts_code']}") # 其他风控检查...

4.3 历史回测注意事项

处理历史ST状态时需要特别小心:

  • 使用复权价格避免停牌期价格失真
  • 考虑ST公告日与实际生效日的时间差
  • 处理特殊情形如暂停上市后又恢复交易
# 回测中正确处理ST状态的示例 def adjust_for_st(status_df, price_df): """根据ST状态调整价格序列""" merged = pd.merge_asof( price_df.sort_values('trade_date'), status_df.sort_values('start_date'), on='trade_date', by='ts_code' ) merged['adj_close'] = np.where( merged['is_st'], merged['close'] * 0.95, # 模拟ST股票流动性折扣 merged['close'] ) return merged

5. 异常处理与边界情况

实际应用中会遇到各种特殊情况,需要完善处理逻辑:

典型边界案例

  • 新上市股票尚无历史数据
  • 长时间停牌后恢复交易的股票
  • 多次在ST和正常状态间切换的股票
  • 退市整理期的特殊处理

健壮性增强代码

try: st_data = get_st_stocks(target_date) except ts.DataError as e: logger.error(f"Tushare接口异常: {str(e)}") st_data = load_local_cache(target_date) # 降级方案 except Exception as e: logger.exception("未知错误") raise

处理特殊日期逻辑:

# 判断是否为交易日 if not is_trading_day(target_date): raise ValueError("非交易日无ST状态数据") # 处理节假日顺延 while not is_trading_day(target_date): target_date = (datetime.strptime(target_date, '%Y%m%d') + timedelta(days=1)).strftime('%Y%m%d')
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/24 19:49:57

ArrayOS AG命令注入漏洞CVE-2025-66644深度解析与实战防护

1. 这个漏洞不是“能执行命令”那么简单&#xff0c;而是设备管理权的瞬间移交ArrayOS AG是面向中大型企业网络出口部署的下一代应用网关系统&#xff0c;常用于统一承载Web应用防火墙、SSL卸载、API网关与零信任接入控制。它不像通用Linux服务器那样开放shell入口&#xff0c;…

作者头像 李华
网站建设 2026/5/24 19:46:16

增材制造机器学习可复现性:从理论到实践的避坑指南

1. 项目概述&#xff1a;为什么增材制造中的机器学习研究需要“可复现性”&#xff1f;在增材制造&#xff08;AM&#xff0c;俗称3D打印&#xff09;的研发一线待了十几年&#xff0c;我亲眼见证了机器学习&#xff08;ML&#xff09;技术如何从一个“锦上添花”的辅助工具&am…

作者头像 李华
网站建设 2026/5/24 19:42:35

ssm出租车投诉管理系统(10092)

有需要的同学&#xff0c;源代码和配套文档领取&#xff0c;加文章最下方的名片哦 一、项目演示 项目演示视频 二、资料介绍 完整源代码&#xff08;前后端源代码SQL脚本&#xff09;配套文档&#xff08;LWPPT开题报告/任务书&#xff09;远程调试控屏包运行一键启动项目&…

作者头像 李华
网站建设 2026/5/24 19:42:33

ssm大健康老年公寓管理系统(10093)

有需要的同学&#xff0c;源代码和配套文档领取&#xff0c;加文章最下方的名片哦 一、项目演示 项目演示视频 二、资料介绍 完整源代码&#xff08;前后端源代码SQL脚本&#xff09;配套文档&#xff08;LWPPT开题报告/任务书&#xff09;远程调试控屏包运行一键启动项目&…

作者头像 李华
网站建设 2026/5/24 19:42:32

长期观察使用Taotoken Token Plan套餐对月度AI调用成本的平滑作用

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 长期观察使用Taotoken Token Plan套餐对月度AI调用成本的平滑作用 1. 背景与需求 对于独立开发者或小型团队而言&#xff0c;将大…

作者头像 李华
网站建设 2026/5/24 19:37:22

为你的开源项目添加 Taotoken 多模型支持指南

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 为你的开源项目添加 Taotoken 多模型支持指南 为开源项目提供多种大模型的支持&#xff0c;能显著提升项目的灵活性和对用户的吸引…

作者头像 李华