news 2026/5/16 5:40:58

保姆级教程:用Python的akshare库5分钟搞定A股历史数据获取(附复权处理详解)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
保姆级教程:用Python的akshare库5分钟搞定A股历史数据获取(附复权处理详解)

从零开始:用Python和akshare轻松构建你的A股数据分析工具箱

为什么每个投资者都需要掌握数据获取技能

在信息爆炸的时代,数据已经成为投资决策的核心资产。想象一下,你正试图在茫茫股海中寻找下一个投资机会,却发现自己被各种财经新闻、分析师报告和社交媒体观点所淹没。这时候,能够直接从源头获取并分析市场数据的能力,就像在黑暗中拥有了一盏明灯。

对于刚接触量化投资的朋友来说,数据获取往往是第一个"拦路虎"。市面上的数据服务要么价格昂贵,要么接口复杂,让初学者望而却步。这正是akshare这个Python库的价值所在——它提供了免费、简单且全面的中国金融市场数据接口,特别适合个人投资者和小型团队使用。

1. 环境准备与akshare安装

1.1 创建干净的Python环境

在开始之前,我强烈建议你创建一个独立的Python虚拟环境。这可以避免库版本冲突,保持项目的整洁性。打开终端或命令提示符,执行以下命令:

# 创建虚拟环境 python -m venv akshare_env # 激活环境 (Windows) akshare_env\Scripts\activate # 激活环境 (MacOS/Linux) source akshare_env/bin/activate

1.2 安装akshare及其依赖

akshare的安装非常简单,只需要一个pip命令:

pip install akshare --upgrade

注意:如果你在中国大陆,可能会遇到下载速度慢的问题。可以尝试使用国内镜像源:

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

安装完成后,建议同时安装pandas和matplotlib,它们将是后续数据分析的好帮手:

pip install pandas matplotlib

2. 获取A股历史数据实战

2.1 理解股票代码系统

在获取数据之前,我们需要了解A股代码的基本规则:

市场类型代码前缀示例交易所
沪市A股60/68600036上交所
深市A股00/30000001深交所
科创板688688981上交所
创业板30300750深交所

2.2 基础数据获取

让我们以招商银行(600036)为例,获取其2023年的日线数据:

import akshare as ak import pandas as pd # 获取招商银行2023年日线数据 df = ak.stock_zh_a_hist( symbol="600036", period="daily", start_date="20230101", end_date="20231231", adjust="" ) print(df.head())

关键参数说明:

  • symbol: 股票代码,不带市场前缀
  • period: 数据周期,可以是"daily"(日线)、"weekly"(周线)或"monthly"(月线)
  • start_date/end_date: 日期格式为YYYYMMDD
  • adjust: 复权类型,留空表示不复权

2.3 数据保存与初步查看

获取数据后,我们可以将其保存为CSV文件,方便后续分析:

# 保存到CSV df.to_csv("600036_2023_daily.csv", index=False) # 基础统计信息 print(df.describe()) # 查看最新5条数据 print(df.tail())

3. 深入理解复权处理

3.1 为什么需要复权?

股票价格会受到分红、送股等因素影响而产生"缺口"。想象你持有一只股票:

  • 公司宣布每股派发1元现金红利
  • 除权日后,股价会自然下跌约1元
  • 如果不做复权处理,K线图上会出现一个向下的跳空缺口

这种缺口会扭曲我们对股票真实表现的判断,因此需要复权处理。

3.2 复权类型详解

akshare提供了三种复权方式:

复权类型参数值说明
不复权""原始价格数据,包含所有除权缺口
前复权"qfq"将历史价格调整到当前股本状态,便于与最新价格直接比较
后复权"hfq"将历史价格按当时股本状态计算,反映真实收益,适合长期投资分析

3.3 复权数据获取对比

让我们获取同一只股票的不同复权数据,观察差异:

# 获取不复权数据 df_raw = ak.stock_zh_a_hist("600036", "daily", "20230101", "20231231", "") # 获取前复权数据 df_qfq = ak.stock_zh_a_hist("600036", "daily", "20230101", "20231231", "qfq") # 获取后复权数据 df_hfq = ak.stock_zh_a_hist("600036", "daily", "20230101", "20231231", "hfq") # 比较2023年第一个交易日的收盘价 print(f"不复权收盘价: {df_raw.iloc[0]['收盘']}") print(f"前复权收盘价: {df_qfq.iloc[0]['收盘']}") print(f"后复权收盘价: {df_hfq.iloc[0]['收盘']}")

你会发现后复权价格通常最高,因为它包含了所有历史分红送股的影响。

4. 数据分析进阶技巧

4.1 计算简单技术指标

有了基础数据,我们可以计算一些常用的技术指标:

# 计算5日均线和20日均线 df['MA5'] = df['收盘'].rolling(5).mean() df['MA20'] = df['收盘'].rolling(20).mean() # 计算每日收益率 df['daily_return'] = df['收盘'].pct_change() # 计算波动率(20日) df['volatility'] = df['daily_return'].rolling(20).std() * (20**0.5)

4.2 可视化分析

使用matplotlib进行简单的可视化:

import matplotlib.pyplot as plt plt.figure(figsize=(12, 6)) plt.plot(df['日期'], df['收盘'], label='收盘价') plt.plot(df['日期'], df['MA5'], label='5日均线') plt.plot(df['日期'], df['MA20'], label='20日均线') plt.title('招商银行2023年股价走势') plt.legend() plt.grid() plt.show()

4.3 多股票数据对比分析

量化分析常常需要比较多只股票的表现。我们可以封装一个函数来批量获取数据:

def get_multiple_stocks(symbols, start_date, end_date, adjust=""): dfs = {} for symbol in symbols: dfs[symbol] = ak.stock_zh_a_hist( symbol=symbol, period="daily", start_date=start_date, end_date=end_date, adjust=adjust ) return dfs # 获取三只银行股数据 stocks = get_multiple_stocks(["600036", "601398", "601288"], "20230101", "20231231", "hfq")

5. 常见问题与解决方案

5.1 数据获取失败怎么办?

  • 检查股票代码是否正确:确保是6位数字代码,不带市场前缀
  • 检查日期格式:必须是YYYYMMDD格式
  • 网络问题:尝试更换网络环境或使用代理
  • akshare版本问题:运行pip install akshare --upgrade升级到最新版

5.2 如何处理大量数据请求?

如果需要获取大量股票的历史数据,建议:

  1. 添加适当的延时,避免被封IP
import time time.sleep(1) # 每次请求后暂停1秒
  1. 将数据分批次获取并保存
  2. 考虑使用akshare的pro接口(如有)

5.3 数据更新频率

akshare不同数据源的更新频率不同:

数据类型更新频率最佳获取时间
日线数据交易日当晚更新次日早上获取
实时分时数据每3-5分钟交易时间内
财务报表数据季报/年报公布后公告后1-2周

6. 扩展应用:构建简易量化策略

有了数据获取能力,我们就可以尝试构建简单的量化策略。以下是一个双均线策略的示例:

# 准备数据 df = ak.stock_zh_a_hist("600036", "daily", "20200101", "20231231", "hfq") df['MA10'] = df['收盘'].rolling(10).mean() df['MA30'] = df['收盘'].rolling(30).mean() # 生成交易信号 df['signal'] = 0 df.loc[df['MA10'] > df['MA30'], 'signal'] = 1 # 金叉买入 df.loc[df['MA10'] < df['MA30'], 'signal'] = -1 # 死叉卖出 # 计算策略收益 df['strategy_return'] = df['signal'].shift(1) * df['daily_return'] # 计算累计收益 df['cumulative_market'] = (1 + df['daily_return']).cumprod() df['cumulative_strategy'] = (1 + df['strategy_return']).cumprod() # 绘制结果 plt.figure(figsize=(12, 6)) plt.plot(df['日期'], df['cumulative_market'], label='买入持有') plt.plot(df['日期'], df['cumulative_strategy'], label='双均线策略') plt.title('策略对比') plt.legend() plt.grid() plt.show()

这只是一个非常简单的示例,实际量化策略需要考虑更多因素,如交易成本、滑点等。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/16 5:39:02

VSCode中高效绘制技术流程图:Draw.io插件实战指南

1. 为什么开发者需要流程图工具 在软件开发过程中&#xff0c;流程图是必不可少的工具。我记得刚开始写代码时&#xff0c;经常遇到逻辑混乱的情况&#xff0c;后来发现画流程图能极大提升效率。比如设计一个容器部署脚本时&#xff0c;用流程图梳理判断逻辑&#xff0c;可以避…

作者头像 李华
网站建设 2026/5/16 5:33:04

英雄联盟Akari助手:免费开源的终极游戏效率工具完整指南

英雄联盟Akari助手&#xff1a;免费开源的终极游戏效率工具完整指南 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power &#x1f680;. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 还在为英雄联盟中繁琐的配…

作者头像 李华
网站建设 2026/5/16 5:27:08

中文提示词仓库:提升AI对话效率的本地化实践指南

1. 项目概述&#xff1a;为什么我们需要一个中文的优质提示词仓库&#xff1f;如果你最近也在玩大语言模型&#xff0c;无论是 ChatGPT、Claude 还是国内的文心一言、通义千问&#xff0c;你肯定有过这样的体验&#xff1a;面对空白的输入框&#xff0c;脑子里有想法&#xff0…

作者头像 李华
网站建设 2026/5/16 5:26:19

如何永久保存番茄小说:开源下载工具的完整指南

如何永久保存番茄小说&#xff1a;开源下载工具的完整指南 【免费下载链接】fanqienovel-downloader 下载番茄小说 项目地址: https://gitcode.com/gh_mirrors/fa/fanqienovel-downloader 你是否曾因网络问题无法阅读小说&#xff1f;是否担心喜爱的小说突然下架&#x…

作者头像 李华
网站建设 2026/5/16 5:24:08

轻量级AI应用开发框架boxlite:从模型部署到生产级服务的实践指南

1. 项目概述&#xff1a;一个轻量级、开箱即用的AI应用开发与部署框架 最近在折腾AI应用开发的朋友&#xff0c;估计都经历过类似的痛苦&#xff1a;好不容易用某个大模型API或者开源模型跑通了一个Demo&#xff0c;想把它变成一个能稳定对外服务的应用&#xff0c;却发现要处理…

作者头像 李华