# Load packages
# Core
library(tidyverse)
library(tidyquant)
library(readr)
# Time series
library(lubridate)
library(tibbletime)
# modeling
library(broom)
Examine how each asset contributes to portfolio standard deviation. This is to ensure that our risk is not concentrated in any one asset.
Choose your stocks from 2012-12-31 to present.
symbols <- c("TSLA", "NVDA", "LLY", "AMZN", "HD")
prices <- tq_get(x = symbols,
get. = "stock.prices",
from = "2012-12-31")
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
## AMZN HD LLY NVDA TSLA
## 2013-01-31 0.0566799395 0.0787855805 8.489712e-02 0.000000000 0.102078114
## 2013-02-28 -0.0046435024 0.0233358855 2.705456e-02 0.038221513 -0.074128640
## 2013-03-28 0.0083654162 0.0239971314 3.822824e-02 0.013339108 0.084208138
## 2013-04-30 -0.0487507497 0.0498948548 -2.514156e-02 0.070706276 0.354111531
## 2013-05-31 0.0588686246 0.0698921746 -3.216761e-02 0.054652115 0.593716684
## 2013-06-28 0.0310507506 -0.0103004231 -7.903986e-02 -0.030167233 0.093672163
## 2013-07-31 0.0813355350 0.0199370477 7.809887e-02 0.028091844 0.223739522
## 2013-08-30 -0.0695574090 -0.0591623464 -2.362021e-02 0.026270270 0.229971642
## 2013-09-30 0.1067688897 0.0233419569 -2.103667e-02 0.053460137 0.134706620
## 2013-10-31 0.1521839116 0.0265400746 -1.018513e-02 -0.024065963 -0.189806595
## 2013-11-29 0.0781496860 0.0350690543 1.783353e-02 0.032034692 -0.228409405
## 2013-12-31 0.0130490386 0.0253914958 1.541234e-02 0.026567172 0.167108541
## 2014-01-31 -0.1059765119 -0.0690018893 5.734350e-02 -0.020177573 0.187261714
## 2014-02-28 0.0094619003 0.0652297096 1.076841e-01 0.162107598 0.299722785
## 2014-03-31 -0.0737086161 -0.0302574407 -1.266180e-02 -0.025903793 -0.160783242
## 2014-04-30 -0.1007565303 0.0047910631 4.069215e-03 0.030788759 -0.002690122
## 2014-05-30 0.0273091844 0.0090144589 2.105822e-02 0.032886131 -0.000577422
## 2014-06-30 0.0383836202 0.0148881260 3.786395e-02 -0.024508072 0.144457224
## 2014-07-31 -0.0369768154 -0.0013585386 -1.801554e-02 -0.057730175 -0.072372676
## 2014-08-29 0.0799468404 0.1453653629 4.814403e-02 0.110060312 0.188794007
## 2014-09-30 -0.0502010184 -0.0139635206 2.009218e-02 -0.052782688 -0.105566477
## 2014-10-31 -0.0540982347 0.0610991125 2.256553e-02 0.057399140 -0.004046477
## 2014-11-28 0.1031187277 0.0190942578 3.387641e-02 0.074852212 0.011599801
## 2014-12-31 -0.0872368614 0.0592872117 1.269063e-02 -0.044863472 -0.094774519
## 2015-01-30 0.1330922557 -0.0052534645 4.270476e-02 -0.043319148 -0.088365289
## 2015-02-27 0.0697992426 0.0943348017 -1.862771e-02 0.142699554 -0.001277808
## 2015-03-31 -0.0214295755 -0.0048519856 3.473257e-02 -0.052583174 -0.074350051
## 2015-04-30 0.1253212736 -0.0601296655 -1.079447e-02 0.058908784 0.180226808
## 2015-05-29 0.0175090293 0.0406649062 1.002140e-01 0.001460290 0.103899574
## 2015-06-30 0.0112589814 0.0026915557 5.654548e-02 -0.095717239 0.067300935
## 2015-07-31 0.2111621090 0.0517293675 1.214306e-02 -0.007988006 -0.007896616
## 2015-08-31 -0.0443525782 -0.0048821783 -1.988827e-02 0.123595460 -0.066366250
## 2015-09-30 -0.0019516837 -0.0032848928 1.614119e-02 0.092150607 -0.002653519
## 2015-10-30 0.2010808743 0.0681898427 -2.565819e-02 0.140555330 -0.182659777
## 2015-11-30 0.0602956777 0.0795701487 1.206584e-02 0.115405542 0.106828586
## 2015-12-31 0.0165440008 -0.0078335466 2.670039e-02 0.038347433 0.041471519
## 2016-01-29 -0.1410054620 -0.0503184953 -6.319465e-02 -0.118048457 -0.227360626
## 2016-02-29 -0.0605352209 -0.0131265332 -8.710638e-02 0.071923552 0.003810669
## 2016-03-31 0.0717834363 0.0778121744 1.389809e-04 0.127654702 0.179948109
## 2016-04-29 0.1053453760 0.0034411838 4.772511e-02 -0.002810615 0.046721797
## 2016-05-31 0.0915002899 -0.0081431745 1.393417e-05 0.276388359 -0.075597968
## 2016-06-30 -0.0099694639 -0.0341049023 4.838980e-02 0.006188120 -0.050296440
## 2016-07-29 0.0586021229 0.0793859715 5.123622e-02 0.194443575 0.100785334
## 2016-08-31 0.0135476418 -0.0251416105 -5.766442e-02 0.073469073 -0.102058091
## 2016-09-30 0.0848953908 -0.0414059113 3.177311e-02 0.110693716 -0.038366372
## 2016-10-31 -0.0583893058 -0.0532257577 -8.337066e-02 0.037805174 -0.031364583
## 2016-11-30 -0.0509721927 0.0641009907 -8.889170e-02 0.260525342 -0.043041267
## 2016-12-30 -0.0009330556 0.0355282294 9.148371e-02 0.146435763 0.120665178
## 2017-01-31 0.0936394059 0.0257690309 4.622901e-02 0.022601931 0.164624916
## 2017-02-28 0.0258446800 0.0519075101 7.906108e-02 -0.071875032 -0.007730364
## 2017-03-31 0.0479423007 0.0192297507 1.557687e-02 0.070843928 0.107278727
## 2017-04-28 0.0424566944 0.0612211938 -2.467487e-02 -0.043434229 0.120916212
## 2017-05-31 0.0725778018 -0.0109686832 -2.437713e-02 0.326022081 0.082295892
## 2017-06-30 -0.0271286156 -0.0007168729 3.373402e-02 0.001453936 0.058654468
## 2017-07-31 0.0202278808 -0.0250835731 4.364586e-03 0.117044572 -0.111459860
## 2017-08-31 -0.0072953953 0.0076990369 -1.035472e-02 0.042639433 0.095543446
## 2017-09-29 -0.0198260355 0.0874118355 5.096115e-02 0.053601393 -0.042474144
## 2017-10-31 0.1395154056 0.0134815658 -4.299711e-02 0.145700324 -0.028457409
## 2017-11-30 0.0626577318 0.0863479744 3.871506e-02 -0.029244614 -0.070862541
## 2017-12-29 -0.0062057845 0.0525908069 -2.128887e-03 -0.036583630 0.008061928
## 2018-01-31 0.2156265497 0.0582602398 -3.628849e-02 0.239240651 0.129254571
## 2018-02-28 0.0415536279 -0.0973183345 -4.850983e-02 -0.014959119 -0.032266877
## 2018-03-29 -0.0440034760 -0.0166710245 4.534379e-03 -0.043969208 -0.253920408
## 2018-04-30 0.0788803060 0.0361430063 4.671388e-02 -0.029312665 0.099254576
## 2018-05-31 0.0397392430 0.0150079842 5.468055e-02 0.115145239 -0.031698139
## 2018-06-29 0.0421636787 0.0448130025 3.404422e-03 -0.062544961 0.186043257
## 2018-07-31 0.0446635734 0.0123278115 1.466727e-01 0.033048642 -0.140021491
## 2018-08-31 0.1243079079 0.0214328511 7.244375e-02 0.137075312 0.011737389
## 2018-09-28 -0.0048359814 0.0312831471 1.559043e-02 0.001210693 -0.130439038
## 2018-10-31 -0.2258869989 -0.1636413353 1.047531e-02 -0.287373430 0.242170576
## 2018-11-30 0.0560700324 0.0308953956 9.491841e-02 -0.253667493 0.038271580
## 2018-12-31 -0.1180514843 -0.0482856910 -2.492015e-02 -0.202283210 -0.051761952
## 2019-01-31 0.1348080312 0.0659305848 3.515073e-02 0.073974226 -0.080628789
## 2019-02-28 -0.0469930640 0.0087342823 5.766186e-02 0.071593579 0.041032981
## 2019-03-29 0.0824420184 0.0432287439 2.710577e-02 0.151870096 -0.133656413
## 2019-04-30 0.0786806224 0.0597260110 -1.031708e-01 0.007987759 -0.159123803
## 2019-05-31 -0.0818753491 -0.0704140582 -3.848666e-03 -0.288680000 -0.253945372
## 2019-06-28 0.0646557767 0.0981494315 -4.543640e-02 0.192591766 0.188012109
## 2019-07-31 -0.0142806686 0.0271324442 -1.674733e-02 0.026972519 0.078092373
## 2019-08-30 -0.0496880810 0.0644244893 4.182353e-02 -0.006208104 -0.068516948
## 2019-09-30 -0.0229951159 0.0239606846 -1.014252e-02 0.038414457 0.065449565
## 2019-10-31 0.0232034080 0.0109732050 1.877974e-02 0.143946699 0.268061253
## 2019-11-29 0.0134958216 -0.0618537975 3.513642e-02 0.076031764 0.046592176
## 2019-12-31 0.0257863501 -0.0033307626 1.133131e-01 0.082162638 0.237359743
## 2020-01-31 0.0834803026 0.0435475958 6.059348e-02 0.004791018 0.441578342
## 2020-02-28 -0.0642332026 -0.0460234778 -9.658469e-02 0.133627002 0.026424253
## 2020-03-31 0.0344213022 -0.1475358694 9.514446e-02 -0.024248334 -0.242781458
## 2020-04-30 0.2381504762 0.1632976614 1.086423e-01 0.103279176 0.400209535
## 2020-05-29 -0.0128673719 0.1225079435 -6.292163e-03 0.194461689 0.065730500
## 2020-06-30 0.1218341331 0.0140897538 7.085218e-02 0.068216916 0.257108657
## 2020-07-31 0.1372488933 0.0580786034 -8.839645e-02 0.111189641 0.281420674
## 2020-08-31 0.0866005735 0.0710521789 -7.860410e-03 0.231105278 0.554719320
## 2020-09-30 -0.0916533253 -0.0207923594 -2.496379e-03 0.011895710 -0.149762306
## 2020-10-30 -0.0364089187 -0.0404156635 -1.262807e-01 -0.076501590 -0.100371771
## 2020-11-30 0.0425228214 0.0393346232 1.152649e-01 0.066921881 0.380308519
## 2020-12-31 0.0276719582 -0.0379919849 1.477450e-01 -0.025900198 0.217730753
## 2021-01-29 -0.0156985929 0.0193875579 2.084424e-01 -0.005010506 0.117343701
## 2021-02-26 -0.0359675607 -0.0471776442 -1.075327e-02 0.054292972 -0.161038203
## 2021-03-31 0.0003717151 0.1731013333 -9.232745e-02 -0.026723169 -0.011269836
## 2021-04-30 0.1139202399 0.0585934264 -2.191735e-02 0.117297890 0.060292565
## 2021-05-28 -0.0730764715 -0.0148158470 9.319753e-02 0.079071092 -0.126372343
## 2021-06-30 0.0651836137 0.0051678766 1.389736e-01 0.208332102 0.083547955
## 2021-07-30 -0.0332696301 0.0287459340 5.912676e-02 -0.025494317 0.010973846
## 2021-08-31 0.0421339363 -0.0061432568 6.218971e-02 0.138204273 0.068224268
## 2021-09-30 -0.0550034409 0.0114279562 -1.114489e-01 -0.077484698 0.052632612
## 2021-10-29 0.0262547651 0.1243887728 9.768788e-02 0.210396241 0.362230202
## 2021-11-30 0.0391473463 0.0747937603 -2.349018e-02 0.245338158 0.027237848
## 2021-12-31 -0.0505062029 0.0394414951 1.076076e-01 -0.105149407 -0.079968440
## 2022-01-31 -0.1085098142 -0.1229951198 -1.183488e-01 -0.183267473 -0.120597475
## 2022-02-28 0.0263230079 -0.1501033424 2.257800e-02 -0.004133051 -0.073397011
## 2022-03-31 0.0596239190 -0.0476407982 1.360237e-01 0.112575617 0.213504290
## 2022-04-29 -0.2711856801 0.0035682560 1.991407e-02 -0.386065652 -0.213125289
## 2022-05-31 -0.0333130879 0.0077923694 7.377332e-02 0.006717222 -0.138340062
## 2022-06-30 -0.1238178226 -0.0924986100 3.384519e-02 -0.208219133 -0.118657126
## 2022-07-29 0.2394860591 0.0927979416 1.669969e-02 0.180792226 0.280480149
## 2022-08-31 -0.0625299224 -0.0359895717 -8.701939e-02 -0.185089363 -0.075250271
## 2022-09-30 -0.1149865758 -0.0442344303 7.086113e-02 -0.217576931 -0.038313992
## 2022-10-31 -0.0981105335 0.0706150102 1.131576e-01 0.106044206 -0.153346760
## 2022-11-30 -0.0593198454 0.0959456724 2.731045e-02 0.226461806 -0.155866121
## 2022-12-30 -0.1391406409 -0.0254135678 -1.422176e-02 -0.146693587 -0.457813194
## 2023-01-31 0.2051735029 0.0259688397 -6.111843e-02 0.290330101 0.340915767
## 2023-02-28 -0.0902516639 -0.0890859340 -9.734734e-02 0.172531518 0.171904973
## 2023-03-31 0.0918019370 0.0024155042 9.845420e-02 0.179536463 0.008471140
## 2023-04-28 0.0206963031 0.0181990107 1.421063e-01 -0.001008420 -0.233183710
## 2023-05-31 0.1340765703 -0.0513718827 8.406586e-02 0.310008200 0.216021889
## 2023-06-30 0.0779864104 0.0915989949 8.803166e-02 0.111729812 0.249689452
## 2023-07-31 0.0251489708 0.0720271694 -3.125237e-02 0.099530558 0.021391609
## 2023-08-31 0.0318772770 -0.0042951791 2.003590e-01 0.054674199 -0.035588260
## 2023-09-29 -0.0821945627 -0.0890445401 -3.128531e-02 -0.126218838 -0.030929027
## 2023-10-31 0.0458940197 -0.0595558249 3.079793e-02 -0.064546120 -0.219831983
## 2023-11-30 0.0931972815 0.1030589654 6.669140e-02 0.137050148 0.178463656
## 2023-12-29 0.0392628771 0.1002596770 -1.383355e-02 0.057262957 0.034390133
## 2024-01-31 0.0212288659 0.0183277320 1.021455e-01 0.217059118 -0.282704160
## 2024-02-29 0.1300782611 0.0754203799 1.565235e-01 0.251388512 0.075015304
## 2024-03-28 0.0202729146 0.0137883179 3.170727e-02 0.132939648 -0.138383423
## 2024-04-30 -0.0302797899 -0.1378009772 4.028099e-03 -0.044746491 0.041724969
## 2024-05-31 0.0081949152 0.0088705888 5.071880e-02 0.238127560 -0.028782134
## 2024-06-28 0.0910037984 0.0275966031 9.863581e-02 0.119508657 0.105427913
## 2024-07-31 -0.0329830511 0.0671786035 -1.184196e-01 -0.054220171 0.159378271
## 2024-08-30 -0.0464130352 0.0069786330 1.784153e-01 0.019883146 -0.080549177
## 2024-09-30 0.0429307038 0.0949400894 -8.030490e-02 0.017277928 0.200441406
## 2024-10-31 0.0003755644 -0.0286646042 -6.553687e-02 0.089122746 -0.046070548
## 2024-11-29 0.1091142212 0.0912959118 -4.067532e-02 0.040520595 0.323147326
## 2024-12-31 0.0538418744 -0.0982063372 -2.979764e-02 -0.028993106 0.157010663
## 2025-01-31 0.0800742352 0.0574212126 4.938212e-02 -0.111926736 0.001880189
## 2025-02-28 -0.1130190481 -0.0380465801 1.284135e-01 0.039598579 -0.322794555
## 2025-03-31 -0.1095146233 -0.0726309844 -1.085725e-01 -0.141937962 -0.122658739
## 2025-04-30 -0.0311757737 -0.0165070667 8.474170e-02 0.004970099 0.085028653
## 2025-05-30 0.1058429765 0.0214065498 -1.956833e-01 0.215623673 0.205293048
## 2025-06-30 0.0677922335 0.0017050787 5.519472e-02 0.156363856 -0.086785707
## 2025-07-31 0.0649401278 0.0023700608 -5.194642e-02 0.118521186 -0.030005653
## 2025-08-29 -0.0220690894 0.1014973623 -7.978192e-03 -0.020963769 0.079775694
## 2025-09-30 -0.0420508819 0.0017654749 4.068545e-02 0.068827324 0.286693192
## 2025-10-31 0.1063983418 -0.0652643857 1.229944e-01 0.081830418 0.026275247
## 2025-11-18 -0.0929176542 -0.1205529686 1.785777e-01 -0.110206520 -0.129135446
# Covariance of asset returns
covariance_matrix <- cov(asset_returns_wide_tbl)
covariance_matrix
## AMZN HD LLY NVDA TSLA
## AMZN 0.0071325413 0.0021292349 0.0005267214 0.0055429246 0.0053086270
## HD 0.0021292349 0.0037063381 0.0001517232 0.0027531188 0.0031679820
## LLY 0.0005267214 0.0001517232 0.0049948734 0.0004059497 0.0000911778
## NVDA 0.0055429246 0.0027531188 0.0004059497 0.0146658229 0.0063942691
## TSLA 0.0053086270 0.0031679820 0.0000911778 0.0063942691 0.0289838743
# 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.2, 0.2, 0.2, 0.2, 0.2)
sd_portfolio <- sqrt(t(w) %*% covariance_matrix %*% w)
sd_portfolio
## [,1]
## [1,] 0.06706024
# 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
## AMZN HD LLY NVDA TSLA
## [1,] 0.01231135 0.007103104 0.003680539 0.01775245 0.02621281
rowSums(component_contribution)
## [1] 0.06706024
# Component contribution in percentage
component_percentages <- (component_contribution / sd_portfolio[1,1]) %>%
round(3) %>%
as_tibble()
component_percentages
## # A tibble: 1 × 5
## AMZN HD LLY NVDA TSLA
## <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 0.184 0.106 0.055 0.265 0.391
component_percentages %>%
as_tibble() %>%
gather(key = "asset", value = "contribution")
## # A tibble: 5 × 2
## asset contribution
## <chr> <dbl>
## 1 AMZN 0.184
## 2 HD 0.106
## 3 LLY 0.055
## 4 NVDA 0.265
## 5 TSLA 0.391
asset_returns_wide_tbl <- asset_returns_tbl %>%
pivot_wider(names_from = asset, values_from = returns) %>%
column_to_rownames(var = "date")
asset_returns_wide_tbl
## AMZN HD LLY NVDA TSLA
## 2013-01-31 0.0566799395 0.0787855805 8.489712e-02 0.000000000 0.102078114
## 2013-02-28 -0.0046435024 0.0233358855 2.705456e-02 0.038221513 -0.074128640
## 2013-03-28 0.0083654162 0.0239971314 3.822824e-02 0.013339108 0.084208138
## 2013-04-30 -0.0487507497 0.0498948548 -2.514156e-02 0.070706276 0.354111531
## 2013-05-31 0.0588686246 0.0698921746 -3.216761e-02 0.054652115 0.593716684
## 2013-06-28 0.0310507506 -0.0103004231 -7.903986e-02 -0.030167233 0.093672163
## 2013-07-31 0.0813355350 0.0199370477 7.809887e-02 0.028091844 0.223739522
## 2013-08-30 -0.0695574090 -0.0591623464 -2.362021e-02 0.026270270 0.229971642
## 2013-09-30 0.1067688897 0.0233419569 -2.103667e-02 0.053460137 0.134706620
## 2013-10-31 0.1521839116 0.0265400746 -1.018513e-02 -0.024065963 -0.189806595
## 2013-11-29 0.0781496860 0.0350690543 1.783353e-02 0.032034692 -0.228409405
## 2013-12-31 0.0130490386 0.0253914958 1.541234e-02 0.026567172 0.167108541
## 2014-01-31 -0.1059765119 -0.0690018893 5.734350e-02 -0.020177573 0.187261714
## 2014-02-28 0.0094619003 0.0652297096 1.076841e-01 0.162107598 0.299722785
## 2014-03-31 -0.0737086161 -0.0302574407 -1.266180e-02 -0.025903793 -0.160783242
## 2014-04-30 -0.1007565303 0.0047910631 4.069215e-03 0.030788759 -0.002690122
## 2014-05-30 0.0273091844 0.0090144589 2.105822e-02 0.032886131 -0.000577422
## 2014-06-30 0.0383836202 0.0148881260 3.786395e-02 -0.024508072 0.144457224
## 2014-07-31 -0.0369768154 -0.0013585386 -1.801554e-02 -0.057730175 -0.072372676
## 2014-08-29 0.0799468404 0.1453653629 4.814403e-02 0.110060312 0.188794007
## 2014-09-30 -0.0502010184 -0.0139635206 2.009218e-02 -0.052782688 -0.105566477
## 2014-10-31 -0.0540982347 0.0610991125 2.256553e-02 0.057399140 -0.004046477
## 2014-11-28 0.1031187277 0.0190942578 3.387641e-02 0.074852212 0.011599801
## 2014-12-31 -0.0872368614 0.0592872117 1.269063e-02 -0.044863472 -0.094774519
## 2015-01-30 0.1330922557 -0.0052534645 4.270476e-02 -0.043319148 -0.088365289
## 2015-02-27 0.0697992426 0.0943348017 -1.862771e-02 0.142699554 -0.001277808
## 2015-03-31 -0.0214295755 -0.0048519856 3.473257e-02 -0.052583174 -0.074350051
## 2015-04-30 0.1253212736 -0.0601296655 -1.079447e-02 0.058908784 0.180226808
## 2015-05-29 0.0175090293 0.0406649062 1.002140e-01 0.001460290 0.103899574
## 2015-06-30 0.0112589814 0.0026915557 5.654548e-02 -0.095717239 0.067300935
## 2015-07-31 0.2111621090 0.0517293675 1.214306e-02 -0.007988006 -0.007896616
## 2015-08-31 -0.0443525782 -0.0048821783 -1.988827e-02 0.123595460 -0.066366250
## 2015-09-30 -0.0019516837 -0.0032848928 1.614119e-02 0.092150607 -0.002653519
## 2015-10-30 0.2010808743 0.0681898427 -2.565819e-02 0.140555330 -0.182659777
## 2015-11-30 0.0602956777 0.0795701487 1.206584e-02 0.115405542 0.106828586
## 2015-12-31 0.0165440008 -0.0078335466 2.670039e-02 0.038347433 0.041471519
## 2016-01-29 -0.1410054620 -0.0503184953 -6.319465e-02 -0.118048457 -0.227360626
## 2016-02-29 -0.0605352209 -0.0131265332 -8.710638e-02 0.071923552 0.003810669
## 2016-03-31 0.0717834363 0.0778121744 1.389809e-04 0.127654702 0.179948109
## 2016-04-29 0.1053453760 0.0034411838 4.772511e-02 -0.002810615 0.046721797
## 2016-05-31 0.0915002899 -0.0081431745 1.393417e-05 0.276388359 -0.075597968
## 2016-06-30 -0.0099694639 -0.0341049023 4.838980e-02 0.006188120 -0.050296440
## 2016-07-29 0.0586021229 0.0793859715 5.123622e-02 0.194443575 0.100785334
## 2016-08-31 0.0135476418 -0.0251416105 -5.766442e-02 0.073469073 -0.102058091
## 2016-09-30 0.0848953908 -0.0414059113 3.177311e-02 0.110693716 -0.038366372
## 2016-10-31 -0.0583893058 -0.0532257577 -8.337066e-02 0.037805174 -0.031364583
## 2016-11-30 -0.0509721927 0.0641009907 -8.889170e-02 0.260525342 -0.043041267
## 2016-12-30 -0.0009330556 0.0355282294 9.148371e-02 0.146435763 0.120665178
## 2017-01-31 0.0936394059 0.0257690309 4.622901e-02 0.022601931 0.164624916
## 2017-02-28 0.0258446800 0.0519075101 7.906108e-02 -0.071875032 -0.007730364
## 2017-03-31 0.0479423007 0.0192297507 1.557687e-02 0.070843928 0.107278727
## 2017-04-28 0.0424566944 0.0612211938 -2.467487e-02 -0.043434229 0.120916212
## 2017-05-31 0.0725778018 -0.0109686832 -2.437713e-02 0.326022081 0.082295892
## 2017-06-30 -0.0271286156 -0.0007168729 3.373402e-02 0.001453936 0.058654468
## 2017-07-31 0.0202278808 -0.0250835731 4.364586e-03 0.117044572 -0.111459860
## 2017-08-31 -0.0072953953 0.0076990369 -1.035472e-02 0.042639433 0.095543446
## 2017-09-29 -0.0198260355 0.0874118355 5.096115e-02 0.053601393 -0.042474144
## 2017-10-31 0.1395154056 0.0134815658 -4.299711e-02 0.145700324 -0.028457409
## 2017-11-30 0.0626577318 0.0863479744 3.871506e-02 -0.029244614 -0.070862541
## 2017-12-29 -0.0062057845 0.0525908069 -2.128887e-03 -0.036583630 0.008061928
## 2018-01-31 0.2156265497 0.0582602398 -3.628849e-02 0.239240651 0.129254571
## 2018-02-28 0.0415536279 -0.0973183345 -4.850983e-02 -0.014959119 -0.032266877
## 2018-03-29 -0.0440034760 -0.0166710245 4.534379e-03 -0.043969208 -0.253920408
## 2018-04-30 0.0788803060 0.0361430063 4.671388e-02 -0.029312665 0.099254576
## 2018-05-31 0.0397392430 0.0150079842 5.468055e-02 0.115145239 -0.031698139
## 2018-06-29 0.0421636787 0.0448130025 3.404422e-03 -0.062544961 0.186043257
## 2018-07-31 0.0446635734 0.0123278115 1.466727e-01 0.033048642 -0.140021491
## 2018-08-31 0.1243079079 0.0214328511 7.244375e-02 0.137075312 0.011737389
## 2018-09-28 -0.0048359814 0.0312831471 1.559043e-02 0.001210693 -0.130439038
## 2018-10-31 -0.2258869989 -0.1636413353 1.047531e-02 -0.287373430 0.242170576
## 2018-11-30 0.0560700324 0.0308953956 9.491841e-02 -0.253667493 0.038271580
## 2018-12-31 -0.1180514843 -0.0482856910 -2.492015e-02 -0.202283210 -0.051761952
## 2019-01-31 0.1348080312 0.0659305848 3.515073e-02 0.073974226 -0.080628789
## 2019-02-28 -0.0469930640 0.0087342823 5.766186e-02 0.071593579 0.041032981
## 2019-03-29 0.0824420184 0.0432287439 2.710577e-02 0.151870096 -0.133656413
## 2019-04-30 0.0786806224 0.0597260110 -1.031708e-01 0.007987759 -0.159123803
## 2019-05-31 -0.0818753491 -0.0704140582 -3.848666e-03 -0.288680000 -0.253945372
## 2019-06-28 0.0646557767 0.0981494315 -4.543640e-02 0.192591766 0.188012109
## 2019-07-31 -0.0142806686 0.0271324442 -1.674733e-02 0.026972519 0.078092373
## 2019-08-30 -0.0496880810 0.0644244893 4.182353e-02 -0.006208104 -0.068516948
## 2019-09-30 -0.0229951159 0.0239606846 -1.014252e-02 0.038414457 0.065449565
## 2019-10-31 0.0232034080 0.0109732050 1.877974e-02 0.143946699 0.268061253
## 2019-11-29 0.0134958216 -0.0618537975 3.513642e-02 0.076031764 0.046592176
## 2019-12-31 0.0257863501 -0.0033307626 1.133131e-01 0.082162638 0.237359743
## 2020-01-31 0.0834803026 0.0435475958 6.059348e-02 0.004791018 0.441578342
## 2020-02-28 -0.0642332026 -0.0460234778 -9.658469e-02 0.133627002 0.026424253
## 2020-03-31 0.0344213022 -0.1475358694 9.514446e-02 -0.024248334 -0.242781458
## 2020-04-30 0.2381504762 0.1632976614 1.086423e-01 0.103279176 0.400209535
## 2020-05-29 -0.0128673719 0.1225079435 -6.292163e-03 0.194461689 0.065730500
## 2020-06-30 0.1218341331 0.0140897538 7.085218e-02 0.068216916 0.257108657
## 2020-07-31 0.1372488933 0.0580786034 -8.839645e-02 0.111189641 0.281420674
## 2020-08-31 0.0866005735 0.0710521789 -7.860410e-03 0.231105278 0.554719320
## 2020-09-30 -0.0916533253 -0.0207923594 -2.496379e-03 0.011895710 -0.149762306
## 2020-10-30 -0.0364089187 -0.0404156635 -1.262807e-01 -0.076501590 -0.100371771
## 2020-11-30 0.0425228214 0.0393346232 1.152649e-01 0.066921881 0.380308519
## 2020-12-31 0.0276719582 -0.0379919849 1.477450e-01 -0.025900198 0.217730753
## 2021-01-29 -0.0156985929 0.0193875579 2.084424e-01 -0.005010506 0.117343701
## 2021-02-26 -0.0359675607 -0.0471776442 -1.075327e-02 0.054292972 -0.161038203
## 2021-03-31 0.0003717151 0.1731013333 -9.232745e-02 -0.026723169 -0.011269836
## 2021-04-30 0.1139202399 0.0585934264 -2.191735e-02 0.117297890 0.060292565
## 2021-05-28 -0.0730764715 -0.0148158470 9.319753e-02 0.079071092 -0.126372343
## 2021-06-30 0.0651836137 0.0051678766 1.389736e-01 0.208332102 0.083547955
## 2021-07-30 -0.0332696301 0.0287459340 5.912676e-02 -0.025494317 0.010973846
## 2021-08-31 0.0421339363 -0.0061432568 6.218971e-02 0.138204273 0.068224268
## 2021-09-30 -0.0550034409 0.0114279562 -1.114489e-01 -0.077484698 0.052632612
## 2021-10-29 0.0262547651 0.1243887728 9.768788e-02 0.210396241 0.362230202
## 2021-11-30 0.0391473463 0.0747937603 -2.349018e-02 0.245338158 0.027237848
## 2021-12-31 -0.0505062029 0.0394414951 1.076076e-01 -0.105149407 -0.079968440
## 2022-01-31 -0.1085098142 -0.1229951198 -1.183488e-01 -0.183267473 -0.120597475
## 2022-02-28 0.0263230079 -0.1501033424 2.257800e-02 -0.004133051 -0.073397011
## 2022-03-31 0.0596239190 -0.0476407982 1.360237e-01 0.112575617 0.213504290
## 2022-04-29 -0.2711856801 0.0035682560 1.991407e-02 -0.386065652 -0.213125289
## 2022-05-31 -0.0333130879 0.0077923694 7.377332e-02 0.006717222 -0.138340062
## 2022-06-30 -0.1238178226 -0.0924986100 3.384519e-02 -0.208219133 -0.118657126
## 2022-07-29 0.2394860591 0.0927979416 1.669969e-02 0.180792226 0.280480149
## 2022-08-31 -0.0625299224 -0.0359895717 -8.701939e-02 -0.185089363 -0.075250271
## 2022-09-30 -0.1149865758 -0.0442344303 7.086113e-02 -0.217576931 -0.038313992
## 2022-10-31 -0.0981105335 0.0706150102 1.131576e-01 0.106044206 -0.153346760
## 2022-11-30 -0.0593198454 0.0959456724 2.731045e-02 0.226461806 -0.155866121
## 2022-12-30 -0.1391406409 -0.0254135678 -1.422176e-02 -0.146693587 -0.457813194
## 2023-01-31 0.2051735029 0.0259688397 -6.111843e-02 0.290330101 0.340915767
## 2023-02-28 -0.0902516639 -0.0890859340 -9.734734e-02 0.172531518 0.171904973
## 2023-03-31 0.0918019370 0.0024155042 9.845420e-02 0.179536463 0.008471140
## 2023-04-28 0.0206963031 0.0181990107 1.421063e-01 -0.001008420 -0.233183710
## 2023-05-31 0.1340765703 -0.0513718827 8.406586e-02 0.310008200 0.216021889
## 2023-06-30 0.0779864104 0.0915989949 8.803166e-02 0.111729812 0.249689452
## 2023-07-31 0.0251489708 0.0720271694 -3.125237e-02 0.099530558 0.021391609
## 2023-08-31 0.0318772770 -0.0042951791 2.003590e-01 0.054674199 -0.035588260
## 2023-09-29 -0.0821945627 -0.0890445401 -3.128531e-02 -0.126218838 -0.030929027
## 2023-10-31 0.0458940197 -0.0595558249 3.079793e-02 -0.064546120 -0.219831983
## 2023-11-30 0.0931972815 0.1030589654 6.669140e-02 0.137050148 0.178463656
## 2023-12-29 0.0392628771 0.1002596770 -1.383355e-02 0.057262957 0.034390133
## 2024-01-31 0.0212288659 0.0183277320 1.021455e-01 0.217059118 -0.282704160
## 2024-02-29 0.1300782611 0.0754203799 1.565235e-01 0.251388512 0.075015304
## 2024-03-28 0.0202729146 0.0137883179 3.170727e-02 0.132939648 -0.138383423
## 2024-04-30 -0.0302797899 -0.1378009772 4.028099e-03 -0.044746491 0.041724969
## 2024-05-31 0.0081949152 0.0088705888 5.071880e-02 0.238127560 -0.028782134
## 2024-06-28 0.0910037984 0.0275966031 9.863581e-02 0.119508657 0.105427913
## 2024-07-31 -0.0329830511 0.0671786035 -1.184196e-01 -0.054220171 0.159378271
## 2024-08-30 -0.0464130352 0.0069786330 1.784153e-01 0.019883146 -0.080549177
## 2024-09-30 0.0429307038 0.0949400894 -8.030490e-02 0.017277928 0.200441406
## 2024-10-31 0.0003755644 -0.0286646042 -6.553687e-02 0.089122746 -0.046070548
## 2024-11-29 0.1091142212 0.0912959118 -4.067532e-02 0.040520595 0.323147326
## 2024-12-31 0.0538418744 -0.0982063372 -2.979764e-02 -0.028993106 0.157010663
## 2025-01-31 0.0800742352 0.0574212126 4.938212e-02 -0.111926736 0.001880189
## 2025-02-28 -0.1130190481 -0.0380465801 1.284135e-01 0.039598579 -0.322794555
## 2025-03-31 -0.1095146233 -0.0726309844 -1.085725e-01 -0.141937962 -0.122658739
## 2025-04-30 -0.0311757737 -0.0165070667 8.474170e-02 0.004970099 0.085028653
## 2025-05-30 0.1058429765 0.0214065498 -1.956833e-01 0.215623673 0.205293048
## 2025-06-30 0.0677922335 0.0017050787 5.519472e-02 0.156363856 -0.086785707
## 2025-07-31 0.0649401278 0.0023700608 -5.194642e-02 0.118521186 -0.030005653
## 2025-08-29 -0.0220690894 0.1014973623 -7.978192e-03 -0.020963769 0.079775694
## 2025-09-30 -0.0420508819 0.0017654749 4.068545e-02 0.068827324 0.286693192
## 2025-10-31 0.1063983418 -0.0652643857 1.229944e-01 0.081830418 0.026275247
## 2025-11-18 -0.0929176542 -0.1205529686 1.785777e-01 -0.110206520 -0.129135446
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 on 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(0.2, 0.2, 0.2, 0.2, 0.2))
## # A tibble: 1 × 5
## AMZN HD LLY NVDA TSLA
## <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 0.184 0.106 0.055 0.265 0.391
plot_data <- asset_returns_wide_tbl %>%
calculate_component_contribution(w = c(0.2, 0.2, 0.2, 0.2, 0.2)) %>%
# Transform to long form
pivot_longer(cols = everything(), names_to = "Asset", values_to = "Contribution") %>%
# Add weights
add_column(weight = c(0.2, 0.2, 0.2, 0.2, 0.2)) %>%
# 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 and Weight", y = "Percent", x = NULL)
Based on the results I have yielded, Tesla has the largest contribution to my portfolios volatility with a contribution of 39.10%
Although I had equal weights for all of the stocks, I do think that the portfolio’s risk is heavily concentrated in TSLA and NVDA, as they produce the most volatility. HD, LLY, and AMZN are my less volatile stocks, having less of a impact on the overall risk of the portfolio.