【Python】株価データのバックテストを行う(準備編)
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つの問題がありました。
- BokehDeprecationWarning の警告が表示される。
DatetimeTickFormatter のフォーマット設定方法に関する警告。
BokehJSのバージョンアップ(2.x.x ⇒3.x.x)が原因の模様。 - グラフは表示されるが計算結果が表示されない。
print文を追加すると表示される。 - 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()
次の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 に記載されている最適化の方法も動作は確認できたので、これから使い方を確認していきます。