住宅ローンの計算を自分でしてみたい

# 何歳の時にどれぐらい住宅ローンの残債が？
私は、30歳ちょっと過ぎたぐらいの頃に、ファミリータープのマンションを35年ローンで購入しました。
よく言われる「持ち家は将来資産になりますが、賃貸は資産になりません」ってフレーズに心動かされて「なんとかなるだろ？」というノリで購入しました。35年ローンで購入すれば賃貸で支払う金額と同額でマンションを持てるって話ですね。
そもそも、このスキーム（35年ローンで...）には、スタート時点で何処かで解決しないといけない問題が見えています。

現代における「定年」ってだいたい60歳です。

[<<生命保険文化センター>>　定年年齢は60歳が最多](https://www.jili.or.jp/lifeplan/houseeconomy/employment/12.html)

30歳で購入して35年ローンなんだから、60歳で定年の時に、まだ５年分のローンが残ってる。この課題に対して、既に購入する気になっている30歳は、「繰上げ返済すればなんとかなる」とだけ考えて、「いつまでにどれぐらい繰上げ返済すればいいのか？」「それが実現可能な金額なのか？」については目をつむって「エイヤー」で進めてしまう。

[エイヤーとは](https://netafull.net/neta2009/030703.html)

皆さんは、色んなことを明確に計画して、精査して、論理的に判断できるのかもしれないですが、少なくとも30歳の時の私は、完全に「思考停止」状態で「なんとかなるはず」で意思決定してました。

![pose_relax_man.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139299/98363f59-5639-db26-9142-7f4bd7437863.png)


# エンジニアとしての状況把握
当たり前の話ですが、こんなの計算すれば60歳で定年を迎えた時に、ローンがいくら残っているかなんて計算すればわかる話。多分、購入する時の販売会社が出してきた計算書みたいなのにはそういうの書いてあったんでしょうね。ただ、いづれ直面する現実に目を背けたい気持ちと「なんとかなるはず」という楽観的な思想のコンビネーションがその資料の存在を忘れさせて、「直面する課題への解答」をもたない状態で、前へ前へと進んでしまったのだろう。
こういう時に、普通はファイナンシャルプランナーとかに会いに行って、相談するんですかね？知らんけど。

ようやく、本題にたどり着きますが、私は、一応「S/Wエンジニア」なの、ファイナンシャルプランナーに相談するよりは、自分で計算して状況を把握してみるのです。

まあ、こういう計算をするツールだったりは、専用のものがあったり Web アプリでもできるかとは思いますが、色々条件を変えてみたり（途中で金利が変わったり）、幾千ものシミュレーションしてみたいとかの要求や、SWエンジニアならではの自己満足で自分で 計算してみてもいいのかなーという事です。

# 使用する道具
## Python
そりゃ、こういう時は Python を使うだろ（思考停止）。
特にこだわるわけではないですが、ある程度使い慣れている Python (3.7.9）を使用。

## numpy
おなじみの numpy に PMT/PPMT っていうのがあって、それを使えば簡単に計算できるらしい。
[PMT - numpy](https://numpy.org/doc/1.19/reference/generated/numpy.pmt.html)

これらは、MS Excel にもあるので、当然そちらでも簡単に計算できるみたいです。
[EXCEL PMT](https://support.microsoft.com/ja-jp/office/pmt-%E9%96%A2%E6%95%B0-0214da64-9a63-4996-bc20-214433fa6441)

だが、python でヤル。それは何故か？ワイが SWエンジニア だからです。目的の達成よりもその達成手法・プロセスを楽しんでしまうことが無いと言えば嘘になります。


# 設定
 * 現時点での残債 : 2000万円
 * 残りの返済期間 : 20年（240ヶ月）
 * 定年までの年数 : 15年
 * 金利 : 0.45%（変動金利）
 
 この設定はあくまで、仮想の設定です。

# 目的
定年を迎える時（60歳）**いきなり破綻するのか否か**を把握する。

# 各種計算
## 月々の支払額
実際の住宅ローンの話であれば、自分の預金通帳の記録とか、銀行からの資料とか見れば月々の支払額がわかりますが、これは仮装設定の話なので、月々の支払額が幾らになるのかから始めます。
ここで使用するのが ```pmt``` です。
[numpy pmt](https://numpy.org/doc/1.19/reference/generated/numpy.pmt.html)

``` python
import numpy as np
import math

# 年利
rate = 0.0045

# 支払い月
nper = 20 * 12

# 残金
pv = -(2000 * 10000)

# 毎月の支払額
pmt = np.pmt(rate/12, nper, pv, fv=0, when='end')
print('毎月の支払額 : {}'.format(math.ceil(pmt)))
```
[結果]

```
毎月の支払額 : 87156
```
## 支払い金額の内訳
毎月の支払い金額は 87,156円 となりました。
では、その支払額のうち a)元本とb)金利 はいくらになるか？
これに使用されるのが```ppmt``` です。
[numpy ppmt](https://numpy.org/doc/1.19/reference/generated/numpy.ppmt.html)

毎月の支払額は、条件（金利・期間等）に変化がなければ一定です。
ただし、その内訳（元本と金利）は毎月変わっていきます。
毎月、元本が多くなり金利分は減っていきます。これも、購入の時にマンションのデベロッパーがよく言ってたなぁ。

```python
import numpy as np
import math

# 年利
rate = 0.0045

# 支払い月
nper = 20 * 12

# 残金
pv = -(2000 * 10000)

# 支払い元本の計算
principal= np.ppmt(rate/12, range(nper), nper,pv)

# 毎月の支払額
pmt = np.pmt(rate/12, nper, pv, fv=0, when='end')

total_principal = 0
total_interest = 0

for i, p in enumerate(principal):
     # 当月の元本と金利を計算
     principal_the_month = math.ceil(p)
     interest_the_month = math.ceil(pmt-p)
     # 支払った元本と金利を加算
     total_principal += principal_the_month
     total_interest += interest_the_month
     print('{: 4}月目 元本 : {}, 金利 : {}'.format(
               i+1, math.ceil(p), math.ceil(pmt-p)))

print('合計元本 : {}'.format(total_principal))
print('合計金利 : {}'.format(total_interest))
```
[結果]

```
   1月目 元本 : 79626, 金利 : 7530
   2月目 元本 : 79656, 金利 : 7500
   3月目 元本 : 79686, 金利 : 7471
   4月目 元本 : 79715, 金利 : 7441
   5月目 元本 : 79745, 金利 : 7411
   6月目 元本 : 79775, 金利 : 7381
    ...
    ...
    ...
 232月目 元本 : 86830, 金利 : 327
 233月目 元本 : 86862, 金利 : 294
 234月目 元本 : 86895, 金利 : 262
 235月目 元本 : 86927, 金利 : 229
 236月目 元本 : 86960, 金利 : 196
 237月目 元本 : 86992, 金利 : 164
 238月目 元本 : 87025, 金利 : 131
 239月目 元本 : 87058, 金利 : 98
 240月目 元本 : 87090, 金利 : 66

合計元本 : 19992621
合計金利 : 924861
```
支払った元本が2000万円に足りていない（7379円不足）のですが、これは、最後の月とかその翌月とかに別途払うんですかね。知らんけど。
細かくみていくと、1円以下の数値を切り上げる・切り下げるとかで微妙に変わってくるとは思いますが、今回の目的の「定年（60歳）の時に残債がどのぐらいになるのか？」に対しては、ここは無視してもいいかと思います。
各銀行の計算の仕方とか、いわゆる ```Industry Practice``` があるんでしょうか？知らんけど。

## 定年するときの残債
設定では定年までの年数が15年なので、15 ✖️ 12 => 180月目の時の状態を見ればわかるはず。

``` python
import numpy as np
import math

# 年利
rate = 0.0045

# 支払い月
nper = 20 * 12

# 残金
pv = -(2000 * 10000)

# 支払い元本の計算
principal= np.ppmt(rate/12, range(nper), nper,pv)

total_principal = 0
total_interest = 0

for i, p in enumerate(principal[:180]):
      # 支払った元本と金利を加算
      total_principal += math.ceil(p)

print('60歳の時の残債:{}'.format((pv + total_principal)*-1))
```

[結果]

```
60歳の時の残債:5175433
```

というわけで、定年を迎えた時にローンが520万ぐらい残っていることになるようです。

# 破綻するのかしないのか？
「定年した時に520万円の負債がある」
この状況を「破綻」と捉えるか「成立する」と捉えるかは人それぞれでしょう。

例えば、確定拠出年金とかiDeCo とかで月に4万円を元本保証（定期預金とか）積み立てて行って 15年経てば、最低 720万円溜まっていそうなので、とりあえず、定年時にまとめて払えるか払えないかでいうと「払えそう」であり、実現不可能な金額かどうかでいうと「実現可能そうだ」と考えていいんじゃないかと私としては思います。

実際のところ、定年迎えた時に 520万円を一括返済しなくても良くって、その元本を使って、この負債の金利よりも利回りの高い運用ができるのであれば、それまで通り毎月分割で払っていけば良いです。

また、残債を払うことはできても、公的年金受給までの５年のギャップをどう過ごすのか？とかも考えなければいけない課題ですね。

一番大事なのは、将来においてどのような状況になっているはずかを認識することが、その状況に対応するための対策を検討・実践することへの第一歩なのではないでしょうか？
また、変化が訪れた時に、どういう状況になるのか、（例えば変動金利を使用していて金利が上昇した等）を都度確認（再計算）していけば、対策も軌道修正できるかもしれません。

# 結論
とりあえず、未来の特定の時点での状況は見えるので、それをどう捉えるかは人それぞれです。そんなの計算する前からわかってるけど、何も見えない状況でなんとなく考えているよりはマシかなと思います。
さらにいうと、そもそも、ローンを組む前にこういうことを考えとけって話ではあるんですが、やってしまった事を後からどうこう言っても仕方がなく、できることは、現状を把握して、どういう対処をしていくかを考えて実践していくことが大事なんではないでしょうか。

# 参考
参考にさせていただいたコンテンツです。

[プログラムでローンの計算をしてみよう](http://www.otupy.net/archives/31984473.html)