見出し画像

ETF vs 投資信託 比較

こんにちわ!トミィ(@toushi_tommy)です!指数を買うならETFが良いか投資信託が良いかといつも聞かれます。それぞれの長所、短所を紐解き、過去のデータを使った比較を行っていきます。また、正確に配当金を再投資し、毎月積み立て購入した場合の、バックテストで比較します。よくある、経費率などの比較のみではありませんので、今回ズバリ答えが分かると思います。(今回はあくまでもバックテストの比較に重きを置きますので、ETF、投資信託とはの話はしません。また、メリットデメリットはさらっと流す程度です)

記事内容は無料です。私にジュースでもおごってあげようと思った方は投げ銭いただけると、励みになります。

ETF、投資信託のメリット・デメリット

以下に各メリット・デメリットを羅列しますが、詳細は省きます。色んな所に書いてありますので、ググってください。

ETF

✅手数料が安い
✅リアルタイムで取引ができる(指値で購入できる)
✅配当金に2重課税される

投資信託

✅信託手数料がETFに比べると高い
✅配当金を受け取れないが、配当金の自動再投資ができる
✅購入価格が1日ずれる為分かりにくい

投資信託の購入タイミングは非常に分かりにくいです。基本的には午後3時までに注文を入れると、その日の終値で購入が可能です。以下、大和アセット掲載の図で確認ください。

画像1

主要インデックスの比較表

以下、2021/9/24時点での比較表になります。(プログラムで簡単に拾ってこれますので、最後にプログラムを公開します。)1年以降のリターンは年間リターンになりますので、お気をつけて。数字だけを見ると、両方入っている3年リターンで、ナスダックはETFの勝利、それ以外は投資信託の勝利です。

ちなみに、以下に記載している信託報酬や手数料ですが、いつ払っているかというと、毎日、株価や基準価格に反映されていますので、勝手に支払っている形になります。さらに、投資信託は運用会社で配当金の再投資を行ってますが、これも同様に基準価格に乗ってきます。その為、過去のバックテストを行うと、計算上でなく、実際に正確にパフォーマンスを測れます。

画像2

それでは、実際のバックテストで比較しましょう。

S&P500のETF vs 投資信託比較チャート

今回、過去1年と3年を比較してみます。比較はS&P500、全米株式、ナスダックの3つにいたしました。今回、為替を考慮した場合、しない場合も入れております。ETFに関しては為替の影響がありますので、為替を考慮する方が本物に近いです。チャートは以下の通りです。(こちらもプログラミングを公開します)

S&P500 過去1年

画像5

S&P500 過去3年

画像6

全米株式 過去1年

画像7

全米株式 過去3年

画像6

ナスダック 過去1年

画像7

ナスダック 過去3年

画像8

画像9

単純にパフォーマンスだけを見ると、S&P500と全米株式は投資信託の方が、ナスダックはETFの方が良いように見えます。ただし、ETFは配当金があり、現時点でVOO、VTIは1.3%程、QQQは0.4%程度あります。その為、具体的に配当金を再投資することをシュミレーションして再計算してみます。

配当金再投資後のETF、投資信託パフォーマンス比較

毎月、10万円を全世界株に投資します。投資信託で購入するとピッタリ投資できるのですが、ETF(VOO)に投資すると2株しか買えませんので、今回、単価が安いVTIと楽天全米株式で比較してみます。期間は楽天全世界株式が始まった2017/9/29から約4年間、毎月積み立てを行った想定で計算します。その間、VTIで配当期が出たのが以下の16回です。(コード後述)

画像11

投資は月の初日に10万円で投資信託を購入。ETFの場合は為替も考慮し、買えるVTIの株数を購入。余ったお金は次の月の購入の資金に追加。分配金が出た場合は次の月の購入資金に追加する。購入時の為替手数料は通常の証券会社が使用している1ドル25銭で計算。(SBIは銀行経由で1ドル5銭)分配金は米国税10%、日本税20.315%が差し引かれた金額を追加する。購入時手数料は共に無料。(VTIは現在購入手数料は無料。)

投資信託結果: 楽天VTI
積み立て開始日: 2017/10/02
 投信価額(円): 9,980.00円
判定日: 2021/09/24
 投信価額(円) :18,191.00円
投信積立総額 :480.00万円
投信積立回数: 48回
投信利益: 255.22万円
投信時価数総: 735.22万円
投信トータルリターン: 53.17%

ETF結果: VTI
積み立て開始日: 2017/10/02
 株価: 130.20ドル
 為替: 112.64円
判定日: 2021/09/24
 株価: 229.64ドル
 為替: 110.33円
ETF積立総額: 480.00万円
ETF積立回数: 48回
分配金受取: VTI
 ETF利益: 243.23万円
 ETF時価数総: 723.23万円
  内分配金: 14.01万円
  残金: 1.44万円
 ETFトータルリターン: 50.67%
分配金再投資: VTI
 ETF利益: 248.13万円
 ETF時価数総: 728.13万円
  内残金: 2.65万円
 ETFトータルリターン: 51.69%

結果

積立の場合はいずれの場合も投資信託が有利。投資信託のリターン53.17%に対して、ETFのリターンは分配金再投資なし50.67%、再投資ありで51.69%となりました。

ちなみに、同金額(480万円)を2017/10/2に一括投資した時の2021/9/24でのパフォーマンスも含めて検証した結果はこちら。一括でも投資信託が有利です。

画像12

以下、検証結果の表です。(小さくて見にくいです)

画像11

参考にS&P500はこちら

画像14

ナスダック100でも同様の検証をした結果がこちら。iFreeナスダック100は信託手数料が高いので、一括投資で若干負ける結果になりました。

画像13

参考)使用したプログラミングコード

以下に、今回使用したプログラミングを公開します。GoogleColabを使ってますので、環境設定さえ行えば同様の結果を確認できます。環境設定等詳細はこちらをご確認ください。0章の環境設定をごらんください。

リスト表示

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
import warnings
warnings.simplefilter('ignore')

title = '過去1年「S&P500 ETF・投資信託」の値動き'
################################################################
# 比較対象
etfs = ['VOO','JPY=X']
toushin = {'https://toushin-lib.fwg.ne.jp/FdsWeb/FDST030000/csv-file-download?isinCd=JP90C000GKC6&associFundCd=03311187':'eMaxisSlim S&P500'}
# 期間
# 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)

################################################################
# 為替計算
for i in range(len(etfs)):
 if etfs[i] != 'JPY=X': df_chart[etfs[i]+' [為替含]'] = df_chart[etfs[i]]*df_chart['JPY=X']
df_chart.drop(['JPY=X'], axis=1, 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=(8,3),style='.-').legend(bbox_to_anchor=(1, 0), loc='lower right', prop=FontProperties(fname=jap_font,size=9))

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 投資信託 比較チャート作成

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
import warnings
warnings.simplefilter('ignore')

title = '過去1年「S&P500 ETF・投資信託」の値動き'
################################################################
# 比較対象
title = '過去1年「S&P500 ETF・投資信託」の値動き'
etfs = ['VOO','JPY=X']
toushin = {'https://toushin-lib.fwg.ne.jp/FdsWeb/FDST030000/csv-file-download?isinCd=JP90C000GKC6&associFundCd=03311187':'eMaxisSlim S&P500'}
# title = '過去1年「全米株式 ETF・投資信託」の値動き'
# etfs = ['VTI','JPY=X']
# toushin = {'https://toushin-lib.fwg.ne.jp/FdsWeb/FDST030000/csv-file-download?isinCd=JP90C000FHD2&associFundCd=9I312179':'楽天 全米株式'}
# title = '過去3年「ナスダック ETF・投資信託」の値動き'
# etfs = ['QQQ','JPY=X']
# toushin = {'https://toushin-lib.fwg.ne.jp/FdsWeb/FDST030000/csv-file-download?isinCd=JP90C000GUN2&associFundCd=04317188':'iFree ナスダック100',}
# 期間
# 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)

################################################################
# 為替計算
for i in range(len(etfs)):
 if etfs[i] != 'JPY=X': df_chart[etfs[i]+' [為替含]'] = df_chart[etfs[i]]*df_chart['JPY=X']
df_chart.drop(['JPY=X'], axis=1, 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]+'\n('+'{:+.2f}'.format(df_chart[df_chart.columns[i]].iloc[-1])+'%)'}, inplace=True)
df_chart.plot(ax=ax,grid=True,figsize=(8,4),style='.-').legend(bbox_to_anchor=(1, 0), loc='lower right', prop=FontProperties(fname=jap_font,size=9))

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()

VTI分配金、年間分配金利回り確認

import sys
sys.path.append('/content/drive/MyDrive/module')
import yfinance as yf

df = yf.Ticker("VTI").history(start="2017-9-29")
df = df[df['Dividends']!=0]
df.drop(['Open', 'High', 'Low', 'Volume', 'Stock Splits'], axis=1, inplace = True)
df = df.rename(columns={'Close':'株価','Dividends':'分配金'})
df['分配利回り'] = df['分配金']/df['株価']*100
df['年間分配利回り'] = df['分配利回り'].rolling(4).sum()
df

積立/一括投資検証コード

out_dir = '/content/drive/MyDrive/output/'
font_dir = '/content/drive/MyDrive/fonts/'
import sys
sys.path.append('/content/drive/MyDrive/module')
import os
import matplotlib.pyplot as plt
import pandas as pd
from datetime import datetime as dt
import yfinance as yf
import itertools
import warnings
warnings.simplefilter('ignore')

#################################################################################################
toushin = 'https://toushin-lib.fwg.ne.jp/FdsWeb/FDST030000/csv-file-download?isinCd=JP90C000FHD2&associFundCd=9I312179'
toushin_name = '楽天 全米株式'
etf_ticker = 'VTI'

# toushin = 'https://toushin-lib.fwg.ne.jp/FdsWeb/FDST030000/csv-file-download?isinCd=JP90C000GUN2&associFundCd=04317188'
# toushin_name = 'iFree ナスダック'
# etf_ticker = 'QQQ'
# toushin = 'https://toushin-lib.fwg.ne.jp/FdsWeb/FDST030000/csv-file-download?isinCd=JP90C000GKC6&associFundCd=03311187'
# toushin_name = 'eMaxisSlim S&P500'
# etf_ticker = 'VOO'

tsumitate = 100000 # 積立金額 月10万円
spread = 0.25 # 為替手数料 25銭
bunpai_tax = 1*0.9*0.79685
#################################################################################################

# 投資信託
df_t = pd.read_csv(toushin, index_col=0, encoding='SHIFT-JIS')
df_t['Date'] = [s for s in [dt.strptime(str(s), '%Y年%m月%d日') for s in list(df_t.index)]]
df_t.set_index('Date', inplace=True)
df_t.drop(['純資産総額(百万円)', '分配金', '決算期'], axis=1, inplace = True)
df_t['MNT']=df_t.index.strftime("%m").astype(float)
df_t['NMNT']=df_t['MNT']-df_t['MNT'].shift(1)
df_t = df_t.fillna(0)
df_t.loc[df_t['NMNT']!=0, 'NMNT'] = 1
df_t['投信積立(円)'] = df_t['NMNT']*tsumitate
df_t.drop(['MNT', 'NMNT'], axis=1, inplace = True)
df_t = df_t.rename(columns={'基準価額(円)':'投信価額(円)'})
start_date = df_t.index[0]

# ETF
df_e = yf.download(etf_ticker, start=start_date)[['Close']]
df_e['MNT']=df_e.index.strftime("%m").astype(float)
df_e['NMNT']=df_e['MNT']-df_e['MNT'].shift(1)
df_e = df_e.fillna(0)
df_e.loc[df_e['NMNT']!=0, 'NMNT'] = 1
df_e['ETF積立(円)'] = df_e['NMNT']*tsumitate
df_e.drop(['MNT', 'NMNT'], axis=1, inplace = True)
df_e = df_e.rename(columns={'Close':'ETF価額(ドル)'})

# 分配金
df_d = yf.Ticker(etf_ticker).history(start=start_date)[['Dividends']]
df_d = df_d[df_d['Dividends']>0]
df_d = df_d.rename(columns={'Dividends':'分配金(ドル)'})

# 為替レート
df_r = yf.download('JPY=X', start=start_date)[['Close']]
df_r = df_r.rename(columns={'Close':'為替レート'})

# 接続
data = pd.concat([df_t, df_e, df_d, df_r], axis=1)
data = data.fillna({'投信積立(円)': 0,'ETF積立(円)': 0,'分配金(ドル)': 0})
data.interpolate(inplace=True)
data = data.reindex(columns=['投信価額(円)','ETF価額(ドル)','分配金(ドル)','為替レート','投信積立(円)','ETF積立(円)'])
data['投信積立(円)'][-1] = 1 # 最新を残す
data = data[(data['分配金(ドル)']>0)|(data['投信積立(円)']>0)|(data['ETF積立(円)']>0)]
data['投信積立(円)'][-1] = 0

# データ処理 #######################
data['ETF積立(ドル)'] = data['ETF積立(円)']/(data['為替レート']+spread)

# 投資信託 #########################
data['投信積立総額(円)'] = list(itertools.accumulate(data['投信積立(円)'].values))
data['投信購入口数'] = data['投信積立(円)']/data['投信価額(円)']
data['投信総口数総'] = list(itertools.accumulate(data['投信購入口数'].values))
data['投信時価数総(円)'] = data['投信総口数総']*data['投信価額(円)']
data['投信利益(円)'] = data['投信時価数総(円)']-data['投信積立総額(円)']
data['投信利益率'] = data['投信利益(円)']/data['投信積立総額(円)']

# 投資信託 一括購入 #########################
data['投信一括(円)'] = 0
data['投信一括(円)'][0] = data['投信積立総額(円)'][-1]
data['投信一括口数'] = data['投信積立総額(円)'][-1]/data['投信価額(円)'][0]
data['投信一括時価数総(円)'] = data['投信一括口数']*data['投信価額(円)']
data['投信一括利益(円)'] = data['投信一括時価数総(円)']-data['投信一括(円)'][0]
data['投信一括利益率'] = data['投信一括利益(円)']/data['投信一括(円)'][0]

print('投資信託結果:',toushin_name)
print('積み立て開始日:',data.index[0].strftime("%Y/%m/%d"))
print(' 投信価額(円):','{:,.2f}円'.format(data['投信価額(円)'][0]))
print('判定日:',data.index[-1].strftime("%Y/%m/%d"))
print(' 投信価額(円):','{:,.2f}円'.format(data['投信価額(円)'][-1]))
print('投資信託積み立て:',toushin_name)
print(' 投信積立総額:','{:,.2f}万円'.format(sum(data['投信積立(円)'])/10000))
print(' 投信積立回数:','{:,.0f}回'.format(sum(data['投信積立(円)'])/tsumitate))
print(' 投信利益:','{:,.2f}万円'.format(data['投信利益(円)'][-1]/10000))
print(' 投信時価数総:','{:,.2f}万円'.format(data['投信時価数総(円)'][-1]/10000))
print(' 投信トータルリターン:','{:.2%}'.format(data['投信利益(円)'][-1]/data['投信積立総額(円)'][-1]))
print('投資信託一括:',toushin_name)
print(' 投信積立総額:','{:,.2f}万円'.format(data['投信一括(円)'][0]/10000))
print(' 投信利益:','{:,.2f}万円'.format(data['投信一括利益(円)'][-1]/10000))
print(' 投信時価数総:','{:,.2f}万円'.format(data['投信一括時価数総(円)'][-1]/10000))
print(' 投信トータルリターン:','{:.2%}'.format(data['投信一括利益率'][-1]))
print('')

# ETF ############################
data['ETF株数'] = 0
data['ETF株数[再投資]'] = 0
data['残高(ドル)'] = 0
data['残高[再投資](ドル)'] = 0
data['受取分配金(ドル)'] = 0
rest_doll = 0
total_cnt = 0
bunpai_total = 0
rest_doll_r = 0
total_cnt_r = 0
bunpai_total_r = 0
for index, row in data.iterrows():
 if row['ETF積立(ドル)']!=0:
   rest_doll = rest_doll + row['ETF積立(ドル)']
   rest_doll_r = rest_doll_r + row['ETF積立(ドル)']
   total_cnt = total_cnt + int(rest_doll/row['ETF価額(ドル)'])
   rest_doll = rest_doll - row['ETF価額(ドル)']*int(rest_doll/row['ETF価額(ドル)'])
   total_cnt_r = total_cnt_r + int(rest_doll_r/row['ETF価額(ドル)'])
   rest_doll_r = rest_doll_r - row['ETF価額(ドル)']*int(rest_doll_r/row['ETF価額(ドル)'])
 if row['分配金(ドル)']!=0:
   rest_doll_r = rest_doll_r+row['分配金(ドル)']*total_cnt_r*bunpai_tax
   bunpai_total = bunpai_total+row['分配金(ドル)']*total_cnt*bunpai_tax
   bunpai_total_r = bunpai_total_r+row['分配金(ドル)']*total_cnt_r*bunpai_tax
 data.loc[index,'残高(ドル)'] = rest_doll
 data.loc[index,'残高[再投資](ドル)'] = rest_doll_r
 data.loc[index,'ETF株数'] = total_cnt
 data.loc[index,'ETF株数[再投資]'] = total_cnt_r
 data.loc[index,'受取分配金(ドル)'] = bunpai_total

data['ETF積立総額(円)'] = list(itertools.accumulate(data['ETF積立(円)'].values))
data['ETF時価数総(円)'] = (data['ETF株数']*data['ETF価額(ドル)']+data['残高(ドル)']+data['受取分配金(ドル)'])*(data['為替レート']-spread)
data['ETF時価数総[再投資](円)'] = (data['ETF株数[再投資]']*data['ETF価額(ドル)']+data['残高[再投資](ドル)'])*(data['為替レート']-spread)
data['ETF利益(円)'] = data['ETF時価数総(円)']-data['ETF積立総額(円)']
data['ETF利益率'] = data['ETF利益(円)']/data['ETF積立総額(円)']
data['ETF利益[再投資](円)'] = data['ETF時価数総[再投資](円)']-data['ETF積立総額(円)']
data['ETF利益率[再投資]'] = data['ETF利益[再投資](円)']/data['ETF積立総額(円)']

# ETF 一括購入 #########################
data['ETF一括(円)'] = 0
data['ETF一括(円)'][0] = data['ETF積立総額(円)'][-1]
data['ETF一括(ドル)'] = data['ETF一括(円)']/(data['為替レート']+spread)
data['ETF一括株数'] = int(data['ETF一括(ドル)'][0]/data['ETF価額(ドル)'][0])
data['ETF一括分配金(ドル)'] = data['ETF一括株数']*data['分配金(ドル)']*bunpai_tax
data['ETF一括分配金総(ドル)'] = list(itertools.accumulate(data['ETF一括分配金(ドル)'].values))
data['一括残高(ドル)'] = data['ETF一括(ドル)'][0] - data['ETF一括株数'][0]*data['ETF価額(ドル)'][0]
data['ETF一括時価数総(円)'] = (data['ETF一括株数']*data['ETF価額(ドル)']+data['ETF一括分配金総(ドル)']+data['一括残高(ドル)'])*(data['為替レート']-spread)
data['ETF一括利益(円)'] = data['ETF一括時価数総(円)']-data['ETF一括(円)'][0]
data['ETF一括利益率'] = data['ETF一括利益(円)']/data['ETF一括(円)'][0]


print('ETF結果:',etf_ticker)
print('積み立て開始日:',data.index[0].strftime("%Y/%m/%d"))
print(' 株価:','{:.2f}ドル '.format(data['ETF価額(ドル)'][0]))
print(' 為替:','{:.2f}円 '.format(data['為替レート'][0]))
print('判定日:',data.index[-1].strftime("%Y/%m/%d"))
print(' 株価:','{:.2f}ドル '.format(data['ETF価額(ドル)'][-1]))
print(' 為替:','{:.2f}円 '.format(data['為替レート'][-1]))
print('ETF積立総額:','{:,.2f}万円'.format(sum(data['ETF積立(円)'])/10000))
print('ETF積立回数:','{:,.0f}回'.format(sum(data['ETF積立(円)'])/tsumitate))

print('分配金受取:',etf_ticker)
print(' ETF利益:','{:,.2f}万円'.format(data['ETF利益(円)'][-1]/10000))
print(' ETF時価数総:','{:,.2f}万円'.format(data['ETF時価数総(円)'][-1]/10000))
print('  内分配金:','{:,.2f}万円'.format(data['受取分配金(ドル)'][-1]*(data['為替レート'][-1]-spread)/10000))
print('  内残金:','{:,.2f}万円'.format(data['残高(ドル)'][-1]*(data['為替レート'][-1]-spread)/10000))
print(' ETFトータルリターン:','{:.2%}'.format(data['ETF利益(円)'][-1]/data['ETF積立総額(円)'][-1]))

print('分配金再投資:',etf_ticker)
print(' ETF利益:','{:,.2f}万円'.format(data['ETF利益[再投資](円)'][-1]/10000))
print(' ETF時価数総:','{:,.2f}万円'.format(data['ETF時価数総[再投資](円)'][-1]/10000))
print('  内残金:','{:,.2f}万円'.format(data['残高[再投資](ドル)'][-1]*(data['為替レート'][-1]-spread)/10000))
print(' ETFトータルリターン:','{:.2%}'.format(data['ETF利益[再投資](円)'][-1]/data['ETF積立総額(円)'][-1]))

print('一括購入:',etf_ticker)
print(' ETF利益:','{:,.2f}万円'.format(data['ETF一括利益(円)'][-1]/10000))
print(' ETF時価数総:','{:,.2f}万円'.format(data['ETF一括時価数総(円)'][-1]/10000))
print('  内分配金:','{:,.2f}万円'.format(data['ETF一括分配金総(ドル)'][-1]*(data['為替レート'][-1]-spread)/10000))
print('  内残金:','{:,.2f}万円'.format(data['一括残高(ドル)'][-1]*(data['為替レート'][-1]-spread)/10000))
print(' ETFトータルリターン:','{:.2%}'.format(data['ETF一括利益率'][-1]))


#######################################################################
from matplotlib.font_manager import FontProperties
from PIL import Image, ImageDraw, ImageFont
import IPython

######################################################
jap_font = '/content/drive/MyDrive/module/japanize_matplotlib/fonts/ipaexg.ttf'
japb_font = '/content/drive/MyDrive/module/japanize_matplotlib/fonts/ipaexg.ttf'
jap2_font = font_dir+'meiryo.ttc'
jap2b_font = font_dir+'meiryob.ttc'
if os.path.exists(jap2_font): jap_font = jap2_font
if os.path.exists(jap2b_font): japb_font = jap2b_font
######################################################
outfile = out_dir+'out.png'
######################################################
def xycenter(xp, yp, xw, yw, tx, fn):
 x,y = draw.textsize(tx,fn)
 return xp+(xw-x)/2, yp+(yw-y)/2
######################################################
df = data.copy()
x_width = 80
y_height_header = 30
y_height = 20
split_line = [1,5,8,14,19,31]
#######################################################
im = Image.new('RGB', (x_width*(len(df.columns)+1)+20, y_height_header+len(df)*y_height+20), 'white')
draw = ImageDraw.Draw(im)
x_start = 10
y_start = 10
xpos = x_start
ypos = y_start
# ヘッダ出力 #####
font_head=ImageFont.truetype(jap_font, 10)
draw.rectangle([(xpos, ypos), (xpos+x_width, ypos+y_height_header)], fill=(247, 203, 77), outline=(0,0,0),  width=1)
xpos+=x_width
for i in list(df.columns):
 draw.rectangle([(xpos, ypos), (xpos+x_width, ypos+y_height_header)], fill=(247, 203, 77), outline=(0,0,0),  width=1)
 draw.text((xycenter(xpos,ypos,x_width,y_height_header,i,font_head)),i, (0,0,0),font=font_head)
 xpos+=x_width
# データ出力 ####
font_txt=ImageFont.truetype(jap_font, 12)
ypos+=y_height_header
for i in range(len(df)):
 xpos = x_start
 draw.rectangle([(xpos, ypos), (xpos+x_width*(len(df.columns)+1), ypos+y_height)], outline=(0,0,0),  width=1
   , fill=((255,255,255) if i%2 == 0 else (254, 248, 227)))
 # データ ####
 draw.rectangle([(xpos, ypos), (xpos+x_width, ypos+y_height)], outline=(0,0,0),  width=1)
 draw.text((xycenter(xpos,ypos,x_width,y_height,str(df.index[i].strftime("%Y/%m/%d")),font_txt)),str(df.index[i].strftime("%Y/%m/%d")), (0,0,0),font=font_txt)
 xpos+=x_width
 for j in list(df.columns):
   draw.rectangle([(xpos, ypos), (xpos+x_width, ypos+y_height)], outline=(0,0,0),  width=1)
   if ('株数' in j)|('積立' in j):
     draw.text((xycenter(xpos,ypos,x_width,y_height,'{:,.0f}'.format(df[j][i]),font_txt)),'{:,.0f}'.format(df[j][i]), (0,0,0),font=font_txt)
   elif ('率' in j):
     draw.text((xycenter(xpos,ypos,x_width,y_height,'{:.2%}'.format(df[j][i]),font_txt)),'{:.2%}'.format(df[j][i]), 'red' if '{:.2%}'.format(df[j][i])[:1]=='-' else 'blue' ,font=font_txt)
   elif ('利益' in j):
     draw.text((xycenter(xpos,ypos,x_width,y_height,'{:,.0f}'.format(df[j][i]),font_txt)),'{:,.0f}'.format(df[j][i]), 'red' if '{:,.0f}'.format(df[j][i])[:1]=='-' else 'blue' ,font=font_txt)
   else:
     draw.text((xycenter(xpos,ypos,x_width,y_height,'{:,.2f}'.format(df[j][i]),font_txt)),'{:,.2f}'.format(df[j][i]), (0,0,0),font=font_txt)
   xpos+=x_width
 ypos+=y_height
draw.rectangle([(x_start, y_start), (xpos, y_start+y_height_header)], outline='black', width=3)
draw.rectangle([(x_start, y_start), (xpos, ypos)], outline='black', width=3)
for i in split_line:
 draw.line((x_start+x_width*i, y_start, x_start+x_width*i, ypos), fill='black', width=3)

im.save(outfile)
IPython.display.Image(outfile)







ここから先は

0字

¥ 150

期間限定 PayPay支払いすると抽選でお得に!

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