# 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

symbols <- c("BRK-B", "LLY", "NVDA", "AAPL")

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

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         BRK-B           LLY         NVDA
## 2013-01-31 -1.555889e-01  0.0775183366  8.489689e-02  0.000000000
## 2013-02-28 -2.561107e-02  0.0525511759  2.705486e-02  0.038221927
## 2013-03-28  2.850426e-03  0.0197718525  3.822822e-02  0.013338553
## 2013-04-30  2.710862e-04  0.0201413115 -2.514162e-02  0.070706060
## 2013-05-31  2.217146e-02  0.0703588808 -3.216759e-02  0.054652038
## 2013-06-28 -1.258957e-01 -0.0190279784 -7.904023e-02 -0.030167060
## 2013-07-31  1.321026e-01  0.0346845827  7.809864e-02  0.028091523
## 2013-08-30  8.044285e-02 -0.0409586640 -2.361994e-02  0.026270800
## 2013-09-30 -2.172388e-02  0.0203807249 -2.103656e-02  0.053460135
## 2013-10-31  9.201535e-02  0.0138234416 -1.018487e-02 -0.024066427
## 2013-11-29  6.770828e-02  0.0124343409  1.783297e-02  0.032035032
## 2013-12-31  8.862168e-03  0.0172704008  1.541257e-02  0.026567114
## 2014-01-31 -1.139490e-01 -0.0604981047  5.734364e-02 -0.020177310
## 2014-02-28  5.591821e-02  0.0367707918  1.076841e-01  0.162107480
## 2014-03-31  1.975634e-02  0.0763818902 -1.266205e-02 -0.025903716
## 2014-04-30  9.476089e-02  0.0305752662  4.069622e-03  0.030788203
## 2014-05-30  7.576524e-02 -0.0039660207  2.105804e-02  0.032886560
## 2014-06-30  2.728652e-02 -0.0139664791  3.786404e-02 -0.024508564
## 2014-07-31  2.832621e-02 -0.0089686483 -1.801558e-02 -0.057729642
## 2014-08-29  7.465190e-02  0.0900562439  4.814359e-02  0.110060197
## 2014-09-30 -1.722075e-02  0.0064635789  2.009274e-02 -0.052782742
## 2014-10-31  6.948904e-02  0.0145169941  2.256530e-02  0.057399254
## 2014-11-28  1.007307e-01  0.0590789648  3.387682e-02  0.074852052
## 2014-12-31 -7.460618e-02  0.0097711357  1.269054e-02 -0.044863554
## 2015-01-30  5.961153e-02 -0.0424466242  4.270445e-02 -0.043318925
## 2015-02-27  9.601602e-02  0.0240297153 -1.862789e-02  0.142699007
## 2015-03-31 -3.187421e-02 -0.0211847378  3.473280e-02 -0.052582641
## 2015-04-30  5.769642e-03 -0.0217849154 -1.079480e-02  0.058908678
## 2015-05-29  4.434137e-02  0.0125964386  1.002144e-01  0.001460207
## 2015-06-30 -3.793820e-02 -0.0493812434  5.654536e-02 -0.095717228
## 2015-07-31 -3.348119e-02  0.0475614452  1.214306e-02 -0.007988049
## 2015-08-31 -6.848874e-02 -0.0628866192 -1.988820e-02  0.123595803
## 2015-09-30 -2.205763e-02 -0.0275316101  1.614138e-02  0.092150905
## 2015-10-30  8.011218e-02  0.0421953625 -2.565839e-02  0.140555056
## 2015-11-30 -5.821071e-03 -0.0142907762  1.206612e-02  0.115405541
## 2015-12-31 -1.167906e-01 -0.0154063328  2.669995e-02  0.038347159
## 2016-01-29 -7.822327e-02 -0.0173411705 -6.319435e-02 -0.118048415
## 2016-02-29 -1.288245e-03  0.0333439533 -8.710620e-02  0.071923526
## 2016-03-31  1.197461e-01  0.0558740254  1.386597e-04  0.127654584
## 2016-04-29 -1.507313e-01  0.0250569264  4.772488e-02 -0.002810114
## 2016-05-31  6.931416e-02 -0.0345464928  1.400191e-05  0.276388136
## 2016-06-30 -4.359630e-02  0.0297922724  4.839024e-02  0.006187875
## 2016-07-29  8.623515e-02 -0.0035977969  5.123614e-02  0.194443936
## 2016-08-31  2.337665e-02  0.0422100997 -5.766433e-02  0.073468860
## 2016-09-30  6.344798e-02 -0.0408247913  3.177299e-02  0.110693613
## 2016-10-31  4.325107e-03 -0.0011773951 -8.337102e-02  0.037805131
## 2016-11-30 -2.183755e-02  0.0871499619 -8.889124e-02  0.260525524
## 2016-12-30  4.684074e-02  0.0345830189  9.148328e-02  0.146435791
## 2017-01-31  4.664179e-02  0.0070922508  4.622958e-02  0.022601822
## 2017-02-28  1.255552e-01  0.0433969563  7.906080e-02 -0.071874647
## 2017-03-31  4.754120e-02 -0.0280409122  1.557664e-02  0.070843335
## 2017-04-28 -6.948521e-05 -0.0088583300 -2.467453e-02 -0.043433778
## 2017-05-31  6.560764e-02  0.0004235654 -2.437753e-02  0.326022273
## 2017-06-30 -5.891599e-02  0.0244446441  3.373410e-02  0.001453519
## 2017-07-31  3.218010e-02  0.0325288956  4.364620e-03  0.117045067
## 2017-08-31  1.016534e-01  0.0347661013 -1.035474e-02  0.042639339
## 2017-09-29 -6.213505e-02  0.0118526607  5.096074e-02  0.053601347
## 2017-10-31  9.240405e-02  0.0195544232 -4.299686e-02  0.145700105
## 2017-11-30  2.007507e-02  0.0319542498  3.871522e-02 -0.029245053
## 2017-12-29 -1.536330e-02  0.0266355586 -2.128805e-03 -0.036583337
## 2018-01-31 -1.069346e-02  0.0783726329 -3.628855e-02  0.239240673
## 2018-02-28  6.596097e-02 -0.0340656684 -4.850942e-02 -0.014959067
## 2018-03-29 -5.980395e-02 -0.0379705364  4.534106e-03 -0.043969503
## 2018-04-30 -1.513355e-02 -0.0292485442  4.671392e-02 -0.029312710
## 2018-05-31  1.267420e-01 -0.0114209671  5.468067e-02  0.115145406
## 2018-06-29 -9.463111e-03 -0.0258092753  3.404270e-03 -0.062544586
## 2018-07-31  2.759896e-02  0.0583750521  1.466724e-01  0.033048454
## 2018-08-31  1.826735e-01  0.0533834219  7.244413e-02  0.137075495
## 2018-09-28 -8.337932e-03  0.0254962578  1.559008e-02  0.001210420
## 2018-10-31 -3.095150e-02 -0.0421150096  1.047525e-02 -0.287373676
## 2018-11-30 -1.999126e-01  0.0612205049  9.491876e-02 -0.253667309
## 2018-12-31 -1.240883e-01 -0.0665934780 -2.492042e-02 -0.202283349
## 2019-01-31  5.368663e-02  0.0066387077  3.515095e-02  0.073974105
## 2019-02-28  4.380283e-02 -0.0208442817  5.766179e-02  0.071593945
## 2019-03-29  9.260303e-02 -0.0020388563  2.710582e-02  0.151870234
## 2019-04-30  5.490056e-02  0.0758025937 -1.031710e-01  0.007987309
## 2019-05-31 -1.326324e-01 -0.0932266555 -3.848757e-03 -0.288679802
## 2019-06-28  1.226772e-01  0.0767565311 -4.543643e-02  0.192591612
## 2019-07-31  7.361716e-02 -0.0369846532 -1.674727e-02  0.026972505
## 2019-08-30 -1.659821e-02 -0.0098816430  4.182354e-02 -0.006207984
## 2019-09-30  7.042242e-02  0.0224105848 -1.014237e-02  0.038414211
## 2019-10-31  1.049767e-01  0.0216841473  1.877990e-02  0.143947114
## 2019-11-29  7.469384e-02  0.0356718709  3.513618e-02  0.076031703
## 2019-12-31  9.420369e-02  0.0277546773  1.133134e-01  0.082162838
## 2020-01-31  5.260223e-02 -0.0091811230  6.059333e-02  0.004790910
## 2020-02-28 -1.218306e-01 -0.0840385460 -9.658471e-02  0.133626966
## 2020-03-31 -7.231417e-02 -0.1209685066  9.514424e-02 -0.024248476
## 2020-04-30  1.444238e-01  0.0244751338  1.086427e-01  0.103279425
## 2020-05-29  8.166695e-02 -0.0095458373 -6.292367e-03  0.194461849
## 2020-06-30  1.374865e-01 -0.0388414745  7.085223e-02  0.068216607
## 2020-07-31  1.528340e-01  0.0923469823 -8.839652e-02  0.111189574
## 2020-08-31  1.960352e-01  0.1076869278 -7.860108e-03  0.231105476
## 2020-09-30 -1.081718e-01 -0.0236680541 -2.496381e-03  0.011895608
## 2020-10-30 -6.188818e-02 -0.0532379523 -1.262809e-01 -0.076501384
## 2020-11-30  9.120484e-02  0.1255564341  1.152646e-01  0.066921433
## 2020-12-31  1.084718e-01  0.0128479195  1.477452e-01 -0.025899898
## 2021-01-29 -5.516704e-03 -0.0174015793  2.084424e-01 -0.005010591
## 2021-02-26 -8.306872e-02  0.0539863764 -1.075323e-02  0.054293134
## 2021-03-31  7.312778e-03  0.0603433448 -9.232755e-02 -0.026723358
## 2021-04-30  7.345274e-02  0.0734843167 -2.191719e-02  0.117297965
## 2021-05-28 -5.181645e-02  0.0513587227  9.319720e-02  0.079071103
## 2021-06-30  9.450012e-02 -0.0406146793  1.389735e-01  0.208332107
## 2021-07-30  6.295829e-02  0.0013304153  5.912691e-02 -0.025494037
## 2021-08-31  4.161145e-02  0.0265234869  6.218971e-02  0.138204216
## 2021-09-30 -7.046199e-02 -0.0459352533 -1.114490e-01 -0.077484751
## 2021-10-29  5.700145e-02  0.0502650926  9.768794e-02  0.210396051
## 2021-11-30  9.991924e-02 -0.0366193376 -2.349035e-02  0.245338412
## 2021-12-31  7.160308e-02  0.0775458187  1.076079e-01 -0.105149757
## 2022-01-31 -1.583680e-02  0.0458234778 -1.183490e-01 -0.183267004
## 2022-02-28 -5.558234e-02  0.0265749974  2.257796e-02 -0.004133365
## 2022-03-31  5.588250e-02  0.0933710287  1.360237e-01  0.112575841
## 2022-04-29 -1.021778e-01 -0.0890872500  1.991432e-02 -0.386065745
## 2022-05-31 -5.603720e-02 -0.0214468721  7.377334e-02  0.006716946
## 2022-06-30 -8.493704e-02 -0.1461339429  3.384510e-02 -0.208219273
## 2022-07-29  1.728047e-01  0.0962354853  1.669950e-02  0.180792354
## 2022-08-31 -3.170534e-02 -0.0681378689 -8.701932e-02 -0.185089376
## 2022-09-30 -1.289443e-01 -0.0503191079  7.086121e-02 -0.217576787
## 2022-10-31  1.039557e-01  0.0999568613  1.131575e-01  0.106043979
## 2022-11-30 -3.358492e-02  0.0766560345  2.731050e-02  0.226461818
## 2022-12-30 -1.304191e-01 -0.0309188365 -1.422158e-02 -0.146693267
## 2023-01-31  1.048292e-01  0.0084459262 -6.111843e-02  0.290330082
## 2023-02-28  2.291831e-02 -0.0205617639 -9.734751e-02  0.172531530
## 2023-03-31  1.121214e-01  0.0116948851  9.845413e-02  0.179536387
## 2023-04-28  2.857515e-02  0.0620923686  1.421063e-01 -0.001008501
## 2023-05-31  4.502915e-02 -0.0229987247  8.406584e-02  0.310008368
## 2023-06-30  9.014237e-02  0.0601922058  8.803154e-02  0.111729614
## 2023-07-31  1.270435e-02  0.0316350312 -3.125219e-02  0.099530696
## 2023-08-31 -4.330821e-02  0.0231419581  2.003590e-01  0.054674058
## 2023-09-29 -9.285934e-02 -0.0278695713 -3.128555e-02 -0.126218722
## 2023-10-31 -2.573202e-03 -0.0259401834  3.079840e-02 -0.064546102
## 2023-11-30  1.077597e-01  0.0532543195  6.669128e-02  0.137050101
## 2023-12-29  1.349105e-02 -0.0093210742 -1.383362e-02  0.057262978
## 2024-01-31 -4.314458e-02  0.0731822572  1.021456e-01  0.217059090
## 2024-02-29 -1.871724e-02  0.0647274438  1.565235e-01  0.251388377
## 2024-03-28 -5.264834e-02  0.0267993563  3.170722e-02  0.132939826
## 2024-04-30 -6.728824e-03 -0.0582360383  4.028065e-03 -0.044746470
## 2024-05-31  1.224143e-01  0.0435757000  5.071881e-02  0.238127504
## 2024-06-28  9.125886e-02 -0.0185100420  9.863583e-02  0.119508730
## 2024-07-31  5.298222e-02  0.0750381776 -1.184197e-01 -0.054220286
## 2024-08-30  3.184118e-02  0.0818899893  1.784154e-01  0.019883187
## 2024-09-30  1.731647e-02 -0.0334582327 -8.030491e-02  0.017277905
## 2024-10-31 -3.090179e-02 -0.0205015985 -6.553679e-02  0.089122711
## 2024-11-29  5.041450e-02  0.0687680680 -4.067542e-02  0.040520676
## 2024-12-31  5.368794e-02 -0.0635480045 -2.979764e-02 -0.028993151
## 2025-01-31 -5.930770e-02  0.0333888913  4.938217e-02 -0.111926733
## 2025-02-28  2.554335e-02  0.0919935800  1.284134e-01  0.039598590
## 2025-03-31 -8.501350e-02  0.0358406484 -1.085724e-01 -0.141937952
## 2025-04-30 -4.432080e-02  0.0012572042  8.474165e-02  0.004970100
## 2025-05-30 -5.507314e-02 -0.0564934745 -1.956832e-01  0.215623633
# Covariance of asset returns
covariance_matrix <- cov(asset_returns_wide_tbl)

covariance_matrix
##               AAPL        BRK-B          LLY         NVDA
## AAPL  0.0060274931 0.0013835487 0.0007584002 0.0049825234
## BRK-B 0.0013835487 0.0023801099 0.0006193406 0.0021070678
## LLY   0.0007584002 0.0006193406 0.0049061102 0.0005516572
## NVDA  0.0049825234 0.0021070678 0.0005516572 0.0149332801
# 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.25, 0.25)

sd_portfolio <- sqrt(t(w) %*% covariance_matrix %*% w)
sd_portfolio
##            [,1]
## [1,] 0.05536925
# 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       BRK-B         LLY      NVDA
## [1,] 0.01484575 0.007325892 0.007715821 0.0254818
rowSums(component_contribution)
## [1] 0.05536925
# Component contribution in percentage
component_percentages <- (component_contribution / sd_portfolio[1,1]) %>%
    round(3) %>%
    as_tibble()

component_percentages
## # A tibble: 1 × 4
##    AAPL `BRK-B`   LLY  NVDA
##   <dbl>   <dbl> <dbl> <dbl>
## 1 0.268   0.132 0.139  0.46
component_percentages %>%

    as_tibble() %>%
    gather(key = "asset", value = "contribution")
## # A tibble: 4 × 2
##   asset contribution
##   <chr>        <dbl>
## 1 AAPL         0.268
## 2 BRK-B        0.132
## 3 LLY          0.139
## 4 NVDA         0.46

4 Component Contribution with a Custom Function

# 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         BRK-B           LLY         NVDA
## 2013-01-31 -1.555889e-01  0.0775183366  8.489689e-02  0.000000000
## 2013-02-28 -2.561107e-02  0.0525511759  2.705486e-02  0.038221927
## 2013-03-28  2.850426e-03  0.0197718525  3.822822e-02  0.013338553
## 2013-04-30  2.710862e-04  0.0201413115 -2.514162e-02  0.070706060
## 2013-05-31  2.217146e-02  0.0703588808 -3.216759e-02  0.054652038
## 2013-06-28 -1.258957e-01 -0.0190279784 -7.904023e-02 -0.030167060
## 2013-07-31  1.321026e-01  0.0346845827  7.809864e-02  0.028091523
## 2013-08-30  8.044285e-02 -0.0409586640 -2.361994e-02  0.026270800
## 2013-09-30 -2.172388e-02  0.0203807249 -2.103656e-02  0.053460135
## 2013-10-31  9.201535e-02  0.0138234416 -1.018487e-02 -0.024066427
## 2013-11-29  6.770828e-02  0.0124343409  1.783297e-02  0.032035032
## 2013-12-31  8.862168e-03  0.0172704008  1.541257e-02  0.026567114
## 2014-01-31 -1.139490e-01 -0.0604981047  5.734364e-02 -0.020177310
## 2014-02-28  5.591821e-02  0.0367707918  1.076841e-01  0.162107480
## 2014-03-31  1.975634e-02  0.0763818902 -1.266205e-02 -0.025903716
## 2014-04-30  9.476089e-02  0.0305752662  4.069622e-03  0.030788203
## 2014-05-30  7.576524e-02 -0.0039660207  2.105804e-02  0.032886560
## 2014-06-30  2.728652e-02 -0.0139664791  3.786404e-02 -0.024508564
## 2014-07-31  2.832621e-02 -0.0089686483 -1.801558e-02 -0.057729642
## 2014-08-29  7.465190e-02  0.0900562439  4.814359e-02  0.110060197
## 2014-09-30 -1.722075e-02  0.0064635789  2.009274e-02 -0.052782742
## 2014-10-31  6.948904e-02  0.0145169941  2.256530e-02  0.057399254
## 2014-11-28  1.007307e-01  0.0590789648  3.387682e-02  0.074852052
## 2014-12-31 -7.460618e-02  0.0097711357  1.269054e-02 -0.044863554
## 2015-01-30  5.961153e-02 -0.0424466242  4.270445e-02 -0.043318925
## 2015-02-27  9.601602e-02  0.0240297153 -1.862789e-02  0.142699007
## 2015-03-31 -3.187421e-02 -0.0211847378  3.473280e-02 -0.052582641
## 2015-04-30  5.769642e-03 -0.0217849154 -1.079480e-02  0.058908678
## 2015-05-29  4.434137e-02  0.0125964386  1.002144e-01  0.001460207
## 2015-06-30 -3.793820e-02 -0.0493812434  5.654536e-02 -0.095717228
## 2015-07-31 -3.348119e-02  0.0475614452  1.214306e-02 -0.007988049
## 2015-08-31 -6.848874e-02 -0.0628866192 -1.988820e-02  0.123595803
## 2015-09-30 -2.205763e-02 -0.0275316101  1.614138e-02  0.092150905
## 2015-10-30  8.011218e-02  0.0421953625 -2.565839e-02  0.140555056
## 2015-11-30 -5.821071e-03 -0.0142907762  1.206612e-02  0.115405541
## 2015-12-31 -1.167906e-01 -0.0154063328  2.669995e-02  0.038347159
## 2016-01-29 -7.822327e-02 -0.0173411705 -6.319435e-02 -0.118048415
## 2016-02-29 -1.288245e-03  0.0333439533 -8.710620e-02  0.071923526
## 2016-03-31  1.197461e-01  0.0558740254  1.386597e-04  0.127654584
## 2016-04-29 -1.507313e-01  0.0250569264  4.772488e-02 -0.002810114
## 2016-05-31  6.931416e-02 -0.0345464928  1.400191e-05  0.276388136
## 2016-06-30 -4.359630e-02  0.0297922724  4.839024e-02  0.006187875
## 2016-07-29  8.623515e-02 -0.0035977969  5.123614e-02  0.194443936
## 2016-08-31  2.337665e-02  0.0422100997 -5.766433e-02  0.073468860
## 2016-09-30  6.344798e-02 -0.0408247913  3.177299e-02  0.110693613
## 2016-10-31  4.325107e-03 -0.0011773951 -8.337102e-02  0.037805131
## 2016-11-30 -2.183755e-02  0.0871499619 -8.889124e-02  0.260525524
## 2016-12-30  4.684074e-02  0.0345830189  9.148328e-02  0.146435791
## 2017-01-31  4.664179e-02  0.0070922508  4.622958e-02  0.022601822
## 2017-02-28  1.255552e-01  0.0433969563  7.906080e-02 -0.071874647
## 2017-03-31  4.754120e-02 -0.0280409122  1.557664e-02  0.070843335
## 2017-04-28 -6.948521e-05 -0.0088583300 -2.467453e-02 -0.043433778
## 2017-05-31  6.560764e-02  0.0004235654 -2.437753e-02  0.326022273
## 2017-06-30 -5.891599e-02  0.0244446441  3.373410e-02  0.001453519
## 2017-07-31  3.218010e-02  0.0325288956  4.364620e-03  0.117045067
## 2017-08-31  1.016534e-01  0.0347661013 -1.035474e-02  0.042639339
## 2017-09-29 -6.213505e-02  0.0118526607  5.096074e-02  0.053601347
## 2017-10-31  9.240405e-02  0.0195544232 -4.299686e-02  0.145700105
## 2017-11-30  2.007507e-02  0.0319542498  3.871522e-02 -0.029245053
## 2017-12-29 -1.536330e-02  0.0266355586 -2.128805e-03 -0.036583337
## 2018-01-31 -1.069346e-02  0.0783726329 -3.628855e-02  0.239240673
## 2018-02-28  6.596097e-02 -0.0340656684 -4.850942e-02 -0.014959067
## 2018-03-29 -5.980395e-02 -0.0379705364  4.534106e-03 -0.043969503
## 2018-04-30 -1.513355e-02 -0.0292485442  4.671392e-02 -0.029312710
## 2018-05-31  1.267420e-01 -0.0114209671  5.468067e-02  0.115145406
## 2018-06-29 -9.463111e-03 -0.0258092753  3.404270e-03 -0.062544586
## 2018-07-31  2.759896e-02  0.0583750521  1.466724e-01  0.033048454
## 2018-08-31  1.826735e-01  0.0533834219  7.244413e-02  0.137075495
## 2018-09-28 -8.337932e-03  0.0254962578  1.559008e-02  0.001210420
## 2018-10-31 -3.095150e-02 -0.0421150096  1.047525e-02 -0.287373676
## 2018-11-30 -1.999126e-01  0.0612205049  9.491876e-02 -0.253667309
## 2018-12-31 -1.240883e-01 -0.0665934780 -2.492042e-02 -0.202283349
## 2019-01-31  5.368663e-02  0.0066387077  3.515095e-02  0.073974105
## 2019-02-28  4.380283e-02 -0.0208442817  5.766179e-02  0.071593945
## 2019-03-29  9.260303e-02 -0.0020388563  2.710582e-02  0.151870234
## 2019-04-30  5.490056e-02  0.0758025937 -1.031710e-01  0.007987309
## 2019-05-31 -1.326324e-01 -0.0932266555 -3.848757e-03 -0.288679802
## 2019-06-28  1.226772e-01  0.0767565311 -4.543643e-02  0.192591612
## 2019-07-31  7.361716e-02 -0.0369846532 -1.674727e-02  0.026972505
## 2019-08-30 -1.659821e-02 -0.0098816430  4.182354e-02 -0.006207984
## 2019-09-30  7.042242e-02  0.0224105848 -1.014237e-02  0.038414211
## 2019-10-31  1.049767e-01  0.0216841473  1.877990e-02  0.143947114
## 2019-11-29  7.469384e-02  0.0356718709  3.513618e-02  0.076031703
## 2019-12-31  9.420369e-02  0.0277546773  1.133134e-01  0.082162838
## 2020-01-31  5.260223e-02 -0.0091811230  6.059333e-02  0.004790910
## 2020-02-28 -1.218306e-01 -0.0840385460 -9.658471e-02  0.133626966
## 2020-03-31 -7.231417e-02 -0.1209685066  9.514424e-02 -0.024248476
## 2020-04-30  1.444238e-01  0.0244751338  1.086427e-01  0.103279425
## 2020-05-29  8.166695e-02 -0.0095458373 -6.292367e-03  0.194461849
## 2020-06-30  1.374865e-01 -0.0388414745  7.085223e-02  0.068216607
## 2020-07-31  1.528340e-01  0.0923469823 -8.839652e-02  0.111189574
## 2020-08-31  1.960352e-01  0.1076869278 -7.860108e-03  0.231105476
## 2020-09-30 -1.081718e-01 -0.0236680541 -2.496381e-03  0.011895608
## 2020-10-30 -6.188818e-02 -0.0532379523 -1.262809e-01 -0.076501384
## 2020-11-30  9.120484e-02  0.1255564341  1.152646e-01  0.066921433
## 2020-12-31  1.084718e-01  0.0128479195  1.477452e-01 -0.025899898
## 2021-01-29 -5.516704e-03 -0.0174015793  2.084424e-01 -0.005010591
## 2021-02-26 -8.306872e-02  0.0539863764 -1.075323e-02  0.054293134
## 2021-03-31  7.312778e-03  0.0603433448 -9.232755e-02 -0.026723358
## 2021-04-30  7.345274e-02  0.0734843167 -2.191719e-02  0.117297965
## 2021-05-28 -5.181645e-02  0.0513587227  9.319720e-02  0.079071103
## 2021-06-30  9.450012e-02 -0.0406146793  1.389735e-01  0.208332107
## 2021-07-30  6.295829e-02  0.0013304153  5.912691e-02 -0.025494037
## 2021-08-31  4.161145e-02  0.0265234869  6.218971e-02  0.138204216
## 2021-09-30 -7.046199e-02 -0.0459352533 -1.114490e-01 -0.077484751
## 2021-10-29  5.700145e-02  0.0502650926  9.768794e-02  0.210396051
## 2021-11-30  9.991924e-02 -0.0366193376 -2.349035e-02  0.245338412
## 2021-12-31  7.160308e-02  0.0775458187  1.076079e-01 -0.105149757
## 2022-01-31 -1.583680e-02  0.0458234778 -1.183490e-01 -0.183267004
## 2022-02-28 -5.558234e-02  0.0265749974  2.257796e-02 -0.004133365
## 2022-03-31  5.588250e-02  0.0933710287  1.360237e-01  0.112575841
## 2022-04-29 -1.021778e-01 -0.0890872500  1.991432e-02 -0.386065745
## 2022-05-31 -5.603720e-02 -0.0214468721  7.377334e-02  0.006716946
## 2022-06-30 -8.493704e-02 -0.1461339429  3.384510e-02 -0.208219273
## 2022-07-29  1.728047e-01  0.0962354853  1.669950e-02  0.180792354
## 2022-08-31 -3.170534e-02 -0.0681378689 -8.701932e-02 -0.185089376
## 2022-09-30 -1.289443e-01 -0.0503191079  7.086121e-02 -0.217576787
## 2022-10-31  1.039557e-01  0.0999568613  1.131575e-01  0.106043979
## 2022-11-30 -3.358492e-02  0.0766560345  2.731050e-02  0.226461818
## 2022-12-30 -1.304191e-01 -0.0309188365 -1.422158e-02 -0.146693267
## 2023-01-31  1.048292e-01  0.0084459262 -6.111843e-02  0.290330082
## 2023-02-28  2.291831e-02 -0.0205617639 -9.734751e-02  0.172531530
## 2023-03-31  1.121214e-01  0.0116948851  9.845413e-02  0.179536387
## 2023-04-28  2.857515e-02  0.0620923686  1.421063e-01 -0.001008501
## 2023-05-31  4.502915e-02 -0.0229987247  8.406584e-02  0.310008368
## 2023-06-30  9.014237e-02  0.0601922058  8.803154e-02  0.111729614
## 2023-07-31  1.270435e-02  0.0316350312 -3.125219e-02  0.099530696
## 2023-08-31 -4.330821e-02  0.0231419581  2.003590e-01  0.054674058
## 2023-09-29 -9.285934e-02 -0.0278695713 -3.128555e-02 -0.126218722
## 2023-10-31 -2.573202e-03 -0.0259401834  3.079840e-02 -0.064546102
## 2023-11-30  1.077597e-01  0.0532543195  6.669128e-02  0.137050101
## 2023-12-29  1.349105e-02 -0.0093210742 -1.383362e-02  0.057262978
## 2024-01-31 -4.314458e-02  0.0731822572  1.021456e-01  0.217059090
## 2024-02-29 -1.871724e-02  0.0647274438  1.565235e-01  0.251388377
## 2024-03-28 -5.264834e-02  0.0267993563  3.170722e-02  0.132939826
## 2024-04-30 -6.728824e-03 -0.0582360383  4.028065e-03 -0.044746470
## 2024-05-31  1.224143e-01  0.0435757000  5.071881e-02  0.238127504
## 2024-06-28  9.125886e-02 -0.0185100420  9.863583e-02  0.119508730
## 2024-07-31  5.298222e-02  0.0750381776 -1.184197e-01 -0.054220286
## 2024-08-30  3.184118e-02  0.0818899893  1.784154e-01  0.019883187
## 2024-09-30  1.731647e-02 -0.0334582327 -8.030491e-02  0.017277905
## 2024-10-31 -3.090179e-02 -0.0205015985 -6.553679e-02  0.089122711
## 2024-11-29  5.041450e-02  0.0687680680 -4.067542e-02  0.040520676
## 2024-12-31  5.368794e-02 -0.0635480045 -2.979764e-02 -0.028993151
## 2025-01-31 -5.930770e-02  0.0333888913  4.938217e-02 -0.111926733
## 2025-02-28  2.554335e-02  0.0919935800  1.284134e-01  0.039598590
## 2025-03-31 -8.501350e-02  0.0358406484 -1.085724e-01 -0.141937952
## 2025-04-30 -4.432080e-02  0.0012572042  8.474165e-02  0.004970100
## 2025-05-30 -5.507314e-02 -0.0564934745 -1.956832e-01  0.215623633
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
        
# 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(0.25, 0.25, 0.25, 0.25)) 
## # A tibble: 1 × 4
##    AAPL `BRK-B`   LLY  NVDA
##   <dbl>   <dbl> <dbl> <dbl>
## 1 0.268   0.132 0.139  0.46

6 Plot: Colum Chart of Component Contribution and Weight

plot_data <- asset_returns_wide_tbl %>% 
    
    calculate_component_contribution(w = c(0.25, 0.25, 0.25, 0.25)) %>% 
    
    # Transform to long from 
    pivot_longer(cols = everything(), names_to = "Asset", values_to = "Contribution")  %>% 

    # Add weights 
    add_column(weight = c(0.25, 0.25, 0.25, 0.25)) %>% 
    
    # 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 Votality 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?

Nvidia is the biggest contributor to the portfolios volatility. The volatility is over 45% in this portfolio which means that the risk is concentrated in one asset. Since Nvidias weight is 25% and the volatility is over 45% it tells us that Nvidia is disproportionately influencing the portfolios risk.