2 つの資産に基づいて過去のポートフォリオのボラティリティを計算できる関数またはループを作成する方法を知りたいです。ボラティリティは、36 か月のローリング期間にわたって計算する必要があります。
次のランダム サンプル データから始めます。
require(PerformanceAnalytics)
require(zoo)
data(edhec)
R <-edhec[, 1:1]
# sample monthly returns
r1<-runif(152,-1,2)
r2<-runif(152,-2,3)
returns1<-data.frame(R,r1,r2)
returns1<-returns1[,-(1), drop=FALSE]
# sample monthly weights
W <-edhec[, 1:1]
w1<-runif(152,0,1)
w2<-runif(152,0,1)
weights1<-data.frame(W,w1,w2)
weights1<-weights1[,-(1), drop=FALSE]
sums<-apply(weights1,1,sum)
weights1<-sweep(weights1,1,sums,'/')
### the following obviously doesn't work
### calculate portfolio volatility - does not work ###
portVol1 <- sqrt(t(weights1) %*% cov(returns1) %*% weights1)
### so I make the weights static to show what im looking for
### this gives portfolio volatility over the whole dataset
### portfolio volatility with fixed weight###
weights2<-c(0.9,0.1)
portVol2 <- sqrt(t(weights2) %*% cov(returns1) %*% weights2)
print(portVol2)
portvol1
理想的には、データを使用して 36 か月 (最初の 36 か月以降に開始) のローリング期間にわたって計算されるように、何らかの関数またはループが必要returns1
です。
weights1
この関数は、その特定の月のアセットを読み取る必要があります。
ここでの問題は、ベクトルごとにローリング ボラティリティを実行できることですが、複数のベクトル (資産) で構成されるポートフォリオでは実行できないことです。
var3
まず、一歩戻って、以下の例で重みを考慮しないのはなぜですか。
var2<-rollapply(returns1, width=12,FUN=function(returns1) VaR(R=returns1, p=.95, method="historical"), by.column=TRUE)
var3<-rollapply(returns1, width=12,FUN=function(returns1) VaR(R=returns1, p=.95, method="historical"), weights=weights1, by.column=TRUE)
次に、関数内のローリング ウェイトを使用してローリング ポートフォリオのボラティリティを計算するために、最初にウェイトを機能させようとします。
VaRF<- function(x) {VaR(returns1, p=.95, method="historical",
portfolio_method="historical", weights = weights1)
}
rollingVaRF = rollapply(returns1,width=12,
FUN=VaRF, align="right")
機能が動作しないのはなぜですか?