💰

[Package] yfinanceを使ったS&P500の簡単なバックテスト(つみたて投資)

2023/01/19に公開

TL; DR

  • yfinanceを使ってS&P500の毎月の評価額と日本円⇔ドルの為替情報を取得した
  • 理想状況(手数料・税金なし)で毎月一定の日本円をS&P500に積み上げたときの評価額をプロットした
  • 自分で最強の資産運用バックテストを書こう

背景

Kindle版でSoft Skillsの第1版を昔読んだのですが、第2版を最近紙で入手しました。心穏やかに生活するには投資も大事だな、と思って記事と書き捨てのスクリプトを書きました。

https://amzn.to/3CVAJAk

資産運用の真面目な話はこちらの記事を読んでください。

https://hayatoito.github.io/2020/investing/

問題設定

この記事の問題設定です(これは理想的な状況なので、現実には不可能です)。

  • S&P500(に連動する何かを理想的な状況で)を円で買えると仮定する
  • 毎月 50,000 円分の日本円を積み立てる

金融庁のページを使って、簡単なシミュレーションを見ます。

https://www.fsa.go.jp/policy/nisa2/moneyplan_sim/index.html

毎月5万円、平均の想定利回りが8%とし、25年積み立てるとします。最終積立金額は 47,551,320円 になるそうです。25125=1,500万円なので、約3倍ということになりますね。

yfinanceを使って毎月の評価額を取得する

yfinanceのTickerとhistoryを使って取得します。コードはこれを使いました。

  • S&P500: ^GSPC
  • 円⇔ドル: JPY=X

25年前なので、1998年の1月から、毎月1日のデータを取得します。こういう感じで取得します。

import yfinance as yf
ticker = yf.Ticker("^GSPC")
df = ticker.history(period="max", interval="1mo", start="1998-1-1")

中身はこういうデータになっています。

Date Open High Low Close Volume Dividends Stock Splits
1998-01-01 00:00:00-05:00 970.43 992.65 912.83 980.28 1.27338e+10 0 0
1998-02-01 00:00:00-05:00 980.28 1051.66 980.28 1049.34 1.16566e+10 0 0
1998-03-01 00:00:00-05:00 1049.34 1113.07 1030.87 1101.75 1.37196e+10 0 0
1998-04-01 00:00:00-05:00 1101.75 1132.98 1076.7 1111.75 1.36561e+10 0 0
1998-05-01 00:00:00-04:00 1111.75 1130.52 1074.39 1090.82 1.14771e+10 0 0
1998-06-01 00:00:00-04:00 1090.82 1145.15 1074.67 1133.84 1.3552e+10 0 0
1998-07-01 00:00:00-04:00 1133.84 1190.58 1114.3 1120.67 1.41948e+10 0 0

それぞれこういう意味のデータが取得されます。S&P500なので関係ないところもありますね(おそらく)。

  • Open:その日の始値
  • High:その日の最高値
  • Low:その日の最安値
  • Close:その日の終値
  • Volume:その日の取引量
  • Dividends:配当金
  • Stock Splits:株式分割数

最高値(High)を雑にグラフにするとこういう感じです。どこかで見たことある感じのグラフですね。

積立

この記事では、各月1日目の平均的な値として Low + (High - Low) / 2 を計算します。単位はドルなので、JPY=Yから1ドルの円価格を同様に取得して、円単位に換算したりしています(細かい実装は適当)。やったことですが

  • 毎月5万円積み立てる
  • 5万円分のドルで買える分だけS&P500を適当な単位で購入して貯めていく
  • 各累積した購入単位数を各月の円換算で比較する

やった結果です。赤いプロットは毎月5万円積立した金額で、最後は1500万円になります。黄色いプロットは積み立てたS&P500を円で評価した金額で、この場合だと5000万円を少し超えているように見えますね(理想的な状況でしたか)。

まとめ

続きません。書き捨てたプログラムはこちらです。

https://github.com/cocomoff/simplest-backtest-using-yfinance

Discussion