基础入门
本讲把练习对象从个股扩展到指数,围绕“下载上证指数近一个月日线并压缩成基准预览表”这一任务展开。内容覆盖指数接口与个股接口的差异、时间范围检查、核心列提取、自检练习和后续基准表用途说明,目标是让入门者开始理解指数数据在后续研究中更像对照基准而不是个股替代品。
本讲要完成的任务比第 2 讲再前进一步:用 AkShare 下载上证指数近一个月的日线数据,并把它压成一张便于后续查看和保存的短表。这一步的意义不只是“换了另一个接口”,而是让你开始接触“个股行情”和“指数行情”在使用方式上的差异。
做完这一讲后,至少要能把下面三个问题说清楚:
本讲仍然坚持短课原则:只做一件事,把这件事做完整。
如果你一直只练个股数据,很容易默认所有行情接口都长得一样。但真实使用 AkShare 时,你会很快遇到两类常见任务:
第 3 讲安排“上证指数近一个月数据”,就是为了用一个非常轻量的场景,让你看到指数数据也能用同样的思路去检查:
只要这一步走通,后面你看板块指数、行业指数或其他市场基准时,思路基本一致。
开始前,建议先保留和第 2 讲一致的最小导入方式:
import akshare as ak
import pandas as pd
本讲为了减少日期边界上的复杂性,可以先把“近一个月”写成一个固定区间,而不是动态计算今天往前推多少天。比如:
start_date = "20240301"
end_date = "20240331"
这样做的好处是:教程里的示例和你本地的打印结果更容易核对,也不容易因为当天日期不同导致表格长度变化太大。
下面按顺序拆开做,每一步只处理一个最小动作,先把流程走通,再看细节。
本讲只围绕上证指数,不同时引入深证成指或沪深 300。先把输入压到最小:
symbol = "000001"
这里的关键不是死记某个代码,而是知道“指数接口通常有自己的 symbol 规则”。如果你把个股接口的写法直接照搬到指数接口,很容易得到空表或结构不符合预期。
在常见的 AkShare 版本里,可以先这样写:
index_df = ak.index_zh_a_hist(
symbol=symbol,
period="daily",
start_date=start_date,
end_date=end_date
)
如果你的本地版本没有这个函数,或者参数名略有不同,不要立刻改业务逻辑,先用 dir(ak)、官方文档或本地补全确认当前版本可用的指数历史接口名,再按同样的检查流程继续。短课里最重要的是流程一致,不是为了追某个特定函数名死磕。
指数表拿到手后,先不要关注所有列,先确认它到底是不是“最近一个月”的日线:
print(index_df.head())
print(index_df.tail())
print(index_df.shape)
print(index_df.columns.tolist())
这一步要回答四个问题:
为了给后面的第 5 讲和第 6 讲做准备,可以先把最常见的预览列单独拿出来:
core_cols = ["日期", "开盘", "收盘", "成交量"]
index_preview = index_df[core_cols].copy()
print(index_preview.head())
这一步不是多余动作。真正的入门练习,不应该每次都面对十几列字段发愣,而应该先学会把最有用的那几列拿出来,看懂它、保存它、继续处理它。
本讲的验证标准建议固定成下面几条。只要都通过,这次调用就算真正成功。
assert isinstance(index_df, pd.DataFrame)
assert len(index_df) > 0
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()
assert any("收盘" in str(col) for col in index_df.columns)
assert len(index_df) >= 15
这里不要求精确到某个固定行数,因为不同时间区间、节假日分布和数据源口径都可能影响样本长度。入门阶段只需要先判断它是不是一张“像样的一个月日线表”。
下面这些情况第一次上手时最常见,提前看一眼能少走很多弯路。
因为不同数据对象背后的接口封装并不统一。个股、指数、板块本来就不是同一类数据源。短课阶段不要试图用一个万能规则覆盖所有接口,而是先养成“先看当前接口参数口径”的习惯。
这很正常。指数接口和个股接口的字段集合不必完全一致。你的目标不是让每张表长得一模一样,而是知道如何快速找到日期、价格和成交相关列。
如果本地版本接口没有严格按 start_date、end_date 返回预期范围,不要直接判定失败。先打印头尾日期,再用 pandas 自己筛一遍最近一个月,这样也能继续完成当前课程目标。
先别扩题。本讲只练一只指数。等你把单表检查、保存和预览流程跑顺,再去做多指数拼接,会更稳。
建议把本讲动作沉淀成一个很小的函数,后面你要换指数或换日期区间时,只改参数,不改主流程:
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 算指标,都可以从这一步继续接。
和第 2 讲的个股表相比,指数数据更容易让新手产生“是不是拿错了”的焦虑。下面几种现象先不要急着判失败:
短课阶段最值得避免的误区,是因为样式略有差异就重写整段逻辑。先把数据拿稳,再谈统一格式。
建议不要停在“下载成功”。至少做下面几步自检,后面你在第 5 讲、第 6 讲会明显更轻松:
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_date、end_date 以为自己拿对了。
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())
后面如果你要做和个股走势的肉眼对比,往往先从这样一张最小表开始,而不是背着整张原表到处走。
sorted_df = index_df.sort_values(date_col).reset_index(drop=True)
print(sorted_df.head())
print(sorted_df.tail())
你不一定非要在本讲里改表,但至少要知道如果顺序不合预期,最基本的整理动作是什么。
把区间往前挪一个月,重新下载一次。目的不是扩大数据量,而是确认你的代码没有隐性写死在某一段日期上。
为了让第 3 讲不是孤立练习,建议你做一个很短的小作业:
一个简单的版本可以这样写:
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 讲的产出就已经不只是“抓到一个指数接口”,而是一份真的能给后续练习复用的基准表。
第 3 讲不要求你一口气把指数研究做深,但它至少要达到一个很明确的“够用”标准:
只要这四条成立,第 3 讲就不是孤立练习,而是已经为第 5 讲“转成 DataFrame 并预览”、第 6 讲“保存行情到 CSV”打好了基准输入。
这一讲最值得记住的,不是某个具体接口名,而是两个工作习惯:
这两个习惯一旦建立,你以后换成别的指数、行业指数甚至海外基准数据,适应成本都会明显降低。
如果你愿意再多做一步,可以把第 2 讲的个股表和第 3 讲的指数表并排打印出来,直接观察两者在日期覆盖、列结构和使用目的上的差别。入门阶段能做到这种最简单的横向对照,已经比单独记接口名更有价值。
再往前走一步,你甚至可以在注释里写一句非常朴素的话,比如“这张指数表后面拿来当市场背景基准”。这类看似简单的备注,会帮你在后面的练习里始终记得:指数数据的作用往往不是替代个股,而是作为参照系存在。
能把这句话写清楚,说明你已经开始从“会拿数据”走向“知道拿这份数据是为了什么”。
这就是第 3 讲最实在的收获。
本讲的价值在于,你已经不再只会拿一只股票的日线,而是开始理解“指数数据也能用同一种最小流程去拿、去查、去压缩”。只要你能稳定拿到上证指数近一个月数据,并确认日期、收盘和成交量这些核心列可用,后面继续做保存、预览和简单计算就顺理成章了。
本讲是《AkShare数据获取入门短课》的第 3/8 讲,当前主题是《下载上证指数近一个月数据》。
上一讲:第 2 讲《获取单只股票日线》。
下一讲:第 4 讲《抓取一份财经日历》。
后续安排:第 5 讲《转成DataFrame并预览》;第 6 讲《保存行情到CSV》。
风险揭示与免责声明
本页面内容仅用于量化研究与技术交流,旨在展示研究方法与流程,不构成对任何金融产品、证券或衍生品的要约、招揽、推荐或保证。
本文所涉历史数据、回测结果与示例参数不代表未来表现,也不应作为投资决策依据。
市场存在波动、流动性与执行偏差等不确定性,任何策略均可能出现收益波动或阶段性失效。
读者应结合自身风险承受能力进行独立判断,并在必要时咨询持牌专业机构意见。