2020年8月22日土曜日

経済セミナー連載「定量的マクロ経済学と数値計算」の公開ソースコードに関して

このエントリーをはてなブックマークに追加
Pocket

経済学者が経済学の学部生から院生向けの記事を書いている雑誌「経済セミナー」に2020年2・3月号まで連載していた「定量的マクロ経済学と数値計算」を拝読して、公開されているソースコードにRのものが部分的にしか用意されていなかったので、第7回まで移植作業を進めてみたのだが、色々と気になったことがあるので記しておきたい。

1. 連載記事について

マクロ経済学でも数理モデルが複雑になり、もはや数学だけでは議論が進まなくなったため、40年ほど前から数値計算が一般的に用いられるようになっている。そのパラメーターの決定からシミュレーションまで全体もしくは一部がカリブレーションと呼ばれているが、最近は学部でも学ぶ人がいるそうだ。

邦文テキストでは『現代マクロ経済学講義』と『DSGEモデルによるマクロ実証分析の方法』が定番だったようだが、今年になって長い間、講義資料として公開されていたものを書籍化した蓮見亮『動学マクロ経済学へのいざない』と言う優れたテキストが刊行されている*1

経済セミナーの連載は、これらの教科書よりも野心的な内容になっている。初歩的な数値計算技法の話から、大学院のコア科目のマクロ経済学でもやっているDynamic Programmingを説明した後、ゼロ金利制約が入ったモデル、そしてエージェントの異質性が入ったモデルまで説明される。説明したモデルを発展させた論文も紹介されており、謳い文句通りのフロンティア感。マクロを中心に経済学を学びたい人、分野外からマクロ経済学を批評したい人は、目を通しておくべき。

2. プログラミングに関して

この連載、具体的に数値計算していく方法の紹介を目的としているので、ソースコードを公開している。ソースコードが公開されているだけで随分と学習の助けになるので、大変ありがたい。しかし、改善してもらいたい点がちらほら含まれる。

  • 商用FortranやMatlabといったプロプライエタリなプログラミング言語は、読者や学生がその環境をそろえる負担が大きい。今、教育現場で定番になっているRやPythonでオーソドックスに組んだコードもやはり欲しい。第3回まで、ちょっとはあるのだが。なお、第8回のFortranのコード、何箇所かいじればGFortranで動かすことが出来たので、ロックインされて動けないと言うわけでは無いはず。

  • コメントをもうちょっと増やしてくれればと思う箇所はちょくちょくある。論文を読めばわかるのかもだが、連載からは何を意図したコードか分からない(誌面の制限から説明仕切れなかった)箇所もある。しかし、このデータ構造と初期値、どういう目的でこうなっているのか…と途方に暮れてしまう。プログラマ的には、とりあえず動かして見ようか~となるが、マクロ経済学を学んでいる学生には大きなストレスになるはずだ。

  • 連載のために急いで書きあげたためか、収束判定がしっかりされていないコードがあった。配布コードの設定値では収束するのだが、読者がパラメーターを変えてみる可能性もあるので、繰り返し上限に達してループを抜けた場合にも、収束しましたとメッセージを出すのはよくない。

  • 速度や精度で問題が出るので、適切なアルゴリズムを使うように心がけて欲しい。二分法か何かを使うべきところで、総当り気味なコードが書かれているものがあった。もっとも他を見ていると、二分探索木や(これは他のマクロ経済学者が書いたコードだが)黄金分割探索などが随時使われているので、授業負担か何かで心の余裕が無いときに急いで書いた結果かも知れない。

  • 計算結果にはほとんど影響していないが、ループ内で変数の初期化(と言うかリセット)が適切に行われていないものがあった。また、ループ内の境界値まわりの処理にやや疑念があるコードがある。もしかしたらプログラミング言語の配列の自動拡張で、初期化した範囲外にアクセスしているかも知れない*2

  • グローバル領域にパラメーターをあらわす変数などを置いているコードが多いのだが、パラメーターを変えた複数の結果を一枚にプロットしていたりするので色々と不便なことになっている。Juliaではグローバル領域へのアクセスは工夫しないと遅くなるそうだし、変数のスコープにはもう少し注意を払った方がよいかも知れない。

  • 時間がかかる計算の結果、ファイルに保存した方がよいのでは無いであろうか。

  • 公開するにしろ、教育目的で使うにしろ、借りて来るコードのライセンスには注意した方がよい。何だかんだと公開せざるをえなくなる教育の場であればMIT License/GPLのを借りてくるのが無難。なお、公開コードは、「著者が作成した部分はMIT Licenseとする。」と言うように、ライセンスを明示してくれる方が助かる。

  • プログラムから生成した出力結果はリポジトリに含めない方がよい。結果だけ見たい人のために含める場合は、ディレクトリを分けよう。

  • 2020年であるし、ソースコードの文字コードはUTF-8に統一しておこう。

経済学研究が生業で職業プログラマなどではないので、ソースコードを一般に公開するためのノウハウに興味関心は相対的に低くなるのはやむを得ないが、学生さんも教員に本質的ではないところで文句を言いづらいであろうし代弁しておく。

3. マクロ経済学の数値演算に適したプログラミング言語

さぁ、宗教論争の時間だ。Matlabのコードが大体ベースになっているようだが、ソースコードを見るとFortran育ちでループ大好きっ子と言う感じであって*3、実際問題、ループを回避できないような数値演算が多々生じるので、ループが多いと速度が出ないRやMatlabはニーズにあっていない。

最近、数値演算界隈でその速度から人気の(Jupyter Notebookの)Juliaのコードが含まれていて、Matlab/FortranからJuliaに移行していく気もするのだが、Cで書くと煩雑なファイル入出力やプロットをするコード、処理の並列化はRで書いておき、速度が必要な部分をCでモジュールを書くのがあっている*4*5

実際に、この連載で公開されているコードをひとつRとCの拡張にポーティングしてみたのだが、RとCの連携部分に慣れてしまえば、スクリプト言語を使っているのと大差ない。ループ内で使う線形補間/スプライン補間/チェビシェフ補間を用いる場合でも、ライブラリを(ネットで検索してコピペするなりして)準備してしまえば、同じだ*6。なお、数値演算用途であれば、何故か難解と言われているポインターはほとんど使わなくて済むし、メモリ管理も最初に大きな配列を宣言してプログラム終了まで開放しないと言う方針でほとんど済むので、泥縄感が出たりしない。

2つもプログラミング言語を覚えるのは厄介なので*7、Juliaで一元化する方向になる気がかなりするのだが、Juliaも注意深く書かないとパフォーマンスが出ないことがあるし、複雑なものになってくるとCとの速度差が開くようだ。計量分析もカジュアルにこなさないといけない時代だが、この用途ではパッケージの豊富さと普及率からJuliaはRに遠く及ばない。Rを中心にCの拡張で随時速度を出すというのがよいと思うのだが、マクロ経済学界隈では流行っていない方法論である。

*1公開版を拝読したのだが、学部のマクロ経済学のテキストを終えた後、さらにマクロ経済学を専門的に学んでいこうという人が、基本的なモデルとその数値演算を把握するのによい内容に思えた。最近は統計学の講義で一般的に使われるようになったオープンソースのRで動くソースコードが公開されているのも素晴らしい。

*2直訳気味にCによるRの拡張にポーティングしているときにメモリアクセス違反が出たのだが、こちらのコーディング・ミスが原因の可能性もある。

*3(そう何分もかかる演算ではないからよいのだが)MatlabやRでも果敢にループしてある。

*4JuliaでもCを呼べるが、パフォーマンスが同じであれば定番プログラミング言語の方が便利だ。

*5RcppでC++/Eigenのコードを呼び出すと言う手もあるのだが、参照したコードは行列演算になっていなかったので、特性を活かせないかも知れない。

*6だらだらと作業をしているKrusell and Smith (1998)のコードでは、ループ中にスプライン補間と線形補間が多用されていた。

*7Rは関数型言語にシンタックスシュガーを塗したそこそこ複雑な体系でCは簡素な手続き型言語なので、学習量はさほど増えないが、使い込めば使い込むほど感覚的に混乱してくる。

0 コメント:

コメントを投稿