米株Python [3-3] 投資信託のデータ比較
こんにちわ!トミィ(@toushi_tommy)です!ちょっと間が空きましたが、3章の3回目を始めます。米国インデックスを購入する場合ETFが良いか、投資信託が良いかとよく聞かれますので、簡単に比較するプログラムを作ってみました。今回は、米国株の代表的なインデックス S&P500の比較をしておりますが、他にもナスダック、高配当インデックスなど比較が可能ですので、是非、試してみてください。(9/14修正:ETF株価にAdj Closeを使っていた為、分配金調整後になっておりました。Closeに修正いたしました)
サークルは無料で運営しております。記事内容も無料です。トミィにジュースでもおごってあげようと思った方は投げ銭いただけると、今後の運営の励みになります。(為替、配当金を考慮したコードは有料記事にしております)
投資信託のデータ取得
今まで、米国個別株やETFの株価、その他情報の取得方法を紹介してきました。米国株の場合は、
import yahoo_fin.stock_info as si
import yfinance as yf
のどちらかを使いますが、複数銘柄を一気に取れるyfinanceを今後は使っていきます。
投資信託のデータ取得ですが、データベースからダウンロードする方法をご紹介いたします。投資信託協会の投信総合検索ライブラリーを使います。
上記のサイトにアクセス後、「キーワードで探す」に入力し、検索ボタンを押します。
検索後、データを取得したい投資信託を選びます。
このように投資信託を選ぶと
下にスクロールすると「基準価格のダウンロード」ボタンがあります。
もちろん、クリックするとダウンロードするのですが、このリンクを取得します。ボタンの上で右クリックし、「リンクのアドレスをコピー」します。
コピー後、コードに張り付けると、このような文字になります。
https://toushin-lib.fwg.ne.jp/FdsWeb/FDST030000/csv-file-download?isinCd=JP90C000GKC6&associFundCd=03311187
これを読み込むことで、データが取得できます。こちらを実行してみます。
import pandas as pd
csv_file = 'https://toushin-lib.fwg.ne.jp/FdsWeb/FDST030000/csv-file-download?isinCd=JP90C000GKC6&associFundCd=03311187'
data = pd.read_csv(csv_file, index_col=0, encoding='SHIFT-JIS')
data
実行結果はこちら
それではこの情報を使ってETFと比較してみます。
投資信託とETFの比較
せっかくですので、S&P500インデックスで人気の複数投資信託を取得します。代表的なS&P500として、
「eMAXIS Slim米国株式(S&P500)」
「SBI・V・S&P500インデックス・ファンド」
を使います。使いたいデータは基準価格のみ(分配金は出ない為)ですので、以下のコードを使って、データを取得、さらにマージしてみます。以下のコードを実行してみてください。(日付のフォーマットを変更、いらないデータを削除してます)
import pandas as pd
from datetime import datetime as dt
toushin = {'https://toushin-lib.fwg.ne.jp/FdsWeb/FDST030000/csv-file-download?isinCd=JP90C000GKC6&associFundCd=03311187':'投信:eMaxisS&P500',
'https://toushin-lib.fwg.ne.jp/FdsWeb/FDST030000/csv-file-download?isinCd=JP90C000J569&associFundCd=89311199':'投信:SBI VOO'}
df_toushin = pd.DataFrame()
for i in range(len(list(toushin.keys()))):
data = pd.read_csv(list(toushin.keys())[i], index_col=0, encoding='SHIFT-JIS')
data['Date'] = [s for s in [dt.strptime(str(s), '%Y年%m月%d日') for s in list(data.index)]]
data.set_index('Date', inplace=True)
data = data.rename(columns={'基準価額(円)':toushin[list(toushin.keys())[i]]})
data.drop(['純資産総額(百万円)', '分配金', '決算期'], axis=1, inplace = True)
df_toushin = pd.concat([df_toushin, data], axis=1)
df_toushin
実行結果は以下の通りです。
さらに、こちらをETFのデータとマージしてみます。比較するETFはS&P500そのもの(^GSPC)と、主要ETF(VOO,SPY,IVV)になります。過去1年のデータを取得し、マージしてみます。先ほどのコードの後にこちらを追加して実行してみてください。
import sys
sys.path.append('/content/drive/MyDrive/module')
import yfinance as yf
etfs = ['^GSPC','VOO','SPY','IVV']
df_etf = yf.download(etfs, period = '1y')['Close']
df_chart = pd.concat([df_toushin, df_etf], axis=1)
df_chart
実行結果はこちら
これでパフォーマンス比較チャートを作りますが、ETFはデータが無い所がありますので、データが全部出そろう場所からスタートするように変更します。以下のコードを追加し、実行してみてください。(データがすべてが揃う場所を探し、それ以下を削除してます)
# すべてにデータが入っている場所を取得し、最初の日程を検索
df_null = df_chart.isnull().any(axis=1)
df_date = df_null[df_null == False]
first_loc = df_chart.index.get_loc(df_date.index[0])
# データが揃い始める以前のデータを削除
df_chart = df_chart[first_loc:]
df_chart
実行結果はこちら(9/11からのデータに修正されてます)
これでデータはできましたので、パーセンテージに変更、パフォーマンス順に並べなおしてチャート出力します。
比較データをチャート出力
チャートを出力するフルコードは以下の通りです。(修正:投資信託の約定日は1日ずれますので、比較対象も1日ずらすように修正しました)
import sys
sys.path.append('/content/drive/MyDrive/module')
import datetime as datetime
import matplotlib.pyplot as plt
from PIL import Image, ImageDraw, ImageFont
from matplotlib.font_manager import FontProperties
import pandas as pd
import yfinance as yf
import numpy as np
import japanize_matplotlib
import os
from datetime import datetime as dt
# 設定個所 ###################################################
# 比較対象
# S&P500
title = '過去1年「S&P500 ETF・投資信託」の値動き'
etfs = ['^GSPC','VOO','SPY','IVV']
# 投資信託を探すサイト
# https://toushin-lib.fwg.ne.jp/FdsWeb/FDST999900
toushin = {'https://toushin-lib.fwg.ne.jp/FdsWeb/FDST030000/csv-file-download?isinCd=JP90C000GKC6&associFundCd=03311187':'投信:eMaxisS&P500',
'https://toushin-lib.fwg.ne.jp/FdsWeb/FDST030000/csv-file-download?isinCd=JP90C000J569&associFundCd=89311199':'投信:SBI VOO'}
# 1d,5d,1mo,3mo,6mo,1y,2y,5y,10y,ytd,max
df_etf = yf.download(etfs, period = '1y')['Close']
################################################################
################################################################
# フォント
jap_font = '/content/drive/MyDrive/module/japanize_matplotlib/fonts/ipaexg.ttf'
################################################################
df_toushin = pd.DataFrame()
for i in range(len(list(toushin.keys()))):
data = pd.read_csv(list(toushin.keys())[i], index_col=0, encoding='SHIFT-JIS')
data['Date'] = [s for s in [dt.strptime(str(s), '%Y年%m月%d日') for s in list(data.index)]]
data.set_index('Date', inplace=True)
data = data.rename(columns={'基準価額(円)':toushin[list(toushin.keys())[i]]})
data.drop(['純資産総額(百万円)', '分配金', '決算期'], axis=1, inplace = True)
df_toushin = pd.concat([df_toushin, data], axis=1)
# 投資信託は1日ずれる為、値をずらす
df_toushin = df_toushin.shift(-1)
df_chart = pd.concat([df_toushin, df_etf], axis=1)
# すべてにデータが入っている場所を取得し、最初の日程を検索
df_null = df_chart.isnull().any(axis=1)
df_date = df_null[df_null == False]
first_loc = df_chart.index.get_loc(df_date.index[0])
# 最後の投信日以降を消してパフォーマンスを計算
last_loc = df_chart.index.get_loc(df_toushin.index[-2])
# データが揃い始める以前のデータを削除
df_chart = df_chart[first_loc:last_loc+1]
df_chart.interpolate(inplace=True)
# 初日からのパーセントに変更
df_chart = (df_chart/df_chart.iloc[0]-1)*100
# パフォーマンス順に並び替え
df_chart.sort_values(df_chart.index[-1],axis=1,ascending=False,inplace=True)
plt.style.use('default')
fig = plt.figure()
ax = fig.add_subplot(111)
# ラベルに上昇率を追加
for i in range(len(df_chart.columns)):
df_chart.rename(columns={df_chart.columns[i]: df_chart.columns[i]+' ('+'{:+.2f}'.format(df_chart[df_chart.columns[i]].iloc[-1])+'%)'}, inplace=True)
df_chart.plot(ax=ax,grid=True,figsize=(6,3),style='.-').legend(bbox_to_anchor=(1, 1.05), prop=FontProperties(fname=jap_font,size=10))
ax.set_title(title, fontproperties=FontProperties(fname=jap_font,size=16))
ax.set_xlabel('日付', fontproperties=FontProperties(fname=jap_font,size=14))
ax.set_ylabel('増加率 [%]', fontproperties=FontProperties(fname=jap_font,size=14))
plt.show()
実行結果はこちら
実は、こちらは為替変動を考慮しておりません。またETFでは配当金がでますが、そちらも考慮しておりません。
課題
比較対象をVTI、QQQなどに変更してグラフを作ってみてください。
為替手数料を考慮したチャート比較
これでは投資信託の方がパフォーマンスが良いと思われますが、実際比較対象の2020/9/21現在の為替レートは1ドル106.14円、現在2021/9/10は1ドル109.78円と3.429%も上がっております。また、投資信託は配当金は出ませんが、運用会社が内部的に再投資しておりますが、数字で正確に確認してみます。
為替を考慮した場合のパフォーマンス
ETFのパフォーマンスが投資信託に近づいてきました。ただし、ETFは配当金が出ており、投資信託は配当金が出ておりません。
為替を考慮し、配当金を再投資した場合のパフォーマンス
と、配当金を考慮しても投信の方がパフォーマンスが良いと言うことになります。(^GSPCは指数そのものなので配当金はありません)ちなみに、信託報酬は既にチャートの価格に入っております。
また、主要ETFをETFと投資信託で比べた比較は以下になります。コードは有料部分で公開しております。(為替、分配金も考慮)
この為替・配当金を考慮したコードのみ有料にしておりますので、私にコーヒーでもおごっていただける方はよろしくお願いいたします。これらを計算したコードは以下の通りになります。
ここから先は
¥ 150
サポートいただけますと、うれしいです。より良い記事を書く励みになります!