見出し画像

Pythonを用いた住宅ローンシミュレーション(0.15%の金利上昇が家計へ及ぼす影響)

こんにちは。分析屋のFと申します。

2024/09/26のYahoo!ニュースにて以下のような報道がございました。

三菱UFJ銀行など大手5行が、変動型の住宅ローンを借りている人を対象に、10月から金利を引き上げる方針であることが26日、分かった。新しい金利での返済が始まるのは、おおむね3カ月後となる。日銀が7月31日に決めた政策金の引き上げを受けた措置で、上げ幅は0.15%程度になる見通しだ。住宅ローンを借りる人の7割程度は変動金利を選んでいるとされ、金利上昇で多くの家計の負担が増す。

Yahoo!ニュース

今回の記事はこちらのニュースを受けて、0.15%の金利上昇が家計へ及ぼす影響を考察してみました。また、今回は総返済額ではなく毎月の返済額に焦点を当ててお伝えしたいと存じます。




1.金利上昇にて注意すべきタイミング

「Pythonを用いた住宅ローンシミュレーション(金利上昇時の想定前編)」でお伝えいたしました5年ルール(金利が上昇しても5年間は毎月の返済額が変わらないというルール)を踏まえますと、注意すべきタイミングが2つあると考えます。

タイミング①

変動金利の上昇タイミングになります。このタイミングで返済額は増加しませんが、返済額に占める元金の割合が小さくなりますため、金利上昇のダメージを受けるのはこのタイミングからと考えるべきでしょう。プログラムでは返済額に占める元金の減少幅を算出いたします。例えば、金利上昇タイミングが3年目の場合、金利が上昇する直前に当たる2年目12ヶ月目の元金部分3年目1ヶ月目の元金部分の差を出力します。

タイミング②

5年区切りのタイミング(返済開始から5年目、10年目、15年目・・・)になります。このタイミングが毎月の返済額の増加タイミングになります。プログラムではこの返済額の増加幅を算出いたします。

基本情報は返済期間420ヶ月(35年)、借入額4000万とし、返済当初の金利を0.375%としており、0.15%の金利上昇が一回きり上昇するケースを想定いたします。


2.金利上昇時のプログラム及び実行結果

<プログラム>

import numpy as np
import numpy_financial as npf
import pandas as pd
import math

##############################
#### 基本情報(元利均等返済) ####
##############################
# 金利
per = 0.375
per_fix = 1.93

# 返済期間
period = 12*35

# 借入額
repay_amount = 4000

########################
#### 金利上昇開始時期 ####
########################
riseyr = 3

# 空のデータフレーム
kihon = pd.DataFrame()

# 関数定義
def create_term(x):
	if x % 12 == 0:
		y = str(math.ceil(x/12))+'年目12ヶ月目'
	else:
		y = str(math.ceil(x/12))+'年目'+str(x%12)+'ヶ月目'
	return y
	
def get_lag(x, y, z):
	if x != 1:
		w = y + z
	return w

# 償還表作成
def rise(riseyr_ , width_ , fixfl):
	
	# 毎月の返済額
	repay_month = math.floor(npf.pmt(0.01*per/12, period, -repay_amount*10000))
	risemonth = 12 * (riseyr_ - 1)
	risemonth_mod = np.mod(risemonth + 1, 60)
	per1 = per
	per2 = per

	# 返済済
	principal_acc = 0

	# 空のデータフレーム
	kihon = pd.DataFrame()

	for indx in range(1, period+1):
	
		if indx == 1: 
			remain = repay_amount * 10000

		# 毎月の返済額
		if fixfl == 0:
			if np.mod(indx, 60) == 1 and risemonth < indx <= risemonth + 60:
				per1 = per1 + width_
				repay_month = math.floor(npf.pmt(0.01*per1/12, period-indx+1, -remain))
				indx_rise_mon = indx
		
		# 毎月の利息
			if indx == risemonth + 1:
				per2 = per2 + width_
			
			interest = math.floor(npf.ipmt(0.01*per2/12, 1, period-indx+1, -remain))	
				
		else:
			repay_month = math.floor(npf.pmt(0.01*per_fix/12, period, -repay_amount*10000))
			interest = math.floor(npf.ipmt(0.01*per_fix/12, 1, period-indx+1, -remain))
				
		# 毎月の返済額中の元本部分
		principal = repay_month - interest

		# 毎月の返済額中の元本部分のパーセンテージ
		principal_per = 100*(repay_month - interest) / repay_month
		
		# 返済済
		principal_acc += principal
		
		# 当該月時点の残債
		remain = repay_amount*10000 - principal_acc
			
		kihon_new = pd.DataFrame([[indx, repay_month, interest, principal, principal_acc, principal_per, remain, per1, per2]],
		columns=["indx", "repay_month", "interest", "principal", "principal_acc", "principal_per", "remain", "per1", "per2"])
		kihon = pd.concat([kihon, kihon_new])
	
	kihon.loc[kihon["indx"]==period, "principal"] = kihon.loc[kihon["indx"]==period-1, "remain"]
	kihon.loc[kihon["indx"]==period, "repay_month"] = kihon.loc[kihon["indx"]==period, "principal"] + kihon.loc[kihon["indx"]==period, "interest"]
	kihon.loc[kihon["indx"]==period, "principal_acc"] = repay_amount*10000
	kihon.loc[kihon["indx"]==period, "remain"] = 0
	
	return kihon["repay_month"].sum(), kihon["interest"].sum(), kihon, indx_rise_mon

kihon_r = rise(riseyr, 0.15, 0)[2]

# タイミング①
rise_pri_before = kihon_r[kihon_r["indx"]==12 * (riseyr - 1)]
rise_pri_after = kihon_r[kihon_r["indx"]==12 * (riseyr - 1) + 1]
rise_pri_df = int(rise_pri_before["principal"]-rise_pri_after["principal"])

# タイミング②
rise_mon = int(rise(riseyr, 0.15, 0)[3])
rise_re_before = kihon_r[kihon_r["indx"]==rise_mon-1]
rise_re_after = kihon_r[kihon_r["indx"]==rise_mon]
rise_re_df = int(rise_re_after["repay_month"]-rise_re_before["repay_month"])

print("#### 返済期間:", period, "ヶ月、借入額:", repay_amount, "万円、借入当時の金利:", per ,"%の場合のシミュレーション結果 ####")
print("金利上昇が", riseyr , "年目、上昇幅が0.15%ならば月あたりの返済額の元金部分は" , '¥{:,.0f}'.format(rise_pri_df), "円減少します。", int((rise_mon-1)/12) ,"年目より返済額は", '¥{:,.0f}'.format(rise_re_df), "円増加します。")

<実行結果>

#### 返済期間: 420 ヶ月、借入額: 4000 万円、借入当時の金利: 0.375 %の場合のシミュレーション結果 ####
金利上昇が 3 年目、上昇幅が0.15%ならば月あたりの返済額の元金部分は ¥4,703 円減少します。 5 年目より返済額は ¥2,760 円増加します。
金利上昇が 8 年目、上昇幅が0.15%ならば月あたりの返済額の元金部分は ¥4,023 円減少します。 10 年目より返済額は ¥2,390 円増加します。
金利上昇が 13 年目、上昇幅が0.15%ならば月あたりの返済額の元金部分は ¥3,330 円減少します。 15 年目より返済額は ¥2,021 円増加します。
金利上昇が 18 年目、上昇幅が0.15%ならば月あたりの返済額の元金部分は ¥2,624 円減少します。 20 年目より返済額は ¥1,656 円増加します。
金利上昇が 23 年目、上昇幅が0.15%ならば月あたりの返済額の元金部分は ¥1,904 円減少します。 25 年目より返済額は ¥1,301 円増加します。
金利上昇が 28 年目、上昇幅が0.15%ならば月あたりの返済額の元金部分は ¥1,170 円減少します。 30 年目より返済額は ¥991 円増加します。

こちらの結果から読み取れることとしては、返済序盤であればあるほど金利上昇のダメージが大きいことが分かります。3年目の場合、元金部分が5千円近く減少してしまいます。この減少幅は無視可能とは言い難いでしょう。


3.結言

今回は0.15%の金利上昇のニュースを受けて家計へ及ぼす影響を考察してみました。タイミング①をきちんと認知の上、然るべき対策が重要と考えます。繰上げ返済を行えば元金部分の減少を打ち消すことも可能です。タイミング①を認知せずして返済スピードの鈍化に気付くのが遅れること、これは最も避けるべき状況と言えるでしょう。

住宅ローンにおいては金利上昇のみならず、減税の改正など目紛しい変化が続いております。気付いたことは逐一プログラムを実装の上、シミュレーションしていきたく存じます。




ここまでお読みいただき、ありがとうございました!
この記事が少しでも参考になりましたら「スキ」を押していただけると幸いです!

これまでの記事はこちら!

株式会社分析屋について

弊社が作成を行いました分析レポートを、鎌倉市観光協会様HPに掲載いただきました。

ホームページはこちら。

noteでの会社紹介記事はこちら。

【データ分析で日本を豊かに】
分析屋はシステム分野・ライフサイエンス分野・マーケティング分野の知見を生かし、多種多様な分野の企業様のデータ分析のご支援をさせていただいております。 「あなたの問題解決をする」をモットーに、お客様の抱える課題にあわせた解析・分析手法を用いて、問題解決へのお手伝いをいたします!
【マーケティング】
マーケティング戦略上の目的に向けて、各種のデータ統合及び加工ならびにPDCAサイクル運用全般を支援や高度なデータ分析技術により複雑な課題解決に向けての分析サービスを提供いたします。
【システム】
アプリケーション開発やデータベース構築、WEBサイト構築、運用保守業務などお客様の問題やご要望に沿ってご支援いたします。
【ライフサイエンス】
機械学習や各種アルゴリズムなどの解析アルゴリズム開発サービスを提供いたします。過去には医療系のバイタルデータを扱った解析が主でしたが、今後はそれらで培った経験・技術を工業など他の分野の企業様の問題解決にも役立てていく方針です。
【SES】
SESサービスも行っております。


この記事が参加している募集