見出し画像

米株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を今後は使っていきます。

投資信託のデータ取得ですが、データベースからダウンロードする方法をご紹介いたします。投資信託協会の投信総合検索ライブラリーを使います。

上記のサイトにアクセス後、「キーワードで探す」に入力し、検索ボタンを押します。

画像1

検索後、データを取得したい投資信託を選びます。

画像2

このように投資信託を選ぶと

画像3

下にスクロールすると「基準価格のダウンロード」ボタンがあります。

画像4

もちろん、クリックするとダウンロードするのですが、このリンクを取得します。ボタンの上で右クリックし、「リンクのアドレスをコピー」します。

画像5

コピー後、コードに張り付けると、このような文字になります。

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

実行結果はこちら

画像7

それではこの情報を使って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

実行結果は以下の通りです。

画像7

さらに、こちらを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

実行結果はこちら

画像13

これでパフォーマンス比較チャートを作りますが、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からのデータに修正されてます)

画像13

これでデータはできましたので、パーセンテージに変更、パフォーマンス順に並べなおしてチャート出力します。

比較データをチャート出力

チャートを出力するフルコードは以下の通りです。(修正:投資信託の約定日は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()

実行結果はこちら

画像13

実は、こちらは為替変動を考慮しておりません。またETFでは配当金がでますが、そちらも考慮しておりません。

課題

比較対象をVTI、QQQなどに変更してグラフを作ってみてください。

為替手数料を考慮したチャート比較

これでは投資信託の方がパフォーマンスが良いと思われますが、実際比較対象の2020/9/21現在の為替レートは1ドル106.14円、現在2021/9/10は1ドル109.78円と3.429%も上がっております。また、投資信託は配当金は出ませんが、運用会社が内部的に再投資しておりますが、数字で正確に確認してみます。

為替を考慮した場合のパフォーマンス

画像13

ETFのパフォーマンスが投資信託に近づいてきました。ただし、ETFは配当金が出ており、投資信託は配当金が出ておりません。

為替を考慮し、配当金を再投資した場合のパフォーマンス

画像13

と、配当金を考慮しても投信の方がパフォーマンスが良いと言うことになります。(^GSPCは指数そのものなので配当金はありません)ちなみに、信託報酬は既にチャートの価格に入っております。

また、主要ETFをETFと投資信託で比べた比較は以下になります。コードは有料部分で公開しております。(為替、分配金も考慮)

画像13

この為替・配当金を考慮したコードのみ有料にしておりますので、私にコーヒーでもおごっていただける方はよろしくお願いいたします。これらを計算したコードは以下の通りになります。

ここから先は

20,529字 / 1画像

¥ 150

サポートいただけますと、うれしいです。より良い記事を書く励みになります!