最近、積立NISAなるものが
流行ってるみたいなので
シミュレーターを作ってみました。


解説動画はこちら



そもそも、積立NISAとは?
 
2018年1月より開始された
少額投資非課税制度のことで
非課税投資枠が年間40万円で
投資期間が最長20年になります

詳細はこちらをみていただければと思います

金融庁・積立NISA

今回は金融庁が出している
シミュレーターを真似して作ってみました

金融庁・資産運用シミュレーション

こんな感じのをPythonで作ってみます

コードはこんな感じです

from matplotlib import pyplot as plt
import numpy as np
import ipywidgets as widgets
from IPython.display import display
import warnings
warnings.simplefilter('ignore')

# 積立NISAシミュレーター
def show_widgets():
    button = widgets.Button(description='シミュレーション')
    s1 = widgets.IntSlider(value=20000  , min=1000 , max=33000  , step=1000   , description='月の積立金:')
    s2 = widgets.FloatSlider(value=4.0, min=0.1, step=0.1, max=10.0, description='利率:')
    s3 = widgets.IntSlider(value=10  , min=1 , max=20  , step=1 , description='年数:')
    output0 = widgets.Output(layour={'border': '1px solid black'})
    output1 = widgets.Output()
    fig = plt.figure(figsize=(12,6))
    ax = plt.gca()
    
    # クリック時の実行
    def on_click(b: widgets.Button) -> None:
        ax.clear()
        reserve = s1.value
        rate = s2.value
        year = s3.value
        rand_y1,rand_y2 = [],[]
        money,cost = 0,0
        for i in range(1,year+1):
            money += reserve * 12
            cost += reserve * 12
            money = int(money*(1+rate/100))
            diff = money - cost
            rand_y1.append(cost)
            rand_y2.append(diff)
        
        # 棒グラフの描画
        x = list(range(1,len(rand_y1)+1))        
        p1=ax.bar(x , rand_y1)
        p2=ax.bar(x , rand_y2 , bottom=rand_y1)
        l1=list(map(lambda x:'{0:.1f}万円'.format(x/10000), rand_y1))
        l2=list(map(lambda x:'{0:.1f}万円'.format(x/10000), rand_y2))
        l3=list(map(lambda x:'{0:.1f}万円'.format((x[0]+x[1])/10000), zip(rand_y1,rand_y2)))
        # 棒グラフのテキストラベル
        for i in range(len(x)):
            if len(x)<=10:
                size = 10
            elif len(x)<=15:
                size = 8
            elif len(x)<=20:
                size = 7
            else:
                size = 5
            
            ax.text(i +1, rand_y1[i]/2, l1[i], ha='center', color='black',size =size)
            ax.text(i +1, rand_y1[i] + rand_y2[i]/2, l2[i], ha='center', color='black',size =size)
            ax.text(i +1, rand_y1[i] + rand_y2[i] + 20000 , l3[i], ha='center', color='orange',size =size)
        ax.yaxis.set_major_formatter(plt.FuncFormatter(lambda x, loc: "{:,}".format(int(x))))
        
        with output0:
            output0.clear_output(wait=True)
            out_text = '積立金額 : {0:_>9}円 \n合計利息 : {1:_>9}円 \n最終金額 : {2:_>9}円'
            out = out_text.format(cost , diff , money)
            print(out)
        with output1:
            output1.clear_output(wait=True)
            display(ax.figure)
             
    button.on_click(on_click)
    box1 = widgets.Box([s1,s2])
    box2 = widgets.Box([s3,button])
    display(box1 , box2 , output0 , output1)
    plt.close()
    button.click()
     
show_widgets()

一応GoogleColabでも動くと思うので
試したい方はコピペして
動かしてみてください

ただし、棒グラフの万円の漢字部分が
表示されないだろうと思うので
ご了承下さい

コードのポイントとしては
月の積立金
利率
年数

スライダーで可変にして
これを入力として受け取ります

最終結果は年数分の利息を計算して
積立額にプラスして
最終結果と棒グラフに表示させます

年間40万円までなので
月額は33千円程度が限界ですかね?

これで利率4%だと
10、20年でこうなります。

スクリーンショット 2022-10-15 16.58.26
スクリーンショット 2022-10-15 16.59.18

10年だと積立金額の1.25倍
20年だと積立金額の1.5倍
くらいにはなりそうですね

とはいえ
この制度は始まったばかり
20年後に残っている保証も無いです

毎年必ず4%の利息が貰える
保証もありません

特に今は投資関連が
戦争やら円安やらで
ゲロやばそうな状況ですね

投資をするなら
自己責任でお願いいたします

今日はここまでです
それでは