Pythonで投資の積立シミュレーションを作ってみよう!

この記事には広告を含む場合があります。

記事内で紹介する商品を購入することで、当サイトに売り上げの一部が還元されることがあります。

当ブログの読者の方は新NISAなどで積み立て投資をすでに始めている方が多いと思いますが、「毎月積み立て投資をして将来の資産がどのくらい増えるのだろうか?」という疑問を抱いたことはありませんか?

証券会社のサイトなどでは、積立シミュレーションというサービスが提供されており、積立金額や想定年利、運用期間を入力することで積み立て投資のシュミレーションをすることができます。

そこで本記事では、Pythonを使って証券会社のサイトなどでよくある積立シミュレーションをプログラミングしていきたいと思います。。

複利計算の基本から、グラフや表を使った視覚的なデータ表示までを実装していきます。

ぜひ一緒に、将来の資産成長をPythonでシミュレーションしてみましょう!

定期積立の複利計算式

積立投資の複利計算は、次のような式で表されます。

\begin{equation}A = P \times \left( \frac{r}{r \times (1 + r)^t – 1} \right) \times (1 + r)\end{equation}

  • A: 将来価値(最終金額)
  • P: 毎月の積立金額
  • r: 毎月の利率(年利を月利に変換)
  • t: 投資期間(月数)

複利では利益が利益を生むため、運用期間が長くなるほど発生する利益の金額が大きくなります。これを「複利効果」と呼び、効率よく利益を得るための方法として知られています。

サンプルコード

このシミュレーションでは、毎月一定額を積み立て、複利運用される場合の成長を計算します。

さらに、Pythonの標準ライブラリのtkinterを使って入力フォームを作ります。入力した値に基づいてシミュレーションを実行し、グラフと表を表示します。

Python
import numpy as np
import matplotlib.pyplot as plt
from tkinter import Tk, Label, Entry, Button, StringVar, ttk
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import japanize_matplotlib


# 定期積立複利計算を行う関数
def calculate_saving_plan(P, r, t):
    balance = []
    principal = []
    for month in range(1, t + 1):
        A = P * ((1 + r) ** month - 1) / r * (1 + r)  # 複利計算による総額
        balance.append(A)
        principal.append(P * month)  # 元本(積立金の累計)
    return balance, principal


# グラフを描画する関数
def plot_saving_plan(P, r, t):
    months = np.arange(1, t + 1)
    balance, principal = calculate_saving_plan(P, r, t)

    fig, ax = plt.subplots(figsize=(6, 4))
    ax.plot(months, balance, label=f"総額(複利): ¥{P}毎月積立, 月利: {r * 100:.2f}%")
    ax.plot(months, principal, label="元本の累計", linestyle='--', color='orange')
    ax.set_xlabel('月数')
    ax.set_ylabel('総額(円)')
    ax.set_title('定期積立シミュレーション')
    ax.grid(True)
    ax.legend()

    return fig, months, balance, principal


# 表を更新する関数
def update_table(months, balance, principal):
    for i in table.get_children():
        table.delete(i)
    for month, amount, prin in zip(months, balance, principal):
        table.insert('', 'end', values=(month, f{amount:,.2f}", f{prin:,.2f}"))


# ボタンが押されたときにグラフと表を描画する関数
def on_calculate():
    P = float(monthly_saving_var.get())
    annual_rate = float(annual_rate_var.get()) / 100  # 年利をパーセントから小数に変換
    r = annual_rate / 12  # 月利
    t_years = int(years_var.get())
    t_months = t_years * 12  # 総月数

    fig, months, balance, principal = plot_saving_plan(P, r, t_months)

    # 既存のキャンバスを削除して、新しいキャンバスを作成
    if canvas_frame.winfo_children():
        for widget in canvas_frame.winfo_children():
            widget.destroy()

    canvas = FigureCanvasTkAgg(fig, master=canvas_frame)
    canvas.draw()
    canvas.get_tk_widget().pack()

    # テーブルを更新
    update_table(months, balance, principal)


# Tkinter GUIの設定
root = Tk()
root.title("積立シミュレーション")

# 入力用のウィジェット
Label(root, text="毎月の積立額(円):").grid(row=0, column=0)
monthly_saving_var = StringVar(value='10000')
Entry(root, textvariable=monthly_saving_var).grid(row=0, column=1)

Label(root, text="年利率(%):").grid(row=1, column=0)
annual_rate_var = StringVar(value='5')
Entry(root, textvariable=annual_rate_var).grid(row=1, column=1)

Label(root, text="積立期間(年):").grid(row=2, column=0)
years_var = StringVar(value='10')
Entry(root, textvariable=years_var).grid(row=2, column=1)

# 計算ボタン
Button(root, text="計算してグラフと表を表示", command=on_calculate).grid(row=3, columnspan=2)

# グラフを表示するためのフレーム
canvas_frame = Label(root)
canvas_frame.grid(row=4, columnspan=2)

# 表の作成
columns = ('月', '総額(円)', '元本(円)')
table = ttk.Treeview(root, columns=columns, show='headings')
table.heading('月', text='月')
table.heading('総額(円)', text='総額(円)')
table.heading('元本(円)', text='元本(円)')
table.grid(row=5, columnspan=2)

# メインループ
root.mainloop()

ポイントの解説

積立シミュレーションの計算

  • calculate_saving_plan関数は、毎月積立金額P、月利r、期間t(月数)を引数に取り、積立の成長を計算します。
  • A = P * ((1 + r)**month - 1) / r * (1 + r)で毎月の最終金額を計算します。
  • balance.append(A)balanceに計算した値をリスト形式で格納していきます。
  • 元本の累計も計算して、principalにリスト形式で格納します。

グラフ描画機能

  • plot_saving_plan関数は、月ごとの資産の推移をグラフにプロットしてます。
  • 積立の複利成長に加えて、元本の累計を破線(オレンジ色)としてプロットします。

表の表示機能

  • update_table関数では、Treeviewウィジェットを使って、積立の各月ごとの最終金額をテーブル形式で表示します。
  • 月ごとの元本の累計を表の第3列に表示します。

インターフェース

  • tkinterを使用して、ユーザーが毎月の積立額、年利率、積立期間を入力できるインターフェースを作成しています。
  • ボタンをクリックすると、積立シミュレーションの結果がグラフと表で表示されます。

実行結果

Tkinterウィンドウが開き、毎月の積立額や想定の年利率、積立期間を入力すると、その結果が積立シミュレーションとしてグラフと表で表示されます。

デフォルトの状態でボタンをクリックすると、以下のような結果になります。

毎月の積立金額が10,000円、年利率が5%、積立期間が10年で最終的な総額は、1,559,292円になりました。期間が長くなるにつれて、複利の効果で資産の増加が加速しているのが視覚的にもわかります。

まとめ

今回は投資の積立シミュレーションをPythonで作ってみました。

将来の資産形成を視覚化することで、より具体的な投資計画を立てることができます。

こういったシュミレーションを作成することで、プログラミングのスキルが上達すると思うので、皆さんも挑戦してみてください。