一、程序功能

程序基于 baostock 接口实现 A 股股票数据的获取与存储,主要功能包括股票列表更新、数据下载与处理。程序通过三个核心函数协同工作:

  1. update_stk_list(date=None):获取指定日期的 A 股股票列表,默认使用当日。自动处理周末日期,尝试最多 3 次 API 调用。筛选出沪市(sh.600000 及以上)和深市(sz.399000 及以下)的股票,保存完整列表和筛选后的列表到 CSV 文件,返回股票代码列表。

  2. load_stk_list():从本地 CSV 文件加载股票列表,用于非首次运行时避免重复获取。

  3. download_data(stk_list, fromdate, todate, datas, frequency, adjustflag):下载指定股票的历史 K 线数据,支持日线、周线、月线及分钟线(5/15/30/60 分钟)。可设置复权类型(默认前复权),自动跳过停牌数据,将时间戳转换为可读格式,按股票代码分文件存储。

二、主程序流程

  • 初始化数据目录
  • 登录 baostock 接口
  • 更新或加载股票列表
  • 下载日线数据(其他周期数据下载被注释)
  • 登出接口

关键参数说明:

  • DROP_SUSPENSION:是否删除停牌数据
  • frequency:数据周期(d/w/m/5/15/30/60)
  • adjustflag:复权类型(1: 后复权,2: 前复权,3: 不复权)
  • datas:需要获取的字段列表

程序具备完善的异常处理机制,包括 API 调用失败重试、数据为空处理、网络异常捕获等,确保数据获取的稳定性。

三、程序源代码

# -*- coding: utf-8 -*-
"""
Created on Wed Jun  4 11:26:27 2025@author: Administrator
"""# 导入必要的库
import baostock as bs  # 导入baostock接口库用于获取股票数据
import pandas as pd    # 导入pandas用于数据处理
import datetime        # 导入datetime处理日期
import time            # 导入time用于延时处理'''
日线指标参数包括:'date,code,open,high,low,close,preclose,volume,amount,adjustflag,turn,tradestatus,pctChg,peTTM,pbMRQ,psTTM,pcfNcfTTM,isST'
周、月线指标参数包括:'date,code,open,high,low,close,volume,amount,adjustflag,turn,pctChg'
分钟指标参数包括:'date,time,code,open,high,low,close,volume,amount,adjustflag'adjustflag:复权类型,默认不复权:3;1:后复权;2:前复权。已支持分钟线、日线、周线、月线前后复权。
'''# 是否删除停盘数据
DROP_SUSPENSION = Truedef update_stk_list(date = None):# 如果没有提供日期,使用最近的交易日if date is None:# 获取最近的交易日today = datetime.date.today()# 尝试使用今天作为日期date = today# 如果今天是周末,往前找最近的工作日if today.weekday() >= 5:  # 5是周六,6是周日date = today - datetime.timedelta(days=(today.weekday() - 4))print(f"尝试获取 {date} 的股票列表")# 获取指定日期的指数、股票数据max_retries = 3for attempt in range(max_retries):try:# 调用baostock接口获取股票列表stock_rs = bs.query_all_stock(date.strftime('%Y-%m-%d'))stock_df = stock_rs.get_data()# 检查API返回状态if stock_rs.error_code != '0':print(f"API调用错误: {stock_rs.error_code} - {stock_rs.error_msg}")if attempt < max_retries - 1:print(f"尝试重试 ({attempt+1}/{max_retries})...")time.sleep(2)  # 等待2秒后重试continueelse:print("达到最大重试次数,退出")return []# 检查是否成功获取数据if stock_df.empty:print(f"未获取到 {date} 的股票列表数据")# 如果今天没数据,尝试昨天if date == today:print("尝试获取昨天的数据...")return update_stk_list(today - datetime.timedelta(days=1))else:print("请检查日期或网络连接")return []# 打印列名以确认实际列名print(f"获取到的股票列表列名: {list(stock_df.columns)}")# 保存完整股票列表stock_df.to_csv('./stk_data/all_list.csv', encoding = 'gbk', index = False)# 筛选股票代码范围,使用实际列名try:# 尝试使用stock_df['code']而不是stock_df.codestock_df.drop(stock_df[stock_df['code'] < 'sh.600000'].index, inplace = True)stock_df.drop(stock_df[stock_df['code'] > 'sz.399000'].index, inplace = True)stock_df = stock_df[['code']]  # 确保只保留code列stock_df.to_csv('./stk_data/stk_list.csv', encoding = 'gbk', index = False)print(f"成功获取 {len(stock_df)} 支股票")return stock_df['code'].tolist()except KeyError as e:print(f"列名错误: {e}")print("请检查baostock返回的数据结构和列名")return []break  # 如果成功,跳出重试循环except Exception as e:print(f"获取股票列表时发生异常: {e}")if attempt < max_retries - 1:print(f"尝试重试 ({attempt+1}/{max_retries})...")time.sleep(2)  # 等待2秒后重试else:print("达到最大重试次数,退出")return []return []def load_stk_list():try:# 从CSV文件加载股票列表df = pd.read_csv('./stk_data/stk_list.csv')return df['code'].tolist()except FileNotFoundError:print("股票列表文件不存在,请先运行update_stk_list函数")return []def convert_time(t):# 将时间戳转换为可读格式H = t[8:10]M = t[10:12]S = t[12:14]return H + ':' + M + ':' + Sdef download_data(stk_list = [], fromdate = '1990-12-19', todate = datetime.date.today(), datas = 'date,open,high,low,close,volume,amount,turn,pctChg', frequency = 'd', adjustflag = '2'):# 确保stk_list不为空if not stk_list:print("股票列表为空,无法下载数据")return# 创建目录(如果不存在)import osos.makedirs(f'./stk_data/{frequency}', exist_ok=True)# 统计成功和失败的股票数量success_count = 0fail_count = 0for code in stk_list:print(f"Downloading ({success_count+fail_count+1}/{len(stk_list)}): {code}")try:# 调用baostock接口获取K线数据k_rs = bs.query_history_k_data_plus(code, datas, start_date = fromdate, end_date = todate.strftime('%Y-%m-%d'),frequency = frequency, adjustflag = adjustflag)datapath = f'./stk_data/{frequency}/{code}.csv'out_df = k_rs.get_data()# 检查API返回状态if k_rs.error_code != '0':print(f"API调用错误: {k_rs.error_code} - {k_rs.error_msg}")fail_count += 1continue# 检查是否成功获取数据if out_df.empty:print(f"未获取到{code}的数据")fail_count += 1continue# 如果需要,删除停牌数据(成交量为0)if DROP_SUSPENSION and 'volume' in list(out_df):out_df.drop(out_df[out_df.volume == '0'].index, inplace = True)# 做time转换if frequency in ['5', '15', '30', '60'] and 'time' in list(out_df):out_df['time'] = out_df['time'].apply(convert_time)# 保存数据到CSV文件out_df.to_csv(datapath, encoding = 'gbk', index = False)success_count += 1except Exception as e:print(f"下载{code}数据时出错: {e}")fail_count += 1print(f"数据下载完成: 成功 {success_count}/{len(stk_list)}, 失败 {fail_count}/{len(stk_list)}")if __name__ == '__main__':# 创建数据目录(如果不存在)import osos.makedirs('./stk_data', exist_ok=True)os.makedirs('./stk_data/d', exist_ok=True)# os.makedirs('./stk_data/w', exist_ok=True)# os.makedirs('./stk_data/m', exist_ok=True)# os.makedirs('./stk_data/5', exist_ok=True)# os.makedirs('./stk_data/15', exist_ok=True)# os.makedirs('./stk_data/30', exist_ok=True)# os.makedirs('./stk_data/60', exist_ok=True)# 登录baostock接口lg = bs.login()if lg.error_code != '0':print(f"登录失败: {lg.error_code} - {lg.error_msg}")exit(1)print("登录成功")try:# 首次运行#stk_list = update_stk_list()# 非首次运行stk_list = load_stk_list()if stk_list:# 下载日线download_data(stk_list)# # 下载周线# download_data(stk_list, frequency = 'w')# # 下载月线# download_data(stk_list, frequency = 'm')# # 下载5分钟线# download_data(stk_list, fromdate = '2020-6-1', frequency = '5', datas = 'date,time,open,high,low,close,volume,amount,adjustflag')# # 下载15分钟线# download_data(stk_list, fromdate = '2020-6-1', frequency = '15', datas = 'date,time,open,high,low,close,volume,amount,adjustflag')# # 下载30分钟线# download_data(stk_list, fromdate = '2020-6-1', frequency = '30', datas = 'date,time,open,high,low,close,volume,amount,adjustflag')# # 下载60分钟线# download_data(stk_list, fromdate = '2020-6-1', frequency = '60', datas = 'date,time,open,high,low,close,volume,amount,adjustflag')else:print("没有获取到股票列表,无法继续下载数据")finally:# 登出baostock接口bs.logout()print("登出成功")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/88606.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/88606.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/88606.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C/C++】无锁队列实现与内存回收机制:Hazard Pointer 深度解析

无锁队列实现与内存回收机制&#xff1a;Hazard Pointer 深度解析 在并发系统中&#xff0c;为了提升性能和避免锁竞争&#xff0c;我们常常追求 lock-free 数据结构。但当你实现完一个无锁队列后&#xff0c;会发现一个严重问题&#xff1a; 内存什么时候释放&#xff1f;怎样…

Scrapy进阶封装(第三阶段:多管道封装,多文件存储)

1.yield返回数据的原理? 为什么要用yield返回数据给管道&#xff1f; 遍历这个函数的返回值的时候&#xff0c;挨个把数据读到内存&#xff0c;不会造成内存的瞬间占用过高&#xff0c;Python3中的range和python2中的xrange同理。scrapy是异步爬取&#xff0c;所以通过yield…

证照大师 MAX 4.0安装与基础功能体验(附流程演示)

软件介绍 证照大师 MAX 4.0是一款功能强大的证件照制作软件&#xff0c;专为满足用户不同场景下的证件照需求而设计。它整合了专业的照片处理技术和智能化的操作系统&#xff0c;提供了自动抠图、尺寸调整、美颜处理、批量处理以及格式转换等多种功能。该软件用户界面简洁明快…

RK3568-适配mipi屏幕触摸和显示

1.1 适配mipi屏幕触摸 gt9xx_lvds: gt9xx-lvds5d {compatible "goodix,gt9xx";reg <0x5d>;pinctrl-names "default";pinctrl-0 <&touch_gpio>;touch-gpio <&gpio1 RK_PA4 IRQ_TYPE_LEVEL_LOW>;reset-gpio <&gpio1…

ICME 2025音频编码器能力挑战赛Workshop即将举办!

IEEE International Conference on Multimedia and Expo 2025&#xff08;ICME 2025&#xff09; 将于 6月30日至7月4日在法国南特举行。作为全球多媒体领域的顶级会议之一&#xff0c;ICME 2025 汇聚全球顶尖学者与产业专家&#xff0c;聚焦人工智能驱动的多媒体技术&#xff…

物奇微WQ5007A上手指南

一、获取SDK 需要与物奇微电子股份有限公司签订NDA协议才会提供SDK。 二、搭建开发环境 SDK里包含了编译工具、开发文档、源码。在windows系统下搭建开发环境&#xff1a; 1、安装交叉编译工具 将\wuqi_sdk\tools\riscv64-unknown-elf-gcc-10.2.0-windows.zip文件解压到任…

[论文阅读] 人工智能 + 软件工程 | LLM在单元测试中的应用:系统性综述与未来展望

LLM在单元测试中的应用&#xff1a;系统性综述与未来展望 论文信息 arXiv:2506.15227 Large Language Models for Unit Testing: A Systematic Literature Review Quanjun Zhang, Chunrong Fang, Siqi Gu, Ye Shang, Zhenyu Chen, Liang Xiao Subjects: Software Engineering …

数据重叠对CLIP零样本能力影响CLIP论文图17笔记

这两张图表&#xff08;图17左、右图&#xff09;是CLIP论文中验证“数据重叠是否影响CLIP零样本能力”的关键证据&#xff0c;核心是通过**“数据重叠分析”排除CLIP“作弊”嫌疑**&#xff08;即CLIP的高零样本准确率是否因为“见过测试集图像”&#xff09;。下面用“先看懂…

996引擎-假人系统

996引擎-假人系统 lua 假人问题添加假人名字列表打开M2设置假人参考资料 lua 假人问题 添加假人名字列表 假人名字列表 Mir200\Envir\DummyNameList.txt 打开M2设置假人 【选项】>【假人设置】 参考资料 假人系统

Rk3568驱动开发_Key驱动_13

设备树配置 key{compatible "alientek,key";pinctrl-0 <&key_gpio>;pinctrl-names "alientek,key";key-gpio <&gpio3 RK_PC5 GPIO_ACTIVE_HIGH>;status "okay";};配置信息方便后面直接引用&#xff1a; // Narnat 2025…

参展回顾 | AI应用创新场景:数据分析助手ChatBI、璞公英教学平台亮相2025四川国际职教大会暨产教融合博览会

2025年6月11日-13日&#xff0c;以“数字赋能产教融合&#xff0c;创新驱动技能未来”为主题的2025四川国际职业教育大会暨产教融合博览会在成都盛大开幕。璞华联合百度共同参展&#xff0c;并携旗下创新产品ChatBI数据分析助手、璞公英教学平台重磅亮相&#xff0c;凭借前沿的…

动态规划之01背包问题

动态规划算法 动态规划算法介绍 动态规划(Dynamic Programming)算法的核心思想是&#xff1a;将大问题划分为小问题进行解决&#xff0c;从而一步步获取最优解的处理算法动态规划算法与分治法类似&#xff0c;其基本思想也是将待解决问题分解成若干个子问题&#xff0c;先求解…

人大金仓新建用户,并且赋值查询权限

-- 1. 创建用户 visitor&#xff0c;并且设置密码 CREATE USER visitor WITH PASSWORD 1234qwer; -- 2. 授予该用户连接到数据库 "yonbip_db" 的权限 GRANT CONNECT ON DATABASE yonbip_db TO visitor; -- 3. 假设你要让 visitor 查询的模式是 public&#xff08;或…

学习笔记丨信号处理新趋势:量子计算将如何颠覆传统DSP?

在算力需求爆炸式增长的今天&#xff0c;传统数字信号处理&#xff08;DSP&#xff09;芯片正面临物理极限的严峻挑战。当经典计算机架构在摩尔定律的黄昏中挣扎时&#xff0c;量子计算正以颠覆性姿态崛起&#xff0c;准备重新定义信号处理的未来图景。 目录 传统DSP的瓶颈&am…

react day.js使用及经典场景

简介 Day.js 是一个轻量级的 JavaScript 日期库&#xff0c;它提供了简单易用的 API 来处理日期和时间。以及更加轻量级&#xff0c;并且具有更快的性能。 安装 npm install dayjs 使用 import dayjs from "dayjs";dayjs().format("YYYY-MM-DD HH:mm:ss&qu…

【机器学习深度学习】线性回归

目录 一、定义 二、举例说明 三、 数学形式 四、 训练过程&#xff08;机器怎么学会这条线&#xff1f;&#xff09; 五、在 PyTorch 中怎么实现线性回归&#xff1f; 六、如果你学懂了线性回归&#xff0c;你也能理解这些 七、综合应用&#xff1a;线性回归示例 7.1 执…

如何在 Manjaro Linux 上安装 .NET Core

.NET 是一个开源的开发框架平台,可在所有流行的操作系统(如 Windows、Linux 和 macOS)上免费使用和安装。它是跨平台的,是主要由微软员工在 .NET 基金会下开发的专有 .NET Framework 的继承者。.NET 是一个统一的平台,用于开发各种操作系统上的软件,如 Web、移动、桌面应…

Mysql解惑(一)

使用 or 可能不走索引 使用 union替代 使用in&#xff0c;可能不走索引 如果优化&#xff1a; 临时表强制索引exists代替

基于机器学习的侧信道分析(MLSCA)Python实现(带测试)

一、MLSCA原理介绍 基于机器学习的侧信道分析(MLSCA)是一种结合传统侧信道分析技术与现代机器学习算法的密码分析方法。该方法通过分析密码设备运行时的物理泄漏信息(如功耗、电磁辐射等)&#xff0c;利用机器学习模型建立泄漏数据与密钥信息之间的关联模型&#xff0c;从而实…

【LLM】位置编码

【LLM】位置编码 1 绝对位置嵌入为什么用 1000 0 2 t d 10000^{\frac{2t}{d}} 10000d2t​? 2 相对位置嵌入2.1 Shaw等人的方法&#xff08;2018&#xff09;2.2 Dai等人的方法&#xff08;2019&#xff09;2.3 Raffel 等人的方法&#xff08;2020&#xff09;2.4 He 等人的方法…