複利の力をPythonで可視化|積立投資シミュレーションを3パターンで検証

免責事項

本記事は投資助言を目的としたものではなく、技術・分析手法の紹介です。記事中の情報は教育目的であり、特定の銘柄・金融商品の売買を推奨するものではありません。投資判断はご自身の責任で行ってください。

前回の記事#02では、インデックス投資の合理性をDX3原則で分解しました。その中で「複利の効果」に触れましたが、表の数字だけではピンとこなかった方もいるのではないでしょうか。(初めての方は記事#01から読むのがおすすめです)

今回はシリーズ初の実装編です。製造業DXエンジニアの筆者が、Pythonで複利の効果を可視化します。

この記事を読めば、自分の積立条件(月額・年利・期間)を入れるだけで将来の資産額を計算できるようになります

結論:複利は「知っている」と「自分で計算して確かめた」の間に大きな差がある。エンジニアなら、コードで腹落ちさせよう。

目次

そもそも複利とは何か:数式で理解する

複利の計算式は、エンジニアならすぐに理解できるシンプルな式です。

複利の基本式

将来の資産 = 元本 × (1 + 年利率) ^ 年数

例:100万円を年利7%で30年運用した場合
100万 × (1.07)^30 = 約761万円

ポイントは 指数関数 であることです。線形(直線的)ではなく、時間が経つほど加速度的に増える。この「加速する感覚」を、グラフで実感してみましょう。

実装①:年利別の資産成長をグラフで比較する

まずは最もシンプルなケースから。100万円を一括投資して、年利5%・7%・10%で30年間運用した場合の資産推移を可視化します。

import matplotlib.pyplot as plt
import numpy as np

# --- 日本語フォントの設定(環境に合わせて変更してください) ---
# Mac: plt.rcParams['font.family'] = 'Hiragino Sans'
# Windows: plt.rcParams['font.family'] = 'Yu Gothic'
# Linux: plt.rcParams['font.family'] = 'Noto Sans CJK JP'

# --- 設定 ---
initial = 100  # 初期投資額(万円)
years = 30
rates = [0.05, 0.07, 0.10]  # 年利 5%, 7%, 10%
labels = ["5%", "7%", "10%"]
colors = ["#38a169", "#3182ce", "#805ad5"]  # 基礎/応用/発展カラー

# --- 複利計算 ---
fig, ax = plt.subplots(figsize=(10, 6))
x = np.arange(0, years + 1)

for rate, label, color in zip(rates, labels, colors):
    y = initial * (1 + rate) ** x
    ax.plot(x, y, label=f"年利 {label}", color=color, linewidth=2.5)

# --- 単利(参考線) ---
y_simple = initial * (1 + 0.07 * x)
ax.plot(x, y_simple, label="単利 7%(参考)", color="#718096",
        linewidth=1.5, linestyle="--")

# --- グラフ装飾 ---
ax.set_xlabel("年数", fontsize=12)
ax.set_ylabel("資産額(万円)", fontsize=12)
ax.set_title("複利の効果:年利別の資産成長(初期投資100万円)", fontsize=14)
ax.legend(fontsize=11)
ax.grid(True, alpha=0.3)
ax.set_xlim(0, years)
ax.set_ylim(0, 2000)

plt.tight_layout()
plt.savefig("compound_interest_comparison.png", dpi=150)
plt.show()

このコードを実行すると、以下のことが一目でわかります。

  • 最初の10年はどの年利もほぼ同じに見える(差が小さい)
  • 20年を超えると急激に差が開く(指数関数の特徴)
  • 単利(点線)と複利の差が後半になるほど圧倒的に広がる

エンジニア的に言い換えると

複利は O(e^n) 、単利は O(n) です。アルゴリズムの計算量を考える時と同じで、入力(年数)が大きくなるほど指数関数の方が圧倒的に大きくなる。この直感は、投資期間の設計に直結します。

実装②:毎月3万円の積立投資をシミュレーションする

一括投資で100万円を用意できる人は多くありません。現実的なのは毎月コツコツ積み立てるパターンです。毎月3万円を年利7%で積立投資した場合をシミュレーションしてみましょう。

import matplotlib.pyplot as plt
import numpy as np

# --- 設定 ---
monthly = 3  # 毎月の積立額(万円)
annual_rate = 0.07
months_list = [10 * 12, 20 * 12, 30 * 12]  # 10年, 20年, 30年
monthly_rate = annual_rate / 12

# --- 積立複利計算 ---
def calc_tsumitate(monthly_amount, monthly_rate, total_months):
    """毎月の積立複利を計算し、月次の資産推移を返す"""
    balance = []
    total = 0
    for m in range(1, total_months + 1):
        total = (total + monthly_amount) * (1 + monthly_rate)
        balance.append(total)
    return balance

# --- 30年分のシミュレーション ---
max_months = 30 * 12
balance = calc_tsumitate(monthly, monthly_rate, max_months)
principal = [monthly * (m + 1) for m in range(max_months)]  # 元本累計

fig, ax = plt.subplots(figsize=(10, 6))
x = np.arange(1, max_months + 1) / 12  # 年に変換

ax.fill_between(x, principal, alpha=0.3, color="#718096", label="元本累計")
ax.fill_between(x, balance, principal, alpha=0.3, color="#3182ce", label="運用益")
ax.plot(x, balance, color="#3182ce", linewidth=2.5, label="資産総額")
ax.plot(x, principal, color="#718096", linewidth=1.5, linestyle="--")

# --- マイルストーン表示 ---
milestones = {10: "#38a169", 20: "#3182ce", 30: "#805ad5"}
for year, color in milestones.items():
    idx = year * 12 - 1
    ax.plot(year, balance[idx], "o", color=color, markersize=10, zorder=5)
    ax.annotate(f"{year}年: {balance[idx]:.0f}万円",
                xy=(year, balance[idx]),
                xytext=(year + 1, balance[idx] + 200),
                fontsize=10, color=color, fontweight="bold",
                arrowprops=dict(arrowstyle="->", color=color))

ax.set_xlabel("年数", fontsize=12)
ax.set_ylabel("資産額(万円)", fontsize=12)
ax.set_title("毎月3万円 × 年利7% の積立シミュレーション", fontsize=14)
ax.legend(fontsize=11, loc="upper left")
ax.grid(True, alpha=0.3)
ax.set_xlim(0, 30)

plt.tight_layout()
plt.savefig("tsumitate_simulation.png", dpi=150)
plt.show()

実行結果を表にまとめます。

期間元本累計資産総額運用益運用益の割合
10年360万円約519万円+159万円31%
20年720万円約1,563万円+843万円54%
30年1,080万円約3,660万円+2,580万円70%

注目すべきポイントは2つです。

  • 30年後の資産の70%が運用益:自分が入れたお金(元本)よりも、お金が生んだお金の方が多い
  • 後半10年(20年→30年)の増加額が圧倒的:20年目の1,563万円から30年目の3,660万円へ、たった10年で+2,097万円。最初の20年で貯めた額を超えている

ポイント:「時間」が最大の武器

このシミュレーションから見えるのは、「いくら積み立てるか」よりも「いつ始めるか」の方がインパクトが大きいということです。毎月5万円を20年積み立てるよりも、毎月3万円を30年積み立てた方が資産総額は大きくなります。DXの「仕組みを早く作って長く回す」と全く同じ構造です。

実装③:「72の法則」をコードで検証する

投資の世界で有名な暗算テクニックに「72の法則」があります。

72の法則

資産が2倍になるまでの年数 ≒ 72 ÷ 年利(%)

例:年利7%なら → 72 ÷ 7 ≒ 約10.3年で2倍

本当にこの近似は正しいのか?エンジニアなら検証してみましょう。

import numpy as np

print(f"{'年利':>6} | {'72の法則':>8} | {'実際の年数':>10} | {'誤差':>6}")
print("-" * 45)

for rate_pct in range(1, 21):
    rate = rate_pct / 100
    # 72の法則
    rule72 = 72 / rate_pct
    # 実際の年数: 2 = (1 + r)^n → n = ln(2) / ln(1 + r)
    actual = np.log(2) / np.log(1 + rate)
    error = abs(rule72 - actual) / actual * 100
    print(f"{rate_pct:>5}% | {rule72:>7.1f}年 | {actual:>9.1f}年 | {error:>5.1f}%")

実行結果(一部抜粋):

年利72の法則実際の年数誤差
3%24.0年23.4年2.5%
5%14.4年14.2年1.4%
7%10.3年10.2年0.4%
10%7.2年7.3年0.9%
15%4.8年5.0年3.6%
20%3.6年3.8年5.2%

結果から分かること:

  • 年利5〜10%の範囲では誤差1%程度で非常に正確
  • 年利が極端に高い(15%以上)と誤差が大きくなる
  • インデックス投資の想定利回り(5〜8%)では「72の法則」はほぼ正確

エンジニア的に言い換えると

72の法則は ln(2) ≒ 0.693 の近似です。72 / r ≒ 0.693 / ln(1+r/100)。低い利率ではテイラー展開の第一項で十分な近似になるため、精度が高い。これは工学でよく使う「小角度近似(sinθ ≒ θ)」と同じ発想です。

応用:自分の条件でシミュレーションしてみよう

ここまでのコードを関数化して、自分の条件で簡単にシミュレーションできるようにしましょう。

def simulate_tsumitate(monthly_万円, annual_rate_pct, years):
    """積立投資のシミュレーション

    Args:
        monthly_万円: 毎月の積立額(万円)
        annual_rate_pct: 年利(%)例: 7
        years: 投資期間(年)

    Returns:
        dict: 元本、資産総額、運用益
    """
    monthly_rate = (annual_rate_pct / 100) / 12
    total_months = years * 12
    balance = 0

    for _ in range(total_months):
        balance = (balance + monthly_万円) * (1 + monthly_rate)

    principal = monthly_万円 * total_months
    profit = balance - principal

    return {
        "元本": f"{principal:,.0f}万円",
        "資産総額": f"{balance:,.0f}万円",
        "運用益": f"+{profit:,.0f}万円",
        "運用益率": f"{profit/principal*100:.1f}%",
        "2倍到達": f"約{72/annual_rate_pct:.0f}年(72の法則)",
    }

# --- 自分の条件を入れてみよう ---
print("=== 毎月3万円 × 年利7% × 30年 ===")
result = simulate_tsumitate(monthly_万円=3, annual_rate_pct=7, years=30)
for k, v in result.items():
    print(f"  {k}: {v}")

print()
print("=== 毎月5万円 × 年利5% × 20年 ===")
result = simulate_tsumitate(monthly_万円=5, annual_rate_pct=5, years=20)
for k, v in result.items():
    print(f"  {k}: {v}")

print()
print("=== 毎月1万円 × 年利7% × 40年 ===")
result = simulate_tsumitate(monthly_万円=1, annual_rate_pct=7, years=40)
for k, v in result.items():
    print(f"  {k}: {v}")

出力例:

=== 毎月3万円 × 年利7% × 30年 ===
  元本: 1,080万円
  資産総額: 3,660万円
  運用益: +2,580万円
  運用益率: 238.9%
  2倍到達: 約10年(72の法則)

=== 毎月5万円 × 年利5% × 20年 ===
  元本: 1,200万円
  資産総額: 2,055万円
  運用益: +855万円
  運用益率: 71.3%
  2倍到達: 約14年(72の法則)

=== 毎月1万円 × 年利7% × 40年 ===
  元本: 480万円
  資産総額: 2,625万円
  運用益: +2,145万円
  運用益率: 446.9%
  2倍到達: 約10年(72の法則)

3つ目の例が印象的です。毎月たった1万円でも、40年続ければ2,625万円。運用益率は447%で、入れたお金の4.5倍がリターンとして返ってくる計算です。

もちろん、これは年利7%が40年間続いた場合の理論値です。実際の市場は上下しますが、S&P500の過去100年の平均がまさにこの水準であることは、記事#02で確認した通りです。

まとめ:複利を「知っている」から「確かめた」へ

この記事で実装した3つのコードから見えたことをまとめます。

  • 複利は指数関数。後半になるほど加速する。「早く始めて長く続ける」ことの数学的な根拠
  • 30年の積立投資では、資産の70%が運用益。時間を味方にすれば、元本よりも「お金が生んだお金」の方が大きくなる
  • 72の法則は年利5〜10%で誤差1%以下。インデックス投資の想定利回りでは十分実用的な暗算ツール

「複利がすごい」ということは誰もが聞いたことがあるはずです。でも、自分の手でコードを書いて、グラフを描いて、数字を確認する——この体験を経ると、「知っている」が「確信している」に変わります。

これが、エンジニアの「検証する力」の価値です。

次回予告:インデックス vs 個別株、20年分のデータで検証

次回(記事#04)では、S&P500と個別株(Apple, Toyota等)の実際のリターンを20年分のデータで比較します。

  • yfinanceで株価データを取得する方法
  • インデックスと個別株のリターン・リスク(標準偏差)を比較
  • 「個別株で勝てるのか?」をデータで検証する

今回は理論値でのシミュレーションでしたが、次回はいよいよ実データを扱います。

シリーズ全体像:投資×DX 3段階モデル

  • 基礎 #01〜#10:インデックス投資 × DX思想(標準化・データドリブン・自動化)
  • 応用 #11〜#20:高配当株 × データパイプライン(Python自動スクリーニング)
  • 発展 #21〜#30:成長株CAN-SLIM × アーキテクチャ設計力

免責事項

本記事は投資助言を目的としたものではなく、技術・分析手法の紹介です。投資判断はご自身の責任で行ってください。

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

この記事を書いた人

コメント

コメントする

CAPTCHA


目次