小散量化炒股记|只花几秒钟!多任务爬虫获取A股每日实时行情数据
前言
相信大家都听说了量化交易这个东西了吧!量化交易是一种新兴的系统化金融投资方法。
那么,什么才是普通股民所适合的量化交易打开方式呢?
本文就用一个接地气的股票数据获取场景——多任务爬虫获取A股每日实时行情数据来和大家分享一下,普通股民如何去使用量化交易!
多进程和多线程
我们在获取股票行情数据的时候,一般都用for...in循环的方式,但是面对几千只股票过去几年甚至十几年的行情数据时,下载过程势必会出现耗时过长的问题。
我在书中介绍了多进程和多线程的提速方案。当涉及复杂的计算、繁多的 I/O 操作时,可以考虑使用多任务并行方式充分利用CPU多核性能来提高程序的执行效率。
在Python中由于GIL机制的的存在,多进行和多线程在计算密集型和I/O密集型的任务场景中执行效率会有所不同,多线程更适合 I/O 密集型应用,多进程对于 CPU 密集型的应用表现更好。
书中我们是以调用API接口方式获取股票数据的,以此为例分别介绍了for循环方式、多线程方式和多进程方式。
遍历获取股票池中前500只股票的1年的数据,测试的结果是:
for循环:55秒
8个线程:7.5秒
8个进程:7.8秒
适合爬虫的多任务
对于爬虫来说,它适合多线程还是多进程呢?
爬虫是基于网络请求模块urllib实现的。urllib3扮演了 HTTP 客户端的角色,即向网络服务器发送一个 HTTP 请求,然后等待网络服务器的响应,这类任务属于 I/O 密集型的任务。不同于计算密集型任务那样会在整个时间片内始终消耗 CPU 的资源,I/O 密集型的任务大部分时间都在等待 I/O 操作的完成。
接下来我们就以爬虫方式获取东方财富网股票每日实时行情数据作为场景,扩展介绍下多线程的提速方案。
关于爬虫的实现过程可参考知识星球以下主题:
我们看到网页上显示总共有206页,那么我们可以将该任务分配给多个线程来完成,而不只是让一个线程去逐一读取。
在 Python3 中内置了线程池模块 ThreadPoolExecutor,通过 ThreadPoolExecutor模块来实现多线程的处理。
对于爬虫任务来说,每一页仅仅是URL地址不同。因此按模块的使用要求,将爬虫任务crawer_daily()函数拆分为执行函数map_fun( )和可迭代参数 itr_arg 两部分。
关键代码如下所示:
with ThreadPoolExecutor(max_workers=8) as executor:# map_fun 传入的要执行的map函数# itr_argn 可迭代的参数# result 返回的结果是一个生成器results = executor.map(crawer_daily, itr_arg)
每一页只有20只股票的数据,因此我们需要把数据合并成一份DataFrame,最后保存为本地的csv文件。
关键代码如下所示:
for ret in results:df_daily_stock = df_daily_stock.append(ret, ignore_index=True)
df_daily_stock.to_csv("crawer_daily_stock/{}.csv".format(df_daily_stock["时间"].values[0]), columns=df_daily_stock.columns, index=True, encoding='GBK')
打开csv文件如下所示:
需要注意到的是我增加了“时间”列。因为我是在收盘爬取的,时间显示2020-08-21 15:00:00,如果是在盘中获取实时数据的话,对应的时间会体现数据更新的时间戳。
还有一个重要点是文件名,这里我取的名字是“2020-08-21 15/00/00.csv”,如果是实时数据的话要体现出时/分/秒的信息。
关于测试的结果,我用了8个线程,执行的时间在6秒多。也就是说,如果我们只增量更新日线数据,那么每天只需要花6秒时间就能更新完当日A股市场全部股票数据。
由于测试环境千差万别,此处测试结果仅供大家参考。 大家也可以亲手对比下多线程和多进程的效率。
总结
通过这个简单而又实用的股票量化场景,希望能够给广大朋友对于量化交易有一个直观的感受。
然后,我们应该升级自己的炒股方式了,把自己以前炒股的那套方法,抽象成策略模型,用量化的方法去全市场回测评估,然后让程序帮助我们监测行情的走势。
这个才是普通股民所适合的量化交易打开方式!
说明
例程中代码涉及到《Python股票量化交易从入门到实践》书中知识点。比如:
第2章 量化语言Python的关键应用
2.9 多进程和多线程的提速方案
2.9.1 多进程和多线程
2.9.2 Python 的 GIL 原理
2.9.3 多任务的解决方案
第 7 章 股票行情数据的获取和管理
7.5 用多任务为股票数据的获取提速
例程中的完整代码上传至知识星球(知识星球的目录可点击【阅读原文】查看)。
往期回顾
小散量化炒股记|只用一分钟选出底部放量跳空上扬的强势股
小散量化炒股记|不用追高!Python告诉你强势股回调介入的位置
小散量化炒股记|一文揭秘主力、散户资金流入流出的来龙去脉
小散量化炒股记|搭建本地化的股票量化数据库这么几步就够了
小散量化炒股记|Python数据透视表和热力图跟踪行业板块热点切换
小散量化炒股记|趋势指标金叉死叉策略在震荡行情中怎么处理
更多量化交易内容扫码加入星球!
—————————————————
元宵大师的量化交易书籍开售!!京东、当当、天猫有售!!加我微信了解详情
微信关注:‘元宵大师带你用Python量化交易’
小散量化炒股记|只花几秒钟!多任务爬虫获取A股每日实时行情数据相关推荐
- 小散量化炒股记|股价如波浪起伏,教你用量化识别波段的极值点
前言 相信大家都听说了量化交易这个东西了吧!量化交易是一种新兴的系统化金融投资方法. 那么,什么才是普通股民所适合的量化交易打开方式呢? 本文就用一个接地气的股票分析场景 -- 用量化方法识别股价波段 ...
- 小散量化炒股记|说某个指标能赚钱?不盲从,先量化回测一番!
前言 相信大家都听说了量化交易这个东西了吧!量化交易是一种新兴的系统化金融投资方法. 那么,什么才是普通股民所适合的量化交易打开方式呢? 本文就用一个接地气的股票分析场景 -- 用量化回测来识别技术指 ...
- 小散量化炒股记|搭建本地化的股票量化数据库这么几步就够了
前言 相信大家都听说了量化交易这个东西了吧! 量化交易是一种新兴的系统化金融投资方法,它综合多个学科的知识,用先进的数学模型代替人的主观思维制定交易策略,利用计算机强大的运算力从庞大的股票.债券. 期 ...
- 小散量化炒股记|趋势指标金叉死叉策略在震荡行情中怎么处理
前言 相信大家都听说了量化交易这个东西了吧!量化交易是一种新兴的系统化金融投资方法. 那么,什么才是普通股民所适合的量化交易打开方式呢? 本文就用一个接地气的股票分析场景--典型的趋势指标金叉死叉策略 ...
- 小散量化炒股记|基于多任务爬虫技术, 实现A股实时行情Level1采样
前言 股票行情数据对量化交易者来说非常重要,无论是短线交易者还是中长线交易着. 对于短线交易者来说,获取实时行情数据的方案涉及到盘中分析和买卖点监测的时效性. 对于中长线交易中来说,盘后更新全市场数据 ...
- python 主力资金_小散量化炒股记|一文揭秘主力、散户资金流入流出的来龙去脉...
前言 我们经常听到这样的股市要闻:"主力资金全天净流出140.95亿元--" 目前很多行情软件也提供了主力资金流入流出.散户资金流入流出等数据. 很多交易者会依据这些"主 ...
- 小散量化炒股记|MySQL搭建股票量化数据库完整模版来袭
前言 数据是量化交易的源头,如何高效地管理大量数据是量化交易分析中非常关键的环节.数据库就是最佳的解决方案. 通过API接口获取到股票行情数据之后,我们可以存入到数据库之中,这样下次调用的时候只需要从 ...
- 小散量化炒股记|如何用MySQL搭建本地股票量化数据库
前言 数据是量化交易的源头,如何高效地管理大量数据是量化交易分析中非常关键的环节.数据库就是最佳的解决方案. 通过API接口获取到股票行情数据之后,我们可以存入到数据库之中,这样下次调用的时候只需要从 ...
- 小散量化炒股记|要克服人性弱点?激活股票全自动化交易!
前言 股票的自动化交易接口在2015年之后就被管制了,于是对于普通股民来说只能通过手动下单方式完成量化交易最后一个环节. 当然,对于股票交易来说,大部分人更偏向于中低频的交易范畴,毕竟高频交易在政策限 ...
- 小散量化炒股记|如何研判主力的踪迹!计算筹码分布图有妙用!
前言 "筹码分布"自从问世以来一直受到广大投资者的追捧,它是把股票按不同价位上的流通数量做了排布,从而反映了这个股票对于全体投资者来说持仓成本的分布情况. 我们知道主力的常用手段是 ...
最新文章
- java开发工具对比eclipse·myeclipse·idea
- php表格 单元格,如何更改PHPWord表格单元格高度?
- Datawhale编程——动态规划DP
- 【cisco下针对冗余链路故障备份的处理措施】
- 关于Python中if、for、with、list、dict的练习题
- python实现将文件内容按照某一列内容的大小值重新排序_Python数据分析入门教程(四):数值操作...
- mysql 3_mysql3
- 什么是社会性网络?什么是六度分隔理论?
- mysql galera status_MySQL galera cluster集群的监控
- 1.SRE:Google运维解密 --- 介绍
- grib1文件解析 python_python安装读取grib库总结(推荐)
- 华为手机怎么查看ip 网关
- usb计算机连接 不再弹出,电脑usb无法安全弹出问题解决办法
- 洛谷 P5560 【[Celeste-B]Golden Feather】
- H3C网络设备模拟器配置VLAN-Hybrid
- GoLang之浅析unsafe.Pointer与uintptr
- 电压放大倍数公式运放_运算放大器的放大倍数如何计算
- 山东淀粉行业面临洗牌,深加工技术资金为王
- org.apache.http.ConnectionClosedException: Premature end of Content-Length delimited message body
- 一文读懂PRBS定义、生成办法、作用
热门文章
- 盖茨、马斯克都遵循的学习法则:知识不由学科划分
- java地铁最短距离_北京地铁最短路径(Java+Dijkstra算法)
- 国内外物联网平台大全
- c语言怎么return ok,C语言中的 return与exit
- 日记 [2006年06月06日] 庞加莱猜想
- 安装Mediapipe中遇到的问题ERROR: An error occurred during the fetch of repository ‘local_execution_config_pyt
- L1-017 到底有多二 (15 分) C语言
- 华为云git clone代码
- 喜迎进博会 欢聚环球港 共享消费城——2021环球商业年会暨城市综合体论坛圆满举行
- Unity网络——断线重连