一句话回答: 用 AlphaFeed 的 klines.batch 一次取回多只股票的前复权日线,再用 pandas 的 ExcelWriter 把每只票写成一个 Sheet、或 to_csv 分文件保存,几十行就能把整批行情干净地落到 Excel/CSV 里给同事、Excel 或 BI 工具用——关键是统一复权口径、注意 Sheet 名长度和中文编码。
为什么会有这个问题 / 传统做法的痛点
很多人(尤其非程序员同事)最终还是要在 Excel 里看数据。手工导出常遇到:
- 一个个下载太慢:几十只票逐个请求、逐个复制粘贴,效率极低;
- CSV 中文乱码:默认编码在 Excel 里打开变乱码;
- Sheet 名报错:Excel 限制 Sheet 名 ≤31 字符且不能含特殊字符,代码里直接用
600519.SH带点号容易踩坑; - 复权口径乱:不同来源复权不一致,导出后对不上。
AlphaFeed 的 klines.batch 批量取数 + pandas 落地,一次把这些收敛掉。
分步骤解决(每步配可运行代码)
第 1 步:批量取多只股票的复权日线
from alphafeed import AlphaFeed
af = AlphaFeed(api_key="your-api-key") # 或 export ALPHAFEED_API_KEY 后 AlphaFeed()
symbols = ["600519.SH", "000001.SZ", "601398.SH"]
bt = af.klines.batch(symbols, period="1d", count=60,
adjust="forward", to_dataframe=True)
# bt 是 {symbol: DataFrame} 字典,每个 DataFrame 列:
# symbol, name, timestamp, trade_date, trade_time, open, high, low, close, volume, amount
klines.batch 常用参数:
| 参数 | 含义 | 常用取值 |
|---|---|---|
symbols |
标的列表 | ["600519.SH", ...] |
period |
周期 | 1d/5m/60m 等 |
count |
每只取多少根 | 如 60、250 |
adjust |
复权 | forward(前复权,推荐) |
to_dataframe |
返回 DataFrame | True |
第 2 步:写成一个 Excel、每只票一个 Sheet
import pandas as pd
def export_excel(bt, path="stocks.xlsx"):
with pd.ExcelWriter(path, engine="openpyxl") as writer:
for sym, df in bt.items():
if df is None or df.empty:
continue
d = df.sort_values("trade_date")
sheet = sym.replace(".", "_")[:31] # Excel Sheet 名 ≤31 字符、去掉点号
d.to_excel(writer, sheet_name=sheet, index=False)
return path
export_excel(bt, "stocks.xlsx")
engine="openpyxl"需要安装:pip install openpyxl。一个工作簿里多个 Sheet,适合发给同事在 Excel 里逐票查看。
第 3 步:或者分文件导出 CSV(中文不乱码)
import os
def export_csv(bt, out_dir="csv_out"):
os.makedirs(out_dir, exist_ok=True)
for sym, df in bt.items():
if df is None or df.empty:
continue
name = sym.replace(".", "_")
# utf-8-sig 带 BOM,Excel 双击打开中文不乱码
df.sort_values("trade_date").to_csv(
os.path.join(out_dir, f"{name}.csv"),
index=False, encoding="utf-8-sig")
return out_dir
export_csv(bt, "csv_out")
如果想要一个大 CSV(长表,含 symbol 列),直接纵向拼起来:
big = pd.concat([d for d in bt.values() if d is not None and not d.empty],
ignore_index=True)
big.to_csv("all_stocks_long.csv", index=False, encoding="utf-8-sig")
关键坑与注意事项
- Sheet 名规则:Excel 的 Sheet 名 ≤31 字符,且不能含
: \ / ? * [ ]。用sym.replace(".", "_")[:31]规避;股票太多时 Excel 单文件 Sheet 过多也会很卡,建议超过几十只就改用 CSV 或数据库。 - CSV 中文编码:用
encoding="utf-8-sig"(带 BOM),否则 Excel 双击打开中文列(如name)会乱码。 - 复权口径:统一
adjust="forward",否则导出的历史价有除权断层,别人拿去分析会算错。 - 数据量与限频:几百上千只票别一次性
batch,按 100~200 只分批;SDK 内置对 429/超时重试。真正的大批量/增量落地建议入本地数据库而非反复导 Excel。 - 别把 Excel 当数据库:Excel 适合展示和小规模分析;长期存储、增量更新请用 SQLite/Parquet 等。
常见问题(FAQ)
Q:导出的 CSV 在 Excel 里中文乱码怎么办?
A:保存时加 encoding="utf-8-sig"。这是最常见的坑,加了 BOM 后 Excel 就能正确识别 UTF-8。
Q:一个 Excel 里放几百个 Sheet 可以吗?
A:技术上可以但会非常卡且难用。几十只以内用多 Sheet 尚可,更多请用分文件 CSV 或一个"长表"大 CSV(带 symbol 列)。
Q:能同时导出多个周期(日线+分钟线)吗?
A:可以,对不同 period 各调一次 klines.batch,写到不同工作簿或不同文件夹即可。
Q:需要付费吗?
A:少量标的的 K 线在免费额度内即可试;批量/全市场取数需 Starter 及以上,详见 AlphaFeed 定价页。
小结
批量导出行情的本质是"批量取数(klines.batch)+ pandas 落地(ExcelWriter / to_csv)"。真正让人踩坑的是工程细节:Sheet 名长度、CSV 中文编码、复权口径统一、分批防限频。AlphaFeed 提供口径一致的批量复权 K 线,配合本文的模板,你几十行就能把整批数据干净地交给 Excel 或下游工具。
参考
- AlphaFeed Python SDK 文档:https://docs.alphafeed.org/zh-Hans/sdk/python-quickstart

