适合上班族的量化炒股场景——来自量化机器人的实时行情盯盘服务

news/2024/7/10 0:47:50 标签: python, java, 人工智能, 数据分析, vue

e143d19bc90ef05546698e0cf4b1d8c3.png

179a893384f6fa06d9d322daa5056b29.png

前言

670a7a369d1c4d59f57875f0f46f01f0.png

不少上班族的股友在和我交流时提到,因为平时上班的原因总是错过最佳的买卖点,十分无奈!

其实量化交易可以完美解决这个问题。于是我们提供了一个适合上班族盯盘的应用场景:让远程的量化机器人帮助我们盯盘,当实盘行情到达我们设定的目标时,通过QQ邮箱、微信或者钉钉等即时聊天工具通知我们。

虽然目前券商的APP上面也有提醒功能,但是种类比较单一和固定,当我们的触发逻辑比较复杂或者个性化的时候就无法满足了,所以投资交易领域需要一点特立独行,少一点从众随大流。

总体来说实现这个场景需要以下几部分功能:

  • 多线程实时行情的获取

  • 目标触发条件的判断

  • 邮箱发送消息(我在微信上开启QQ邮箱提醒功能,效果如同微信提醒)

cc78e143a98be1c5090b2695be02e3ee.png

实时行情数据特征

a189c244a69786ac7c058aad95a1713f.png

实时行情数据对短线量化交易者来说非常重要,涉及到买卖点的选择。

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

注:代码的SCAN_TIME变量可以配置实时数据更新的周期。

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

b4594294caa2787e6354f0d88a16de4b.png


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

c205952ca204e830087050ac7bd937d0.png

2954a2fe20f5a380db169f347e98ba31.png

多线程爬虫技术

7b2abfd45a6bce97d86cdefc1dd85716.png

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

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

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

dd26fd78fb145e4cb6f1d90c12cb104d.png

我在书中《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 操作的完成。

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

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

32ffabdd3b0f81b9c3acff03aacc7cd4.png

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

在 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文件。

关键代码如下所示:

python">for ret in results:
    df_daily_stock = df_daily_stock.append(ret, ignore_index=True)
df_daily_stock.to_csv(Path(store_path+u<span data-raw-text="" "="" data-textnode-index="58" data-index="1576" class="character">"{}.csv<span data-raw-text="" "="" data-textnode-index="58" data-index="1583" class="character">".format(df_daily_stock[<span data-raw-text="" "="" data-textnode-index="60" data-index="1607" class="character">"当前时间<span data-raw-text="" "="" data-textnode-index="60" data-index="1612" class="character">"].values[0])), columns=df_daily_stock.columns, index=True, encoding='GBK')

打开csv文件如下所示:

e3bf260daa19540881f4c56217fb7cab.png

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

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

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

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

339e35569f1d267bbfacb5a07fa2f5a1.png

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

76355a3db0568297d0cf85227e2417d3.png

目标触发条件判断

1b2693121a463b03b804f043fcd0f1ab.png

当前的代码里面我提供的触发条件是一个范围:大于上限设定值时或者小于下限设定值会触发报警,在合理的范围内时,表明该股符合正常的波动,无需过多的关注。

代码中的super_up用于设定上限值,super_down用于设定下限值。可以是最新价格、涨跌幅、涨跌额、成交量等等,只要实盘数据有的都能支持。

# 大于设定值触发super_up = {"000876.SZ": {"最新价格":15.5, "涨跌幅":5.00}}
# 小于设定值触发super_down = {"000876.SZ": {"最新价格":14.80, "涨跌幅":-3.00}}

当然这个触发条件是一个非常基本的逻辑,相信每个人都有自己的一套判断条件,比如分成多档条件,逐一递进式地判断;比如拉升或者砸盘的速度;比如由涨转跌或者由跌转涨的过渡等等……

690dd814a0d45dfd69479cb815b027f3.png

盯盘触发条件远程提醒

e5c070f163c80d6f003d34db9f61f9d7.png

远程提醒的功能,解决方案有用微信、短信、邮件、钉钉之类的方式。这里我们介绍下邮箱这种相对有效的方式来远程提醒。

发送邮件和核心是SMTP(Simple Mail Transfer Protocol)协议,它是一组用于由源地址到目的地址的邮件传输规则。

Python真的是什么都能做,它对SMTP进行了简单的封装,只需用到两个模块,就可以轻松实现发送纯文本邮件、HTML邮件以及带附件的邮件。

哪两个模块呢?Python内置的email模块负责构建邮件,另一个smtplib模块负责发送邮件。

常规的流程,先把涉及到的模块全部导入进来,如下所示:

4b86aeb3f753cdcf1f8f3d3beb7da84c.png

首先用MIMEText()构造一个最简单的纯文本邮件,其中第一个参数是邮件正文,第二个参数是内容的类型,比如'plain'表示纯文本邮件,'html'表示HTML邮件。

创建的邮件对象中,要添加From、To和Subject这些属性,否则就不是一封完整的邮件,比如会出现邮件没有主题,发件人的名称为匿名,明明收到了邮件却提示不在收件人中这些情况。

典型的例程如下所示:

cb5bcc00352b6b44bf215c7769806480.png

再来说说负责发送邮件的smtplib模块,这个模块主要是用smtplib.SMTP()类去连接SMTP服务器,然后发送邮件。

例程中我们会用到几个常用的方法,比如set_debuglevel(1)打印和SMTP服务器交互的所有信息。login()登录SMTP服务器,sendmail()方法发邮件。

典型例程如下所示:

1d4a02e202a91d4dd5f817ba19c7b002.png

这里的password是个比较容易混淆的地方。不是邮箱登陆的密码,而是授权码。

第三方客户端登录QQ邮箱时是需要授权码的,包括其他邮箱也都一样,比如126、163邮箱等等。授权码可以认为是一个专用密码,适用于登录以下服务:POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务。

如何设置呢?以QQ邮箱为例,我们在QQ邮件的帮助中心找到了方法。

在个人邮箱页面进入[设置] -> [帐户] 页面找到入口,然后把POP3/IMAP/SMTP这几个服务开启。

6dff20b69de463c05b63b709df36c40a.png

开启的时候有验证密保环节,需要发送短信,接着就获取到授权码,在第三方客户端的密码栏里面输入这16位授权码进行验证即可。

9ca680f8f16e963911d987ef0be213fa.png

660e7e96bce0a8a23b7209ae232fdcf6.png

这样一来邮件就发送成功了,我已经得到量化盯盘提醒了!!!手机邮箱也一样可以收到哦!

f45657a3c5a71ef3b0203a25e3307215.png

cb5deb07ae9815b78177119e83fea9c7.png

说明

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

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

3. 帮星球小伙伴冲下业绩,同时也给需要的小伙伴们发下大福利!!!开户可以看这篇!

量化低佣开户

6611e3a1f795837505a39a99388ab673.png

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

5d0afe5438fe841722b59915f0847ba0.png

最后祝大家国庆节快乐!


http://www.niftyadmin.cn/n/799383.html

相关文章

双底形态识别又又又升级了!这次叠加了突破当日涨幅判断!

前言在量化分析工具QTYX上&#xff0c;我们新增了双底形态的识别功能&#xff0c;不少星球小伙伴结合这个方式选出了上涨初期的个股&#xff0c;同时根据实战应用中的一些经验反馈给我了不少需求&#xff0c;大家一起来优化这个策略体系&#xff0c;不断完善这个体系的同时也能…

新增A股热门概念行情—股票数据远程下载服务升级

前言创建知识星球《玩转股票量化交易》的初心是为了建立一个可以深入学习和交流的私有量化圈子&#xff0c;和志同道合的小伙伴们一起搭建私有的量化交易系统&#xff0c;并且不断迭代完善这个系统&#xff0c;从而能够帮助我们更高效地分析股票、获得更大的盈利机会。关于星球…

idea生成函数 的注释快捷键_koroFileHeader:一个用于生成文件头部注释和函数注释的插件...

今天给大家分享的这个工具呢&#xff1f;对于使用 VS Code 的同学来讲&#xff0c;是一个好东西。koroFileHeader&#xff0c;一个在 vscode 中用于生成文件头部注释和函数注释的插件&#xff0c;经过多版迭代后&#xff0c;插件支持所有主流语言&#xff0c;灵活方便&#xff…

选股准确度大大提高!双底形态识别叠加向上跳空缺口判断!

前言在量化分析工具QTYX上&#xff0c;我们新增了双底形态的识别功能&#xff0c;不少星球小伙伴结合这个方式选出了上涨初期的个股&#xff0c;同时根据实战应用中的一些经验反馈给我了不少需求&#xff0c;大家一起来优化这个策略体系&#xff0c;不断完善这个体系的同时也能…

js 字符串替换_JS逆向|使用pyexecjs库替换加密字符串

声明&#xff1a;本文只作学习研究&#xff0c;禁止用于非法用途&#xff0c;否则后果自负&#xff0c;如有侵权&#xff0c;请告知删除&#xff0c;谢谢&#xff01;下面的代码是我在某网站随便找的一段base64的 javascript 源码:window {};window.atob function(r) { e…

加速双底形态选股!本地数据源快速遍历全市场!股票量化分析工具QTYX-V2.3.0...

前言通过星球会员们的反馈&#xff0c;双底形态识别功能非常实用、接地气&#xff0c;每天运行一次形态识别&#xff0c;从而第一时间帮助大家快速找出符合突破条件的强势股票。同时不少星友也给我反馈了一些改进需求&#xff0c;其中有一点非常急迫&#xff1a;目前全市场寻找…

eclipse maven打包jar 部分jsp无法访问_JSP+SSH+Mysql+DBCP实现的租车系统

项目简介项目来源于&#xff1a;https://github.com/1462656075/car本系统是基于JSPSSHMysqlDBCP实现的租车系统。在当代开发中&#xff0c;SSH的使用已经逐渐被SSM取代&#xff0c;但不代表我们不需要学习SSH&#xff0c;该系统简单&#xff0c;但功能齐全可以作为SSH框架初学…

行业和题材双轮动才是王道!Web版热力图跟踪行业和题材切换!

前言行业和概念题材是市场内具有相似属性的同一类股票。板块轮动是指当具有行业或者概念题材属性的某一个板块持续了一定热度之后&#xff0c;开始无人问津的时候&#xff0c;此时另外一个板块突然接棒。这种热度在多个板块中切换出现&#xff0c;维持着市场的人气。板块切换的…