R語言使用隨機(jī)技術(shù)差分進(jìn)化算法優(yōu)化的Nelson-Siegel-Svensson模型
原文鏈接: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中。
> 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進(jìn)行比較,這意味著要計算最大絕對差。
> 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)。?
我們已經(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 -1
b2 3 3 3
b3 8 8 8
lambda -1 1 1
第一個和第三個解決方案違反了約束。在第一個解決方案中,λ為負(fù)。在第三個解中,β1為負(fù)。
> penalty(mP,data)
param1 param2 param3
0.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 param3
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)該相同。
> max( abs(data$model(sol$xbest, tm) - data$model(betaTRUE, tm)) )
[1] 0
> sol$OFvalue
[1] 0?
作為基準(zhǔn),我們從stats包運(yùn)行函數(shù)nlminb。
如果發(fā)現(xiàn)它的性能優(yōu)于DE,我們將有力地表明我們的DE實現(xiàn)存在問題。
我們使用一個隨機(jī)起始值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),我們可以將它們與真實的收益率曲線一起繪制。但是必須強(qiáng)調(diào)的是,這兩種算法的結(jié)果都是隨機(jī)的:對于DE,因為它故意使用隨機(jī)性;在nlminb的情況下,因為我們隨機(jī)設(shè)置了起始值。為了獲得更有意義的結(jié)果,我們應(yīng)該多次運(yùn)行這兩種算法。為了降低插圖的構(gòu)建時間,我們只運(yùn)行兩種方法一次。
?
> 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ù)保持完全相同。
仍然需要運(yùn)行算法。(同樣,我們檢查返回的目標(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進(jìn)行比較。
最后,我們比較了幾次運(yùn)行所得的收益率曲線。
> 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")

?
參考文獻(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模型的評論 (共 條)
