【历史文档】高阶技巧-月度调仓_可视化编程示例
由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个参数,这里我们将解释如下:
-
fuc:回测主函数且函数名必须包含“handle_data”,当 date_rule 和 time_rule 的条件满足时,会执行该函数。
-
date_rule:自定义的一个 class date_rules(object) 类,可选函数如下:
- every_day():每天触发;
- month_start(days_offset=0):月初触发,days_offset 指月初后 N 天触发;
- month_end(dats_offset=0):月末触发,days_offset指月末前 N 天触发;
- week_start(days_offset=0):周初触发,days_offset指周一后 N 天触发;
- week_end(days_offset=0):周末触发,days_offset指周天前 N 天触发。
-
time_rule:自定义的一个 class time_rules(object) 类,可选函数如下:
-
market_open(offset=None, hours=None, minutes=None):开盘时触发,其中参数解释如下:
- offset 为 datetime.timedelta 类型,指开盘后 N 时间戳后触发,最小必须为 1 分钟;
- hours 为 int 类型,指开盘后 N 小时后触发;
- minutes 为 int 类型,指开盘后 N 分钟后触发。
-
market_close(offset=None, hours=None, minutes=None):收盘时触发,参数与上面类似,指收盘前前移的时间触发。
-
-
half_days:布尔类型,即触发条件生效的时间周期。
-
calendar:在计算触发规则的时期时,是否按照交易日历。
如上所示,schedule_function() 函数其实就是定义了回测主函数即 handle_data 类的执行周期。我们知道 handle_data 函数中主要处理每根 k 线来后的交易逻辑,因此通过 schedule_function 函数,我们可以调整我们的交易时间周期。
二、改进方法
在知道了 schedule_function() 函数的用法后,我们如何在平台上开发可视化的“月度调仓”策略呢?由于平台封装了回测模型,因此可视化模块中的函数都是以 bigquant_run() 命名,如下所示:
在后台运行时,平台会将回测的相关函数名与模块名结合自动转换,如下所示:
因此,我们需要在“主函数”中重新定义个 month_handle_data() 函数以供 schedule_function() 调用,具体步骤如下:
-
在回测引擎的初始化函数中:定义 schedule_function() 函数,并调用 month_handle_data() 函数
-
在回测引擎的主函数中:定义 month_handle_data() 函数,放入每一个交易日的交易逻辑
-
在回测引擎的主函数中:bigquant_run(context, data) 函数是回测引擎要求必须的,但我们已经有 month_handle_data() 回测主函数了,因此这里定义一个空函数
三、示例策略
策略思路如下所示,选择 pb_lf_0、pe_ttm_0、amount_0 三个因子,按照 PB 和 PE 两个因子进行排序,然后按照一系列的标准进行筛选后进回测,策略链接如下。
https://bigquant.com/experimentshare/8e0f26db30ea44f6aea12ec99b045af5
\