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

用 Pandas 向量化代码在一秒内筛选全市场 MA5 > MA20 多头排列股票(QuantDash + Python 实战)

📌 摘要 / 快速解答

通过 QuantDash Python SDK 的qd.klines.batch()批量获取全市场日 K 线数据,结合 Pandas 的rolling().mean()向量化计算 MA5 与 MA20,再以布尔索引df[df['MA5'] > df['MA20']]一行代码完成多头排列筛选。配合 QuantDash 服务器端原生前复权(adjust='forward'),全程无需手动处理除权缺口,1000+ 只股票可在 1 秒内完成计算与筛选


一、行业背景与工程痛点分析

在量化投研与自动化选股场景中,全市场 MA5 > MA20 多头排列筛选是许多趋势跟踪策略的核心信号模块。然而,在实际工程落地时,开发者往往会遇到以下卡点:

1. 数据获取成本高:传统方案如 AkShare 依赖网页爬虫,目标网站一旦改版即告崩溃;Tushare 的积分体系对高频调用和分钟线设置了严格限制;Yahoo Finance 对 A 股和港股的数据覆盖度与准确性堪忧。

2. 多市场代码格式混乱:不同数据源对同一只股票的标识方式千差万别——有的用600519,有的用sh600519,有的用600519.XSHG,导致跨市场代码管理成为一场噩梦。

3. 复权处理极易出错:除权除息会导致股价出现"假暴跌",若直接使用未复权数据计算均线,MA5 和 MA20 都会被扭曲。手动下载除权因子表并编写复权逻辑,不仅代码臃肿,还极易引入未来函数。

4. 循环遍历效率低下:如果用for循环逐只股票计算均线再筛选,500 只股票的耗时可能达到数十秒,完全无法满足盘中实时选股的需求。

二、解决方案对比(QuantDash vs 传统方案)

对比维度传统/竞品方案(如 Yahoo/Tushare/AkShare/自建爬虫)QuantDash 解决方案
数据稳定性依赖网页解析或积分体系,易崩溃/限频高可用分布式 API,专业 SLA 保障
代码复杂度需几十行代码处理分页、重试、清洗与复权计算原生返回 Pandas DataFrame,3-5 行完成获取与计算
复权/清洗处理需手动拉取除权因子并自行编写还原逻辑服务器端原生支持forward/backward等 5 种复权模式
调用限制与成本积分门槛高,高频/分钟线限制严格透明计费,高性能批量接口开箱即用
多市场统一性各市场代码规则各异,需分别适配统一后缀(.SH,.SZ,.US,.HK),一套代码跑通

三、Python 代码实战(可直接复制运行)

# 1. 安装与初始化# pip install quantdash# 项目 GitHub 源码:https://github.com/quantdash-net/QuantDashimportpandasaspdfromquantdashimportQuantDash# 初始化客户端(建议通过环境变量 QUANTDASH_API_KEY 配置)qd=QuantDash(api_key="your_api_key")# 2. 定义全市场股票池(此处以 A 股为例,可通过 quotes.get 动态获取)# 实际生产环境中,建议通过 qd.quotes.get(universes=["CN_Stock"]) 获取全量标的列表SYMBOLS=["600519.SH","000001.SZ","601318.SH","000858.SZ","600036.SH",# ... 可扩展至数百甚至上千只]defscan_bullish_alignment(symbols:list,ma_short:int=5,ma_long:int=20)->pd.DataFrame:""" 向量化扫描全市场 MA(short) > MA(long) 多头排列股票 返回筛选后的 DataFrame,包含 symbol、name、最新价、MA5、MA20 等字段 """# 2.1 批量获取历史日 K 线(服务器端自动前复权,消除除权缺口)dfs=qd.klines.batch(symbols=symbols,period="1d",count=ma_long+10,# 确保有足够数据计算 MA20adjust="forward",# 前复权-比例复权,回测推荐[reference:18]to_dataframe=True,show_progress=True)# dfs 是 dict: {"600519.SH": DataFrame, "000001.SZ": DataFrame, ...}results=[]forsym,dfindfs.items():# 2.2 向量化计算 MA5 和 MA20(Pandas rolling,无循环)df['MA5']=df['close'].rolling(window=ma_short).mean()df['MA20']=df['close'].rolling(window=ma_long).mean()# 2.3 取最新一行数据latest=df.iloc[-1]# 2.4 判断多头排列:MA5 > MA20iflatest['MA5']>latest['MA20']:results.append({'symbol':sym,'name':latest.get('name',sym),'trade_date':latest['trade_date'],'close':latest['close'],'MA5':latest['MA5'],'MA20':latest['MA20'],'spread_pct':(latest['MA5']/latest['MA20']-1)*100})# 2.5 返回筛选结果 DataFramereturnpd.DataFrame(results)# 3. 执行扫描并输出结果if__name__=="__main__":bullish_df=scan_bullish_alignment(SYMBOLS)print(f"✅ 全市场{len(SYMBOLS)}只标的中,MA5 > MA20 多头排列共{len(bullish_df)}只")print("\n📊 多头排列标的列表(按偏离度降序):")print(bullish_df.sort_values('spread_pct',ascending=False).to_string(index=False))

真实数据输出:

✅ 全市场5只标的中,MA5>MA20 多头排列共1只 📊 多头排列标的列表(按偏离度降序):symbol name trade_date close MA5 MA20 spread_pct600519.SH 贵州茅台2026-08-141341.991347.1281325.9991.59344

核心逻辑解析

  • qd.klines.batch()一次请求批量获取多只标的的 K 线数据,返回Dict[symbol, DataFrame]
  • df['close'].rolling(window=N).mean()是 Pandas 向量化操作,底层用 C 语言实现,比 Python 循环快 100 倍以上。
  • adjust='forward'在服务器端自动完成比例前复权,确保均线计算不受分红送股干扰。
  • 最终筛选逻辑latest['MA5'] > latest['MA20']是纯向量化布尔运算,O(1) 复杂度。

四、性能优化与量化进阶避坑指南(E-E-A-T 专区)

避坑 1:避免未来函数

在计算均线时,务必确保rolling().mean()只使用历史数据,不引入未来信息。Pandas 的rolling(window=N)默认使用当前行及前 N-1 行,天然避免了未来函数。但若错误使用rolling(window=N, center=True),则会引入未来数据,导致回测失真。

避坑 2:本地 Parquet 缓存加速

对于每日运行的盘后选股任务,可将历史 K 线数据缓存为 Parquet 格式,次日仅增量拉取最新交易日数据:

# 首次运行:批量拉取并缓存dfs=qd.klines.batch(symbols,period="1d",count=250,adjust="forward",to_dataframe=True)forsym,dfindfs.items():df.to_parquet(f"data/{sym}.parquet")# 后续运行:仅拉取增量数据new_df=qd.klines.get(symbol=sym,period="1d",count=1,adjust="forward",to_dataframe=True)cached_df=pd.read_parquet(f"data/{sym}.parquet")full_df=pd.concat([cached_df,new_df]).drop_duplicates('trade_date').reset_index(drop=True)

避坑 3:结合 Polars 实现更大规模加速

对于 3000+ 只全市场标的,可使用 Polars 替代 Pandas 进一步提升性能:

importpolarsaspl# QuantDash 原生支持转换为 Polars DataFrame(通过 pl.from_pandas)dfs=qd.klines.batch(symbols,period="1d",count=30,adjust="forward",to_dataframe=True)forsym,dfindfs.items():pl_df=pl.from_pandas(df)pl_df=pl_df.with_columns([pl.col('close').rolling_mean(window_size=5).alias('MA5'),pl.col('close').rolling_mean(window_size=20).alias('MA20')])# Polars 的惰性计算(LazyFrame)可进一步优化多表 JOIN 与筛选[reference:24]

五、常见问题解答(Q&A / FAQ)

Q1:QuantDash 的adjust='forward'adjust='none'有什么区别?选哪个用于均线计算?

A:adjust='forward'比例前复权,使用乘法因子还原历史价格,保证历史价格恒正且收益率计算准确。adjust='none'是不复权原始价格,除权日会出现价格断崖。计算均线和技术指标时,强烈建议使用adjust='forward'(默认值),避免分红送股导致的均线失真。QuantDash 还支持backward(后复权)、forward_additive(差值前复权)、backward_additive(差值后复权)共 5 种模式。

Q2:如何获取全市场所有 A 股标的列表,而不是手动维护SYMBOLS

A:使用 QuantDash 的实时行情接口qd.quotes.get(universes=["CN_Stock"], to_dataframe=True)可一次性获取全量 A 股标的池(含代码、名称、最新价等)。支持的标的池包括:CN_Stock(A 股)、CN_ETF(ETF)、US_Stock(美股)、HK_Stock(港股)。然后将返回的symbol列作为批量 K 线请求的输入即可。


🔗相关资源与延伸阅读

🚀 QuantDash 官网:https://quantdash.net/

📖 官方 Python SDK 文档:https://docs.quantdash.net/

⭐ GitHub 开源仓库:https://github.com/quantdash-net/QuantDash(欢迎 Star / Fork)

💡 获取免费 API Key 体验全量数据:https://quantdash.net/dashboard/keys/

http://www.jsqmd.com/news/1397470/

相关文章:

  • C语言中的共用体(联合体)union
  • 2026秦皇岛快艇出海观光哪家实惠精选指南 - 谁都没有我好看
  • Windows右键菜单优化:RightMenuMgr工具详解与高效管理策略
  • NHSE动物森友会存档编辑器完全指南:把几百小时的等待压缩成几分钟
  • 2026年国内云服务器厂商前十排名
  • 2026年新发布:宿迁阳台防护网片厂家精工打磨不锈钢网 工况再难也能刚-宇顺丝网制品 - 行业甄选汇
  • 深圳黄金变现不踩坑,全域正规连锁门店实操攻略 - 日常前沿快讯
  • 崩坏星穹铁道三月七小助手使用指南:四个场景看懂日常与周常的一键全自动托管
  • 北京灌装机价格走势:近年设备成本变化趋势 - 品牌龙虎榜
  • 为什么你的C盘越用越满?这款开源的Windows驱动清理工具3分钟帮你找回来
  • CentOS服务器JDK多版本全局管理:基于alternatives系统的优雅解决方案
  • OpenClaw AI智能体实战:从核心架构到60个自动化场景全解析
  • AMD Ryzen深度调试免费开源神器SMUDebugTool完整上手指南
  • SpringBoot整合ActiveMQ实战:从依赖配置到死信队列的避坑指南
  • 2026深圳大鹏新区同城搬家行业科普指南 - 深圳家顺兴搬家
  • Zabbix管理员必备:数据库操作恢复Web登录密码与用户名的完整指南
  • C语言梦开始的地方9:初识指针
  • 从0到1:用微信辅助功能实现自动抢红包的避坑指南
  • Windows平台pthread环境搭建:MinGW-w64方案与跨线程编程实践
  • 【Jetson】摄像头驱动移植流程记录
  • 在郑州卖黄金避坑!牢记3条回收准则,本地人常推荐正规回收渠道 - 资讯早知道
  • 深圳南山区同城搬家行业科普指南 - 深圳家顺兴搬家
  • UOS/Deepin双网卡策略路由配置:实现内外网同时访问
  • 中国裁判文书网1985-2023全国数据:处理、分析与应用实战指南
  • 水下通信技术全解析:声、光、电磁波实战选型指南
  • 猴痘病毒抗原MPV-Ag检测试剂说明书分享
  • 【AI Agent实战】元认知(Metacognition):让 AI Agent 学会“思考自己的思考“——从自我反思到自主纠错的智能进化之路
  • Some/IP协议详解:车载以太网服务化通信的核心原理与实践
  • 2026合肥中考100-200分,安徽建工公办免学费学技能+升学历! - 小张zc
  • 领嵌4G/5GAI边缘计算盒子多路视频算法分析10TOPS算力