前面介绍了如何使用 hikyuu 进行策略回测参数优化,同时也提到了这种简单的参数优化本质其实是对历史数据的过拟合,通常并不具备直接使用的意义。那么有什么办法来减缓这种过拟合影响,让参数优化发挥实际的作用呢?答案是——使用滚动系统,但依然需要保持谨慎的态度,因为回测是拟合的本质并没有改变。
先来看一个简单的示例,依然使用趋势双均线,标的为万科,使用2001年-2010年数据进行参数寻优,参数寻优范围为 快线 [5, 80], 慢线 [50, 250],共 14535 组参数组合,寻优结果为快线41,慢线72。对2010年至2024年9月30日数据进行回测,下图分别为:使用最优参数的回测结果(左图)、使用滚动寻优系统的回测结果(右图)。其中滚动寻优为每300个交易日寻找最优参数,并使用最优参数系统执行200天,以此滚动推进。
在 hikyuu 中,创建滚动寻优系统很简单,指定寻优候选系统列表,滚动训练区间长度,测试执行区间长度,有效初始账户即可。当候选系统列表中仅有一个系统时,就是普通的滚动回测。并且,候选系统列表并要求一定是同一个策略的系统示例哦,也就是说,可以在不同的系统策略中进行滚动寻优。创建后的滚动系统实例,在 PF(投资组合)中依然可用,因为滚动交易系统本质还是一个单标的的交易系统实例。
# 指明参数寻优候选系统列表,滚动训练区间长度,测试执行区间长度
my_sys = SYS_WalkForward(sys_list, crtTM(), train_len=300, test_len=200)
my_sys.name = "滚动寻优系统"
my_sys.run(stk, query)
my_sys.performance()
滚动原理
滚动回测是通过不断向前滚动的时间窗口进行回测。具体来说,将历史数据划分为多个连续的时间段,每次只使用其中一个时间段进行回测,然后逐步向前移动时间窗口,重复进行回测。这样可以观察策略在不同时间点的表现,以及对市场变化的适应性。
滚动寻优同样是不断向前的滚动窗口,和普通单交易系统策略滚动不同的地方,则在于在训练周期内按一定的评估准则,对训练周期内所有候选系统进行评估,选取绩效最优的系统,在接下来的测试周期中,使用选择的最优系统执行实际的操作。说白了,当后续系统只有一个的时候,就是普通系统的滚动回测。
Hikyuu 中使用滚动系统
在 hikyuu 中创建滚动系统非常简单,只需要调用 SYS_WalkForward 即可创建,其帮助信息如下:
参数详细说明:
- sys_list:候选系统实例列表,系统实例可以是同一系统策略实例,也可以是不同的系统策略示例,系统示例需绑定相应的证券。
- tm:指定的交易账户
- train_len:滚动寻优训练周期。如上图所示。默认为 100
- test_len:最优绩效系统执行周期。如上图所属。默认为 20。
- se:寻优评估选择器,用于对候选系统进行绩效评估,默认为当前候选系统账户期末资产最大选择器(SE_MaxFundsOptimal)。注:此 SE 和 PF 中的SE并不相同。
- train_tm:用于滚动评估时,候选系统使用的交易账户。默认为None,表示使用 tm 的拷贝进行评估。
评估选择器
评估选择器主要用于从候选系统中评估和选取最优的系统。目前提供两个内建的评估选择器:
- SE_MaxFundsOptimal:账户资产最大寻优选择器
- SE_PerformanceOptimal:使用 Performance 统计结果进行寻优的选择器(支持按最大值或最小值选取)
大家可以自行在 python 中 help 相关帮助。
其中 Performance 为交易账户绩效统计,可以通过下述语句查询支持的统计项:
per = Performance()
per.names()#output
['帐户初始金额','累计投入本金','累计投入资产','累计借入现金','累计借入资产','累计红利','现金余额','未平仓头寸净值','当前总资产','已平仓交易总成本','已平仓净利润总额','单笔交易最大占用现金比例%','交易平均占用现金比例%','已平仓帐户收益率%','帐户年复合收益率%','帐户平均年收益率%',
……
自定义评估选择器
如果上述内建的选择器还不能满足需求,比如AI评估时,可以自定义评估选择器