Python開発|Tkinterでアプリ制作⑤ 資産シミュレーターを作成しました【複利計算アプリ】

今回はPythonを使って、資産シミュレーターを作成しました。

投資金額、毎月の積立額、利回り、投資期間を入力すると、将来の資産推移を計算できます。

作成したアプリでは、

  • 投資元金
  • 資産額
  • 運用益
  • 資産推移グラフ

を確認できます。

長期投資で重要になる複利効果を、視覚的に確認できるアプリを目指しました。


アプリのダウンロード

目次

Mac版

以下からダウンロードできます。

【資産シミュレーター Mac版】

https://bakksan.com/Download/asset_simulator.zip

※現在はMac版のみ公開しています。

Windows版については準備ができ次第公開予定です。


作成したアプリの画面

このアプリでは、以下の項目を入力します。

  • 当初投資金額
  • 積立金額(月)
  • 利回り
  • 投資期間

入力後、「計算」ボタンを押すと、年ごとの資産推移が表示されます。

表示内容は、

年数投資元金資産額運用益
0年投資開始額開始時資産0円
10年投資総額運用後資産利益

のように確認できます。

また、グラフでは投資元金と運用後の資産額を比較できます。


使用した技術

今回使用した主な技術は以下です。

  • Python
  • Tkinter
  • Matplotlib

Python

計算処理やアプリ全体の制御に使用しました。

Tkinter

Python標準のGUIライブラリです。

入力欄や表、ボタンなど、デスクトップアプリの画面作成に利用しました。

Matplotlib

計算した資産推移をグラフ表示するために使用しました。


プログラムの流れ

今回のプログラムは大きく3つに分けています。

① 複利計算

まず、入力された条件から将来の資産額を計算します。

計算する項目は、

  • 初期投資額の成長
  • 毎月積立額の成長

です。

計算結果として、年数ごとの資産額リストを作成しています。


② 表示処理

計算結果をTkinterの表(Treeview)に表示しています。

表示内容は、

  • 年数
  • 投資元金
  • 資産額
  • 運用益

です。

運用益を分けて表示することで、複利による利益の増加を確認できます。


③ グラフ表示

Matplotlibを利用して資産推移をグラフ化しています。

投資元金の線と、運用後の資産額の線を表示することで、

「投資したお金」

「運用によって増えたお金」

の差を見ることができます。


完成コード

クリックすると完成コードを表示します。
#計算部分
def asset_suii(asset_start,monthly,rate,years):
    assets=[asset_start]
    years_list=[0]
    rate_100=rate/100 
    rate_monthly=rate_100/12 #月利を計算
    
    for i in range(1,years+1):
        month_total=i*12 #総月数を計算
        if rate_100 == 0:
            results = asset_start + (monthly*month_total)
        else:
            results=(asset_start*(1+rate_100)**i) + ( #当初金額を運用した場合の複利計算
                    monthly*((1+rate_monthly)**month_total-1)/rate_monthly) #積立金額の複利計算

        years_list.append(i)    
        assets.append(round(results))
    #リストを返す
    return years_list,assets 

#print(asset_suii(1000000,10000,5,10))

import tkinter as tk
from tkinter import ttk, messagebox
from matplotlib.figure import Figure
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg

#tkinterでフレーム作成
root = tk.Tk()
root.title('資産シミュレーター')
root.geometry("600x780")

#入力画面を作成
label_start = tk.Label(root,text='当初投資金額')
label_start.pack()
entry_start = tk.Entry(root)
entry_start.pack()

label_monthly = tk.Label(root,text='積立金額(月)')
label_monthly.pack()
entry_monthly = tk.Entry(root)
entry_monthly.pack()

label_rate = tk.Label(root,text='利回り')
label_rate.pack()
entry_rate = tk.Entry(root)
entry_rate.pack()

label_years = tk.Label(root,text='期間(年)')
label_years.pack()
entry_years = tk.Entry(root)
entry_years.pack()

#表を表示する場所
table_frame = tk.Frame(root)
table_frame.pack()

#グラフを追加
graph_frame = tk.Frame(root)
graph_frame.pack()
graph_canvas = None

#前回のグラフを削除
def clear_graph():
    global graph_canvas

    if graph_canvas:
        graph_canvas.get_tk_widget().destroy()
        graph_canvas = None

#前回の表示を削除する
def clear_table():
    for item in tree.get_children():
        tree.delete(item)

#表を作成
tree = ttk.Treeview(table_frame,columns=("year", "principal", "asset", "profit"),show="headings")
tree.heading("year",text="年数")
tree.heading("principal",text="投資元金")
tree.heading("asset",text="資産額")
tree.heading("profit",text="運用益")
tree.column("year", width=50, anchor="center")
tree.column("principal", width=120, anchor="e")
tree.column("asset", width=120, anchor="e")
tree.column("profit", width=120, anchor="e")
tree.pack()

#関数をつなぐ
def calculate():
    global graph_canvas
    clear_table()
    clear_graph()
    try:
        asset_start = int(entry_start.get())
        monthly = int(entry_monthly.get())
        rate = float(entry_rate.get())
        years = int(entry_years.get())
    except ValueError:
        messagebox.showerror("入力エラー","数字を入力してください")
        return

    years_list, assets = asset_suii(asset_start,monthly,rate,years)

    # リストの中身を表示
    for year, asset in zip(years_list, assets):
        principal = asset_start + monthly * year * 12
        profit = asset - principal
        tree.insert("","end",values=(f"{year}年",f"{principal:,}円",f"{asset:,}円",f"{profit:,}円")) 

    #元金リスト作成
    principal = []
    for year in years_list:
        principal.append(asset_start + monthly * year * 12)

    #グラフ作成
    fig = Figure(figsize=(6,4))
    ax = fig.add_subplot(111)

    #万円に変換
    assets_man = [asset / 10000 for asset in assets]

    #元金の線
    principal_man = [money / 10000 for money in principal]
    ax.plot(years_list, principal_man, label="Principal")

    #資産額の線
    ax.plot(years_list, assets_man, linewidth=3, label="Assets")
    #最後の年の資産額を取得
    final_asset = assets_man[-1]

    #グラフの最終数字の表示
    ax.annotate(f"{final_asset:,.0f}",xy=(years_list[-1], final_asset),xytext=(-60, 20),textcoords="offset points",arrowprops=dict(arrowstyle="->"))
    ax.set_title("Asset Growth Simulation")
    ax.set_xlabel("Years")
    ax.set_ylabel("Asset Value (10k JPY)")
    ax.legend()
    ax.grid(True)

    graph_canvas = FigureCanvasTkAgg(fig,master=graph_frame)
    graph_canvas.draw()
    graph_canvas.get_tk_widget().pack()

#計算ボタン作成 ボタンを押すとcalculate実行
button = tk.Button(root,text='計算',command=calculate)
button.pack()
root.mainloop()
コードの解説

コード解説

ここからは、プログラムの主要部分について解説します。

① 複利計算を行う関数

まず、資産推移を計算する部分です。

def asset_suii(asset_start,monthly,rate,years):

この関数では、

  • asset_start:最初に投資する金額
  • monthly:毎月の積立金額
  • rate:年間利回り
  • years:投資期間

を受け取り、将来の資産額を計算します。


年ごとのデータを保存

assets=[asset_start]
years_list=[0]

最初の状態として、

  • 0年目
  • 初期投資額

をリストに保存しています。

あとで表やグラフを作成するために、年ごとのデータを記録します。


利回りを月単位へ変換

rate_100=rate/100
rate_monthly=rate_100/12

入力された利回りは「5%」のような数字なので、計算用に小数へ変換します。

また、積立投資では毎月運用されるため、年間利回りを12で割って月利を求めています。


複利計算

results=(asset_start*(1+rate_100)**i)

この部分では、最初に投資した金額が複利で増える計算をしています。

例えば100万円を年利5%で10年間運用すると、毎年増えた利益も次の年の運用対象になります。

これが複利効果です。


積立金額の計算

monthly*((1+rate_monthly)**month_total-1)/rate_monthly

毎月追加する投資金額についても、積立した時期ごとに運用期間が違うため、複利計算をしています。


② 計算結果を表へ表示

計算結果はTkinterのTreeviewを使って表示しています。

tree = ttk.Treeview(
    table_frame,
    columns=("year","principal","asset","profit"))

表には4つの項目を設定しました。

  • 年数
  • 投資元金
  • 資産額
  • 運用益

です。


投資元金と運用益を計算

principal = asset_start + monthly * year * 12
profit = asset - principal

投資した合計金額を計算し、

資産額との差額を運用益として表示しています。

これにより、

「いくら投資したのか」
「運用によっていくら増えたのか」

を分けて確認できます。


③ グラフ作成

グラフ表示にはMatplotlibを使用しています。

fig = Figure(figsize=(6,4))
ax = fig.add_subplot(111)

グラフの大きさを設定し、描画エリアを作成しています。


元金の線を表示

ax.plot(years_list, principal_man, label="Principal")

投資した金額の推移を表示します。


資産額の線を表示

ax.plot(years_list, assets_man,
        linewidth=3,
        label="Assets")

運用後の資産額を表示します。

2本の線を比較することで、時間が経過するほど複利による差が大きくなることを確認できます。


④ エラー処理

入力された値が数字ではない場合、

messagebox.showerror("入力エラー","数字を入力してください")

を表示します。

これにより、間違った入力でもアプリが停止しないようにしています。


今回学んだこと

今回の制作では、

  • Pythonで計算処理を作る
  • Tkinterで画面を作る
  • 表形式でデータを表示する
  • Matplotlibでグラフ化する
  • Pythonプログラムをアプリ化する

という流れを一通り経験できました。

小さな計算プログラムから始めても、機能を追加していくことで実用的なアプリへ発展できます。


今後追加したい機能

今回のアプリは基本的な複利計算機能ですが、今後はさらに機能追加していく予定です。

追加予定の機能:

  • Windows版対応
  • NISA積立シミュレーション
  • 配当金管理機能
  • 保有資産管理機能
  • ポートフォリオ分析機能

最終的には、自分の資産管理ができるアプリへ発展させていきたいと思います。


まとめ

今回はPythonを使って、資産シミュレーターをデスクトップアプリ化しました。

最初はPythonの計算処理から始まり、Tkinterで画面を作成し、Matplotlibでグラフ表示まで実装しました。

プログラミング初心者でも、少しずつ機能を追加していくことで実用的なアプリを作成できます。

今後も機能追加を続けていきます。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

FIREを目指しながら、投資・プログラミング・家庭菜園・資格勉強に取り組んでいます。試行錯誤しながら積み上げる日々を記録するブログです。

コメント

コメントする

目次