在股票量化策略的初始化函数中,进行一些初始化设置后,最后运行了三个定时函数
### 定时函数的定义及分类
在回测和模拟交易中,定时函数可按照每月、每周、每天进行工作
定时函数可分为三种:
- 每日定时函数
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')
注:本文章为个人学习笔记,参考了一些书籍与官方教程,不作任何商业用途!