目录

  • 背景
  • 批量下载股市交易明细
    • 流程拆解
  • 代码实现
    • 日期循环
      • 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()自定义函数

输入参有两个:

  1. input_time:输入数据类型为: datetime.datetime
  2. offset: 输入为时间偏移量可正、可负,正为在原时间上加,负为在原时间上减
  3. 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:批量下载股市日交易明细相关推荐

  1. C#编程学习40:批量下载HTML页面到本地

    目录 1 核心代码: 1.1 获取html页面到本地 1.2 批量处理按钮 2 程序界面: 在网上看到一本书,Data Structures and Algorithms来回翻网页比较麻烦,就用C#做 ...

  2. 爬虫学习-第一弹-批量下载二次元好图

    图片网址:/ | konachan.net - Konachan.com Anime Wallpapers import requests import re import osheaders = { ...

  3. CAD插件学习系列教程(十) 高程点注记压盖地物批量处理

    大家好,我是王石头,这是CAD插件学习系列教程的第十篇干货文章,这次推荐一款高程点注记压盖地物批量处理插件. 目前使用的数字化成图软件在展绘高程点时,高程注记点存在较多压盖图上已有实体,或者高程注记相 ...

  4. 2021-07-07 - 使用脚本批量下载网页视频[如哔哩哔哩] - 学习/实践

    1.应用场景 主要用于使用脚本批量下载web视频,音频,图片资源,进行资源的收集下载,或者避免资源的丢失,使用命令脚本则有利于节省时间,提高效率. 比如资源可能后续不存在,或者,想二次整理资源,更好地 ...

  5. CS231n公开课系列1_视频+课件+作业下载+GitHub批量下载工具

    主要内容: PPT download notes download assignment download GitHub批量下载工具 CS231n是斯坦福大学教授针对使用深度学习处理图像(计算机视觉处 ...

  6. python3爬虫系列16之多线程爬取汽车之家批量下载图片

    python3爬虫系列16之多线程爬取汽车之家批量下载图片 1.前言 上一篇呢,python3爬虫系列14之爬虫增速多线程,线程池,队列的用法(通俗易懂),主要介绍了线程,多线程,和两个线程池的使用. ...

  7. 2023年批量下载和改名音频专辑(系列3之selenium-wire方式)

    XIMA多页动态列表中的音频下载seleniumwire 步骤说明: 步骤一:获取xima cookie 步骤二:遍历目录,逐一播放后抓取响应信息 除了系列1之单页,系列2之多页,VIP音频还有动态加 ...

  8. 新版TCGA数据库学习:批量下载新版TCGA数据

    众所周知,TCGA数据库改版了!!改的比之前更好用了! 对于常规转录组数据,主要是以下几点改变: 下载一次即可获得counts.TPM.FPKM三种类型的表达矩阵,再也不用单独下载了 自带gene s ...

  9. libev学习系列之二:libev下载

    libev学习系列之二:libev下载 版本说明 版本 作者 日期 备注 0.1 ZY 2019.5.31 初稿 目录 文章目录 libev学习系列之二:libev下载 版本说明 目录 官网 GitH ...

最新文章

  1. AI公开课:18.05.05 施尧耘(阿里云量子技术CS)—清华AI第四讲之《人工智能与量子计算》Quantum课堂笔记——带你了解量子计算
  2. ABAP RANGES 在 RFC 的应用示例
  3. Boost:验证atomic <T>具有来自T的隐式转换构造函数
  4. 代码审计——命令执行
  5. 六大加密工具让数据传送安然无恙
  6. java 树最大距离_寻找二叉树最远的叶子结点(实例讲解)
  7. Linux:CPU使用率100%排查方法
  8. Java商店管理系统
  9. Windows中内存泄漏检测工具vld简介及使用
  10. Excel VBA员工培训从哪里开始
  11. 斐波那契数列(C语言实现)
  12. windows服务器防勒索病毒
  13. amcharts4饼状图显示百分比的小数点设置
  14. 计算机03年word做母亲节贺卡,《WORD贺卡的制作—母亲节快乐》教学反思
  15. C# webbrowser爬虫中经常碰到的脚本错误弹出窗口的问题解决
  16. html战旗游戏,战棋页游-策略类战棋网页游戏推荐
  17. 如何从GitHub上下载一个项目中的单个文件或者子文件夹
  18. Permission denied: user=dr.who, access=READ_EXECUTE, inode=/tmp:root:supergroup:drwx------
  19. 基于webgis的物资管理系统
  20. Android AVB的校验宏观的两个阶段

热门文章

  1. CAD制图初学入门绘图
  2. 成为顶级python工程师_Python绝技:运用Python成为顶级数据工程师
  3. 通过Postman模拟跨域请求
  4. 如何自己制作头像?分享两种简单易制作头像的方法
  5. Maven安装目录的详解
  6. 如何开启邮箱的SMTP服务?
  7. 前端开发实现点击出现不断向上可变色心形的效果
  8. java递归删除空文件夹_Java 删除空文件夹和文件夹及其下面的文件
  9. 如何理解Unity中Time.deltatime
  10. CAD转DXF,手机也能快速转换