NestFund は、退職金・公的年金・iDeCo をひとつにまとめて、退職後から 100 歳までの資金推移を出す老後資金シミュレーターです。マネー計算の中でも扱う制度がいちばん多く、どこまで正確にやり、どこから割り切るかの線引きに一番時間を使いました。
#🎯 バラバラに計算しても意味がない
退職金の手取り、年金の受給額、iDeCo の残高 ── それぞれを出す計算機は既にたくさんあります。でも本当に知りたいのは、
結局、何歳まで持つのか
です。3 つを別々に出しても、その答えにはなりません。だから「全部足して、寿命まで月次で回す」ことを最初の要件にしました。
#💼 退職所得控除 ── 勤続 20 年で傾きが変わる
退職金の税金は、給与とはまったく違う計算をします。まず控除額が勤続年数で決まります。
export function retirementDeduction(years: number): number {
if (years <= 20) return Math.max(80, 40 * years) // 万円
return 800 + 70 * (years - 20)
}20 年を境に、1 年あたり 40 万円から 70 万円へ増えます。 長く勤めた人ほど有利になる設計です。最低保証の 80 万円があるので、短期でも Math.max が要ります。
そして控除を引いたあと、さらに 1/2 になります。
const taxable = Math.max(0, (gross - deduction) / 2)この「1/2 課税」があるおかげで、退職金は同じ額の給与よりずっと税金が軽い。たとえば勤続 38 年なら控除は 800 + 70 × 18 = 2,060 万円。そこまでは非課税で、超えた分の半分だけが課税対象です。
ここを知らずに「退職金 2,000 万円 = 数百万円が税金」と思っている人は多くて、実際に計算して数字が出ると驚かれる部分だと思います。
税額は累進の速算表をそのまま実装しました。
if (t <= 195) return t * 0.05
if (t <= 330) return t * 0.10 - 9.75
if (t <= 695) return t * 0.20 - 42.75
...控除額(9.75 / 42.75 …)は、税率が切り替わる境目で税額が連続になるように決まっている値です。表を写すだけですが、写し間違えると境目で段差が出るので、境界値で連続性を確かめました。
最後に復興特別所得税 2.1% と住民税 10% を足します。
#🏛️ 年金 ── 基礎と厚生で式が別
公的年金は 2 階建てで、計算式がまったく違います。
老齢基礎年金は加入月数の比例配分だけです。
const basic = BASIC_PENSION_FULL * (npMonths / 480)480 月 = 40 年で満額。単純です。
老齢厚生年金は報酬比例で、係数が決まっています。
const salary = (inputs.monthlyIncome * 5.481 * inputs.pensionPaidMonths) / 10005.481 / 1000 という乗率が公式の定数です。円で計算する式を万円単位に直すところで桁を間違えやすいので、コードにその変換をコメントで残しました。
年額(円) = 平均標準報酬月額(円) × 5.481/1000 × 加入月数
→ 年額(万円) = monthlyMan × 5.481 × months / 1000単位変換は式のそばに書き残しておく、というのはマネー計算機を何本か作って身についた習慣です。
#⏩ 繰上げ・繰下げは月単位
受給開始を早めると減り、遅らせると増えます。これは月単位の調整です。
const diffMonths = (inputs.pensionStartAge - baseAge) * 12
if (diffMonths < 0) adjustment = 1 + diffMonths * 0.004 // 繰上げ -0.4%/月
else adjustment = 1 + diffMonths * 0.007 // 繰下げ +0.7%/月60 歳受給なら -24%、75 歳まで待てば +84%。増減率が非対称(-0.4% と +0.7%)なのがポイントで、待てる人ほど有利になる制度設計です。
「何歳から受け取るのが得か」は寿命次第なので断定できません。だからこのサービスでは受給開始年齢をスライダーにして、資金推移がどう変わるかを見てもらう形にしました。答えを出すのではなく、比較できるようにする方針です。
#📉 月次で回して「何歳で尽きるか」を出す
ここが本題です。退職時点の資産(退職金の手取り + iDeCo 残高)を初期値にして、毎月
- 生活費を引く
- 年金受給が始まっていれば足す
を寿命(100 歳)まで繰り返します。残高が 0 を割る月があれば、そこが尽きる時点です。
年単位ではなく月単位にしたのは、年金の受給開始が年の途中に来るからです。年で丸めると、繰上げ・繰下げの効果が正しく出ません。
#😓 苦労したところ
制度の細部をどこまで入れるか。 在職老齢年金による支給停止、加給年金、振替加算、企業年金の形態差 ── 入れ始めるとキリがありません。入れるほど正確になりますが、入力項目も増えて誰も使えなくなります。
線引きとして 「多くの人に共通して効くもの」だけ入れることにしました。退職所得控除、累進税、基礎+厚生、繰上げ繰下げ、iDeCo。それ以外は概算であることを明示しています。
「概算です」と書くだけでは足りない。 金額が出るサービスは、数字が独り歩きします。どの前提で計算したか(令和 7 年度の税率、iDeCo は年 3% 想定、など)を結果のそばに置くようにしました。前提が見える場所にないと、数字だけ切り取られます。
6 プリセットで入力の負担を下げる。 13 項目を空欄から埋めさせると誰も完走しません。大企業 / 中小企業 / 公務員 / 自営業 / 早期退職 / 定年延長 70 の 6 つを用意して、そこから自分の状況に近いものを選んで微調整する導線にしました。
#🔭 今後の拡張
- 在職老齢年金(働きながら受け取ると年金が減る仕組み)
- 配偶者の年金を含めた世帯単位の試算
- インフレ率を織り込んだ実質価値での表示
- 医療費・介護費が増える後半のカーブ
#💡 このサービスから言えること
制度を扱う計算機は、正確さと使いやすさが正面から衝突します。 全部入れれば正確ですが誰も使えず、削れば使えますが概算になる。この綱引きに正解はなく、どこで切ったかを利用者に見せることでしか誠実になれないと思っています。
もうひとつ、公式の係数や控除額は、必ず式のそばに出典と単位を書き残すこと。5.481 / 1000 のような数字は、半年後の自分には意味が分かりません。
[ ./next_action ]
読んだら、 NestFund を実際に動かす。
この開発ログは NestFund をどう作ったかの記録です。 読み終わったらそのままサービス本体へ戻って、 実物で価値を確かめてください。