学量化分析的第一步不是找"信号",而是把数据老老实实拿到手、存下来、画出来。 这篇笔记记录我从零跑通这条链路的过程,例子全部使用指数数据(上证指数), 一方面指数没有复权干扰,适合入门;另一方面练习性质的数据处理用指数最干净。

目标

  1. 用免费数据源拿到上证指数的日线行情(开、高、低、收、量、额);
  2. 存成本地文件,可重复读取;
  3. 画出 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 线和成交量副图。第一次跑通的时候, 最大的收获不是图本身,而是确认了整条数据链路的字段口径是对的。

踩坑记录

  1. 接口字段大小写:不同接口返回的列名风格不统一(有的首字母大写), 画图前先 print(df.columns) 对一遍,别想当然。
  2. 日期是字符串:直接 set_index("date") 画图会报错或顺序错乱, 必须先 pd.to_datetime
  3. 接口版本迭代快:AkShare 的接口名和参数时常调整, 以官方文档为准,跑不通先查文档再查代码。
  4. 免费源的稳定性:偶发拉取失败、字段缺失。所以落盘很重要—— 拿到一次干净数据就存下来,别每次分析都现拉。

下一步计划

  • 对比个股数据与指数数据的字段差异,理解"复权"概念(个股专属);
  • 用 Parquet 分区存储多个指数的历史数据;
  • 写一个简单的数据质量检查脚本(缺失日期、异常值)。

本文仅为个人学习记录,示例均为指数公开历史数据,不涉及任何观点表达。