Backtesting.py プルバックシステム パラメータを最適化する方法

スポンサーリンク
スポンサーリンク
スポンサーリンク

はじめに

前回、紹介した Backtesting.pyでプルバック戦略を使ったバックテストプログラムを最適化してみた。銘柄は 1475  iシェアーズ・コア TOPIX ETF  1株価格が3000円未満 かつ 1株単位で買えます。
といっても、前回紹介したプログラムに少し手を加えるだけです。

Backtesting.py プルバックシステムの実装
Python,

 

実際のプログラム

#一つ上のディレクトリにある、自作のライブラリを読み込む仕組み
import sys
import os
sys.path.append(os.path.abspath(‘.’))
#ここから backte
from backtesting import Backtest, Strategy
from backtesting.test import SMA
import pandas as pd
import Kabu
df = Kabu.read_kabu_cache(‘1475.T’,‘2022-01-01’,‘2024-04-01’)
def low_x(close,n):
    ret = pd.Series(close).rolling(window=n).min()
    return ret
def high_x(close,n):
    ret = pd.Series(close).rolling(window=n).max()
    return ret
class PullbackStrategy(Strategy):
    n = 5
    m = 10
    def init(self):
        # 50日SMA
        self.sma50 = self.I(SMA, self.data.Close, 50)
        # 過去5日間の最安値
        self.low5 = self.I(low_x,self.data.Close,self.n)
        # 過去20日間の最高値
        self.high20 = self.I(high_x,self.data.Close,self.m)
    def next(self):
        # 現在の価格が50日SMAより上で、かつ過去5日間の新しい安値である場合に購入
        if self.data.Close[1] > self.sma50[1]:
            if self.data.Close[1] == self.low5[1]:
                self.buy(size=1)
        #保有中のポジションがあり、その価格が20日間の最高値に達した場合、ポジションをクローズ
        elif self.position:
            if self.data.Close[1] >= self.high20[1]:
                self.position.close()
       
       
bt = Backtest(df, PullbackStrategy, cash=10000) #, commission=0.0012)
#output = bt.run()
output = bt.optimize(n=range(2,10,1), m=range(5,30,5))
print(output)
#戦略の結果だけ出力する
print(output._strategy)
# オプション:バックテストの結果を図示
bt.plot()
input()

 

解説

output = bt.optimize(n=range(2,10,1), m=range(5,30,5))

class PullbackStrategy の宣言のあとに、

n = 5 で過去5日間の安値を
m = 20 で過去20日間の高値を指定しています。
n = range(2,10,1) で 2から10までで1刻みでnの値を増やしていきます。
m = range(5,30,5)で  5から30まで5刻みでmの値を増やしていきます。

以上の条件で、n と mの値を変化させて、最も利益率の高い組み合わせを探してくれます。

print(output._strategy)

n m の組み合わせの値を表示してくれます。この1行がないと、表示が見切れてしまい最適な組み合わせが見れなかったりします。

結果

Start 2022-01-04 00:00:00
End 2024-04-01 00:00:00
Duration 818 days 00:00:00
Exposure Time [%] 88.52459
Equity Final [$] 14405.0
Equity Peak [$] 14601.0
Return [%] 44.05
Buy & Hold Return [%] 35.093615
Return (Ann.) [%] 18.238847
Volatility (Ann.) [%] 15.482452
Sharpe Ratio 1.178033
Sortino Ratio 2.092337
Calmar Ratio 2.347042
Max. Drawdown [%] -7.770994
Avg. Drawdown [%] -2.255028
Max. Drawdown Duration 112 days 00:00:00
Avg. Drawdown Duration 23 days 00:00:00
# Trades 5
Win Rate [%] 100.0
Best Trade [%] 47.54522
Worst Trade [%] 43.179539
Avg. Trade [%] 45.242181
Max. Trade Duration 725 days 00:00:00
Avg. Trade Duration 676 days 00:00:00
Profit Factor NaN
Expectancy [%] 45.250874
SQN 82.724333
_strategy PullbackStrategy…
_equity_curve Equ…
_trades Size EntryBa…
dtype: object
PullbackStrategy(n=9,m=20)

n=9 m=20 の組み合わせで、
Buy & Holdが35%のリターンに対して 44%のリターンになっています。

あとは、ウォークフォワードテストを行って、最適化されていない組み合わせを探していく感じでしょうか?

 

 

 

スポンサーリンク
スポンサーリンク
開発
スポンサーリンク
アパトサウルスをフォローする
アパトサウルスのブログ(令和な日々改め)

コメント

タイトルとURLをコピーしました