This is an R Markdown document. Markdown is a simple formatting syntax for authoring HTML, PDF, and MS Word documents. For more details on using R Markdown see http://rmarkdown.rstudio.com.
When you click the Knit button a document will be generated that includes both content as well as the output of any embedded R code chunks within the document. You can embed an R code chunk like this:
summary(cars)
## speed dist
## Min. : 4.0 Min. : 2.00
## 1st Qu.:12.0 1st Qu.: 26.00
## Median :15.0 Median : 36.00
## Mean :15.4 Mean : 42.98
## 3rd Qu.:19.0 3rd Qu.: 56.00
## Max. :25.0 Max. :120.00
You can also embed plots, for example:
Note that the echo = FALSE parameter was added to the
code chunk to prevent printing of the R code that generated the
plot.
#install.packages("quantmod")
library(quantmod)
## Loading required package: xts
## Loading required package: zoo
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
## Loading required package: TTR
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
library(ggplot2)
#install.packages("gridExtra")
library(gridExtra)
library(scales)
tickers <- c("VV", "GLD", "CAT", "AMD", "JNJ", "MSFT", "AMZN", "INTC", "IBM", "ACWX", "TSLA", "META", "BABA", "OKTA", "PTTRX", "VINIX", "SEBLX")
start <- "2021-12-31"
end <- "2023-12-31"
n <- length(tickers)
p <- getSymbols(Symbols = tickers[1], src = "yahoo",
from = start, to = end,
auto.assign = F)[, 6]
for (i in 2:n){
p <- merge(p, getSymbols(Symbols = tickers[i], src = "yahoo",
from = start, to = end,
auto.assign=F)[, 6])
}
names(p) <- gsub(".Adjusted", "", names(p))
head(p)
## VV GLD CAT AMD JNJ MSFT AMZN INTC
## 2021-12-31 212.0472 170.96 194.8151 143.90 158.0748 328.4742 166.7170 47.76451
## 2022-01-03 212.6324 168.33 195.0601 150.24 158.5091 326.9409 170.4045 49.35048
## 2022-01-04 212.2582 169.57 205.5010 144.42 158.0840 321.3347 167.5220 49.28556
## 2022-01-05 207.9025 169.06 207.0747 136.15 159.1374 308.9994 164.3570 49.96262
## 2022-01-06 207.6723 166.99 209.1855 136.23 158.5923 306.5577 163.2540 50.09246
## 2022-01-07 206.7992 167.75 211.2586 132.00 160.7360 306.7140 162.5540 49.56380
## IBM ACWX TSLA META BABA OKTA PTTRX
## 2021-12-31 117.0864 51.83199 352.2600 335.3403 114.7210 224.17 9.117855
## 2022-01-03 119.1713 52.13031 399.9267 337.5237 116.2566 222.66 9.046832
## 2022-01-04 120.9058 52.22353 383.1967 335.5198 115.4647 215.01 9.046832
## 2022-01-05 121.0810 51.65487 362.7067 323.1969 117.0099 198.59 9.011315
## 2022-01-06 118.5581 51.59893 354.9000 331.4620 122.2925 202.22 9.002442
## 2022-01-07 118.1113 51.83199 342.3200 330.7940 125.3636 196.67 8.975805
## VINIX SEBLX
## 2021-12-31 375.9727 25.12354
## 2022-01-03 378.3630 25.17189
## 2022-01-04 378.1500 25.21058
## 2022-01-05 370.8490 24.88178
## 2022-01-06 370.5154 24.87211
## 2022-01-07 369.0793 24.87211
# Simple returns
ret <- p / lag(p) - 1
# Log-returns (in case you want to use these instead, however notice that using
# log-returns would also change how we calculate the cross-sectional portfolio
# returns and its average time-series return too.
# ret <- log(p / lag(p))
# Removing the first row since it contains NA's: a return can't be calculated
# for the first day
ret <- ret[-1, ]
tail(ret)
## VV GLD CAT AMD JNJ
## 2023-12-21 0.0107462830 0.007070635 0.0012427006 0.032774802 0.010243229
## 2023-12-22 0.0022092075 0.004434417 0.0009996823 -0.002215693 0.004004190
## 2023-12-26 0.0042708113 0.007620733 0.0181499487 0.027292245 0.004374064
## 2023-12-27 0.0016006101 0.004537842 0.0084225499 0.018548243 0.001344921
## 2023-12-28 0.0003196386 -0.005815438 -0.0041593042 0.018415739 0.001471063
## 2023-12-29 -0.0043360035 -0.001566841 -0.0040757843 -0.009074959 0.001021889
## MSFT AMZN INTC IBM ACWX
## 2023-12-21 0.0078786508 1.130687e-02 0.028846325 0.004561059 0.0169286283
## 2023-12-22 0.0027842156 -2.730097e-03 0.019541108 0.008458827 -0.0001981299
## 2023-12-26 0.0002135569 -6.514475e-05 0.052083426 0.006599235 0.0057482856
## 2023-12-27 -0.0015747584 -4.563413e-04 0.005148462 0.001531829 0.0047299440
## 2023-12-28 0.0032346261 2.609140e-04 -0.007289247 0.001774099 0.0000000000
## 2023-12-29 0.0020251290 -9.388463e-03 -0.002778319 -0.001221383 0.0011769572
## TSLA META BABA OKTA PTTRX
## 2023-12-21 0.029780694 0.013771103 0.039672880 0.044212553 0.000000000
## 2023-12-22 -0.007701402 -0.001976921 -0.012850848 0.003593887 0.000000000
## 2023-12-26 0.016116228 0.004074795 0.007571748 0.026410034 0.001159102
## 2023-12-27 0.018822405 0.008454848 0.003427836 -0.012211107 0.005786848
## 2023-12-28 -0.031594284 0.001369355 0.014846947 0.008057432 -0.003452155
## 2023-12-29 -0.018563856 -0.012167842 0.003495632 -0.008759477 0.001969120
## VINIX SEBLX
## 2023-12-21 0.0102887729 0.005999964
## 2023-12-22 0.0016595925 0.001192821
## 2023-12-26 0.0042426841 0.001985717
## 2023-12-27 0.0015440396 0.002346726
## 2023-12-28 0.0004816509 0.000000000
## 2023-12-29 -0.0027877814 -0.001984101
# Counting if there are any more NAs
# colSums(is.na(ret))
apply(is.na(ret), 2, sum)
## VV GLD CAT AMD JNJ MSFT AMZN INTC IBM ACWX TSLA META BABA
## 0 0 0 0 0 0 0 0 0 0 0 0 0
## OKTA PTTRX VINIX SEBLX
## 0 0 0 0
# If there were still NAs and we wanted to remove them:
# ret <- na.omit(ret)
retm <- as.matrix(ret)
head(retm)
## VV GLD CAT AMD JNJ
## 2022-01-03 0.002760003 -0.015383743 0.001257578 0.0440584563 0.002747309
## 2022-01-04 -0.001759732 0.007366515 0.053526514 -0.0387380665 -0.002681639
## 2022-01-05 -0.020520747 -0.003007665 0.007657796 -0.0572635672 0.006663678
## 2022-01-06 -0.001107515 -0.012244127 0.010193395 0.0005876007 -0.003425852
## 2022-01-07 -0.004203964 0.004551138 0.009910586 -0.0310503990 0.013517388
## 2022-01-10 -0.001484638 0.003040206 -0.011374539 0.0000000000 -0.004943898
## MSFT AMZN INTC IBM ACWX
## 2022-01-03 -0.0046682084 0.022118321 0.033203897 0.017806246 0.005755386
## 2022-01-04 -0.0171471674 -0.016915587 -0.001315459 0.014554465 0.001788353
## 2022-01-05 -0.0383879686 -0.018893092 0.013737397 0.001449200 -0.010888975
## 2022-01-06 -0.0079018964 -0.006710982 0.002598760 -0.020836309 -0.001082932
## 2022-01-07 0.0005098911 -0.004287778 -0.010553680 -0.003768233 0.004516739
## 2022-01-10 0.0007322094 -0.006570176 0.033121363 0.001483164 -0.006834471
## TSLA META BABA OKTA PTTRX
## 2022-01-03 0.13531668 0.006511029 0.013384970 -0.006735935 -0.0077894403
## 2022-01-04 -0.04183270 -0.005937173 -0.006811729 -0.034357357 0.0000000000
## 2022-01-05 -0.05347121 -0.036727806 0.013382419 -0.076368534 -0.0039258758
## 2022-01-06 -0.02152337 0.025572975 0.045146885 0.018278891 -0.0009846494
## 2022-01-07 -0.03544657 -0.002015312 0.025112480 -0.027445371 -0.0029588723
## 2022-01-10 0.03034195 -0.011211907 -0.011632366 0.023236932 0.0000000000
## VINIX SEBLX
## 2022-01-03 0.0063577771 0.0019246172
## 2022-01-04 -0.0005630657 0.0015367513
## 2022-01-05 -0.0193071416 -0.0130418513
## 2022-01-06 -0.0008995243 -0.0003887248
## 2022-01-07 -0.0038758598 0.0000000000
## 2022-01-10 -0.0014309586 -0.0019439195
# Portfolio Weights
wts <- matrix(rep(1/n, n), nrow = n, ncol = 1)
wts
## [,1]
## [1,] 0.05882353
## [2,] 0.05882353
## [3,] 0.05882353
## [4,] 0.05882353
## [5,] 0.05882353
## [6,] 0.05882353
## [7,] 0.05882353
## [8,] 0.05882353
## [9,] 0.05882353
## [10,] 0.05882353
## [11,] 0.05882353
## [12,] 0.05882353
## [13,] 0.05882353
## [14,] 0.05882353
## [15,] 0.05882353
## [16,] 0.05882353
## [17,] 0.05882353
# Removing row names from "retm" (matrix) to avoid conflict with rownames from
# "ret" (xts)
rownames(retm) <- NULL
# Portfolio Returns (considering discrete returns)
ret$EqPort <- retm %*% wts
# Portfolio Returns (considering continuous returns)
# ret$EqPort <- log(exp(m) %*% wts)
head(ret)
## VV GLD CAT AMD JNJ
## 2022-01-03 0.002760003 -0.015383743 0.001257578 0.0440584563 0.002747309
## 2022-01-04 -0.001759732 0.007366515 0.053526514 -0.0387380665 -0.002681639
## 2022-01-05 -0.020520747 -0.003007665 0.007657796 -0.0572635672 0.006663678
## 2022-01-06 -0.001107515 -0.012244127 0.010193395 0.0005876007 -0.003425852
## 2022-01-07 -0.004203964 0.004551138 0.009910586 -0.0310503990 0.013517388
## 2022-01-10 -0.001484638 0.003040206 -0.011374539 0.0000000000 -0.004943898
## MSFT AMZN INTC IBM ACWX
## 2022-01-03 -0.0046682084 0.022118321 0.033203897 0.017806246 0.005755386
## 2022-01-04 -0.0171471674 -0.016915587 -0.001315459 0.014554465 0.001788353
## 2022-01-05 -0.0383879686 -0.018893092 0.013737397 0.001449200 -0.010888975
## 2022-01-06 -0.0079018964 -0.006710982 0.002598760 -0.020836309 -0.001082932
## 2022-01-07 0.0005098911 -0.004287778 -0.010553680 -0.003768233 0.004516739
## 2022-01-10 0.0007322094 -0.006570176 0.033121363 0.001483164 -0.006834471
## TSLA META BABA OKTA PTTRX
## 2022-01-03 0.13531668 0.006511029 0.013384970 -0.006735935 -0.0077894403
## 2022-01-04 -0.04183270 -0.005937173 -0.006811729 -0.034357357 0.0000000000
## 2022-01-05 -0.05347121 -0.036727806 0.013382419 -0.076368534 -0.0039258758
## 2022-01-06 -0.02152337 0.025572975 0.045146885 0.018278891 -0.0009846494
## 2022-01-07 -0.03544657 -0.002015312 0.025112480 -0.027445371 -0.0029588723
## 2022-01-10 0.03034195 -0.011211907 -0.011632366 0.023236932 0.0000000000
## VINIX SEBLX EqPort
## 2022-01-03 0.0063577771 0.0019246172 0.015213232
## 2022-01-04 -0.0005630657 0.0015367513 -0.005252181
## 2022-01-05 -0.0193071416 -0.0130418513 -0.018171409
## 2022-01-06 -0.0008995243 -0.0003887248 0.001486625
## 2022-01-07 -0.0038758598 0.0000000000 -0.003969871
## 2022-01-10 -0.0014309586 -0.0019439195 0.002031115
# Daily 99% VaR (Alpha: 1%, Holding Period: 1 day)
alpha <- 0.01
hp <- 1
pv <- c(rep(10000, n), 10000*n)
pv
## [1] 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000
## [11] 10000 10000 10000 10000 10000 10000 10000 170000
# Returns
ret.avg <- apply(ret, 2, mean, na.rm = T) * hp
print(percent( ret.avg , accuracy = 0.01))
## VV GLD CAT AMD JNJ MSFT AMZN INTC
## "0.01%" "0.03%" "0.10%" "0.06%" "0.00%" "0.04%" "0.02%" "0.04%"
## IBM ACWX TSLA META BABA OKTA PTTRX VINIX
## "0.07%" "0.00%" "0.00%" "0.07%" "-0.01%" "-0.09%" "-0.02%" "0.01%"
## SEBLX EqPort
## "0.00%" "0.02%"
# Volatilities
vol <- apply(ret, 2, sd, na.rm = T) * sqrt(hp)
print(percent( vol , accuracy = 0.01))
## VV GLD CAT AMD JNJ MSFT AMZN INTC IBM ACWX
## "1.25%" "0.90%" "1.96%" "3.44%" "1.07%" "1.93%" "2.68%" "2.43%" "1.27%" "1.14%"
## TSLA META BABA OKTA PTTRX VINIX SEBLX EqPort
## "3.83%" "3.39%" "3.79%" "4.26%" "0.49%" "1.23%" "0.84%" "1.42%"
# Correlation Matrix (observed / historical data)
cor_h <- cor(retm, use = "complete.obs", method = "pearson")
cor_h
## VV GLD CAT AMD JNJ MSFT
## VV 1.0000000 0.128899127 0.5225395 0.73210327 0.3449929496 0.8032391
## GLD 0.1288991 1.000000000 0.1331100 0.09034267 0.0130761093 0.0823606
## CAT 0.5225395 0.133109988 1.0000000 0.32010013 0.1586723188 0.2650064
## AMD 0.7321033 0.090342673 0.3201001 1.00000000 0.0810500980 0.6580204
## JNJ 0.3449929 0.013076109 0.1586723 0.08105010 1.0000000000 0.1997732
## MSFT 0.8032391 0.082360597 0.2650064 0.65802043 0.1997731847 1.0000000
## AMZN 0.7498786 0.122605318 0.2539579 0.60921771 0.1407320791 0.6888760
## INTC 0.6304782 0.164065229 0.3036199 0.60612650 0.1638300519 0.5274422
## IBM 0.4958084 0.068790185 0.3703835 0.30024530 0.3939299530 0.3139779
## ACWX 0.8388799 0.290697189 0.5433504 0.62122901 0.2294761104 0.6039616
## TSLA 0.6062099 0.002480312 0.2725934 0.53112171 0.0638221612 0.4654739
## META 0.6418462 0.044773616 0.1671714 0.53199830 0.1177139693 0.5983931
## BABA 0.4131969 0.145253556 0.1539171 0.33900333 -0.0002746535 0.2845180
## OKTA 0.5334542 0.086745797 0.1831149 0.46698718 0.0154958178 0.4591411
## PTTRX 0.2490615 0.484761213 0.0480776 0.16678715 0.1128803366 0.1772590
## VINIX 0.9985357 0.131864540 0.5311055 0.72900397 0.3558211588 0.8007202
## SEBLX 0.9724964 0.221132480 0.4880699 0.70172678 0.3436528633 0.7934503
## AMZN INTC IBM ACWX TSLA META
## VV 0.7498786 0.6304782 0.49580842 0.8388799 0.606209867 0.64184625
## GLD 0.1226053 0.1640652 0.06879018 0.2906972 0.002480312 0.04477362
## CAT 0.2539579 0.3036199 0.37038352 0.5433504 0.272593441 0.16717140
## AMD 0.6092177 0.6061265 0.30024530 0.6212290 0.531121715 0.53199830
## JNJ 0.1407321 0.1638301 0.39392995 0.2294761 0.063822161 0.11771397
## MSFT 0.6888760 0.5274422 0.31397786 0.6039616 0.465473946 0.59839309
## AMZN 1.0000000 0.4572703 0.25329002 0.5901947 0.506189069 0.60249263
## INTC 0.4572703 1.0000000 0.34768979 0.5412433 0.378371316 0.47474924
## IBM 0.2532900 0.3476898 1.00000000 0.4323570 0.157044144 0.16236416
## ACWX 0.5901947 0.5412433 0.43235701 1.0000000 0.495643873 0.52500235
## TSLA 0.5061891 0.3783713 0.15704414 0.4956439 1.000000000 0.38116769
## META 0.6024926 0.4747492 0.16236416 0.5250023 0.381167692 1.00000000
## BABA 0.3074454 0.3180466 0.14523805 0.5729304 0.357092867 0.35015388
## OKTA 0.4895331 0.3631014 0.15492559 0.4431487 0.399935977 0.40998344
## PTTRX 0.2373890 0.1855190 0.06261888 0.2824541 0.140870593 0.13345323
## VINIX 0.7419425 0.6315058 0.50716880 0.8377761 0.599629560 0.63746707
## SEBLX 0.7617811 0.6244090 0.46338194 0.8377694 0.556231787 0.66528850
## BABA OKTA PTTRX VINIX SEBLX
## VV 0.4131969238 0.53345422 0.24906151 0.9985357 0.9724964
## GLD 0.1452535562 0.08674580 0.48476121 0.1318645 0.2211325
## CAT 0.1539170532 0.18311487 0.04807760 0.5311055 0.4880699
## AMD 0.3390033276 0.46698718 0.16678715 0.7290040 0.7017268
## JNJ -0.0002746535 0.01549582 0.11288034 0.3558212 0.3436529
## MSFT 0.2845180028 0.45914109 0.17725904 0.8007202 0.7934503
## AMZN 0.3074454305 0.48953311 0.23738900 0.7419425 0.7617811
## INTC 0.3180466043 0.36310141 0.18551899 0.6315058 0.6244090
## IBM 0.1452380484 0.15492559 0.06261888 0.5071688 0.4633819
## ACWX 0.5729304124 0.44314870 0.28245410 0.8377761 0.8377694
## TSLA 0.3570928675 0.39993598 0.14087059 0.5996296 0.5562318
## META 0.3501538839 0.40998344 0.13345323 0.6374671 0.6652885
## BABA 1.0000000000 0.29891068 0.12922692 0.4042923 0.4243798
## OKTA 0.2989106840 1.00000000 0.21609978 0.5151686 0.5321326
## PTTRX 0.1292269227 0.21609978 1.00000000 0.2465429 0.4059311
## VINIX 0.4042923149 0.51516864 0.24654287 1.0000000 0.9718643
## SEBLX 0.4243798487 0.53213257 0.40593109 0.9718643 1.0000000
# Covariance Matrix (observed / historical data)
cov_h <- cov(retm, use = "complete.obs", method = "pearson") * hp
cov_h
## VV GLD CAT AMD JNJ
## VV 1.573689e-04 1.462787e-05 1.286897e-04 3.160929e-04 4.626856e-05
## GLD 1.462787e-05 8.183577e-05 2.364000e-05 2.812856e-05 1.264639e-06
## CAT 1.286897e-04 2.364000e-05 3.854167e-04 2.162888e-04 3.330295e-05
## AMD 3.160929e-04 2.812856e-05 2.162888e-04 1.184584e-03 2.982310e-05
## JNJ 4.626856e-05 1.264639e-06 3.330295e-05 2.982310e-05 1.142964e-04
## MSFT 1.948512e-04 1.440754e-05 1.006052e-04 4.379464e-04 4.130021e-05
## AMZN 2.522067e-04 2.973631e-05 1.336697e-04 5.621621e-04 4.033811e-05
## INTC 1.921100e-04 3.605026e-05 1.447824e-04 5.067182e-04 4.254320e-05
## IBM 7.921199e-05 7.925298e-06 9.260501e-05 1.316063e-04 5.363556e-05
## ACWX 1.203482e-04 3.007410e-05 1.219904e-04 2.445202e-04 2.805653e-05
## TSLA 2.916302e-04 8.604547e-07 2.052252e-04 7.010145e-04 2.616603e-05
## META 2.729231e-04 1.372915e-05 1.112441e-04 6.206445e-04 4.265737e-05
## BABA 1.964587e-04 4.980273e-05 1.145267e-04 4.422233e-04 -1.112900e-07
## OKTA 2.849963e-04 3.341971e-05 1.530987e-04 6.844953e-04 7.055267e-06
## PTTRX 1.518770e-05 2.131697e-05 4.588113e-06 2.790432e-05 5.866251e-06
## VINIX 1.536998e-04 1.463693e-05 1.279371e-04 3.078670e-04 4.667651e-05
## SEBLX 1.023665e-04 1.678550e-05 8.040028e-05 2.026568e-04 3.082808e-05
## MSFT AMZN INTC IBM ACWX
## VV 1.948512e-04 2.522067e-04 1.921100e-04 7.921199e-05 1.203482e-04
## GLD 1.440754e-05 2.973631e-05 3.605026e-05 7.925298e-06 3.007410e-05
## CAT 1.006052e-04 1.336697e-04 1.447824e-04 9.260501e-05 1.219904e-04
## AMD 4.379464e-04 5.621621e-04 5.067182e-04 1.316063e-04 2.445202e-04
## JNJ 4.130021e-05 4.033811e-05 4.254320e-05 5.363556e-05 2.805653e-05
## MSFT 3.739361e-04 3.571461e-04 2.477387e-04 7.732418e-05 1.335636e-04
## AMZN 3.571461e-04 7.188070e-04 2.977827e-04 8.648520e-05 1.809596e-04
## INTC 2.477387e-04 2.977827e-04 5.899845e-04 1.075548e-04 1.503464e-04
## IBM 7.732418e-05 8.648520e-05 1.075548e-04 1.621941e-04 6.297095e-05
## ACWX 1.335636e-04 1.809596e-04 1.503464e-04 6.297095e-05 1.307857e-04
## TSLA 3.451788e-04 5.204380e-04 3.524427e-04 7.669894e-05 2.173702e-04
## META 3.922248e-04 5.475297e-04 3.908718e-04 7.009023e-05 2.035126e-04
## BABA 2.085274e-04 3.124129e-04 2.927965e-04 7.010560e-05 2.483344e-04
## OKTA 3.781182e-04 5.589473e-04 3.756046e-04 8.402787e-05 2.158303e-04
## PTTRX 1.666223e-05 3.093804e-05 2.190457e-05 3.876581e-06 1.570197e-05
## VINIX 1.899896e-04 2.440769e-04 1.882123e-04 7.925386e-05 1.175597e-04
## SEBLX 1.287445e-04 1.713747e-04 1.272623e-04 4.951843e-05 8.039239e-05
## TSLA META BABA OKTA PTTRX
## VV 2.916302e-04 2.729231e-04 1.964587e-04 2.849963e-04 1.518770e-05
## GLD 8.604547e-07 1.372915e-05 4.980273e-05 3.341971e-05 2.131697e-05
## CAT 2.052252e-04 1.112441e-04 1.145267e-04 1.530987e-04 4.588113e-06
## AMD 7.010145e-04 6.206445e-04 4.422233e-04 6.844953e-04 2.790432e-05
## JNJ 2.616603e-05 4.265737e-05 -1.112900e-07 7.055267e-06 5.866251e-06
## MSFT 3.451788e-04 3.922248e-04 2.085274e-04 3.781182e-04 1.666223e-05
## AMZN 5.204380e-04 5.475297e-04 3.124129e-04 5.589473e-04 3.093804e-05
## INTC 3.524427e-04 3.908718e-04 2.927965e-04 3.756046e-04 2.190457e-05
## IBM 7.669894e-05 7.009023e-05 7.010560e-05 8.402787e-05 3.876581e-06
## ACWX 2.173702e-04 2.035126e-04 2.483344e-04 2.158303e-04 1.570197e-05
## TSLA 1.470619e-03 4.954683e-04 5.190222e-04 6.531654e-04 2.626010e-05
## META 4.954683e-04 1.148946e-03 4.498456e-04 5.918324e-04 2.198897e-05
## BABA 5.190222e-04 4.498456e-04 1.436513e-03 4.824795e-04 2.380860e-05
## OKTA 6.531654e-04 5.918324e-04 4.824795e-04 1.813699e-03 4.473660e-05
## PTTRX 2.626010e-05 2.198897e-05 2.380860e-05 4.473660e-05 2.362937e-05
## VINIX 2.821522e-04 2.651294e-04 1.880185e-04 2.692045e-04 1.470513e-05
## SEBLX 1.789848e-04 1.892213e-04 1.349646e-04 1.901572e-04 1.655726e-05
## VINIX SEBLX
## VV 1.536998e-04 1.023665e-04
## GLD 1.463693e-05 1.678550e-05
## CAT 1.279371e-04 8.040028e-05
## AMD 3.078670e-04 2.026568e-04
## JNJ 4.667651e-05 3.082808e-05
## MSFT 1.899896e-04 1.287445e-04
## AMZN 2.440769e-04 1.713747e-04
## INTC 1.882123e-04 1.272623e-04
## IBM 7.925386e-05 4.951843e-05
## ACWX 1.175597e-04 8.039239e-05
## TSLA 2.821522e-04 1.789848e-04
## META 2.651294e-04 1.892213e-04
## BABA 1.880185e-04 1.349646e-04
## OKTA 2.692045e-04 1.901572e-04
## PTTRX 1.470513e-05 1.655726e-05
## VINIX 1.505569e-04 1.000613e-04
## SEBLX 1.000613e-04 7.040775e-05
# Confirming Portfolio Volatility, in percentage
sqrt(t(wts) %*% cov_h %*% wts)*100
## [,1]
## [1,] 1.418154
var.p <- ret.avg + qnorm(alpha)*vol
print(percent( var.p , accuracy = 0.01))
## VV GLD CAT AMD JNJ MSFT AMZN INTC
## "-2.91%" "-2.08%" "-4.47%" "-7.94%" "-2.49%" "-4.45%" "-6.22%" "-5.61%"
## IBM ACWX TSLA META BABA OKTA PTTRX VINIX
## "-2.90%" "-2.66%" "-8.92%" "-7.82%" "-8.83%" "-9.99%" "-1.15%" "-2.84%"
## SEBLX EqPort
## "-1.95%" "-3.28%"
# since this is an equally-weighted portfolio, the mean works fine too
# mean(var.p[1:n])
print(percent( var.p[1:n] %*% wts , accuracy = 0.01))
## [1] "-4.90%"
var.p.pv <- var.p*pv
print(number( var.p.pv , accuracy = 0.01, big.mark = ","))
## VV GLD CAT AMD JNJ MSFT
## "-290.68" "-207.81" "-446.78" "-794.30" "-248.77" "-445.40"
## AMZN INTC IBM ACWX TSLA META
## "-621.97" "-561.38" "-289.50" "-265.99" "-891.72" "-781.63"
## BABA OKTA PTTRX VINIX SEBLX EqPort
## "-883.11" "-999.48" "-114.77" "-284.04" "-195.04" "-5,574.70"
print(number( sum(var.p.pv[1:n]) , accuracy = 0.01, big.mark = ","))
## [1] "-8,322.37"
g <- list()
g[[1]] <- ggplot(data.frame(x = c(-4, 4)), aes(x = x)) +
stat_function(fun = dnorm, args = list(mean = ret.avg[1], sd = vol[1]),
color = "blue") +
geom_vline(xintercept = ret.avg[1] + var.p[1], color = "red") +
labs(title = paste(names(vol)[1],
"VaR =", percent(var.p[1], accuracy = 0.01))) +
scale_x_continuous(labels = scales::percent_format(accuracy = 0.01),
limits = c(-0.08, 0.08))
for (i in 2:ncol(ret)) {
g[[i]] <- ggplot(data.frame(x = c(-4, 4)), aes(x = x)) +
stat_function(fun = dnorm, args = list(mean = ret.avg[i], sd = vol[i]),
color = "blue") +
geom_vline(xintercept = ret.avg[i] + var.p[i], color = "red") +
labs(title = paste(names(vol)[i],
"VaR =", percent(var.p[i], accuracy = 0.01))) +
scale_x_continuous(labels = scales::percent_format(accuracy = 0.01),
limits = c(-0.08, 0.08))
}
do.call("grid.arrange", c(g, nrow = 3))
## Warning: Removed 1 row containing missing values or values outside the scale range
## (`geom_vline()`).
## Removed 1 row containing missing values or values outside the scale range
## (`geom_vline()`).
## Removed 1 row containing missing values or values outside the scale range
## (`geom_vline()`).
cvar.p <- ret.avg - dnorm(qnorm(alpha))*vol/alpha
print(percent( cvar.p , accuracy = 0.01))
## VV GLD CAT AMD JNJ MSFT AMZN INTC
## "-3.33%" "-2.38%" "-5.13%" "-9.11%" "-2.85%" "-5.11%" "-7.13%" "-6.44%"
## IBM ACWX TSLA META BABA OKTA PTTRX VINIX
## "-3.33%" "-3.05%" "-10.22%" "-8.96%" "-10.12%" "-11.44%" "-1.31%" "-3.26%"
## SEBLX EqPort
## "-2.23%" "-3.76%"
print(percent( cvar.p[1:n] %*% wts , accuracy = 0.01))
## [1] "-5.61%"
cvar.p.pv <- cvar.p*pv
print(number( cvar.p.pv , accuracy = 0.01, big.mark = ","))
## VV GLD CAT AMD JNJ MSFT
## "-333.19" "-238.47" "-513.31" "-910.93" "-285.00" "-510.93"
## AMZN INTC IBM ACWX TSLA META
## "-712.83" "-643.69" "-332.66" "-304.74" "-1,021.67" "-896.49"
## BABA OKTA PTTRX VINIX SEBLX EqPort
## "-1,011.55" "-1,143.79" "-131.24" "-325.62" "-223.47" "-6,391.66"
print(number( sum(cvar.p.pv[1:n]) , accuracy = 0.01, big.mark = ","))
## [1] "-9,539.56"
var <- data.frame(t(percent(var.p, accuracy = 0.01)))
rownames(var) <- "Parametric VaR (Normal)"
temp <- data.frame(t(percent(cvar.p, accuracy = 0.01)))
rownames(temp) <- "Parametric CVaR (Normal)"
var <- rbind(var, temp)
head(var)
## VV GLD CAT AMD JNJ MSFT AMZN
## Parametric VaR (Normal) -2.91% -2.08% -4.47% -7.94% -2.49% -4.45% -6.22%
## Parametric CVaR (Normal) -3.33% -2.38% -5.13% -9.11% -2.85% -5.11% -7.13%
## INTC IBM ACWX TSLA META BABA OKTA
## Parametric VaR (Normal) -5.61% -2.90% -2.66% -8.92% -7.82% -8.83% -9.99%
## Parametric CVaR (Normal) -6.44% -3.33% -3.05% -10.22% -8.96% -10.12% -11.44%
## PTTRX VINIX SEBLX EqPort
## Parametric VaR (Normal) -1.15% -2.84% -1.95% -3.28%
## Parametric CVaR (Normal) -1.31% -3.26% -2.23% -3.76%
var.pv <- data.frame(t(number(var.p.pv, accuracy = 0.01, big.mark = ",")))
rownames(var.pv) <- "Parametric VaR (Normal)"
temp <- data.frame(t(number(cvar.p.pv, accuracy = 0.01, big.mark = ",")))
rownames(temp) <- "Parametric CVaR (Normal)"
var.pv <- rbind(var.pv, temp)
head(var.pv)
## VV GLD CAT AMD JNJ MSFT
## Parametric VaR (Normal) -290.68 -207.81 -446.78 -794.30 -248.77 -445.40
## Parametric CVaR (Normal) -333.19 -238.47 -513.31 -910.93 -285.00 -510.93
## AMZN INTC IBM ACWX TSLA META
## Parametric VaR (Normal) -621.97 -561.38 -289.50 -265.99 -891.72 -781.63
## Parametric CVaR (Normal) -712.83 -643.69 -332.66 -304.74 -1,021.67 -896.49
## BABA OKTA PTTRX VINIX SEBLX EqPort
## Parametric VaR (Normal) -883.11 -999.48 -114.77 -284.04 -195.04 -5,574.70
## Parametric CVaR (Normal) -1,011.55 -1,143.79 -131.24 -325.62 -223.47 -6,391.66
#HISTORICAL SIMULATION
# Build P&L table
m <- nrow(ret)
pnl <- matrix(0:(m-1)/(m-1)*100, nrow = m, ncol = 1)
colnames(pnl) <- "percentile"
head(pnl, 10)
## percentile
## [1,] 0.0
## [2,] 0.2
## [3,] 0.4
## [4,] 0.6
## [5,] 0.8
## [6,] 1.0
## [7,] 1.2
## [8,] 1.4
## [9,] 1.6
## [10,] 1.8
for (i in 1:(n+1)) {
pnl <- cbind(pnl, sort(coredata(ret[, i]), decreasing = F))
}
colnames(pnl)[2:(n+2)] <- names(ret)
head(pnl, 10)
## percentile VV GLD CAT AMD JNJ
## [1,] 0.0 -0.04387067 -0.02971118 -0.06652628 -0.13868828 -0.03983262
## [2,] 0.2 -0.03995277 -0.02641229 -0.06549722 -0.10010334 -0.03703262
## [3,] 0.4 -0.03936203 -0.02495777 -0.05824697 -0.09418918 -0.02991904
## [4,] 0.6 -0.03700488 -0.02161343 -0.05789350 -0.09220332 -0.02979889
## [5,] 0.8 -0.03697844 -0.02120964 -0.05441747 -0.08991022 -0.02844281
## [6,] 1.0 -0.03405912 -0.02075194 -0.05403053 -0.08287204 -0.02812823
## [7,] 1.2 -0.03384158 -0.01887512 -0.05189235 -0.08257753 -0.02602019
## [8,] 1.4 -0.03373170 -0.01870545 -0.04925736 -0.08118701 -0.02590834
## [9,] 1.6 -0.03057285 -0.01867914 -0.04876772 -0.07710390 -0.02281880
## [10,] 1.8 -0.02985251 -0.01854049 -0.04370466 -0.07325445 -0.02244274
## MSFT AMZN INTC IBM ACWX TSLA
## [1,] -0.07715623 -0.14049438 -0.08562071 -0.05248662 -0.03459399 -0.12242249
## [2,] -0.05497851 -0.08431498 -0.07192641 -0.05004666 -0.03404070 -0.12184122
## [3,] -0.05085288 -0.07812763 -0.07041987 -0.04482821 -0.03271770 -0.11554176
## [4,] -0.04552955 -0.07561036 -0.06938506 -0.03949720 -0.03208988 -0.11408853
## [5,] -0.04456379 -0.07156197 -0.06414088 -0.03924261 -0.03042385 -0.09745828
## [6,] -0.04374325 -0.07057528 -0.05999982 -0.03292262 -0.02979028 -0.09737010
## [7,] -0.04355463 -0.06804250 -0.05613907 -0.03259012 -0.02698686 -0.09300310
## [8,] -0.04241282 -0.05950181 -0.05517248 -0.02791460 -0.02570332 -0.09219360
## [9,] -0.04232244 -0.05622045 -0.05371601 -0.02789837 -0.02542188 -0.09072949
## [10,] -0.04181200 -0.05596212 -0.05318478 -0.02686976 -0.02417121 -0.08882757
## META BABA OKTA PTTRX VINIX SEBLX
## [1,] -0.26390103 -0.12510395 -0.33698033 -0.018846902 -0.04320702 -0.03193440
## [2,] -0.24557080 -0.11118841 -0.17832782 -0.013937268 -0.04017636 -0.03072124
## [3,] -0.09369093 -0.10321745 -0.13294286 -0.012024024 -0.03879815 -0.02719942
## [4,] -0.07772305 -0.10305899 -0.11572665 -0.011441866 -0.03620837 -0.02500017
## [5,] -0.07618603 -0.09371382 -0.10743250 -0.010893058 -0.03554982 -0.02296823
## [6,] -0.07588588 -0.09142066 -0.10229314 -0.010845802 -0.03363550 -0.02273754
## [7,] -0.06787548 -0.08125736 -0.09956569 -0.010477667 -0.03237624 -0.02266170
## [8,] -0.06772301 -0.07936197 -0.09407745 -0.010266939 -0.03197399 -0.02236152
## [9,] -0.06441874 -0.06683174 -0.09387482 -0.010100838 -0.02949947 -0.02098832
## [10,] -0.06427995 -0.06675882 -0.08526095 -0.009345925 -0.02908676 -0.02065928
## EqPort
## [1,] -0.04673080
## [2,] -0.04668306
## [3,] -0.04171414
## [4,] -0.04140919
## [5,] -0.04107152
## [6,] -0.03880729
## [7,] -0.03647260
## [8,] -0.03474026
## [9,] -0.03326333
## [10,] -0.03143766
# Interpolate rows 8 & 9 since the 1% is between them
var.h.pnl <- pnl[8,-1]+(pnl[9,-1]-pnl[8,-1])*(alpha*100-pnl[8,1])/(pnl[9,1]-pnl[8,1])
print(percent( var.h.pnl , accuracy = 0.01))
## VV GLD CAT AMD JNJ MSFT AMZN INTC
## "-4.00%" "-1.88%" "-5.02%" "-8.94%" "-3.21%" "-4.26%" "-6.61%" "-5.81%"
## IBM ACWX TSLA META BABA OKTA PTTRX VINIX
## "-2.79%" "-2.63%" "-9.51%" "-7.43%" "-10.44%" "-9.45%" "-1.06%" "-3.69%"
## SEBLX EqPort
## "-2.51%" "-3.77%"
# EqPort's H VaR
print(percent( quantile(ret$EqPort, alpha) , accuracy = 0.01))
## 1%
## "-3.88%"
# Historical VaR
var.h <- apply(ret, 2, quantile, alpha, na.rm = T)
print(percent( var.h , accuracy = 0.01))
## VV GLD CAT AMD JNJ MSFT AMZN INTC
## "-3.41%" "-2.08%" "-5.40%" "-8.29%" "-2.81%" "-4.37%" "-7.06%" "-6.00%"
## IBM ACWX TSLA META BABA OKTA PTTRX VINIX
## "-3.29%" "-2.98%" "-9.74%" "-7.59%" "-9.14%" "-10.23%" "-1.08%" "-3.36%"
## SEBLX EqPort
## "-2.27%" "-3.88%"
print(percent( var.h[1:n] %*% wts , accuracy = 0.01))
## [1] "-5.24%"
var.h.pv <- var.h*pv
print(number( var.h.pv , accuracy = 0.01, big.mark = ","))
## VV GLD CAT AMD JNJ MSFT
## "-340.59" "-207.52" "-540.31" "-828.72" "-281.28" "-437.43"
## AMZN INTC IBM ACWX TSLA META
## "-705.75" "-600.00" "-329.23" "-297.90" "-973.70" "-758.86"
## BABA OKTA PTTRX VINIX SEBLX EqPort
## "-914.21" "-1,022.93" "-108.46" "-336.35" "-227.38" "-6,597.24"
print(number( sum(var.h.pv[1:n]) , accuracy = 0.01, big.mark = ","))
## [1] "-8,910.62"
# Find days of lowest returns,
lowestRets <- ret
for (i in 1:ncol(ret)) {
lowestRets[, i] <- ifelse(coredata(ret[, i]) <= var.h[i], ret[, i], NA)
}
# Lowest Return Scenarios: 8 / 752 in each case
print( apply(!is.na(lowestRets), 2, sum) )
## VV GLD CAT AMD JNJ MSFT AMZN INTC IBM ACWX TSLA
## 6 6 6 6 6 6 6 6 6 6 6
## META BABA OKTA PTTRX VINIX SEBLX EqPort
## 6 6 6 6 6 6 6
# Which lowest returns contribute to the EqPort lowest returns?
lowestRets[!is.na(lowestRets$EqPort) == T, ]
## VV GLD CAT AMD JNJ MSFT AMZN
## 2022-05-05 -0.03700488 NA NA NA NA NA -0.07561036
## 2022-05-09 NA NA NA -0.09418918 NA NA NA
## 2022-05-18 -0.03995277 NA NA NA NA -0.04552955 -0.07156197
## 2022-06-13 -0.03936203 -0.02641229 NA NA NA NA NA
## 2022-09-13 -0.04387067 NA NA -0.08991022 NA -0.05497851 -0.07057528
## 2022-10-07 NA NA NA -0.13868828 NA -0.05085288 NA
## INTC IBM ACWX TSLA META BABA
## 2022-05-05 NA NA -0.03271770 NA NA NA
## 2022-05-09 NA NA -0.03042385 NA NA NA
## 2022-05-18 NA -0.03924261 NA NA NA NA
## 2022-06-13 NA NA -0.03459399 NA NA -0.103059
## 2022-09-13 -0.07192641 NA -0.03404070 NA -0.09369093 NA
## 2022-10-07 NA NA NA NA NA NA
## OKTA PTTRX VINIX SEBLX EqPort
## 2022-05-05 NA NA -0.03554982 -0.02719942 -0.04171414
## 2022-05-09 -0.1329429 NA NA NA -0.04140919
## 2022-05-18 NA NA -0.04017636 -0.02296823 -0.04107152
## 2022-06-13 NA -0.0188469 -0.03879815 -0.03193440 -0.04673080
## 2022-09-13 NA NA -0.04320702 -0.03072124 -0.04668306
## 2022-10-07 NA NA NA NA -0.03880729
# since the lowestRets series has NA's by design,
# we ignore those warnings in the graphs
options(warn = -1)
# Historical VaR Graphs: Return Scenarios
g <- list()
g[[1]] <- ggplot(ret, aes_string(x = index(ret), y = names(ret)[1])) +
geom_col(position = "identity") +
geom_col(aes_string(y = lowestRets[, 1]), color = "red",
position = "identity") +
labs(title = paste(names(ret)[1], "Historical Returns"),
x = "Date / Scenarios", y = "Returns") +
ylim(c(-0.10,0.10))
for (i in 2:ncol(ret)) {
g[[i]] <- ggplot(ret, aes_string(x = index(ret),
y = names(ret)[i])) +
geom_col(position = "identity") +
geom_col(aes_string(y = lowestRets[, i]), color = "red",
position = "identity") +
labs(title = paste(names(ret)[i], "Historical Returns"),
x = "Date / Scenarios", y = "Returns") +
ylim(c(-0.10,0.10))
}
do.call("grid.arrange", c(g, nrow = 3))
options(warn = 0) # we restore the warnings parameter for other use cases
# we ignore warnings due to NA's in the graphs, since they are by design
options(warn = -1)
# Historical VaR Graphs: Histograms
g <- list()
g[[1]] <- ggplot(ret, aes_string(x = names(ret)[1])) +
geom_histogram(aes(y = ..density..), position = "identity", bins = 30,
fill = "cornflowerblue") +
stat_function(fun = dnorm, args = list(mean = ret.avg[1], sd = vol[1]),
color = "gray40") +
geom_vline(xintercept = var.h[1], color = "red") +
geom_vline(xintercept = ret.avg[1] + var.p[1], color = "gray40") +
labs(title = paste(names(ret)[1], "Returns Histogram: Historical vs Normal")) +
scale_x_continuous(labels = scales::percent_format(accuracy = 0.01),
limits = c(-0.08, 0.08))
for (i in 2:ncol(ret)) {
g[[i]] <- ggplot(ret, aes_string(x = names(ret)[i])) +
geom_histogram(aes(y = ..density..), position = "identity", bins = 30,
fill = "cornflowerblue") +
stat_function(fun = dnorm, args = list(mean = ret.avg[i], sd = vol[i]),
color = "gray40") +
geom_vline(xintercept = var.h[i], color = "red") +
geom_vline(xintercept = ret.avg[i] + var.p[i], color = "gray40") +
labs(title = paste(names(ret)[i], "Returns Histogram: Historical vs Normal")) +
scale_x_continuous(labels = scales::percent_format(accuracy = 0.01),
limits = c(-0.08, 0.08))
}
do.call("grid.arrange", c(g, nrow = 3))
options(warn = 0) # we restore the warnings parameter for other use cases
print(percent( apply(lowestRets, 2, mean, na.rm = T) , accuracy = 0.01))
## VV GLD CAT AMD JNJ MSFT AMZN INTC
## "-3.85%" "-2.41%" "-5.94%" "-9.97%" "-3.22%" "-5.28%" "-8.68%" "-7.02%"
## IBM ACWX TSLA META BABA OKTA PTTRX VINIX
## "-4.32%" "-3.23%" "-11.15%" "-13.88%" "-10.46%" "-16.23%" "-1.30%" "-3.79%"
## SEBLX EqPort
## "-2.68%" "-4.27%"
print(percent( apply(pnl[1:8, -1], 2, mean) , accuracy = 0.01 ))
## VV GLD CAT AMD JNJ MSFT AMZN INTC
## "-3.74%" "-2.28%" "-5.72%" "-9.52%" "-3.06%" "-5.03%" "-8.10%" "-6.66%"
## IBM ACWX TSLA META BABA OKTA PTTRX VINIX
## "-3.99%" "-3.08%" "-10.67%" "-12.11%" "-9.85%" "-14.59%" "-1.23%" "-3.65%"
## SEBLX EqPort
## "-2.57%" "-4.10%"
print( quantile(ret$EqPort, c(0.01, 0.02, 0.03, 0.04, 0.05)) )
## 1% 2% 3% 4% 5%
## -0.03880729 -0.03050645 -0.02615370 -0.02381926 -0.02186920
print( quantile(ret$EqPort, seq(from = 0, to = alpha, by = 1/(m-1))) )
## 0% 0.2% 0.4% 0.6% 0.8% 1%
## -0.04673080 -0.04668306 -0.04171414 -0.04140919 -0.04107152 -0.03880729
# Confirming EqPort's CVaR:
mean(quantile(ret$EqPort, seq(0, alpha, 1/(m-1))))
## [1] -0.042736
cvar.h <- colMeans(apply(ret, 2, quantile, probs = seq(0, alpha, 1/(m-1))))
print(percent( cvar.h , accuracy = 0.01))
## VV GLD CAT AMD JNJ MSFT AMZN INTC
## "-3.85%" "-2.41%" "-5.94%" "-9.97%" "-3.22%" "-5.28%" "-8.68%" "-7.02%"
## IBM ACWX TSLA META BABA OKTA PTTRX VINIX
## "-4.32%" "-3.23%" "-11.15%" "-13.88%" "-10.46%" "-16.23%" "-1.30%" "-3.79%"
## SEBLX EqPort
## "-2.68%" "-4.27%"
print(percent( cvar.h[1:n] %*% wts , accuracy = 0.01))
## [1] "-6.67%"
cvar.h.pv <- cvar.h * pv
print(number( cvar.h.pv , accuracy = 0.01, big.mark = ","))
## VV GLD CAT AMD JNJ MSFT
## "-385.38" "-241.09" "-594.35" "-996.61" "-321.92" "-528.04"
## AMZN INTC IBM ACWX TSLA META
## "-867.81" "-702.49" "-431.71" "-322.76" "-1,114.54" "-1,388.26"
## BABA OKTA PTTRX VINIX SEBLX EqPort
## "-1,046.17" "-1,622.84" "-129.98" "-379.29" "-267.60" "-7,265.12"
print(number( sum(cvar.h.pv[1:n]) , accuracy = 0.01, big.mark = ","))
## [1] "-11,340.85"
temp <- data.frame(t(percent(var.h, accuracy = 0.01)))
rownames(temp) <- "Historical VaR"
var <- rbind(var, temp)
temp <- data.frame(t(percent(cvar.h, accuracy = 0.01)))
rownames(temp) <- "Historical CVaR"
var <- rbind(var, temp)
var
## VV GLD CAT AMD JNJ MSFT AMZN
## Parametric VaR (Normal) -2.91% -2.08% -4.47% -7.94% -2.49% -4.45% -6.22%
## Parametric CVaR (Normal) -3.33% -2.38% -5.13% -9.11% -2.85% -5.11% -7.13%
## Historical VaR -3.41% -2.08% -5.40% -8.29% -2.81% -4.37% -7.06%
## Historical CVaR -3.85% -2.41% -5.94% -9.97% -3.22% -5.28% -8.68%
## INTC IBM ACWX TSLA META BABA OKTA
## Parametric VaR (Normal) -5.61% -2.90% -2.66% -8.92% -7.82% -8.83% -9.99%
## Parametric CVaR (Normal) -6.44% -3.33% -3.05% -10.22% -8.96% -10.12% -11.44%
## Historical VaR -6.00% -3.29% -2.98% -9.74% -7.59% -9.14% -10.23%
## Historical CVaR -7.02% -4.32% -3.23% -11.15% -13.88% -10.46% -16.23%
## PTTRX VINIX SEBLX EqPort
## Parametric VaR (Normal) -1.15% -2.84% -1.95% -3.28%
## Parametric CVaR (Normal) -1.31% -3.26% -2.23% -3.76%
## Historical VaR -1.08% -3.36% -2.27% -3.88%
## Historical CVaR -1.30% -3.79% -2.68% -4.27%