好奇心の横断歩道を創る!

自分の思考をラバーダック・デバッグするためのブログ

英語WikipediaのSFCモデルのページの、The model structureの節のグラフを再現

 

 

所得格差の拡大と経済の不安定性の関係を表現するAB-SFCモデルを作るのが、当初思っていたよりもはるかに難しくて、悪戦苦闘しているのですが、それはともかく、気晴らしに、

en.wikipedia.org

のグラフを再現してみた。説明用のモデルなので、正直言ってかなりシンプル。エージェントベースじゃないってだけで楽なのに、このシンプルさはずるい。愚痴はこのぐらいにしておく。グラフはこんな感じ。

θ=0.25、α1=0.6、α2=0.1

コードはPythonでこう書いた。Jupyter Notebook上で実行。plt.show()とか、plt.savefig()とか、Jupyterでは書かないのが習慣になってしまった。

import numpy as np
import matplotlib.pyplot as plt


TIME = 50
theta = 0.25
alpha1, alpha2 = 0.6, 0.1
Y = np.zeros(TIME)
C = np.zeros(TIME)
G = np.zeros(TIME)
T = np.zeros(TIME)
H = np.zeros(TIME)
YD = np.zeros(TIME)
dHs = np.zeros(TIME)
dHh = np.zeros(TIME)
G[:] = 20
for t in range(TIME):
    if t == 0:
        C[t] = 20
    else:
        C[t] = alpha1*Y[t-1] + alpha2*H[t-1]    #   行動方程式
    Y[t] = C[t] + G[t]  #   YはWでもある。W=C+Gは会計恒等式に該当する
    T[t] = theta*Y[t]   #   行動方程式
    YD[t] = Y[t] - T[t] #   可処分所得の定義式
    dHs[t] = G[t] - T[t]    #   会計恒等式。取引と資金フローの整合性
    H[t] = H[t-1] + dHs[t]  #   会計恒等式。ストックとフローの整合性



    dHh[t] = YD[t] - C[t]   #   会計恒等式。取引と資金フローの整合性。
    """
    dHhはシミュレーション上では使わないが、
    モデルに会計的矛盾が含まれていないかを確認するために使える。
    厳密には dHs[t] = dHh[t] でなければならない。が、
    数値計算の小数点の桁数が限られていることから、
    計算機側の都合により、少しだけ誤差が出る。
    """

plt.plot(G, label="G")
plt.plot(C, label="C")
plt.plot(Y, label="Y")
plt.plot(T, label="T")
plt.plot(H, label="H")
plt.plot(YD, label="YD")
plt.legend()

会計的な矛盾がないかを確認するために、dHh(WikiではΔHh)とdHs(WikiではΔHs)が等しいことを確かめておく。

plt.plot(dHs - dHh)

ΔHs - ΔHh

計算機側の都合で、小さいものの誤差は生じている。10の-14乗以内。このくらいは勘弁してください。

政府の支出Gは外生変数なので、リアル世界よろしく、指数関数的にGを増加させてみると、様子が変わってくる。

今期の政府支出が前期と比較して2%増加する設定
θ=0.25、α1=0.6、α2=0.1
対数スケール

財政支出(名目値)を指数関数的に増やしていくと、ほかの変数(名目値)も指数関数的に増えていった。そういうモデルなのだから、別に新しい発見ではないし、直感的にもあたりまえ体操だ。何かを主張できるほどのものでもないと思う。財政支出を増やすバージョンのコードはこんな感じ

TIME = 50
theta = 0.25
alpha1, alpha2 = 0.6, 0.1
Y = np.zeros(TIME)
C = np.zeros(TIME)
G = np.zeros(TIME)
T = np.zeros(TIME)
H = np.zeros(TIME)
YD = np.zeros(TIME)
dHs = np.zeros(TIME)
dHh = np.zeros(TIME)
G[:] = 20*1.02**np.arange(TIME)
for t in range(TIME):
    if t == 0:
        C[t] = 20
    else:
        C[t] = alpha1*Y[t-1] + alpha2*H[t-1]    #   行動方程式
    Y[t] = C[t] + G[t]  #   YはWでもある。W=C+Gは会計恒等式に該当する
    T[t] = theta*Y[t]   #   行動方程式
    YD[t] = Y[t] - T[t] #   可処分所得の定義式
    dHs[t] = G[t] - T[t]    #   会計恒等式。取引と資金フローの整合性
    H[t] = H[t-1] + dHs[t]  #   会計恒等式。ストックとフローの整合性



    dHh[t] = YD[t] - C[t]   #   会計恒等式。取引と資金フローの整合性。
    """
    dHhはシミュレーション上では使わないが、
    モデルに会計的矛盾が含まれていないかを確認するために使える。
    厳密には dHs[t] = dHh[t] でなければならない。が、
    数値計算の小数点の桁数が限られていることから、
    計算機側の都合により、少しだけ誤差が出る。
    """

plt.plot(G, label="G")
plt.plot(C, label="C")
plt.plot(Y, label="Y")
plt.plot(T, label="T")
plt.plot(H, label="H")
plt.plot(YD, label="YD")
plt.legend()
plt.yscale("log")

会計的一貫性の維持の確認

ΔHs - ΔHd