backtesting.pyを使って、ビットコインをゴールデンクロスで買って、デッドクロスで売ったら、儲かるか?のバックテスト
公式HP
https://kernc.github.io/backtesting.py/
1 |
pip3 install backtesting |
ビットコインをゴールデンクロスで買って、デッドクロスで売ったら、儲かるか?のバックテスト
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
# ライブラリ from backtesting import Backtest, Strategy from backtesting.lib import crossover from backtesting.test import SMA, GOOG import requests from datetime import datetime import pandas as pd # Cryptowatchから価格データ取得。1分足(60秒)で過去1000分(16時間40分)がもらえる response = requests.get("https://api.cryptowat.ch/markets/bitflyer/btcfxjpy/ohlc",params = { "periods" : 60 }).json() # データフレームの列名は"Time"、"Open"、"High"、"Low"、"Close"である必要がある。 df_columns = [ "Time", "Open", "High", "Low", "Close", "Volume", "QuoteVolume" ] # ベクトル化(pandasのデータフレーム化)して、for文を使わなくても、SQLのUPDATE文みたいに一気に更新できるのが便利! df = pd.DataFrame(response['result']['60'], columns=df_columns) # Time列は文字列だとうまくいかないので、日付型にして投入する df['Time'] = pd.to_datetime(df['Time'].astype(int), unit='s') # 変換したら、インデックスである事を明示する必要がある df.set_index("Time", inplace=True) # 売買アルゴリズム(SMA = Simple Moving Average = 単純移動平均線) class SmaCross(Strategy): n1 = 25 # 短期 n2 = 75 # 長期 # 初期化 def init(self): close = self.data.Close # 基準は終値 self.sma1 = self.I(SMA, close, self.n1) # 短期の移動平均線を生成 self.sma2 = self.I(SMA, close, self.n2) # 長期の移動平均線を生成 # 各レコードでの売買判定 def next(self): # ゴールデンクロスなら買い if crossover(self.sma1, self.sma2): self.buy() # デッドクロスなら売り elif crossover(self.sma2, self.sma1): self.sell() # バックテストの設定 bt = Backtest(df, # 検証データ SmaCross, #売買アルゴリズム cash=123456789, #投資金額(USドル) commission=.002, #手数料 exclusive_orders=False) #自動でポジションをクローズ(オープン) # バックテスト実行 output = bt.run() # 結果 print(output) # グラフ出力(HTMLファイル) # bt.plot() |
結果は、マイナス1%やな…。
Buy & Hold Return [%] 1.89312
だから、ガチホしてたらプラス2%弱…。
Start 2023-01-16 15:11:00
End 2023-01-17 08:01:00
Duration 0 days 16:50:00
Exposure Time [%] 90.2
Equity Final [$] 1.22173e+08
Equity Peak [$] 1.23459e+08
Return [%] -1.03992
Buy & Hold Return [%] 1.89312
Return (Ann.) [%] 2.49521
Volatility (Ann.) [%] NaN
Sharpe Ratio NaN
Sortino Ratio inf
Calmar Ratio 1.10447
Max. Drawdown [%] -2.2592
Avg. Drawdown [%] -1.21748
Max. Drawdown Duration 0 days 15:10:00
Avg. Drawdown Duration 0 days 07:37:00
# Trades 1
Win Rate [%] 0
Best Trade [%] -1.06017
Worst Trade [%] -1.06017
Avg. Trade [%] -1.06017
Max. Trade Duration 0 days 15:12:00
Avg. Trade Duration 0 days 15:12:00
Profit Factor 0
Expectancy [%] -1.06017
SQN NaN
_strategy SmaCross
_equity_curve …
_trades Size EntryBa…
dtype: object