阿布量化版权所有 未经允许 禁止转载
上一节主要讲解了如何使用abupy中度量模块对回测的结果进行度量,本节将主要讲解使用grid search模块对策略参数寻找最优。
最优参数的意思是比如上一节使用的卖出因子组合使用:
sell_factors = [
{'stop_loss_n': 1.0, 'stop_win_n': 3.0,
'class': AbuFactorAtrNStop},
{'class': AbuFactorPreAtrNStop, 'pre_atr_n': 1.5},
{'class': AbuFactorCloseAtrNStop, 'close_atr_n': 1.5}
]
AbuFactorAtrNStop止盈止损策略的止盈阀值是3.0,止损阀值是1.0,那么止盈参数设置成2.0或者止损阀值设置为0.5是不是回测交易效果更好呢,
AbuFactorPreAtrNStop风险控制止损pre_atr_n参数设置的是1.5,如果设置为1.0回测结果将如何,grid search模块对策略寻找最优参数就是要在给定的参数组合范畴内,寻找到策略参数最佳的设置。
1. 参数取值范围
Grid Search实际上是蒙特卡洛方法的一种实现子集,它首先固定了几组参数取值范围,把无限个解问题先缩小到有限个解的问题,然后对排列组合的各个参数组合迭代进行运算,得到最优结果。
既然是在给定参数范围内寻找最优,所以首先要给定一个合理的参数范围,下面首先寻找AbuFactorAtrNStop的参数组合如下所示:
stop_win_range = np.arange(2.0, 4.5, 0.5)
stop_loss_range = np.arange(0.5, 2, 0.5)
sell_atr_nstop_factor_grid = {
'class': [AbuFactorAtrNStop],
'stop_loss_n' : stop_loss_range,
'stop_win_n' : stop_win_range
}
print('AbuFactorAtrNStop止盈参数stop_win_n设置范围:{}'.format(stop_win_range))
print('AbuFactorAtrNStop止损参数stop_loss_n设置范围:{}'.format(stop_loss_range))
AbuFactorAtrNStop止盈参数stop_win_n设置范围:[ 2. 2.5 3. 3.5 4. ]
AbuFactorAtrNStop止损参数stop_loss_n设置范围:[ 0.5 1. 1.5]
之前小节构造因子对象的序列使用字典形式装载参数和class,如下所示
{'stop_loss_n': 1.0, 'stop_win_n': 3.0,
'class': AbuFactorAtrNStop},
上面sell_atr_nstop_factor_grid使用类似的方法构造字典对象,区别就是所有字典中的元素都变成可迭代的序列了。
使用类似的方式设置AbuFactorPreAtrNStop与AbuFactorCloseAtrNStop参数设置范围,如下所示:
close_atr_range = np.arange(1.0, 4.0, 0.5)
pre_atr_range = np.arange(1.0, 3.5, 0.5)
sell_atr_pre_factor_grid = {
'class': [AbuFactorPreAtrNStop],
'pre_atr_n' : pre_atr_range
}
sell_atr_close_factor_grid = {
'class': [AbuFactorCloseAtrNStop],
'close_atr_n' : close_atr_range
}
print('暴跌保护止损参数pre_atr_n设置范围:{}'.format(pre_atr_range))
print('盈利保护止盈参数close_atr_n设置范围:{}'.format(close_atr_range))
暴跌保护止损参数pre_atr_n设置范围:[ 1. 1.5 2. 2.5 3. ]
盈利保护止盈参数close_atr_n设置范围:[ 1. 1.5 2. 2.5 3. 3.5]
在参数参数设置范围确定了的前提下即可以开始对参数进行组合,代码如下所示:
sell_factors_product = ABuGridHelper.gen_factor_grid(
ABuGridHelper.K_GEN_FACTOR_PARAMS_SELL,
[sell_atr_nstop_factor_grid, sell_atr_pre_factor_grid, sell_atr_close_factor_grid])
print('卖出因子参数共有{}种组合方式'.format(len(sell_factors_product)))
print('卖出因子组合0: 形式为{}'.format(sell_factors_product[0]))
卖出因子参数共有477种组合方式
卖出因子组合0: 形式为[{'class': <class 'abupy.FactorSellBu.ABuFactorAtrNStop.AbuFactorAtrNStop'>, 'stop_loss_n': 0.5, 'stop_win_n': 2.0}, {'class': <class 'abupy.FactorSellBu.ABuFactorPreAtrNStop.AbuFactorPreAtrNStop'>, 'pre_atr_n': 1.0}, {'class': <class 'abupy.FactorSellBu.ABuFactorCloseAtrNStop.AbuFactorCloseAtrNStop'>, 'close_atr_n': 1.0}]
上述代码使用ABuGridHelper.gen_factor_grid对参数进行组合,结果共组合出477种包括不同参数的组合,不同因子的组合,也有完全不使用任何因子的组合。
相似方式使用ABuGridHelper生成不同买入参数的因子排列组合, 这里只使用42日、60日作为备选参数。读者可使用类似bk_days = np.arange(20, 130, 10)方式生成更多的买入参数,更可以自己实现其它的买入策略与AbuFactorBuyBreak一同做grid,但是在之后阶段运行Grid Search速度就会越慢。
buy_bk_factor_grid1 = {
'class': [AbuFactorBuyBreak],
'xd': [42]
}
buy_bk_factor_grid2 = {
'class': [AbuFactorBuyBreak],
'xd'