美文网首页程序员
量化交易入门笔记-策略定时函数

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

作者: 东南有大树 | 来源:发表于2018-10-04 22:36 被阅读11次

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

    定时函数的定义及分类

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

    定时函数可分为三种:

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

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

    相关文章

      网友评论

        本文标题:量化交易入门笔记-策略定时函数

        本文链接:https://www.haomeiwen.com/subject/vudfaftx.html