こんにちは、FXに限らず株取引や商品先物取引などトレーダーにとって重要なのは戦略のバックテストですよね。今日はPythonのBacktraderライブラリを使って簡単にバックテストができる方法をご紹介します。
ライブラリのインポートとデータのダウンロード
今回はBacktraderをインポートするのと、アップル株の過去一年間のデータをダウンロードしましょう。ここでのポイントはDataframeでは無くPandasDataという形にデータを変換してあげる必要がある、ということです。二つの違いについては別記事でご紹介します。
import backtrader as bt
import datetime
import yfinance as yf
tickers = ["AAPL"]
df = yf.download(tickers, period="1y")
data = bt.feeds.PandasData(dataname=df)
取引戦略の作成
今回はゴールデンクロスで買ってデッドクロスで売る簡単な戦略を書いてみました。短気は10日、長期は30日の単純移動平均線を使っています。
class MovingAverageCrossStrategy(bt.Strategy):
params = (
('short_window', 10),
('long_window', 30),
)
def __init__(self):
self.sma_short = bt.indicators.SimpleMovingAverage(
self.data.close, period=self.params.short_window, plotname='SMA Short')
self.sma_long = bt.indicators.SimpleMovingAverage(
self.data.close, period=self.params.long_window, plotname='SMA Long')
# 最長の移動平均に合わせてminperiodを設定
self.sma_long.plotinfo.plotlinelabels = True
self.sma_short.plotinfo.plotlinelabels = True
self.buysig = bt.indicators.CrossOver(self.sma_short, self.sma_long)
def next(self):
# ゴールデンクロス
if self.sma_short[0] > self.sma_long[0] and self.sma_short[-1] <= self.sma_long[-1]:
self.buy()
# デッドクロス
elif self.sma_short[0] < self.sma_long[0] and self.sma_short[-1] >= self.sma_long[-1]:
self.sell()
バックテスト環境の整備、実行
ここでは初期金額や手数料(コミッション)の設定を行います。最後のPlotで結果が表示されます。
# バックテスト環境の作成
cerebro = bt.Cerebro()
# 戦略の追加
cerebro.addstrategy(MovingAverageCrossStrategy)
# データフィードの追加
cerebro.adddata(data)
# 初期投資金額の設定
cerebro.broker.setcash(100000.0)
# コミッションの設定
cerebro.broker.setcommission(commission=0.001)
# バックテストの実行
cerebro.run()
# 最終的なポートフォリオの価値を出力
今回の短銃な戦略では微妙に負ける結果になってしまいましたね!ただこのBacktraderのいいところは様々なパラメーター(今回で言えば移動平均の日数など)を変えて簡単に何回でもバックテストできるところです。さらに今回はいわゆるトリガーの部分しか書いていませんがセットアップ(環境認識)を追記することも可能です。
皆さんも是非このコードをコピーして遊んでみてくださいね!
以下、是非クリックお願いします。
参考サイト