最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

R語言使用隨機技術(shù)差分進化算法優(yōu)化的Nelson-Siegel-Svensson模型|附代碼數(shù)據(jù)

2023-02-06 23:55 作者:拓端tecdat  | 我要投稿

原文鏈接: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ù)


R語言使用隨機技術(shù)差分進化算法優(yōu)化的Nelson-Siegel-Svensson模型|附代碼數(shù)據(jù)的評論 (共 條)

分享到微博請遵守國家法律
黄浦区| 友谊县| 镇安县| 阆中市| 南漳县| 巍山| 宁陵县| 五河县| 类乌齐县| 高安市| 射洪县| 东丽区| 辰溪县| 北流市| 卓资县| 敖汉旗| 龙胜| 怀柔区| 镇赉县| 突泉县| 常州市| 乌拉特前旗| 衢州市| 嘉鱼县| 宁蒗| 湛江市| 沽源县| 柳林县| 巴楚县| 和平县| 合川市| 太和县| 亚东县| 镇平县| 江口县| 闽清县| 黄石市| 西平县| 无为县| 沅江市| 关岭|