AIとファイナンス

AIとファイナンスの架け橋、それがこのブログの目指すところです。兼業投資家向けに、Pythonを駆使して株やFXの分析を「自分で」行えるようになるための情報を提供します。ニューラルネットワークを活用した市場予測から、実証済みの金融理論まで、全てのコードを公開し、誰もが活用できるように!是非色々なコードで遊んでみてください!

【FX】Backtraderで自分の戦略をバックテストしよう!【テクニカル分析】

こんにちは、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()

# 最終的なポートフォリオの価値を出力
print(f'Final Portfolio Value: {cerebro.broker.getvalue()}')

結果

今回の短銃な戦略では微妙に負ける結果になってしまいましたね!ただこのBacktraderのいいところは様々なパラメーター(今回で言えば移動平均の日数など)を変えて簡単に何回でもバックテストできるところです。さらに今回はいわゆるトリガーの部分しか書いていませんがセットアップ(環境認識)を追記することも可能です。
皆さんも是非このコードをコピーして遊んでみてくださいね!

以下、是非クリックお願いします。

 

参考サイト

https://www.backtrader.com/