再帰処理
前回、再帰処理の回数を大幅に減らす方法を紹介しました。
今回は再帰処理を使って積立の複利計算をしてみたので紹介します。
ではでは始めていきましょう。
金利X%で毎月Y円、Z年積み立てた時の総額は?
まずは再帰処理を使わずに、金利X%で毎月Y円、Z年積み立てた時、いくらになるのか計算するプログラムを作成してみました。
また初期投資額も決められる様にしてあります。
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.cm as cm
start_amount = 100000
adding_per_month = 10000
interest_per_year = [-5, -3, -1, 1, 3, 5]
years = 30
def interest_calc(start_amount, adding_per_month, interest, years):
total_buy = []; total_amount = []
current_buy = start_amount
current_total_amount = start_amount
for i in range(years):
for _ in range(12):
current_buy = current_buy + adding_per_month
current_total_amount = current_total_amount*(1 + interest/(12*100)) + adding_per_month
total_buy.append(current_buy)
total_amount.append(current_total_amount)
return total_buy, total_amount
df_buy = pd.DataFrame(index=range(years))
df_total = pd.DataFrame(index=range(years))
for interest in interest_per_year:
total_buy, total_amount = interest_calc(start_amount, adding_per_month, interest, years)
df_buy[interest] = total_buy
df_total[interest] = total_amount
fig = plt.figure()
plt.clf()
for i, interest in enumerate(interest_per_year):
color = cm.jet(i/len(interest_per_year))
plt.plot(df_buy.index, df_buy[interest], ls= ":", color=color)
plt.plot(df_total.index, df_total[interest], color=color, label=f"{interest} %")
plt.legend(title="Interest")
plt.ticklabel_format(style='plain',axis='y')
plt.show()
実行結果
まずはこちらのプログラムを上から順に解説していきます。
最初はライブラリのインポート。
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.cm as cm
pandasとmatplotlibのpyplotとcmを使っています。
次にパラメータの設定。
start_amount = 100000
adding_per_month = 10000
interest_per_year = [-5, -3, -1, 1, 3, 5]
years = 30
start_amountが初期投資額、adding_per_monthが毎月の積立額、interest_per_yearが年利(リストで指定)、yearsが積み立て年数です。
interest_calc関数で複利計算をして投資総額を「total_buy」、最終金額を「total_amount」として返します。
def interest_calc(start_amount, adding_per_month, interest, years):
total_buy = []; total_amount = []
current_buy = start_amount
current_total_amount = start_amount
for i in range(years):
for _ in range(12):
current_buy = current_buy + adding_per_month
current_total_amount = current_total_amount*(1 + interest/(12*100)) + adding_per_month
total_buy.append(current_buy)
total_amount.append(current_total_amount)
return total_buy, total_amount
ここでは年利を12で割って月利として計算しています。
interest_calc関数で得られた値をそれぞれPandasのデータフレームに格納します。
df_buy = pd.DataFrame(index=range(years))
df_total = pd.DataFrame(index=range(years))
for interest in interest_per_year:
total_buy, total_amount = interest_calc(start_amount, adding_per_month, interest, years)
df_buy[interest] = total_buy
df_total[interest] = total_amount
最後にmatplotlibでグラフ表示して完了です。
fig = plt.figure()
plt.clf()
for i, interest in enumerate(interest_per_year):
color = cm.jet(i/len(interest_per_year))
plt.plot(df_buy.index, df_buy[interest], ls= ":", color=color)
plt.plot(df_total.index, df_total[interest], color=color, label=f"{interest} %")
plt.legend(title="Interest")
plt.ticklabel_format(style='plain',axis='y')
plt.show()
これで複利の計算プログラムができました。
金利X%で毎月Y円積み立てて総額Z円にするには何年積み立てればいい?
次は金利X%で毎月Y円積み立てる場合、総額Z円にするには何年積み立てればいいのか問題を計算するプログラムを作成してみました。
start_amount = 100000
adding_per_month = 50000
target_amount = 100000000
interest_per_year = [1, 3, 5]
def interest_calc(current_amount, adding_per_month, interest, target_amount, year=0):
current_total_amount = current_amount
for i in range(12):
current_total_amount = current_total_amount*(1 + interest/(12*100)) + adding_per_month
if current_total_amount >= target_amount:
return year, i, int(current_total_amount)
end_year, end_month, current_total_amount = interest_calc(current_total_amount, adding_per_month, interest, target_amount, year=year+1)
return end_year, end_month, current_total_amount
for interest in interest_per_year:
end_year, end_month, current_total_amount = interest_calc(start_amount, adding_per_month, interest, target_amount)
print(f"Total amount: {current_total_amount}, interest: {interest}% - {end_year} years {end_month} months later")
実行結果
Total amount: 100068481, interest: 1% - 97 years 11 months later
Total amount: 100119374, interest: 3% - 59 years 7 months later
Total amount: 100381450, interest: 5% - 44 years 7 months later
こちらのプログラムでは計算するだけなのでライブラリはいりません。
パラメータとしてはstart_amountが初期投資額、adding_per_monthが毎月の積立額、target_amountが目標金額、interest_per_yearが年利(リストで指定)です。
start_amount = 100000
adding_per_month = 50000
target_amount = 100000000
interest_per_year = [1, 3, 5]
次に複利計算をするinterest_calc関数ですが、先ほど同様年利を12で割って月利として計算しています。
またここで再帰処理を使っていて、目標金額に到達しなかった場合、次の年の計算を行います。
def interest_calc(current_amount, adding_per_month, interest, target_amount, year=0):
current_total_amount = current_amount
for i in range(12):
current_total_amount = current_total_amount*(1 + interest/(12*100)) + adding_per_month
if current_total_amount >= target_amount:
return year, i, int(current_total_amount)
end_year, end_month, current_total_amount = interest_calc(current_total_amount, adding_per_month, interest, target_amount, year=year+1)
return end_year, end_month, current_total_amount
最後に計算を実行して、結果を表示します。
for interest in interest_per_year:
end_year, end_month, current_total_amount = interest_calc(start_amount, adding_per_month, interest, target_amount)
print(f"Total amount: {current_total_amount}, interest: {interest}% - {end_year} years {end_month} months later")
ということで目標金額1億円にするためには年利5%で初期投資10万円、月5万円積み立てすると44年7ヶ月かかるということが分かりました。
就職してから退職するまで月5万円積み立てれば届くかもというレベルですが、コツコツ積み上げることで夢の1億円に到達できるかもしれないんだなぁと若い頃から投資をしていなかったのが残念に思えてなりませんね。
次回はlmfitでフィッティング精度を上げられるかもしれない4つの方法を紹介します。
ではでは今回はこんな感じで。
コメント