Day16 - Shioaji X Backtesting - 参数最佳化

上一篇介绍如何在Backtesting写策略,这篇会和大家介绍如何做参数的最佳化。

什麽是参数最佳化呢?简单来说就是找到一个参数,能让「(目标)」(最佳)。
而这个「结果(目标)」可以是胜率、最後帐户总净值、Sharpe Ratio等等,
根据不同的目标做参数的最佳化,很可能会得到不一样的参数喔!

拿上一篇的策略来做参数最佳化,看看2330用哪条均线能让帐户总净值最高。

#这边会将均线参数从2~240去跑跑看这239个参数中哪一个能让最後帐户总净值最高
stats = bt.optimize(n1=range(2, 241, 1),maximize='Equity Final [$]')
stats

来看看根据「期末帐户总净值(Equity Final [$])」最佳化後的结果吧:

Out:
---------------------------------------------
Start                     2020-01-02 00:00:00
End                       2021-09-22 00:00:00
Duration                    629 days 00:00:00
Exposure [%]                        56.915739
Equity Final [$]                 16862.610291
Equity Peak [$]                  22388.556221
Return [%]                          68.626103
Buy & Hold Return [%]               72.861357
Max. Drawdown [%]                  -24.682011
Avg. Drawdown [%]                   -4.579849
Max. Drawdown Duration      244 days 00:00:00
Avg. Drawdown Duration       29 days 00:00:00
# Trades                                    9
Win Rate [%]                        22.222222
Best Trade [%]                      93.488372
Worst Trade [%]                      -3.02392
Avg. Trade [%]                       9.078804
Max. Trade Duration         296 days 00:00:00
Avg. Trade Duration          40 days 00:00:00
Expectancy [%]                      11.798029
SQN                                  0.744065
Sharpe Ratio                          0.28662
Sortino Ratio                        8.522299
Calmar Ratio                         0.367831
_strategy                        OneMA(n1=76)
dtype: object

下图是优化前(60MA)和优化後(76MA)比较图,

从图中可以发现:(红色框部分)
期末帐户总净值:从15061->16862,
总报酬率:从50.6%->68.6%,
Sharpe Ratio和Sortino Ratio也都有成长,

但绿色框的胜率变低了,这也是上面提的,参数仅会根据你的目标做最佳化,未必所有数据都变好。

将目标改成胜率,看看过去这段期间2330用哪条均线能让策略的胜率最高。

#这边会将均线参数从2~240去跑跑看这239个参数中哪一个能让最後帐户总净值最高
stats = bt.optimize(n1=range(2, 241, 1),maximize='Win Rate [%]')
stats

来看看根据「胜率(Win Rate [%])」最佳化後的结果吧:

Out:
---------------------------------------------
Start                     2020-01-02 00:00:00
End                       2021-09-22 00:00:00
Duration                    629 days 00:00:00
Exposure [%]                        52.941176
Equity Final [$]                 12581.739697
Equity Peak [$]                  14826.858424
Return [%]                          25.817397
Buy & Hold Return [%]               72.861357
Max. Drawdown [%]                   -18.72214
Avg. Drawdown [%]                   -5.958689
Max. Drawdown Duration      244 days 00:00:00
Avg. Drawdown Duration       50 days 00:00:00
# Trades                                    1
Win Rate [%]                            100.0
Best Trade [%]                      28.560535
Worst Trade [%]                     28.560535
Avg. Trade [%]                      28.560535
Max. Trade Duration         333 days 00:00:00
Avg. Trade Duration         333 days 00:00:00
Expectancy [%]                            NaN
SQN                                       NaN
Sharpe Ratio                              NaN
Sortino Ratio                             NaN
Calmar Ratio                         1.525495
_strategy                       OneMA(n1=171)
dtype: object

从上面的数据可以发现:

使用171MA,策略胜率来到了100%,虽然报酬率有25.8%,

但交易次数只剩一次,但很明显是overfitting的结果,并不适合拿来使用。

以上就是针对用backtesting回测框架的简介,

过几天会再和大家分享如何写MACD和RSI的策略,请大家持续关注我们唷!


<<:  用React刻自己的投资Dashboard Day16 - react-router-dom让SPA也有路由

>>:  Day19 Analysis of Algorithms(Ⅰ)

[重构倒数第01天] - Vue的表单自动暂存

前言 该系列是为了让看过Vue官方文件或学过Vue但是却不知道怎麽下手去重构现在有的网站而去规画的系...

Day3 安装 Laravel + Composor

其实我超级犹豫要不要写这篇的主题,但最後还是决定写了,如果不需要快速跳过就好XD 犹豫的原因是因为只...

Day08 - 实作一个状态机 - 1

根据需求画出状态图後 他们都有一个初始状态 整个实体、物件或是对象,都有一系列不同的状态们 还有一系...

Day 22: Behavioral patterns - Mediator

目的 当系统内的物件们各自沟通的情况日益严重时,建立一个负责沟通的集中所,让元件们不在「直接」,而是...

day31 虽然没有写完,但是还是要有summary

第一次写文章,其实我没有什麽自信能够写得好,毕竟我一直都不够厉害,所以也觉得自己没能写出什麽;後来真...