不少上班族的股友在和我交流时提到,因为平时上班的原因总是错过最佳的买卖点,十分无奈!
也有很多加班一族的股友和我反应他们经常很晚才到家,几乎没有时间去复盘。确实,复盘挺花时间的,而且随着金融市场的发展,现在要看的东西也越来越多。
我最开始决定用量化这个工具的目的之是为了提高分析股票的效率。毕竟,在这个信息技术这么发达的时代,很多事情可以让计算机帮我们完成,这样可以节省下来很多时间。
于是,我们设计一款远程量化机器人就可以完美解决这些问题。
接下来我们罗列一些远程量化机器人应用场景。
应用场景举例
应用场景适合上班族盯盘的应用场景。
让远程量化机器人帮助我们盯盘,当实盘行情到达我们设定的目标时,通过QQ邮箱、微信或者钉钉等即时聊天工具通知我们。
虽然目前券商的APP上面也有提醒功能,但是种类比较单一和固定,当我们的触发逻辑比较复杂或者个性化的时候就无法满足了,所以投资交易领域需要一点特立独行,少一点从众随大流。
应用场景适合加班族的量化选股场景。
每天让家里的远程量化机器人对全市场的股票执行一遍选股分析,比如跑一下双底形态选股分析,然后把分析结果以附件的形式远程发送到你的手机上。
这样即使在加班,或者是在回家的路上,也可以利用碎片时间去制定第二天的投资策略。
应用场景每天定时自动更新数据库。
当我们获取的股票数据是爬虫方式的时候,有可能因为各种原因忘记了下载当天的数据,从而缺了某天的数据,要知道缺失一天的数据对回测及分析都是会有不小的影响。这个时候可以定时让远程量化机器人更新股票数据。
总体来说实现以上这些场景需要以下几部分功能:
获取实时行情数据监测交易触发信号远程发送分析报告量化机器人任务调度自动运行量化机器人
多线程实时行情获取
股票行情数据对量化交易者来说非常重要,无论是短线交易者还是中长线交易着。
对于短线交易者来说,获取实时行情数据的方案涉及到盘中分析和买卖点监测的时效性。
对于中长线交易中来说,盘后更新全市场数据也要求下载尽可能快。如果用第三方Python数据库,比如tushare等,会受到服务器端的限制,全市场个股行情数据获取需要几十分钟。
本主题提及的A股实时行情数据获取方案,只需要三秒内就能获取全市场个股行情数据。
对于短线交易者来说每间隔3秒调取一次即可。对于中长线交易者来说,每天收盘后调取一次后存储到自己的数据库即可。
小散量化炒股记|基于多任务爬虫技术,实现A股实时行情Level1采样
监测交易信号触发
“交易条件单”和“持有股票池”是以Json格式存储的。
如何生成“交易条件单”和“持有股票池”中的内容呢?
“交易条件单”中记录的是实盘中需要交易的股票信息,比如买卖的股票、数量、价格、盘中执行的策略等
“持有股票池”中记录的是已持有股票的止赢止损设定值。盘中触发到止赢止损值时会触发卖出信号。
交易条件单是在自选股票池和编写的交易策略基础之上生成的,也就是说通过使用QTYX股票量化分析系统所提供的功能经过一系列的分析,然后生成条件单去交易股票。
如何生成交易条件单呢?点击“交易”后进入子页面。
点击“加载自选股”后会把自选股中的股票最新行情数据加载到界面中。
点击股票代码后会出现交易单配置界面。我们根据自己策略分析的结果填写交易方向、买卖的价格、买卖的股票数量。
实盘时发现该股已经到了符合交易的条件时,默认会远程发送信息提醒。
小散量化炒股记|要克服人性弱点?激活股票全自动化交易!
如果大家把自动交易调试稳定的话,可以把自动交易的函数添加到以下代码处,这样就完成了自动交易这个末端环节。
if val["auto_trade"] == True:
print("自动交易需调试交易环境,查看公众号《小散量化炒股记|要克服人性弱点?激活股票全自动化交易!》")
配置完成后就添加到了左侧的交易股票池中了。
如果要删除或者更改参数的话,只需双击股票池中的股票即可。
当触发买入“交易条件单”中的股票后,会自动更新至“持有股票池”中。如果有单独手动下单买入的股票,也可以通过在ConfigFiles/hold_para.json中添加信息方式更新“持有股票池”。
点击“持有股票池”股票代码后会出现配置界面。我们可以更改止盈止损的模式和幅度,同时配置界面也显示了买入的价格和持有后最高的价格。
目前我们支持的止盈模式是固定比例的,比如买入后涨幅达到40%止盈。止损模式是动态回撤止损,比如买入后股价从最高价下跌5%后就止损退出。
当然这个触发条件是一个非常基本的逻辑,相信每个人都有自己的一套判断条件,比如分成多档条件,逐一递进式地判断;比如拉升或者砸盘的速度;比如由涨转跌或者由跌转涨的过渡等等……
远程发生分析报告
发送邮件和核心是SMTP协议,它是一组用于由源地址到目的地址的邮件传输规则。
Python真的是什么都能做,它对SMTP进行了简单的封装,只需用到两个模块,就可以轻松实现发送纯文本邮件、HTML邮件以及带附件的邮件。
哪两个模块呢?Python内置的email模块负责构建邮件,另一个smtplib模块负责发送邮件。
常规的流程,先把涉及到的模块全部导入进来,如下所示:
首先用MIMEText构造一个最简单的纯文本邮件,其中第一个参数是邮件正文,第二个参数是内容的类型,比如"plain"表示纯文本邮件,"html"表示HTML邮件。
典型的例程如下所示:
再来说说负责发送邮件的smtplib模块,这个模块主要是用smtplib.SMTP类去连接SMTP服务器,然后发送邮件。
例程中我们会用到几个常用的方法,比如set_debuglevel打印和SMTP服务器交互的所有信息。login登录SMTP服务器,sendmail方法发邮件。
典型例程如下所示:
这里的password是个比较容易混淆的地方。不是邮箱登陆的密码,而是授权码。
第三方客户端登录QQ邮箱时是需要授权码的,包括其他邮箱也都一样,比如12163邮箱等等。授权码可以认为是一个专用密码,适用于登录以下服务:POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务。
如何设置呢?以QQ邮箱为例,我们在QQ邮件的帮助中心找到了方法。
在个人邮箱页面进入[设置]->[帐户]页面找到入口,然后把POP3/IMAP/SMTP这几个服务开启。
开启的时候有验证密保环节,需要发送短信,接着就获取到授权码,在第三方客户端的密码栏里面输入这16位授权码进行验证即可。
这样一来邮件就发送成功了,我已经得到量化盯盘提醒了!!!手机邮箱也一样可以收到哦!
量化机器人任务调度
在量化机器人QuantRobot.py中有一个TimeTrigger类,可以在其中的trigger_run中添加自己要定时执行的任务:
def trigger_run(self):
while True:
if self.in_trade_time(cur_time):
# 9:25--11:31 12:59--15:01 时段获取数据
print(u"当前时间{0}".format(cur_time.strftime("%Y-%m-%d_%H:%M:%S")))
elif self.before_trade_time(cur_time):
print(u"开始时间{0}--未开盘".format(self.start_time.strftime("%Y-%m-%d_%H:%M:%S")))
elif self.after_trade_time(cur_time):
print(u"结束时间{0}--已收盘".format(self.end_time.strftime("%Y-%m-%d_%H:%M:%S")))
else:
print(u"休息时间-- 11:30至13:00")
time.sleep(CONF_SCAN_TIME) # 3秒采集一次, 执行时间在2秒内, 等待1秒
比如我们在交易时间段三秒周期调用了实时行情获取类RealTimeData的get_daily_thread接口,也可以在收盘的时候调用这个接口,并且把数据以csv格式存储到本地,或者存到本地的数据库。
注:QuantRobot.py中的RealTimeData类和CrawerDaily.py中的CrawerDailyData类实现方式类似,都是同一个爬虫接口。
自动运行量化机器人
接下来创建一个定时任务来执行这个脚本。
第一步,右键我的电脑,点击管理。在弹出的计算机管理对话框点击任务计划程序—>创建基础任务。
第二步,在弹出的创建基本任务向导输入名称和描述,然后点击下一步。
第三步,在触发器页面设置脚本执行的时间计划,选择每天,点击下一步。
第四步,设置每天触发的时间,点击下一步。
第五步,在操作页面,选择启动程序,点击下一步。
第六步,此处程序或脚本中填写的一般是编译器的名称,一般对Python来说就是Python.exe,添加参数就是你所要执行的Python文件,这样填写的本质其实就是在命令行中执行Python一样。
第七步,设置到这里已经算是完成了,接着就是等待它自动执行了。
我们会把完整的源码上传到知识星球《玩转股票量化交易》中,帮助小伙伴们更好地掌握这个方法。
文章为作者独立观点,不代表股票交易接口观点