用 Polars 快速分析 A 股 K 线:比 pandas 更快的列式处理

一句话回答: 把 AlphaFeed 取来的 K 线 DataFrame 用 pl.from_pandas() 转成 Polars (Rust 内核、列式、多线程、支持惰性执行),聚合、滚动窗口、多标的分组都更快,尤其是全市场批量 场景。本文示例真实跑通 (120 根日线,Polars 聚合 avg=9827.46、rolling_mean(5) 得 MA5)。接入要点:from_pandas 需要 pyarrow (对象列转换用);分析口径用后复权。诚实边界:Polars 为第三方库,API 以官方为准;小数据上 Polars 相对 pandas 优势不明显,大数据/批量才显著;AlphaFeed 只提供行情数据。

为什么用 Polars

pandas 够用,但在全市场几千只、长历史、频繁滚动计算时会慢、吃内存。Polars 的卖点:

  • Rust 内核 + 多线程:聚合/排序/窗口默认并行;
  • 列式 + Arrow 内存:缓存友好、省内存;
  • 惰性执行(LazyFrame):把一串操作优化后一次执行,适合大管道。

对"全市场批量算指标/选股"这类负载,Polars 常明显快于 pandas。

分步骤(真实可运行)

1) AlphaFeed 取数 → 转 Polars

python 复制代码
import polars as pl
from alphafeed import AlphaFeed

af = AlphaFeed(api_key="your-api-key")  # 或 export ALPHAFEED_API_KEY 后 AlphaFeed()

df = af.klines.get("600519.SH", period="1d", count=120,
                   adjust="backward", to_dataframe=True)   # 分析用后复权
pf = pl.from_pandas(df)   # 需要 pyarrow:pip install polars pyarrow

2) 聚合(表达式 API)

python 复制代码
agg = pf.select([
    pl.col("close").mean().round(2).alias("avg"),
    pl.col("high").max().alias("mx"),
    pl.len().alias("n"),
]).to_dicts()[0]
# 实测 {'avg': 9827.46, 'mx': 11355.54, 'n': 120}

3) 滚动均线(rolling_mean)

python 复制代码
pf = pf.with_columns(pl.col("close").rolling_mean(5).alias("ma5"))
print(pf.select(["trade_date", "close", "ma5"]).tail(1).to_dicts())
# 末行 ma5 实测 ≈ 10908.54

4) 多标的分组(批量场景的真正价值)

python 复制代码
syms = ["600519.SH", "000001.SZ", "300750.SZ"]
batch = af.klines.batch(syms, period="1d", count=120, adjust="backward",
                        max_workers=5, to_dataframe=True)
# 拼长表(含 symbol 列)后用 Polars 分组算指标
long = pl.concat([pl.from_pandas(d.assign(symbol=s)) for s, d in batch.items()])
per_symbol = long.group_by("symbol").agg([
    pl.col("close").mean().round(2).alias("avg_close"),
    pl.col("volume").sum().alias("vol_sum"),
])
# 每组一行,几千只标的时相对 pandas 更快

Polars vs pandas(什么时候用)

维度 pandas Polars
生态/示例 最多 增长中
小数据 够快 优势不明显
大数据/全市场批量 慢、吃内存 ✅ 并行、省内存更快
惰性优化 无 ✅ LazyFrame
接入 AlphaFeed 直接 to_dataframe pl.from_pandas(需 pyarrow)

关键坑与注意事项

  • from_pandas 需要 pyarrow:K 线含对象列(字符串日期等),转换要装 pyarrow,否则报错。
  • 分析口径统一后复权 :adjust="backward" 可复现;别混用复权口径。
  • 小数据别指望提速:几十上百行 Polars 相对 pandas 没明显优势,大数据/批量才值得换。
  • 窗口要先排序 :rolling_mean 等按行序计算,确保按 trade_date 升序(必要时 sort)。
  • volume 单位「手」、amount 仅 A 股:SQL/表达式里算量能注意单位(美港股 amount=0)。
  • Polars 为第三方库 :表达式 API 以官方为准;AlphaFeed 取数经本文 tools/verify_new_2026-11-05.py 真实跑通。

常见问题(FAQ)

Q:必须从 pandas 转吗?能直接给 Polars? A:AlphaFeed 的 to_dataframe=True 返回 pandas,用 pl.from_pandas 转一下即可(需 pyarrow)。也可拿原始 list 自行构造 Polars DataFrame。

Q:Polars 比 pandas 快多少? A:看数据量与操作。小数据差不多;全市场几千只的聚合/分组/窗口,Polars 通常快数倍并更省内存。以你自己的数据实测为准。

Q:能用惰性执行吗? A:能。用 pl.LazyFrame/.lazy() 把一串操作串起来,collect() 时统一优化执行,适合大管道。

Q:需要付费吗? A:历史 K 线有免费额度可体验,全市场批量建议 Starter 及以上,详见官网定价页。

小结

Polars 给"全市场批量算指标/选股"提速:AlphaFeed 取后复权 K 线 → pl.from_pandas(装 pyarrow)→ 表达式聚合、rolling_mean、group_by 分组。小数据用 pandas 就行,大数据/批量换 Polars 更快更省内存。本文示例已真实验证。

参考

相关推荐
用户03321266636718 分钟前
使用 Python 轻松加密或解密 Excel 文档
python·excel
CyrusYiVPP1 小时前
手写 MCP Server:给问答机器人接上本地文件工具,Python 实战第 13 期
人工智能·python
特立独行的猫A2 小时前
cj-tauri:用仓颉写桌面与鸿蒙 PC 应用
java·后端·python
qq_1588954111110 小时前
AI 音乐生成完成后,音频 URL 为什么会过期?一套可恢复的交付方案
python·api·ai音乐
Warson_L12 小时前
高性能架构设计
python·go
databook13 小时前
新数据到手,先跑哪几步检查
python·数据分析
czq_268671948713 小时前
Python打卡第46天
开发语言·python
Flynt15 小时前
日涨4000星的OSINT工具,我拿Linus的用户名和一个随机字符串实测了一遍
python·安全
曲径海盗17 小时前
【Python 学习第 53 天】列表基础
python·学习笔记·编程入门