在股票量化策略的初始化函数中, 进行一些初始化设置后, 最后运行了三个定时函数
定时函数的定义及分类
在回测和模拟交易中, 定时函数可按照每月, 每周, 每天进行工作
定时函数可分为三种:
每日定时函数 run_daily
每周定时函数 run_weekly
每月定时函数 run_monthly
语法如下:
- # run_daily
- run_daily(func, time='open', reference_security)
- # run_weekly
- run_weekly(func, weekday, time='open', reference_security)
- # run_monthly
- run_monthly(func, monthday, time='open', reference_security)
需要注意的是, 定时函数在日级模拟中使用时, 如果设置 time='open'或 time='9:30', 那股票量化策略的实际运行时间是 9:27~9:30 之间; 而股票量化策略类获取到的逻辑时间 (context.current_dt) 仍然是 9:30
定时函数各项参数的意义
参数 func, 是一个函数, 并且该函数必须接受 context 参数
参数 weekday, 用来指定每周的第几个交易日, 可以是负数, 表示倒数第几个交易日; 如果超出每周总交易个数, 则取临近的交易日执行
参数 monthday, 用来指定每月的第几个交易日, 可以是负数, 表示倒数第几个交易日; 如果超出每月总交易日个数, 则取临近的交易日执行
参数 time, 一个字符串, 可以是具体执行时间, 支持 time 表达式; 比如 "10:00", "01:00" 或者 "every_bar", "open", "before_open", "after_close", "close", "morning" 和 "night"
every_bar: 只能在 run_daily 中调用; 按天会在每天的开盘时调用一次, 按分钟会在每天的每分钟运行
open: 开盘时运行(等同于 "9:30" )
before_open: 早上 9:00 运行
after_close: 下午 15:30 运行
close: 下午 15:00 运行
morning: 早上 8:00 运行
night: 晚上 20:00 运行
参数 reference_security, 表示时间的参照标的. 如果参照 "000001.XSHG", 交易时间为 9:30-15:00; 如果参照 "IF1812.CCFX",2016-01-01 之后的交易时间为 9:30-15:00, 在此之前为 9:15-15:15; 如果参照 "A9999.XDCE", 因为有夜盘, 因此开始时间为 21:00, 结束时间为 15:00
定时函数的注意事项
参数 func 必须是一个全局的函数, 不能是类的成员函数, 实例代码如下:
- # 定义一个全局函数
- def on_week_start(context):
- pass
- # 定义一个类, 被调用的函数是类中成员
- class MyObject(object):
- def on_week_start1(self, context):
- pass
- # 初始化函数
- def initialize(context):
- # 调用全局函数, 正确
- run_weekly(on_week_start, 1)
- # 使用类中成员函数, 将编译错误
- run_weekly(MyObject().on_week_start1, 1)
定时函数通过 history 或 attribute_history 获得每天数据时, 是不包括当天数据的. 要获利当天数据, 只能按分钟来获取
定时函数可以重复调用, 即初始化函数中可以两个或多个同名定时函数, 实例代码如下:
- def on_week_start(context):
- pass
- def on_week_end(context):
- pass
- def initialize(context):
- # 在每周的第一个交易日和最后一个交易日分别调用以上两个函数
- run_weekly(on_week_start, 1)
- run_weekly(on_week_end, -1)
每次调用这些定时函数都会产生一个新的定时任务. 如果想修改或者删除旧的定时任务, 就要调用 unschedule_all()(取消所有定时运行)来删除所有定时任务, 然后再添加新的
如果定时函数在一月或一周交易日数不够, 这样 monthday 或 weekday 就无法满足. 这时可以找这周内最近的一个日期来执行
定时函数的实例
- def weekly(context):
- print 'weekly %s %s' % (context.current_dt, context.current_dt.isoweekday())
- def monthly(context):
- print 'monthly %s %s' % (context.current_dt, context.current_dt.month)
- def daily(context):
- print 'daily %s' % context.current_dt
- def initialize(context):
- # 指定每个月第一个交易日, 在开盘后十分钟运行, 即 9:40
- run_monthly(monthly, 1, 'open+10m')
- # 指定每周倒数第一个交易日, 在开盘前运行, 即 9:00
- run_weekly(weekly, -1, 'before_open')
- # 指定每天收盘前 10 分钟运行, 即 14:50
- run_daily(daily, 'close-10m')
- # 指定每天收盘后运行, 即 15:30
- run_daily(daily, 'after_close')
- # 指定在每天的 10:00 运行
- run_daily(daily, '10:00')
- # 指定在每天的 01:00 运行
- run_daily(daily, '01:00')
- # 参照股指期货的时间每分钟运行一次, 必须选择分钟回测, 否则每天执行
- run_daily(daily, 'every_bar', reference_security='IF1512.CCFX')
注: 本文章为个人学习笔记, 参考了一些书籍与官方教程, 不作任何商业用途!
来源: http://www.jianshu.com/p/c91013e5b316