Baostock学习系列2:批量下载股市日交易明细
目录
- 背景
- 批量下载股市交易明细
- 流程拆解
- 代码实现
- 日期循环
- time_offset_cal()自定义函数
- 判断输入日期是否交易日
- check_is_trading_day()
- 下载对应日期的交易明细
- downloadDayData()
- 通过逻辑判断是否交易日和是否已经下载过
- 最终代码呈现
背景
准备进行股票的量化分析,苦于没有日交易数据,找了好多方法,最终才想到用baostock下载数据。
原因主要有如下三点:
- 1 通过平安银行或者通达信软件导出的txt需要解析处理起来非常麻烦(主要还是本人下载的明细还会出现要重复行数据);
- 2 Tushare现在搞的是社区,需要花积分贡献积分,本人没钱,想先”白嫖“一段时间锻炼一下自己,再考虑加入;
- 3 Baostock 的包简单实用,更为关键的是体系已经搭建完了,直接用就行。
批量下载股市交易明细
流程拆解
思路:不断增加天数,调用baostock接口按天下载股市交易明细
- 天数变量通过while 循环实现,每增加一天执行一次查询
- 因为有些日期不是交易在调用baostock会出现报错,所以还要添加一个判断是否交易日,这里参考我的另外一篇文章《Baostock学习系列1:编辑函数验证某一天是否交易日check_is_trading_day()》
- 将交易日查询到交易明细通过pandas导出为csv文件本地保存
代码实现
日期循环
config_start_day = '2018-09-27' # 'YYYY-MM-DD'
config_end_day = '2022-04-04' # 'YYYY-MM-DD'start_day = datetime.datetime.strptime(config_start_day, "%Y-%m-%d")
end_day = datetime.datetime.strptime(config_end_day, "%Y-%m-%d")# print(check_is_trading_day(start_day.strftime('%Y-%m-%d')))while (int( time.mktime(start_day.timetuple())) <= int( time.mktime(end_day.timetuple()))) :start_day = time_offset_cal(start_day, 1, 'day') # 这里利用自定义函数实现日期加1天print(datetime.datetime.strftime(start_day , "%Y-%m-%d"))
time_offset_cal()自定义函数
输入参有两个:
- input_time:输入数据类型为: datetime.datetime
- offset: 输入为时间偏移量可正、可负,正为在原时间上加,负为在原时间上减
- time_type: 输入类型为时间偏移量的单位(year、week、 month、 day、 hour、minute、 second、microsecond、 millisecond)
def time_offset_cal(input_time, offset, time_type): # input_time 类型为: datetime.datetime offset 为 int 整数if time_type == 'year':re_dt = input_time + relativedelta(years=offset)return re_dtelif time_type == 'week':re_dt = input_time + datetime.timedelta(weeks=offset)return re_dtelif time_type == 'month':re_dt = input_time + relativedelta(months=offset)return re_dtelif time_type == 'day':re_dt = input_time + datetime.timedelta(days=offset)return re_dtelif time_type == 'hour':re_dt = input_time + datetime.timedelta(hours=offset)return re_dtelif time_type == 'minute':re_dt = input_time + datetime.timedelta(minutes=offset)return re_dtelif time_type == 'second':re_dt = input_time + datetime.timedelta(seconds=offset)return re_dtelif time_type == 'microsecond':re_dt = input_time + datetime.timedelta(microseconds=offset)return re_dtelif time_type == 'millisecond':re_dt = input_time + datetime.timedelta(milliseconds=offset)return re_dtelse:print("error")
判断输入日期是否交易日
使用函数 check_is_trading_day()
check_is_trading_day()
def check_is_trading_day(input_date): # 输入日期格式 yyyy-mm-ddlg = bs.login() # 登陆系统if lg.error_code != '0' :print('login respond error_code:'+lg.error_code) # 显示登陆返回信息print('login respond error_msg:'+lg.error_msg) # 显示登陆返回信息else:rs = bs.query_trade_dates(start_date=input_date, end_date=input_date) # 调用 baostock 的 query_trade_dates 函数if rs.error_code != '0':print('query_trade_dates respond error_code:'+rs.error_code) # 返回错误编码print('query_trade_dates respond error_msg:'+rs.error_msg) # 返回错误信息else:try:is_trading_day = int(rs.get_row_data()[1]) # 返回结果为str 此处进行强制转换为整型 1 和 0 用于表示是否交易日except:is_trading_day = 0bs.login()else:bs.logout()return is_trading_day
下载对应日期的交易明细
输入参数:
date 格式: yyyy-mm-dd
path 格式: 下载文件路径
downloadDayData()
def downloadDayData(date, path):starttime = datetime.datetime.now() #设置 开始时间bs.login()# 获取指定日期的指数、股票数据stock_rs = bs.query_all_stock(date)stock_df = stock_rs.get_data()data_df = pd.DataFrame()for code in stock_df["code"]:# print("Downloading :" + code)k_rs = bs.query_history_k_data_plus(code, "date,code,open,high,low,close,preclose,volume,amount,adjustflag,turn,tradestatus,pctChg,peTTM,psTTM,pcfNcfTTM,pbMRQ,isST", date, date)data_df = pd.concat([data_df,k_rs.get_data()])# data_df = data_df.append(k_rs.get_data()) # append 在最新的python 3.9 不适用了bs.logout()data_df.to_csv(path, encoding="utf-8", index=False)endtime = datetime.datetime.now() #设置 结束时间print("运行时间:" + str((endtime - starttime).seconds) + "秒===========>>>" + "已完成"+ date+ "数据下载")
通过逻辑判断是否交易日和是否已经下载过
使用逻辑”与“进行判断,如果”交易日“存在且”文件未下载“执行交易明细下载
if check_is_trading_day(start_day.strftime('%Y-%m-%d')) == 1 & (not os.path.exists(os.path.join("./download", start_day.strftime('%Y-%m-%d')+".csv"))):
最终代码呈现
上述的代码源码可以直接下载在本地执行,windows及linux 均可直接执行。
(下载效率不高,毕竟人家做的是开源,且嫖且珍惜。)
源码地址
Baostock学习系列2:批量下载股市日交易明细相关推荐
- C#编程学习40:批量下载HTML页面到本地
目录 1 核心代码: 1.1 获取html页面到本地 1.2 批量处理按钮 2 程序界面: 在网上看到一本书,Data Structures and Algorithms来回翻网页比较麻烦,就用C#做 ...
- 爬虫学习-第一弹-批量下载二次元好图
图片网址:/ | konachan.net - Konachan.com Anime Wallpapers import requests import re import osheaders = { ...
- CAD插件学习系列教程(十) 高程点注记压盖地物批量处理
大家好,我是王石头,这是CAD插件学习系列教程的第十篇干货文章,这次推荐一款高程点注记压盖地物批量处理插件. 目前使用的数字化成图软件在展绘高程点时,高程注记点存在较多压盖图上已有实体,或者高程注记相 ...
- 2021-07-07 - 使用脚本批量下载网页视频[如哔哩哔哩] - 学习/实践
1.应用场景 主要用于使用脚本批量下载web视频,音频,图片资源,进行资源的收集下载,或者避免资源的丢失,使用命令脚本则有利于节省时间,提高效率. 比如资源可能后续不存在,或者,想二次整理资源,更好地 ...
- CS231n公开课系列1_视频+课件+作业下载+GitHub批量下载工具
主要内容: PPT download notes download assignment download GitHub批量下载工具 CS231n是斯坦福大学教授针对使用深度学习处理图像(计算机视觉处 ...
- python3爬虫系列16之多线程爬取汽车之家批量下载图片
python3爬虫系列16之多线程爬取汽车之家批量下载图片 1.前言 上一篇呢,python3爬虫系列14之爬虫增速多线程,线程池,队列的用法(通俗易懂),主要介绍了线程,多线程,和两个线程池的使用. ...
- 2023年批量下载和改名音频专辑(系列3之selenium-wire方式)
XIMA多页动态列表中的音频下载seleniumwire 步骤说明: 步骤一:获取xima cookie 步骤二:遍历目录,逐一播放后抓取响应信息 除了系列1之单页,系列2之多页,VIP音频还有动态加 ...
- 新版TCGA数据库学习:批量下载新版TCGA数据
众所周知,TCGA数据库改版了!!改的比之前更好用了! 对于常规转录组数据,主要是以下几点改变: 下载一次即可获得counts.TPM.FPKM三种类型的表达矩阵,再也不用单独下载了 自带gene s ...
- libev学习系列之二:libev下载
libev学习系列之二:libev下载 版本说明 版本 作者 日期 备注 0.1 ZY 2019.5.31 初稿 目录 文章目录 libev学习系列之二:libev下载 版本说明 目录 官网 GitH ...
最新文章
- AI公开课:18.05.05 施尧耘(阿里云量子技术CS)—清华AI第四讲之《人工智能与量子计算》Quantum课堂笔记——带你了解量子计算
- ABAP RANGES 在 RFC 的应用示例
- Boost:验证atomic <T>具有来自T的隐式转换构造函数
- 代码审计——命令执行
- 六大加密工具让数据传送安然无恙
- java 树最大距离_寻找二叉树最远的叶子结点(实例讲解)
- Linux:CPU使用率100%排查方法
- Java商店管理系统
- Windows中内存泄漏检测工具vld简介及使用
- Excel VBA员工培训从哪里开始
- 斐波那契数列(C语言实现)
- windows服务器防勒索病毒
- amcharts4饼状图显示百分比的小数点设置
- 计算机03年word做母亲节贺卡,《WORD贺卡的制作—母亲节快乐》教学反思
- C# webbrowser爬虫中经常碰到的脚本错误弹出窗口的问题解决
- html战旗游戏,战棋页游-策略类战棋网页游戏推荐
- 如何从GitHub上下载一个项目中的单个文件或者子文件夹
- Permission denied: user=dr.who, access=READ_EXECUTE, inode=/tmp:root:supergroup:drwx------
- 基于webgis的物资管理系统
- Android AVB的校验宏观的两个阶段