量化交易入门笔记-策略定时函数

时间:2024-04-11 19:38:07

量化交易入门笔记-策略定时函数

在股票量化策略的初始化函数中,进行一些初始化设置后,最后运行了三个定时函数

### 定时函数的定义及分类

在回测和模拟交易中,定时函数可按照每月、每周、每天进行工作

定时函数可分为三种:

  • 每日定时函数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

定时函数的注意事项

  1. 参数 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)
    
  2. 定时函数通过 history 或 attribute_history 获得每天数据时,是不包括当天数据的。要获利当天数据,只能按分钟来获取

  3. 定时函数可以重复调用,即初始化函数中可以两个或多个同名定时函数,实例代码如下:

    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)
    
  4. 每次调用这些定时函数都会产生一个新的定时任务。如果想修改或者删除旧的定时任务,就要调用 unschedule_all()(取消所有定时运行)来删除所有定时任务,然后再添加新的

  5. 如果定时函数在一月或一周交易日数不够,这样 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')

注:本文章为个人学习笔记,参考了一些书籍与官方教程,不作任何商业用途!