前言

股票行情数据对量化交易者来说非常重要,无论是短线交易者还是中长线交易着。

对于短线交易者来说,获取实时行情数据的方案涉及到盘中分析和买卖点监测的时效性。

对于中长线交易中来说,盘后更新全市场数据也要求下载尽可能快。如果用第三方Python数据库,比如tushare等,会受到服务器端的限制,全市场个股行情数据获取需要几十分钟。

本主题提及的A股实时行情数据获取方案,只需要三秒内就能获取全市场个股行情数据。

对于短线交易者来说每间隔3秒调取一次即可。对于中长线交易者来说,每天收盘后调取一次后存储到自己的数据库即可。

接下来就和大家详细介绍下这个方案!

实时行情数据特征

本主题提及的A股实时行情数据获取,是类似于Level1级别的更新,每间隔3秒以爬虫的方式从财经网站上实时采样获取到的。

如下图所示,数据类型有“最新价”、 “最高”(当前)、 “最低”(当前)、 “涨跌幅”(当前)、 “成交量(当天累加)”、 “成交额(当天累加)”、 “换手率”、 “市盈率”,然后我们增加一列“当前时间”,表示获取实时数据的时间。因为这些数据在财经网站上是实时更新的,所以有必要增加这一列。

我们获取数据的交易时段是9:29至11.31,12:59至15:01,每间隔3秒获取一次数据,并且以csv文件格式存储。

多线程爬虫技术

接下来我们重点介绍下多线程爬虫技术的实现。

我们看到网页上显示总共有232页,通常大家是用for...in循环的方式爬取的。

但是面对几千只股票的行情数据时,下载过程势必会出现耗时过长的情况,从而导致超过3秒间隔的采样精度。

我在书中《Python股票量化交易从入门到实践》介绍了多进程和多线程的提速方案。

当涉及复杂的计算、繁多的I/O 操作时,可以考虑使用多任务并行方式充分利用CPU多核性能来提高程序的执行效率。

在Python中由于GIL机制的的存在,多进行和多线程在计算密集型和I/O密集型的任务场景中执行效率会有所不同,多线程更适合 I/O 密集型应用,多进程对于 CPU 密集型的应用表现更好。

书中的例程,分别对比介绍了for循环方式、多线程方式和多进程方式。遍历获取股票池中前500只股票的1年的数据,测试的结果是:

  • for循环:55秒

  • 8个线程:7.5秒

  • 8个进程:7.8秒

可见,当我们获取A股几千只股票,过去几年甚至十几年数据的时候,如果以调用API接口方式,用for循环去获取股票数据,耗时非常严重。

那么,对于爬虫来说,它适合多线程还是多进程呢?

爬虫是基于网络请求模块urllib实现的。urllib3扮演了 HTTP 客户端的角色,即向网络服务器发送一个 HTTP 请求,然后等待网络服务器的响应,这类任务属于 I/O 密集型的任务。不同于计算密集型任务那样会在整个时间片内始终消耗 CPU 的资源,I/O 密集型的任务大部分时间都在等待 I/O 操作的完成。

接下来我们就以爬虫方式获取财经网站股票每日实时行情数据为场景,扩展介绍下多线程的提速方案。

关于爬虫的实现过程可参考知识星球以下主题:

那么我们可以将该任务分配给多个线程来完成,而不只是让一个线程去逐一读取。

在 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(Path(store_path+u"{}.csv".format(df_daily_stock["当前时间"].values[0])), columns=df_daily_stock.columns, index=True, encoding='GBK')

打开csv文件如下所示:

需要注意到的是增加了“当前时间”列,在盘中获取实时数据的话,对应的时间会体现数据更新的时间戳。

还有一个重要点是文件名,这里取的名字是“2021-08-27 15/00/00.csv”,如果是实时数据的话要体现出时/分/秒的信息。

关于测试的结果,我用了8个线程,执行的时间在0.5秒左右。也就是说,更新一次实时数据只需要0.5秒左右,是远小于3秒的采样周期的。

另外,如果我们只在收盘时增量更新日线数据,那么每天只需要花1秒时间就能更新完当日A股市场全部股票数据。

由于测试环境千差万别,此处测试结果仅供大家参考。大家也可以亲手对比下多线程和多进程的效率。

如何获取实时数据

我们会把源码上传到知识星球《玩转股票量化交易》,大家可以在本地获取数据,不过数据量有点大,一天的数据在3G左右,估计存一年的数据要留800G的硬盘空间。

我一般只会移动地留一个月左右的实时数据,再早期的会转换为分钟线存储,降低空间的占用。

同时,我们也在搭建的云服务器上保存了一周内的实时行情数据,如果大家平时只是需要数据做分析的话,可以在收盘后通过FTP方式获取。

打通量化系统数据源环节—股票数据远程下载服务来袭

如果大家需要在当天跟踪股价的变动,从而执行买卖操作的话,可以在自己的电脑上执行这个脚本,并添加自己的判断逻辑,当出现操作信号时候就通过邮箱、钉钉等即时工具发给你。

说明

1. 我们会把完整的源码上传到知识星球《玩转股票量化交易》中,帮助小伙伴们更好地掌握这个方法。

2. 想要加入知识星球《玩转股票量化交易》的小伙伴记得先微信call我获取福利!

元宵大师的量化交易书籍开售!!
京东、当当、天猫有售!!

小散量化炒股记|基于多任务爬虫技术, 实现A股实时行情Level1采样相关推荐

  1. 小散量化炒股记|股价如波浪起伏,教你用量化识别波段的极值点

    前言 相信大家都听说了量化交易这个东西了吧!量化交易是一种新兴的系统化金融投资方法. 那么,什么才是普通股民所适合的量化交易打开方式呢? 本文就用一个接地气的股票分析场景 -- 用量化方法识别股价波段 ...

  2. 小散量化炒股记|搭建本地化的股票量化数据库这么几步就够了

    前言 相信大家都听说了量化交易这个东西了吧! 量化交易是一种新兴的系统化金融投资方法,它综合多个学科的知识,用先进的数学模型代替人的主观思维制定交易策略,利用计算机强大的运算力从庞大的股票.债券. 期 ...

  3. 小散量化炒股记|说某个指标能赚钱?不盲从,先量化回测一番!

    前言 相信大家都听说了量化交易这个东西了吧!量化交易是一种新兴的系统化金融投资方法. 那么,什么才是普通股民所适合的量化交易打开方式呢? 本文就用一个接地气的股票分析场景 -- 用量化回测来识别技术指 ...

  4. 小散量化炒股记|趋势指标金叉死叉策略在震荡行情中怎么处理

    前言 相信大家都听说了量化交易这个东西了吧!量化交易是一种新兴的系统化金融投资方法. 那么,什么才是普通股民所适合的量化交易打开方式呢? 本文就用一个接地气的股票分析场景--典型的趋势指标金叉死叉策略 ...

  5. python 主力资金_小散量化炒股记|一文揭秘主力、散户资金流入流出的来龙去脉...

    前言 我们经常听到这样的股市要闻:"主力资金全天净流出140.95亿元--" 目前很多行情软件也提供了主力资金流入流出.散户资金流入流出等数据. 很多交易者会依据这些"主 ...

  6. 小散量化炒股记|要克服人性弱点?激活股票全自动化交易!

    前言 股票的自动化交易接口在2015年之后就被管制了,于是对于普通股民来说只能通过手动下单方式完成量化交易最后一个环节. 当然,对于股票交易来说,大部分人更偏向于中低频的交易范畴,毕竟高频交易在政策限 ...

  7. 小散量化炒股记|手把手教你转换通达信公式,盘整后均线粘合突破

    前言 通达信的公式编写功能非常流行,很多高手都是在通达信上编写公式来分析股票的. 作为过来人,建议大家在初期的策略研究阶段,选一个通用的平台进行策略研究,因为有现成的功能模块可以调用,这样就能把精力聚 ...

  8. 小散量化炒股记|如何研判主力的踪迹!计算筹码分布图有妙用!

    前言 "筹码分布"自从问世以来一直受到广大投资者的追捧,它是把股票按不同价位上的流通数量做了排布,从而反映了这个股票对于全体投资者来说持仓成本的分布情况. 我们知道主力的常用手段是 ...

  9. 小散量化炒股记|MySQL搭建股票量化数据库完整模版来袭

    前言 数据是量化交易的源头,如何高效地管理大量数据是量化交易分析中非常关键的环节.数据库就是最佳的解决方案. 通过API接口获取到股票行情数据之后,我们可以存入到数据库之中,这样下次调用的时候只需要从 ...

最新文章

  1. 推箱子2-向右推!_保持冷静,砍箱子-me脚
  2. 部门换届推文文字_【校安协招新】这篇推文不要标题,只要你!
  3. OpenCASCADE绘制测试线束:数据交换命令之XDE 颜色命令
  4. Response_案例3_输出字节数据
  5. 悲观锁代码java_悲观锁的代码实现如何编写?
  6. json解析对象时指定解析_不解析,使用解析对象
  7. Python语法入门
  8. Flutter 日期选择器与时间选择器
  9. 用linux上网有什么优点,Linux系统的介绍,有什么优点,怎么使用
  10. Leetcode 17.电话号码的组合(回溯法)
  11. 为企业选择最合适的SSL证书
  12. 程序员工作交接文档怎么写_你认为程序员需不需要写文档?需要写哪些文档?...
  13. 小丸工具箱\FFmpeg踩坑记录
  14. BT文件分享服务器,bt是什么意思服务(bt资源库)
  15. excel多列多行堆叠成多列一行_如何将多行多列数据转置成列-Excel中如何将多行多列数据转置成列...
  16. VMware安装中标麒麟Linux_server_x86_ZX64(兆芯版)
  17. CI/CD---使用新版云效流水线自动部署Java项目
  18. winPE下安装系统ghost恢复系统图文详细教程
  19. Microsoft Office word 2019教程 - word中的excel表格随着excel表格的变化而变化
  20. 相亲小程序如何做到年入百万?盈利模式是什么?

热门文章

  1. 什么是RFID及其特点
  2. excel2json 一个excel转json的工具(开源)
  3. java微信公众号自动回复文字加图片
  4. JS知识点总结(全)
  5. Dracula这个东西
  6. 深度学习 - 记忆网络
  7. Java基础—char类型数据
  8. HTML5用audio标签做一个最简单的音频播放器
  9. Ubuntu22.04点击.appimage软件不运行
  10. [数学公式]等差数列求和