投資戦略のバックテストを行なうのは大変ですよね。そんな時は、既存のライブラリを使うと簡単にそして、高速に行なえます。今回は、バックテスト用のPythonライブラリであるBacktesting.pyのBacktestクラスについて内容を公式ドキュメントに基づいて見ていきたいと思います。目次Backtestクラスの使い方Backtestクラスは以下のように使います。bt.run()bt.plot()上記を実行すると、以下のように過去データに基づいた投資戦略・手法のパフォーマンスを可視化できます。objectBacktestのインスタンス化の際に指定している引数や、そのあとに使用しているrun、plotメソッドなどについて、以下で解説していきます。exclusive_orders=False)Backtestのインスタンス化の際に指定できるパラメータとその内容は以下の通りです。datadataには、バックテストに用いる過去の価格データフレーム(pd.DataFrame)を指定します。注意点としては、Open、High、Low、Closeを含んでおく必要があり、それぞれのカラム名も頭文字は大文字で設定しておく必要があります。‘Volume’」というエラーが返ってきます。上記のOHLCデータ以外にも、任意でVolumeデータを渡すこともできます。任意のカラムも付与可能また、上記OHLCV以外にも、自身のストラテジーで使用する独自のカラム(例えば期間20の移動平均を格納したma20カラムなど)もデータフレームに付与しておけます。インデックスはdatetimeまたは0~の数値dataに渡すデータフレームのインデックスはtimestampまたは0以上の連続した数値のどちらでも使用できます。strategystrategyには、Strategyクラスを継承したサブクラスを指定します。トマトソース注意点としては、インスタンスではなくクラス名を記載するという点です。cashcashには、最初の残高を指定します。単位としてはdataとして渡す通貨の単位に合わすとよいと思います。トマトソースBTCUSDTの場合はUSDの単位で。BTCJPYの場合はJPYの単位でという感じです。commisioncommisionには、取引所の手数料を指定します。1%の手数料の場合は、0.01と指定します。トマトソーススプレッドを考慮したバックテストを行ないたい場合は、このcommisionの数値を調節することで対応できます。平均スプレッドがask価格の0.2%だとした場合は、0.0002と指定することである程度のスプレッドを見積もったバックテストを行なえます。marginmarginには、レバレッジを指定します。指定の仕方は、レバレッジ数ではなくレバレッジ比率を指定します。50倍のレバレッジの場合0.02(1/50)を指定します。trade_on_closetrade_on_closeでは、成行き注文の実行タイミングを変更できます。Trueに設定した場合は、次のローソク足の始値ではなく、その足の終わりで約定するようになります。デフォルトはFalseで、その場合は該当のローソク足の終値ではなく次の足の始値で約定になります。hedginghedgingでは両建ての有無の指定を行なえます。Trueに設定した場合は、両建てを行うことができます。デフォルトのFalseの場合は、FIFO注文として反対ポジションを保有している場合に新規注文とならず、保有している古い反対ポジションから順に決済されるようになります。exclusive_ordersexclusive_ordersでは、各注文時にポジションを閉じるか否かの設定を行なえます。Trueに設定すると各新規注文時に保持しているポジションを解消してから、新しく注文を行ないます。トマトソースドテンのシュミレーションを行う場合には、これが使えそうですね。Backtestクラスのメソッド3つBacktestクラスのメソッドは以下の3つです。Backtestクラスのメソッドrunplotoptimizeそれぞれ簡単に解説していきます。open_browser=True)plotでは、バックテストの経過を可視化できます。指定できるパラメータはいろいろとありますが、重要そうなものは以下の通りです。バックテストの結果を指定できます。指定しない場合は最後にrunした結果が使用されます。HTMLとして保存するパスを指定できます。デフォルトではstrategy/parameter-dependentファイルが現在のワーキングディレクトリに保存されます。プロットの幅を指定します。デフォルトでは100%が指定されています。イクイティ(開始残高+アセット)を描写の有無を指定します。Trueにしておくことで資産の変動が描写されます。リターンの描写有無を指定します。損益(P/L)の描写の有無を指定します。volumeを描写有無を指定します。volumeの描写にはVolume情報をデータフレームに渡しておく必要があります。ドローダウンの描写有無を指定します。イクイティの%表示に指定します。上記以外のパラメータについては公式ドキュメントをご参照ください。**kwargs)runでは、バックテストの実行を行ないます。返却値として結果と統計データがpd.Seriesで返ってきます。トマトソースちなみに、**kwargsはストラテジーのパラメータとして解釈されるようです。**kwargs)optimizeでは、ストラテジーのパラメータの最適値を探索できます。optimize関数に指定できるパラメータと内容は以下の通りです。最適化する際にどの値を最大化するかを指定します。Strategy.run()で返却されるpd.Seriesのキーを指定できます。gridまたはskoptを指定します。・gridでは、パラメーターの組み合わせの直積にわたる網羅的(またはランダムな)検索が実行されます。・最大でmax_triesの評価を行い、モデルベースの最適化を使用して近似最適な戦略パラメーターを見つけます。実行最大回数を指定します。methodがgridの場合は、最大回数を指定することでランダムグリッドサーチが実行されるようになります。最適化するパラメータのコンビネーションの制約を指定します。p.sma2)この場合は、sma1が10とsma2が10の場合のパターンは実行されません。パラメータのコンビネーションのヒートマップを返却するか否かを指定します。methodがskoptの場合、scipy.optimize.OptimizeResultも返却されます。最適化の結果を再現したい場合は、固定の整数をこのパラメータに指定します。bt.run()bt.plot()今回は、仮想通貨や株式、為替などのストラテジーのパフォーマンスを確認できるバックテストを行なえるPythonライブラリ『Backtesting.py』のBacktestクラスについて解説しました。これがあると、わざわざ自分でバックテストのコードを書かずに、気軽にバックテストできるのでかなり良いですね。