多线程增量下载K线数据

news2025/2/22 22:23:07

准备一份股票列表的CSV文件,文件格式如下

codenameclosecmvdate_ipo
300434金石亚药12.89427982959020150424
300380安硕信息19.31241993416320140128
688123聚辰股份132.821114087266620191223
300586美联新材20.34790882138120170104
300534陇神戎发12.96389465063120160913
300813泰林生物60.55160529663520200114
688259创耀科技88.76157821235820220112
301211亨迪药业30.43177175385520211222
688099晶晨股份75.53121409395420190808

范例CSV下载

程序所在目录下,手工建好3个目录
data/day
data/week
data/month

导入必要的包

import akshare as ak
import numpy as np
import pandas as pd
import warnings
import time
import datetime as dt

warnings.filterwarnings("ignore")

读取股票列表

#需要下载的股票列表
#将 yyyymmdd形式的日期字符串,转换为yyyy-mm-dd形式
def f_str2dtstr(x):
    try:
        return dt.datetime.strptime(x,'%Y%m%d').strftime('%Y-%m-%d')            
    except:
        return np.NaN

df = pd.read_csv('wz.csv',dtype={'code':str,'name':str,'close':float,'cmv':float,'date_ipo':str})
#print(df)
df['date_ipo'] = df['date_ipo'].apply(lambda x: f_str2dtstr(x))
df

 设置线程工作相关参数

import threading
job_per_thread = 15 
remainder = len(df) % job_per_thread 
count_thread = 0
if remainder  == 0: 
    count_thread = int(len(df)/job_per_thread)
else: 
    count_thread = int((len(df)-job_per_thread)/job_per_thread) +1
print(job_per_thread) # 每个线程处理多少个股票数据
print(count_thread)   # 余数,最后一个线程处理多少个股票数据
print(remainder)      # 线程数量

线程处理函数

  • 参数为线程编号(第X号线程,根据循环的变量来的)
  • 网络读取数据,纠错5次
  • 日线,月线,周线全部下载
  • 增量下载、任意时间下载(对比本地数据,删除本地第一条数据,以新下载的为准)
def proc_get(m):
    if remainder  == 0:
        count_job = job_per_thread
    else: 
        if m == (count_thread-1):
            count_job = remainder
        else:
            count_job = job_per_thread
    
    for i in range(0,count_job):
        code   = df.iloc[m*job_per_thread+i,0]
        date_s = '1970-01-01'
        d = pd.DataFrame(data=None,columns=['date','open','high','low','close','volume','turnover'])
        p_s = ['weekly','daily', 'monthly']
        for k in range(0,len(p_s)):
            item_p = p_s[k]
            path_file = "./data/"
            if item_p == 'daily':
                 path_file = path_file+"day/"
            elif item_p == 'weekly':
                path_file = path_file+"week/"
            elif item_p == 'monthly':
                path_file = path_file+"month/"
            else:
                break            

            path_file = path_file+"%s.csv"%(code)

            try:
                d = pd.read_csv("./data/day/%s.csv"%(code),dtype={'code':str,'code':str,'date':str})
            except:
                pass

            if len(d) > 0:
                #print(d.iloc[-1,0])
                date_s = d.iloc[-1,0]
            date_e = dt.datetime.now().strftime('%Y%m%d')
            if  dt.datetime.strptime(date_s,'%Y-%m-%d') < dt.datetime.strptime(date_e,'%Y%m%d') :
                 for j in range(0,5):
                    try:
                        a = ak.stock_zh_a_hist(symbol=code,period=item_p,start_date=date_s,end_date=date_e,adjust="qfq")
                        a = a[['日期','开盘','最高','最低','收盘','成交量','换手率']]
                        a.columns=['date','open','high','low','close','volume','turnover']
                        #print(a)
                        if len(d) > 0:
                            d = pd.concat([d.iloc[0:-2,:],a],axis=0,ignore_index=True)
                        else:
                            d = a
                        break
                    except:
                        print(code)
                        time.sleep(3)
            if len(d) > 0:
                d.to_csv(path_file,index=False,date_format="%Y-%m-%d") 

开启多线程 

threads = []
for m in range(0,count_thread):
    t = threading.Thread(target=proc_get,args=(m,)) #注意即使一个参数,参数也要有,结尾
    #print(m)
    #print(t)
    threads.append(t)
    t.start()
for t in threads:
    t.join()

说明: 

网络下载数据失败的代码会被打印出来
一般情况下超过5次的就是真的没数据 
没数据的一般是一些生成了股票代码但没交易的新股
得空就更新一下你的K线数据呗,增量挺快的
数据全部取得是前复权的
未复权,包含前收盘价的数据可以换一个源取,有兴趣的可以做一下。
任何疑问 turui@163.net
当前接口获取的数据,起码比巨宽的强
以SH000300数据为例,巨宽的数据从2005.04.08才有
看到这种形状,赶紧入吧,涨停板等着你
数据

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Arduino与Proteus仿真实例-密码输入、验证与更新仿真

密码输入、验证与更新仿真 本次实例将通过4X4矩阵键盘、LCD1602、EEPROM实现一个密码输入匹配、储存、更新。 1、仿真电路原理图 在仿真电路原理图中,4X4矩阵键盘通过PCF8574 IO扩展器驱动,请参考前面文章: Arduino与Proteus仿真实例-PCF8574驱动4x4矩阵键盘仿真Arduino与…

大数据:Flume安装部署和配置

文章目录Flume 简介一&#xff0c;Flume下载和安装1&#xff09;登录[Flume官网](https://flume.apache.org/)&#xff0c;下载 apache-flume-1.9.0-bin.tar.gz2&#xff09;解压文件到 /opt 目录下3&#xff09;改名为 flume二&#xff0c;Flume配置1&#xff09;修改 /conf/ …

.Net开发——EFCore

1 EFCore是一个ORM框架 EFCore(EntityFramworkCore)是对底层ADO.NET重新封装的一个数据操作框架&#xff0c;因此ADO.NET支持的多种数据库都可以被EFCore支持。 EF Core 可用作对象关系映射程序 (O/RM)&#xff0c;这可以实现以下两点&#xff1a; 使 .NET 开发人员能够使用…

Python医学数据分析入门,推荐你学习这本书

医学生学习Python的难点通常在于 没有系统的编程教育&#xff0c;很难短时间内使用编程语言描述问题及其解答过程相关教程、案例少&#xff0c;想要练习缺少素材 所以这里就给大家推荐一本比较新比较前沿的教医学生学习Python的书《Python医学数据分析入门》 这本书的切入点为…

代码随想录——分割回文串 II

题目 给你一个字符串 s&#xff0c;请你将 s 分割成一些子串&#xff0c;使每个子串都是回文。 返回符合要求的 最少分割次数 。 示例 1&#xff1a; 输入&#xff1a;s “aab” 输出&#xff1a;1 解释&#xff1a;只需一次分割就可将 s 分割成 [“aa”,“b”] 这样两个回文子…

Oracle技术分享 创建外键报错ORA-00906

问题描述&#xff1a;给表创建外键报错ORA-00906&#xff0c;具体过程如下&#xff1a; 数据库&#xff1a;oracle 11.2.0.464位 scottORCL2022-10-18 19:10:40> selectindex_name,table_name,tablespace_name,status,last_analyzed from user_indexes; INDEX_NAME TABLE…

事务【mysql】

1、事务的概念 事务指逻辑上的一组操作&#xff0c;组成这组操作的各个单元&#xff0c;要么全部成功&#xff0c;要么全部失败。 在不同的环境中&#xff0c;都可以有事务。对应在数据库中&#xff0c;就是数据库事务。 把多个操作打包成一个整体&#xff0c;要么全部都执行完…

【#HDC2022】HarmonyOS体验官活动正式开启,赶快投稿赢限量奖品吧!

1. 【活动简介】 HDC 2022 于11月4日线上线下正式开启。历时一年&#xff0c;在无数开发者的共同努力下&#xff0c;我们汇聚了HarmonyOS生态的新成果、新体验、新开放能力&#xff0c;邀你参与到HarmonyOS的每一步成长和构建中。 本次HarmonyOS体验官活动&#xff0c;将以文章…

MySQL自连接和内连接和外连接_左外连接+右外连接

自连接&#xff1a;将一张表看作两张表 练习&#xff1a;查询员工id&#xff0c;员工姓名及其管理者的id和姓名select emp.employee_id,emp.last_name,mgr.employee_id,mgr.last_name from employees emp,employees mgr where emp.manager_id mgr.employee_id;内连接 只是把左…

多肽Caerulein (desulfated)、pGlu-QDYTGWMDF-NH2、20994-83-6

Caerulein, desulfated 是脱硫后的Caerulein。Caerulein 是一种十肽&#xff0c;与胃泌素和胆囊收缩素 (CCK) 具有相同的五个羧基末端氨基酸。 Caerulein, desulfated is the desulfurated form of Caerulein. Caerulein is a decapeptide having the same five carboxyl-termi…

DevOps Master课程总结:知否知否,应是DevOps肥ITIL瘦

1.ITIL定义及挑战 ITIL即IT基础架构库(Information Technology Infrastructure Library, ITIL&#xff0c;信息技术基础架构库)由英国政府部门CCTA(Central Computing and Telecommunications Agency)在20世纪80年代末制订&#xff0c;现由英国商务部OGC(Office of Government…

Vue3 - computed 计算属性(详细教程)

简介 相信大家在 Vue2 中已经领略到了其功能&#xff0c;不再过多赘述了。 计算属性处理一些复杂的运算非常合适&#xff0c;对于任何包含响应式数据的复杂逻辑的表达式&#xff0c;都建议使用计算属性来完成&#xff0c;而不是臃肿的在模板中直接书写。 回忆 Vue2 先来看个 …

UE4插件-读取png图片

一、简介 在UE4中有多种类型的插件&#xff0c;适用于不同的场景。既可以放到引擎中还可以放到项目中&#xff0c;放到引擎中的插件可以被所有项目使用&#xff0c;放到项目中的插件只能被当前项目使用。插件的类型可以在【Edit】->【Plugins】->【New Plugin】中查看 …

06 在MSYS2中编译树莓派裸机程序,并在QEMU中运行

作者将狼才鲸创建日期2022-11-14 Gitee源码和工程地址&#xff1a;才鲸嵌入式 / 开源安防摄像机&#xff08;嵌入式软件&#xff09; CSDN文章地址&#xff1a;项目介绍&#xff1a;开源安防摄像机&#xff08;嵌入式软件&#xff09; 4&#xff09;完整的环境安装步骤 写在前…

软件产品测试的准入准出标准有哪些?

软件产品的测试并不是测试人员简单的执行测试过程便可以交付的&#xff0c;而是有着一定的标准&#xff0c;什么条件可以开始测试&#xff0c;什么时候结束测试等等也就是测试的准入准出标准。 一、软件测试的准入标准 1、开发人员编码结束并且已在开发环境中完成单元测试&a…

OpUtils局域网唤醒:远程引导计算机

局域网唤醒 &#xff08;LAN&#xff09;&#xff0c;通常称为 LAN 唤醒&#xff0c;是一种计算机网络标准&#xff0c;有助于远程启动有线和无线网络。也称为远程唤醒、LAN 唤醒、无线 LAN 唤醒或简称 WOL&#xff0c;LAN 唤醒技术可帮助网络管理员优化能源使用&#xff0c;并…

一文教你搞定Python如何自定义标准排序

文章目录1.字典自定义排序按照value排序按照key值排序先按照value降序&#xff0c;再按key升序2.多维列表自定义标准排序案例题目描述输入输出代码&#xff1a;1.字典自定义排序 按照value排序 sdict() s[a]45 s[b]44 s[c]78 s[d]34 asorted(s.items(),keylambda x:x[1],reve…

手摸手教你使用 Docker 快速搭建 Gitlab 服务

前言 Glitlab 比较占用内存&#xff0c;官方建议最低配置为 2核4G。我的服务器刚刚好是2核4G&#xff0c;但是还装了 Docker 跑一些其他服务&#xff0c;所以以防万一&#xff0c;还是选择在本地的虚拟机中进行安装。 如果你有一台配置较高的服务器那就更好了&#xff0c;一步…

nodejs+vue+elementui图书馆销售网上书城管理系统express228

目 录 前端技术&#xff1a;nodejsvueelementui 前端&#xff1a;HTML5,CSS3、JavaScript、VUE 摘 要 I ABSTRACT I 目 录 III 第1章 绪论 1 1.1开发背景 1 1.2开发意义 1 1.3研究内容 1 第2章 主要技术和工具介绍 3 下面我们讲解 1、 node_modules文…

【数据结构】队列详解 栈和队列OJ题 —— 用队列实现栈、用栈实现队列、设计循环队列

文章目录前言队列的概念队列的结构队列的实现结构设计接口总览初始化销毁入队列出队列取对头数据取队尾数据判空计算队列大小OJ题用队列实现栈用栈实现队列设计循环队列结语前言 今天的内容分为两大块&#xff1a;队列讲解 和 OJ题。队列讲解部分内容为&#xff1a;队列概念&a…