用 Python 拉取 A 股指数日线数据:我的第一步学习记录
学量化分析的第一步不是找"信号",而是把数据老老实实拿到手、存下来、画出来。 这篇笔记记录我从零跑通这条链路的过程,例子全部使用指数数据(上证指数), 一方面指数没有复权干扰,适合入门;另一方面练习性质的数据处理用指数最干净。
目标
- 用免费数据源拿到上证指数的日线行情(开、高、低、收、量、额);
- 存成本地文件,可重复读取;
- 画出 K 线图,确认数据没有明显问题。
环境准备
pip install akshare pandas matplotlib mplfinance pyarrow
四个库的分工:akshare 负责取数,pandas 负责整理,mplfinance 画 K 线,
pyarrow 用来存 Parquet(列式存储,比 CSV 读取快很多,列类型不丢)。
第一步:拉取数据
import akshare as ak
# 上证指数日线(新浪源)
df = ak.stock_zh_index_daily(symbol="sh000001")
print(df.shape)
print(df.head())
返回的 DataFrame 大致长这样:
date open high low close volume
0 1990-12-19 96.05 99.98 95.79 99.98 197000.0
1 1990-12-20 104.30 104.39 99.98 99.98 42000.0
...
三十多年的数据一次就下来了,第一反应是"真方便",第二反应是"免费源方便归方便,字段和口径必须自己核对"。
第二步:整理与落盘
import pandas as pd
# 日期列转成真正的日期类型(原始是字符串)
df["date"] = pd.to_datetime(df["date"])
df = df.sort_values("date").reset_index(drop=True)
# 去掉重复日期,保留最后一条(数据源偶发重复)
df = df.drop_duplicates(subset="date", keep="last")
df.to_csv("sh000001_daily.csv", index=False)
df.to_parquet("sh000001_daily.parquet", index=False)
我给自己定的整理规矩只有三条:排序、去重、类型正确。做任何后续分析之前, 这三件事不做好,后面全是坑。
第三步:画 K 线
import mplfinance as mpf
plot_df = df.set_index("date")[["open", "high", "low", "close", "volume"]].tail(120)
mpf.plot(
plot_df,
type="candle",
volume=True,
style="charles",
title="SSE Composite Index - last 120 days",
)
取最近 120 个交易日画出来,能看到真实的 K 线和成交量副图。第一次跑通的时候, 最大的收获不是图本身,而是确认了整条数据链路的字段口径是对的。
踩坑记录
- 接口字段大小写:不同接口返回的列名风格不统一(有的首字母大写),
画图前先
print(df.columns)对一遍,别想当然。 - 日期是字符串:直接
set_index("date")画图会报错或顺序错乱, 必须先pd.to_datetime。 - 接口版本迭代快:AkShare 的接口名和参数时常调整, 以官方文档为准,跑不通先查文档再查代码。
- 免费源的稳定性:偶发拉取失败、字段缺失。所以落盘很重要—— 拿到一次干净数据就存下来,别每次分析都现拉。
下一步计划
- 对比个股数据与指数数据的字段差异,理解"复权"概念(个股专属);
- 用 Parquet 分区存储多个指数的历史数据;
- 写一个简单的数据质量检查脚本(缺失日期、异常值)。
本文仅为个人学习记录,示例均为指数公开历史数据,不涉及任何观点表达。