Skip to content

Repository files navigation

北尾早霧・砂川武貴・山田知明『定量的マクロ経済学と数値計算』日本評論社

第2章:2期間モデル・3期間モデルと数値計算の概観

本リポジトリは、北尾早霧・砂川武貴・山田知明『定量的マクロ経済学と数値計算』(日本評論社)の第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を初めて使う人は、Julia/Jupyter内のJupyter Notebook(.ipynbという拡張子のファイル)を順番に読むことを強くお勧めします。
    • モデルを解くために必要になる知識をステップ・バイ・ステップで解説しているので、解説文・コメントを読みながらコードを実行してみてください。
    • Tipsとして、Juliaの仕様についても簡単に説明をしています。
    • Jupyter Notebookを開くのが大変な人に向けて、Julia/htmlにHTML版も用意してあります。ただし、こちらは内容を読むだけで実行は出来ません。
  • ある程度Juliaの知識がある人は、Jupyter Notebookはやや冗長に感じるかもしれないので、各フォルダに格納されたXX.jlというJuliaコード(拡張子が.jlのファイル)を直接読むことをお勧めします。
    • 内容はJupyter Notebookとまったく同じです。

MATLAB

  • 各節のコードを順番に置いてあります。

Python

  • Juliaと同じく、Jupyter Notebookで丁寧に説明をしています。

Fortran & R

  • 2.4節で解説をしたグリッドサーチ用コードのみです。

Notebook の内容

quantmacro_chapter2_1.ipynb ― 2.1〜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節:状態変数・操作変数をともに離散化したグリッドサーチの実装と政策関数の可視化

quantmacro_chapter2_2.ipynb ― 2.5節:最適化

操作変数(貯蓄額)を連続変数として扱い、各状態グリッド点で最適化問題を数値的に解きます。Julia の Optim パッケージを用いた実装です。

  • 目的関数の定義と Optim パッケージによる最適化
  • グリッドサーチとの計算時間・精度の比較

quantmacro_chapter2_3.ipynb ― 2.6.1節:求根アルゴリズム

一階条件(オイラー方程式)を残差関数として定式化し、ゼロ点を数値的に求める方法を実装します。

  • 限界効用関数 $u'(c) = c^{-\gamma}$ の定義
  • 残差関数(2.8式)の実装
  • Roots パッケージによるゼロ点探索(求根アルゴリズム)
  • 残差関数のプロット(テキスト図2.3の再現)

quantmacro_chapter2_4.ipynb ― 2.6.2節:射影法

政策関数を多項式で近似し(2.9式)、選点上で残差がゼロになるような係数 $\theta$ を非線形最小二乗法で推定します。

  • 多項式近似による政策関数 $\hat{g}(w;\theta) = \sum_n \theta_n w^n$ の実装
  • LsqFit パッケージを用いた Levenberg-Marquardt 法による係数推定
  • 初期値の選択と収束条件の確認

quantmacro_chapter2_5.ipynb ― 2.7節:内生的格子法(EGM)

操作変数のグリッド上でオイラー方程式を直接解き、対応する状態変数を予算制約から逆算する EGM(Endogenous Gridpoint Method)を実装します。最適化や求根計算を一切行わない高速な手法です。

  • オイラー方程式右辺の関数化
  • CRRA 型効用関数の逆関数による消費量の解析的計算
  • 予算制約からの状態変数の逆算

quantmacro_chapter2_6.ipynb ― 2.8節:3期間モデル

2期間モデルを3期間(若年期・中年期・老年期)に拡張します。後ろ向き帰納法(Backward Induction)により、中年期・老年期間の意思決定を先に解いてから、若年期・中年期間の意思決定に移ります。後者では線形補間(LinearInterpolation)を使って次期政策関数を近似します。

  • 3期間モデルのカリブレーション(1期間 = 20年に調整)
  • 中年期・老年期間の残差関数(2.11式)の実装
  • 若年期・中年期間の残差関数(2.12式)の実装と線形補間の活用

quantmacro_chapter2_7.ipynb ― 2.9節:リスクの導入

3期間モデルに所得リスク(離散的な確率的ショック)を加えます。遷移確率行列を外生的に与え、期待値の計算にドット積(LinearAlgebra)を使います。確率的ショックの離散近似(Tauchen 法など)は第4章で扱います。

  • 遷移確率行列の設定
  • 期待値を含む残差関数の実装
  • LinearAlgebra パッケージによるドット積計算

how_to_grid.ipynb ― 補足:グリッドの効率的な取り方(2.3.2節)

等間隔グリッドに代わる、非等間隔グリッドの生成方法を紹介します。低資産領域に格子点を密に配置することで、政策関数の精度を高める工夫です。

  • 等間隔グリッド(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を実行してパッケージをインストールしてください。
    • 図をプロットする際に日本語が文字化けする可能性があります。数値計算そのものには無関係ですが、日本語で図を表示したい場合はフォントを追加インストールする必要があります。

セットアップ

Julia と Jupyter Notebook のインストール・環境設定については、インストールと環境構築のガイド を参照してください。

About

No description, website, or topics provided.

Resources

Stars

3 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages