使用 Akshare 批量获取 A 股股票数据并保存到本地

使用 Akshare 批量获取 A 股股票数据并保存到本地

在金融数据分析领域,获取丰富且准确的股票数据是深入研究和策略制定的重要基础。akshare 是一个功能强大的 Python 库,它提供了便捷的接口来获取各类金融数据,包括我们所需的 A 股股票数据。本文将详细介绍如何使用 akshare 实现获取所有 A 股股票数据并将其保存到本地的操作步骤,以便后续进行深入的分析与处理。

一、准备工作

在开始之前,确保已经安装了 akshare 库以及 pandas 库(akshare 依赖 pandas 进行数据处理和存储)。如果尚未安装,可以使用以下命令进行安装:

pip install akshare pandas

二、获取 A 股所有上市公司的代码和名称

首先,我们需要获取所有 A 股上市公司的代码和名称信息,这将作为后续获取每只股票详细数据的基础。使用 aksharestock_info_a_code_name 函数可以轻松实现这一步骤:

import akshare as ak
import pandas as pd

# 获取 A 股所有上市公司的代码和名称
stock_info_a_code_name_df = ak.stock_info_a_code_name()

上述代码中,stock_info_a_code_name_df 是一个 DataFrame 数据结构,其中包含了每只 A 股股票的代码(code 列)和名称(name 列)。

三、指定日期范围

根据我们的需求,指定要获取股票数据的日期范围。这里假设我们要获取从 2000010120250101 的数据,你可以根据实际情况修改这两个日期:

# 指定日期范围,格式为 'YYYYMMDD'
start_date = "20000101"
end_date = "20250101"

四、循环获取每一家公司的股票数据并保存

接下来,我们通过循环遍历之前获取的股票代码和名称信息,逐一获取每只股票的日线行情数据,并将其保存到本地的 CSV 文件中。为了提高代码的稳定性和可读性,我们添加了异常处理机制,以便在获取数据过程中出现错误时能够及时捕获并记录:

# 循环获取每一家公司的股票数据并保存
for index, row in stock_info_a_code_name_df.iterrows():
    stock_code = row['code']
    stock_name = row['name']
    # 组合文件名,例如:贵州茅台 600519.SH.csv
    file_name = f"{stock_name}_{stock_code}.csv"

    try:
        # 获取股票日线行情数据,可根据实际需求换用其他合适的数据接口
        stock_data = ak.stock_zh_a_hist(symbol=stock_code, period="daily", start_date=start_date, end_date=end_date)
        # 将数据保存为 CSV 文件
        stock_data.to_csv('/Users/zjc/Desktop/data/' + file_name, index=False)
        print(f"{index}-{stock_name}{stock_code})的数据已成功保存到 {file_name}")
    except Exception as e:
        print(f"获取 {index}-{stock_name}{stock_code})的数据时出现错误:{str(e)}")

在上述代码中:

  • 对于每只股票,我们首先构建了保存数据的文件名,格式为 股票名称_股票代码.csv
  • 然后使用 aksharestock_zh_a_hist 函数获取指定股票代码在指定日期范围内的日线行情数据。这里的 period="daily" 表示获取的是日线数据,你可以根据需要修改为其他周期数据,如 weekly(周线)、monthly(月线)等。
  • 如果获取数据成功,将数据保存到本地指定路径(这里是 /Users/zjc/Desktop/data/,请根据实际情况修改为你自己的保存路径)的 CSV 文件中,并打印成功保存的信息。
  • 如果在获取数据过程中出现异常,将异常信息打印出来,以便我们排查问题。

五、总结

通过以上步骤,我们成功地使用 akshare 库获取了所有 A 股上市公司在指定日期范围内的股票数据,并将其保存到了本地的 CSV 文件中。这些数据为后续的金融数据分析、股票走势研究以及量化投资策略制定等提供了丰富的素材。

需要注意的是,在实际应用中,由于数据量较大,获取数据的过程可能会比较耗时,并且可能会受到网络状况等因素的影响。同时,akshare 库的数据接口可能会随着数据源的更新而有所变化,因此在使用过程中需要关注 akshare 的官方文档和版本更新信息,以便及时调整代码以适应变化。

希望本文能够帮助到对金融数据获取和处理感兴趣的读者,让大家能够更加便捷地利用 akshare 库开展相关的研究和工作。如果在使用过程中有任何问题或建议,欢迎在评论区留言交流。

以上文案你可以根据实际情况进行调整和修改,如果还有其他补充信息或者特定要求,请随时告诉我,我会进一步完善它。

### 使用 AKShare 获取存储股票数据至 MySQL 为了实现这一目标,需要完成两个主要部分的工作: 1. **使用 AKShare 获取指定时间范围内的股票数据** 2. **将获取数据存入 MySQL 数据库** #### 导入库和设置连接 首先导入必要的 Python 库,建立与 MySQL 数据库的连接。 ```python import akshare as ak import pymysql from datetime import datetime, timedelta import pandas as pd ``` #### 定义函数来获取股票数据 定义一个函数 `get_stock_data` 来调用 AKShare 接口获取所需的时间段内特定股票的日线行情数据[^1]。 ```python def get_stock_data(stock_code, start_date, end_date): df = ak.stock_zh_a_hist( symbol=stock_code, period="daily", start_date=start_date.strftime('%Y%m%d'), end_date=end_date.strftime('%Y%m%d') ) # 调整列名以便于理解 column_mapping = { '日期': 'date', '开盘': 'open_price', '收盘': 'close_price', '最高': 'high_price', '最低': 'low_price', '成交量': 'volume', '成交额': 'turnover', '振幅': 'amplitude', '涨跌幅': 'change_pct', '涨跌额': 'change_amount', '换手率': 'turnover_rate' } df.rename(columns=column_mapping, inplace=True) return df ``` #### 创建表结构以及插入数据到 MySQL 中 创建名为 `strategy` 的数据库下的表格用于存储上述字段的信息。接着编写 SQL 插入语句模板准备批量插入操作。 ```sql CREATE TABLE IF NOT EXISTS strategy.stock_prices ( id INT AUTO_INCREMENT PRIMARY KEY, date DATE NOT NULL UNIQUE, open_price DECIMAL(10, 4), close_price DECIMAL(10, 4), high_price DECIMAL(10, 4), low_price DECIMAL(10, 4), volume BIGINT, turnover DECIMAL(20, 8), amplitude FLOAT, change_pct FLOAT, change_amount DECIMAL(10, 4), turnover_rate FLOAT ); ``` Python端执行SQL命令前先构建好相应的参数化查询字符串: ```python insert_query = """ INSERT INTO strategy.stock_prices (date, open_price, close_price, high_price, low_price, volume, turnover, amplitude, change_pct, change_amount, turnover_rate) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s) ON DUPLICATE KEY UPDATE open_price=%s, close_price=%s, high_price=%s, low_price=%s, volume=%s, turnover=%s, amplitude=%s, change_pct=%s, change_amount=%s, turnover_rate=%s; """ ``` 最后一步是实际执行插入动作,在此之前确保已经成功建立了与 MySQL Server 的有效链接。 ```python connection = pymysql.connect(host='localhost', user='root', password='', db='strategy') try: with connection.cursor() as cursor: stock_code = "00700" start_date = datetime.strptime('2015-01-01', '%Y-%m-%d').date() end_date = datetime.strptime('2020-01-01', '%Y-%m-%d').date() data_frame = get_stock_data(stock_code, start_date, end_date) for index, row in data_frame.iterrows(): values_tuple = tuple(row.values.tolist()) * 2 # Duplicate the list to match ON DUPLICATE clause parameters. try: cursor.execute(insert_query, values_tuple) connection.commit() except Exception as e: print(f"Failed inserting record {index}: ", str(e)) finally: connection.close() ``` 以上代码实现了从网络抓取给定区间的历史日K线图数据将其持久化保存到了本地的关系型数据库中[^2]。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值