今週も特にありません

進捗どうですか?

Rの金利期間構造パッケージ 続SmithWilsonYieldCurve

前回に続き、SmithWilsonYieldCurveパッケージを使ったメモ

ノルウェーの金融監督庁(正式日本語表記わからず)から出ていたA Technical Note on the Smith-Wilson MethodのWorked examplesをやってみる

想定している状況を定義して、fFitSmithWilsonYieldCurveToInstrumentsに適用する

library(SmithWilsonYieldCurve)

alpha <- 0.1
ufr <- log(1 + 0.042)
Type <- rep("SWAP", 4)
Tenor <- c(1, 2, 3, 5)
Rate <- c(0.01, 0.02, 0.026, 0.034)
Frequency <- rep(1, 4)
dfInstruments <- data.frame(Type, Tenor, Rate, Frequency)
Curve <- fFitSmithWilsonYieldCurveToInstruments(dfInstruments, ufr, alpha)

結果を確認する

> Curve
$P
function (t) 
{
    fBase(t) + t(KernelWeights) %*% fCompoundKernel(t)
}
<environment: 0x0000000010ddc478>

$xi
           [,1]
[1,]  57.790688
[2,] -33.507208
[3,]  11.396473
[4,]  -5.466968

$K
function (t) 
{
    CashflowMatrix %*% fKernel(t, TimesVector)
}
<environment: 0x0000000010ddc478>

attr(,"class")
[1] "SmithWilsonYieldCurve" "YieldCurve" 

xiの値が書かれているものと違う…おそらく、書き間違え
不安なので、計算過程を確認する。まず、Wilson関数を計算する

t <- 1:5
u <- 1:5
g <- expand.grid(t, u)
w <- sapply(1:nrow(g), function(i) fWilson(g$Var1[i], g$Var2[i], ufr, alpha))
W <- matrix(w, length(t), length(u))

結果を確認する

> W
           [,1]       [,2]       [,3]       [,4]       [,5]
[1,] 0.00862561 0.01590149 0.02188057 0.02674724 0.03066104
[2,] 0.01590149 0.02982485 0.04139268 0.05081327 0.05839446
[3,] 0.02188057 0.04139268 0.05813003 0.07188306 0.08296295
[4,] 0.02674724 0.05081327 0.07188306 0.08970176 0.10417950
[5,] 0.03066104 0.05839446 0.08296295 0.10417950 0.12189849

続けて、キャッシュ・フローを書く

C <- rbind(c(1.01, 0, 0, 0, 0), c(0.02, 1.02, 0, 0, 0), 
           c(0.026, 0.026, 1.026, 0, 0), c(0.034, 0.034, 0.034, 0.034, 1.034))

順々に計算する

> C %*% W %*% t(C)
            [,1]       [,2]       [,3]       [,4]
[1,] 0.008798985 0.01655595 0.02331804 0.03453269
[2,] 0.016555948 0.03168201 0.04499267 0.06705478
[3,] 0.023318045 0.04499267 0.06461534 0.09733744
[4,] 0.034532685 0.06705478 0.09733744 0.15049244

> solve(C %*% W %*% t(C))
            [,1]       [,2]      [,3]       [,4]
[1,]  10658.6389 -10190.359  3652.987  -267.9968
[2,] -10190.3594  14337.601 -7987.511  1116.2003
[3,]   3652.9867  -7987.511  6252.300 -1323.1861
[4,]   -267.9968   1116.200 -1323.186   426.6236

> mu <- exp(-ufr * 1:5)
> 1 - C %*% mu
           [,1]
[1,] 0.03071017
[2,] 0.04137547
[3,] 0.04423345
[4,] 0.03541536

> xi <- solve(C %*% W %*% t(C)) %*% (1 - C %*% mu)
> xi
           [,1]
[1,]  57.790688
[2,] -33.507208
[3,]  11.396473
[4,]  -5.466968

パッケージを使って計算したxiの値と同じになることが確認できた

さらに、その下の部分についても計算してみる

> t <- 4
> w4 <- sapply(1:5, function(i) fWilson(t, i, ufr, alpha))
> w4
[1] 0.02674724 0.05081327 0.07188306 0.08970176 0.10417950

> K4 <- t(w4) %*% t(C)
> K4
           [,1]       [,2]       [,3]      [,4]
[1,] 0.02701471 0.05236448 0.07576859 0.1158525

> KF <- K4 %*% xi
> KF
           [,1]
[1,] 0.03674387

> exp(-ufr * 4)
[1] 0.8482603

> P <- exp(-ufr * 4) + KF
> P
          [,1]
[1,] 0.8850041

> P ^ (-1/4) - 1 
           [,1]
[1,] 0.03101189

一致することが確認できた

Example2もキャッシュ・フローの頻度が4回になるように書くだけで確認できる

> alpha <- 0.1
> ufr <- log(1 + 0.042)
> Type <- rep("SWAP", 4)
> Tenor <- c(1, 2, 3, 5)
> Rate <- c(0.01, 0.02, 0.026, 0.034)
> Frequency <- rep(4, 4)
> dfInstruments <- data.frame(Type, Tenor, Rate, Frequency)
> Curve <- fFitSmithWilsonYieldCurveToInstruments(dfInstruments, ufr, alpha)
> Curve$xi
           [,1]
[1,]  58.629220
[2,] -34.081520
[3,]  11.818684
[4,]  -5.744844

> plot(Curve)

f:id:masaqol:20150308172359p:plain

ycinterextraというパッケージではNelson-SiegelやSvenssonと同様にSmith-Wilsonも指定すれば使えるようなので、ycinterextraパッケージの調査をまたの機会に