参数优化目的
我们在进行策略编写时,很容易受到参数调整的困扰,比如说双均线策略,到底长短均线的周期怎么来定义?“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(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
为参数。
回测报告指标主要有:
名称 | 含义 |
---|---|
account_id | 策略ID |
pnl_ratio | 累计收益率 |
pnl_ratio_annual | 年化收益率 |
sharp_ratio | 夏普比率 |
max_drawdown | 最大回撤率 |
open_count | 开仓次数 |
close_count | 平仓次数 |
win_count | 盈利次数 |
lose_count | 亏损次数 |
win_ratio | 胜率 |
循环输入参数回测
这里我们以双均线策略为例:
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)
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格式:
=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')
=final_report.sort_values(axis=0, ascending=False, by='pnl_ratio')
我们这里以'pnl_ratio'
降序排列为例,如果想升序排列,可将ascending=False
改为ascending=True
。
文章来源:掘金量化 转载请注明出处!