掘金社区
参数优化目的
我们在进行策略编写时,很容易受到参数调整的困扰,比如说双均线策略,到底长短均线的周期怎么来定义?“5日线”和“10日线”组合一定是最好的吗?如果多次回测,怎么记录回测结果?
带着这些疑问,我们来共同探讨掘金量化3的参数优化示例程序。
参数优化思想
我们将心目中的参数进行循环遍历回测,记录每次回测结果和参数,然后就可以根据某种规则将回测结果排序,这样就可以找到最好的参数了,当然,建议不要用“最好”的参数,因为可能会出现“过拟合”问题。
参数优化实现步骤
基础配置
- 首先,需要有个策略(init函数和on_bar(tick)函数或algo函数),策略里面有参数可以调整(废话)。
- 将两个策略函数复制进示例程序中替代示例策略。
- 调整run里面回测的各个参数。
记录每次回测结果
def on_backtest_finished(context, indicator):
report=[indicator['pnl_ratio'],indicator['pnl_ratio_annual'],indicator['sharp_ratio'],indicator['max_drawdown'],context.short,context.long]
context.list.append(report)
定义on_backtest_finished函数,report里面需要添加你想看到的回测报告指标以及输入的参数,context.short,context.long为参数。
回测报告指标主要有:
循环输入参数回测
这里我们以双均线策略为例:
for short in range(5,10,2):
for long in range(10,21,5):
process=multiprocessing.Process(target=run_strategy, args=(short,long,a_list))
short和long长短周期参数的调整需要循环嵌套,输入进args中,a_list是用来记录回测报告数据的list,必须保留!
def run_strategy(short,long,a_list):
from gm.model.storage import context
context.short=short
context.long=long
context.list=a_list
run(strategy_id='set_strategy_id',
filename='参数优化.py',
mode=MODE_BACKTEST,
token='set_token',
backtest_start_time='2017-05-01 08:00:00',
backtest_end_time='2017-10-01 16:00:00',
backtest_adjust=ADJUST_PREV,
backtest_initial_cash=50000,
backtest_commission_ratio=0.0001,
backtest_slippage_ratio=0.0001)
传入参数时,需要修改策略运行函数的输入参数,并通过context将参数传入策略中,原策略中的参数定义语句需要删除!
结果分析
首先,我们需要把回测报告结果转换成Dataframe格式:
a_list=np.array(a_list)
final_report=pd.DataFrame(a_list,columns['pnl_ratio','pnl_ratio_annual','sharp_ratio','max_drawdown','short','long'])
其中columns需要与之前所获取的回测参数保持一致。
然后,将回测结果按照某种原则进行排序:
final_report=final_report.sort_values(axis=0, ascending=False, by='pnl_ratio')
我们这里以'pnl_ratio'降序排列为例,如果想升序排列,可将ascending=False改为ascending=True。