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

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

R語言使用隨機(jī)技術(shù)差分進(jìn)化算法優(yōu)化的Nelson-Siegel-Svensson模型

2021-03-17 09:03 作者:拓端tecdat  | 我要投稿

原文鏈接:http://tecdat.cn/?p=11936

?

1引言

在本教程中,我們將研究如何將Nelson-Siegel-Svensson(NSS)模型擬合到數(shù)據(jù)。由于我們將使用隨機(jī)技術(shù)進(jìn)行優(yōu)化,因此我們應(yīng)該重新運(yùn)行幾次。變量nRuns設(shè)置示例重啟的次數(shù)。

> set.seed(112233)

2將NS模型擬合到給定的零利率

NS模型

我們使用給定的參數(shù)betaTRUE創(chuàng)建“真實”的收益曲線yM。付款時間(以年為單位)在向量tm中。

  1. > tm <- c(c(1, 3, 6, 9)/12, 1:10)


  2. > betaTRUE <- c(6, 3, 8, 1)


  3. > yM <- NS(betaTRUE, tm)


  4. > par(ps = 11, bty = "n", las = 1, tck = 0.01, mgp = c(3, 0.2, 0), mar = c(4, 4, 1, 1))


  5. > 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è)置如下:

  1. > 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進(jìn)行比較,這意味著要計算最大絕對差。



  1. > OF(param2, data) ## 得到正值

  2. [1] 0.97686

我們還可以根據(jù)收益率曲線比較解決方案。

  1. > par(ps = 11, bty = "n", las = 1, tck = 0.01, mgp = c(3, 0.2, 0), mar = c(4, 4, 1, 1))


  2. > plot(tm, yM, xlab = "maturities in years", ylab = "yields in %")


  3. > lines(tm, NS(param1, tm), col = "blue")


  4. > lines(tm, NS(param2, tm), col = "red")


  5. > 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)。?

我們已經(jīng)有了數(shù)據(jù),因此讓我們看看該函數(shù)對違反約束的解決方案有何作用。假設(shè)我們有三個解的總體mP。

  1. > param1 <- c( 6, 3, 8, -1)


  2. > param2 <- c( 6, 3, 8, 1)


  3. > param3 <- c(-1, 3, 8, 1)


  4. > mP <- cbind(param1,param2,param3)


  5. > rownames(mP) <- c("b1","b2","b3","lambda")


  6. > mP


  7. param1 param2 param3


  8. b1 6 6 -1


  9. b2 3 3 3


  10. b3 8 8 8


  11. lambda -1 1 1

第一個和第三個解決方案違反了約束。在第一個解決方案中,λ為負(fù)。在第三個解中,β1為負(fù)。

  1. > penalty(mP,data)


  2. param1 param2 param3


  3. 0.2 0.0 0.2

參數(shù)ww控制了我們的懲罰程度。
?

  1. > data$ww <- 0.5

  2. > penalty(mP,data)

  3. param1 param2 param3

  4. 1 0 1


對于有效的解決方案,懲罰應(yīng)為零。


  1. > penalty(mP, data)

  2. param1 param2 param3

  3. 0 0 0


請注意,懲罰會立即生效;無需遍歷解決方案。
這樣我們就可以進(jìn)行測試了。我們首先定義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ù)值進(jìn)行比較–它們應(yīng)該相同。

  1. > max( abs(data$model(sol$xbest, tm) - data$model(betaTRUE, tm)) )

  2. [1] 0

  3. > sol$OFvalue

  4. [1] 0?


作為基準(zhǔn),我們從stats包運(yùn)行函數(shù)nlminb。
如果發(fā)現(xiàn)它的性能優(yōu)于DE,我們將有力地表明我們的DE實現(xiàn)存在問題。
我們使用一個隨機(jī)起始值s0。

  1. > s0 <- algo$min + (algo$max - algo$min) * runif(length(algo$min))

  2. > sol2 <- nlminb(s0, OF, data = data,

  3. lower = data$min,

  4. upper = data$max,

  5. control = list(eval.max = 50000L,

  6. iter.max = 50000L))


同樣,我們比較返回的目標(biāo)函數(shù)值和最大誤差。

  1. > max( abs(data$model(sol2$par, tm) - data$model(betaTRUE,tm)) )

  2. [1] 1.5787e-07

  3. > sol2$objective

  4. [1] 1.5787e-07


為了比較我們的兩個解(DE和nlminb),我們可以將它們與真實的收益率曲線一起繪制。但是必須強(qiáng)調(diào)的是,這兩種算法的結(jié)果都是隨機(jī)的:對于DE,因為它故意使用隨機(jī)性;在nlminb的情況下,因為我們隨機(jī)設(shè)置了起始值。為了獲得更有意義的結(jié)果,我們應(yīng)該多次運(yùn)行這兩種算法。為了降低插圖的構(gòu)建時間,我們只運(yùn)行兩種方法一次。
?


  1. > plot(tm, yM, xlab = "maturities in years",

  2. ylab = "yields in %")

  3. > algo$printDetail <- FALSE

  4. > for (i in seq_len(nRuns)) {

  5. sol <- DEopt(OF = OF, algo = algo, data = data)

  6. lines(tm, data$model(sol$xbest,tm), col = "blue")

  7. s0 <- algo$min + (algo$max-algo$min) * runif(length(algo$min))

  8. sol2 <- nlminb(s0, OF, data = data,

  9. lower = data$min,

  10. upper = data$max,

  11. control = list(eval.max = 50000L,

  12. iter.max = 50000L))

  13. lines(tm,data$model(sol2$par,tm), col = "darkgreen", lty = 2)

  14. }

  15. > legend(x = "topright", legend = c("true yields", "DE", "nlminb"),

  16. col = c("black","blue","darkgreen"),

  17. pch = c(1, NA, NA), lty = c(0, 1, 2))


毫無疑問,DE似乎通常只有一條曲線:實際上有nRuns 條線,但是它們是相互疊加的。


其他約束


?NS(和NSS)模型的參數(shù)約束是要確保所得的零利率為非負(fù)數(shù)。但實際上,它們不能保證正利率。


  1. > plot(tm, yM, xlab = "maturities in years", ylab = "yields in %")

  2. > abline(h = 0)

這確實是一個虛構(gòu)的示例,但盡管如此,我們?nèi)钥赡芟Mㄡ槍Υ祟悈?shù)向量的約束措施:我們可以僅包含一個所有速率均大于零的約束條件。
同樣,這可以通過懲罰函數(shù)來完成。


校驗:

  1. > penalty2(c(3, -2, -8, 1.5),data)

  2. [1] 0.86343


此懲罰函數(shù)僅適用于單個解決方案,因此實際上將其直接寫入目標(biāo)函數(shù)最簡單。


因此,就像一個數(shù)值測試:假設(shè)上述參數(shù)為真,而利率為負(fù)。
?

  1. > algo$pen <- NULL; data$yM <- yM; data$tm <- tm

  2. > par(ps = 11, bty = "n", las = 1, tck = 0.01,

  3. mgp = c(3, 0.2, 0), mar = c(4, 4, 1, 1))

  4. > plot(tm, yM, xlab = "maturities in years", ylab = "yields in %")

  5. > abline(h = 0)

  6. > sol <- DEopt(OF = OFa, algo = algo, data = data)

  7. > lines(tm,data$model(sol$xbest,tm), col = "blue")

  8. > legend(x = "topleft", legend = c("true yields", "DE (constrained)"),

  9. col = c("black", "blue"),

  10. pch = c(1, NA, NA), lty = c(0, 1, 2))


3將NSS模型擬合到給定的零利率

如果要改用NSS模型,則幾乎不需要更改。我們只需要向目標(biāo)函數(shù)傳遞一個不同的模型。下面是一個示例。同樣,我們修復(fù)了真實參數(shù)并嘗試恢復(fù)它們。

列表數(shù)據(jù)和算法與以前幾乎相同;目標(biāo)函數(shù)保持完全相同。
仍然需要運(yùn)行算法。(同樣,我們檢查返回的目標(biāo)函數(shù)值。)

  1. > sol <- DEopt(OF = OF, algo = algo, data = data)

  2. > max( abs(data$model(sol$xbest, tm) - data$model(betaTRUE, tm)) )

  3. [1] 7.9936e-15

  4. > sol$OFvalue

  5. [1] 7.9936e-15


我們將結(jié)果與nlminb進(jìn)行比較。
最后,我們比較了幾次運(yùn)行所得的收益率曲線。

  1. > par(ps = 11, bty = "n", las = 1, tck = 0.01,

  2. mgp = c(3, 0.2, 0), mar = c(4, 4, 1, 1))

  3. > plot(tm, yM, xlab = "maturities in years", ylab = "yields in %")

  4. > for (i in seq_len(nRuns)) {

  5. sol <- DEopt(OF = OF, algo = algo, data = data)

  6. lines(tm, data$model(sol$xbest,tm), col = "blue")

  7. s0 <- algo$min + (algo$max - algo$min) * runif(length(algo$min))

  8. sol2 <- nlminb(s0, OF, data = data,

  9. lower = data$min,

  10. upper = data$max,

  11. control = list(eval.max = 50000L,

  12. iter.max = 50000L))

  13. lines(tm, data$model(sol2$par,tm), col = "darkgreen", lty = 2)

  14. }

  15. > legend(x = "topright", legend = c("true yields", "DE", "nlminb"),

  16. col = c("black","blue","darkgreen"),

  17. pch = c(1,NA,NA), lty = c(0,1,2), bg = "white")


?

參考文獻(xiàn)


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

最受歡迎的見解

1.在python中使用lstm和pytorch進(jìn)行時間序列預(yù)測

2.python中利用長短期記憶模型lstm進(jìn)行時間序列預(yù)測分析

3.使用r語言進(jìn)行時間序列(arima,指數(shù)平滑)分析

4.r語言多元copula-garch-模型時間序列預(yù)測

5.r語言copulas和金融時間序列案例

6.使用r語言隨機(jī)波動模型sv處理時間序列中的隨機(jī)波動

7.r語言時間序列tar閾值自回歸模型

8.r語言k-shape時間序列聚類方法對股票價格時間序列聚類

9.python3用arima模型進(jìn)行時間序列預(yù)測


R語言使用隨機(jī)技術(shù)差分進(jìn)化算法優(yōu)化的Nelson-Siegel-Svensson模型的評論 (共 條)

使用qq登录你需要登录后才可以评论。
新巴尔虎右旗| 昌平区| 滁州市| 玉田县| 翼城县| 蓬莱市| 梁平县| 长葛市| 全椒县| 镇坪县| 全州县| 长垣县| 嘉兴市| 玉环县| 绵竹市| 栾川县| 龙江县| 灵璧县| 罗源县| 云霄县| 云和县| 阿荣旗| 乌鲁木齐县| 宜兴市| 舒城县| 陈巴尔虎旗| 仁布县| 淮北市| 绥化市| 依安县| 榆社县| 中山市| 闻喜县| 平顺县| 蕉岭县| 嘉义市| 凌海市| 卢氏县| 筠连县| 桃园县| 额济纳旗|