住宅ローンの繰上げ返済はすべき？

# はじめに
以前、[住宅ローンの計算を自分でしてみたい](https://qiita.com/kumokiri2k/items/8bced982cb39bd496d04) という備忘録を投稿しました。
その後、「繰上げ返済」って計算上どういう結果、つまり、トータルの支払額がいくらになるとか、トータルの利息がいくらになるとかも計算してみようかなと思い計算してみたので備忘録として再度投稿します。

# 繰上げ返済
「繰上げ返済」とは、ほとんど説明する必要もなく、ローンを返済中にお金を一部先払いする事で、

 - 返済額軽減型 => 毎月の支払額を低減
 - 返済期間短縮型 => 支払い期間を短縮する

の２種類があります。

英語だと

 - advanced/advance payment
 - paying/repaying loan/debt in advance

とかいうみたいですね。

prepayment も「繰上げ返済」みたいな意味で辞書には出てくるみたいだけど、プリペイドSIMの先払いとかと区別付かなくなってどうなんだろうって感じですね。


# 設定
こちらに関しても、以前の投稿　[「住宅ローンの計算を自分でしてみたい」](https://qiita.com/kumokiri2k/items/8bced982cb39bd496d04) と同じ設定にします。

- 現時点での残債 : 2000万円
- 残りの返済期間 : 20年（240ヶ月）
- 定年までの年数 : 15年
- 金利 : 0.45%（変動金利）

# 返済額軽減型の計算
この条件の時の支払い金額は、87,156円でした。
この時、10万円、20万円 ・・・ 100万円と繰上げ返済した場合に、毎月の支払い金額がいくらになるか計算してみました。

``` 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)))

# 繰上げ返済をした場合の支払額
for partial_payment in np.arange(10, 101,10):
     reduced_payment = pv + (partial_payment * 10000)
     pmt = np.pmt(rate/12, nper, reduced_payment, fv=0, when='end')
     print('{: 4}万円繰上 =>{}'.format(partial_payment, math.ceil(pmt)))
```

```
現時点での毎月の支払額 : 87156

  10万円繰上 => 86720
  20万円繰上 => 86284
  30万円繰上 => 85848
  40万円繰上 => 85413
  50万円繰上 => 84977
  60万円繰上 => 84541
  70万円繰上 => 84105
  80万円繰上 => 83669
  90万円繰上 => 83234
 100万円繰上 => 82798
```
50万円繰り上げると、2,179円、100万円だと 4,358円 も支払額が下がり、それなりにアレだなぁと感じられる金額では無いでしょうか？

こうなると、利息の総額も下がるはず。

``` python
import numpy as np
import math

def calc_total_payment(race, nper, pv):
     total_interest = 0
     pmt = np.pmt(rate/12, nper, pv, fv=0, when='end')
     principal= np.ppmt(rate/12, range(nper), nper,pv)

     for i, p in enumerate(principal):
          pmt = np.pmt(rate/12, nper, pv, fv=0, when='end')
          principal= np.ppmt(rate/12, range(nper), nper,pv)
          # 当月の金利を計算
          interest_the_month = math.ceil(pmt-p)
          # 支払った金利を加算
          total_interest += interest_the_month
      
     return total_interest

# 年利
rate = 0.0045
# 支払い月
nper = 20 * 12
# 残金
pv = -(2000 * 10000)

print('総支払い利息 => {}'.format(calc_total_payment(rate, nper, pv)))

# 繰上げ返済をした場合の支払利息
for partial_payment in np.arange(10, 101,10):
     reduced_payment = pv + (partial_payment * 10000)
     print('{: 4}万円繰上 => {}'.format(partial_payment, 
          calc_total_payment(rate, nper, reduced_payment)))

```

```
総支払い利息 => 924861
  10万円繰上 => 920238
  20万円繰上 => 915618
  30万円繰上 => 910993
  40万円繰上 => 906368
  50万円繰上 => 901746
  60万円繰上 => 897125
  70万円繰上 => 892492
  80万円繰上 => 887862
  90万円繰上 => 883248
 100万円繰上 => 878633
```
50万円繰り上げ返済すれば、総支払い利息が 23,115円減少。
100万円だと 46,228円減少。
そうか、そうか。


# 返済期間短縮型の計算
返済期間を短縮する場合は、例えば、10万円を返済すると、毎月の支払額 87,156円より多い金額を返済するので、支払い月を一つ減らせばいいのかな？

``` python
import numpy as np
import math

# 年利
rate = 0.0045
# 支払い月
nper = 20 * 12 - 1
# 残金
pv = -(2000 * 10000) + 100000
# 毎月の支払額
pmt = np.pmt(rate/12, nper, pv, fv=0, when='end')
print('現時点での毎月の支払額 : {}'.format(math.ceil(pmt)))
```
```
現時点での毎月の支払額 : 87067
```
支払い金額自体が変わってしまうので、この計算方法は正しく無いんだと思う。

とりあえず、参考の情報として 同じ考え方で計算してみる事にします。

``` python
import numpy as np
import math

def calc_total_payment(race, nper, pv):
     total_interest = 0
     pmt = np.pmt(rate/12, nper, pv, fv=0, when='end')
     principal= np.ppmt(rate/12, range(nper), nper,pv)

     for i, p in enumerate(principal):
          pmt = np.pmt(rate/12, nper, pv, fv=0, when='end')
          principal= np.ppmt(rate/12, range(nper), nper,pv)
          # 当月の金利を計算
          interest_the_month = math.ceil(pmt-p)
          # 支払った金利を加算
          total_interest += interest_the_month

     return total_interest

# 年利
rate = 0.0045
# 支払い月
nper = 20 * 12
# 残金
pv = -(2000 * 10000)
montly_payment = 87156

print('総支払い利息 => {}'.format(calc_total_payment(rate, nper, pv)))

# 繰上げ返済をした場合の支払利息
for partial_payment in np.arange(10, 101,10):
     reduced_payment = pv + (partial_payment * 10000)
     shorten_period = int((partial_payment * 10000) / montly_payment)
     print('{: 4}万円繰上 => {}'.format(partial_payment, 
          calc_total_payment(rate, nper - shorten_period, reduced_payment)))
```
```
総支払い利息 => 924861
  10万円繰上 => 916396
  20万円繰上 => 907967
  30万円繰上 => 899583
  40万円繰上 => 891226
  50万円繰上 => 882911
  60万円繰上 => 874645
  70万円繰上 => 862691
  80万円繰上 => 854514
  90万円繰上 => 846378
 100万円繰上 => 838276
```
50万円繰り上げ返済すれば、総支払い利息が 41,950円減少。
100万円だと 86,585円減少。

元々の総支払利息 : 924,861

|  繰上額  |  返済軽減  |期間短縮 |
| ---- | ---- |---- |
| 10万円 | 920,238 | 916,396 |
| 20万円 | 915,618 | 907,967 |
| 30万円 | 910,993 | 899,583 |
| 40万円 | 906,368 | 891,226 |
| 50万円 | 901,746 | 882,911 |
| 60万円 | 897,125 | 874,645 |
| 70万円 | 892,492 | 862,691 |
| 80万円 | 887,862 | 854,514 |
| 90万円 | 883,248 | 846,378 |
| 100万円 | 878,633 | 838,276 |


金額的には、期間短縮型の方が倍ぐらい総支払い利息が少ないという事になるみたいです。
前述したように、この計算方法だと毎月の支払い金額自体が減ってしまうので若干実態とは異なるようですが、あくまで参考として、総支払い利息は「返済額軽減型」より「期間短縮型」が倍ぐらい少ないという事と理解しました。

# 元々の目的なんだっけ？
とりあえず、繰り上げ返済するとどれぐらい総支払い利息が減るのかを計算してみましたが、そもそも「住宅ローンの繰上げ返済はすべき？」がテーマでした。

繰り上げ返済すれば、総支払い利息が減るのは計算するまでも無い事で、どちら（返済軽減 or 期間短縮) の 総支払い利息 が有利かも計算しなくても、
[住宅ローンの繰り上げ返済「期間短縮型」と「返済額軽減型」、有利なのはどっち？](https://money-bu-jpx.com/news/article018479/)
このへんを読めばわかる話。

で、するかしないかで考えれば、繰り上げ返済でへる利息よりも資産運用等で増やせる額が多いかどうかを認識すれば腹落ちする答えになりそう。

もし、年利 2% で運用できる投資信託があった場合に、その投資信託に 100万円預けた時の一年後はいくらになっているだろうか？
※ 日本では、再投資する場合も所得税・住民税を合わせて20.315%の税金が課されますので、実際の利益は２割引でお考えください

``` python
import numpy as np

np.fv(0.02, 1, 0, -100)
```
```
102.0
```
102万円。そりゃそうでしょうね。

ただ、この2万円の利益を再投資に回して20年経つといくらになるのか？

``` python
import numpy as np

np.fv(0.02, 20, 0, -100)
```
```
148.59473959783548
```
148万円！48万円の利益！
税金を考慮して２割引ぐらいに考えても、35 ~ 38 万ぐらい増えると考えれば、投資信託に放置して、分配金を再投資した方が特や！ってなりますね。
ただ、これは投資運用がうまく行った場合の話。投資先やこれからの社会の情勢によっては、繰上げ返済の利息軽減分以上の利益どころか、原価割れだってあり得る。

## 結局はその人の価値観
結論としては、何を求めるかによるって事になると思います。

**1) 純粋にトータルでよりお金を残したい場合**
リスクを受け入れる覚悟があり、総支払い利息の削減分よりも運用益を計算上求められる自信・根拠があるのであれば運用に回すべき。
**2) 何よりもリスクを下げたい**
この場合は、期間短縮型の繰上げ返済がとるべき手段として最有力。
**3) 毎月のキャッシュフローがきつい**
この場合は、返済軽減の繰上げ返済になるんでしょうね。
また、毎月の支払いが減った分を貯蓄して、再度、繰り上げ返済に回すという戦略もあるのかも。

まあ、こんな事は最初からわかっている事ですが、実際に自分で計算して、色々シミュレーションしてみて出てきた数字を見ながら結論を出せば、自分として腹落ちできる対応をしていると言えるんじゃ無いでしょうか？
自分が納得しての行動であれば、少々悪い結果になっても、それほど後悔しないでしょう。