Julia語言與宏觀經濟應用(1): Why Julia?

2021-03-06 宏觀經濟研學會

許文立,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語言與宏觀經濟應用的學習之旅。

相關焦點

  • Julia教程1:Julia學習資料與工作環境
    學習一門語言之前,能夠清楚的知道碰到問題可以去哪裡找答案是非常重要的,同時一個個性化的工作環境更是可以讓工作效率成倍提升。這裡就我收集的一些Julia的學習資料介紹一下,並介紹一下如何搭建一個Julia的工作環境。學習資料由於是一門比較新興的語言,所以其實學習資料並不是特別多,特別是對於那些對計算機編程本身就不熟悉的人來說,更是麻煩。
  • 1 Julia簡介及安裝
    >特點核心語言非常小。標準庫用的是Julia語言本身寫的調用許多其它成熟的高性能基礎代碼。如線性代數、隨機數生成、快速傅立葉變換、字符串處理。豐富的用於創建或描述對象的類型語法高性能,接近於靜態編譯型語言。
  • Julia入門教程-變量
    UndefVarError: X not defined# 可以使用UTF-8編碼的unicode字符作為變量名julia> 變量="中文變量""中文變量"# 可以通過輸入\delta tab來輸入julia> δ="1.0""1.0"# 可以通過輸入\alpha tab來輸入julia> α=1.01.0可以通過輸入\alpha tab來輸入\hat tab_2julia
  • Julia(建設者)
    這很簡單:julia> Foo(x) = Foo(x,x)Foojulia> Foo(1)Foo(1, 1)您還可以添加一個零參數Foo>T2(x) = new(x)endjulia> T1(1)T1(1)julia> T2(1)T2(1)julia> T1(1.0
  • Julia入門教程-複數和有理數
    Julia 語言包含了預定義的複數和有理數類型,並且支持它們的各種標準數學運算和初等函數。
  • Julia(複數和有理數)
    + 1.5imjulia> (2 + 3im) / 21.0 + 1.5imjulia> (1 - 3im) / (2 + 2im)-0.5 - 1.0imjulia> 2im^2>julia> imag(1 + 2im) # imaginary part of z2julia> conj(1 + 2im) # complex conjugate of z1 - 2imjulia> abs(1 + 2im
  • Julia語言-「動靜結合」的科學計算語言
    由MIT開發的Julia語言是一種發展迅猛的開源科學計算程式語言。
  • Julia的暗黑語法:Unicode輸入
    julia> 1 ⊻ 10julia> 1 ⊻ 01julia> xor(1, 0)1julia> xor(1, 1)0還有一個就是開平方根。julia> √√162.0還有, for不一定要用 in、 =,你願意的話,也可以使用 \in+Tab的 ∈,這也已經內置了:julia> for i ∈ [1 2 3 4]           println(i)       end12
  • Julia入門教程-算術運算
    =, ≠不等<小於<=, ≤小於等於>大於>=, ≥大於等於julia> 1==2falsejulia> 1==1truejulia> 1!=2truejulia> 1 == 1.0truejulia> 1 < 2truejulia> 1.0 > 2falsejulia> 3>=3true• 有限數的大小順序,和我們所熟知的相同。
  • Julia程式語言助力天氣/氣候模式
    基於1或2指數位的Posit16數制在進行淺水模型模擬的時候,模擬結果表明,Posit16數制明顯要比半精度浮點型數制更高的精度。我們因此推薦使用具有2指數位的16位作為標準的Posit格式,其32個數量級的寬動態範圍為天氣和氣候模式提供了巨大的潛力。雖然主要集中於地球物理流體的模擬,但研究結果也表明對於在計算流體力學的廣闊領域中應用精度較低的Posit數制具有重要的意義和應用前景。
  • Julia-BioStructures
    #使用MMCIFDict將mmCIF讀入到字典中julia> mmcif_dict = MMCIFDict("/path/to/cif/file.cif")mmCIF dictionary with 716 fields#可以通過類似與字典的方式訪問MMCIFDictjulia> mmcif_dict["_entity_src_nat.common_name"]1-element
  • Julia CFD|00 系列說明
    原系列(CFD Python)採用Python作為程序描述語言,基於Python語言的易懂與易學,特別適合於課堂教學。本系列採用Julia語言對原程序代碼進行改寫,利用Julia語言的易學易懂,同時兼具高效計算的特性。
  • 如何使用 Julia 語言實現「同態加密+機器學習」?
    本文介紹了使用 Julia 語言進行基於同態加密數據機器學習的全過程,對於入門者具有極大的參考價值。注意:本文討論了最前沿的密碼學技術,旨在提供一種利用「Julia Computing」進行研究的視角。請不要將文中的任何示例用於生產應用程式。在使用密碼學之前一定要諮詢專業的密碼學專家。
  • Julia語言介紹,與大熱門Python有啥區別呢?
    Julia是一種高級程式語言,由麻省理工學院(MIT)的4個人開發。它是一種開源的、高性能的、高級的、用於科學計算的動態程式語言。它主要用於數據分析和統計計算,類似於R程式語言。Julia的主要優點是它的速度,它的應用程式與Python或R相比,運行時間更快。它支持執行困難的任務,比如雲計算和並行,這被認為是執行大數據分析的基礎。
  • Julia CFD 00 系列說明
    原系列(CFD Python)採用Python作為程序描述語言,基於Python語言的易懂與易學,特別適合於課堂教學。本系列採用Julia語言對原程序代碼進行改寫,利用Julia語言的易學易懂,同時兼具高效計算的特性。
  • Julia編程基礎 - 第 5 章 數值與運算(中)
    它使用起來是這樣的:julia> 1 + 2im; typeof(1+2im)Complex{Int64}julia> 1.1 + 2.2im; typeof(1.1+2.2im)Complex{Float64}julia>可以看到,Complex 是一個參數化的類型。
  • 開發人員應該了解的五款Julia IDE
    對於想要創建複雜應用程式的開發人員來說,IDE 可能非常有用,但是必須指出,這種語言沒有特定的 IDE,必須根據對這種語言的熟悉程度和可用性來選擇 IDE。在本文中,我們列出了 5 個 Julia 專用的 IDE 以及一些知名的 IDE 替代方案。Juno 是一個基於 Light Table 的開源、簡約、強大的 Julia IDE。
  • 用C++加速julia:BMP圖片讀取
    打個廣告:julia什麼語言都能call,C,C++,Fortran,python,R,AnyCall!PyCall.jl + OpenCV方案想想,讀圖是多麼簡單的事情啊,OpenCV走一波豈不美滋滋。然而julia沒有OpenCV的封裝,那就PyCall吧!於是請來Python輕鬆call了OpenCV。
  • 一周入門 Julia 靠譜嗎?這有一份免費的學習日程
    以下描述來自官方文檔:科學計算對性能一直有著最高的需求, 但現在這個領域的專家開始大量使用比較慢的動態語言來完成日常工作。我們相信有很多使用動態語言的理由, 所以我們不會捨棄這樣的特性。幸運的是, 現代語言設計和編譯器技術使得為原型設計提供單一的高效開發環境,並且配置高性能的應用成為可能。
  • 關於程式語言 Julia,開發團隊有這些想告訴你
    關於數據科學這方面,在與其他一些數字應用的領域相比,我承認 Julia 確實是稍有落後。但 1.0 版本,我們嘗試做了很多底層的基礎工作來改變它。使用 1.0 版本,我們的編譯器支持高性能的缺失值(https://julialang.org/blog/2018/06/missing),這是 Julia 數據科學社區呼聲的請求之一,所以我也希望使用者能充分利用它,因為這是一項耗費了我們大量付出的工作。