给定权重、波动率和相关矩阵,计算 R 中的投资组合方差
Calculate Portfolio Variance In R Given Weights, Volatility and a Correlation Matrix
我有一个动态数据集,其中包含权重向量、波动率和相关矩阵。我想创建一个函数来计算整个投资组合的方差。我也想避免任何 for 循环(如果可能的话)。
这是 3 种资产组合的合成样本。
tickers = c("AAPL", "MSFT", "AMZN")
weights = c(.33, .33, .33)
volatility = c(.2, .25, .23)
mat = data.frame(row.names = c("AAPL", "MSFT", "AMZN"), AAPL = c(1, .87, .76), MSFT = c(.87, 1, .76), AMZN = c(.87, .76, 1))
print(mat)
AAPL MSFT AMZN
AAPL 1.00 0.87 0.87
MSFT 0.87 1.00 0.76
AMZN 0.76 0.76 1.00
我会手动做这个例子。然而,我希望最终产品是一个函数,其中输入只是代码、权重、波动率和相关矩阵。输出应该是具有每日投资组合方差的单个数字。
firstPart = .33^2*(volatility[1]/sqrt(252))^2 + .33^2*(volatility[2]/sqrt(252))^2 + .33^2*(volatility[3]/sqrt(252))^2
AAPL.MSFT.Part = 2*.33*.33*(.87*((volatility[1]/sqrt(252))*(volatility[2]/sqrt(252))))
AAPL.AMZN.Part = 2*.33*.33*(.76*((volatility[1]/sqrt(252))*(volatility[3]/sqrt(252))))
MSFT.AMZN.Part = 2*.33*.33*(.76*((volatility[2]/sqrt(252))*(volatility[3]/sqrt(252))))
Portfolio.Variance = sum(c(firstPart, AAPL.MSFT.Part, AAPL.AMZN.Part, MSFT.AMZN.Part))
print(Portfolio.Variance)
0.0001727361
如果您熟悉矩阵,可以按照以下方式尝试简单的实现:
Sigma 指的是 variance/covariance 矩阵。如果您有关于资产 returns 的数据(最好是数据框或 xts 对象,其中列是资产,行是 date/time),可以使用基本 r 函数 cov()
轻松计算此矩阵].但是,如果您只有 correlation/variance 上的数据,则必须使用以下公式转换为协方差:
上述公式的简单演示:
# Setup
sd.A <- 0.2 #AAPL
sd.B <- 0.25 #MSFT
sd.C <- 0.23 #AMZN
p.AB <- 0.87 #AAPL/MSFT
p.AC <- 0.76 #AAPL/AMZN
p.BC <- 0.76 #MSFT/AMZN
cov.AB <- sd.A * sd.B * p.AB
cov.AC <- sd.A * sd.C * p.AC
cov.BC <- sd.B * sd.C * p.BC
sigma <- matrix(c(sd.A^2, cov.AB, cov.AC,
cov.AB, sd.B^2, cov.BC,
cov.AC, cov.BC, sd.C^2),
nrow = 3,
ncol = 3,
byrow = TRUE)
# If you have the return data no need for the above and just do:
sigma <- cov(returns)
# Solution
w <- as.matrix(c(.33, .33, .33))
volatility <- sqrt(t(w)%*%sigma%*%w)
我有一个动态数据集,其中包含权重向量、波动率和相关矩阵。我想创建一个函数来计算整个投资组合的方差。我也想避免任何 for 循环(如果可能的话)。
这是 3 种资产组合的合成样本。
tickers = c("AAPL", "MSFT", "AMZN")
weights = c(.33, .33, .33)
volatility = c(.2, .25, .23)
mat = data.frame(row.names = c("AAPL", "MSFT", "AMZN"), AAPL = c(1, .87, .76), MSFT = c(.87, 1, .76), AMZN = c(.87, .76, 1))
print(mat)
AAPL MSFT AMZN
AAPL 1.00 0.87 0.87
MSFT 0.87 1.00 0.76
AMZN 0.76 0.76 1.00
我会手动做这个例子。然而,我希望最终产品是一个函数,其中输入只是代码、权重、波动率和相关矩阵。输出应该是具有每日投资组合方差的单个数字。
firstPart = .33^2*(volatility[1]/sqrt(252))^2 + .33^2*(volatility[2]/sqrt(252))^2 + .33^2*(volatility[3]/sqrt(252))^2
AAPL.MSFT.Part = 2*.33*.33*(.87*((volatility[1]/sqrt(252))*(volatility[2]/sqrt(252))))
AAPL.AMZN.Part = 2*.33*.33*(.76*((volatility[1]/sqrt(252))*(volatility[3]/sqrt(252))))
MSFT.AMZN.Part = 2*.33*.33*(.76*((volatility[2]/sqrt(252))*(volatility[3]/sqrt(252))))
Portfolio.Variance = sum(c(firstPart, AAPL.MSFT.Part, AAPL.AMZN.Part, MSFT.AMZN.Part))
print(Portfolio.Variance)
0.0001727361
如果您熟悉矩阵,可以按照以下方式尝试简单的实现:
Sigma 指的是 variance/covariance 矩阵。如果您有关于资产 returns 的数据(最好是数据框或 xts 对象,其中列是资产,行是 date/time),可以使用基本 r 函数 cov()
轻松计算此矩阵].但是,如果您只有 correlation/variance 上的数据,则必须使用以下公式转换为协方差:
上述公式的简单演示:
# Setup
sd.A <- 0.2 #AAPL
sd.B <- 0.25 #MSFT
sd.C <- 0.23 #AMZN
p.AB <- 0.87 #AAPL/MSFT
p.AC <- 0.76 #AAPL/AMZN
p.BC <- 0.76 #MSFT/AMZN
cov.AB <- sd.A * sd.B * p.AB
cov.AC <- sd.A * sd.C * p.AC
cov.BC <- sd.B * sd.C * p.BC
sigma <- matrix(c(sd.A^2, cov.AB, cov.AC,
cov.AB, sd.B^2, cov.BC,
cov.AC, cov.BC, sd.C^2),
nrow = 3,
ncol = 3,
byrow = TRUE)
# If you have the return data no need for the above and just do:
sigma <- cov(returns)
# Solution
w <- as.matrix(c(.33, .33, .33))
volatility <- sqrt(t(w)%*%sigma%*%w)