LoginSignup
1
2

【ドルコスト平均法】オルカンなのかSP500なのか、NVIDIAはたまた国内株なのか、。。。よりリアルにNISAのゲインを追求する🎵

Last updated at Posted at 2024-04-13

今回は、積立NISAのリアルな取引を再現するために、月一投資を試みてみた。実は、売買できるのが営業日に限られているというロジックが難しかったが、どうにかできたので公開する。

コード改善

Lib.py
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
dataget.py
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

実際の投資の計算

main.py
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

グラフ描画

graph.py
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ヶ月程度では、積み立ての効果は少なく、株価が上がってもあまり利益は出ていません。
JT_real.png

収支

cost_sum, kutisu_sum, jika, jika-cost_sum
3960000 1368 5304962 1344962
ほぼ、株価はもとに戻った程度ですが、それでも立派な利益が出ているようです。

NTT

グラフ

NTTは順調に株価を上げてきているが、水平になっているところでは、ほぼ利益が出ていない。最近の爆上げで莫大な利益がでている。
NTT_real.png

収支

cost_sum, kutisu_sum, jika, jika-cost_sum
3960000 38576 6970735 3010735
コロナ禍後に順調に利益がでている。

トヨタ

グラフ

コロナ禍前までは、通常の資産形成しかできていないが、コロナ禍後特に2023以降の爆上げがすごい。
toyota_real.png

収支

年間40万円(月額33,000円)で10年でほぼ10,000,000円の資産形成ができている。
cost_sum, kutisu_sum, jika, jika-cost_sum
3960000 2607 9594977 5634977

郵政

グラフ

爆下げ銘柄郵政だったが、それでも当初はほぼ資産形成できつつあり、途中下げたもののコロナ禍後23年ごろから爆上げして利益が出ている。
post_real.png

収支

cost_sum, kutisu_sum, jika, jika-cost_sum
3333000 3012 4478831 1145831

NVIDIA

グラフ

nvidia_real.png

収支

投資額は、高々400万円で皆同じだが、利益はちょっと桁が違う。
※ドル換算でみていないが、相対的なものなので円で見てください
cost_sum, kutisu_sum, jika, jika-cost_sum
3960000 207003 170320297 166360297

sp500

stock = '1547.T' #INX' # sp500 ETF
上場インデックスファンド米国株式(S&P500)
注意;ふるまいは実際のものより少しいいが、まあふるまいは似ている

グラフ

sp500_real.png

収支

cost_sum, kutisu_sum, jika, jika-cost_sum
3960000 1143 9525561 5565561

オルカン

stock = '2559.T' #all country yen
MAXIS 全世界株式(オール・カントリー)上場投信

グラフ

期間が短いが順調に利益を上げている。
allcon_real.png

収支

コロナ直後からで運に恵まれているかもだけど、4年強の資産形成なので、優秀。
cost_sum, kutisu_sum, jika, jika-cost_sum
1683000 134 2522000 839000

トヨタ20年(2004.4-2024.3)

グラフ

toyota20y_real.png

収支

10年目あたりからプラテンして、最近爆益は同じだが、資産が2.5倍強で、利益が4倍強
cost_sum, kutisu_sum, jika, jika-cost_sum
7920000 7335 26994194 19074194

NTT20年(2004.4-2024.3)

グラフ

ntt20y_real.png

収支

NTTも資産は投資の二倍以上、利益も10年に比べると5倍程度に増えている。
ただし、最初の10年程度は株価は下げており、資産形成こそできているが、利益はやっと出始めたところ。
cost_sum, kutisu_sum, jika, jika-cost_sum
7920000 127064 22960463 15040463

まとめ

・今回はリアルなドルコスト平均法のふるまいを見た
・どの銘柄でも定額投資の良さと長期投資が最終的な利益に寄与していることがわかる
・サブプライムローン問題(2007-09)やコロナ禍(2020.3以降)という特殊な社会的な背景の寄与があり、こういう爆下げ時期が有効なように見える

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2