01退休規劃的兩個階段
前兩章完成債券、股票與選擇權分析工具。本章回到個人理財中最常見、最實用,也最容易被低估的主題:長期儲蓄、定期定額與退休規劃。退休規劃至少包含兩個不同階段:退休前的資產累積期,與退休後的資產提領期。這兩個階段使用不同的公式和風險考量,必須分開計算。
直覺舉例:目前每月生活費 50,000 元,距退休還有 20 年,若通膨率 2%,退休時維持相同購買力所需月費 = 50,000 × (1.02)²⁰ ≈ 74,297 元。若忽略通膨,退休資金需求可能被嚴重低估。
| 面向 | 資產累積期(退休前) | 退休提領期(退休後) |
|---|---|---|
| 主要來源 | 薪資定期投入、現有資產增值 | 勞保年金、退休金、租金、個人資產提領 |
| 主要風險 | 太晚開始、提撥不足、報酬過樂觀 | 長壽風險、報酬順序風險、通膨、醫療支出 |
| 核心公式 | FV = PV(1+r)ⁿ + PMT年金終值 | PV = PMT年金現值(成長年金) |
| 決策方向 | 增加提撥、延後退休、提高報酬 | 降低提領率、保留現金緩衝、多元收入 |
02退休規劃九步驟流程
| 步 | 步驟 | 說明 |
|---|---|---|
| ① | 設定退休年齡 | 確認目前年齡、計畫退休年齡、規劃終點(壽命估計) |
| ② | 估算退休時生活費 | 目前生活費 × 替代率 × (1+π)ⁿ(通膨調整) |
| ③ | 估算退休固定收入 | 勞保年金、退休金、租金、股息等每月固定收入 |
| ④ | 計算每月資金缺口 | 退休生活費 − 退休固定收入 = 需由資產補足的部分 |
| ⑤ | 計算退休後資金需求 | 用年金現值或成長年金公式,加計一次性支出 |
| ⑥ | 估算退休前可累積資產 | 現有資產終值 + 定期提撥終值 |
| ⑦ | 計算退休資金缺口 | 資金需求 − 預估退休資產 = 正值表示不足 |
| ⑧ | 反推每月所需提撥 | 依缺口反算普通/期初年金月提撥,並與實際能力比較 |
| ⑨ | 情境測試與定期更新 | 保守/基準/樂觀三情境;每年更新假設與實際執行 |
03六種年金公式速查(含邊界條件)
退休規劃會用到六種核心公式。每種公式在報酬率為零(r=0)或折現率等於成長率(r=g)時都有特殊邊界條件,程式必須特別處理,否則會發生除以零錯誤。
| 種類 | 公式(⚠️ 邊界條件) | 退休規劃用途 |
|---|---|---|
| 單筆複利終值 | FV = PV × (1+r)ⁿ ⚠️ r=0:FV = PV | 現有資產到退休時的終值 |
| 普通年金終值 | FV = PMT × [(1+r)ⁿ−1]/r ⚠️ r=0:FV = PMT × n | 月底定期定額到退休的累積 |
| 期初年金終值 | FV_due = FV_ordinary × (1+r) ⚠️ 月初比月底多一期報酬 | 月初薪資立即投入 |
| 普通年金現值 | PV = PMT × [1−(1+r)⁻ⁿ]/r ⚠️ r=0:PV = PMT × n | 退休後固定月提領所需本金 |
| 期初年金現值 | PV_due = PV_ordinary × (1+r) | 退休月初提領所需本金 |
| 成長年金現值 | PV = PMT₁/(r−g)×[1−((1+g)/(1+r))ⁿ] ⚠️ r=g:PV = PMT₁×n/(1+r) | 退休後逐年隨通膨成長的提領 |
成長年金的 r=g 邊界條件:當折現率等於成長率,公式分母 (r−g) 為零,需改用 PV = PMT₁×n/(1+r)。程式中用 math.isclose(r, g, abs_tol=1e-12) 判斷。
04提早開始的複利效果
| 投資人 | 開始年齡 | 投資年數 | 本金 | 年報酬率 | 終值(估計) |
|---|---|---|---|---|---|
| 甲 | 30 歲 | 35 年 | 50 萬元 | 5% | 約 276 萬元 |
| 乙 | 45 歲 | 20 年 | 50 萬元 | 5% | 約 133 萬元 |
本金相同(50 萬元),投資時間差 15 年,終值差距超過一倍。提早開始是退休規劃最有效、且成本最低的策略。
05月報酬率轉換與名目/實質報酬率
有效月報酬率——此公式確保月複利 12 次後精確等於年報酬率。例如年報酬率 5%:月報酬率 = (1.05)^(1/12) − 1 ≈ 0.4074%。
不要直接用 r_年/12!年報酬率 6% 直接除以 12 得 0.5%,月複利 12 次後 = (1.005)¹²−1 ≈ 6.168%,不等於 6%。若計算精度要求高,必須用有效月報酬率。
通膨後退休生活費——目前月支出 60,000 元、替代率 80%、通膨 2%、20 年後退休:退休時月費 = 60,000 × 80% × (1.02)²⁰ ≈ 71,325 元。若忽略通膨,需求可能被低估 30–50%。
名目 vs 實質報酬率——同一模型不能混用:退休生活費若已依通膨調整為名目金額,折現率也必須使用名目報酬率。若用實質報酬率折現名目支出,等於通膨調整了兩次,將嚴重低估退休資金需求。
06退休資金缺口計算流程
每月資金缺口——退休生活費 80,000 元,固定收入(勞保年金 + 租金)30,000 元,每月缺口 = 50,000 元。退休資產只需支應 50,000 元,而非完整 80,000 元。
| 方式 | 公式 | 適用情境 |
|---|---|---|
| 固定提領年金 | 年金現值(PV = PMT × [1−(1+r)⁻ⁿ]/r) | 生活費不隨通膨成長 |
| 成長年金 | PV = PMT₁/(r−g) × [1−((1+g)/(1+r))ⁿ] | 生活費每年隨通膨增加(較真實) |
| 逐期模擬 | 每月計算餘額變化 | 需要精確路徑或異常情況處理 |
加計一次性支出:退休資金需求 = 年金現值 + one_time_cost(房修、換車、醫療準備金等)。
07安全提領率
| 初始提領率 | 所需退休資產(年提領 60 萬) | 特性 |
|---|---|---|
| 3% | 2,000 萬元 | 較保守,所需資產高 |
| 4% | 1,500 萬元 | 常被引用的基準(非保證) |
| 5% | 1,200 萬元 | 較積極,資金耗盡風險較高 |
安全提領率是歷史研究與規劃概念,不是銀行保證利率或政府固定給付。退休期間越長、通膨越高、退休初期市場越差,相同提領率的成功機率就越低。
08報酬順序風險(Sequence of Returns Risk)
| 年度 | 情境甲(先虧後賺) | 情境乙(先賺後虧) |
|---|---|---|
| 第 1 年 | −20% | +20% |
| 第 2 年 | −10% | +15% |
| 第 3 年 | +10% | +10% |
| 第 4 年 | +15% | −10% |
| 第 5 年 | +20% | −20% |
| 5 年算術平均 | 3%(相同) | 3%(相同) |
| 每年提領 60 萬後的結果 | 資產耗損更快 | 結果較佳 |
平均報酬率相同,但退休初期先虧損+同時提領,意味著在最低點賣出更多資產,後續恢復更加困難。降低方法:退休初期保留 6–24 個月現金緩衝、降低初始提領率、彈性調降支出、建立多層次退休收入。
09Python 退休規劃模組
from dataclasses import dataclass
import math
@dataclass(frozen=True)
class RetirementInput:
current_age: int
retirement_age: int
planning_age: int
current_assets: float
monthly_contribution: float
return_before: float # 退休前年報酬率(小數)
return_after: float # 退休後年報酬率(小數)
inflation_rate: float
current_expense: float
expense_ratio: float # 退休支出替代率
retirement_income: float = 0.0
one_time_cost: float = 0.0
def annual_to_monthly_rate(annual_rate: float) -> float:
return (1 + annual_rate) ** (1/12) - 1
def future_value_annuity(pmt: float, monthly_rate: float, months: int) -> float:
if math.isclose(monthly_rate, 0, abs_tol=1e-12):
return pmt * months
return pmt * ((1 + monthly_rate) ** months - 1) / monthly_rate
def present_value_growing_annuity(pmt1: float, r: float, g: float, months: int) -> float:
if math.isclose(r, g, abs_tol=1e-12):
return pmt1 * months / (1 + r) # r=g 邊界條件
return pmt1 / (r - g) * (1 - ((1+g)/(1+r)) ** months)
def simulate_withdrawal_path(
initial_balance: float, monthly_withdrawal: float,
monthly_return: float, months: int
) -> list[dict]:
"""模擬退休後資產逐月變化,找出資金耗盡時點。"""
path = []
balance = initial_balance
depleted_month = None
for m in range(1, months + 1):
balance = balance * (1 + monthly_return) - monthly_withdrawal
if balance <= 0 and depleted_month is None:
depleted_month = m
balance = 0 # 避免顯示無意義的負值
path.append({'month': m, 'balance': max(balance, 0)})
return path
10Streamlit 四分頁退休規劃工具
import streamlit as st
st.set_page_config(page_title='退休規劃工具', page_icon='🏖️', layout='wide')
st.title('退休資金缺口分析器')
tab1, tab2, tab3, tab4 = st.tabs(['退休規劃', '提領模擬', '報酬順序風險', '情境比較'])
with tab1:
current_age = st.number_input('目前年齡', value=30)
retirement_age = st.number_input('退休年齡', value=65)
# ... 其餘輸入欄位、計算與結果卡片 ...
with tab2:
# 逐月模擬提領路徑,繪製資產餘額折線圖,標示資金耗盡月份
...
with tab3:
# 比較「先虧後賺」與「先賺後虧」兩種相同平均報酬但順序不同的情境
...
with tab4:
# 保守/基準/樂觀三情境並排比較
...
11JavaScript 前台退休試算器
前台版本計算通膨後生活費、退休資金需求與資金缺口,適合直接整合至 Cloudflare Pages 靜態網站。完整程式碼可以到「示範分頁」看實際運作結果,也是本章挑戰任務要動手修改的對象。
// ── 年利率轉有效月利率 ───────────────────────────
function annualToMonthlyRate(annualRate) {
return Math.pow(1 + annualRate, 1/12) - 1;
}
// ── 單筆複利終值 ─────────────────────────────────
function futureValueLumpSum(pv, monthlyRate, months) {
return pv * Math.pow(1 + monthlyRate, months);
}
// ── 普通年金終值(⚠️ r=0 邊界)────────────────────
function futureValueAnnuity(pmt, monthlyRate, months) {
if (Math.abs(monthlyRate) < 1e-12) return pmt * months;
return pmt * (Math.pow(1+monthlyRate, months) - 1) / monthlyRate;
}
// ── 成長年金現值(⚠️ r=g 邊界)─────────────────────
function presentValueGrowingAnnuity(pmt1, r, g, months) {
if (Math.abs(r - g) < 1e-12) return pmt1 * months / (1 + r); // r=g
return pmt1 / (r - g) * (1 - Math.pow((1+g)/(1+r), months));
}
// ── 主計算流程(節錄)─────────────────────────────
function handleRetirementCalculation() {
// ...讀取欄位、驗證年齡邏輯...
const yur = rAge - cAge, ry = pAge - rAge;
const accM = yur * 12, retM = ry * 12; // 年數轉月數
const mrB = annualToMonthlyRate(rb); // 年報酬率轉有效月報酬率
const mrA = annualToMonthlyRate(ra);
const mrI = annualToMonthlyRate(pi);
// 退休月生活費(通膨 + 替代率)
const futureExp = cExp * expR * Math.pow(1+pi, yur);
const gap = Math.max(futureExp - retInc, 0);
// 退休所需資金(成長年金 + 一次性支出)
const required = presentValueGrowingAnnuity(gap, mrA, mrI, retM) * (1 + mrA) + oneTime;
// 預估退休資產(現有資產終值 + 定期提撥終值)
const projected = futureValueLumpSum(cAss, mrB, accM) + futureValueAnnuity(mC, mrB, accM);
const fundGap = required - projected;
}
12三情境比較
| 假設項目 | 保守情境 | 基準情境 | 樂觀情境 |
|---|---|---|---|
| 退休前年報酬 | 3% | 5% | 7% |
| 退休後年報酬 | 1% | 3% | 5% |
| 通膨率 | 3% | 2% | 1.5% |
| 規劃終點年齡 | 100 歲 | 95 歲 | 90 歲 |
| 退休支出替代率 | 90% | 80% | 70% |
若只有樂觀情境可以達標,退休計畫風險較高。建議至少在基準情境達標,並計算保守情境下的缺口金額,讓規劃者做出有依據的決策。
13實務案例
(一)忽略通膨的代價
用今日生活費 60,000 元直接計算 25 年退休需求,算出需要約 1,500 萬元。但若通膨 2%,退休時同樣生活水準需要 97,000 元,退休資金需求接近 2,400 萬元,誤差 60%。忽略通膨是退休規劃最常見也最嚴重的錯誤。
(二)太晚開始準備
甲 30 歲每月投入 10,000 元;乙 45 歲每月投入 20,000 元。即使乙每月投入是甲的兩倍,在同樣 65 歲退休時,甲多了 15 年複利累積,乙仍難以追上。提早開始是最高效益的退休策略。
(三)退休初期市場大跌
退休第一年市場下跌 25%,同時需提領生活費。在資產規模最大時賣出最多,後續恢復能力明顯受損。應對方法:退休前 1–2 年開始建立現金緩衝(6–24 個月生活費),避免在低點被迫出售高波動資產。
(五)一次性支出遺漏
退休後計畫房屋修繕 50 萬、換車 80 萬、長途旅遊 30 萬,共 160 萬元。若未納入 one_time_retirement_cost,退休計畫會低估缺口。本章的 RetirementInput 包含此欄位,應提醒使用者填寫。
14常見錯誤與除錯
| 錯誤 | 症狀 | 正確做法 |
|---|---|---|
| 年報酬率直接當月利率 | 終值計算嚴重偏高 | 月率 = (1+r_a)^(1/12) − 1 |
| 月份與年數混用 | 20 年只計算 20 期(應為 240 期) | periods = years × 12 |
| r=0 時除以零錯誤 | 程式崩潰或 NaN | math.isclose(r, 0) 判斷後改用 PMT×n |
| 重複計入通膨 | 名目支出 + 實質報酬 → 計算兩次通膨 | 名目搭名目;實質搭實質 |
| 固定收入未從缺口扣除 | 高估每月需要提領金額 | 先計算缺口(生活費−固定收入)再算年金 |
| 資金耗盡後計算負餘額 | 模擬顯示 −800 萬等無意義負值 | balance = max(balance−wd, 0);耗盡後停止 |
15模型限制與風險揭露
退休規劃模型的主要限制:報酬率並非固定(市場波動);通膨率會變動;壽命無法精確預測;醫療與長期照護支出高度不確定;退休制度可能改革;稅負可能調整;投資費用降低實際報酬;退休初期市場大跌的報酬順序效應;固定收入可能中斷;個人支出可能大幅改變。
網站應明確顯示:「本工具依使用者輸入及簡化財務模型估算退休資金。結果不代表未來報酬、壽命或支出保證,也不取代個別化財務規劃、保險、稅務與法律建議。」
16關鍵字
17實作練習
- 計算 100 萬元投資 20 年(年報酬 5%)的終值,手動驗算
- 計算每月投入 10,000 元、240 期、月報酬 0.5% 的普通年金終值,確認總投入 240 萬元
- 比較月初投入與月底投入的終值差距(應相差一期報酬)
- 計算通膨後退休生活費(目前 60,000 元、替代率 80%、通膨 2%、20 年後)
- 計算退休每月資金缺口(生活費 80,000 − 固定收入 30,000 = 50,000)
- 計算退休前預估累積資產,並計算退休資金缺口與資金準備率
- 反推每月所需提撥,並與目前提撥比較缺口
- 執行 Streamlit 四分頁工具,比較三情境差異
- 建立每年提撥成長率(薪資增加後比例提高)
- 建立配偶共同退休規劃(兩人不同年齡與退休時點)
- 建立蒙地卡羅退休模擬(隨機報酬率,計算成功機率)
- 在 JavaScript 前台加入提領模擬圖(逐月餘額折線圖)
- 建立情境比較表(三情境並排顯示所有關鍵指標)
JavaScript 前台退休試算器是純前端計算,可以在瀏覽器中真的執行,所以本章挑戰任務(04 分頁)延續即時執行模式:修改真正會執行的程式碼,系統會即時告訴你哪裡出錯。
本章結語——本章完成了個人理財中最重要的長期規劃工具:退休資金缺口分析器。讀者已學會六種年金公式(含 r=0 與 r=g 邊界條件)、有效月報酬率轉換、通膨後退休生活費、成長年金現值、退休資金需求、退休前資產累積、退休資金缺口、反推每月提撥、資金準備率、安全提領率概念,以及報酬順序風險的核心原理。
工具提供 Python 模組(含 RetirementInput dataclass)、Streamlit 四分頁工具(退休規劃/提領模擬/報酬順序風險/情境比較)與 JavaScript 前台版本,三種版本的計算公式完全一致。
下一章進入投資組合風險分析與金融網站完整整合。讀者將建立資產配置、投資組合波動度、相關係數、VaR、Sharpe、Sortino 與最大回撤工具,並把前十一章的所有分析模組整合成完整金融知識網站。
—退休資金缺口試算器(教材原始範例)
輸入目前年齡、退休年齡、規劃終點、資產與報酬假設,點擊按鈕即時計算通膨後的退休生活費、每月資金缺口、退休資金需求、預估退休資產、資金缺口,以及反推的每月所需提撥。這就是課本第十一節的 retirement-calculator.html/retirement-calculator.js 完全對應的成品,等一下的挑戰任務就是在這份程式碼上動手修改。
—觀念測驗
共 15 題選擇題,涵蓋本章所有核心觀念。每題作答後會立即顯示解析。
挑戰任務:修改程式碼,讓工具自己告訴你哪裡錯
退休試算器是純前端 JavaScript,可以在瀏覽器中真的執行。下面三個練習都是「真的會執行」的程式碼,修改完成後按下「執行測試」,系統會把你的程式碼放進真實瀏覽器環境中運行,並用白話文告訴你哪裡不對。
任務一:功能修改
對應教材「十七、實作練習」
- 在結果區新增顯示「資金準備率」(預估退休資產 ÷ 退休資金需求)
提示(卡住了再打開)
handleRetirementCalculation() 函式最後(resEl.classList.remove("hidden") 之前),加入一行把計算結果寫進指定的空欄位。
💡 查看範例解答(建議自己先試過再打開)
看完解答後,可以按「還原初始程式碼」重新自己動手做一次,或按「換一題再練習」挑戰另一個類似的任務。
任務二:抓出隱藏的 id 錯誤
對應教材「十四、常見錯誤與除錯」
- 這份程式碼交接自另一位同學,執行後完全沒有反應(或沒有正確顯示結果)
- 找出問題並修正,讓試算器恢復正常運作
提示(卡住了再打開)
document.getElementById("...") 抓到的是 null。逐一比對 HTML 裡每個 id="..." 跟 JS 裡 getElementById("...") 的拼字是否一模一樣。
💡 查看範例解答(建議自己先試過再打開)
看完解答後,可以按「還原初始程式碼」重新自己抓一次,或按「換一題再練習」練習抓另一個 id 錯誤。
任務三:年利率/月數轉換錯誤
對應教材「十四、常見錯誤與除錯」— 年報酬率直接當月利率/月份與年數混用
- 這份程式碼可以正常執行、不會報錯,但算出來的數字不合理
- 正確的預估退休資產應約為 $13,842,637
- 找出問題所在並修正
提示(卡住了再打開)
💡 查看範例解答(建議自己先試過再打開)
看完解答後,可以按「還原初始程式碼」重新自己抓一次,或按「換一題再練習」練習抓另一種換算錯誤。