住宅ローンの固定金利・変動金利で返済額はどんだけ違うの？

こんにちは、住宅ローンについて調べてみた金利のど素人です。

住宅ローンの金利には、どうも大きく分けて変動金利と固定金利があって、最近は変動金利で契約する方が大多数だとか。確かに現時点では変動金利が圧倒的に低い（0.4%とか？）ので変動を選ぶのがよさそうに思えますが、果たして今後の金利はどう動くのか、そんなことを考えていると夜しか眠れなそうです。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149511/829de9f2-d696-27c9-e659-6bed6c614d71.png" alt="attach:cat" title="attach:cat" width=200px>


**「変動と固定、どっちがいいの！？」**

については検索かけると山のように関連情報が出てきますので、ぜひ試してみてください。余計混乱します（笑）

金利が上がったときに繰り上げ返済できる資金力があるかどうかも判断の要因になりそうですし、固定の方が総返済額が高いかもしれないけど、毎月の返済額が変わることがないので余計な心配しなくていいという考えもあると思います。

結局重要なのは**リスクを知って適切な対処方法をとること**だとかなんとか。

参考：「[変動金利一気に上がる！？住宅ローンの変動金利は上昇するのか仕組みを交えて解説！](https://www.a-tm.co.jp/top/housingloan/basicknowledges/type/housing-loane-floating_rate/)」

  
# それで、、ここでは何をやったのか

先のことはわかりませんので結局結論が出ませんが「こうなったときには返済額はどうなるのだろ？」を MATLAB で計算してちょっとだけ安心しよう！というお話しです。変動金利が将来どうなったら、現時点での固定より返済額が大きくなっちゃう・・その辺をイメージできるといいのかなと。

## 実行環境

- MATLAB R2022b
- Financial Toolbox ([`amortize`](https://jp.mathworks.com/help/finance/amortize.html?s_eid=PSM_29435) 関数)

# まずは単純に全期間固定金利を

現時点（2022/12）で検索して出てくる変動金利は 0.9 % ～ 1.3 % あたり。ここでは 1.2 % で計算してみます。5000 万円を 35 年かけてゆっくり返していく計画でいきましょう。420 回の返済、長丁場ですね。健康に気を付けましょう。

シンプルに元利均等返済、ボーナス返済無し想定です。手数料なども無視しちゃいます。

```matlab:Code
Rate         = 0.012/12;   % 1.2 percent APR = 0.1 percent per month
NumPeriods   = 35*12;     % 35 years = 420 months
PresentValue = 50000000; % 5000 万円

[Principal, Interest, Balance, Payment] = amortize(Rate,NumPeriods, PresentValue);
```

出力変数の意味合いはこんな感じ。

   -  Principal: 支払額（元金分） 
   -  Interest: 支払額（利子分） 
   -  Balance: 借入残高 
   -  Payment: 月々返済額 

なので・・

```matlab:Code
disp("月々の返済額は " + round(Payment/1e4) + " 万円")
```

```text:Output
月々の返済額は 15 万円
```

```matlab:Code
disp("総支払額は " + round(sum(Principal+Interest)/1e4) + " 万円" + ...
    " (利子 " + round(sum(Interest)/1e4) + " 万円)")
```

```text:Output
総支払額は 6126 万円 (利子 1126 万円)
```

ってところ。**利子で1千万円超えるのか・・**

ちなみに返済額に含まれる利子の割合をプロットするとこんな感じです。最初の方は利子分多いですね。借入残高が多いので当然です。

```matlab:Code
area([Principal; Interest]')
xlabel('返済回数')
ylabel('支払額')
legend({'元金分','利子分'})
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149511/7d8dce19-62c9-8145-540c-1cf76076a266.png" alt="attach:cat" title="attach:cat" width=500px>


  
# そして現時点での変動金利が今後も変わらないとすると？

現時点（2022/12）で検索して出てくる金利は 0.4 % あたりの数値が出てきます。同じく 5000 万円を 35 年かけてゆっくり返していく計画でいきましょう。元利均等返済、ボーナス無し。繰り上げ返済もなし。

```matlab:Code
Rate         = 0.004/12;   % 0.4 percent APR = 0.1 percent per month
NumPeriods   = 35*12;     % 35 years = 420 months
PresentValue = 50000000; % 5000 万円

[Principal, Interest, Balance, Payment] = amortize(Rate, NumPeriods, PresentValue);
disp("月々の返済額は " + round(Payment/1e4) + " 万円")
```

```text:Output
月々の返済額は 13 万円
```

```matlab:Code
disp("総支払額は " + round(sum(Principal+Interest)/1e4) + " 万円" + ...
    " (利子 " + round(sum(Interest)/1e4) + " 万円)")
```

```text:Output
総支払額は 5359 万円 (利子 359 万円)
```

月々の返済額は 2 万円減って 13 万円で利子が 359 万円。先程の1千万円越えの固定金利と比べたときのお得感半端ないです。

![image_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149511/4ea19adc-09d8-d31c-9da5-b80b1c41f7d2.png)


# では・・どんな状況を想定すれば固定金利を選びたくなるのか

さて、上の変動結果を見ると変動金利一択に見えます。

ただ変動金利はその名前の通り**変動**が想定されます。いろんな意見や期待が入り混じる領域だと思います。先のことは素人には想像もできませんが、「仮にどんな状況になったら固定金利の方が有利」になるのか、いくつかのシナリオで計算しておくことはできますので、やってみます。

## まず関数の準備

変動金利の計算は [`amortize`](https://jp.mathworks.com/help/finance/amortize.html?s_eid=PSM_29435) 関数ではサポートされない（大変残念）のでまず関数を用意します。

```matlab:Code(Display)
[Principal, Interest, Balance, Payment] = amortize(Rate, NumPeriods, PresentValue);
```


<details><summary>中身はこんな感じ</summary><div>

```matlab:Code(Display)
function [Principal, Interest, Balance, Payment] = amortize_varrate(Rate, ~, PresentValue)

nYears = length(Rate);
Principal = zeros(nYears,1);
Interest = zeros(nYears,1);
Payment = zeros(nYears,1);
Balance = zeros(nYears,1);

% 簡易的に、利率は代わるとしても年に1回だけとして
% 1年（12回支払い）毎に amortize での計算を繰り返していく形で。
for ii=1:35
    NumPeriods = (35-ii+1)*12; % 以降定率と仮定しての返済回数
    Rate_tmp = Rate(ii)/12;
    [Principal_tmp,Interest_tmp,Balance_tmp,Payment_tmp] ...
        = amortize(Rate_tmp,NumPeriods,PresentValue);
    Principal(ii) = sum(Principal_tmp(1:12)); % 12 回分まとめて
    Interest(ii) = sum(Interest_tmp(1:12)); % 12 回分まとめて
    Payment(ii) = Payment_tmp*12;
    Balance(ii) = Balance_tmp(12);
    PresentValue = Balance_tmp(12); % その年最後の時点での残高
end

end
```
</div></details>


毎年計算を仕切りなおす感じですね。簡単にするために、金利の変動はあるとしても年1回と想定し、借入期間中の金利を入力します。例えば、35 年であれば 35 x 1 のベクトルを入力引数にします。

試しに上で計算した 35 年全期間固定金利で検算。

```matlab:Code
PresentValue = 50000000; % 5000 万円
Rates = 0.012*ones(35,1);

[Principal, Interest, Balance, Payment] ...
    = amortize_varrate(Rates, [], PresentValue);
disp("総支払額は " + round(sum(Principal+Interest)/1e4) + " 万円" + ...
    " (利子 " + round(sum(Interest)/1e4) + " 万円)")
```

```text:Output
総支払額は 6126 万円 (利子 1126 万円)
```

大丈夫そうです。

## こんなシナリオで計算してみました

   -  シナリオ1：5年毎に 0.3% 金利アップ 
   -  シナリオ2：5年毎に 0.45% 金利アップ 
   -  シナリオ3：11 年目までに 2 % まで金利アップその後固定と同じ一定 

```matlab:Code
% シナリオ１
Rates1 = 0.004*ones(35,1);
Rates1 = Rates1 + 0.003*repelem(0:6,5)';
% シナリオ２
Rates2 = 0.004*ones(35,1);
Rates2 = Rates2 + 0.0045*repelem(0:6,5)';
% シナリオ３
Rates3 = 0.004*ones(35,1);
Rates3 = Rates3 + 0.0016*(0:34)';
Rates3 = min(Rates3,0.02);
Rates3(12:35) = 0.012;
```

こんなイメージです。

  
<details><summary>描画コード</summary><div>

```matlab:Code
figure
yline(0.012*100, DisplayName = "1.2% 固定", LineWidth = 1, Color = 'k')
hold on
plot(Rates1*100, DisplayName = "変動シナリオ１", LineWidth = 2)
plot(Rates2*100, DisplayName = "変動シナリオ２", LineWidth = 2)
plot(Rates3*100, DisplayName = "変動シナリオ３", LineWidth = 2)
hold off
legend(Location="northwest")
fontsize(gca,scale=1.4)
xlabel("年")
ylabel("金利 (%)")
grid on
```
</div></details>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149511/7a65847b-3a51-5239-0531-1a4a133b82a3.png" alt="attach:cat" title="attach:cat" width=600px>

今後の上昇スピードを振ってみました。返済も後半になると借り入れ残高が小さくなるので、あまり大きい影響は与えないようです。それぞれのシナリオで返済額を見ると・・

### シナリオ1：5年毎に 0.3% 金利アップ

```matlab:Code
PresentValue = 50000000;  % 5000 万円
[Principal1, Interest1] = amortize_varrate(Rates1, [], PresentValue);
disp("総支払額は " + round(sum(Principal1+Interest1)/1e4) + " 万円" + ...
    " (利子 " + round(sum(Interest1)/1e4) + " 万円)")
```

```text:Output
総支払額は 5899 万円 (利子 899 万円)
```

### シナリオ2：5年毎に 0.45% 金利アップ


```matlab:Code
[Principal2, Interest2] = amortize_varrate(Rates2, [], PresentValue);
disp("総支払額は " + round(sum(Principal2+Interest2)/1e4) + " 万円" + ...
    " (利子 " + round(sum(Interest2)/1e4) + " 万円)")
```

```text:Output
総支払額は 6187 万円 (利子 1187 万円)
```

### シナリオ3：11 年目までに 2 % まで金利アップその後固定と同じ一定


```matlab:Code
[Principal3, Interest3] = amortize_varrate(Rates3, [], PresentValue);
disp("総支払額は " + round(sum(Principal3+Interest3)/1e4) + " 万円" + ...
    " (利子 " + round(sum(Interest3)/1e4) + " 万円)")
```

```text:Output
総支払額は 6100 万円 (利子 1100 万円)
```

金利シナリオと総返済額をまとめると

  
<details><summary>描画コード</summary><div>

```matlab:Code
figure
yline(0.012*100, DisplayName = "1.2% 固定（6126万円）", LineWidth = 1, Color = 'k')
hold on
plot(Rates1*100, DisplayName = "変動シナリオ１（5899万円）", LineWidth = 2)
plot(Rates2*100, DisplayName = "変動シナリオ２（6187万円）", LineWidth = 2)
plot(Rates3*100, DisplayName = "変動シナリオ３（6100万円）", LineWidth = 2)
hold off
legend(Location="northwest")
fontsize(gca,scale=1.4)
xlabel("年")
ylabel("金利 (%)")
grid on
```
</div></details>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149511/71ea111d-a16f-9ccd-5bea-ff1ed2d1ba6f.png" alt="attach:cat" title="attach:cat" width=600px>


5 年毎に 0.45% 金利アップしちゃうと 1.2 % 固定金利と同等になってしまうようですね。

また借入期間の冒頭での金利上昇は影響が大きいようなので、シナリオ３のように 10 年の間に 2 % まであがっちゃうとその後下がったとしても、1.2 % 固定金利と同じレベルの返済額になっちゃいます。返済開始後の短い期間での変動が肝になりそうな事がわかりました。

ここ 30 年ほど金利は低いままですが、それ以前をみるとするとびっくりしますね。
引用：[民間金融機関の住宅ローン金利推移（変動金利等）](https://www.flat35.com/loan/atoz/06.html)

<img src="https://www.flat35.com/files/300180943.png" alt="attach:cat" title="attach:cat" width=600px>


```matlab:Code
Rate         = 0.04/12;   % 8 percent APR = 0.1 percent per month
NumPeriods   = 35*12;     % 35 years = 420 months
PresentValue = 50000000; % 5000 万円

[Principal, Interest, Balance, Payment] = amortize(Rate, NumPeriods, PresentValue);
disp("総支払額は " + round(sum(Principal+Interest)/1e4) + " 万円" + ...
    " (利子 " + round(sum(Interest)/1e4) + " 万円)")
```

```text:Output
総支払額は 9298 万円 (利子 4298 万円)
```

 4 %とか 総支払額ほぼ 2 倍やないか・・。



# まとめ

金利の変動によって支払額がどれくらい変わるかのイメージができました。

ちなみに日本と比べるとアメリカの住宅ローン金利はかなり高め。ここ半年で 3% から 7% までの急上昇を見せています（参考：[米国 - 住宅ローンの利率](https://jp.tradingeconomics.com/united-states/mortgage-rate)） 

「ま、日本は今後 10 年でそんな急激にあがらんやろし大丈夫ちゃうかな？」とか「不安すぎる、固定にしよう！」とか、、みなさまどんな感触でしょう？また「金利あがったらがっと返せばええやろ」みたいな強者もいるかもしれませんね～。

MATLAB Mobile でもさくっと計算できますので、金利の話の際にはお手元にどうぞ :)

https://twitter.com/michio_MWJ/status/1588779111329431553

```matlab:Code
function [Principal, Interest, Balance, Payment] ...
    = amortize_varrate(Rate, ~, PresentValue)

nYears = length(Rate);
Principal = zeros(nYears,1);
Interest = zeros(nYears,1);
Payment = zeros(nYears,1);
Balance = zeros(nYears,1);

% 簡易的に、利率は代わるとしても年に1回だけとして
% 1年（12回支払い）毎に amortize での計算を繰り返していく形で。
for ii=1:35
    NumPeriods = (35-ii+1)*12; % 以降定率と仮定しての返済回数
    Rate_tmp = Rate(ii)/12;
    [Principal_tmp,Interest_tmp,Balance_tmp,Payment_tmp] ...
        = amortize(Rate_tmp,NumPeriods,PresentValue);
    Principal(ii) = sum(Principal_tmp(1:12)); % 12 回分まとめて
    Interest(ii) = sum(Interest_tmp(1:12)); % 12 回分まとめて
    Payment(ii) = Payment_tmp*12;
    Balance(ii) = Balance_tmp(12);
    PresentValue = Balance_tmp(12); % その年最後の時点での残高
end

end
```