深圳融克迪特科技有限公司 Logo,金融科技,量化交易,软件开发

深圳融克迪特科技有限公司

RONG CREDIT TECHNOLOGY CO., LTD.

基础入门

【AkShare 系列 第3讲】下载上证指数近一个月数据

本讲把练习对象从个股扩展到指数,围绕“下载上证指数近一个月日线并压缩成基准预览表”这一任务展开。内容覆盖指数接口与个股接口的差异、时间范围检查、核心列提取、自检练习和后续基准表用途说明,目标是让入门者开始理解指数数据在后续研究中更像对照基准而不是个股替代品。

2026-04-22 智铨研究 阅读时长 11 分钟

目录

  1. 本节目标
  2. 为什么要在第 3 讲引入指数数据
  3. 延续第 2 讲的检查口径
  4. 四步拿到上证指数近一个月数据
  5. 先选定指数口径
  6. 调用指数历史行情接口
  7. 先看时间范围和核心字段
  8. 截出最常用的预览表
  9. 确认这张指数表已经可继续使用
  10. 返回值是 DataFrame
  11. 表格不为空
  12. 日期列能顺利转时间类型
  13. 至少存在收盘列
  14. 最近一个月的样本量合理
  15. 指数数据为什么看起来和个股不一样
  16. 同样是历史行情,为什么 symbol 规则不同
  17. 列名比第 2 讲多或者少
  18. 拿到的是更长区间的数据
  19. 想同时下载多个指数做对比
  20. 把“下载一个月指数数据”封装成小函数
  21. 哪些指数数据现象属于正常波动
  22. 让指数表真正服务后续课程
  23. 手动确认时间范围
  24. 只保留日期和收盘价
  25. 按日期重新排序
  26. 再换一个区间重跑
  27. 准备一张“可和个股对照”的指数基准表
  28. 怎样判断这张指数表已经够用了
  29. 学完这一讲后最好记住什么
  30. 本讲小结
  31. 系列衔接
  32. 风险揭示与免责声明

1. 本节目标

本讲要完成的任务比第 2 讲再前进一步:用 AkShare 下载上证指数近一个月的日线数据,并把它压成一张便于后续查看和保存的短表。这一步的意义不只是“换了另一个接口”,而是让你开始接触“个股行情”和“指数行情”在使用方式上的差异。

做完这一讲后,至少要能把下面三个问题说清楚:

  1. 指数数据和个股数据在参数写法上通常有什么不同。
  2. 怎样把较长时间序列压缩到“最近一个月”这类练习友好的范围。
  3. 拿到指数表之后,怎样快速确认它适合继续做保存、预览和简单统计。

本讲仍然坚持短课原则:只做一件事,把这件事做完整。

2. 为什么要在第 3 讲引入指数数据

如果你一直只练个股数据,很容易默认所有行情接口都长得一样。但真实使用 AkShare 时,你会很快遇到两类常见任务:

  1. 拉单只股票,关注某个代码的历史行情。
  2. 拉指数或基准,作为回测、对比或市场背景数据。

第 3 讲安排“上证指数近一个月数据”,就是为了用一个非常轻量的场景,让你看到指数数据也能用同样的思路去检查:

只要这一步走通,后面你看板块指数、行业指数或其他市场基准时,思路基本一致。

3. 延续第 2 讲的检查口径

开始前,建议先保留和第 2 讲一致的最小导入方式:

import akshare as ak
import pandas as pd

本讲为了减少日期边界上的复杂性,可以先把“近一个月”写成一个固定区间,而不是动态计算今天往前推多少天。比如:

start_date = "20240301"
end_date = "20240331"

这样做的好处是:教程里的示例和你本地的打印结果更容易核对,也不容易因为当天日期不同导致表格长度变化太大。

4. 四步拿到上证指数近一个月数据

下面按顺序拆开做,每一步只处理一个最小动作,先把流程走通,再看细节。

5. 先选定指数口径

本讲只围绕上证指数,不同时引入深证成指或沪深 300。先把输入压到最小:

symbol = "000001"

这里的关键不是死记某个代码,而是知道“指数接口通常有自己的 symbol 规则”。如果你把个股接口的写法直接照搬到指数接口,很容易得到空表或结构不符合预期。

6. 调用指数历史行情接口

在常见的 AkShare 版本里,可以先这样写:

index_df = ak.index_zh_a_hist(
    symbol=symbol,
    period="daily",
    start_date=start_date,
    end_date=end_date
)

如果你的本地版本没有这个函数,或者参数名略有不同,不要立刻改业务逻辑,先用 dir(ak)、官方文档或本地补全确认当前版本可用的指数历史接口名,再按同样的检查流程继续。短课里最重要的是流程一致,不是为了追某个特定函数名死磕。

7. 先看时间范围和核心字段

指数表拿到手后,先不要关注所有列,先确认它到底是不是“最近一个月”的日线:

print(index_df.head())
print(index_df.tail())
print(index_df.shape)
print(index_df.columns.tolist())

这一步要回答四个问题:

  1. 表是不是空的。
  2. 起止日期是不是大致落在你预期的一个月区间里。
  3. 有没有开盘、收盘、最高、最低、成交量之类的基础列。
  4. 行数是不是接近一个月内的交易日数量,而不是异常少或异常多。

8. 截出最常用的预览表

为了给后面的第 5 讲和第 6 讲做准备,可以先把最常见的预览列单独拿出来:

core_cols = ["日期", "开盘", "收盘", "成交量"]
index_preview = index_df[core_cols].copy()
print(index_preview.head())

这一步不是多余动作。真正的入门练习,不应该每次都面对十几列字段发愣,而应该先学会把最有用的那几列拿出来,看懂它、保存它、继续处理它。

9. 确认这张指数表已经可继续使用

本讲的验证标准建议固定成下面几条。只要都通过,这次调用就算真正成功。

10. 返回值是 DataFrame

assert isinstance(index_df, pd.DataFrame)

11. 表格不为空

assert len(index_df) > 0

12. 日期列能顺利转时间类型

date_col = next(col for col in index_df.columns if "日期" in str(col))
parsed_dates = pd.to_datetime(index_df[date_col])
assert parsed_dates.notna().all()

13. 至少存在收盘列

assert any("收盘" in str(col) for col in index_df.columns)

14. 最近一个月的样本量合理

assert len(index_df) >= 15

这里不要求精确到某个固定行数,因为不同时间区间、节假日分布和数据源口径都可能影响样本长度。入门阶段只需要先判断它是不是一张“像样的一个月日线表”。

15. 指数数据为什么看起来和个股不一样

下面这些情况第一次上手时最常见,提前看一眼能少走很多弯路。

16. 同样是历史行情,为什么 symbol 规则不同

因为不同数据对象背后的接口封装并不统一。个股、指数、板块本来就不是同一类数据源。短课阶段不要试图用一个万能规则覆盖所有接口,而是先养成“先看当前接口参数口径”的习惯。

17. 列名比第 2 讲多或者少

这很正常。指数接口和个股接口的字段集合不必完全一致。你的目标不是让每张表长得一模一样,而是知道如何快速找到日期、价格和成交相关列。

18. 拿到的是更长区间的数据

如果本地版本接口没有严格按 start_dateend_date 返回预期范围,不要直接判定失败。先打印头尾日期,再用 pandas 自己筛一遍最近一个月,这样也能继续完成当前课程目标。

19. 想同时下载多个指数做对比

先别扩题。本讲只练一只指数。等你把单表检查、保存和预览流程跑顺,再去做多指数拼接,会更稳。

20. 把“下载一个月指数数据”封装成小函数

建议把本讲动作沉淀成一个很小的函数,后面你要换指数或换日期区间时,只改参数,不改主流程:

import akshare as ak
import pandas as pd

def load_index_month(symbol: str, start_date: str, end_date: str) -> pd.DataFrame:
    df = ak.index_zh_a_hist(
        symbol=symbol,
        period="daily",
        start_date=start_date,
        end_date=end_date
    )
    if df.empty:
        raise ValueError(f"指数 {symbol} 在指定区间没有取到数据")
    return df

index_df = load_index_month("000001", "20240301", "20240331")
print(index_df.head())

后面你要导出 CSV、预览 DataFrame 或联动 pandas 算指标,都可以从这一步继续接。

21. 哪些指数数据现象属于正常波动

和第 2 讲的个股表相比,指数数据更容易让新手产生“是不是拿错了”的焦虑。下面几种现象先不要急着判失败:

  1. 行数不是整整 30 或 31 行。因为你拿的是交易日数据,不是自然日清单,一个月里本来就会剔除周末和节假日。
  2. 成交量或成交额列看起来尺度很大。指数数据的量级和个股不同很正常,不需要一开始就强行标准化。
  3. 头尾日期不完全卡在月初和月末。只要大致落在目标区间,并且能通过 pandas 再筛一次,就不影响本讲目标。
  4. 列名和个股行情表不完全一样。指数接口封装不必和个股接口完全同构,关键还是先确认日期和价格列是否可读。

短课阶段最值得避免的误区,是因为样式略有差异就重写整段逻辑。先把数据拿稳,再谈统一格式。

22. 让指数表真正服务后续课程

建议不要停在“下载成功”。至少做下面几步自检,后面你在第 5 讲、第 6 讲会明显更轻松:

23. 手动确认时间范围

date_col = next(col for col in index_df.columns if '日期' in str(col))
parsed_dates = pd.to_datetime(index_df[date_col])
print(parsed_dates.min(), parsed_dates.max())

这个动作会帮你真正理解表里覆盖的是哪段区间,而不是只靠 start_dateend_date 以为自己拿对了。

24. 只保留日期和收盘价

close_col = next(col for col in index_df.columns if '收盘' in str(col))
mini_index_df = index_df[[date_col, close_col]].copy()
print(mini_index_df.head())

后面如果你要做和个股走势的肉眼对比,往往先从这样一张最小表开始,而不是背着整张原表到处走。

25. 按日期重新排序

sorted_df = index_df.sort_values(date_col).reset_index(drop=True)
print(sorted_df.head())
print(sorted_df.tail())

你不一定非要在本讲里改表,但至少要知道如果顺序不合预期,最基本的整理动作是什么。

26. 再换一个区间重跑

把区间往前挪一个月,重新下载一次。目的不是扩大数据量,而是确认你的代码没有隐性写死在某一段日期上。

27. 准备一张“可和个股对照”的指数基准表

为了让第 3 讲不是孤立练习,建议你做一个很短的小作业:

  1. 下载上证指数最近一个月数据。
  2. 只保留日期、收盘、成交量三列。
  3. 把列顺序整理清楚。
  4. 打印头尾各 3 行。
  5. 写一句备注:这张表后续准备跟哪类数据做对照。

一个简单的版本可以这样写:

baseline_df = index_df[[date_col, close_col, '成交量']].copy()
baseline_df = baseline_df.sort_values(date_col).reset_index(drop=True)
print(baseline_df.head(3))
print(baseline_df.tail(3))
# 后续作为个股走势对照基准

如果你能完成这一步,第 3 讲的产出就已经不只是“抓到一个指数接口”,而是一份真的能给后续练习复用的基准表。

28. 怎样判断这张指数表已经够用了

第 3 讲不要求你一口气把指数研究做深,但它至少要达到一个很明确的“够用”标准:

  1. 你已经拿到一张最近一个月左右的指数日线表。
  2. 你能指出其中的日期列和收盘列。
  3. 你知道如何把完整表压缩成最小预览表。
  4. 你已经接受“指数表和个股表不必长得完全一样”这个现实。

只要这四条成立,第 3 讲就不是孤立练习,而是已经为第 5 讲“转成 DataFrame 并预览”、第 6 讲“保存行情到 CSV”打好了基准输入。

29. 学完这一讲后最好记住什么

这一讲最值得记住的,不是某个具体接口名,而是两个工作习惯:

  1. 先确认对象类型和时间范围,再看细节字段。
  2. 先压缩出核心列,再决定后续要不要保存、对照或继续计算。

这两个习惯一旦建立,你以后换成别的指数、行业指数甚至海外基准数据,适应成本都会明显降低。

如果你愿意再多做一步,可以把第 2 讲的个股表和第 3 讲的指数表并排打印出来,直接观察两者在日期覆盖、列结构和使用目的上的差别。入门阶段能做到这种最简单的横向对照,已经比单独记接口名更有价值。

再往前走一步,你甚至可以在注释里写一句非常朴素的话,比如“这张指数表后面拿来当市场背景基准”。这类看似简单的备注,会帮你在后面的练习里始终记得:指数数据的作用往往不是替代个股,而是作为参照系存在。

能把这句话写清楚,说明你已经开始从“会拿数据”走向“知道拿这份数据是为了什么”。

这就是第 3 讲最实在的收获。

30. 本讲小结

本讲的价值在于,你已经不再只会拿一只股票的日线,而是开始理解“指数数据也能用同一种最小流程去拿、去查、去压缩”。只要你能稳定拿到上证指数近一个月数据,并确认日期、收盘和成交量这些核心列可用,后面继续做保存、预览和简单计算就顺理成章了。

31. 系列衔接

本讲是《AkShare数据获取入门短课》的第 3/8 讲,当前主题是《下载上证指数近一个月数据》。

上一讲:第 2 讲《获取单只股票日线》。

下一讲:第 4 讲《抓取一份财经日历》。

后续安排:第 5 讲《转成DataFrame并预览》;第 6 讲《保存行情到CSV》。

32. 风险揭示与免责声明

风险揭示与免责声明

本页面内容仅用于量化研究与技术交流,旨在展示研究方法与流程,不构成对任何金融产品、证券或衍生品的要约、招揽、推荐或保证。

本文所涉历史数据、回测结果与示例参数不代表未来表现,也不应作为投资决策依据。

市场存在波动、流动性与执行偏差等不确定性,任何策略均可能出现收益波动或阶段性失效。

读者应结合自身风险承受能力进行独立判断,并在必要时咨询持牌专业机构意见。