【Python量化实战 #13】想有自己的选股器?从零搭一套 Python 多条件筛选+回测系统
连载系列「Python量化实战」第 13 篇模块六 · 量化策略实战。上一篇《Python多因子选股模型搭建》用打分排序解决谁更好本篇换一种更直观的思路——多条件筛选解决谁合格并把入选组合放回历史里验证效果。搭建一个 Python 量化选股系统核心就四步批量拉取股票池数据 → 按多个条件逐层筛选 → 对入选组合做历史回测 → 结果导出复盘。多数教程只讲到筛出名单就结束了但名单不回测等于没有闭环——你不知道这套条件历史上到底管不管用。本文用 mairui SDK 把四步完整走通条件写成可插拔的规则列表筛选过程打印漏斗入选组合与全池基准对比净值全部代码可直接运行。本文你将得到什么一套可插拔的选股系统规则列表式多条件筛选漏斗可视化 入选组合 vs 全池基准回测 CSV 导出复盘真实运行结果20 只池筛出 3 只入选组合 21.65% vs 全池 -4.79%及回测意义是证伪的讨论缺失值、前复权、幸存者偏差等 5 个避坑点及改配置不改代码的进阶方向一、在线体验想先看看筛选用的行情快照接口返回什么字段打开 API Playground 在线调用即可https://mairuiapi.com/playground建议先在 Playground 里测试实时交易数据接口能直接看到pe市盈率、sjl市净率、zdf6060日涨跌幅等字段——这些就是下文筛选条件的数据来源。二、环境准备本文代码使用 mairui SDK 获取股票数据安装方法如下pipinstallmairuiSDK 的完整接口文档与使用说明请查阅 GitHub 仓库https://github.com/MaiRuiApi/mairui接口的详细参数说明请查阅官网 API 文档https://mairuiapi.com/hsdata运行环境Python 3.9mairui SDK 1.0.0pandas 2.2 / numpyimportosimportmairui# 证书从环境变量读取注册后可在官网获取apimairui.Client(os.environ[MAIRUI_LICENCE])本文数据截至 2026-07-28行情为实时快照回测区间 2025-07-28 至 2026-07-27读者复现时数值会随行情更新而变化。三、第一步批量拉取股票池数据选股系统的地基是一张股票池指标快照表。本文用 20 只跨行业沪深大盘股做演示池固定池便于复现实际使用时换成指数成分股或全市场列表即可代码结构不变。每只股票取 5 个筛选用指标分别来自两个接口stock_ssjy实时快照提供现价、PE、PB、60日涨跌幅stock_pershareindex历季财务指标提供 ROE。importtimeimportnumpyasnpimportpandasaspd# 示例股票池沪深大盘股样本跨行业实际可换成指数成分股/全市场列表STOCK_POOL{600519:贵州茅台,000858:五粮液,601318:中国平安,600036:招商银行,601166:兴业银行,000333:美的集团,600900:长江电力,601088:中国神华,600030:中信证券,000651:格力电器,600276:恒瑞医药,300750:宁德时代,601899:紫金矿业,600887:伊利股份,601668:中国建筑,002594:比亚迪,601012:隆基绿能,600809:山西汾酒,000002:万科A,601398:工商银行,}defto_num(value):接口缺失值以 - 返回统一转成 NaN。try:returnfloat(value)except(TypeError,ValueError):returnnp.nandeffetch_stock_snapshot(api,code,name):取单只股票的筛选用指标。snapapi.stock_ssjy(code)# 实时交易快照snapsnap[0]ifisinstance(snap,list)elsesnap fin_rowsapi.stock_pershareindex(code)# 历季财务指标[-1] 为最新一期finfin_rows[-1]iffin_rowselse{}return{code:code,name:name,price:to_num(snap.get(p)),pe:to_num(snap.get(pe)),# 市盈率动pb:to_num(snap.get(sjl)),# 市净率momentum_60d:to_num(snap.get(zdf60)),# 60日涨跌幅(%)roe:to_num(fin.get(jzcsyl)),# 净资产收益率(%)}defbuild_universe(api):records[]forcode,nameinSTOCK_POOL.items():records.append(fetch_stock_snapshot(api,code,name))time.sleep(0.2)# 控制请求频率returnpd.DataFrame(records)关键解释财务接口的缺失值以字符串-返回to_num统一转成NaN后续筛选时NaN会被当作不通过处理避免脏数据混进名单。四、第二步多条件筛选组合器选股系统最怕把条件写死在一堆if里——每次调整策略都要改逻辑代码。更好的做法是把条件抽象成(名称, 判断函数)的规则列表增删条件只改配置# 条件写成 (名称, 判断函数) 列表增删条件只需改这里SCREEN_RULES[(PE介于0~30,lambdadf:(df[pe]0)(df[pe]30)),(PB低于5,lambdadf:df[pb]5),(ROE不低于10%,lambdadf:df[roe]10),]defrun_screener(universe_df,rules):逐条应用筛选规则打印每一步剩余数量筛选漏斗。maskpd.Series(True,indexuniverse_df.index)print(f初始股票池:{len(universe_df)}只)forrule_name,rule_fninrules:maskrule_fn(universe_df).fillna(False)print(f通过[{rule_name}]后剩余:{int(mask.sum())}只)returnuniverse_df[mask].reset_index(dropTrue)真实运行的筛选漏斗输出如下2026-07-28 实时数据 筛选漏斗 初始股票池: 20 只 通过[PE介于0~30]后剩余: 16 只 通过[PB低于5]后剩余: 15 只 通过[ROE不低于10%]后剩余: 3 只 入选名单 code name price pe pb roe momentum_60d 300750 宁德时代 398.37 21.29 4.86 12.08 -10.48 601899 紫金矿业 31.47 10.42 4.42 10.40 -6.78 600809 山西汾酒 122.80 6.96 4.05 12.72 -14.21关键解释漏斗式打印能直观看到每个条件杀掉了多少股票——如果某个条件一下子筛掉 90%通常说明阈值过严或数据口径有问题这是调试选股条件最实用的手段。PE 0同时排除了亏损股亏损股 PE 为负不具可比性。五、第三步入选组合历史回测名单筛出来只是一半另一半是回答这套条件历史上表现如何。做法拉取全池近一年前复权日 K 线入选组合等权持有与全池等权基准对比净值。deffetch_close_series(api,code,start,end):拉前复权日K返回以日期为索引的收盘价序列。rowsapi.stock_history(code,d,f,ststart,etend)# d日线 f前复权kline_dfpd.DataFrame(rows)kline_df[t]pd.to_datetime(kline_df[t])returnkline_df.set_index(t)[c].astype(float).sort_index()defbacktest_portfolio(api,picked,benchmark_pool,start,end):等权持有入选组合与全池等权基准对比教学用不含手续费/调仓。closes{}forcodeinbenchmark_pool:closes[code]fetch_close_series(api,code,start,end)time.sleep(0.2)close_dfpd.DataFrame(closes).dropna()ret_dfclose_df.pct_change().fillna(0)# 日收益率picked_codes[cforcinpicked[code]ifcinclose_df.columns]navpd.DataFrame({入选组合:(1ret_df[picked_codes].mean(axis1)).cumprod(),全池基准:(1ret_df.mean(axis1)).cumprod(),})returnnav真实回测输出回测区间 2025-07-28 至 2026-07-27共 242 个交易日 回测结果2025-07-28 ~ 2026-07-27, 共242个交易日 入选组合累计收益: 21.65% | 全池等权基准: -4.79%关键解释stock_history的st/et参数只认YYYYMMDD格式第三个参数f表示前复权回测必须用复权价否则除权缺口会被当成暴跌。这次筛选条件在过去一年跑赢了全池基准约 26 个百分点但务必清醒单次、单区间、小样本池的回测结果不代表条件本身长期有效换一个区间结论完全可能反转——回测的意义是证伪明显糟糕的条件而不是证明未来能赚钱。六、完整实战示例把四步串成完整可运行脚本含结果导出importosimportmairui apimairui.Client(os.environ[MAIRUI_LICENCE])# 1) 批量取数universe_dfbuild_universe(api)# 2) 多条件筛选picked_dfrun_screener(universe_df,SCREEN_RULES)print(picked_df[[code,name,price,pe,pb,roe]].round(2))# 3) 历史回测入选组合 vs 全池等权nav_dfbacktest_portfolio(api,picked_df,STOCK_POOL,20250728,20260727)total(nav_df.iloc[-1]-1)*100print(f入选组合:{total[入选组合]:.2f}% | 全池基准:{total[全池基准]:.2f}%)# 4) 结果导出便于 Excel 复盘universe_df.to_csv(universe_snapshot.csv,indexFalse,encodingutf-8-sig)picked_df.to_csv(picked_stocks.csv,indexFalse,encodingutf-8-sig)nav_df.to_csv(backtest_nav.csv,encodingutf-8-sig)导出三张表universe_snapshot.csv全池指标快照、picked_stocks.csv入选名单、backtest_nav.csv净值曲线可直接在 Excel 里画图。CSV 用utf-8-sig编码Excel 打开不乱码。七、避坑与进阶缺失值必须显式处理筛选条件里NaN参与比较结果是False看似自动排除但mask rule_fn(df)时若不fillna(False)NaN会在取反、组合等场景产生意外结果务必显式处理。回测必须用前复权价stock_history第三个参数传f。用不复权价回测分红除权日会被算成大跌结论完全失真。警惕幸存者偏差与过拟合固定池演示没有包含已退市股票条件调到历史收益最好看就是过拟合。实用做法是把条件的经济含义讲清楚低估值高质量而非无限调参。频率控制批量拉取时加time.sleep(0.2)20 只以内很快全市场级别的批量拉取与并发方案本系列工程化篇#16会专门展开。进阶方向把SCREEN_RULES改成从 JSON/YAML 配置文件加载即可做成改配置不改代码的选股服务再配合定时任务每日收盘后自动跑一遍并推送名单。八、总结与延伸本文从零搭建了一个可扩展的 Python 量化选股系统stock_ssjystock_pershareindex批量取数、规则列表式多条件筛选漏斗可视化、入选组合 vs 全池基准的历史回测、CSV 导出复盘。系统的价值不在筛出了哪 3 只而在这套可插拔、可回测、可复盘的结构——条件随你换验证框架不变。下一篇预告【Python量化实战 #14】将接入专业回测框架 backtrader跑通第一个带手续费、夏普比率与最大回撤分析的策略回测。延伸阅读在线体验更多接口https://mairuiapi.com/playground查看完整 API 文档https://mairuiapi.com/hsdataSDK 文档与源码https://github.com/MaiRuiApi/mairui关注公众号获取更多技术分享本文为技术演示文中股票仅为代码示例样本不构成投资建议。市场有风险投资需谨慎。

相关新闻

双平台部署|OpenClaw Windows2.9.0 /macOS2.7.9 安装步骤(含安装包)

双平台部署|OpenClaw Windows2.9.0 /macOS2.7.9 安装步骤(含安装包)

五分钟搭建 OpenClaw 本地 AI|Windows 可视化部署,实现办公自动化🦞 前言💫 如今桌面智能 Agent 越来越普及,OpenClaw 凭借强大的本地操控能力,收获众多办公爱好者关注。和普通聊天 AI 不同,它…

2026/8/3 16:36:40 阅读更多 →
阴阳师百鬼夜行自动化脚本:智能AI解放双手,高效收集式神碎片终极方案

阴阳师百鬼夜行自动化脚本:智能AI解放双手,高效收集式神碎片终极方案

阴阳师百鬼夜行自动化脚本:智能AI解放双手,高效收集式神碎片终极方案 【免费下载链接】OnmyojiAutoScript Onmyoji Auto Script | 阴阳师脚本 项目地址: https://gitcode.com/gh_mirrors/on/OnmyojiAutoScript 阴阳师百鬼夜行自动化脚本是Onmyoji…

2026/8/3 16:36:40 阅读更多 →
GEE引擎自定义UI开发:从进度条到属性系统的脚本实现与优化

GEE引擎自定义UI开发:从进度条到属性系统的脚本实现与优化

1. 项目概述:为什么GEE引擎的自定义UI如此重要?在游戏开发,特别是传奇类游戏服务端开发这个圈子里,GEE引擎一直以其强大的功能和灵活的扩展性著称。很多开发者,包括我自己,在接触GEE引擎一段时间后&#xf…

2026/8/3 16:36:40 阅读更多 →

最新新闻

从PID控制到Python仿真:控制理论实战入门指南

从PID控制到Python仿真:控制理论实战入门指南

你是不是也曾在《自动控制原理》的课堂上,看着满黑板的微分方程、拉普拉斯变换和根轨迹图,感觉大脑一片空白?是不是觉得那些复杂的公式和抽象的概念,距离你未来想做的机器人、自动驾驶或者智能系统开发,隔着十万八千里…

2026/8/4 2:15:32 阅读更多 →
DDD架构在合同管理系统中的实践与优化

DDD架构在合同管理系统中的实践与优化

1. 合同管理系统开发中的DDD架构实践复盘三周前我们启动了一个企业级合同管理系统的开发,团队决定采用领域驱动设计(DDD)架构。最初的设计方案看起来很美,但实际落地时却踩了不少坑。今天我想分享在合同模块开发过程中遇到的典型问…

2026/8/4 2:15:32 阅读更多 →
VibeCoding:超小型代码生成模型在移动端AI部署的实践指南

VibeCoding:超小型代码生成模型在移动端AI部署的实践指南

最近在开发者圈子里,一个名为VibeCoding的开源项目突然火了起来。如果你在社交媒体上搜索,会发现大量关于“明日方舟桌宠”的讨论与之关联。这很容易让人产生一个巨大的误解:VibeCoding 只是一个用来制作二次元游戏角色桌面宠物的玩具项目。但…

2026/8/4 2:15:32 阅读更多 →
低代码平台如何优化零售门店标准化运营

低代码平台如何优化零售门店标准化运营

1. 低代码技术如何重塑门店管理最近两年,我观察到越来越多的零售企业开始采用低代码平台来优化门店运营。这种技术变革不是简单的工具替换,而是从根本上改变了传统门店管理的作业模式。通过实际参与多个连锁品牌的数字化改造项目,我发现低代码…

2026/8/4 2:15:32 阅读更多 →
冷热电联供微网与冰蓄冷技术融合优化实践

冷热电联供微网与冰蓄冷技术融合优化实践

1. 项目概述:冷热电联供微网与冰蓄冷技术的融合价值在能源结构转型与电力市场化改革的双重背景下,冷热电联供型微电网(CCHP-MG)正成为区域能源管理的先进解决方案。我们团队最近完成的这个项目,创新性地将冰蓄冷空调系…

2026/8/4 2:15:32 阅读更多 →
抖音无水印批量下载终极指南:douyin-downloader让你轻松保存高清内容

抖音无水印批量下载终极指南:douyin-downloader让你轻松保存高清内容

抖音无水印批量下载终极指南:douyin-downloader让你轻松保存高清内容 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser …

2026/8/4 2:14:31 阅读更多 →

日新闻

AI Agent白手起家26: 使用标准事件驱动大模型实践

AI Agent白手起家26: 使用标准事件驱动大模型实践

纲要 练习目标:掌握大模型标准事件的调用回顾 LangChain 中的核心标准事件 invokestreambatchastream_eventswith_structured_output 环境准备实战代码:多种事件调用对比 同步调用与流式输出批量处理异步事件流监听结构化输出 运行说明与预期结果总结与扩…

2026/8/4 0:00:40 阅读更多 →
dealsea是什么?跨境卖家必知的美国deal站入门指南

dealsea是什么?跨境卖家必知的美国deal站入门指南

说实话,第一次听说美国这个老牌折扣网站的跨境卖家,十个有八个会问同一个问题:这个平台到底是干嘛的?我见过一个做家居出口的朋友,他在亚马逊上月销二十万美金,却从来没用过它。我给他看了首页——一屏一屏…

2026/8/4 0:01:40 阅读更多 →
清华大学重磅EST:植物自导电闪蒸焦耳热600°C/2600°C两步法!稀土超积累植物秒级转化为CeO₂-石墨烯电催化剂!

清华大学重磅EST:植物自导电闪蒸焦耳热600°C/2600°C两步法!稀土超积累植物秒级转化为CeO₂-石墨烯电催化剂!

通讯作者:邓兵、刘建国通讯单位:清华大学DOI:https://doi.org/10.1021/acs.est.6c00603研究背景稀土元素(REEs)是清洁能源技术与电子器件不可或缺的核心原料,然而传统提取方式依赖能耗高、排放大的采矿与强…

2026/8/4 0:01:40 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/3 4:58:13 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/3 1:53:31 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/3 4:36:35 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/3 13:07:03 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/3 5:19:38 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/3 8:27:36 阅读更多 →