如何用 Python 把 A 股行情批量导出到 Excel/

用户头像sh_*2176oo
2026-09-18 发布

一句话回答: 用 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 或下游工具。

参考

评论