# Load packages

# Core
library(tidyverse)
library(tidyquant)
library(readr)

# Time series
library(lubridate)
library(tibbletime)

# modeling
library(broom)

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("NVDA", "WMT", "GOOG", "AAPL", "AMZN")

prices <- tq_get(x = symbols, 
                 get  = "stock.prices", 
                 from = "2012-12-31")

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
##                     AAPL          AMZN          GOOG         NVDA           WMT
## 2013-01-31 -1.555895e-01  0.0566799395  0.0660632798  0.000000000  0.0248964862
## 2013-02-28 -2.561086e-02 -0.0046435024  0.0584792173  0.038221622  0.0117959352
## 2013-03-28  2.850072e-03  0.0083654162 -0.0087877361  0.013338757  0.0620728977
## 2013-04-30  2.711569e-04 -0.0487507497  0.0375394422  0.070706346  0.0378943615
## 2013-05-31  2.217194e-02  0.0588686246  0.0550323967  0.054651763 -0.0317802558
## 2013-06-28 -1.258960e-01  0.0310507506  0.0104476577 -0.030167154 -0.0046876002
## 2013-07-31  1.321026e-01  0.0813355350  0.0083479451  0.028091793  0.0452743022
## 2013-08-30  8.044266e-02 -0.0695574090 -0.0471074902  0.026270625 -0.0596998487
## 2013-09-30 -2.172356e-02  0.1067688897  0.0336806763  0.053460221  0.0133385480
## 2013-10-31  9.201562e-02  0.1521839116  0.1626137117 -0.024066344  0.0370291256
## 2013-11-29  6.770813e-02  0.0781496860  0.0277603257  0.032035029  0.0540194407
## 2013-12-31  8.861837e-03  0.0130490386  0.0560802043  0.026566717 -0.0232522463
## 2014-01-31 -1.139491e-01 -0.1059765119  0.0523738801 -0.020176833 -0.0523034611
## 2014-02-28  5.591844e-02  0.0094619003  0.0289427580  0.162107250  0.0002677538
## 2014-03-31  1.975599e-02 -0.0737086161 -0.0863762133 -0.025903999  0.0293258436
## 2014-04-30  9.476153e-02 -0.1007565303 -0.0559561467  0.030788690  0.0420196946
## 2014-05-30  7.576502e-02  0.0273091844  0.0611851461  0.032886358 -0.0314089184
## 2014-06-30  2.728661e-02  0.0383836202  0.0271166371 -0.024508565 -0.0223930067
## 2014-07-31  2.832602e-02 -0.0369768154 -0.0064175410 -0.057729646 -0.0200477931
## 2014-08-29  7.465189e-02  0.0799468404  0.0000000000  0.110060269  0.0323258024
## 2014-09-30 -1.722075e-02 -0.0502010184  0.0100264942 -0.052783013  0.0127659211
## 2014-10-31  6.948855e-02 -0.0540982347 -0.0321733230  0.057399397 -0.0026189665
## 2014-11-28  1.007310e-01  0.1031187277 -0.0313403078  0.074852179  0.1378163877
## 2014-12-31 -7.460603e-02 -0.0872368614 -0.0288908374 -0.044863678 -0.0135737394
## 2015-01-30  5.961174e-02  0.1330922557  0.0153077121 -0.043318607 -0.0105353173
## 2015-02-27  9.601593e-02  0.0697992426  0.0437064049  0.142698813 -0.0124325358
## 2015-03-31 -3.187455e-02 -0.0214295755 -0.0188002124 -0.052582641 -0.0142314927
## 2015-04-30  5.769711e-03  0.1253212736 -0.0169025636  0.058909013 -0.0524137229
## 2015-05-29  4.434117e-02  0.0175090293 -0.0097807214  0.001459651 -0.0433514047
## 2015-06-30 -3.793780e-02  0.0112589814 -0.0220412667 -0.095716821 -0.0460135050
## 2015-07-31 -3.348140e-02  0.2111621090  0.1839181240 -0.007988109  0.0146947358
## 2015-08-31 -6.848860e-02 -0.0443525782 -0.0118342108  0.123595788 -0.0993582739
## 2015-09-30 -2.205763e-02 -0.0019516837 -0.0160275436  0.092150498  0.0016979334
## 2015-10-30  8.011224e-02  0.2010808743  0.1555398378  0.140555354 -0.1246697486
## 2015-11-30 -5.821141e-03  0.0602956777  0.0437522973  0.115405464  0.0275687452
## 2015-12-31 -1.167902e-01  0.0165440008  0.0216859867  0.038347310  0.0492989546
## 2016-01-29 -7.822393e-02 -0.1410054620 -0.0212149266 -0.118048739  0.0793152644
## 2016-02-29 -1.288332e-03 -0.0605352209 -0.0627389924  0.071923621 -0.0003019546
## 2016-03-31  1.197463e-01  0.0717834363  0.0654277078  0.127655013  0.0392708788
## 2016-04-29 -1.507313e-01  0.1053453760 -0.0722728572 -0.002810730 -0.0239374670
## 2016-05-31  6.931408e-02  0.0915002899  0.0598051178  0.276388583  0.0641208394
## 2016-06-30 -4.359630e-02 -0.0099694639 -0.0611191959  0.006187771  0.0311569345
## 2016-07-29  8.623564e-02  0.0586021229  0.1050874544  0.194443851 -0.0006848016
## 2016-08-31  2.337648e-02  0.0135476418 -0.0022657856  0.073468945 -0.0143682073
## 2016-09-30  6.344789e-02  0.0848953908  0.0132613605  0.110693825  0.0094735775
## 2016-10-31  4.325033e-03 -0.0583893058  0.0092842751  0.037805123 -0.0295506001
## 2016-11-30 -2.183740e-02 -0.0509721927 -0.0343614641  0.260525005  0.0058384312
## 2016-12-30  4.684052e-02 -0.0009330556  0.0180152114  0.146436015 -0.0116433958
## 2017-01-31  4.664166e-02  0.0936394059  0.0318396138  0.022602091 -0.0350396664
## 2017-02-28  1.255554e-01  0.0258446800  0.0326201813 -0.071874729  0.0608887833
## 2017-03-31  4.754149e-02  0.0479423007  0.0076841167  0.070843684  0.0234092096
## 2017-04-28 -6.948519e-05  0.0424566944  0.0880998194 -0.043434222  0.0421085985
## 2017-05-31  6.560687e-02  0.0725778018  0.0629878379  0.326022273  0.0511562506
## 2017-06-30 -5.891557e-02 -0.0271286156 -0.0599350913  0.001453787 -0.0378574769
## 2017-07-31  3.218054e-02  0.0202278808  0.0236741699  0.117044681  0.0553875613
## 2017-08-31  1.016528e-01 -0.0072953953  0.0094447228  0.042639686 -0.0180256417
## 2017-09-29 -6.213454e-02 -0.0198260355  0.0208390414  0.053601227  0.0008963248
## 2017-10-31  9.240355e-02  0.1395154056  0.0582525387  0.145699904  0.1109628938
## 2017-11-30  2.007489e-02  0.0626577318  0.0046809605 -0.029244863  0.1076144265
## 2017-12-29 -1.536311e-02 -0.0062057845  0.0241716428 -0.036583533  0.0207683569
## 2018-01-31 -1.069346e-02  0.2156265497  0.1115967462  0.239240694  0.0764919287
## 2018-02-28  6.596099e-02  0.0415536279 -0.0573515072 -0.014959068 -0.1691626187
## 2018-03-29 -5.980378e-02 -0.0440034760 -0.0683058094 -0.043969090 -0.0056771259
## 2018-04-30 -1.513365e-02  0.0788803060 -0.0141135966 -0.029312700 -0.0057486138
## 2018-05-31  1.267423e-01  0.0397392430  0.0643891622  0.115144834 -0.0629874247
## 2018-06-29 -9.462936e-03  0.0421636787  0.0278664867 -0.062544600  0.0369863553
## 2018-07-31  2.759879e-02  0.0446635734  0.0871652464  0.033048541  0.0409478821
## 2018-08-31  1.826733e-01  0.1243079079  0.0007637402  0.137075515  0.0774629470
## 2018-09-28 -8.337505e-03 -0.0048359814 -0.0205010934  0.001210694 -0.0205521056
## 2018-10-31 -3.095171e-02 -0.2258869989 -0.1028992930 -0.287373721  0.0656295122
## 2018-11-30 -1.999127e-01  0.0560700324  0.0162678346 -0.253667635 -0.0265766877
## 2018-12-31 -1.240882e-01 -0.1180514843 -0.0552430676 -0.202282897 -0.0417363612
## 2019-01-31  5.368643e-02  0.1348080312  0.0750918282  0.073974090  0.0283645779
## 2019-02-28  4.380302e-02 -0.0469930640  0.0031747935  0.071593993  0.0324432059
## 2019-03-29  9.260252e-02  0.0824420184  0.0465716076  0.151869878 -0.0094927305
## 2019-04-30  5.490106e-02  0.0786806224  0.0128463463  0.007987947  0.0530143331
## 2019-05-31 -1.326322e-01 -0.0818753491 -0.0740704194 -0.288680191 -0.0084087038
## 2019-06-28  1.226771e-01  0.0646557767 -0.0208014749  0.192591471  0.0854575696
## 2019-07-31  7.361715e-02 -0.0142806686  0.1183225574  0.026972619 -0.0009961943
## 2019-08-30 -1.659836e-02 -0.0496880810 -0.0237704953 -0.006207983  0.0394582091
## 2019-09-30  7.042270e-02 -0.0229951159  0.0256755699  0.038414427  0.0379539897
## 2019-10-31  1.049763e-01  0.0232034080  0.0331681674  0.143946784 -0.0120369749
## 2019-11-29  7.469385e-02  0.0134958216  0.0349734715  0.076031703  0.0154858360
## 2019-12-31  9.420403e-02  0.0257863501  0.0242706486  0.082163082  0.0023739988
## 2020-01-31  5.260181e-02  0.0834803026  0.0701850863  0.004790585 -0.0372906121
## 2020-02-28 -1.218302e-01 -0.0642332026 -0.0684587808  0.133626976 -0.0613237161
## 2020-03-31 -7.231453e-02  0.0344213022 -0.1413299776 -0.024248260  0.0581110081
## 2020-04-30  1.444240e-01  0.2381504762  0.1482720206  0.103279476  0.0674660211
## 2020-05-29  8.166654e-02 -0.0128673719  0.0578073161  0.194461437  0.0248286140
## 2020-06-30  1.374866e-01  0.1218341331 -0.0107722281  0.068216722 -0.0351084444
## 2020-07-31  1.528343e-01  0.1372488933  0.0478934250  0.111189855  0.0772516584
## 2020-08-31  1.960348e-01  0.0866005735  0.0971010316  0.231105224  0.0745885726
## 2020-09-30 -1.081714e-01 -0.0916533253 -0.1061506874  0.011895609  0.0076049219
## 2020-10-30 -6.188831e-02 -0.0364089187  0.0980589394 -0.076501466 -0.0083254750
## 2020-11-30  9.120484e-02  0.0425228214  0.0826849071  0.066921657  0.0963907628
## 2020-12-31  1.084718e-01  0.0276719582 -0.0050446964 -0.025899896 -0.0545614647
## 2021-01-29 -5.516586e-03 -0.0156985929  0.0467581389 -0.005010664 -0.0257179018
## 2021-02-26 -8.306877e-02 -0.0359675607  0.1039617672  0.054292855 -0.0782174175
## 2021-03-31  7.312841e-03  0.0003717151  0.0154771777 -0.026722864  0.0486516361
## 2021-04-30  7.345274e-02  0.1139202399  0.1527898791  0.117297878  0.0295951215
## 2021-05-28 -5.181644e-02 -0.0730764715  0.0005973392  0.079070858  0.0189586294
## 2021-06-30  9.449976e-02  0.0651836137  0.0385416692  0.208332129 -0.0071367001
## 2021-07-30  6.295852e-02 -0.0332696301  0.0760718946 -0.025494040  0.0107910215
## 2021-08-31  4.161135e-02  0.0421339363  0.0730044848  0.138204144  0.0418682078
## 2021-09-30 -7.046167e-02 -0.0550034409 -0.0875714257 -0.077484672 -0.0606836923
## 2021-10-29  5.700123e-02  0.0262547651  0.1066947199  0.210396143  0.0695570278
## 2021-11-30  9.991924e-02  0.0391473463 -0.0400332145  0.245338529 -0.0606289021
## 2021-12-31  7.160291e-02 -0.0505062029  0.0155159762 -0.105149809  0.0324794999
## 2022-01-31 -1.583671e-02 -0.1085098142 -0.0640854509 -0.183267303 -0.0343090224
## 2022-02-28 -5.558244e-02  0.0263230079 -0.0059682847 -0.004133287 -0.0338251663
## 2022-03-31  5.588259e-02  0.0596239190  0.0346686274  0.112575858  0.1008101182
## 2022-04-29 -1.021777e-01 -0.2711856801 -0.1944951028 -0.386065708  0.0269633748
## 2022-05-31 -5.603720e-02 -0.0333130879 -0.0081002919  0.006717049 -0.1698040379
## 2022-06-30 -8.493693e-02 -0.1238178226 -0.0417809926 -0.208219210 -0.0563676929
## 2022-07-29  1.728044e-01  0.2394860591  0.0643327814  0.180792291  0.0826080882
## 2022-08-31 -3.170505e-02 -0.0625299224 -0.0663691019 -0.185089376  0.0081252642
## 2022-09-30 -1.289441e-01 -0.1149865758 -0.1268137319 -0.217576866 -0.0217358814
## 2022-10-31  1.039556e-01 -0.0981105335 -0.0156178462  0.106043987  0.0929242403
## 2022-11-30 -3.358533e-02 -0.0593198454  0.0692744662  0.226462114  0.0684914656
## 2022-12-30 -1.304189e-01 -0.1391406409 -0.1339679265 -0.146693623 -0.0685302243
## 2023-01-31  1.048291e-01  0.2051735029  0.1182713564  0.290330213  0.0145631730
## 2023-02-28  2.291852e-02 -0.0902516639 -0.1007319530  0.172531448 -0.0121679609
## 2023-03-31  1.121214e-01  0.0918019370  0.1412533862  0.179536469  0.0408373846
## 2023-04-28  2.857496e-02  0.0206963031  0.0397753350 -0.001008501  0.0235919492
## 2023-05-31  4.502915e-02  0.1340765703  0.1310218362  0.310008368 -0.0237417953
## 2023-06-30  9.014245e-02  0.0779864104 -0.0196454520  0.111729523  0.0678438856
## 2023-07-31  1.270419e-02  0.0251489708  0.0956332966  0.099530705  0.0169067453
## 2023-08-31 -4.330822e-02  0.0318772770  0.0313565924  0.054674139  0.0206048549
## 2023-09-29 -9.285926e-02 -0.0821945627 -0.0408674843 -0.126218634 -0.0166184735
## 2023-10-31 -2.573292e-03  0.0458940197 -0.0509540720 -0.064546283  0.0215261238
## 2023-11-30  1.077599e-01  0.0931972815  0.0665316608  0.137050195 -0.0483955215
## 2023-12-29  1.349097e-02  0.0392628771  0.0510206296  0.057262978  0.0162176573
## 2024-01-31 -4.314458e-02  0.0212288659  0.0061544736  0.217059090  0.0470821823
## 2024-02-29 -1.871724e-02  0.1300782611 -0.0143480231  0.251388473  0.0620582484
## 2024-03-28 -5.264825e-02  0.0202729146  0.0855197990  0.132939814  0.0296684161
## 2024-04-30 -6.728823e-03 -0.0302797899  0.0781716500 -0.044746643 -0.0137217594
## 2024-05-31  1.224142e-01  0.0081949152  0.0550643605  0.238127592  0.1060150622
## 2024-06-28  9.125894e-02  0.0910037984  0.0540904177  0.119508730  0.0292220838
## 2024-07-31  5.298215e-02 -0.0329830511 -0.0576203345 -0.054220221  0.0136416985
## 2024-08-30  3.184118e-02 -0.0464130352 -0.0475463552  0.019883122  0.1207588278
## 2024-09-30  1.731647e-02  0.0429307038  0.0138345586  0.017277905  0.0445700315
## 2024-10-31 -3.090179e-02  0.0003755644  0.0323671809  0.089122711  0.0147512106
## 2024-11-29  5.041443e-02  0.1091142212 -0.0128215042  0.040520676  0.1210994093
## 2024-12-31  5.368794e-02  0.0538418744  0.1117943508 -0.028993151 -0.0213044630
## 2025-01-31 -5.930764e-02  0.0800742352  0.0765953722 -0.111926733  0.0829078126
## 2025-02-28  2.554335e-02 -0.1130190481 -0.1771597253  0.039598590  0.0045738759
## 2025-03-31 -8.501350e-02 -0.1095146233 -0.0963049079 -0.141937952 -0.1134827708
## 2025-04-30 -4.432080e-02 -0.0311757737  0.0293916110  0.004970100  0.1023373489
## 2025-05-30 -5.507314e-02  0.1058429765  0.0717033061  0.215623633  0.0174174905
## 2025-06-23  3.230990e-03  0.0167364202 -0.0391749102  0.064825280 -0.0086474770
# Covariance of asset returns
covariance_matrix <- cov(asset_returns_wide_tbl)

covariance_matrix
##             AAPL         AMZN         GOOG        NVDA          WMT
## AAPL 0.005988286 0.0031693563 0.0020006526 0.004946944 0.0011482645
## AMZN 0.003169356 0.0071702537 0.0036288704 0.005523510 0.0009447362
## GOOG 0.002000653 0.0036288704 0.0044921405 0.003823419 0.0005812436
## NVDA 0.004946944 0.0055235098 0.0038234190 0.014836717 0.0013762290
## WMT  0.001148264 0.0009447362 0.0005812436 0.001376229 0.0027830049
# 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.06417463
# 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
##            AAPL       AMZN        GOOG       NVDA         WMT
## [1,] 0.01477903 0.01756867 0.009750324 0.02021753 0.001859061
rowSums(component_contribution)
## [1] 0.06417463
# Component contribution in percentage
component_percentages <- (component_contribution / sd_portfolio[1,1]) %>%
    round(3) %>%
    as_tibble()

component_percentages
## # A tibble: 1 × 5
##    AAPL  AMZN  GOOG  NVDA   WMT
##   <dbl> <dbl> <dbl> <dbl> <dbl>
## 1  0.23 0.274 0.152 0.315 0.029
component_percentages %>%

    as_tibble() %>%
    gather(key = "asset", value = "contribution")
## # A tibble: 5 × 2
##   asset contribution
##   <chr>        <dbl>
## 1 AAPL         0.23 
## 2 AMZN         0.274
## 3 GOOG         0.152
## 4 NVDA         0.315
## 5 WMT          0.029
# 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
##                     AAPL          AMZN          GOOG         NVDA           WMT
## 2013-01-31 -1.555895e-01  0.0566799395  0.0660632798  0.000000000  0.0248964862
## 2013-02-28 -2.561086e-02 -0.0046435024  0.0584792173  0.038221622  0.0117959352
## 2013-03-28  2.850072e-03  0.0083654162 -0.0087877361  0.013338757  0.0620728977
## 2013-04-30  2.711569e-04 -0.0487507497  0.0375394422  0.070706346  0.0378943615
## 2013-05-31  2.217194e-02  0.0588686246  0.0550323967  0.054651763 -0.0317802558
## 2013-06-28 -1.258960e-01  0.0310507506  0.0104476577 -0.030167154 -0.0046876002
## 2013-07-31  1.321026e-01  0.0813355350  0.0083479451  0.028091793  0.0452743022
## 2013-08-30  8.044266e-02 -0.0695574090 -0.0471074902  0.026270625 -0.0596998487
## 2013-09-30 -2.172356e-02  0.1067688897  0.0336806763  0.053460221  0.0133385480
## 2013-10-31  9.201562e-02  0.1521839116  0.1626137117 -0.024066344  0.0370291256
## 2013-11-29  6.770813e-02  0.0781496860  0.0277603257  0.032035029  0.0540194407
## 2013-12-31  8.861837e-03  0.0130490386  0.0560802043  0.026566717 -0.0232522463
## 2014-01-31 -1.139491e-01 -0.1059765119  0.0523738801 -0.020176833 -0.0523034611
## 2014-02-28  5.591844e-02  0.0094619003  0.0289427580  0.162107250  0.0002677538
## 2014-03-31  1.975599e-02 -0.0737086161 -0.0863762133 -0.025903999  0.0293258436
## 2014-04-30  9.476153e-02 -0.1007565303 -0.0559561467  0.030788690  0.0420196946
## 2014-05-30  7.576502e-02  0.0273091844  0.0611851461  0.032886358 -0.0314089184
## 2014-06-30  2.728661e-02  0.0383836202  0.0271166371 -0.024508565 -0.0223930067
## 2014-07-31  2.832602e-02 -0.0369768154 -0.0064175410 -0.057729646 -0.0200477931
## 2014-08-29  7.465189e-02  0.0799468404  0.0000000000  0.110060269  0.0323258024
## 2014-09-30 -1.722075e-02 -0.0502010184  0.0100264942 -0.052783013  0.0127659211
## 2014-10-31  6.948855e-02 -0.0540982347 -0.0321733230  0.057399397 -0.0026189665
## 2014-11-28  1.007310e-01  0.1031187277 -0.0313403078  0.074852179  0.1378163877
## 2014-12-31 -7.460603e-02 -0.0872368614 -0.0288908374 -0.044863678 -0.0135737394
## 2015-01-30  5.961174e-02  0.1330922557  0.0153077121 -0.043318607 -0.0105353173
## 2015-02-27  9.601593e-02  0.0697992426  0.0437064049  0.142698813 -0.0124325358
## 2015-03-31 -3.187455e-02 -0.0214295755 -0.0188002124 -0.052582641 -0.0142314927
## 2015-04-30  5.769711e-03  0.1253212736 -0.0169025636  0.058909013 -0.0524137229
## 2015-05-29  4.434117e-02  0.0175090293 -0.0097807214  0.001459651 -0.0433514047
## 2015-06-30 -3.793780e-02  0.0112589814 -0.0220412667 -0.095716821 -0.0460135050
## 2015-07-31 -3.348140e-02  0.2111621090  0.1839181240 -0.007988109  0.0146947358
## 2015-08-31 -6.848860e-02 -0.0443525782 -0.0118342108  0.123595788 -0.0993582739
## 2015-09-30 -2.205763e-02 -0.0019516837 -0.0160275436  0.092150498  0.0016979334
## 2015-10-30  8.011224e-02  0.2010808743  0.1555398378  0.140555354 -0.1246697486
## 2015-11-30 -5.821141e-03  0.0602956777  0.0437522973  0.115405464  0.0275687452
## 2015-12-31 -1.167902e-01  0.0165440008  0.0216859867  0.038347310  0.0492989546
## 2016-01-29 -7.822393e-02 -0.1410054620 -0.0212149266 -0.118048739  0.0793152644
## 2016-02-29 -1.288332e-03 -0.0605352209 -0.0627389924  0.071923621 -0.0003019546
## 2016-03-31  1.197463e-01  0.0717834363  0.0654277078  0.127655013  0.0392708788
## 2016-04-29 -1.507313e-01  0.1053453760 -0.0722728572 -0.002810730 -0.0239374670
## 2016-05-31  6.931408e-02  0.0915002899  0.0598051178  0.276388583  0.0641208394
## 2016-06-30 -4.359630e-02 -0.0099694639 -0.0611191959  0.006187771  0.0311569345
## 2016-07-29  8.623564e-02  0.0586021229  0.1050874544  0.194443851 -0.0006848016
## 2016-08-31  2.337648e-02  0.0135476418 -0.0022657856  0.073468945 -0.0143682073
## 2016-09-30  6.344789e-02  0.0848953908  0.0132613605  0.110693825  0.0094735775
## 2016-10-31  4.325033e-03 -0.0583893058  0.0092842751  0.037805123 -0.0295506001
## 2016-11-30 -2.183740e-02 -0.0509721927 -0.0343614641  0.260525005  0.0058384312
## 2016-12-30  4.684052e-02 -0.0009330556  0.0180152114  0.146436015 -0.0116433958
## 2017-01-31  4.664166e-02  0.0936394059  0.0318396138  0.022602091 -0.0350396664
## 2017-02-28  1.255554e-01  0.0258446800  0.0326201813 -0.071874729  0.0608887833
## 2017-03-31  4.754149e-02  0.0479423007  0.0076841167  0.070843684  0.0234092096
## 2017-04-28 -6.948519e-05  0.0424566944  0.0880998194 -0.043434222  0.0421085985
## 2017-05-31  6.560687e-02  0.0725778018  0.0629878379  0.326022273  0.0511562506
## 2017-06-30 -5.891557e-02 -0.0271286156 -0.0599350913  0.001453787 -0.0378574769
## 2017-07-31  3.218054e-02  0.0202278808  0.0236741699  0.117044681  0.0553875613
## 2017-08-31  1.016528e-01 -0.0072953953  0.0094447228  0.042639686 -0.0180256417
## 2017-09-29 -6.213454e-02 -0.0198260355  0.0208390414  0.053601227  0.0008963248
## 2017-10-31  9.240355e-02  0.1395154056  0.0582525387  0.145699904  0.1109628938
## 2017-11-30  2.007489e-02  0.0626577318  0.0046809605 -0.029244863  0.1076144265
## 2017-12-29 -1.536311e-02 -0.0062057845  0.0241716428 -0.036583533  0.0207683569
## 2018-01-31 -1.069346e-02  0.2156265497  0.1115967462  0.239240694  0.0764919287
## 2018-02-28  6.596099e-02  0.0415536279 -0.0573515072 -0.014959068 -0.1691626187
## 2018-03-29 -5.980378e-02 -0.0440034760 -0.0683058094 -0.043969090 -0.0056771259
## 2018-04-30 -1.513365e-02  0.0788803060 -0.0141135966 -0.029312700 -0.0057486138
## 2018-05-31  1.267423e-01  0.0397392430  0.0643891622  0.115144834 -0.0629874247
## 2018-06-29 -9.462936e-03  0.0421636787  0.0278664867 -0.062544600  0.0369863553
## 2018-07-31  2.759879e-02  0.0446635734  0.0871652464  0.033048541  0.0409478821
## 2018-08-31  1.826733e-01  0.1243079079  0.0007637402  0.137075515  0.0774629470
## 2018-09-28 -8.337505e-03 -0.0048359814 -0.0205010934  0.001210694 -0.0205521056
## 2018-10-31 -3.095171e-02 -0.2258869989 -0.1028992930 -0.287373721  0.0656295122
## 2018-11-30 -1.999127e-01  0.0560700324  0.0162678346 -0.253667635 -0.0265766877
## 2018-12-31 -1.240882e-01 -0.1180514843 -0.0552430676 -0.202282897 -0.0417363612
## 2019-01-31  5.368643e-02  0.1348080312  0.0750918282  0.073974090  0.0283645779
## 2019-02-28  4.380302e-02 -0.0469930640  0.0031747935  0.071593993  0.0324432059
## 2019-03-29  9.260252e-02  0.0824420184  0.0465716076  0.151869878 -0.0094927305
## 2019-04-30  5.490106e-02  0.0786806224  0.0128463463  0.007987947  0.0530143331
## 2019-05-31 -1.326322e-01 -0.0818753491 -0.0740704194 -0.288680191 -0.0084087038
## 2019-06-28  1.226771e-01  0.0646557767 -0.0208014749  0.192591471  0.0854575696
## 2019-07-31  7.361715e-02 -0.0142806686  0.1183225574  0.026972619 -0.0009961943
## 2019-08-30 -1.659836e-02 -0.0496880810 -0.0237704953 -0.006207983  0.0394582091
## 2019-09-30  7.042270e-02 -0.0229951159  0.0256755699  0.038414427  0.0379539897
## 2019-10-31  1.049763e-01  0.0232034080  0.0331681674  0.143946784 -0.0120369749
## 2019-11-29  7.469385e-02  0.0134958216  0.0349734715  0.076031703  0.0154858360
## 2019-12-31  9.420403e-02  0.0257863501  0.0242706486  0.082163082  0.0023739988
## 2020-01-31  5.260181e-02  0.0834803026  0.0701850863  0.004790585 -0.0372906121
## 2020-02-28 -1.218302e-01 -0.0642332026 -0.0684587808  0.133626976 -0.0613237161
## 2020-03-31 -7.231453e-02  0.0344213022 -0.1413299776 -0.024248260  0.0581110081
## 2020-04-30  1.444240e-01  0.2381504762  0.1482720206  0.103279476  0.0674660211
## 2020-05-29  8.166654e-02 -0.0128673719  0.0578073161  0.194461437  0.0248286140
## 2020-06-30  1.374866e-01  0.1218341331 -0.0107722281  0.068216722 -0.0351084444
## 2020-07-31  1.528343e-01  0.1372488933  0.0478934250  0.111189855  0.0772516584
## 2020-08-31  1.960348e-01  0.0866005735  0.0971010316  0.231105224  0.0745885726
## 2020-09-30 -1.081714e-01 -0.0916533253 -0.1061506874  0.011895609  0.0076049219
## 2020-10-30 -6.188831e-02 -0.0364089187  0.0980589394 -0.076501466 -0.0083254750
## 2020-11-30  9.120484e-02  0.0425228214  0.0826849071  0.066921657  0.0963907628
## 2020-12-31  1.084718e-01  0.0276719582 -0.0050446964 -0.025899896 -0.0545614647
## 2021-01-29 -5.516586e-03 -0.0156985929  0.0467581389 -0.005010664 -0.0257179018
## 2021-02-26 -8.306877e-02 -0.0359675607  0.1039617672  0.054292855 -0.0782174175
## 2021-03-31  7.312841e-03  0.0003717151  0.0154771777 -0.026722864  0.0486516361
## 2021-04-30  7.345274e-02  0.1139202399  0.1527898791  0.117297878  0.0295951215
## 2021-05-28 -5.181644e-02 -0.0730764715  0.0005973392  0.079070858  0.0189586294
## 2021-06-30  9.449976e-02  0.0651836137  0.0385416692  0.208332129 -0.0071367001
## 2021-07-30  6.295852e-02 -0.0332696301  0.0760718946 -0.025494040  0.0107910215
## 2021-08-31  4.161135e-02  0.0421339363  0.0730044848  0.138204144  0.0418682078
## 2021-09-30 -7.046167e-02 -0.0550034409 -0.0875714257 -0.077484672 -0.0606836923
## 2021-10-29  5.700123e-02  0.0262547651  0.1066947199  0.210396143  0.0695570278
## 2021-11-30  9.991924e-02  0.0391473463 -0.0400332145  0.245338529 -0.0606289021
## 2021-12-31  7.160291e-02 -0.0505062029  0.0155159762 -0.105149809  0.0324794999
## 2022-01-31 -1.583671e-02 -0.1085098142 -0.0640854509 -0.183267303 -0.0343090224
## 2022-02-28 -5.558244e-02  0.0263230079 -0.0059682847 -0.004133287 -0.0338251663
## 2022-03-31  5.588259e-02  0.0596239190  0.0346686274  0.112575858  0.1008101182
## 2022-04-29 -1.021777e-01 -0.2711856801 -0.1944951028 -0.386065708  0.0269633748
## 2022-05-31 -5.603720e-02 -0.0333130879 -0.0081002919  0.006717049 -0.1698040379
## 2022-06-30 -8.493693e-02 -0.1238178226 -0.0417809926 -0.208219210 -0.0563676929
## 2022-07-29  1.728044e-01  0.2394860591  0.0643327814  0.180792291  0.0826080882
## 2022-08-31 -3.170505e-02 -0.0625299224 -0.0663691019 -0.185089376  0.0081252642
## 2022-09-30 -1.289441e-01 -0.1149865758 -0.1268137319 -0.217576866 -0.0217358814
## 2022-10-31  1.039556e-01 -0.0981105335 -0.0156178462  0.106043987  0.0929242403
## 2022-11-30 -3.358533e-02 -0.0593198454  0.0692744662  0.226462114  0.0684914656
## 2022-12-30 -1.304189e-01 -0.1391406409 -0.1339679265 -0.146693623 -0.0685302243
## 2023-01-31  1.048291e-01  0.2051735029  0.1182713564  0.290330213  0.0145631730
## 2023-02-28  2.291852e-02 -0.0902516639 -0.1007319530  0.172531448 -0.0121679609
## 2023-03-31  1.121214e-01  0.0918019370  0.1412533862  0.179536469  0.0408373846
## 2023-04-28  2.857496e-02  0.0206963031  0.0397753350 -0.001008501  0.0235919492
## 2023-05-31  4.502915e-02  0.1340765703  0.1310218362  0.310008368 -0.0237417953
## 2023-06-30  9.014245e-02  0.0779864104 -0.0196454520  0.111729523  0.0678438856
## 2023-07-31  1.270419e-02  0.0251489708  0.0956332966  0.099530705  0.0169067453
## 2023-08-31 -4.330822e-02  0.0318772770  0.0313565924  0.054674139  0.0206048549
## 2023-09-29 -9.285926e-02 -0.0821945627 -0.0408674843 -0.126218634 -0.0166184735
## 2023-10-31 -2.573292e-03  0.0458940197 -0.0509540720 -0.064546283  0.0215261238
## 2023-11-30  1.077599e-01  0.0931972815  0.0665316608  0.137050195 -0.0483955215
## 2023-12-29  1.349097e-02  0.0392628771  0.0510206296  0.057262978  0.0162176573
## 2024-01-31 -4.314458e-02  0.0212288659  0.0061544736  0.217059090  0.0470821823
## 2024-02-29 -1.871724e-02  0.1300782611 -0.0143480231  0.251388473  0.0620582484
## 2024-03-28 -5.264825e-02  0.0202729146  0.0855197990  0.132939814  0.0296684161
## 2024-04-30 -6.728823e-03 -0.0302797899  0.0781716500 -0.044746643 -0.0137217594
## 2024-05-31  1.224142e-01  0.0081949152  0.0550643605  0.238127592  0.1060150622
## 2024-06-28  9.125894e-02  0.0910037984  0.0540904177  0.119508730  0.0292220838
## 2024-07-31  5.298215e-02 -0.0329830511 -0.0576203345 -0.054220221  0.0136416985
## 2024-08-30  3.184118e-02 -0.0464130352 -0.0475463552  0.019883122  0.1207588278
## 2024-09-30  1.731647e-02  0.0429307038  0.0138345586  0.017277905  0.0445700315
## 2024-10-31 -3.090179e-02  0.0003755644  0.0323671809  0.089122711  0.0147512106
## 2024-11-29  5.041443e-02  0.1091142212 -0.0128215042  0.040520676  0.1210994093
## 2024-12-31  5.368794e-02  0.0538418744  0.1117943508 -0.028993151 -0.0213044630
## 2025-01-31 -5.930764e-02  0.0800742352  0.0765953722 -0.111926733  0.0829078126
## 2025-02-28  2.554335e-02 -0.1130190481 -0.1771597253  0.039598590  0.0045738759
## 2025-03-31 -8.501350e-02 -0.1095146233 -0.0963049079 -0.141937952 -0.1134827708
## 2025-04-30 -4.432080e-02 -0.0311757737  0.0293916110  0.004970100  0.1023373489
## 2025-05-30 -5.507314e-02  0.1058429765  0.0717033061  0.215623633  0.0174174905
## 2025-06-23  3.230990e-03  0.0167364202 -0.0391749102  0.064825280 -0.0086474770
calculate_component_contribution <- function(.data, w) {
        
    # Covariance of asset returns
    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()
    
    component_percentages
    
    return(component_percentages)  
}

asset_returns_wide_tbl %>% calculate_component_contribution(w = c(.25, .25, .2, .2, .1 ))
## # A tibble: 1 × 5
##    AAPL  AMZN  GOOG  NVDA   WMT
##   <dbl> <dbl> <dbl> <dbl> <dbl>
## 1  0.23 0.274 0.152 0.315 0.029

6 Plot: Colum Chart of Component Contribution and Weight

plot_data <- asset_returns_wide_tbl %>% 
    
    calculate_component_contribution(w = c(.1, .2, .2, .2, .3)) %>%
    
    # Tranform to long form
    pivot_longer(cols = everything() ,names_to = "Asset", values_to = "Contribution") %>% 
    
    # Add weights
    add_column(weight = c(.1, .2, .2, .3, .3)) %>%
    
    # 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 = .5)) + 
    theme_tq() +
    
    labs(title = "Percent Contribution to Portfolio Volatility and Weight",          y = "Percent", 
         x = NULL)

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?

NVDA is the largest contributior to colatility, this makes since since its had very large losses and returns. Most of my risk is in NVDA but it shares smaller ammounts with AMZN and GOOG.