# Load packages
# Core
library(tidyverse)
library(tidyquant)
Examine how each asset contributes to portfolio standard deviation. This is to ensure that our risk is not concentrated in any one asset.
symbols <- c("BRK-B", "LLY", "NVDA", "AAPL")
prices <- tq_get(x = symbols,
get = "stock.prices",
from = "2012-12-31",
to = "2025-06-01")
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"))
# 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
# 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
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.