别人赚钱时你却在解套,是少了止盈止损环节!股票量化分析工具QTYX-V2.4.1


a993b13c96f04a18b0c746cea855e3e8.png

前言

0cdad86a8dcc7a6c66d27b749045201a.png

股票市场上流行着这么一句话:“会买的是徒弟,会卖的是师傅”。

散户或多或少的总是会选到一些牛股,可能是靠运气,也可能靠自身的投资能力。但最终出现亏钱的局面,最大的原因是并不知道什么时候退出。

身边经常听到这样懊悔的声音:“XXXX股票,我当时最多赚XX,后面跌下来我没卖,一直捂着跌到我的成本价以下,现在套住了!早知道……”

要避免遇到“竹篮打水一场空”的尴尬局面,只需对自己的量化系统中增加“止盈止损”功能即可。(炒股中是有很多技巧可以让你的系统正收益的!)

于是,我们升级了股票量化分析工具QTYX版本至V2.4.1来支持这个功能!

3101d386df77955cb9b1a77b37d393bd.png

系统架构—止盈止损

19d4c5b915cb27ce66e5b2c575ccc291.png

QTYX完整架构如下所示,其中包括了QTYX股票量化分析系统和实盘机器人两部分,它们之间是以“交易条件单”及“持有股票池”的形式链接起来的。

  • “交易条件单”中记录的是实盘中需要交易的股票信息,比如买卖的股票、数量、价格、盘中执行的策略等

  • “持有股票池”中记录的是已持有股票的止赢止损设定值。盘中触发到止赢止损值时会触发卖出信号。

9526758eacc7c2b2b90f1ae06b571b19.png


519e38612e9584b6073e149731cb8a80.png

交易条件单生成

f321e3efaff44e697cd26c63af7e040f.png

交易条件单是在自选股票池和编写的交易策略基础之上生成的,也就是说通过使用QTYX股票量化分析系统所提供的功能经过一系列的分析,然后生成条件单去交易股票。

这些分析功能比如双底形态选股、RPS排名选股、金叉死叉策略、跳空缺口分析等等。关于这方面具体介绍可以查看往期的公众号《搭建系统》专题。

如何生成交易条件单呢?

点击“交易”后进入子页面。

0a1b1605352cf69bb3214f0bf9e13c33.png

点击“加载自选股”后会把自选股中的股票最新行情数据加载到界面中。

6fb74cad405254577aa81bc3c51c8aa9.png

点击股票代码后会出现交易单配置界面。我们根据自己策略分析的结果填写交易方向(买或者卖)、买卖的价格、买卖的股票数量。实盘时发现该股已经到了符合交易的条件时,默认会远程发送信息提醒。

15351d803d0263e23603fb5ed26a274c.png

如果勾选自动交易的话,系统会根据设置的参数自动执行买卖操作。需要注意的是,使用自动交易功能要提前测试好自动交易环境。可以参考以下公众号文章。

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

7b94c3610a7ccb226d972a30520073f3.png

配置完成后就添加到了左侧的交易股票池中了。

ec877ee97383e13476ecaea541ad7432.png

如果要删除或者更改参数的话,只需双击股票池中的股票即可。

edb332998a8731941f068284c9bcc4c9.png



f0e25759f5af18270fc882f246f96831.png

持有股票池生成

fe4b50581632950d0f1a1be880117fe3.png

当触发买入“交易条件单”中的股票后,会自动更新至“持有股票池”中。如果有单独手动下单买入的股票,也可以通过在ConfigFiles/hold_para.json中添加信息方式更新“持有股票池”。

点击“持有股票池”股票代码后会出现配置界面。我们可以更改止盈止损的模式和幅度,同时配置界面也显示了买入的价格和持有后最高的价格。

4a4a4a4bec02e823c0f27ea44cb7f185.png

目前我们支持的止盈模式是固定比例的,比如买入后涨幅达到40%止盈。止损模式是动态回撤止损,比如买入后股价从最高价下跌5%后就止损退出。

实盘时发现该股已经到了符合止盈止损交易条件时,默认会远程发送信息提醒。

d3ad8e85c104cf49db420a7af2e69154.png

700d5e8def9be8a63290a84d0a3eb41c.png

如果要删除或者更改参数的话,只需双击股票池中的股票即可。


b6f9d9948af19b64d6544d645cd97ea8.png

实盘方法

73ad7fffe2f6b40743a9b5e455e81b66.png

实盘时启动“实盘机器人”程序,它会读取“交易条件单”和“持有股票池”的配置,然后在每3s获取到全市场最新数据时,判断“交易条件单”和“持有股票池”中的指令,符合条件的就执行交易。

“交易条件单”和“持有股票池”是以Json格式存储的。

029eb7370feb31b02334ae33ce067234.png

需要注意的是目前系统是按T+1的方式执行交易的。也就是说,收盘后进行复盘,产生第二天的交易计划。


ac77543a59a6ba941e879024cf784eab.png

启动量化机器人

01055a965294e132c8ed79e92e29d4f4.png

使用Windows下的任务计划,定时执行准备好的量化实盘机器人Python脚本。

接下来创建一个定时任务来执行这个脚本。

第一步,右键我的电脑,点击管理。在弹出的计算机管理对话框点击任务计划程序—>创建基础任务。

e815d592e95a57a30a5f6d20f77fc658.png

第二步,在弹出的创建基本任务向导输入名称和描述,然后点击下一步。

8384be8eb6b68bacd108f77b4ac5583a.png

第三步,在触发器页面设置脚本执行的时间计划,选择每天,点击下一步。

c02cf8340820c55fbd594ebe98b72848.png

第四步,设置每天触发的时间,点击下一步。

bf02b5fc01552a22d2ff17d99d96f530.png

第五步,在操作页面,选择启动程序,点击下一步。

554be9f8455a3c6efac2cc66fd4704a9.png

第六步,此处程序或脚本中填写的一般是编译器的名称,一般对Python来说就是Python.exe(找到你的安装路径),添加参数就是你所要执行的Python文件(完整路径),这样填写的本质其实就是在命令行中执行Python一样。

08b7c91e3a009c82cadf87ee360b37c7.png

第七步,设置到这里已经算是完成了,接着就是等待它自动执行了。

0f5637d73fa3d749e58dd4b0ae2c7605.png

ccbfadec21df3a7fde5a6846f9424a88.png

d7d740695c42461913bfc22fb5db2920.png

实时行情数据获取

f6041cec86c2da67be936a11c25761f7.png

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

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

dffef3a97bf200bd886085ec075238fd.png


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

99a2c58fcbfb461c2ecbaf5c419fccb5.png

我们使用多线程爬虫技术实现行情数据获取。

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

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

8dcca56451705994039c21c163aca68f.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 操作的完成。

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

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

b896ceec965e87eaeaf1d441af683686.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文件。

关键代码如下所示:

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文件如下所示:

7527c30ba1930d255f66df2ed784a3b4.png

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

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

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

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

9e3b1b0313a825d08dbab52a851275fe.png

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


24a06a428b31da5ca89569074e84da79.png

盯盘触发条件远程提醒

9e2bceb6de99d20c8bbfde1c3691e606.png

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

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

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

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

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

c0c7d78ba600e4f80df7c34f68ab840d.png

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

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

典型的例程如下所示:

f61413bf08b765af7fc32fc288e19720.png

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

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

典型例程如下所示:

73399a228dded981f6ea6d54f4755a03.png

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

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

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

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

f6c29859cbec49b4a6d93262d3d01678.png

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

13db6216194a837bf43479870e8eaa3c.png

912ece4a291b75ab7c0cfddf35a8a5de.png

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

8a15886745cc749e6c4d810968e647b0.png

说明

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

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

7e8de067d3de63ef6839caa7d7ca2f11.png

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

9794d023eaee6dfee102230a49d091db.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值