本リポジトリは、北尾早霧・砂川武貴・山田知明『定量的マクロ経済学と数値計算』(日本評論社)の第2章に対応するサポートコードを収録しています。
chapter2/
├── Julia/
│ ├── Jupyter/ # Jupyter Notebook(初学者向け・推奨)
│ │ ├── quantmacro_chapter2_1.ipynb # 2.1–2.4節:モデルとグリッドサーチ
│ │ ├── quantmacro_chapter2_2.ipynb # 2.5節:最適化
│ │ ├── quantmacro_chapter2_3.ipynb # 2.6.1節:求根アルゴリズム
│ │ ├── quantmacro_chapter2_4.ipynb # 2.6.2節:射影法
│ │ ├── quantmacro_chapter2_5.ipynb # 2.7節:内生的格子法(EGM)
│ │ ├── quantmacro_chapter2_6.ipynb # 2.8節:3期間モデル
│ │ ├── quantmacro_chapter2_7.ipynb # 2.9節:リスクの導入
│ │ └── how_to_grid.ipynb # 補足:グリッドの効率的な取り方
│ ├── html/ # 上記 Notebook の HTML 版(閲覧のみ)
│ ├── 2_4_Discretization/ # 2.4節:グリッドサーチ(.jl)
│ ├── 2_5_Optimization/ # 2.5節:最適化(.jl)
│ ├── 2_6_1_Root_Finding/ # 2.6.1節:求根アルゴリズム(.jl)
│ ├── 2_6_2_Projection_Method/ # 2.6.2節:射影法(.jl)
│ ├── 2_7_EGM/ # 2.7節:内生的格子法(.jl)
│ ├── 2_8_Three_Period_Model/ # 2.8節:3期間モデル(.jl)
│ └── 2_9_Risk/ # 2.9節:リスクの導入(.jl)
├── MATLAB/
│ ├── 2_4_Discretization/
│ ├── 2_5_Optimization/
│ ├── 2_6_1_Root_Finding/
│ ├── 2_6_2_Projection_Method/
│ ├── 2_7_EGM/
│ ├── 2_8_Three_Period_Model/
│ └── 2_9_Risk/
├── Python/
│ ├── Jupyter/ # Jupyter Notebook 版
│ ├── 2_4_Discretization/
│ ├── 2_5_Optimization/
│ └── 2_6_1_Root_Finding/
├── R/
│ └── 2_4_Discretization/ # グリッドサーチのみ
├── Fortran/
│ └── 2_4_Discretization/ # グリッドサーチのみ
└── 2期間モデルの解法.xlsx # Excelによる補足説明
- Juliaを初めて使う人は、
Julia/Jupyter内のJupyter Notebook(.ipynbという拡張子のファイル)を順番に読むことを強くお勧めします。- モデルを解くために必要になる知識をステップ・バイ・ステップで解説しているので、解説文・コメントを読みながらコードを実行してみてください。
- Tipsとして、Juliaの仕様についても簡単に説明をしています。
- Jupyter Notebookを開くのが大変な人に向けて、
Julia/htmlにHTML版も用意してあります。ただし、こちらは内容を読むだけで実行は出来ません。
- ある程度Juliaの知識がある人は、Jupyter Notebookはやや冗長に感じるかもしれないので、各フォルダに格納された
XX.jlというJuliaコード(拡張子が.jlのファイル)を直接読むことをお勧めします。- 内容はJupyter Notebookとまったく同じです。
- 各節のコードを順番に置いてあります。
- Juliaと同じく、Jupyter Notebookで丁寧に説明をしています。
- 2.4節で解説をしたグリッドサーチ用コードのみです。
第2章の出発点となる Notebook です。Jupyter Notebook の使い方から始まり、2期間モデルの定式化とカリブレーション、そして最もシンプルな解法であるグリッドサーチ(状態変数・操作変数ともに離散化)を実装します。
Juliaのプログラミングに関する Tips も充実しており、以下のトピックを扱っています。
- Jupyter Notebook の基本操作(セルの実行、Markdown 記法、LaTeX 数式)
- ベンチマークモデル(2期間モデル)と予算制約・一階条件・政策関数の概説
- カリブレーション:CRRA 型効用関数と割引因子
$\beta$ 、利子率$r$ の設定 -
LinRangeを使ったグリッドの生成とcollectによる型変換 - 変数の型(
Float64/Int64)と計算効率の関係 - 自作関数の作成(CRRA 型効用関数、Cobb-Douglas 型生産関数)と
if文 - 構造体(
struct)を使ったパラメータ管理 - ブロードキャスト(
.演算子)とループ計算 - 2.4節:状態変数・操作変数をともに離散化したグリッドサーチの実装と政策関数の可視化
操作変数(貯蓄額)を連続変数として扱い、各状態グリッド点で最適化問題を数値的に解きます。Julia の Optim パッケージを用いた実装です。
- 目的関数の定義と
Optimパッケージによる最適化 - グリッドサーチとの計算時間・精度の比較
一階条件(オイラー方程式)を残差関数として定式化し、ゼロ点を数値的に求める方法を実装します。
- 限界効用関数
$u'(c) = c^{-\gamma}$ の定義 - 残差関数(2.8式)の実装
-
Rootsパッケージによるゼロ点探索(求根アルゴリズム) - 残差関数のプロット(テキスト図2.3の再現)
政策関数を多項式で近似し(2.9式)、選点上で残差がゼロになるような係数
- 多項式近似による政策関数
$\hat{g}(w;\theta) = \sum_n \theta_n w^n$ の実装 -
LsqFitパッケージを用いた Levenberg-Marquardt 法による係数推定 - 初期値の選択と収束条件の確認
操作変数のグリッド上でオイラー方程式を直接解き、対応する状態変数を予算制約から逆算する EGM(Endogenous Gridpoint Method)を実装します。最適化や求根計算を一切行わない高速な手法です。
- オイラー方程式右辺の関数化
- CRRA 型効用関数の逆関数による消費量の解析的計算
- 予算制約からの状態変数の逆算
2期間モデルを3期間(若年期・中年期・老年期)に拡張します。後ろ向き帰納法(Backward Induction)により、中年期・老年期間の意思決定を先に解いてから、若年期・中年期間の意思決定に移ります。後者では線形補間(LinearInterpolation)を使って次期政策関数を近似します。
- 3期間モデルのカリブレーション(1期間 = 20年に調整)
- 中年期・老年期間の残差関数(2.11式)の実装
- 若年期・中年期間の残差関数(2.12式)の実装と線形補間の活用
3期間モデルに所得リスク(離散的な確率的ショック)を加えます。遷移確率行列を外生的に与え、期待値の計算にドット積(LinearAlgebra)を使います。確率的ショックの離散近似(Tauchen 法など)は第4章で扱います。
- 遷移確率行列の設定
- 期待値を含む残差関数の実装
LinearAlgebraパッケージによるドット積計算
等間隔グリッドに代わる、非等間隔グリッドの生成方法を紹介します。低資産領域に格子点を密に配置することで、政策関数の精度を高める工夫です。
- 等間隔グリッド(
LinRange) - 指数的グリッド(Carroll 氏の MATLAB コードを参考)2通り
- Maliar et al. (2010) によるグリッド生成法
- 書籍のすべての結果について、JuliaとMATLAB、Pythonで再現することが可能です。
- FortranとRはグリッドサーチのみ。
- MATLABではfminsearch、fminbnd、fzeroなどの関数を使っているため、インストールされているライブラリによっては動かない可能性があります。
- Pythonではnumpy、scipy、matplotlibを呼び出しています。
- Juliaではいくつかのパッケージを利用しています。
- もし実行できない場合はREPLで
]を押したのち、add package nameを実行してパッケージをインストールしてください。 - 図をプロットする際に日本語が文字化けする可能性があります。数値計算そのものには無関係ですが、日本語で図を表示したい場合はフォントを追加インストールする必要があります。
- もし実行できない場合はREPLで
Julia と Jupyter Notebook のインストール・環境設定については、インストールと環境構築のガイド を参照してください。