使用python akshare获取股票数据

智潮先锋
2024-04-16 / 0 评论 / 285 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2024年04月16日,已超过250天没有更新,若内容或图片失效,请留言反馈。

引言

AKshare 是什么?
AKShare 是 基于 Python 的财经数据接口库,目的是实现对股票、期货、期权、基金、外汇、债券、指数、加密货币等金融产品的基本面数据、实时和历史行情数据、衍生数据从数据采集、数据清洗到数据落地的一套工具,主要用于学术研究目的。

AKShare 的特点?
AKShare 的特点是获取的是相对权威的财经数据网站公布的原始数据,通过利用原始数据进行各数据源之间的交叉验证,进而再加工,从而得出科学的结论。

Github:https://github.com/akfamily/akshare
文档:https://akshare.akfamily.xyz/

开始使用

安装部署

AKShare 原身是基于 Python 的财经数据接口库,当然目前也支持 http 接口部署。
本文主要使用 Python 环境,Python 如何安装不再演示,使用venv创建虚拟环境,使用 pip 安装 Akshare 包。

# 创建虚拟环境
root@mine:/pro-dev/akshare-uat# python3 -m venv venv
# 激活虚拟环境
root@mine:/pro-dev/akshare-uat# source venv/bin/activate
# 在虚拟环境安装akshare
(venv) root@mine:/pro-dev/akshare-uat# pip install akshare

然后查看包已经安装完成了:

(venv) root@mine:/pro-dev/akshare-uat# pip list | grep akshare
akshare            1.13.38

获取一只股票的行情数据

接下来我们获取一只股票的行情数据,以 工商银行 为例。

import akshare as ak
stock_zh_a_hist_df = ak.stock_zh_a_hist(
                                        symbol="601398",        # 股票代码
                                        period="daily",         # 日线数据
                                        start_date="20180101",  # 开始日期
                                        end_date="20240101",    # 截至日期
                                        adjust=""
                                    )
print(stock_zh_a_hist_df)

打印结果:

(venv) root@mine:/pro-dev/akshare-uat# python main.py
      日期         开盘  收盘  最高   最低  成交量    成交额        振幅  涨跌幅 涨跌额 换手率
0     2018-01-02  6.19  6.18  6.39  6.11  5374662  3.356778e+09  4.52 -0.32  -0.02  0.20
1     2018-01-03  6.18  6.16  6.32  6.12  3493611  2.172614e+09  3.24 -0.32  -0.02  0.13
2     2018-01-04  6.18  6.07  6.18  6.06  4351365  2.661279e+09  1.95 -1.46  -0.09  0.16
3     2018-01-05  6.09  6.08  6.11  6.06  2817843  1.715072e+09  0.82  0.16   0.01  0.10
4     2018-01-08  6.09  6.07  6.10  6.04  2184876  1.325134e+09  0.99 -0.16  -0.01  0.08
...          ...   ...   ...   ...   ...      ...           ...   ...   ...    ...   ...
1452  2023-12-25  4.77  4.80  4.81  4.77  1094809  5.249893e+08  0.84  0.42   0.02  0.04
1453  2023-12-26  4.80  4.82  4.82  4.79  1487372  7.155550e+08  0.63  0.42   0.02  0.06
1454  2023-12-27  4.82  4.83  4.84  4.78  1843188  8.862157e+08  1.24  0.21   0.01  0.07
1455  2023-12-28  4.83  4.77  4.85  4.77  3465162  1.664753e+09  1.66 -1.24  -0.06  0.13
1456  2023-12-29  4.78  4.78  4.80  4.77  1800478  8.615642e+08  0.63  0.21   0.01  0.07

[1457 rows x 11 columns]

增加缓存

由于每次调用都是在向财经接口发送请求,频率过高了有被封 IP 的风险。这里我们将取得的数据存储到本地,当再次需要同样数据的时候直接从存储读取,避免短时间重复发送请求,同时也提高了速度。

import akshare as ak
# 首先获取到行情数据
stock_zh_a_hist_df = ak.stock_zh_a_hist(
                                        symbol="601398",        # 股票代码
                                        period="daily",         # 日线数据
                                        start_date="20180101",  # 开始日期
                                        end_date="20240101",    # 截至日期
                                        adjust=""
                                    )
# 将数据保存到文件 stock_zh_a_hist_df.pkl
stock_zh_a_hist_df.to_pickle("stock_zh_a_hist_df.pkl")

这样我们在调用的时候直接读取本地文件 stock_zh_a_hist_df.pkl 即可

# 需要导入pandas
import pandas as pd
stock_zh_a_hist_df = pd.read_pickle("stock_zh_a_hist_df.pkl")
print(stock_zh_a_hist_df)

如果我们是在做测试验证,可以使用 try except 把上面过程组织起来,不用每次要先运行获取存储数据、再运行策略算法。

# 导入 akshare 和 pandas
import akshare as ak
import pandas as pd

try:
  # 首先尝试从本地读取文件
  stock_zh_a_hist_df = pd.read_pickle("stock_zh_a_hist_df.pkl")
except:
  # 如果没有则会调用 ak 接口获取
  stock_zh_a_hist_df = ak.stock_zh_a_hist(
                                        symbol="601398",        # 股票代码
                                        period="daily",         # 日线数据
                                        start_date="20180101",  # 开始日期
                                        end_date="20240101",    # 截至日期
                                        adjust=""
                                    )
  # 获取数据后存储到本地
  stock_zh_a_hist_df.to_pickle("stock_zh_a_hist_df.pkl")
print(stock_zh_a_hist_df)

能够保证我们每次相同的数据只需要执行一次接口调用。

1

评论 (0)

取消