見出し画像

つみたてNISA vs 一般NISA比較

こんにちわ!トミィ(@toushi_tommy)です!NISAに関してですが、実際つみたてNISAの方がいいか、一般NISAの方がいいか良く聞かれます。一般NISAは年間120万円ですので、まとまったお金があれば一般NISAの方が良い気がしますが、実際そうでしょうか?何故かと言うと、つみたてNISAは年間40万円ですが20年間、トータル800万円です。一般NISAは120万円ですが5年間トータル600万円なんです。(実際は終わった後、つみたてNISAを始めることができますが・・・)その為、今回検証してみました。また、つみたてNISAの場合は、ボーナス払いを使った一括投資が良いかどうかの検証も一緒に行ってます。是非、最後までご覧ください。(計算に使ったコードも書いてますので、プログラミングに興味がある方はどうぞ)

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

NISAとは

まず、NISAについてですが、つみたてNISA、一般NISA、新NISA、ジュニアNISAがありますが、以前noteを書いておりますので、是非、こちらをご覧ください。仕組みが難しいロールオーバーのことも記載しております。

この中で最強は、つみたてNISAから新NISAへ移行し、さらにつみたてNISAへ戻ることだと記載しておりますが、実際のシュミレーションを行ってみました。

つみたてNISAと一般NISAの比較

比較するにあたり、金額を合わせるために毎年122万円インデックス投資をすることにします。何故122万円かというと、2024年から5年間のみ新NISAが始まり、限度額が122万円の為です。毎月積み立て投資を行い、金額は122万円を12ヵ月で割った101,666円です。非課税運用できない金額に関しては特定口座で購入します。利率は年間5%、7%、10%で計算しております。

ちなみに積み立てシュミレーションはこちらのページでも可能です。ただし、非課税と課税を分けて出力してはくれませんので、自分で分けて計算する必要があります。

1.つみたてNISAの場合

積み立て額は月101,666円(つみたてNISA33,333円、特定口座68,333円)になります。結果は以下の通りです。

年利5%

画像1

年利7%

画像2

年利10%

画像3

5%:3908万円、7%:4851万円、10%:6898万円

2.一般NISA、新NISAからのつみたてNISAの場合

積み立て額は月101,666円(一般NISAで月10万円、特定口座で1,666円 -> 新NISAで月101,666円 -> ロールオーバー期間は特定口座で101,666円 -> つみたてNISA33,333円、特定口座68,333円)になります。結果は以下の通りです。

年利5%

画像4

年利7%

画像5

年利10%

画像6

5%:3879万円、7%:4792万円、10%:6757万円


3.つみたてNISA、新NISAからつみたてNISAの場合

積み立て額は月101,666円(つみたてNISA33,333円、特定口座68,333円 -> 新NISA101,666円 -> 再度つみたてNISA33,333円、特定口座68,333円)になります。結果は以下の通りです。

年利5%

画像7

年利7%

画像8

年利10%

画像9

5%:3889万円、7%:4812万円、10%:6805万円


つみたてNISA vs 一般NISA結論

こちらがまとめた結果です。CASE1:つみにー一択、CASE2:一般NISA、新NISAからつみにー、CASE3:つみにーから新NISAでつみにーに戻る

CASE1 : 5%:3908万円、7%:4851万円、10%:6898万円
CASE2 : 5%:3879万円、7%:4792万円、10%:6757万円
CASE3:5%:3889万円、7%:4812万円、10%:6805万円

つみたてでインデックス投資であれば、ゴチャゴチャせずにつみたてNISA設定をしてほったらかしにすれば良いと思います。個別株は一般NISAでしか購入できないので、個別株をやりたい人は一般NISAでも良いですが、非課税と言うこともあり、売れなくなってしまいます。そう考えると特定口座で個別株も購入した方が良いかもしれません。

結果、つみたてNISA一択だと私は思います。ただし、今回の計算では新NISAの一階部分を簿価でつみたてNISAにロールオーバーできることを計算に入れてません。ご興味があれば、Case3で運用することもありだと思います。ただし、結構面倒だと思います。

つみたてNISA一括投資について

それでは、つみたてNISAですが、実は毎月33,333円の投資ではなく、年初にほぼ一括投資ができます。どのようなやり方かというと、毎月のつみたて購入金額を100円に設定、1月のボーナス支払いで残りの39万8800円で購入する設定です。こちらも同様に検証してみました。

年利5%

画像10

年利7%

画像11

年利10%

画像12

結論、年利5%計算で31万円の差があります。ただしクレカ払いができませんので、20年間で12万円分のポイントがもらえないことになります。それを差し引いても19万円お得になります。そもそも年初に40万円持っているのであれば、既に投資した方がお得ではありますが、12月のボーナスを使うことで、1月にこのような一括投資も可能です。また、クレカ払いでのポイントも取りたいのであれば、さらに特定口座で毎月5万円投資できれば、もっといいですね。(タイミング投資になりますので、高値掴みしてしまうリスクはございます。自己判断でお願いします。)

せっかくなので、その場合のシュミレーションはこんな感じです。(年利5%)

画像13

ここまで書いてなんですが・・・・、お勧めはゴチャゴチャせずに、クレカ毎月の積み立て投資で投資していることを忘れてしまうことです。20年後の19万円なんて、大した金額じゃないです。

追記)同じ土俵で比較しろということで、一括投資したとしても毎月特定口座で33333円投資できると仮定して計算しなおしてみると、差は7万円でした。

画像14

計算で使用したコード

pythonプログラミングサークルメンバー向けにコードを公開します。プログラミングサークルとはこちらをご覧ください。

つみたてNISA vs 一般NISA比較

##############################################
# PATH
module_dir = '/content/drive/MyDrive/module'
img_dir    = '/content/drive/MyDrive/input/'
output_dir = '/content/drive/MyDrive/output/'
font_dir   = '/content/drive/MyDrive/fonts/'
##############################################
import os
if not os.path.isdir(output_dir): os.makedirs(output_dir)
import sys
sys.path.append(module_dir)
import datetime as datetime
import pytz
from PIL import Image, ImageDraw, ImageFont
import IPython
from bs4 import BeautifulSoup
import re
import requests
from datetime import datetime as dt
import matplotlib.dates as mdates
import japanize_matplotlib 
from matplotlib import ticker
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import warnings
warnings.simplefilter('ignore')

def set_fukuri(fukuri,df, evyname,addname):
 add_list = []
 total = 0
 for i in range(len(df)):
   total = total*(1+fukuri)+df[evyname][i]
   add_list = np.append(add_list, int(total))
 df[addname]=add_list
 return

## 設定個所 ###################################
icon_img = img_dir+"tommy_icon2.png"
txt_comm = 'トミィ @toushi_tommy'
title = 'つみたてNISA vs 一般NISA(新NISA)比較'
###############################################
# フォント
jap_font = '/content/drive/MyDrive/module/japanize_matplotlib/fonts/ipaexg.ttf'
jap2_font = font_dir+'meiryo.ttc'
japb_font = '/content/drive/MyDrive/module/japanize_matplotlib/fonts/ipaexg.ttf'
jap3_font = font_dir+'meiryob.ttc'
if os.path.exists(jap2_font): jap_font = jap2_font
if os.path.exists(jap3_font): japb_font = jap3_font

######################################################
def xycenter(xp, yp, xw, yw, tx, fn):
 x,y = draw.textsize(tx,fn)
 return xp+(xw-x)/2, yp+(yw-y)/2
ycenter = lambda yp,yw,tx,fn : yp+(yw-draw.textsize(tx,fn)[1])/2
xcenter = lambda xp,xw,tx,fn : xp+(xw-draw.textsize(tx,fn)[0])/2
######################################################

###############################################
x_height_all = 1080
y_height_all = 1350
###############################################
# 色
col_back = 'white' # heatmap (38,41,49)
col_txt  = 'black'  # heatmap 'white'
col_line =  'black'  # heatmap 'white'
col_head = (231, 239, 252)

###############################################
im = Image.new('RGB', (x_height_all, y_height_all), col_back)
draw = ImageDraw.Draw(im)
today_j = datetime.datetime.now(pytz.timezone('Asia/Tokyo'))
# フォント ####################################
font_date   = ImageFont.truetype(jap_font, 30)
font_header = ImageFont.truetype(japb_font, 30)
font_subtit = ImageFont.truetype(jap_font, 28)
font_subtit2 = ImageFont.truetype(jap_font, 20)
font_sign   = ImageFont.truetype(jap_font, 16)
font_att   = ImageFont.truetype(japb_font, 16)

###############################################
# ヘッダ作成
len_title=draw.textsize(title, font_header)[0]
draw.rectangle([(10, 10), (x_height_all-10, 120)], fill=col_head)
draw.rectangle([(10, 10), (x_height_all-10, y_height_all-10)], outline=col_line, width=5)
if os.path.exists(icon_img):im.paste(Image.open(icon_img).resize((80, 80)).copy(), (30, 30))
x_pos = x_height_all/2-len_title/2
draw.line((x_pos, 70, x_pos+len_title,70), fill='yellow', width=25)
draw.text((x_pos, 45),title,col_txt,font=font_header)
draw.text((x_height_all-220, 20),txt_comm,col_txt,font=font_sign)
draw.text((x_height_all-260, 90),"更新日時:"+today_j.strftime("%Y/%m/%d %H:%M"),col_txt,font=font_sign)
# draw.text((300, 90),"※為替レートも換算・ETF配当金再投資は税金を払った後の再投資",'red',font=font_att)
draw.line((20,120, x_height_all-20,120), fill=col_line, width=1)
###############################################

draw.text((30, 130),"比較条件",'black',font=ImageFont.truetype(japb_font, 24))
draw.text((60, 160),"投資金額は年間122万円。投資方法は毎月12で割った金額を毎月投資で20年間、年利は5%で計算",'black',font=ImageFont.truetype(jap_font, 20))
draw.text((60, 185),"2022年1月から投資スタート(新NISAから20万円のつみたてNISAへのロールオーバーは複雑な為考慮せず)",'black',font=ImageFont.truetype(jap_font, 20))
draw.text((60, 210),"1.つみたてNISA+特定口座で毎月投資",'blue',font=ImageFont.truetype(jap_font, 20))
draw.text((60, 235),"2.一般NISA から 新NISA へ移行後、ロールオーバーを利用、2034年からつみたてNISAに戻った場合",'blue',font=ImageFont.truetype(jap_font, 20))
draw.text((60, 260),"3.つみたてNISA から 新NISA へ移行、2029年からつみたてNISAに戻った場合",'blue',font=ImageFont.truetype(jap_font, 20))
draw.line((20, 300, x_height_all-20, 300), fill=col_line, width=1)

fukuri = 0.05/12

col1 = (112,163,255)
str_col1 = '#70A3FF'
col2 = (188,217,249)
str_col2 = '#BCD9F9'
col3 = (61,204,252)
str_col3 = '#3DCCFC'
col4 = (86,172,255)
str_col4 = '#56ACFF'

xoff = lambda xw,tx,fn : (xw-draw.textsize(tx,fn)[0])

fnt20b=ImageFont.truetype(japb_font, 20)
fnt20 = ImageFont.truetype(jap_font, 20)
fntttl = ImageFont.truetype(japb_font, 23)

##########################################################################################
# CASE1
y_loc = 310
draw.text((40, y_loc),"1.つみたてNISA(月3.33万円)、特定口座(月6.83万円)で毎月投資した場合の20年後",'black',font=ImageFont.truetype(japb_font, 20))

df = pd.DataFrame({"Date" : pd.date_range('2022-01-01', '2041-12-31', freq='M')})
df['毎月積立']=1220000/12
df['毎月非課税']=33333
df['毎月課税']=1220000/12-33333

df['元本']=df['毎月積立'].cumsum()
set_fukuri(fukuri,df,'毎月積立','総額')
df['総利益']=df['総額']-df['元本']

df['非課税元本']=df['毎月非課税'].cumsum()
set_fukuri(fukuri,df,'毎月非課税','非課税総額')
df['総利益非課税']=df['非課税総額']-df['非課税元本']

df['課税元本']=df['毎月課税'].cumsum()
set_fukuri(fukuri,df,'毎月課税','課税総額')
df['総利益課税']=df['課税総額']-df['課税元本']

df.to_csv('/content/drive/MyDrive/output/case1.csv', encoding='utf_8_sig')

fig, ax = plt.subplots()
plt.figure(figsize=(13, 5), dpi=50)
plt.bar(df["Date"], df['元本'], color=str_col1,width=50.0)
plt.bar(df["Date"], df['総利益非課税'], bottom=df['元本'], color=str_col2,width=50.0)
plt.bar(df["Date"], df['総利益課税'], bottom=df['元本']+df['総利益非課税'], color=str_col3,width=50.0)
plt.xticks(fontsize=24)
plt.yticks(fontsize=24)
outfile = output_dir+'graph.png'
plt.savefig(outfile, bbox_inches="tight")
plt.close()
im.paste(Image.open(outfile).copy(), (50, y_loc+30))

pos = 30
draw.rectangle([(620, y_loc+pos+10), (650, y_loc+pos+22)], fill=col1)
draw.text((670, y_loc+pos),"投資元本:",'black',font=fnt20)
num='{:,.2f}万円'.format(int(df['元本'].iat[-1])/10000)
draw.text((870+xoff(160,num,fnt20b), y_loc+pos),num,'black',font=fnt20b)

pos +=25
draw.text((670, y_loc+pos),"最終金額",'black',font=fnt20)
num='{:,.2f}万円'.format(int(df['総額'].iat[-1])/10000)
draw.text((870+xoff(160,num,fnt20b), y_loc+pos),num,'black',font=fnt20b)

pos +=25
draw.rectangle([(620, y_loc+pos+10), (635, y_loc+pos+22)], fill=col2)
draw.rectangle([(635, y_loc+pos+10), (650, y_loc+pos+22)], fill=col3)
draw.text((670, y_loc+pos),"総利益",'black',font=fnt20)
num='{:,.2f}万円'.format(int(df['総利益'].iat[-1])/10000)
draw.text((870+xoff(160,num,fnt20), y_loc+pos),num,'blue',font=fnt20)

pos +=25
draw.rectangle([(620, y_loc+pos+10), (650, y_loc+pos+22)], fill=col2)
draw.text((670, y_loc+pos),"内非課税",'black',font=fnt20)
num='({:,.2f}万円)'.format(int(df['総利益非課税'].iat[-1])/10000)
draw.text((870+xoff(160,num,fnt20), y_loc+pos),num,'blue',font=fnt20)

pos +=25
draw.rectangle([(620, y_loc+pos+10), (650, y_loc+pos+22)], fill=col3)
draw.text((670, y_loc+pos),"内課税",'black',font=fnt20)
num='({:,.2f}万円)'.format(int(df['総利益課税'].iat[-1])/10000)
draw.text((870+xoff(160,num,fnt20), y_loc+pos),num,'blue',font=fnt20)

pos +=25
draw.text((670, y_loc+pos),"税金",'black',font=fnt20)
num='{:,.2f}万円'.format(int((df['総利益課税'].iat[-1])*0.2315)/10000)
draw.text((870+xoff(160,num,fnt20), y_loc+pos),num,'red',font=fnt20)

pos +=25
draw.text((670, y_loc+pos),"税引き後利益",'black',font=fnt20)
num='{:,.2f}万円'.format(int(df['総利益'].iat[-1]-df['総利益課税'].iat[-1]*0.2315)/10000)
draw.text((870+xoff(160,num,fnt20b), y_loc+pos),num,'blue',font=fnt20b)

pos +=25
draw.text((670, y_loc+pos),"税引き後総額",'black',font=fnt20)
num='{:,.2f}万円'.format(int(df['総額'].iat[-1]-df['総利益課税'].iat[-1]*0.2315)/10000)
draw.text((870+xoff(160,num,fntttl), y_loc+pos),num,'black',font=fntttl)

##########################################################################################
# CASE2
y_loc = 310+300
draw.line((20, y_loc-20, x_height_all-20, y_loc-20), fill=col_line, width=1)
draw.text((40, y_loc),"2.一般NISA2年間(月10万円)、新NISA3年(月10.16万円)、5年後ロールオーバー後、つみたてNISAへ",'black',font=ImageFont.truetype(japb_font, 20))
y_loc = 310+330
draw.text((40, y_loc),"(2022,2023:一般NISA、2024-2026:新NISA、2027,2028:一般から新へロールオーバー、2029-:つみにー)",'blue',font=ImageFont.truetype(jap_font, 16))

df = pd.DataFrame({"Date" : pd.date_range('2022-01-01', '2041-12-31', freq='M')})
df['毎月積立']=1220000/12

df['毎月つみに']=0
df.loc[df['Date']>='2029-1-1', '毎月つみに'] = 33333

df['毎月一般1']=0
df.loc[(df['Date']>='2022-1-1')&(df['Date']<'2023-1-1'), '毎月一般1'] = 100000
df['毎月一般2']=0
df.loc[(df['Date']>='2023-1-1')&(df['Date']<'2024-1-1'), '毎月一般2'] = 100000
df['毎月一般3']=0
df.loc[(df['Date']>='2024-1-1')&(df['Date']<'2025-1-1'), '毎月一般3'] = 1220000/12
df['毎月一般4']=0
df.loc[(df['Date']>='2025-1-1')&(df['Date']<'2026-1-1'), '毎月一般4'] = 1220000/12
df['毎月一般5']=0
df.loc[(df['Date']>='2026-1-1')&(df['Date']<'2027-1-1'), '毎月一般5'] = 1220000/12

df['元本']=df['毎月積立'].cumsum()
set_fukuri(fukuri,df,'毎月積立','総額')
df['総利益']=df['総額']-df['元本']

df['つみに元本']=df['毎月つみに'].cumsum()
set_fukuri(fukuri,df,'毎月つみに','つみに総額')
df['総利益つみに']=df['つみに総額']-df['つみに元本']

df['一般1元本']=df['毎月一般1'].cumsum()
set_fukuri(fukuri,df,'毎月一般1','一般1総額')
df['総利益一般1']=df['一般1総額']-df['一般1元本']
df['一般2元本']=df['毎月一般2'].cumsum()
set_fukuri(fukuri,df,'毎月一般2','一般2総額')
df['総利益一般2']=df['一般2総額']-df['一般2元本']
df['一般3元本']=df['毎月一般3'].cumsum()
set_fukuri(fukuri,df,'毎月一般3','一般3総額')
df['総利益一般3']=df['一般3総額']-df['一般3元本']
df['一般4元本']=df['毎月一般4'].cumsum()
set_fukuri(fukuri,df,'毎月一般4','一般4総額')
df['総利益一般4']=df['一般4総額']-df['一般4元本']
df['一般5元本']=df['毎月一般5'].cumsum()
set_fukuri(fukuri,df,'毎月一般5','一般5総額')
df['総利益一般5']=df['一般5総額']-df['一般5元本']
 #一般NISA1 
for i in range(len(df)):
 if(df['Date'].loc[i]>datetime.datetime(2032,1,1)):
   df['総利益一般1'].loc[i] = df['総利益一般1'].loc[i-1]
 if(df['Date'].loc[i]>datetime.datetime(2033,1,1)):
   df['総利益一般2'].loc[i] = df['総利益一般2'].loc[i-1]
 if(df['Date'].loc[i]>datetime.datetime(2029,1,1)):
   df['総利益一般3'].loc[i] = df['総利益一般3'].loc[i-1]
 if(df['Date'].loc[i]>datetime.datetime(2030,1,1)):
   df['総利益一般4'].loc[i] = df['総利益一般4'].loc[i-1]
 if(df['Date'].loc[i]>datetime.datetime(2031,1,1)):
   df['総利益一般5'].loc[i] = df['総利益一般5'].loc[i-1]

df['総利益非課税']=df['総利益一般1']+df['総利益一般2']+df['総利益一般3']+df['総利益一般4']+df['総利益一般5']+df['総利益つみに']
df['総利益課税'] = df['総利益'] - df['総利益非課税']
df.to_csv('/content/drive/MyDrive/output/case2.csv', encoding='utf_8_sig')

fig, ax = plt.subplots()
plt.figure(figsize=(13, 5), dpi=50)
plt.bar(df["Date"], df['元本'], color=str_col1,width=50.0)
plt.bar(df["Date"], df['総利益非課税'], bottom=df['元本'], color=str_col2,width=50.0)
plt.bar(df["Date"], df['総利益課税'], bottom=df['元本']+df['総利益非課税'], color=str_col3,width=50.0)
plt.xticks(fontsize=24)
plt.yticks(fontsize=24)
outfile = output_dir+'graph.png'
plt.savefig(outfile, bbox_inches="tight")
plt.close()
im.paste(Image.open(outfile).copy(), (50, y_loc+30))

pos = 30
draw.rectangle([(620, y_loc+pos+10), (650, y_loc+pos+22)], fill=col1)
draw.text((670, y_loc+pos),"投資元本:",'black',font=fnt20)
num='{:,.2f}万円'.format(int(df['元本'].iat[-1])/10000)
draw.text((870+xoff(160,num,fnt20b), y_loc+pos),num,'black',font=fnt20b)

pos +=25
draw.text((670, y_loc+pos),"最終金額",'black',font=fnt20)
num='{:,.2f}万円'.format(int(df['総額'].iat[-1])/10000)
draw.text((870+xoff(160,num,fnt20b), y_loc+pos),num,'black',font=fnt20b)

pos +=25
draw.rectangle([(620, y_loc+pos+10), (635, y_loc+pos+22)], fill=col2)
draw.rectangle([(635, y_loc+pos+10), (650, y_loc+pos+22)], fill=col3)
draw.text((670, y_loc+pos),"総利益",'black',font=fnt20)
num='{:,.2f}万円'.format(int(df['総利益'].iat[-1])/10000)
draw.text((870+xoff(160,num,fnt20), y_loc+pos),num,'blue',font=fnt20)

pos +=25
draw.rectangle([(620, y_loc+pos+10), (650, y_loc+pos+22)], fill=col2)
draw.text((670, y_loc+pos),"内非課税",'black',font=fnt20)
num='({:,.2f}万円)'.format(int(df['総利益非課税'].iat[-1])/10000)
draw.text((870+xoff(160,num,fnt20), y_loc+pos),num,'blue',font=fnt20)

pos +=25
draw.rectangle([(620, y_loc+pos+10), (650, y_loc+pos+22)], fill=col3)
draw.text((670, y_loc+pos),"内課税",'black',font=fnt20)
num='({:,.2f}万円)'.format(int(df['総利益課税'].iat[-1])/10000)
draw.text((870+xoff(160,num,fnt20), y_loc+pos),num,'blue',font=fnt20)

pos +=25
draw.text((670, y_loc+pos),"税金",'black',font=fnt20)
num='{:,.2f}万円'.format(int((df['総利益課税'].iat[-1])*0.2315)/10000)
draw.text((870+xoff(160,num,fnt20), y_loc+pos),num,'red',font=fnt20)

pos +=25
draw.text((670, y_loc+pos),"税引き後利益",'black',font=fnt20)
num='{:,.2f}万円'.format(int(df['総利益'].iat[-1]-df['総利益課税'].iat[-1]*0.2315)/10000)
draw.text((870+xoff(160,num,fnt20b), y_loc+pos),num,'blue',font=fnt20b)

pos +=25
draw.text((670, y_loc+pos),"税引き後総額",'black',font=fnt20)
num='{:,.2f}万円'.format(int(df['総額'].iat[-1]-df['総利益課税'].iat[-1]*0.2315)/10000)
draw.text((870+xoff(160,num,fntttl), y_loc+pos),num,'black',font=fntttl)


# ##########################################################################################
# # CASE3

y_loc = 310+330+300
draw.line((20, y_loc-20, x_height_all-20, y_loc-20), fill=col_line, width=1)
draw.text((40, y_loc),"3.つみたてNISA2年間(月3.3万円)、新NISA5年(月10.16万円)、つみたてNISAへ",'black',font=ImageFont.truetype(japb_font, 20))
y_loc = 310+330+330
draw.text((40, y_loc),"(2022,2023:つみにー、2024-2028:新NISA、2029-2041:つみにー)",'blue',font=ImageFont.truetype(jap_font, 16))

df = pd.DataFrame({"Date" : pd.date_range('2022-01-01', '2041-12-31', freq='M')})
df['毎月積立']=1220000/12

df['毎月つみに']=0
df.loc[df['Date']<'2024-1-1', '毎月つみに'] = 33333
df.loc[df['Date']>='2029-1-1', '毎月つみに'] = 33333

df['毎月一般1']=0
df.loc[(df['Date']>='2024-1-1')&(df['Date']<'2025-1-1'), '毎月一般1'] = 1220000/12
df['毎月一般2']=0
df.loc[(df['Date']>='2025-1-1')&(df['Date']<'2026-1-1'), '毎月一般2'] = 1220000/12
df['毎月一般3']=0
df.loc[(df['Date']>='2026-1-1')&(df['Date']<'2027-1-1'), '毎月一般3'] = 1220000/12
df['毎月一般4']=0
df.loc[(df['Date']>='2027-1-1')&(df['Date']<'2028-1-1'), '毎月一般4'] = 1220000/12
df['毎月一般5']=0
df.loc[(df['Date']>='2028-1-1')&(df['Date']<'2029-1-1'), '毎月一般5'] = 1220000/12

df['元本']=df['毎月積立'].cumsum()
set_fukuri(fukuri,df,'毎月積立','総額')
df['総利益']=df['総額']-df['元本']

df['つみに元本']=df['毎月つみに'].cumsum()
set_fukuri(fukuri,df,'毎月つみに','つみに総額')
df['総利益つみに']=df['つみに総額']-df['つみに元本']

df['一般1元本']=df['毎月一般1'].cumsum()
set_fukuri(fukuri,df,'毎月一般1','一般1総額')
df['総利益一般1']=df['一般1総額']-df['一般1元本']
df['一般2元本']=df['毎月一般2'].cumsum()
set_fukuri(fukuri,df,'毎月一般2','一般2総額')
df['総利益一般2']=df['一般2総額']-df['一般2元本']
df['一般3元本']=df['毎月一般3'].cumsum()
set_fukuri(fukuri,df,'毎月一般3','一般3総額')
df['総利益一般3']=df['一般3総額']-df['一般3元本']
df['一般4元本']=df['毎月一般4'].cumsum()
set_fukuri(fukuri,df,'毎月一般4','一般4総額')
df['総利益一般4']=df['一般4総額']-df['一般4元本']
df['一般5元本']=df['毎月一般5'].cumsum()
set_fukuri(fukuri,df,'毎月一般5','一般5総額')
df['総利益一般5']=df['一般5総額']-df['一般5元本']
 #一般NISA1 
for i in range(len(df)):
 if(df['Date'].loc[i]>datetime.datetime(2029,1,1)):
   df['総利益一般1'].loc[i] = df['総利益一般1'].loc[i-1]
 if(df['Date'].loc[i]>datetime.datetime(2030,1,1)):
   df['総利益一般2'].loc[i] = df['総利益一般2'].loc[i-1]
 if(df['Date'].loc[i]>datetime.datetime(2031,1,1)):
   df['総利益一般3'].loc[i] = df['総利益一般3'].loc[i-1]
 if(df['Date'].loc[i]>datetime.datetime(2032,1,1)):
   df['総利益一般4'].loc[i] = df['総利益一般4'].loc[i-1]
 if(df['Date'].loc[i]>datetime.datetime(2033,1,1)):
   df['総利益一般5'].loc[i] = df['総利益一般5'].loc[i-1]

df['総利益非課税']=df['総利益一般1']+df['総利益一般2']+df['総利益一般3']+df['総利益一般4']+df['総利益一般5']+df['総利益つみに']
df['総利益課税'] = df['総利益'] - df['総利益非課税']
df.to_csv('/content/drive/MyDrive/output/case3.csv', encoding='utf_8_sig')

fig, ax = plt.subplots()
plt.figure(figsize=(13, 5), dpi=50)
plt.bar(df["Date"], df['元本'], color=str_col1,width=50.0)
plt.bar(df["Date"], df['総利益非課税'], bottom=df['元本'], color=str_col2,width=50.0)
plt.bar(df["Date"], df['総利益課税'], bottom=df['元本']+df['総利益非課税'], color=str_col3,width=50.0)
plt.xticks(fontsize=24)
plt.yticks(fontsize=24)
outfile = output_dir+'graph.png'
plt.savefig(outfile, bbox_inches="tight")
plt.close()
im.paste(Image.open(outfile).copy(), (50, y_loc+30))

pos = 30
draw.rectangle([(620, y_loc+pos+10), (650, y_loc+pos+22)], fill=col1)
draw.text((670, y_loc+pos),"投資元本:",'black',font=fnt20)
num='{:,.2f}万円'.format(int(df['元本'].iat[-1])/10000)
draw.text((870+xoff(160,num,fnt20b), y_loc+pos),num,'black',font=fnt20b)

pos +=25
draw.text((670, y_loc+pos),"最終金額",'black',font=fnt20)
num='{:,.2f}万円'.format(int(df['総額'].iat[-1])/10000)
draw.text((870+xoff(160,num,fnt20b), y_loc+pos),num,'black',font=fnt20b)

pos +=25
draw.rectangle([(620, y_loc+pos+10), (635, y_loc+pos+22)], fill=col2)
draw.rectangle([(635, y_loc+pos+10), (650, y_loc+pos+22)], fill=col3)
draw.text((670, y_loc+pos),"総利益",'black',font=fnt20)
num='{:,.2f}万円'.format(int(df['総利益'].iat[-1])/10000)
draw.text((870+xoff(160,num,fnt20), y_loc+pos),num,'blue',font=fnt20)

pos +=25
draw.rectangle([(620, y_loc+pos+10), (650, y_loc+pos+22)], fill=col2)
draw.text((670, y_loc+pos),"内非課税",'black',font=fnt20)
num='({:,.2f}万円)'.format(int(df['総利益非課税'].iat[-1])/10000)
draw.text((870+xoff(160,num,fnt20), y_loc+pos),num,'blue',font=fnt20)

pos +=25
draw.rectangle([(620, y_loc+pos+10), (650, y_loc+pos+22)], fill=col3)
draw.text((670, y_loc+pos),"内課税",'black',font=fnt20)
num='({:,.2f}万円)'.format(int(df['総利益課税'].iat[-1])/10000)
draw.text((870+xoff(160,num,fnt20), y_loc+pos),num,'blue',font=fnt20)

pos +=25
draw.text((670, y_loc+pos),"税金",'black',font=fnt20)
num='{:,.2f}万円'.format(int((df['総利益課税'].iat[-1])*0.2315)/10000)
draw.text((870+xoff(160,num,fnt20), y_loc+pos),num,'red',font=fnt20)

pos +=25
draw.text((670, y_loc+pos),"税引き後利益",'black',font=fnt20)
num='{:,.2f}万円'.format(int(df['総利益'].iat[-1]-df['総利益課税'].iat[-1]*0.2315)/10000)
draw.text((870+xoff(160,num,fnt20b), y_loc+pos),num,'blue',font=fnt20b)

pos +=25
draw.text((670, y_loc+pos),"税引き後総額",'black',font=fnt20)
num='{:,.2f}万円'.format(int(df['総額'].iat[-1]-df['総利益課税'].iat[-1]*0.2315)/10000)
draw.text((870+xoff(160,num,fntttl), y_loc+pos),num,'black',font=fntttl)

y_loc = 310+330+330+300
draw.line((20, y_loc-20, x_height_all-20, y_loc-20), fill=col_line, width=1)
draw.text((30, y_loc),"一般NISAもつみたてNISAもパフォーマンスは変わらない。インデックスならつみたてNISAでほったらかし!",'red',font=ImageFont.truetype(japb_font, 20))
draw.text((30, y_loc+30),"一般NISAは個別株などを買う場合には有効。また積み立てでなく一括投資だと一般NISAもあり!!",'red',font=ImageFont.truetype(japb_font, 20))

###############################################
outfile = output_dir+'test.png'
im.save(outfile)
IPython.display.Image(outfile)

つみたてNISA一括投資比較

##############################################
# PATH
module_dir = '/content/drive/MyDrive/module'
img_dir    = '/content/drive/MyDrive/input/'
output_dir = '/content/drive/MyDrive/output/'
font_dir   = '/content/drive/MyDrive/fonts/'
##############################################
import os
if not os.path.isdir(output_dir): os.makedirs(output_dir)
import sys
sys.path.append(module_dir)
import datetime as datetime
import pytz
from PIL import Image, ImageDraw, ImageFont
import IPython
from bs4 import BeautifulSoup
import re
import requests
from datetime import datetime as dt
import matplotlib.dates as mdates
import japanize_matplotlib 
from matplotlib import ticker
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import warnings
warnings.simplefilter('ignore')

def set_fukuri(fukuri,df, evyname,addname):
 add_list = []
 total = 0
 for i in range(len(df)):
   total = total*(1+fukuri)+df[evyname][i]
   add_list = np.append(add_list, int(total))
 df[addname]=add_list
 return

## 設定個所 ###################################
icon_img = img_dir+"tommy_icon2.png"
txt_comm = 'トミィ @toushi_tommy'
title = 'つみたてNISA 積み立て投資 vs 一括投資 比較'
###############################################
# フォント
jap_font = '/content/drive/MyDrive/module/japanize_matplotlib/fonts/ipaexg.ttf'
jap2_font = font_dir+'meiryo.ttc'
japb_font = '/content/drive/MyDrive/module/japanize_matplotlib/fonts/ipaexg.ttf'
jap3_font = font_dir+'meiryob.ttc'
if os.path.exists(jap2_font): jap_font = jap2_font
if os.path.exists(jap3_font): japb_font = jap3_font

######################################################
def xycenter(xp, yp, xw, yw, tx, fn):
 x,y = draw.textsize(tx,fn)
 return xp+(xw-x)/2, yp+(yw-y)/2
ycenter = lambda yp,yw,tx,fn : yp+(yw-draw.textsize(tx,fn)[1])/2
xcenter = lambda xp,xw,tx,fn : xp+(xw-draw.textsize(tx,fn)[0])/2
######################################################

###############################################
# ツイッター・インスタ対応サイズ
x_height_all = 1080
y_height_all = 1080
###############################################
# 色
col_back = 'white' # heatmap (38,41,49)
col_txt  = 'black'  # heatmap 'white'
col_line =  'black'  # heatmap 'white'
col_head = (231, 239, 252)

###############################################
im = Image.new('RGB', (x_height_all, y_height_all), col_back)
draw = ImageDraw.Draw(im)
today_j = datetime.datetime.now(pytz.timezone('Asia/Tokyo'))
# フォント ####################################
font_date   = ImageFont.truetype(jap_font, 30)
font_header = ImageFont.truetype(japb_font, 30)
font_subtit = ImageFont.truetype(jap_font, 28)
font_subtit2 = ImageFont.truetype(jap_font, 20)
font_sign   = ImageFont.truetype(jap_font, 16)
font_att   = ImageFont.truetype(japb_font, 16)

###############################################
# ヘッダ作成
len_title=draw.textsize(title, font_header)[0]
draw.rectangle([(10, 10), (x_height_all-10, 120)], fill=col_head)
draw.rectangle([(10, 10), (x_height_all-10, y_height_all-10)], outline=col_line, width=5)
if os.path.exists(icon_img):im.paste(Image.open(icon_img).resize((80, 80)).copy(), (30, 30))
x_pos = x_height_all/2-len_title/2
draw.line((x_pos, 70, x_pos+len_title,70), fill='yellow', width=25)
draw.text((x_pos, 45),title,col_txt,font=font_header)
draw.text((x_height_all-220, 20),txt_comm,col_txt,font=font_sign)
draw.text((x_height_all-260, 90),"更新日時:"+today_j.strftime("%Y/%m/%d %H:%M"),col_txt,font=font_sign)
# draw.text((300, 90),"※為替レートも換算・ETF配当金再投資は税金を払った後の再投資",'red',font=font_att)
draw.line((20,120, x_height_all-20,120), fill=col_line, width=1)
###############################################

draw.text((30, 130),"比較条件",'black',font=ImageFont.truetype(japb_font, 24))
draw.text((60, 170),"投資金額はつみたてNISAを使って年間40万円。年利は5%で計算。",'black',font=ImageFont.truetype(jap_font, 20))
draw.text((60, 195),"2022年1月から投資スタート",'black',font=ImageFont.truetype(jap_font, 20))
draw.text((60, 220),"1.つみたてNISAで毎月33,333円投資",'blue',font=ImageFont.truetype(jap_font, 20))
draw.text((60, 245),"2.つみたてNISAで毎月100円投資、1月にボーナス払いで残り398,800円を一括投資",'blue',font=ImageFont.truetype(jap_font, 20))
draw.line((20, 300, x_height_all-20, 300), fill=col_line, width=1)

fukuri = 0.05/12

col1 = (112,163,255)
str_col1 = '#70A3FF'
col2 = (188,217,249)
str_col2 = '#BCD9F9'
col3 = (61,204,252)
str_col3 = '#3DCCFC'
col4 = (86,172,255)
str_col4 = '#56ACFF' #print (hex(255))

xoff = lambda xw,tx,fn : (xw-draw.textsize(tx,fn)[0])

fnt20b=ImageFont.truetype(japb_font, 20)
fnt20 = ImageFont.truetype(jap_font, 20)
fntttl = ImageFont.truetype(japb_font, 23)

##########################################################################################
# CASE1
y_loc = 310
draw.text((40, y_loc),"1.つみたてNISA(月33,333円)で毎月投資した場合の20年後",'black',font=ImageFont.truetype(japb_font, 20))

df = pd.DataFrame({"Date" : pd.date_range('2022-01-01', '2041-12-31', freq='M')})
df['毎月積立']=33333

df['元本']=df['毎月積立'].cumsum()
set_fukuri(fukuri,df,'毎月積立','総額')
df['総利益']=df['総額']-df['元本']

fig, ax = plt.subplots()
plt.figure(figsize=(13, 5), dpi=50)
plt.bar(df["Date"], df['元本'], color=str_col1,width=50.0)
plt.bar(df["Date"], df['総利益'], bottom=df['元本'], color=str_col2,width=50.0)
plt.xticks(fontsize=24)
plt.yticks(fontsize=24)
outfile = output_dir+'graph.png'
plt.savefig(outfile, bbox_inches="tight")
plt.close()
im.paste(Image.open(outfile).copy(), (50, y_loc+30))

pos = 80
draw.rectangle([(620, y_loc+pos+10), (650, y_loc+pos+22)], fill=col1)
draw.text((670, y_loc+pos),"投資元本:",'black',font=fnt20)
num='{:,.2f}万円'.format(int(df['元本'].iat[-1])/10000)
draw.text((870+xoff(160,num,fnt20b), y_loc+pos),num,'black',font=fnt20b)

pos +=25
draw.rectangle([(620, y_loc+pos+10), (635, y_loc+pos+22)], fill=col2)
draw.rectangle([(635, y_loc+pos+10), (650, y_loc+pos+22)], fill=col3)
draw.text((670, y_loc+pos),"総利益",'black',font=fnt20)
num='{:,.2f}万円'.format(int(df['総利益'].iat[-1])/10000)
draw.text((870+xoff(160,num,fnt20), y_loc+pos),num,'blue',font=fnt20)

pos +=25
draw.text((670, y_loc+pos),"総額",'black',font=fnt20)
num='{:,.2f}万円'.format(int(df['総額'].iat[-1])/10000)
draw.text((870+xoff(160,num,fntttl), y_loc+pos),num,'black',font=fntttl)

##########################################################################################
# CASE2
y_loc = 310+300
draw.line((20, y_loc-20, x_height_all-20, y_loc-20), fill=col_line, width=1)
draw.text((40, y_loc),"2.つみたてNISAで(月100円)で1月にボーナス払い(398,800円)にした場合の20年後",'black',font=ImageFont.truetype(japb_font, 20))

df = pd.DataFrame({"Date" : pd.date_range('2022-01-01', '2041-12-31', freq='M')})
df['毎月積立']=100
for i in range(len(df)):
 if i%12==0:
   df['毎月積立'].loc[i]=398900

df['元本']=df['毎月積立'].cumsum()
set_fukuri(fukuri,df,'毎月積立','総額')
df['総利益']=df['総額']-df['元本']

fig, ax = plt.subplots()
plt.figure(figsize=(13, 5), dpi=50)
plt.bar(df["Date"], df['元本'], color=str_col1,width=50.0)
plt.bar(df["Date"], df['総利益'], bottom=df['元本'], color=str_col2,width=50.0)
plt.xticks(fontsize=24)
plt.yticks(fontsize=24)
outfile = output_dir+'graph.png'
plt.savefig(outfile, bbox_inches="tight")
plt.close()
im.paste(Image.open(outfile).copy(), (50, y_loc+30))

pos = 80
draw.rectangle([(620, y_loc+pos+10), (650, y_loc+pos+22)], fill=col1)
draw.text((670, y_loc+pos),"投資元本:",'black',font=fnt20)
num='{:,.2f}万円'.format(int(df['元本'].iat[-1])/10000)
draw.text((870+xoff(160,num,fnt20b), y_loc+pos),num,'black',font=fnt20b)

pos +=25
draw.rectangle([(620, y_loc+pos+10), (635, y_loc+pos+22)], fill=col2)
draw.rectangle([(635, y_loc+pos+10), (650, y_loc+pos+22)], fill=col3)
draw.text((670, y_loc+pos),"総利益",'black',font=fnt20)
num='{:,.2f}万円'.format(int(df['総利益'].iat[-1])/10000)
draw.text((870+xoff(160,num,fnt20), y_loc+pos),num,'blue',font=fnt20)

pos +=25
draw.text((670, y_loc+pos),"総額",'black',font=fnt20)
num='{:,.2f}万円'.format(int(df['総額'].iat[-1])/10000)
draw.text((870+xoff(160,num,fntttl), y_loc+pos),num,'black',font=fntttl)

###############################################

y_loc = 310+300+300
draw.line((20, y_loc-20, x_height_all-20, y_loc-20), fill=col_line, width=1)
draw.text((30, y_loc),"つみたて投資と疑似一括投資では約31万円の差がある。",'red',font=ImageFont.truetype(japb_font, 20))
draw.text((30, y_loc+30),"クレカ投資ができない為、500円 x 12カ月 x 20年 = 12万円のポイントを逃すが、31万円の差は大きい。",'red',font=ImageFont.truetype(japb_font, 20))
draw.text((30, y_loc+60),"年初に40万円の余力がある人は一括投資すると20年間で19万円お得!",'red',font=ImageFont.truetype(japb_font, 20))
draw.text((30, y_loc+90),"さらに余裕があれば、月5万円をクレカで特定口座で購入するとポイントも逃さない!!",'red',font=ImageFont.truetype(japb_font, 20))

###############################################
outfile = output_dir+'test.png'
im.save(outfile)
IPython.display.Image(outfile)


追記コードです

##############################################
# PATH
module_dir = '/content/drive/MyDrive/module'
img_dir    = '/content/drive/MyDrive/input/'
output_dir = '/content/drive/MyDrive/output/'
font_dir   = '/content/drive/MyDrive/fonts/'
##############################################
import os
if not os.path.isdir(output_dir): os.makedirs(output_dir)
import sys
sys.path.append(module_dir)
import datetime as datetime
import pytz
from PIL import Image, ImageDraw, ImageFont
import IPython
from bs4 import BeautifulSoup
import re
import requests
from datetime import datetime as dt
import matplotlib.dates as mdates
import japanize_matplotlib 
from matplotlib import ticker
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import warnings
warnings.simplefilter('ignore')

def set_fukuri(fukuri,df, evyname,addname):
add_list = []
total = 0
for i in range(len(df)):
  total = total*(1+fukuri)+df[evyname][i]
  add_list = np.append(add_list, int(total))
df[addname]=add_list
return

## 設定個所 ###################################
icon_img = img_dir+"tommy_icon2.png"
txt_comm = 'トミィ @toushi_tommy'
title = 'つみたてNISA 積み立て投資 vs 一括投資 比較2'
###############################################
# フォント
jap_font = '/content/drive/MyDrive/module/japanize_matplotlib/fonts/ipaexg.ttf'
jap2_font = font_dir+'meiryo.ttc'
japb_font = '/content/drive/MyDrive/module/japanize_matplotlib/fonts/ipaexg.ttf'
jap3_font = font_dir+'meiryob.ttc'
if os.path.exists(jap2_font): jap_font = jap2_font
if os.path.exists(jap3_font): japb_font = jap3_font

######################################################
def xycenter(xp, yp, xw, yw, tx, fn):
 x,y = draw.textsize(tx,fn)
 return xp+(xw-x)/2, yp+(yw-y)/2
ycenter = lambda yp,yw,tx,fn : yp+(yw-draw.textsize(tx,fn)[1])/2
xcenter = lambda xp,xw,tx,fn : xp+(xw-draw.textsize(tx,fn)[0])/2
######################################################

###############################################
x_height_all = 1080
y_height_all = 1080
###############################################
# 色
col_back = 'white' # heatmap (38,41,49)
col_txt  = 'black'  # heatmap 'white'
col_line =  'black'  # heatmap 'white'
col_head = (231, 239, 252)

###############################################
im = Image.new('RGB', (x_height_all, y_height_all), col_back)
draw = ImageDraw.Draw(im)
today_j = datetime.datetime.now(pytz.timezone('Asia/Tokyo'))
# フォント ####################################
font_date   = ImageFont.truetype(jap_font, 30)
font_header = ImageFont.truetype(japb_font, 30)
font_subtit = ImageFont.truetype(jap_font, 28)
font_subtit2 = ImageFont.truetype(jap_font, 20)
font_sign   = ImageFont.truetype(jap_font, 16)
font_att   = ImageFont.truetype(japb_font, 16)

###############################################
# ヘッダ作成
len_title=draw.textsize(title, font_header)[0]
draw.rectangle([(10, 10), (x_height_all-10, 120)], fill=col_head)
draw.rectangle([(10, 10), (x_height_all-10, y_height_all-10)], outline=col_line, width=5)
if os.path.exists(icon_img):im.paste(Image.open(icon_img).resize((80, 80)).copy(), (30, 30))
x_pos = x_height_all/2-len_title/2
draw.line((x_pos, 70, x_pos+len_title,70), fill='yellow', width=25)
draw.text((x_pos, 45),title,col_txt,font=font_header)
draw.text((x_height_all-220, 20),txt_comm,col_txt,font=font_sign)
draw.text((x_height_all-260, 90),"更新日時:"+today_j.strftime("%Y/%m/%d %H:%M"),col_txt,font=font_sign)
# draw.text((300, 90),"※為替レートも換算・ETF配当金再投資は税金を払った後の再投資",'red',font=font_att)
draw.line((20,120, x_height_all-20,120), fill=col_line, width=1)
###############################################

draw.text((30, 130),"比較条件",'black',font=ImageFont.truetype(japb_font, 24))
draw.text((60, 170),"投資金額はつみたてNISAを使って年間40万円。年利は5%で計算。2022年1月から投資スタート。",'black',font=ImageFont.truetype(jap_font, 20))
draw.text((60, 195),"実際年初に一括投資しても、毎月の投資余裕がなくなる訳ではないので、特定口座で運用。同じ土俵で比較。",'black',font=ImageFont.truetype(jap_font, 20))
draw.text((60, 220),"1.毎月つみたてNISAで33,333円投資+特定口座で100円投資、年初に特定口座で398,800円を一括投資",'blue',font=ImageFont.truetype(jap_font, 20))
draw.text((60, 245),"2.毎月特定口座で33,333円投資+つみたてNISAで100円投資、年初につみたてNISAで398,800円を一括投資",'blue',font=ImageFont.truetype(jap_font, 20))
draw.line((20, 300, x_height_all-20, 300), fill=col_line, width=1)

fukuri = 0.05/12

col1 = (112,163,255)
str_col1 = '#70A3FF'
col2 = (188,217,249)
str_col2 = '#BCD9F9'
col3 = (61,204,252)
str_col3 = '#3DCCFC'
col4 = (86,172,255)
str_col4 = '#56ACFF'

xoff = lambda xw,tx,fn : (xw-draw.textsize(tx,fn)[0])

fnt20b=ImageFont.truetype(japb_font, 20)
fnt20 = ImageFont.truetype(jap_font, 20)
fntttl = ImageFont.truetype(japb_font, 23)

##########################################################################################
# CASE1
y_loc = 310
draw.text((40, y_loc),"年利5%:つみたてNISA(年初39.88万円)、特定口座(月3.3万円)+つみたてNISA(月100円)の20年後",'black',font=ImageFont.truetype(japb_font, 20))

df = pd.DataFrame({"Date" : pd.date_range('2022-01-01', '2041-12-31', freq='M')})
df['毎月積立']=33333+100
df['毎月課税']=33333+100
df['毎月非課税']=0
for i in range(len(df)):
 if i%12==0:
   df['毎月非課税'].loc[i]=400000-1200
   df['毎月積立'].loc[i]=400000-1200+33333+100

df['元本']=df['毎月積立'].cumsum()
set_fukuri(fukuri,df,'毎月積立','総額')
df['総利益']=df['総額']-df['元本']

df['非課税元本']=df['毎月非課税'].cumsum()
set_fukuri(fukuri,df,'毎月非課税','非課税総額')
df['総利益非課税']=df['非課税総額']-df['非課税元本']

df['課税元本']=df['毎月課税'].cumsum()
set_fukuri(fukuri,df,'毎月課税','課税総額')
df['総利益課税']=df['課税総額']-df['課税元本']


fig, ax = plt.subplots()
plt.figure(figsize=(13, 5), dpi=50)
plt.bar(df["Date"], df['元本'], color=str_col1,width=50.0)
plt.bar(df["Date"], df['総利益非課税'], bottom=df['元本'], color=str_col2,width=50.0)
plt.bar(df["Date"], df['総利益課税'], bottom=df['元本']+df['総利益非課税'], color=str_col3,width=50.0)
plt.xticks(fontsize=24)
plt.yticks(fontsize=24)
outfile = output_dir+'graph.png'
plt.savefig(outfile, bbox_inches="tight")
plt.close()
im.paste(Image.open(outfile).copy(), (50, y_loc+30))

pos = 30
draw.rectangle([(620, y_loc+pos+10), (650, y_loc+pos+22)], fill=col1)
draw.text((670, y_loc+pos),"投資元本:",'black',font=fnt20)
num='{:,.2f}万円'.format(int(df['元本'].iat[-1])/10000)
draw.text((870+xoff(160,num,fnt20b), y_loc+pos),num,'black',font=fnt20b)

pos +=25
draw.text((670, y_loc+pos),"最終金額",'black',font=fnt20)
num='{:,.2f}万円'.format(int(df['総額'].iat[-1])/10000)
draw.text((870+xoff(160,num,fnt20b), y_loc+pos),num,'black',font=fnt20b)

pos +=25
draw.rectangle([(620, y_loc+pos+10), (635, y_loc+pos+22)], fill=col2)
draw.rectangle([(635, y_loc+pos+10), (650, y_loc+pos+22)], fill=col3)
draw.text((670, y_loc+pos),"総利益",'black',font=fnt20)
num='{:,.2f}万円'.format(int(df['総利益'].iat[-1])/10000)
draw.text((870+xoff(160,num,fnt20), y_loc+pos),num,'blue',font=fnt20)

pos +=25
draw.rectangle([(620, y_loc+pos+10), (650, y_loc+pos+22)], fill=col2)
draw.text((670, y_loc+pos),"内非課税",'black',font=fnt20)
num='({:,.2f}万円)'.format(int(df['総利益非課税'].iat[-1])/10000)
draw.text((870+xoff(160,num,fnt20), y_loc+pos),num,'blue',font=fnt20)

pos +=25
draw.rectangle([(620, y_loc+pos+10), (650, y_loc+pos+22)], fill=col3)
draw.text((670, y_loc+pos),"内課税",'black',font=fnt20)
num='({:,.2f}万円)'.format(int(df['総利益課税'].iat[-1])/10000)
draw.text((870+xoff(160,num,fnt20), y_loc+pos),num,'blue',font=fnt20)

pos +=25
draw.text((670, y_loc+pos),"税金",'black',font=fnt20)
num='{:,.2f}万円'.format(int((df['総利益課税'].iat[-1])*0.2315)/10000)
draw.text((870+xoff(160,num,fnt20), y_loc+pos),num,'red',font=fnt20)

pos +=25
draw.text((670, y_loc+pos),"税引き後利益",'black',font=fnt20)
num='{:,.2f}万円'.format(int(df['総利益'].iat[-1]-df['総利益課税'].iat[-1]*0.2315)/10000)
draw.text((870+xoff(160,num,fnt20b), y_loc+pos),num,'blue',font=fnt20b)

pos +=25
draw.text((670, y_loc+pos),"税引き後総額",'black',font=fnt20)
num='{:,.2f}万円'.format(int(df['総額'].iat[-1]-df['総利益課税'].iat[-1]*0.2315)/10000)
draw.text((870+xoff(160,num,fntttl), y_loc+pos),num,'black',font=fntttl)

#########################################################################################################
y_loc = 310+300
draw.line((20, y_loc-20, x_height_all-20, y_loc-20), fill=col_line, width=1)
draw.text((40, y_loc),"年利5%:特定口座(年初39.88万円)、つみたてNISA(月3.3万円)+特定口座(月100円)の20年後",'black',font=ImageFont.truetype(japb_font, 20))

df = pd.DataFrame({"Date" : pd.date_range('2022-01-01', '2041-12-31', freq='M')})
df['毎月積立']=33333+100
df['毎月課税']=100
df['毎月非課税']=33333
for i in range(len(df)):
 if i%12==0:
   df['毎月課税'].loc[i]=400000-1200
   df['毎月積立'].loc[i]=400000-1200+33333+100

df['元本']=df['毎月積立'].cumsum()
set_fukuri(fukuri,df,'毎月積立','総額')
df['総利益']=df['総額']-df['元本']

df['非課税元本']=df['毎月非課税'].cumsum()
set_fukuri(fukuri,df,'毎月非課税','非課税総額')
df['総利益非課税']=df['非課税総額']-df['非課税元本']

df['課税元本']=df['毎月課税'].cumsum()
set_fukuri(fukuri,df,'毎月課税','課税総額')
df['総利益課税']=df['課税総額']-df['課税元本']


fig, ax = plt.subplots()
plt.figure(figsize=(13, 5), dpi=50)
plt.bar(df["Date"], df['元本'], color=str_col1,width=50.0)
plt.bar(df["Date"], df['総利益非課税'], bottom=df['元本'], color=str_col2,width=50.0)
plt.bar(df["Date"], df['総利益課税'], bottom=df['元本']+df['総利益非課税'], color=str_col3,width=50.0)
plt.xticks(fontsize=24)
plt.yticks(fontsize=24)
outfile = output_dir+'graph.png'
plt.savefig(outfile, bbox_inches="tight")
plt.close()
im.paste(Image.open(outfile).copy(), (50, y_loc+30))

pos = 30
draw.rectangle([(620, y_loc+pos+10), (650, y_loc+pos+22)], fill=col1)
draw.text((670, y_loc+pos),"投資元本:",'black',font=fnt20)
num='{:,.2f}万円'.format(int(df['元本'].iat[-1])/10000)
draw.text((870+xoff(160,num,fnt20b), y_loc+pos),num,'black',font=fnt20b)

pos +=25
draw.text((670, y_loc+pos),"最終金額",'black',font=fnt20)
num='{:,.2f}万円'.format(int(df['総額'].iat[-1])/10000)
draw.text((870+xoff(160,num,fnt20b), y_loc+pos),num,'black',font=fnt20b)

pos +=25
draw.rectangle([(620, y_loc+pos+10), (635, y_loc+pos+22)], fill=col2)
draw.rectangle([(635, y_loc+pos+10), (650, y_loc+pos+22)], fill=col3)
draw.text((670, y_loc+pos),"総利益",'black',font=fnt20)
num='{:,.2f}万円'.format(int(df['総利益'].iat[-1])/10000)
draw.text((870+xoff(160,num,fnt20), y_loc+pos),num,'blue',font=fnt20)

pos +=25
draw.rectangle([(620, y_loc+pos+10), (650, y_loc+pos+22)], fill=col2)
draw.text((670, y_loc+pos),"内非課税",'black',font=fnt20)
num='({:,.2f}万円)'.format(int(df['総利益非課税'].iat[-1])/10000)
draw.text((870+xoff(160,num,fnt20), y_loc+pos),num,'blue',font=fnt20)

pos +=25
draw.rectangle([(620, y_loc+pos+10), (650, y_loc+pos+22)], fill=col3)
draw.text((670, y_loc+pos),"内課税",'black',font=fnt20)
num='({:,.2f}万円)'.format(int(df['総利益課税'].iat[-1])/10000)
draw.text((870+xoff(160,num,fnt20), y_loc+pos),num,'blue',font=fnt20)

pos +=25
draw.text((670, y_loc+pos),"税金",'black',font=fnt20)
num='{:,.2f}万円'.format(int((df['総利益課税'].iat[-1])*0.2315)/10000)
draw.text((870+xoff(160,num,fnt20), y_loc+pos),num,'red',font=fnt20)

pos +=25
draw.text((670, y_loc+pos),"税引き後利益",'black',font=fnt20)
num='{:,.2f}万円'.format(int(df['総利益'].iat[-1]-df['総利益課税'].iat[-1]*0.2315)/10000)
draw.text((870+xoff(160,num,fnt20b), y_loc+pos),num,'blue',font=fnt20b)

pos +=25
draw.text((670, y_loc+pos),"税引き後総額",'black',font=fnt20)
num='{:,.2f}万円'.format(int(df['総額'].iat[-1]-df['総利益課税'].iat[-1]*0.2315)/10000)
draw.text((870+xoff(160,num,fntttl), y_loc+pos),num,'black',font=fntttl)
###############################################

y_loc = 310+300+300
draw.line((20, y_loc-20, x_height_all-20, y_loc-20), fill=col_line, width=1)
draw.text((30, y_loc),"同じ土俵で比較するとNISA枠での「つみたて投資と一括投資」の差はわずか7万円程度。",'red',font=ImageFont.truetype(japb_font, 20))
draw.text((30, y_loc+30),"これが現実的な解に近い為、この7万円を取りに行くのであれば一括投資も可。",'red',font=ImageFont.truetype(japb_font, 20))
draw.text((30, y_loc+60),"そうでなければ、そのまま積み立て投資でも良い。",'red',font=ImageFont.truetype(japb_font, 20))
draw.text((30, y_loc+90),"(20年後歳取ってからの7万円って、そうでもないのでは?)",'red',font=ImageFont.truetype(japb_font, 20))

###############################################
###############################################
outfile = output_dir+'test.png'
im.save(outfile)
IPython.display.Image(outfile)


以上です

ここから先は

0字

¥ 150

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

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