研究紹介/コラム - マクロ経済指標を用いたPythonによる銀行引当率の予測

マクロ経済指標を用いたPythonによる銀行引当率の予測

サマリ

・実質GDP、鉱工業生産 生産指数、10年日本国債金利が銀行引当率の先行指標、完全失業率、消費者物価等は遅行指標に
・いくつかのマクロ経済指標で銀行引当率を予測することはある程度可能
・重回帰モデルで銀行引当率を予測すると、2024年度において引当率は低下傾向、2025年度は上昇傾向だがいずれも低水準

はじめに

日本銀行の金融政策が正常化しつつあり、日本経済はコロナ禍からの回復の兆しを見せています。
今回は、金融機関が将来の貸し倒れに備えて引き当てている貸倒引当金とマクロ経済指標との関係について考察してみます。
背景としては、IFRS第9号の公開草案の公表に向けた検討が進められている中、予想信用損失(ECL)の算出において、フォワードルッキングなパラメータを用いなければならないとされています。
今後、金融機関においてIFRS適用が拡大していくのであれば、例えばデフォルト確率とマクロ経済指標との相関を求めるといった分析局面が出てくると予想されるためです。
尚、本稿では結果が理解しやすいよう、重回帰モデルにより、その関連性を解き明かせるのか試みます。

利用データ

分析に用いたデータは以下の通りです。
図表1のNo.1 引当率を目的変数、No.2~8までを説明変数の候補として分析を行います。

図表1 利用データ

本分析で使用する利用データ内容

分析方針

分析に当たっては、下記の方針で進めます。
・予断を持たずにデータ分析の結果をそのまま信用します。
・景気の1サイクルを5年と想定し、±5年のラグで相関分析(相互相関分析)を事前に行い、各指標の先行性・遅効性を考慮した形で重回帰モデルに投入します。
・市場性の指標(ドル円、無担保コール翌日物、10年国債金利)については、引当率より遅行性が認められる場合には、明らかに正しくない関係と判断し、当該指標を重回帰モデルに投入しません。

分析手順

分析手順は以下の通りです。
①事前に引当率及び各指標に対し標準化変換(平均=0、標準偏差=1)を行います。
②標準化変換後の値が-2~+2の範囲を外れる場合には外れ値とみなし、外れ値を除外した上で再度標準化変換を行います。
③外れ値については、下方の場合には-2、上方の場合には+2を標準化変換後の値とします。
④引当率と指標毎に相互相関分析を行い、相関係数絶対値の最も高いラグ期を当該指標のラグ期とします。
⑤多重共線性のチェックを行い、VIF値が5を超えている場合には、指標間の相関係数値から、単一指標と引当率との相関の低い指標を優先して除外します。
⑥重回帰モデルについては、最初は有効な指標を全て投入し、偏回帰係数のp値が0.05を上回る指標を順次除外する変数減少法とします。
⑦全ての偏回帰係数のp値が0.05を下回った段階でモデルをFIXします。

データ準備

最初に標準化変換を行います。
Python Ver 3.8.5によるサンプルプログラムは以下の通りです。

import pandas as pd
from matplotlib.pyplot import xcorr
from sklearn import preprocessing
#データ読込
dir="/マクロ経済指標と銀行引当率/"
file=dir+"hikiate.csv"
df=pd.read_csv(file)
#標準化
ss=preprocessing.StandardScaler()
yx=df.drop(['fy'],axis=1)
ss.fit(yx)
sdf=pd.DataFrame(ss.transform(yx),columns=yx.columns) # 標準化
#値が-2から+2シグマを外れている場合、-2,2で埋める
mdf=yx.copy()
mdf[(sdf < -2) | (sdf > 2)] = None
#再度標準化
ssdf=pd.DataFrame(ss.transform(mdf),columns=mdf.columns) # 標準化
#値が-2から+2シグマを外れている場合、-2,2で埋める
ssdf[sdf< -2]=-2
ssdf[sdf> 2]=2
sdf=ssdf.copy()

相互相関分析

各指標を-5期から+5期ずらしながら引当率との相関係数を確認し、相関係数の絶対値が最大となる期をラグ期とします。
Pythonによるサンプルプログラムは以下の通りです。

def xc(v1,v2,dst=sdf):
    dd=pd.concat([dst[v1],dst[v2]],axis=1)
    dd=dd.dropna(how='any').reset_index(drop='True')
    lags,xcmp,flg,ax=xcorr(dd[v1],dd[v2],maxlags=5)
    ll=pd.DataFrame(lags,columns=['lags'])
    xx=pd.DataFrame(xcmp,columns=['xcmp'])
    kka=pd.concat([ll, xx],axis=1)
    print(kka)
    return
#gdp
xc('hikiate','gdp',dst=sdf)
'''
    lags      xcmp
0     -5 -0.183534
1     -4 -0.155800
2     -3 -0.160925
3     -2 -0.171269
4     -1 -0.175033
5      0 -0.174922
6      1 -0.216933 <--GDPが1期先行逆相関
7      2 -0.203675
8      3 -0.175982
9      4 -0.183137
10     5 -0.153773
'''

全ての指標について、相互相関分析を行った結果は以下の通りです。

図表2 相互相関分析結果表

指標ごとの引当率に対する相互相関分析結果

方針通り、ドル円はこの段階で投入指標から除外します。

多重共線性のチェック

ラグ期を反映させたデータを作成し、多重共線性のチェックを行います。
尚、分析の際には、各指標のデータ充足期間が異なるため、全てのデータが欠損でないデータ期間を対象とします。
Pythonによるサンプルプログラムは以下の通りです。

x=pd.concat([sdf.gdp.shift(1),sdf.unemply.shift(-2),sdf.infla.shift(-2),sdf.ind_pro.shift(4),sdf.call_on,sdf.rate_10y.shift(5)],axis =1)
y=pd.DataFrame(sdf.hikiate)
yx=pd.concat([y,x],axis=1)
###モデル用データ生成関数
def mk_dat(df=df,dst=yx,drop_v='no'):
    fyx=dst.copy()
    if drop_v != 'no':
        #除外
        for name in drop_v:
            fyx=fyx.drop(name,axis=1)
    #標準化後のデータ
    fyx=fyx.dropna(how='any')
    #インデックスを使って結合
    yyy=pd.merge(df.fy,fyx,left_index=True,right_index=True,how='inner')
    ffy=pd.DataFrame(yyy.fy).reset_index(drop='True')
    fy=pd.DataFrame(fyx.hikiate).reset_index(drop='True')
    fx=fyx.drop('hikiate',axis=1).reset_index(drop='True')
    return ffy,fy,fx
###
ffy,fy,fx=mk_dat(df=df,dst=yx,drop_v='no')
#多重共線性チェック
#各説明変数のVIFを計算
from statsmodels.stats.outliers_influence import variance_inflation_factor
vif=pd.DataFrame()
vif['Features']=fx.columns
vif['VIF']=[variance_inflation_factor(fx.values, i) for i in range(fx.shape[1])]
print(vif)

''''
   Features       VIF
0  gdp        1.483935   実質GDP年度成長率
1  unemply    2.366417   完全失業率
2  infla      2.013692   消費者物価
3  ind_pro    1.318250   鉱工業生産
4  call_on    2.774963   無担保コール翌日物
5  rate_10y   1.712384   10年国債金利
'''

結果としては、VIF値は全て5未満で多重共線性の問題は認められなかったため、重回帰分析に移ります。

重回帰分析

出力される情報量の多いstatsmodels.api ライブラリを用いて重回帰モデルを構築します。
Pythonによるサンプルプログラムと出力結果は以下の通りです。

import statsmodels.api as sm
x_add_const=sm.add_constant(fx)
model_sm=sm.OLS(fy,x_add_const).fit()
print(model_sm.summary())

p値の最も高い消費者物価を投入指標から除外して、再度重回帰モデルを構築します。

p値の最も高い実質GDP年度成長率を投入指標から除外して、再度重回帰モデルを構築します。

p値の最も高い鉱工業生産を投入指標から除外して、再度重回帰モデルを構築します。

全てのp値が0.05を下回ったため、モデル構築は終了です。

ダービンーワトソン比が2を下回っており、各指標の誤差項の間に正の相関が残ってしまっていることを示していますが、ここでは気にせずモデル構築は終了とさせます。
自由度調整後の決定係数は0.750と決して高くはないですが、ある程度は説明力があるモデルになっていると考えられます。

モデルを適用

モデルを適用するにあたり、採用指標のうちの完全失業率については、2期遅行指標となっているため、向こう1年を予測するには、少なくとも向こう3年の予測値が必要となります。
また、無担保コール翌日物は、一致指標であるため、予測年数分の予測値が必要となります。
今回は、2023年9月29日に公表された:三菱UFJリサーチ&コンサルティング株式会社様の予測値を用います。

図表3 完全失業率と短期金利の予測値

2024年から28年までの完全失業率と短期金利の年度予測値

モデルを適用させた結果は、以下の通りです。

図表4 重回帰モデルによる銀行引当率の予測結果

1997年から2025年までの重回帰モデルによる銀行引当率の予測結果

モデルによれば、2024年度において引当率は低下傾向、逆に2025年度はわずかに上昇傾向にあるようです。
但し、水準はいずれもとても低いものであり、直ちに引当率の上昇を警戒するような状態ではないようにも見えます。
本稿では、年度データによる銀行全体の引当率を対象としましたが、個別の金融機関に於いては、自行デフォルトデータ等を利用することにより、フォワードルッキングな引当対応にも活用できる余地があるのではないかと感じました。

当社について

私たち金融エンジニアリング・グループ(FEG)は、最先端の分析技術を用いた予測AIモデル構築、データ分析・コンサルティングサービスを提供しており、与信審査分野でのリスク推定モデルの金融機関様への導入において国内トップレベルの実績を誇ります。

無担保ローン初期審査モデル
無担保ローンモニタリング
メール配信ターゲット抽出モデル構築
商品レコメンドモデル構築
もっと見る 


サービス紹介ページをご覧いただき、お気軽にお問い合わせください。

研究紹介/コラム ー マクロ経済指標を用いたPythonによる銀行引当率の予測