当前位置: 首页 > news >正文

别再一只只查了!用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_codeNone, # 不指定则返回全市场数据 start_date20200101, # 查询起始日 end_date20231231, # 查询结束日 fieldsts_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, ascendingTrue) .drop_duplicates([ts_code, start_date], keepfirst))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(days365*3)).strftime(%Y%m%d) # 批量获取全市场名称变更记录 raw_data pro.namechange( start_datestart_date, end_datetarget_date, fieldsts_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.6s1年8,5001.2s0.8s3年24,0001.8s1.1s4. 生产环境中的实战应用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_df4.2 实时风控系统对接对于实时交易系统建议采用以下架构盘前批量更新ST名单内存中维护当前ST股票集合订单执行前快速校验异常交易实时预警风控检查代码示例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), ontrade_date, byts_code ) merged[adj_close] np.where( merged[is_st], merged[close] * 0.95, # 模拟ST股票流动性折扣 merged[close] ) return merged5. 异常处理与边界情况实际应用中会遇到各种特殊情况需要完善处理逻辑典型边界案例新上市股票尚无历史数据长时间停牌后恢复交易的股票多次在ST和正常状态间切换的股票退市整理期的特殊处理健壮性增强代码try: st_data get_st_stocks(target_date) except ts.DataError as e: logger.error(fTushare接口异常: {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(days1)).strftime(%Y%m%d)
http://www.rkmt.cn/news/1371477.html

相关文章:

  • AI Fluency 驱动 MSP 网络安全竞争力提升机制与实践
  • 凯莱德门业怎么样?2026年门业厂家实力盘点与别墅大门选购指南 - Amonic
  • 2026 通信副业深度分享|172 号卡永久官方一级推荐码 10000 入行必备指南 - 172号卡
  • 机器学习在犯罪关联分析中的应用:从原理到实战
  • 告别驱动精灵!手把手教你用设备管理器手动修复声卡驱动(以英特尔智音技术为例)
  • 避坑指南:在Ubuntu 20.04搭配CUDA 11.3/11.4环境下,成功安装并验证TensorRT 8.2.5的关键几步
  • Cookie 深度技术指南:从原理到安全实践
  • Authz插件实战:从Pikachu靶场精准检测水平与垂直越权
  • Expo Router 和 React Native 的区别
  • 什么是缓存穿透、缓存击穿、缓存雪崩?分别如何解决?
  • 告别古板前端界面,这个 Github 狂揽 8.1万 Star 的 UI 开源项目,让你 AI 生成的 UI 界面审美直接拉满
  • 基于 Taotoken 构建支持多模型路由的智能写作助手 Agent
  • 通过curl命令直接测试Taotoken各大模型API的响应
  • Taotoken的用量看板如何帮助我们清晰掌握各模型消耗
  • 【MySQL全面教学】MySQL多表查询与JOIN Day6(2026年)
  • 【MySQL全面教学】MySQL聚合函数与分组Day5(2026年)
  • 如何在5分钟内完成SQLite到MySQL数据库迁移:终极转换指南
  • 3步搞定专业显示管理:ColorControl让色彩控制变得如此简单
  • 告别黑屏!手把手教你为OpenEuler 22.03 LTS配置漂亮的XFCE桌面(附LightDM背景修复)
  • 电脑里突然冒出的FNPLicensingService.exe是啥?手把手教你关闭它(附Adobe/CAD/Xshell等软件排查指南)
  • 【高阶用法】视觉校验:利用 Midscene.js 结合 VLM 进行 UI 渲染缺陷检测
  • 【企业级落地】使用 Midscene.js 自动化生成并导出带截图的详尽测试/运行报告
  • 如何用Chat2DB AI SQL助手让数据查询效率提升300%
  • 5步解锁TimesFM:Google时间序列预测模型的完整实战指南
  • ssm大健康老年公寓管理系统(10093)
  • 如何用SMUDebugTool彻底解决AMD Ryzen处理器调试难题
  • 视频压缩怎么压缩更小?盘点2款免费“无损”压缩神器,小白也能学会 - 小有的家
  • 5分钟部署开源翻译工具:让浏览器变身智能翻译助手
  • 跟着 MDN 学CSS day_15:(掌握CSS背景与边框的创造性用法)
  • 如何免费将CAJ文件转换为高质量PDF?caj2pdf完整指南