許文立,CIMERS,cimers_dsge@econmod.cn
我們曾經寫過DSGE建模與編程入門(54):Matlab入門、R、Python語言與編程匯總。當然,我主要是使用Matlab編程,而許坤博士主要是使用R語言。我在2017年初為人師時,讓我的大一學生去自學Python。
可是,今天開始,我又推薦大家去學Julia,如果你有「選擇困難症」,我建議你抓鬮,一種即可!我不是為你推薦的,我只是為那些未學任何程式語言、又想學的人提供一個入門的「途徑」。所以在宏觀經濟研學會,大家可以自由選擇Matlab、R、Python和Julia,而不要迷失方向。
實際上,我也不太精通Julia語言,我寫這些notes也是teach by learning。我初次下載Julia是在2017年。當我博士論文寫完時,突然發現Dynare團隊在做Dynare.jl,也就是Dynare的Julia版本。當時摸索了一下,沒有學會,就放著沒動了。直到看了Aruoba S B, Fernández-Villaverde J.(2015)、Jon Danielsson, Jia Rong Fan(2018)、Fernández-Villaverde J, Valencia D Z(2018)的文章(參見經濟分析中的程式語言:R、Matlab、Python和Julia),我心頭又一熱想學學,因此,開始找一些資料和書籍開始學習,做筆記。學了一段時間之後,三分鐘熱度退卻了,又放下了,不過這個時候已經有點入門的感覺了。今年年初,我又看了一遍【新書推薦】Introduction to Quantitative Macroeconomics Using Julia,在前期Julia的基礎知識幫助下,居然看懂了大部分內容。因此,又開始了Julia的學習之旅。
回到最初的問題,為什麼要學Julia呢?
一個字:快!天下武功,唯快不破!
如果大家熟悉計算數學和計算經濟學中的算法演進的話,可能知道,算法的精度和速度是兩個最重要的標準。而程式語言會對速度產生極大的影響,正如經濟分析中的程式語言:R、Matlab、Python和Julia中的分析所示,在同等條件下,Julia速度是最快的。
最近在開發宏觀經濟預測集成軟體的時候,很多機構都擔心Matlab昂貴的成本問題,這對於個人更不用說了。而Julia的另一個好處就是其開源。對於熟悉Matlab程式語言的人來說,轉換到Julia成本極低,因為Julia的語法結構與Matlab極為相似,只需要將Matlab中矩陣的圓括號A(2,3)改為Julia中的方括號A[2,3]即可(當然,還有一些其他的細微差別)。
Julia的劣勢就是它是一款年輕的程式語言,所以它的語法還在不斷發展中,社區較小,有一些功能還在開發之中。
更為重要的是,現在Julia已經成為紐約聯儲的御用程式語言了(https://frbny-dsge.github.io/DSGE.jl/latest/julia_forecasting.html)。此外,諾貝爾獎得主Sargent也在經濟學界、政府部門和業界極力的宣傳使用這款程式語言(https://lectures.quantecon.org/jl/)。
下面,我們來看一個小例子:即把Dynare中的example1.mod代碼轉換成Julia程序,計算DSGE模型的穩態和一階決策規則。代碼如下:
using Dynare
# Create a model objectm =@modfile begin @var y c k a h b @varexo e u @parameters beta rho alpha delta theta psi tau @model begin c*theta*h^(1+psi) = (1-alpha)*y k = beta*(((exp(b)*c)/(exp(b(+1))*c(+1)))*(exp(b(+1))*alpha*y(+1)+(1-delta)*k)) y = exp(a)*(k(-1)^alpha)*(h^(1-alpha)) k = exp(b)*(y-c)+(1-delta)*k(-1) a = rho*a(-1)+tau*b(-1) + e b = tau*a(-1)+rho*b(-1) + u endend
# Do some preliminary computationscompute_model_info(m)
# Define a calibration and some starting values for the nonlinear solver
calib = Dict( :alpha => 0.36, :rho => 0.95, :tau => 0.025, :beta => 0.99, :delta => 0.025, :psi => 0.0, :theta => 2.95 )
initval = Dict( :y => 1.08068253095672, :c => 0.80359242014163, :h => 0.29175631001732, :k => 11.08360443260358, :a => 0.0, :b => 0.0 )
# Compute and print the steady state for the given calibration
s = steady_state(m, calib, initval)
print_steady_state(m, s)
# Compute and print eigenvalues and first order decision rules
(gy, gu, eigs) = decision_rules(m, calib, s)
println("Eigenvalues: ", eigs)println()
print_decision_rules(m, gy, gu)大家可能發現了,上述Julia程序與mod語法結構基本保持一致。這也省去了我們轉換到Julia的成本。
方式一:在REPL中輸入上述代碼前,還需要加載Dynare.jl包。加載命令為
(v1.1) pkg> clone("https://git.dynare.org/Dynare/Dynare.jl")然後在REPL中輸入上述命令即可。得到的結果:
方式二:如果在Sargent他們的Jupyter Lab中運行上述程序的話,如下圖所示:
然後,點擊shift+Enter即可得到結果:
好了,下一期推送,我將帶大家正式進入Julia語言與宏觀經濟應用的學習之旅。