量化投资:第7节 寻找策略最优参数和评分

本文详细介绍了在量化投资中如何寻找策略的最优参数。通过Grid Search方法,结合蒙特卡洛算法和最优化方法,确定AbuFactorAtrNStop等策略参数的最佳设置。在设定参数范围后,通过组合不同参数并使用ABuGridHelper进行计算,找出最佳的因子组合。此外,文章还探讨了评分标准,如胜率、夏普比率、投资回报和最大回撤,并强调了自定义评分类的重要性。最后,提醒读者注意历史数据拟合的局限性,强调在参数优化中要避免过度拟合,理解参数选择的统计意义。
摘要由CSDN通过智能技术生成

阿布量化版权所有 未经允许 禁止转载

abu量化系统github地址(欢迎+star)

本节ipython notebook

上一节主要讲解了如何使用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'
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值