AI股票小助手02-Akshare数据采集

0 阅读7分钟

by 雪隐 from juejin.cn/user/143341…

文欢迎分享与聚合,全文转载就不必了,尊重版权,圈子就这么大,若急用可联系授权

AkShare 金融数据获取教程

本文介绍如何使用 AkShare 获取三类常用金融数据:财务数据、日线数据、分钟数据。以宁德时代(300750)为例,演示完整的数据获取流程。


目录


环境准备

由于这个专栏不是python教学。麻烦大家自己去了解python相关,如果什么都要从初级开始写,可能篇幅会很大。并且,现在有了AI,所有的代码理解起来并不是那么困难,大家可以通过各种web端的AI,来辅助大家。

这里我推荐大家在自己的机器上安装miniconda, 请参照安装指南,因为如果东西多了以后,可能会发生依赖不兼容的情况。

安装完成以后,请执行下面的命令,我一般习惯用python=3.10或者3.11,这2个版本对大模型的兼容性较好。

conda create -n stock_assistant python=3.10 -y
conda activate stock_assistant
pip install akshare pandas

财务数据获取

功能说明

通过 stock_financial_report_sina() 获取三大财务报表(利润表、资产负债表、现金流量表),再自行计算常用财务指标。

适用场景:需要从原始报表提取特定指标,或做自定义财务分析。

核心代码

import akshare as ak

STOCK_CODE_SINA = 'sh300750'  # 新浪格式:sh/sz + 代码

# 获取利润表
df_income = ak.stock_financial_report_sina(stock=STOCK_CODE_SINA, symbol="利润表")

# 获取资产负债表
df_balance = ak.stock_financial_report_sina(stock=STOCK_CODE_SINA, symbol="资产负债表")

# 获取现金流量表
df_cashflow = ak.stock_financial_report_sina(stock=STOCK_CODE_SINA, symbol="现金流量表")

接口参数

参数说明示例
stock股票代码(新浪格式)'sh300750''sz000858'
symbol报表类型"利润表""资产负债表""现金流量表"

返回数据

  • 每只股票的全部历史报告期数据
  • 列名:中文学段名(如"营业总收入"、"净利润"等)
  • 时间范围通常从IPO至今

数据处理

AkShare 返回的是原始报表,字段名存在中英文混用、版本差异等问题,需要做字段映射:

def get_col(row, col_names):
    """从行中获取字段值,支持模糊匹配"""
    for name in col_names:
        if name in row.index:
            val = safe_float(row[name])
            if val is not None:
                return val
        # 模糊匹配:列名包含关键字即匹配
        for col in row.index:
            if name in str(col):
                return safe_float(row[col])
    return None

def safe_float(val):
    if val is None or str(val).strip() in ('', '--', 'None', 'nan'):
        return None
    try:
        return float(val)
    except:
        return None

财务指标计算示例

# 盈利能力
grossprofit_margin = round((revenue - operating_cost) / revenue * 100, 2)
netprofit_margin = safe_divide(net_profit, revenue, pct=True)
roe = safe_divide(net_profit, total_equity, pct=True)
roa = safe_divide(net_profit, total_assets, pct=True)

# 偿债能力
debt_to_assets = safe_divide(total_liab, total_assets, pct=True)
current_ratio = safe_divide(current_assets, current_liab)
quick_ratio = safe_divide(current_assets - inventory, current_liab)

输出字段(共22个)

end_date, eps, roe, roa, grossprofit_margin, netprofit_margin, op_margin,
debt_to_assets, current_ratio, quick_ratio, assets_turn,
operating_cashflow, investing_cashflow, financing_cashflow,
ocf_to_revenue, ocf_to_profit, revenue, net_profit,
total_assets, total_liab, total_equity, monetary_funds

输出示例

end_date                20250630      20250331
eps                     5.153000e+01  2.176000e+01
roe                     2.602360e+01  1.039290e+01
grossprofit_margin       9.129000e+01  8.976000e+01
netprofit_margin         5.208010e+01  5.222450e+01
debt_to_assets           1.280880e+01  1.212270e+01
current_ratio            6.619300e+00  7.060700e+00

日线数据获取

功能说明

通过 stock_zh_a_hist() 获取 A 股历史日线数据,支持前复权/后复权/不复权。

数据来源:东方财富(不稳定,可能遭遇反爬)

适用场景:技术分析、趋势策略、量化回测等。

核心代码

import akshare as ak

STOCK_CODE = '300750'  # 纯数字代码

# 下载日线数据(前复权)
df = ak.stock_zh_a_hist(
    symbol=STOCK_CODE,
    period="daily",        # 日线
    start_date="20240101",
    end_date="20251231",
    adjust="qfq"           # 前复权(qfq=前复权, hfq=后复权, ""=不复权)
)

接口参数

参数说明可选值
symbol股票代码纯数字,如 '300750'
periodK线周期"daily""weekly""monthly"
start_date开始日期"YYYYMMDD" 格式
end_date结束日期"YYYYMMDD" 格式
adjust复权类型"qfq" 前复权、"hfq" 后复权、"" 不复权

返回字段

字段说明
日期交易日期
开盘开盘价
收盘收盘价
最高最高价
最低最低价
成交量成交量(股)
成交额成交额(元)
涨跌幅涨跌百分比
换手率换手率

输出示例

date        open    high    low     close    volume
2024-01-02  1678.0  1698.0  1666.0  1685.0   32150800
2024-01-03  1686.0  1705.0  1681.0  1692.0   28765400
2024-01-04  1695.0  1718.0  1689.0  1712.0   35678900

批量重命名

原始返回中文列名,可统一转换为英文便于后续处理:

col_map = {
    '日期': 'date',
    '开盘': 'open',
    '收盘': 'close',
    '最高': 'high',
    '最低': 'low',
    '成交量': 'volume',
}
df = df.rename(columns=col_map)
df['date'] = pd.to_datetime(df['date'])

分钟数据获取

功能说明

通过 stock_zh_a_hist_min_em() 获取 A 股分钟级 K 线数据。

适用场景:盘口分析、短线择时、日内策略。

核心代码

import akshare as ak

STOCK_CODE = '300750'

# 下载1分钟数据
df = ak.stock_zh_a_hist_min_em(
    symbol=STOCK_CODE,
    start_date="2026-02-10 09:30:00",
    end_date="2026-02-10 15:00:00",
    period="1",
    adjust=""
)

接口参数

参数说明可选值
symbol股票代码纯数字,如 '300750'
start_date开始时间"YYYY-MM-DD HH:MM:SS" 格式
end_date结束时间"YYYY-MM-DD HH:MM:SS" 格式
periodK线周期"1""5""15""30""60"
adjust复权类型"qfq""hfq""" 不复权(分钟数据通常不复权)

重要限制

注意:该接口只能获取最近5个交易日的数据,无法获取历史分钟数据。

返回字段

字段说明
时间交易时间(精确到分钟)
开盘开盘价
收盘收盘价
最高最高价
最低最低价
成交量成交量
成交额成交额

输出示例

datetime             open    high    low     close   volume     amount
2026-02-10 09:30:00  1780.0  1785.0  1778.0  1782.0   125400   223158000
2026-02-10 09:31:00  1782.0  1788.0  1781.0  1785.0   98700    176295000
2026-02-10 09:32:00  1785.0  1790.0  1784.0  1788.0   112300   200694000

常见问题

Q: 如何获取其他股票的数据?

将代码中的股票代码替换即可:

  • AkShare 格式:纯数字,如 '300750'
  • 新浪格式:'sh300750'(财务数据接口使用)

Q: 复权是什么意思?

  • 前复权(qfq):以当前价格为基准,向后调整历史价格。适合技术分析。
  • 后复权(hfq):以历史价格为基准,向前调整价格。适合长期投资分析。
  • 不复权:保持原始价格。适合计算真实波动。

Q: AkShare 稳定性如何?

AkShare 的数据源来自新浪、东方财富等平台,东方财富近期反爬机制越来越严格,日线和分钟数据接口可能出现获取失败的情况。财务数据使用新浪接口,相对稳定,但仍不保证 100% 可用。

建议:如需稳定的数据源,可考虑 Tushare Pro(需要 Token,但数据质量更高、更稳定)。

Q: 数据导出格式是什么?

默认保存为 CSV 文件(encoding='utf-8-sig'),可用 Excel 或 Pandas 直接读取。

完整运行示例

cd 002
python 财务数据-akshare.py
python 日线数据-akshare.py
python 分钟数据-akshare.py

数据文件保存在各脚本目录下的 data/ 文件夹中。


总结

数据类型接口函数数据范围是否有时间限制
财务数据stock_financial_report_sina全历史报告期
日线数据stock_zh_a_hist自定义起止日期
分钟数据stock_zh_a_hist_min_em最近5个交易日有(5天)

AkShare 最大的优势是无需注册、即装即用,适合快速验证和数据原型开发。但数据源稳定性存在问题,建议生产环境使用 Tushare Pro。

代码地址,分钟数据最近可能不稳定,无法获取数据

写在最后

下一章节,我会介绍另一种更加稳定的获取数据的方式TuShare,但是它是付费的。如果觉得这篇文章对你们有帮助,请记得点赞和评论和分享。你们的支持是我写作的动力。