R Markdown

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

Including Plots

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%