R語言使用隨機技術(shù)差分進化算法優(yōu)化的Nelson-Siegel-Svensson模型|附代碼數(shù)據(jù)
原文鏈接:http://tecdat.cn/?p=11936
最近我們被客戶要求撰寫關(guān)于Nelson-Siegel的研究報告,包括一些圖形和統(tǒng)計輸出。
在本教程中,我們將研究如何將Nelson-Siegel-Svensson(NSS)模型擬合到數(shù)據(jù)
1引言
由于我們將使用隨機技術(shù)進行優(yōu)化,因此我們應(yīng)該重新運行幾次。變量nRuns設(shè)置示例重啟的次數(shù)。
> set.seed(112233)
2將NS模型擬合到給定的零利率
NS模型
我們使用給定的參數(shù)betaTRUE創(chuàng)建“真實”的收益曲線yM。付款時間(以年為單位)在向量tm中。
> tm <- c(c(1, 3, 6, 9)/12, 1:10)
> betaTRUE <- c(6, 3, 8, 1)
> yM <- NS(betaTRUE, tm)
> par(ps = 11, bty = "n", las = 1, tck = 0.01, mgp = c(3, 0.2, 0), mar = c(4, 4, 1, 1))
> plot(tm, yM, xlab = "maturities in years", ylab = "yields in %")

目的是通過這些點擬合平滑曲線。我們從目標(biāo)函數(shù)OF開始。它有兩個參數(shù):param和list數(shù)據(jù)(包含所有其他變量)。返回觀察到的(“市場”)收益率yM的向量與參數(shù)param的模型收益率之間的最大絕對差。
我們添加了一個粗略而有效的約束,以防止導(dǎo)致“ NA”值的參數(shù)值:目標(biāo)函數(shù)返回較大的正值。我們將其最小化,因此產(chǎn)生NA值的參數(shù)被標(biāo)記為不良。在第一個示例中,我們將數(shù)據(jù)設(shè)置如下:
> data <- list(yM = yM, tm = tm, model = NS, ww = 0.1, min = c( 0,-15,-30, 0), max = c(15, 30, 30,10))
我們添加了一個模型(在本例中為NS),該模型描述了從參數(shù)到收益曲線的映射,以及向量min和max,我們稍后將其用作約束。ww是懲罰權(quán)重,如下所述。
OF將采用候選解決方案參數(shù),通過data $ model將此解決方案轉(zhuǎn)換為收益,并將這些收益與yM進行比較,這意味著要計算最大絕對差。
> OF(param2, data) ## 得到正值[1] 0.97686
我們還可以根據(jù)收益率曲線比較解決方案。
> par(ps = 11, bty = "n", las = 1, tck = 0.01, mgp = c(3, 0.2, 0), mar = c(4, 4, 1, 1))
> plot(tm, yM, xlab = "maturities in years", ylab = "yields in %")
> lines(tm, NS(param1, tm), col = "blue")
> lines(tm, NS(param2, tm), col = "red")
> legend(x = "topright", legend = c("true yields", "param1", "param2"), col = c("black", "blue", "red"), pch = c(1, NA, NA), lty = c(0, 1, 1))

我們通常希望獲取參數(shù),以便滿足某些約束條件。我們通過懲罰函數(shù)將它們包括在內(nèi)。?
點擊標(biāo)題查閱往期內(nèi)容

R語言中的Nelson-Siegel模型在匯率預(yù)測的應(yīng)用

左右滑動查看更多

01

02

03

04

我們已經(jīng)有了數(shù)據(jù),因此讓我們看看該函數(shù)對違反約束的解決方案有何作用。假設(shè)我們有三個解的總體mP。
> param1 <- c( 6, 3, 8, -1)
> param2 <- c( 6, 3, 8, 1)
> param3 <- c(-1, 3, 8, 1)
> mP <- cbind(param1,param2,param3)
> rownames(mP) <- c("b1","b2","b3","lambda")
> mP
param1 param2 param3
b1 6 6 -1b2 3 3 3b3 8 8 8lambda -1 1 1
第一個和第三個解決方案違反了約束。在第一個解決方案中,λ為負(fù)。在第三個解中,β1為負(fù)。
> penalty(mP,data)
param1 param2 param30.2 0.0 0.2
參數(shù)ww控制了我們的懲罰程度。
> data$ww <- 0.5> penalty(mP,data)param1 param2 param3
1 0 1
對于有效的解決方案,懲罰應(yīng)為零。
> penalty(mP, data)
param1 param2 param30 0 0
請注意,懲罰會立即生效;無需遍歷解決方案。
這樣我們就可以進行測試了。我們首先定義DE的參數(shù)。請?zhí)貏e注意,我們傳遞了懲罰函數(shù),并將loopPen設(shè)置為FALSE。
然后使用目標(biāo)函數(shù)OF,列表數(shù)據(jù)和列表算法調(diào)用DEopt。
> sol <- DEopt(OF = OF, algo = algo, data = data)
差異演化。
最佳解的目標(biāo)函數(shù)值為0;
最終人群中OF的標(biāo)準(zhǔn)偏差為3.0455e-16。
為了檢查目標(biāo)函數(shù)是否正常工作,我們將最大誤差與返回的目標(biāo)函數(shù)值進行比較–它們應(yīng)該相同。
> max( abs(data$model(sol$xbest, tm) - data$model(betaTRUE, tm)) )[1] 0> sol$OFvalue[1] 0?
作為基準(zhǔn),我們從stats包運行函數(shù)nlminb。
如果發(fā)現(xiàn)它的性能優(yōu)于DE,我們將有力地表明我們的DE實現(xiàn)存在問題。
我們使用一個隨機起始值s0。
> s0 <- algo$min + (algo$max - algo$min) * runif(length(algo$min))
> sol2 <- nlminb(s0, OF, data = data,lower = data$min,upper = data$max,control = list(eval.max = 50000L,iter.max = 50000L))
同樣,我們比較返回的目標(biāo)函數(shù)值和最大誤差。
> max( abs(data$model(sol2$par, tm) - data$model(betaTRUE,tm)) )[1] 1.5787e-07> sol2$objective[1] 1.5787e-07
為了比較我們的兩個解(DE和nlminb),我們可以將它們與真實的收益率曲線一起繪制。但是必須強調(diào)的是,這兩種算法的結(jié)果都是隨機的:對于DE,因為它故意使用隨機性;在nlminb的情況下,因為我們隨機設(shè)置了起始值。為了獲得更有意義的結(jié)果,我們應(yīng)該多次運行這兩種算法。為了降低插圖的構(gòu)建時間,我們只運行兩種方法一次。
> plot(tm, yM, xlab = "maturities in years",ylab = "yields in %")
> algo$printDetail <- FALSE
> for (i in seq_len(nRuns)) {
sol <- DEopt(OF = OF, algo = algo, data = data)
lines(tm, data$model(sol$xbest,tm), col = "blue")
s0 <- algo$min + (algo$max-algo$min) * runif(length(algo$min))
sol2 <- nlminb(s0, OF, data = data,lower = data$min,upper = data$max,control = list(eval.max = 50000L,iter.max = 50000L))
lines(tm,data$model(sol2$par,tm), col = "darkgreen", lty = 2)
}
> legend(x = "topright", legend = c("true yields", "DE", "nlminb"),col = c("black","blue","darkgreen"),pch = c(1, NA, NA), lty = c(0, 1, 2))

毫無疑問,DE似乎通常只有一條曲線:實際上有nRuns 條線,但是它們是相互疊加的。
其他約束
NS(和NSS)模型的參數(shù)約束是要確保所得的零利率為非負(fù)數(shù)。但實際上,它們不能保證正利率。
> plot(tm, yM, xlab = "maturities in years", ylab = "yields in %")
> abline(h = 0)

這確實是一個虛構(gòu)的示例,但盡管如此,我們?nèi)钥赡芟Mㄡ槍Υ祟悈?shù)向量的約束措施:我們可以僅包含一個所有速率均大于零的約束條件。
同樣,這可以通過懲罰函數(shù)來完成。
校驗:
> penalty2(c(3, -2, -8, 1.5),data)[1] 0.86343
此懲罰函數(shù)僅適用于單個解決方案,因此實際上將其直接寫入目標(biāo)函數(shù)最簡單。
因此,就像一個數(shù)值測試:假設(shè)上述參數(shù)為真,而利率為負(fù)。
> algo$pen <- NULL; data$yM <- yM; data$tm <- tm> par(ps = 11, bty = "n", las = 1, tck = 0.01,mgp = c(3, 0.2, 0), mar = c(4, 4, 1, 1))
> plot(tm, yM, xlab = "maturities in years", ylab = "yields in %")
> abline(h = 0)
> sol <- DEopt(OF = OFa, algo = algo, data = data)
> lines(tm,data$model(sol$xbest,tm), col = "blue")
> legend(x = "topleft", legend = c("true yields", "DE (constrained)"),col = c("black", "blue"),pch = c(1, NA, NA), lty = c(0, 1, 2))

3將NSS模型擬合到給定的零利率
如果要改用NSS模型,則幾乎不需要更改。我們只需要向目標(biāo)函數(shù)傳遞一個不同的模型。下面是一個示例。同樣,我們修復(fù)了真實參數(shù)并嘗試恢復(fù)它們。
列表數(shù)據(jù)和算法與以前幾乎相同;目標(biāo)函數(shù)保持完全相同。
仍然需要運行算法。(同樣,我們檢查返回的目標(biāo)函數(shù)值。)
> sol <- DEopt(OF = OF, algo = algo, data = data)
> max( abs(data$model(sol$xbest, tm) - data$model(betaTRUE, tm)) )[1] 7.9936e-15> sol$OFvalue[1] 7.9936e-15
我們將結(jié)果與nlminb進行比較。
最后,我們比較了幾次運行所得的收益率曲線。
> par(ps = 11, bty = "n", las = 1, tck = 0.01,mgp = c(3, 0.2, 0), mar = c(4, 4, 1, 1))
> plot(tm, yM, xlab = "maturities in years", ylab = "yields in %")
> for (i in seq_len(nRuns)) {
sol <- DEopt(OF = OF, algo = algo, data = data)
lines(tm, data$model(sol$xbest,tm), col = "blue")
s0 <- algo$min + (algo$max - algo$min) * runif(length(algo$min))
sol2 <- nlminb(s0, OF, data = data,lower = data$min,upper = data$max,control = list(eval.max = 50000L,iter.max = 50000L))
lines(tm, data$model(sol2$par,tm), col = "darkgreen", lty = 2)
}
> legend(x = "topright", legend = c("true yields", "DE", "nlminb"),col = c("black","blue","darkgreen"),pch = c(1,NA,NA), lty = c(0,1,2), bg = "white")

?
參考文獻
關(guān)于數(shù)值優(yōu)化中“良好起始值”的注釋,2010年。http://comisef.eu/?q?= working_papers

點擊文末?“閱讀原文”
獲取全文完整代碼數(shù)據(jù)資料。
本文選自《R語言使用隨機技術(shù)差分進化算法優(yōu)化的Nelson-Siegel-Svensson模型》。
點擊標(biāo)題查閱往期內(nèi)容
分解商業(yè)周期時間序列:線性濾波器、HP濾波器、Baxter濾波器、Beveridge Nelson分解等去趨勢法
R語言中的Nelson-Siegel模型在匯率預(yù)測的應(yīng)用
R語言用神經(jīng)網(wǎng)絡(luò)改進Nelson-Siegel模型擬合收益率曲線分析
分解商業(yè)周期時間序列:線性濾波器、HP濾波器、Baxter濾波器、Beveridge Nelson分解等去趨勢法
用R語言用Nelson Siegel和線性插值模型對債券價格和收益率建模
R語言用神經(jīng)網(wǎng)絡(luò)改進Nelson-Siegel模型擬合收益率曲線分析
R語言和QuantLib中Nelson-Siegel模型收益曲線建模分析
R語言使用隨機技術(shù)差分進化算法優(yōu)化的Nelson-Siegel-Svensson模型
用R語言用Nelson Siegel和線性插值模型對債券價格和收益率建模R語言用神經(jīng)網(wǎng)絡(luò)改進Nelson-Siegel模型擬合收益率曲線分析
R語言中的Nelson-Siegel模型在匯率預(yù)測的應(yīng)用
python使用LASSO回歸預(yù)測股票收益
R語言數(shù)據(jù)的收益率和波動性交易
R語言用線性模型進行預(yù)測:加權(quán)泊松回歸,普通最小二乘,加權(quán)負(fù)二項式模型,多重插補缺失值
使用SAS,Stata,HLM,R,SPSS和Mplus的分層線性模型HLM
R語言用線性回歸模型預(yù)測空氣質(zhì)量臭氧數(shù)據(jù)