今回は、積立NISAのリアルな取引を再現するために、月一投資を試みてみた。実は、売買できるのが営業日に限られているというロジックが難しかったが、どうにかできたので公開する。
コード改善
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import datetime as dt
from pandas_datareader import data
import yfinance as yf
import statsmodels.api as sm
from statsmodels.tsa.seasonal import STL
def get_stock_yf(stock,start,end):
df = yf.download(tickers=stock, start=start, end=end)
return df
start = '2014-04-01'
end = '2024-03-31'
stock = '2914.T' # 'JT'
df = pd.DataFrame(get_stock_yf(stock, start, end))
df['Close']
営業日を計算する
今回、一番苦労した部分で、以下のロジックでそもそもの各月の営業日をdf_date
に格納しておきこれを後で利用することとした。
kは、年度の部分で必要に応じて増やしたり減らしたり、もう少し合理的に変更できるが、面倒なので手入力
jは月の部分でこれは固定でいい
iは、日の部分だが、この程度の選択で一応営業日が出てきたのでとりあえずよい。実際積み立て日というような日がある場合は、その日から7日目くらいを入れておけばよいと思う。
df['date'] = df.index
df_date = pd.DataFrame()
d_series = df['date']
target_dates = '20'
date_list = []
for k in ('14','15','16','17','18','19','20','21','22','23','24'):
target_date = target_dates + k +'-'
for j in ('01','02','03','04','05','06','07','08','09','10','11','12'):
target_date_ = target_date + j
for i in ("01","02","03","04","05","06","07"):
target_date2 = target_date_ + '-' + i
exists = (d_series == target_date2).any()
if(exists == True):
date_list.append(target_date2)
break
df_date = date_list
実際の投資の計算
from datetime import datetime
start_ = datetime.strptime('201404', '%Y%m').date()
end_ = datetime.strptime('202404', '%Y%m').date()
yosan0 = 33000 #毎月33,000円積立
def yosan_make(market, price_ave):
yosan = yosan0
return yosan
pd_stock = pd.DataFrame()
def market_history(start_, end_, df):
i_list = []
cost_list = []
kutisu_list = []
kutisu_sum_list = []
kutisu_sum = 0
cost_sum_list = []
cost_sum = 0
price_sum = 0
price = 0
mean_price_list = []
heikin_cost_list = []
price_list = []
j = 0
for i in df_date: #ここが今回新しい;投資日を指定して計算
price = df['Close'][i]
price_list.append(price)
i_list.append(i)
price_sum += df['Close'][i]
price_ave = price_sum/(j+1)
mean_price_list.append(price_ave)
yosan = yosan_make(df['Close'][i], price_ave)
cost_list.append(yosan)
cost_sum += yosan
cost_sum_list.append(cost_sum)
kutisu = yosan/df['Close'][i]
kutisu_list.append(kutisu)
kutisu_sum +=kutisu
kutisu_sum_list.append(kutisu_sum)
heikin_cost_list.append(cost_sum/kutisu_sum)
j +=1
pd_stock['date'] = i_list
pd_stock['price'] = price_list
pd_stock['mean_price'] = mean_price_list
pd_stock['kutisu'] = kutisu_list #yosan/df['Close']
pd_stock['cost'] = cost_list
pd_stock['cost_sum'] = cost_sum_list
pd_stock['kutisu_sum'] = kutisu_sum_list
pd_stock['jika'] = pd_stock['price']*pd_stock['kutisu_sum']
pd_stock['heikin_cost'] = heikin_cost_list
return pd_stock
pd_stock = market_history(start_, end_, df)
pd_stock
JT
グラフ描画
fig, ax = plt.subplots(4,1)
ax[0].plot(pd_stock['price'])
ax[0].set_title('price')
ax[1].plot(pd_stock['kutisu'])
ax[1].set_title('kutisu')
ax[2].plot(pd_stock['price'])
ax[2].set_title('mean_price')
ax[2].plot(pd_stock['heikin_cost'])
ax[3].plot(pd_stock['jika'])
ax[3].plot(pd_stock['cost_sum'])
plt.pause(1)
グラフを見るとJTといえども、10年前に一度上げたもののその後下げて、最近上げてきたんですね。そのため定額投資の場合、上げた時期はあまり口数増えずに、最近の爆下げ時に口数増えているのがわかります。その時期は、総資産を見るとマイナスになっているのがわかります。ただし、資産形成という意味では、ほぼ横ばい(まあ、毎月投資しているのに増えないのはつらいですが)そして株価が上がるタイミングで大幅に増えて、利益が出ています。
また、40ヶ月程度では、積み立ての効果は少なく、株価が上がってもあまり利益は出ていません。
収支
cost_sum, kutisu_sum, jika, jika-cost_sum
3960000 1368 5304962 1344962
ほぼ、株価はもとに戻った程度ですが、それでも立派な利益が出ているようです。
NTT
グラフ
NTTは順調に株価を上げてきているが、水平になっているところでは、ほぼ利益が出ていない。最近の爆上げで莫大な利益がでている。
収支
cost_sum, kutisu_sum, jika, jika-cost_sum
3960000 38576 6970735 3010735
コロナ禍後に順調に利益がでている。
トヨタ
グラフ
コロナ禍前までは、通常の資産形成しかできていないが、コロナ禍後特に2023以降の爆上げがすごい。
収支
年間40万円(月額33,000円)で10年でほぼ10,000,000円の資産形成ができている。
cost_sum, kutisu_sum, jika, jika-cost_sum
3960000 2607 9594977 5634977
郵政
グラフ
爆下げ銘柄郵政だったが、それでも当初はほぼ資産形成できつつあり、途中下げたもののコロナ禍後23年ごろから爆上げして利益が出ている。
収支
cost_sum, kutisu_sum, jika, jika-cost_sum
3333000 3012 4478831 1145831
NVIDIA
グラフ
収支
投資額は、高々400万円で皆同じだが、利益はちょっと桁が違う。
※ドル換算でみていないが、相対的なものなので円で見てください
cost_sum, kutisu_sum, jika, jika-cost_sum
3960000 207003 170320297 166360297
sp500
stock = '1547.T' #INX' # sp500 ETF
上場インデックスファンド米国株式(S&P500)
注意;ふるまいは実際のものより少しいいが、まあふるまいは似ている
グラフ
収支
cost_sum, kutisu_sum, jika, jika-cost_sum
3960000 1143 9525561 5565561
オルカン
stock = '2559.T' #all country yen
MAXIS 全世界株式(オール・カントリー)上場投信
グラフ
収支
コロナ直後からで運に恵まれているかもだけど、4年強の資産形成なので、優秀。
cost_sum, kutisu_sum, jika, jika-cost_sum
1683000 134 2522000 839000
トヨタ20年(2004.4-2024.3)
グラフ
収支
10年目あたりからプラテンして、最近爆益は同じだが、資産が2.5倍強で、利益が4倍強
cost_sum, kutisu_sum, jika, jika-cost_sum
7920000 7335 26994194 19074194
NTT20年(2004.4-2024.3)
グラフ
収支
NTTも資産は投資の二倍以上、利益も10年に比べると5倍程度に増えている。
ただし、最初の10年程度は株価は下げており、資産形成こそできているが、利益はやっと出始めたところ。
cost_sum, kutisu_sum, jika, jika-cost_sum
7920000 127064 22960463 15040463
まとめ
・今回はリアルなドルコスト平均法のふるまいを見た
・どの銘柄でも定額投資の良さと長期投資が最終的な利益に寄与していることがわかる
・サブプライムローン問題(2007-09)やコロナ禍(2020.3以降)という特殊な社会的な背景の寄与があり、こういう爆下げ時期が有効なように見える