# Load packages

# Core
library(tidyverse)
library(tidyquant)

Goal

Examine how each asset contributes to portfolio standard deviation. This is to ensure that our risk is not concentrated in any one asset.

1 Import stock prices

Choose your stocks from 2012-12-31 to present.

symbols <- c("IVV", "VOO", "VTSAX", "VSMPX", "FBGRX")

prices <- tq_get(x    = symbols,
                 get  = "stock.prices",    
                 from = "2015-05-29 ")

2 Convert prices to returns (monthly)

asset_returns_tbl <- prices %>%
    
    group_by(symbol) %>%
    
    tq_transmute(select     = adjusted, 
                 mutate_fun = periodReturn, 
                 period     = "monthly",
                 type       = "log") %>%
    
    slice(-1) %>%
    
    ungroup() %>%
    
    set_names(c("asset", "date", "returns"))

3 Calculate Component Contribution to Portfolio Volatility

# Transform data into wide form
asset_returns_wide_tbl <- asset_returns_tbl %>%

    pivot_wider(names_from = asset, values_from = returns) %>%

    column_to_rownames(var = "date")

asset_returns_wide_tbl
##                    FBGRX           IVV           VOO         VSMPX
## 2015-06-30 -0.0105734935 -2.001552e-02 -0.0196614817 -0.0171327818
## 2015-07-31  0.0367274588  2.167232e-02  0.0215312994  0.0162392010
## 2015-08-31 -0.0652927583 -6.340582e-02 -0.0633270278 -0.0618775355
## 2015-09-30 -0.0383785089 -2.529855e-02 -0.0249645272 -0.0297352557
## 2015-10-30  0.0681127705  8.138666e-02  0.0811321069  0.0755882326
## 2015-11-30  0.0098138681  3.914663e-03  0.0042413140  0.0056396831
## 2015-12-31 -0.0068256369 -1.748023e-02 -0.0175347842 -0.0206493054
## 2016-01-29 -0.0865764952 -5.132652e-02 -0.0503562709 -0.0582460651
## 2016-02-29 -0.0214135189 -5.656183e-04 -0.0020840256 -0.0002224765
## 2016-03-31  0.0606340034  6.054287e-02  0.0664749255  0.0679138556
## 2016-04-29 -0.0033499203  3.912198e-03  0.0034939794  0.0064571187
## 2016-05-31  0.0254512263  1.677724e-02  0.0173937481  0.0176980254
## 2016-06-30 -0.0312641277  2.532337e-03  0.0032173943  0.0022976872
## 2016-07-29  0.0635983742  3.670554e-02  0.0361745950  0.0388907457
## 2016-08-31  0.0077442606  1.281422e-03  0.0012034880  0.0026507917
## 2016-09-30  0.0169547641  6.676048e-05  0.0002899423  0.0017575980
## 2016-10-31 -0.0283092941 -1.794824e-02 -0.0180796911 -0.0222809012
## 2016-11-30  0.0059884279  3.603151e-02  0.0365798548  0.0434019624
## 2016-12-30  0.0063920341  2.120727e-02  0.0205084696  0.0191930964
## 2017-01-31  0.0472619716  1.736031e-02  0.0176696221  0.0190230476
## 2017-02-28  0.0380654111  3.898047e-02  0.0380288777  0.0365443651
## 2017-03-31  0.0263669871  1.174852e-03  0.0013179759  0.0007794482
## 2017-04-28  0.0323957438  9.605094e-03  0.0103460247  0.0105963120
## 2017-05-31  0.0393196789  1.384582e-02  0.0139461104  0.0101316595
## 2017-06-30 -0.0059497134  6.648595e-03  0.0062768818  0.0091933381
## 2017-07-31  0.0337357891  2.053444e-02  0.0204154185  0.0184883945
## 2017-08-31  0.0183404526  2.733030e-03  0.0029076732  0.0017266103
## 2017-09-29  0.0096237346  2.020828e-02  0.0202166599  0.0242334655
## 2017-10-31  0.0420522191  2.298155e-02  0.0230043199  0.0214987447
## 2017-11-30  0.0184740297  3.074250e-02  0.0301182711  0.0299213331
## 2017-12-29  0.0084808808  1.201715e-02  0.0127451977  0.0100463688
## 2018-01-31  0.0822140705  5.534857e-02  0.0543484026  0.0519284286
## 2018-02-28 -0.0228236512 -3.878544e-02 -0.0379720908 -0.0378832692
## 2018-03-29 -0.0296412690 -2.508868e-02 -0.0249858495 -0.0199853088
## 2018-04-30  0.0146034155  3.535704e-03  0.0034638856  0.0037863970
## 2018-05-31  0.0489251045  2.382141e-02  0.0238769896  0.0277555399
## 2018-06-29  0.0246065372  5.857019e-03  0.0075563180  0.0067416249
## 2018-07-31  0.0101770558  3.678071e-02  0.0350093606  0.0329207826
## 2018-08-31  0.0568017159  3.182403e-02  0.0316906187  0.0339898610
## 2018-09-28  0.0001993242  5.341772e-03  0.0057450385  0.0016616341
## 2018-10-31 -0.1092558132 -7.065857e-02 -0.0708268065 -0.0768027855
## 2018-11-30 -0.0043953265  1.902890e-02  0.0186757277  0.0204965906
## 2018-12-31 -0.0612858324 -9.294150e-02 -0.0926328398 -0.0975429244
## 2019-01-31  0.0927095447  7.626572e-02  0.0762163101  0.0824505041
## 2019-02-28  0.0336085638  3.178554e-02  0.0319819509  0.0345023033
## 2019-03-29  0.0257897001  1.897735e-02  0.0190732337  0.0142698601
## 2019-04-30  0.0481083610  3.921248e-02  0.0395482566  0.0390463426
## 2019-05-31 -0.0849759194 -6.505640e-02 -0.0655835102 -0.0665208169
## 2019-06-28  0.0691626779  6.715088e-02  0.0675759700  0.0675535894
## 2019-07-31  0.0199946214  1.508511e-02  0.0144958953  0.0143501910
## 2019-08-30 -0.0224727529 -1.671499e-02 -0.0165414940 -0.0203537604
## 2019-09-30 -0.0228673211  1.927215e-02  0.0195306687  0.0169240409
## 2019-10-31  0.0397225122  2.137649e-02  0.0215920298  0.0208888106
## 2019-11-29  0.0549080433  3.571878e-02  0.0356176603  0.0370953499
## 2019-12-31  0.0347017494  2.887363e-02  0.0293029492  0.0282387648
## 2020-01-31  0.0311624221  0.000000e+00 -0.0003717477 -0.0006690068
## 2020-02-28 -0.0596914943 -8.833951e-02 -0.0844660306 -0.0852119783
## 2020-03-31 -0.1189298200 -1.293007e-01 -0.1328617009 -0.1480393647
## 2020-04-30  0.1573420475  1.193644e-01  0.1203228213  0.1245481536
## 2020-05-29  0.0875934069  4.702860e-02  0.0462730048  0.0523919020
## 2020-06-30  0.0758626607  1.880796e-02  0.0182535863  0.0225688061
## 2020-07-31  0.0750107332  5.689306e-02  0.0571505459  0.0549499561
## 2020-08-31  0.1227750897  6.766623e-02  0.0673875985  0.0693986324
## 2020-09-30 -0.0414414297 -3.830787e-02 -0.0382867194 -0.0362493731
## 2020-10-30 -0.0308087710 -2.543547e-02 -0.0257805244 -0.0217030848
## 2020-11-30  0.1278189773  1.034297e-01  0.1038789219  0.1151007008
## 2020-12-31  0.0569552557  3.707060e-02  0.0367600524  0.0436240166
## 2021-01-29  0.0116439979 -1.036304e-02 -0.0102654879 -0.0032694145
## 2021-02-26  0.0235403450  2.721583e-02  0.0272863166  0.0314577933
## 2021-03-31 -0.0046284266  4.454671e-02  0.0447366967  0.0341376812
## 2021-04-30  0.0551873634  5.158485e-02  0.0515444452  0.0501811481
## 2021-05-28 -0.0146840565  6.591234e-03  0.0066519118  0.0042797497
## 2021-06-30  0.0644172114  2.232200e-02  0.0223441345  0.0251950273
## 2021-07-30  0.0055536984  2.408428e-02  0.0241767408  0.0169568987
## 2021-08-31  0.0422822232  2.977492e-02  0.0290901768  0.0282957525
## 2021-09-30 -0.0465437771 -4.796938e-02 -0.0477590440 -0.0458291763
## 2021-10-29  0.0743088849  6.768581e-02  0.0680187581  0.0650718184
## 2021-11-30  0.0040977539 -7.315445e-03 -0.0073704430 -0.0149013505
## 2021-12-31 -0.0111007443  4.460833e-02  0.0445932280  0.0374823512
## 2022-01-31 -0.1210833980 -5.432226e-02 -0.0538319599 -0.0621678850
## 2022-02-28 -0.0388567060 -2.931186e-02 -0.0302582665 -0.0257635494
## 2022-03-31  0.0244307904  3.686862e-02  0.0371919036  0.0318833004
## 2022-04-29 -0.1526449345 -9.261162e-02 -0.0919438203 -0.0944538726
## 2022-05-31 -0.0492878302  3.162537e-03  0.0025843913 -0.0025949125
## 2022-06-30 -0.1168484714 -8.692146e-02 -0.0862606410 -0.0873814358
## 2022-07-29  0.1313953244  8.861023e-02  0.0880031996  0.0898443753
## 2022-08-31 -0.0410727011 -4.215241e-02 -0.0421660956 -0.0380486015
## 2022-09-30 -0.1066063359 -9.689782e-02 -0.0964984592 -0.0974010181
## 2022-10-31  0.0356320026  7.811711e-02  0.0780491473  0.0785949281
## 2022-11-30  0.0500496721  5.403323e-02  0.0535880611  0.0510053391
## 2022-12-30 -0.1004222063 -5.899454e-02 -0.0590331438 -0.0604501207
## 2023-01-31  0.1202500780  6.083734e-02  0.0610029829  0.0667265392
## 2023-02-28 -0.0092677172 -2.565010e-02 -0.0253013526 -0.0235776566
## 2023-03-31  0.0676124412  3.658690e-02  0.0364282496  0.0259682381
## 2023-04-28  0.0007435966  1.587992e-02  0.0157762004  0.0104075391
## 2023-05-31  0.0763827315  4.228937e-03  0.0048045776  0.0041858134
## 2023-06-30  0.0742260576  6.389096e-02  0.0630675522  0.0662287628
## 2023-07-31  0.0511558484  3.194919e-02  0.0323715561  0.0350930761
## 2023-08-31 -0.0174014896 -1.641015e-02 -0.0164171954 -0.0194687268
## 2023-09-29 -0.0620498140 -4.818211e-02 -0.0486016068 -0.0490877180
## 2023-10-31 -0.0241913501 -2.234692e-02 -0.0219608216 -0.0265901449
## 2023-11-30  0.1096179166  8.767396e-02  0.0877399474  0.0895712234
## 2023-12-29  0.0550941489  4.507831e-02  0.0447688607  0.0517651324
## 2024-01-31  0.0288969081  1.572484e-02  0.0159436886  0.0111081637
## 2024-02-29  0.0880200559  5.073146e-02  0.0507602704  0.0526367478
## 2024-03-28  0.0333759719  3.267347e-02  0.0322747936  0.0316487338
## 2024-04-30 -0.0401249339 -4.133879e-02 -0.0409131207 -0.0451294599
## 2024-05-31  0.0728074065  4.935268e-02  0.0490347478  0.0461815428
## 2024-06-28  0.0558010650  3.506465e-02  0.0350500371  0.0308802812
## 2024-07-31 -0.0318659271  1.106735e-02  0.0115302489  0.0182092969
## 2024-08-30  0.0156441727  2.398172e-02  0.0236540817  0.0214300972
## 2024-09-30  0.0248518568  2.149810e-02  0.0215294273  0.0202775106
## 2024-10-31  0.0058406632 -9.720853e-03 -0.0095207988 -0.0075293471
## 2024-11-29  0.0683897986  5.753475e-02  0.0572211788  0.0642365499
## 2024-12-03  0.0195285836  3.118761e-03  0.0030489247  0.0022989952
##                    VTSAX
## 2015-06-30 -0.0171830202
## 2015-07-31  0.0163718759
## 2015-08-31 -0.0619236980
## 2015-09-30 -0.0299004519
## 2015-10-30  0.0756967608
## 2015-11-30  0.0055772368
## 2015-12-31 -0.0206641188
## 2016-01-29 -0.0581663550
## 2016-02-29 -0.0004174922
## 2016-03-31  0.0679657388
## 2016-04-29  0.0064460660
## 2016-05-31  0.0175628727
## 2016-06-30  0.0024521508
## 2016-07-29  0.0387266418
## 2016-08-31  0.0027622005
## 2016-09-30  0.0016070427
## 2016-10-31 -0.0223892084
## 2016-11-30  0.0435654333
## 2016-12-30  0.0191683703
## 2017-01-31  0.0190750342
## 2017-02-28  0.0364176003
## 2017-03-31  0.0007840506
## 2017-04-28  0.0104431579
## 2017-05-31  0.0101692878
## 2017-06-30  0.0091973953
## 2017-07-31  0.0184841710
## 2017-08-31  0.0016194314
## 2017-09-29  0.0243125770
## 2017-10-31  0.0214959244
## 2017-11-30  0.0299718470
## 2017-12-29  0.0100059172
## 2018-01-31  0.0518402769
## 2018-02-28 -0.0378494043
## 2018-03-29 -0.0200262581
## 2018-04-30  0.0037777575
## 2018-05-31  0.0278145022
## 2018-06-29  0.0066986261
## 2018-07-31  0.0329594809
## 2018-08-31  0.0339629764
## 2018-09-28  0.0016275030
## 2018-10-31 -0.0768784733
## 2018-11-30  0.0205438320
## 2018-12-31 -0.0976951746
## 2019-01-31  0.0825051767
## 2019-02-28  0.0345440104
## 2019-03-29  0.0142416035
## 2019-04-30  0.0389858102
## 2019-05-31 -0.0664794953
## 2019-06-28  0.0675679149
## 2019-07-31  0.0142731231
## 2019-08-30 -0.0203154994
## 2019-09-30  0.0168666196
## 2019-10-31  0.0208690266
## 2019-11-29  0.0371430093
## 2019-12-31  0.0282302950
## 2020-01-31 -0.0007533661
## 2020-02-28 -0.0851519290
## 2020-03-31 -0.1480879616
## 2020-04-30  0.1245064929
## 2020-05-29  0.0523551906
## 2020-06-30  0.0225247310
## 2020-07-31  0.0549776320
## 2020-08-31  0.0692824962
## 2020-09-30 -0.0362138501
## 2020-10-30 -0.0216946640
## 2020-11-30  0.1150959105
## 2020-12-31  0.0436494466
## 2021-01-29 -0.0032775928
## 2021-02-26  0.0313778847
## 2021-03-31  0.0341868752
## 2021-04-30  0.0500687761
## 2021-05-28  0.0043440428
## 2021-06-30  0.0251244219
## 2021-07-30  0.0169991824
## 2021-08-31  0.0282337753
## 2021-09-30 -0.0458505869
## 2021-10-29  0.0650992718
## 2021-11-30 -0.0149354677
## 2021-12-31  0.0374862383
## 2022-01-31 -0.0622048398
## 2022-02-28 -0.0258587437
## 2022-03-31  0.0319703617
## 2022-04-29 -0.0944894483
## 2022-05-31 -0.0026818012
## 2022-06-30 -0.0873091563
## 2022-07-29  0.0897771499
## 2022-08-31 -0.0380697909
## 2022-09-30 -0.0973649700
## 2022-10-31  0.0784996442
## 2022-11-30  0.0509863771
## 2022-12-30 -0.0604171594
## 2023-01-31  0.0666844699
## 2023-02-28 -0.0235879132
## 2023-03-31  0.0259962470
## 2023-04-28  0.0104114830
## 2023-05-31  0.0041741741
## 2023-06-30  0.0661729928
## 2023-07-31  0.0350656803
## 2023-08-31 -0.0195327263
## 2023-09-29 -0.0490429920
## 2023-10-31 -0.0266552033
## 2023-11-30  0.0896149629
## 2023-12-29  0.0517166055
## 2024-01-31  0.0111079295
## 2024-02-29  0.0526239375
## 2024-03-28  0.0315980643
## 2024-04-30 -0.0451592900
## 2024-05-31  0.0461855764
## 2024-06-28  0.0309118126
## 2024-07-31  0.0181075859
## 2024-08-30  0.0214821231
## 2024-09-30  0.0202524189
## 2024-10-31 -0.0075724350
## 2024-11-29  0.0641866620
## 2024-12-03  0.0023277865
# Covariance of asset returns
covariance_matrix <- cov(asset_returns_wide_tbl)

covariance_matrix
##             FBGRX         IVV         VOO       VSMPX       VTSAX
## FBGRX 0.003322584 0.002334819 0.002335018 0.002426448 0.002426295
## IVV   0.002334819 0.001996853 0.001996611 0.002053635 0.002053746
## VOO   0.002335018 0.001996611 0.001997154 0.002054538 0.002054661
## VSMPX 0.002426448 0.002053635 0.002054538 0.002129750 0.002129855
## VTSAX 0.002426295 0.002053746 0.002054661 0.002129855 0.002129964
# Standard deviation of portfolio
# Summarizes how much each asset's returns vary with those of other assets within the portfolio into a single number
w <- c(0.25, 0.25, 0.2, 0.2, 0.1)

sd_portfolio <- sqrt(t(w) %*% covariance_matrix %*% w)
sd_portfolio
##            [,1]
## [1,] 0.04740897
# Component contribution
# Similar to the formula for sd_portfolio
# Mathematical trick to summarize the same, sd_portfolio, by asset instead of a single number
component_contribution <- (t(w) %*% covariance_matrix * w) / sd_portfolio[1,1]
component_contribution
##           FBGRX        IVV         VOO       VSMPX       VTSAX
## [1,] 0.01375939 0.01106511 0.008853649 0.009153813 0.004577003
rowSums(component_contribution)
## [1] 0.04740897
# Component contribution in percentage
component_percentages <- (component_contribution / sd_portfolio[1,1]) %>%
    round(3) %>%
    as_tibble()

component_percentages
## # A tibble: 1 × 5
##   FBGRX   IVV   VOO VSMPX VTSAX
##   <dbl> <dbl> <dbl> <dbl> <dbl>
## 1  0.29 0.233 0.187 0.193 0.097
component_percentages %>%

    as_tibble() %>%
    gather(key = "asset", value = "contribution")
## # A tibble: 5 × 2
##   asset contribution
##   <chr>        <dbl>
## 1 FBGRX        0.29 
## 2 IVV          0.233
## 3 VOO          0.187
## 4 VSMPX        0.193
## 5 VTSAX        0.097
asset_returns_wide_tbl <- asset_returns_tbl %>%
    
    pivot_wider(names_from = asset, values_from = returns) %>%
    
    column_to_rownames(var = "date")

asset_returns_wide_tbl
##                    FBGRX           IVV           VOO         VSMPX
## 2015-06-30 -0.0105734935 -2.001552e-02 -0.0196614817 -0.0171327818
## 2015-07-31  0.0367274588  2.167232e-02  0.0215312994  0.0162392010
## 2015-08-31 -0.0652927583 -6.340582e-02 -0.0633270278 -0.0618775355
## 2015-09-30 -0.0383785089 -2.529855e-02 -0.0249645272 -0.0297352557
## 2015-10-30  0.0681127705  8.138666e-02  0.0811321069  0.0755882326
## 2015-11-30  0.0098138681  3.914663e-03  0.0042413140  0.0056396831
## 2015-12-31 -0.0068256369 -1.748023e-02 -0.0175347842 -0.0206493054
## 2016-01-29 -0.0865764952 -5.132652e-02 -0.0503562709 -0.0582460651
## 2016-02-29 -0.0214135189 -5.656183e-04 -0.0020840256 -0.0002224765
## 2016-03-31  0.0606340034  6.054287e-02  0.0664749255  0.0679138556
## 2016-04-29 -0.0033499203  3.912198e-03  0.0034939794  0.0064571187
## 2016-05-31  0.0254512263  1.677724e-02  0.0173937481  0.0176980254
## 2016-06-30 -0.0312641277  2.532337e-03  0.0032173943  0.0022976872
## 2016-07-29  0.0635983742  3.670554e-02  0.0361745950  0.0388907457
## 2016-08-31  0.0077442606  1.281422e-03  0.0012034880  0.0026507917
## 2016-09-30  0.0169547641  6.676048e-05  0.0002899423  0.0017575980
## 2016-10-31 -0.0283092941 -1.794824e-02 -0.0180796911 -0.0222809012
## 2016-11-30  0.0059884279  3.603151e-02  0.0365798548  0.0434019624
## 2016-12-30  0.0063920341  2.120727e-02  0.0205084696  0.0191930964
## 2017-01-31  0.0472619716  1.736031e-02  0.0176696221  0.0190230476
## 2017-02-28  0.0380654111  3.898047e-02  0.0380288777  0.0365443651
## 2017-03-31  0.0263669871  1.174852e-03  0.0013179759  0.0007794482
## 2017-04-28  0.0323957438  9.605094e-03  0.0103460247  0.0105963120
## 2017-05-31  0.0393196789  1.384582e-02  0.0139461104  0.0101316595
## 2017-06-30 -0.0059497134  6.648595e-03  0.0062768818  0.0091933381
## 2017-07-31  0.0337357891  2.053444e-02  0.0204154185  0.0184883945
## 2017-08-31  0.0183404526  2.733030e-03  0.0029076732  0.0017266103
## 2017-09-29  0.0096237346  2.020828e-02  0.0202166599  0.0242334655
## 2017-10-31  0.0420522191  2.298155e-02  0.0230043199  0.0214987447
## 2017-11-30  0.0184740297  3.074250e-02  0.0301182711  0.0299213331
## 2017-12-29  0.0084808808  1.201715e-02  0.0127451977  0.0100463688
## 2018-01-31  0.0822140705  5.534857e-02  0.0543484026  0.0519284286
## 2018-02-28 -0.0228236512 -3.878544e-02 -0.0379720908 -0.0378832692
## 2018-03-29 -0.0296412690 -2.508868e-02 -0.0249858495 -0.0199853088
## 2018-04-30  0.0146034155  3.535704e-03  0.0034638856  0.0037863970
## 2018-05-31  0.0489251045  2.382141e-02  0.0238769896  0.0277555399
## 2018-06-29  0.0246065372  5.857019e-03  0.0075563180  0.0067416249
## 2018-07-31  0.0101770558  3.678071e-02  0.0350093606  0.0329207826
## 2018-08-31  0.0568017159  3.182403e-02  0.0316906187  0.0339898610
## 2018-09-28  0.0001993242  5.341772e-03  0.0057450385  0.0016616341
## 2018-10-31 -0.1092558132 -7.065857e-02 -0.0708268065 -0.0768027855
## 2018-11-30 -0.0043953265  1.902890e-02  0.0186757277  0.0204965906
## 2018-12-31 -0.0612858324 -9.294150e-02 -0.0926328398 -0.0975429244
## 2019-01-31  0.0927095447  7.626572e-02  0.0762163101  0.0824505041
## 2019-02-28  0.0336085638  3.178554e-02  0.0319819509  0.0345023033
## 2019-03-29  0.0257897001  1.897735e-02  0.0190732337  0.0142698601
## 2019-04-30  0.0481083610  3.921248e-02  0.0395482566  0.0390463426
## 2019-05-31 -0.0849759194 -6.505640e-02 -0.0655835102 -0.0665208169
## 2019-06-28  0.0691626779  6.715088e-02  0.0675759700  0.0675535894
## 2019-07-31  0.0199946214  1.508511e-02  0.0144958953  0.0143501910
## 2019-08-30 -0.0224727529 -1.671499e-02 -0.0165414940 -0.0203537604
## 2019-09-30 -0.0228673211  1.927215e-02  0.0195306687  0.0169240409
## 2019-10-31  0.0397225122  2.137649e-02  0.0215920298  0.0208888106
## 2019-11-29  0.0549080433  3.571878e-02  0.0356176603  0.0370953499
## 2019-12-31  0.0347017494  2.887363e-02  0.0293029492  0.0282387648
## 2020-01-31  0.0311624221  0.000000e+00 -0.0003717477 -0.0006690068
## 2020-02-28 -0.0596914943 -8.833951e-02 -0.0844660306 -0.0852119783
## 2020-03-31 -0.1189298200 -1.293007e-01 -0.1328617009 -0.1480393647
## 2020-04-30  0.1573420475  1.193644e-01  0.1203228213  0.1245481536
## 2020-05-29  0.0875934069  4.702860e-02  0.0462730048  0.0523919020
## 2020-06-30  0.0758626607  1.880796e-02  0.0182535863  0.0225688061
## 2020-07-31  0.0750107332  5.689306e-02  0.0571505459  0.0549499561
## 2020-08-31  0.1227750897  6.766623e-02  0.0673875985  0.0693986324
## 2020-09-30 -0.0414414297 -3.830787e-02 -0.0382867194 -0.0362493731
## 2020-10-30 -0.0308087710 -2.543547e-02 -0.0257805244 -0.0217030848
## 2020-11-30  0.1278189773  1.034297e-01  0.1038789219  0.1151007008
## 2020-12-31  0.0569552557  3.707060e-02  0.0367600524  0.0436240166
## 2021-01-29  0.0116439979 -1.036304e-02 -0.0102654879 -0.0032694145
## 2021-02-26  0.0235403450  2.721583e-02  0.0272863166  0.0314577933
## 2021-03-31 -0.0046284266  4.454671e-02  0.0447366967  0.0341376812
## 2021-04-30  0.0551873634  5.158485e-02  0.0515444452  0.0501811481
## 2021-05-28 -0.0146840565  6.591234e-03  0.0066519118  0.0042797497
## 2021-06-30  0.0644172114  2.232200e-02  0.0223441345  0.0251950273
## 2021-07-30  0.0055536984  2.408428e-02  0.0241767408  0.0169568987
## 2021-08-31  0.0422822232  2.977492e-02  0.0290901768  0.0282957525
## 2021-09-30 -0.0465437771 -4.796938e-02 -0.0477590440 -0.0458291763
## 2021-10-29  0.0743088849  6.768581e-02  0.0680187581  0.0650718184
## 2021-11-30  0.0040977539 -7.315445e-03 -0.0073704430 -0.0149013505
## 2021-12-31 -0.0111007443  4.460833e-02  0.0445932280  0.0374823512
## 2022-01-31 -0.1210833980 -5.432226e-02 -0.0538319599 -0.0621678850
## 2022-02-28 -0.0388567060 -2.931186e-02 -0.0302582665 -0.0257635494
## 2022-03-31  0.0244307904  3.686862e-02  0.0371919036  0.0318833004
## 2022-04-29 -0.1526449345 -9.261162e-02 -0.0919438203 -0.0944538726
## 2022-05-31 -0.0492878302  3.162537e-03  0.0025843913 -0.0025949125
## 2022-06-30 -0.1168484714 -8.692146e-02 -0.0862606410 -0.0873814358
## 2022-07-29  0.1313953244  8.861023e-02  0.0880031996  0.0898443753
## 2022-08-31 -0.0410727011 -4.215241e-02 -0.0421660956 -0.0380486015
## 2022-09-30 -0.1066063359 -9.689782e-02 -0.0964984592 -0.0974010181
## 2022-10-31  0.0356320026  7.811711e-02  0.0780491473  0.0785949281
## 2022-11-30  0.0500496721  5.403323e-02  0.0535880611  0.0510053391
## 2022-12-30 -0.1004222063 -5.899454e-02 -0.0590331438 -0.0604501207
## 2023-01-31  0.1202500780  6.083734e-02  0.0610029829  0.0667265392
## 2023-02-28 -0.0092677172 -2.565010e-02 -0.0253013526 -0.0235776566
## 2023-03-31  0.0676124412  3.658690e-02  0.0364282496  0.0259682381
## 2023-04-28  0.0007435966  1.587992e-02  0.0157762004  0.0104075391
## 2023-05-31  0.0763827315  4.228937e-03  0.0048045776  0.0041858134
## 2023-06-30  0.0742260576  6.389096e-02  0.0630675522  0.0662287628
## 2023-07-31  0.0511558484  3.194919e-02  0.0323715561  0.0350930761
## 2023-08-31 -0.0174014896 -1.641015e-02 -0.0164171954 -0.0194687268
## 2023-09-29 -0.0620498140 -4.818211e-02 -0.0486016068 -0.0490877180
## 2023-10-31 -0.0241913501 -2.234692e-02 -0.0219608216 -0.0265901449
## 2023-11-30  0.1096179166  8.767396e-02  0.0877399474  0.0895712234
## 2023-12-29  0.0550941489  4.507831e-02  0.0447688607  0.0517651324
## 2024-01-31  0.0288969081  1.572484e-02  0.0159436886  0.0111081637
## 2024-02-29  0.0880200559  5.073146e-02  0.0507602704  0.0526367478
## 2024-03-28  0.0333759719  3.267347e-02  0.0322747936  0.0316487338
## 2024-04-30 -0.0401249339 -4.133879e-02 -0.0409131207 -0.0451294599
## 2024-05-31  0.0728074065  4.935268e-02  0.0490347478  0.0461815428
## 2024-06-28  0.0558010650  3.506465e-02  0.0350500371  0.0308802812
## 2024-07-31 -0.0318659271  1.106735e-02  0.0115302489  0.0182092969
## 2024-08-30  0.0156441727  2.398172e-02  0.0236540817  0.0214300972
## 2024-09-30  0.0248518568  2.149810e-02  0.0215294273  0.0202775106
## 2024-10-31  0.0058406632 -9.720853e-03 -0.0095207988 -0.0075293471
## 2024-11-29  0.0683897986  5.753475e-02  0.0572211788  0.0642365499
## 2024-12-03  0.0195285836  3.118761e-03  0.0030489247  0.0022989952
##                    VTSAX
## 2015-06-30 -0.0171830202
## 2015-07-31  0.0163718759
## 2015-08-31 -0.0619236980
## 2015-09-30 -0.0299004519
## 2015-10-30  0.0756967608
## 2015-11-30  0.0055772368
## 2015-12-31 -0.0206641188
## 2016-01-29 -0.0581663550
## 2016-02-29 -0.0004174922
## 2016-03-31  0.0679657388
## 2016-04-29  0.0064460660
## 2016-05-31  0.0175628727
## 2016-06-30  0.0024521508
## 2016-07-29  0.0387266418
## 2016-08-31  0.0027622005
## 2016-09-30  0.0016070427
## 2016-10-31 -0.0223892084
## 2016-11-30  0.0435654333
## 2016-12-30  0.0191683703
## 2017-01-31  0.0190750342
## 2017-02-28  0.0364176003
## 2017-03-31  0.0007840506
## 2017-04-28  0.0104431579
## 2017-05-31  0.0101692878
## 2017-06-30  0.0091973953
## 2017-07-31  0.0184841710
## 2017-08-31  0.0016194314
## 2017-09-29  0.0243125770
## 2017-10-31  0.0214959244
## 2017-11-30  0.0299718470
## 2017-12-29  0.0100059172
## 2018-01-31  0.0518402769
## 2018-02-28 -0.0378494043
## 2018-03-29 -0.0200262581
## 2018-04-30  0.0037777575
## 2018-05-31  0.0278145022
## 2018-06-29  0.0066986261
## 2018-07-31  0.0329594809
## 2018-08-31  0.0339629764
## 2018-09-28  0.0016275030
## 2018-10-31 -0.0768784733
## 2018-11-30  0.0205438320
## 2018-12-31 -0.0976951746
## 2019-01-31  0.0825051767
## 2019-02-28  0.0345440104
## 2019-03-29  0.0142416035
## 2019-04-30  0.0389858102
## 2019-05-31 -0.0664794953
## 2019-06-28  0.0675679149
## 2019-07-31  0.0142731231
## 2019-08-30 -0.0203154994
## 2019-09-30  0.0168666196
## 2019-10-31  0.0208690266
## 2019-11-29  0.0371430093
## 2019-12-31  0.0282302950
## 2020-01-31 -0.0007533661
## 2020-02-28 -0.0851519290
## 2020-03-31 -0.1480879616
## 2020-04-30  0.1245064929
## 2020-05-29  0.0523551906
## 2020-06-30  0.0225247310
## 2020-07-31  0.0549776320
## 2020-08-31  0.0692824962
## 2020-09-30 -0.0362138501
## 2020-10-30 -0.0216946640
## 2020-11-30  0.1150959105
## 2020-12-31  0.0436494466
## 2021-01-29 -0.0032775928
## 2021-02-26  0.0313778847
## 2021-03-31  0.0341868752
## 2021-04-30  0.0500687761
## 2021-05-28  0.0043440428
## 2021-06-30  0.0251244219
## 2021-07-30  0.0169991824
## 2021-08-31  0.0282337753
## 2021-09-30 -0.0458505869
## 2021-10-29  0.0650992718
## 2021-11-30 -0.0149354677
## 2021-12-31  0.0374862383
## 2022-01-31 -0.0622048398
## 2022-02-28 -0.0258587437
## 2022-03-31  0.0319703617
## 2022-04-29 -0.0944894483
## 2022-05-31 -0.0026818012
## 2022-06-30 -0.0873091563
## 2022-07-29  0.0897771499
## 2022-08-31 -0.0380697909
## 2022-09-30 -0.0973649700
## 2022-10-31  0.0784996442
## 2022-11-30  0.0509863771
## 2022-12-30 -0.0604171594
## 2023-01-31  0.0666844699
## 2023-02-28 -0.0235879132
## 2023-03-31  0.0259962470
## 2023-04-28  0.0104114830
## 2023-05-31  0.0041741741
## 2023-06-30  0.0661729928
## 2023-07-31  0.0350656803
## 2023-08-31 -0.0195327263
## 2023-09-29 -0.0490429920
## 2023-10-31 -0.0266552033
## 2023-11-30  0.0896149629
## 2023-12-29  0.0517166055
## 2024-01-31  0.0111079295
## 2024-02-29  0.0526239375
## 2024-03-28  0.0315980643
## 2024-04-30 -0.0451592900
## 2024-05-31  0.0461855764
## 2024-06-28  0.0309118126
## 2024-07-31  0.0181075859
## 2024-08-30  0.0214821231
## 2024-09-30  0.0202524189
## 2024-10-31 -0.0075724350
## 2024-11-29  0.0641866620
## 2024-12-03  0.0023277865
calculate_component_contribution <- function(.data, w) {
    
        covariance_matrix <- cov(.data)
    
    # Standard deviation of portfolio
    # Summarizes how much each asset's returns vary with those of other assets within the portfolio into a single number
   
    
    sd_portfolio <- sqrt(t(w) %*% covariance_matrix %*% w)
    
    # Component contribution
    # Similar to the formula for sd_portfolio
    # Mathematical trick to summarize the same, sd_portfolio, by asset instead of a single number
    component_contribution <- (t(w) %*% covariance_matrix * w) / sd_portfolio[1,1]
    
    # Component contribution in percentage
    component_percentages <- (component_contribution / sd_portfolio[1,1]) %>%
        round(3) %>%
        as_tibble()
    
    return(component_percentages)
    
}

asset_returns_wide_tbl %>% calculate_component_contribution(w = c(.25, .25, .2, .2, .1))
## # A tibble: 1 × 5
##   FBGRX   IVV   VOO VSMPX VTSAX
##   <dbl> <dbl> <dbl> <dbl> <dbl>
## 1  0.29 0.233 0.187 0.193 0.097

6 Plot: Colum Chart of Component Contribution and Weight

plot_data <- asset_returns_wide_tbl %>%
    
    calculate_component_contribution(w = c(.25, .25, .2, .2, .1)) %>%
    
    # Transform to long form
    pivot_longer(cols = everything(), names_to = "asset", values_to = "contribution") %>%
    
    # Add Weights
    add_column(weight = c(.25, .25, .2, .2, .1)) %>%
    
    # Transform to long 
    pivot_longer(cols = c(contribution, weight), names_to = "type", values_to = "value")

plot_data %>%
    
    ggplot(aes(x = asset, y = value, fill = type)) +
    geom_col(position = "dodge") +
    
    scale_y_continuous(labels = scales::percent_format(accuracy = 1)) +
    scale_fill_tq() +
    theme(plot.title = element_text(hjust = 0.5)) +
    theme_tq()

     labs(title = "Percent Contribution to Portfolio Volatility",
          y = "Percent",
          x = NULL) 
## $y
## [1] "Percent"
## 
## $x
## NULL
## 
## $title
## [1] "Percent Contribution to Portfolio Volatility"
## 
## attr(,"class")
## [1] "labels"

Which of the assets in your portfolio the largest contributor to the portfolio volatility? Do you think your portfolio risk is concentrated in any one asset?