历史文档

【历史文档】高阶技巧-月度调仓_可视化编程示例

由hxgre创建,最终由small_q 被浏览 199 用户

更新

本文内容对应旧版平台与旧版资源,其内容不再适合最新版平台,请查看新版平台的使用说明

新版量化开发IDE(AIStudio):

https://bigquant.com/wiki/doc/aistudio-aiide-NzAjgKapzW

新版模版策略:

https://bigquant.com/wiki/doc/demos-ecdRvuM1TU

新版数据平台:

https://bigquant.com/data/home

https://bigquant.com/wiki/doc/dai-PLSbc1SbZX

新版表达式算子:

https://bigquant.com/wiki/doc/dai-sql-Rceb2JQBdS

新版因子平台:

https://bigquant.com/wiki/doc/bigalpha-EOVmVtJMS5

简介

在前一篇文章中,我们演示了如何以代码形式修改回测模型完成“月度调仓”。详情参考以下文章:

https://bigquant.com/wiki/doc/shili-zm6SPVt4sG

从前一篇文章中,我们可以看出“月度调仓”策略主要通过 schedule_function() 函数实现,因此本篇文章将着重介绍 schedule_function() 函数并演示如何在可视化编程环境下完成“月度调仓策略”。

一、schedule_function() 函数解释

schedule_function是zipline定义的一个函数,zipline中函数解释如下:

def schedule_function(func, date_rule=None, time_rule=None, half_days=True, calendar=None):
    """Schedule a function to be called repeatedly in the future.
    Parameters
    ----------
    func : callable
        The function to execute when the rule is triggered. ``func`` should
        have the same signature as ``handle_data``.
    date_rule : zipline.utils.events.EventRule, optional
        Rule for the dates on which to execute ``func``. If not
        passed, the function will run every trading day.
    time_rule : zipline.utils.events.EventRule, optional
        Rule for the time at which to execute ``func``. If not passed, the
        function will execute at the end of the first market minute of the
        day.
    half_days : bool, optional
        Should this rule fire on half days? Default is True.
    calendar : Sentinel, optional
        Calendar used to compute rules that depend on the trading calendar.
    See Also
    --------
    :class:`zipline.api.date_rules`
    :class:`zipline.api.time_rules`
    """

如上代码所示,schedule_function() 函数有5个参数,这里我们将解释如下:

  1. fuc:回测主函数且函数名必须包含“handle_data”,当 date_rule 和 time_rule 的条件满足时,会执行该函数。

  2. date_rule:自定义的一个 class date_rules(object) 类,可选函数如下:

    1. every_day():每天触发;
    2. month_start(days_offset=0):月初触发,days_offset 指月初后 N 天触发;
    3. month_end(dats_offset=0):月末触发,days_offset指月末前 N 天触发;
    4. week_start(days_offset=0):周初触发,days_offset指周一后 N 天触发;
    5. week_end(days_offset=0):周末触发,days_offset指周天前 N 天触发。
  3. time_rule:自定义的一个 class time_rules(object) 类,可选函数如下:

    1. market_open(offset=None, hours=None, minutes=None):开盘时触发,其中参数解释如下:

      1. offset 为 datetime.timedelta 类型,指开盘后 N 时间戳后触发,最小必须为 1 分钟;
      2. hours 为 int 类型,指开盘后 N 小时后触发;
      3. minutes 为 int 类型,指开盘后 N 分钟后触发。
    2. market_close(offset=None, hours=None, minutes=None):收盘时触发,参数与上面类似,指收盘前前移的时间触发。

  4. half_days:布尔类型,即触发条件生效的时间周期。

  5. calendar:在计算触发规则的时期时,是否按照交易日历。

如上所示,schedule_function() 函数其实就是定义了回测主函数即 handle_data 类的执行周期。我们知道 handle_data 函数中主要处理每根 k 线来后的交易逻辑,因此通过 schedule_function 函数,我们可以调整我们的交易时间周期。

二、改进方法

在知道了 schedule_function() 函数的用法后,我们如何在平台上开发可视化的“月度调仓”策略呢?由于平台封装了回测模型,因此可视化模块中的函数都是以 bigquant_run() 命名,如下所示:

{w:100}{w:100}{w:100}

在后台运行时,平台会将回测的相关函数名与模块名结合自动转换,如下所示:

{w:100}{w:100}{w:100}因此,我们需要在“主函数”中重新定义个 month_handle_data() 函数以供 schedule_function() 调用,具体步骤如下:

  1. 在回测引擎的初始化函数中:定义 schedule_function() 函数,并调用 month_handle_data() 函数

    {w:100}{w:100%}{w:100}

  2. 在回测引擎的主函数中:定义 month_handle_data() 函数,放入每一个交易日的交易逻辑

    {w:100}{w:100}

  3. 在回测引擎的主函数中:bigquant_run(context, data) 函数是回测引擎要求必须的,但我们已经有 month_handle_data() 回测主函数了,因此这里定义一个空函数

    {w:100}{w:100}

三、示例策略

策略思路如下所示,选择 pb_lf_0、pe_ttm_0、amount_0 三个因子,按照 PB 和 PE 两个因子进行排序,然后按照一系列的标准进行筛选后进回测,策略链接如下。

https://bigquant.com/experimentshare/8e0f26db30ea44f6aea12ec99b045af5

\

标签

投资策略金融市场算法交易量化投资风险管理
{link}