欢迎光临
我们一直在努力

用 Python 批量下载全量 A 股历史行情数据:基于 AKShare 的高效实践

关键词:AKShare, A股数据, 股票历史行情, 量化分析, Python 金融, 断点续传 适用读者:量化交易初学者、金融数据分析师、Python 爱好者、学术研究者

💡 为什么需要本地化 A 股历史数据?

在量化投资、策略回测、因子挖掘等场景中,高质量、完整、本地存储的历史行情数据是不可或缺的基础。然而:

  • 商业数据接口(如 Wind、Tushare Pro)往往收费或有调用限制;
  • 免费接口(如早期 Tushare)可能不稳定或字段不全;
  • 网页爬虫易被反爬,维护成本高。

幸运的是,开源项目 AKShare 提供了免费、稳定、覆盖全面的中国金融市场数据接口,包括:

  • A 股日线、分钟线
  • 指数、基金、期货、期权
  • 宏观经济、新闻舆情等

本文将带你用 不到 70 行代码,实现: ✅ 自动获取全部 A 股列表 ✅ 批量下载 2018 年至今的日线数据(前复权) ✅ 支持断点续传,避免重复下载 ✅ 合并为统一 CSV 文件,便于后续分析


🛠️ 技术栈与依赖

库作用
akshare 核心数据源,提供 A 股行情接口
pandas 数据处理与合并
tqdm 进度条,提升体验
os, time 文件操作与请求节流

安装命令

pip install akshare pandas tqdm

💡 建议使用国内镜像加速安装:

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple akshare pandas tqdm

🔍 核心代码解析

1️⃣ 获取 A 股股票列表

def get_stock_list():
df = ak.stock_info_a_code_name()
df.columns = ["symbol", "name"]
df.to_csv("all_a_stocks.csv", index=False)
return df

  • ak.stock_info_a_code_name() 返回所有 A 股代码与名称(不含交易所后缀,如 600519)
  • 保存为 CSV,便于后续审计或手动筛选

2️⃣ 下载单只股票日线数据

def download_stock(symbol):
df = ak.stock_zh_a_hist(
symbol=symbol,
period="daily",
start_date="20180101",
end_date="20251231",
adjust="qfq" # 前复权,消除分红送股影响
)
if not df.empty:
df["symbol"] = symbol
return df[["日期", "symbol", "开盘", "最高", "最低", "收盘", "成交量"]]
return None

  • 前复权(qfq) 是量化回测的标准选择,确保价格连续性
  • 字段精简,仅保留 OHLCV(开盘、最高、最低、收盘、成交量)

3️⃣ 批量下载 + 断点续传

def download_all(stock_df):
all_data = []
for _, row in tqdm(stock_df.iterrows(), total=len(stock_df)):
symbol = row["symbol"]
file_path = f"stock_history_ak/{symbol}.csv"

# ✅ 断点续传:若已存在则跳过
if os.path.exists(file_path):
all_data.append(pd.read_csv(file_path))
continue

df_hist = download_stock(symbol)
if df_hist is not None:
df_hist.to_csv(file_path, index=False)
all_data.append(df_hist)
time.sleep(0.3) # 礼貌请求,避免触发限流

  • 断点续传:程序中断后可继续运行,不重复下载已完成的股票
  • 进度条:tqdm 实时显示下载进度(共约 5000+ 只股票)
  • 请求节流:time.sleep(0.3) 避免高频请求被临时封禁

4️⃣ 合并与标准化输出

final = pd.concat(data, ignore_index=True)
final.rename(columns={
"日期": "Date",
"开盘": "Open",
"最高": "High",
"最低": "Low",
"收盘": "Close",
"成交量": "Volume"
}, inplace=True)
final.to_csv("all_stock_history_ak.csv", index=False)

  • 输出为标准英文列名,兼容主流量化框架(如 backtrader, zipline)
  • 单文件包含所有股票、所有日期,便于 Pandas 分组分析

📊 数据规模预估

指标数值
A 股数量 ~5200 只(含主板、创业板、科创板、北交所)
时间跨度 2018–2025(约 7 年 × 250 交易日 ≈ 1750 行/股)
总行数 ≈ 5200 × 1750 ≈ 900 万行
文件大小 CSV 约 800MB–1.2GB(取决于压缩与字段)

💡 建议使用 SSD 存储,并确保内存 ≥ 8GB(pd.concat 会加载全量数据)


⚠️ 注意事项与优化建议

❗ 1. AKShare 的稳定性

  • AKShare 依赖网页解析,接口可能随网站改版失效
  • 建议定期关注 AKShare 官方文档 更新
  • 如遇大规模失败,可尝试升级:pip install –upgrade akshare

⚙️ 2. 性能优化(进阶)

  • 多线程下载:使用 concurrent.futures.ThreadPoolExecutor 加速(注意 AKShare 非线程安全,需加锁)
  • 数据库存储:将 CSV 替换为 SQLite / MySQL,支持按股票/日期快速查询
  • 增量更新:仅下载最新 N 天数据,而非全量重拉

🔐 3. 合规提醒

  • AKShare 数据来源于公开网站,仅限个人学习研究使用
  • 商业用途请确认数据来源合法性,避免侵权风险

🚀 扩展应用场景

  • 因子计算:基于 OHLCV 计算 MACD、RSI、布林带等技术指标
  • 行业分析:按申万行业分类聚合,观察板块轮动
  • 异常检测:识别涨停、跌停、巨量成交等事件
  • 机器学习:构建时间序列预测模型(如 LSTM 预测股价)

  • ✅ 总结

    通过 akshare + pandas + tqdm,我们实现了:

    • 零成本获取全量 A 股历史行情
    • 自动化、可复现、可中断恢复 的下载流程
    • 标准化输出,无缝对接量化分析 pipeline

    这不仅是数据采集脚本,更是量化研究基础设施的第一块基石。无论你是想回测一个简单均线策略,还是构建复杂的多因子模型,拥有一份干净、完整的本地数据集,都是成功的第一步。

    赞(0)
    未经允许不得转载:171主机测评 » 用 Python 批量下载全量 A 股历史行情数据:基于 AKShare 的高效实践
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址