*** 当サイトはアフィリエイト広告を利用しています ***

【Python】株価データのバックテストを行う(準備編)

2023年8月16日

スポンサーリンク

Pythonを使って株で儲ける勉強を始めたので、その備忘録です。
株価の自動取得ができたので、今回はバックテストを行うために backtesting.py の使い方を覚えていきます。

今回やってみたことは、バックテストを行うための準備として、
・backtesting.pyのインストール
・サンプルプログラムによる動作確認とバックテスト
です。

株価を自動取得する方法はこちらの記事をご覧ください。
関連記事:【Python】株価データを自動で取得する方法

【動作環境】
・Windows11 Home
・Anaconda 2.4.2 / Python 3.9.17
・Jupyter Notebook 6.3.0
・backtesting.py 0.3.3

backtesting.py のインストール

backtesting.py はAnaconda用ライブラリがないので、pipでインストールします。

pip install backtesting

backtesting のサンプルプログラムで動作確認とバックテストをする

PyPI の backtesting ページに掲載されているサンプルプログラムを Jupyter Notebookで確認してみたところ、次の4つの問題がありました。

  1. BokehDeprecationWarning の警告が表示される。
    DatetimeTickFormatter のフォーマット設定方法に関する警告。
    BokehJSのバージョンアップ(2.x.x ⇒3.x.x)が原因の模様。
  2. グラフは表示されるが計算結果が表示されない
    print文を追加すると表示される。
  3. UserWarning:Jupyter Notebook detected. ~ Reset with backtesting.set_bokeh_output(notebook=False). の警告が表示される。
    これは、Jupyter Notebookで実行している場合に backtesting が発する警告です。
    JavaScriptのサポートが不足していると正しく動作しない可能性があるため、その場合は「backtesting.set_bokeh_output(notebook=False)」を追加すると別タブで Bokeh を表示します。
    • OUTPUTの最後にあるSQNの表示内容が違う。

    警告は内容からして無視できそうなので、警告を非表示にして対策します。

    from backtesting import Backtest, Strategy
    from backtesting.lib import crossover
    from backtesting.test import SMA, GOOG
    import warnings#警告をコントロールするライブラリを追加
    
    warnings.filterwarnings("ignore")#警告を非表示に設定
    #backtesting.set_bokeh_output(notebook=False)#表示がうまくいかない場合に追加
    
    class SmaCross(Strategy):
        def init(self):
            price = self.data.Close
            self.ma1 = self.I(SMA, price, 10)
            self.ma2 = self.I(SMA, price, 20)
    
        def next(self):
            if crossover(self.ma1, self.ma2):
                self.buy()
            elif crossover(self.ma2, self.ma1):
                self.sell()
    
    
    bt = Backtest(GOOG, SmaCross, commission=.002,
                  exclusive_orders=True)
    stats = bt.run()
    print(stats)#結果を表示させる
    bt.plot()
    backtenstingサンプルプログラムの結果
    補足

    次の2行を追加してBokehの出力を別にすると、③の警告自体が発生しなくなります。

    from backtesting import set_bokeh_output
    
    set_bokeh_output(notebook=False)

    サンプルデータは、2004年8月19日から2013年3月1日までのGoogleの株価ですね。

    まとめ

    backtesting.py をインストールして、googleの株価データを使ってバックテストをすることができました。

    Quick Start User Guide に記載されている最適化の方法も動作は確認できたので、これから使い方を確認していきます。

    Python

    Posted by Hiro