一句话回答: 把 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
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)
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)
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) 多标的分组(批量场景的真正价值)
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 更快更省内存。本文示例已真实验证。
参考
- AlphaFeed Python SDK 文档:docs.alphafeed.org/zh-Hans/sdk…
- AlphaFeed 官网:alphafeed.org/
- 本文完整版(AlphaFeed 博客):blog.alphafeed.org/blog/polars…