日程?快设计一款任务调度器!"/>
小散量化炒股记|如何安排量化机器人日程?快设计一款任务调度器!
前言
作为一套实战版的量化交易系统,应该要有一个任务日程表,在指定的时间做指定的事情才对!
比如A股开盘时间是工作日早上9:30到11:30,下午13:00到15:00。那么我们的量化系统就得在这个时间段获取实时数据、执行策略、下单交易。
当股市收盘之后,量化系统也不能闲着,要更新当天的行情数据,动态调整股票池、回测策略等等。
再比如做期货夜盘、美股等标的,开市时间是晚上,那么也要把量化系统的执行时间调整一致才行。
所以我们需要给我们的量化交易系统安排上日程,让它根据我们的要求工作。
于是我们要设计一个任务调度器,接下来就和大家分享下如何设计一款任务调度器吧!
设计方案
整体设计结构如上图所示。这个结构是多任务在量化交易中的典型应用场景之一——在进程中开多线程。
任务调度器是以进程方式运行,在进程中周期去查询任务清单,当监测到有任务该运行时,开启线程去执行这个任务,这样的好处是执行的任务不会影响任务调度器的运行。
另外主要考虑到任务调度器监测任务的时间精度,比如是1秒钟,还是10秒钟,或是1分钟轮询一次任务清单,这取决于执行任务对激活时间的精度要求。
结构中的几个设计要点:
进程使用multiprocessing库;
线程使用threading库;
任务清单用namedtuple实现,它是高阶的数据结构,可以对每个成员单独命名。
模版使用
为了帮助大家以最快的方式实现自己的任务调度器,这里提供给大家一个最小化的框架模版。
定义任务调度器类myScheduler,其中包括如下几个方法:
addTask:往任务清单中添加任务,以及运行的时间
_run:调度器周期执行,监测任务的启动
Start:启动调度器
Shutdown:停止调度器
我们以A股为例,任务清单中添加了实盘tick数据获取和收盘历史数据下载两个任务。
实盘tick数据采样类TimeTrigger,其中包括如下几个方法:
get_curtime:获取最新的时间
in_trade_time:判断当前是否在交易时间段
before_trade_time:判断当前是否在开盘前
after_trade_time:判断当前是否已经收盘了
trigger_run:线程2-3秒周期执行,爬取实盘数据
收盘历史数据下载是download_history_job函数,收盘后的历史数据下载不像实盘那样,对执行时间精度要求那么高,只要到时间点触发即可。
注册任务到清单中,除了要添加任务对象外,还要添加执行的时间,比如周一到周五每天09:25:00执行时间数据获取,16:30:00执行历史数据下载:
scheduler = myScheduler()
scheduler.addTask(download_history_job, [1, 2, 3, 4, 5], '16:30:00')
scheduler.addTask(sample_realtime_job, [1, 2, 3, 4, 5], '09:25:00')
任务调度器的监测逻辑如下所示,需要注意的是调试时记得手动把任务启动时间设置在当前时间之后,这样才能触发启动任务。
if self._pre_time is not None:for task in self._tasks_table:if cur_week in task.dayOfWeek and (self._pre_time <= task.timeOfDay < cur_time): task.subtask()
以上是关于量化系统任务调度框架的整体介绍,后续大家可以根据自己的需求逐步去完善这个模版框架,二次更改成符合自己的调度器。
完整代码我们会上传星球《Python量化场景编程技巧与方法》
目前我们有两个星球《玩转股票量化交易》和《Python量化场景编程技巧与方法》。
《玩转股票量化交易》【进阶】:提供最新版量化系统QTYX的下载,以及搭建量化系统的高阶干货。
《Python量化场景编程技巧和方法》【基础】:分享一些偏基础的关于Python编程技巧、Pandas编程技巧、数据库技巧、可视化编程技巧等等。
加入星球《玩转股票量化交易》的会员可以免费加入星球《Python量化场景编程技巧与方法》,微信联系我加入!!
元宵大师的量化交易书籍开售!!
京东、当当、天猫有售!!
更多推荐
小散量化炒股记|如何安排量化机器人日程?快设计一款任务调度器!
发布评论