# Load packages
# 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.555893e-01  0.0566799395  0.0660632586  0.000000000  0.0248962168
## 2013-02-28 -2.561140e-02 -0.0046435024  0.0584794367  0.038222120  0.0117956058
## 2013-03-28  2.850694e-03  0.0083654162 -0.0087879622  0.013338504  0.0620735396
## 2013-04-30  2.712089e-04 -0.0487507497  0.0375394155  0.070705912  0.0378937598
## 2013-05-31  2.217140e-02  0.0588686246  0.0550324684  0.054652070 -0.0317798579
## 2013-06-28 -1.258957e-01  0.0310507506  0.0104477177 -0.030166835 -0.0046881535
## 2013-07-31  1.321023e-01  0.0813355350  0.0083479130  0.028091422  0.0452743948
## 2013-08-30  8.044301e-02 -0.0695574090 -0.0471075578  0.026270861 -0.0596998497
## 2013-09-30 -2.172366e-02  0.1067688897  0.0336806414  0.053460153  0.0133394429
## 2013-10-31  9.201546e-02  0.1521839116  0.1626137511 -0.024066004  0.0370285962
## 2013-11-29  6.770824e-02  0.0781496860  0.0277602965  0.032034482  0.0540191949
## 2013-12-31  8.861882e-03  0.0130490386  0.0560803550  0.026566918 -0.0232519252
## 2014-01-31 -1.139489e-01 -0.1059765119  0.0523737443 -0.020177211 -0.0523039124
## 2014-02-28  5.591787e-02  0.0094619003  0.0289427889  0.162107756  0.0002678933
## 2014-03-31  1.975654e-02 -0.0737086161 -0.0863761431 -0.025904064  0.0293256967
## 2014-04-30  9.476142e-02 -0.1007565303 -0.0559561430  0.030788586  0.0420197899
## 2014-05-30  7.576503e-02  0.0273091844  0.0611852061  0.032886358 -0.0314089103
## 2014-06-30  2.728629e-02  0.0383836202  0.0271165165 -0.024508257 -0.0223932503
## 2014-07-31  2.832645e-02 -0.0369768154 -0.0064175546 -0.057729900 -0.0200474185
## 2014-08-29  7.465131e-02  0.0799468404  0.0000000000  0.110060179  0.0323257367
## 2014-09-30 -1.722053e-02 -0.0502010184  0.0100265681 -0.052782835  0.0127660411
## 2014-10-31  6.948925e-02 -0.0540982347 -0.0321733827  0.057399308 -0.0026185588
## 2014-11-28  1.007303e-01  0.1031187277 -0.0313402397  0.074852208  0.1378157726
## 2014-12-31 -7.460594e-02 -0.0872368614 -0.0288909542 -0.044863451 -0.0135738377
## 2015-01-30  5.961145e-02  0.1330922557  0.0153077624 -0.043319070 -0.0105348532
## 2015-02-27  9.601619e-02  0.0697992426  0.0437064372  0.142698940 -0.0124329003
## 2015-03-31 -3.187470e-02 -0.0214295755 -0.0188003170 -0.052582503 -0.0142311748
## 2015-04-30  5.769910e-03  0.1253212736 -0.0169024509  0.058908761 -0.0524138927
## 2015-05-29  4.434146e-02  0.0175090293 -0.0097808463  0.001460428 -0.0433516287
## 2015-06-30 -3.793841e-02  0.0112589814 -0.0220411287 -0.095717445 -0.0460132900
## 2015-07-31 -3.348072e-02  0.2111621090  0.1839180810 -0.007988114  0.0146946154
## 2015-08-31 -6.848906e-02 -0.0443525782 -0.0118342473  0.123595579 -0.0993579597
## 2015-09-30 -2.205771e-02 -0.0019516837 -0.0160275192  0.092151037  0.0016976104
## 2015-10-30  8.011234e-02  0.2010808743  0.1555397941  0.140555370 -0.1246695070
## 2015-11-30 -5.821401e-03  0.0602956777  0.0437523642  0.115404974  0.0275686631
## 2015-12-31 -1.167902e-01  0.0165440008  0.0216861739  0.038347250  0.0492992595
## 2016-01-29 -7.822342e-02 -0.1410054620 -0.0212149969 -0.118048437  0.0793147120
## 2016-02-29 -1.288435e-03 -0.0605352209 -0.0627391508  0.071923701 -0.0003016804
## 2016-03-31  1.197463e-01  0.0717834363  0.0654275894  0.127654654  0.0392708212
## 2016-04-29 -1.507311e-01  0.1053453760 -0.0722726482 -0.002810493 -0.0239374458
## 2016-05-31  6.931398e-02  0.0915002899  0.0598050631  0.276388669  0.0641207582
## 2016-06-30 -4.359626e-02 -0.0099694639 -0.0611192226  0.006187796  0.0311572078
## 2016-07-29  8.623532e-02  0.0586021229  0.1050874397  0.194443523 -0.0006849941
## 2016-08-31  2.337661e-02  0.0135476418 -0.0022657966  0.073469238 -0.0143680021
## 2016-09-30  6.344805e-02  0.0848953908  0.0132614319  0.110693590  0.0094735830
## 2016-10-31  4.325076e-03 -0.0583893058  0.0092841065  0.037805166 -0.0295506806
## 2016-11-30 -2.183764e-02 -0.0509721927 -0.0343614160  0.260525638  0.0058383964
## 2016-12-30  4.684072e-02 -0.0009330556  0.0180152337  0.146435672 -0.0116432511
## 2017-01-31  4.664156e-02  0.0936394059  0.0318397939  0.022601815 -0.0350402978
## 2017-02-28  1.255557e-01  0.0258446800  0.0326201874 -0.071875004  0.0608894352
## 2017-03-31  4.754108e-02  0.0479423007  0.0076841239  0.070843930  0.0234088442
## 2017-04-28 -6.977478e-05  0.0424566944  0.0880996386 -0.043434291  0.0421087994
## 2017-05-31  6.560766e-02  0.0725778018  0.0629878767  0.326022403  0.0511561772
## 2017-06-30 -5.891584e-02 -0.0271286156 -0.0599350111  0.001453652 -0.0378578449
## 2017-07-31  3.218045e-02  0.0202278808  0.0236740807  0.117044754  0.0553879431
## 2017-08-31  1.016530e-01 -0.0072953953  0.0094447756  0.042639643 -0.0180254918
## 2017-09-29 -6.213515e-02 -0.0198260355  0.0208389738  0.053600873  0.0008960302
## 2017-10-31  9.240402e-02  0.1395154056  0.0582525835  0.145700376  0.1109631735
## 2017-11-30  2.007536e-02  0.0626577318  0.0046809400 -0.029244659  0.1076142271
## 2017-12-29 -1.536389e-02 -0.0062057845  0.0241716390 -0.036583415  0.0207686265
## 2018-01-31 -1.069325e-02  0.2156265497  0.1115967900  0.239240425  0.0764918362
## 2018-02-28  6.596114e-02  0.0415536279 -0.0573515298 -0.014958941 -0.1691627134
## 2018-03-29 -5.980388e-02 -0.0440034760 -0.0683057993 -0.043969299 -0.0056772594
## 2018-04-30 -1.513379e-02  0.0788803060 -0.0141136248 -0.029312706 -0.0057487508
## 2018-05-31  1.267419e-01  0.0397392430  0.0643892525  0.115144994 -0.0629873580
## 2018-06-29 -9.462655e-03  0.0421636787  0.0278664064 -0.062544363  0.0369861571
## 2018-07-31  2.759863e-02  0.0446635734  0.0871652441  0.033048279  0.0409483750
## 2018-08-31  1.826735e-01  0.1243079079  0.0007637297  0.137075562  0.0774626366
## 2018-09-28 -8.337669e-03 -0.0048359814 -0.0205011057  0.001210483 -0.0205518197
## 2018-10-31 -3.095166e-02 -0.2258869989 -0.1028992086 -0.287373770  0.0656292062
## 2018-11-30 -1.999122e-01  0.0560700324  0.0162678540 -0.253667185 -0.0265762865
## 2018-12-31 -1.240889e-01 -0.1180514843 -0.0552431428 -0.202283265 -0.0417365402
## 2019-01-31  5.368670e-02  0.1348080312  0.0750918489  0.073974193  0.0283646139
## 2019-02-28  4.380306e-02 -0.0469930640  0.0031747966  0.071593830  0.0324429588
## 2019-03-29  9.260240e-02  0.0824420184  0.0465715591  0.151869806 -0.0094924230
## 2019-04-30  5.490125e-02  0.0786806224  0.0128464230  0.007987920  0.0530144580
## 2019-05-31 -1.326323e-01 -0.0818753491 -0.0740704753 -0.288680103 -0.0084087282
## 2019-06-28  1.226771e-01  0.0646557767 -0.0208013947  0.192591572  0.0854574889
## 2019-07-31  7.361706e-02 -0.0142806686  0.1183224942  0.026972518 -0.0009964164
## 2019-08-30 -1.659825e-02 -0.0496880810 -0.0237704414 -0.006208037  0.0394583480
## 2019-09-30  7.042265e-02 -0.0229951159  0.0256755038  0.038414564  0.0379542679
## 2019-10-31  1.049764e-01  0.0232034080  0.0331681707  0.143946905 -0.0120372427
## 2019-11-29  7.469385e-02  0.0134958216  0.0349733820  0.076031451  0.0154856317
## 2019-12-31  9.420378e-02  0.0257863501  0.0242707879  0.082162920  0.0023741933
## 2020-01-31  5.260187e-02  0.0834803026  0.0701848929  0.004791025 -0.0372904658
## 2020-02-28 -1.218305e-01 -0.0642332026 -0.0684586298  0.133626792 -0.0613239258
## 2020-03-31 -7.231396e-02  0.0344213022 -0.1413300093 -0.024248274  0.0581107980
## 2020-04-30  1.444238e-01  0.2381504762  0.1482719939  0.103279417  0.0674663177
## 2020-05-29  8.166666e-02 -0.0128673719  0.0578074784  0.194461744  0.0248289872
## 2020-06-30  1.374867e-01  0.1218341331 -0.0107722179  0.068216635 -0.0351088209
## 2020-07-31  1.528341e-01  0.1372488933  0.0478934005  0.111189768  0.0772515271
## 2020-08-31  1.960348e-01  0.0866005735  0.0971010982  0.231105347  0.0745886119
## 2020-09-30 -1.081715e-01 -0.0916533253 -0.1061509749  0.011895570  0.0076051284
## 2020-10-30 -6.188818e-02 -0.0364089187  0.0980591875 -0.076501388 -0.0083255549
## 2020-11-30  9.120458e-02  0.0425228214  0.0826847480  0.066921655  0.0963905535
## 2020-12-31  1.084721e-01  0.0276719582 -0.0050447089 -0.025900001 -0.0545612688
## 2021-01-29 -5.516635e-03 -0.0156985929  0.0467582140 -0.005010758 -0.0257179769
## 2021-02-26 -8.306887e-02 -0.0359675607  0.1039617314  0.054293167 -0.0782177280
## 2021-03-31  7.312910e-03  0.0003717151  0.0154771604 -0.026723279  0.0486519211
## 2021-04-30  7.345286e-02  0.1139202399  0.1527899045  0.117297942  0.0295951900
## 2021-05-28 -5.181684e-02 -0.0730764715  0.0005973616  0.079070949  0.0189585343
## 2021-06-30  9.449999e-02  0.0651836137  0.0385416543  0.208332102 -0.0071365607
## 2021-07-30  6.295842e-02 -0.0332696301  0.0760718956 -0.025493877  0.0107911374
## 2021-08-31  4.161158e-02  0.0421339363  0.0730045198  0.138204106  0.0418677795
## 2021-09-30 -7.046171e-02 -0.0550034409 -0.0875715395 -0.077484743 -0.0606836171
## 2021-10-29  5.700122e-02  0.0262547651  0.1066949681  0.210396015  0.0695571816
## 2021-11-30  9.991933e-02  0.0391473463 -0.0400333073  0.245338505 -0.0606288156
## 2021-12-31  7.160282e-02 -0.0505062029  0.0155159766 -0.105149624  0.0324795417
## 2022-01-31 -1.583690e-02 -0.1085098142 -0.0640854435 -0.183267241 -0.0343094247
## 2022-02-28 -5.558233e-02  0.0263230079 -0.0059685045 -0.004133273 -0.0338249542
## 2022-03-31  5.588247e-02  0.0596239190  0.0346686578  0.112575897  0.1008102547
## 2022-04-29 -1.021775e-01 -0.2711856801 -0.1944949638 -0.386065775  0.0269631560
## 2022-05-31 -5.603732e-02 -0.0333130879 -0.0081002558  0.006717245 -0.1698039395
## 2022-06-30 -8.493673e-02 -0.1238178226 -0.0417810023 -0.208219376 -0.0563675846
## 2022-07-29  1.728045e-01  0.2394860591  0.0643327037  0.180791929  0.0826081279
## 2022-08-31 -3.170543e-02 -0.0625299224 -0.0663691027 -0.185089160  0.0081251861
## 2022-09-30 -1.289444e-01 -0.1149865758 -0.1268136323 -0.217576886 -0.0217359545
## 2022-10-31  1.039559e-01 -0.0981105335 -0.0156178797  0.106044018  0.0929241833
## 2022-11-30 -3.358532e-02 -0.0593198454  0.0692744160  0.226462028  0.0684914841
## 2022-12-30 -1.304191e-01 -0.1391406409 -0.1339678993 -0.146693561 -0.0685298754
## 2023-01-31  1.048292e-01  0.2051735029  0.1182712047  0.290330125  0.0145630113
## 2023-02-28  2.291852e-02 -0.0902516639 -0.1007318734  0.172531559 -0.0121680333
## 2023-03-31  1.121214e-01  0.0918019370  0.1412534910  0.179536548  0.0408372088
## 2023-04-28  2.857495e-02  0.0206963031  0.0397752355 -0.001008544  0.0235919310
## 2023-05-31  4.502928e-02  0.1340765703  0.1310218349  0.310008260 -0.0237415484
## 2023-06-30  9.014221e-02  0.0779864104 -0.0196454416  0.111729726  0.0678437059
## 2023-07-31  1.270449e-02  0.0251489708  0.0956332795  0.099530518  0.0169068382
## 2023-08-31 -4.330819e-02  0.0318772770  0.0313565693  0.054674262  0.0206048836
## 2023-09-29 -9.285932e-02 -0.0821945627 -0.0408675029 -0.126218876 -0.0166184904
## 2023-10-31 -2.573206e-03  0.0458940197 -0.0509540273 -0.064546100  0.0215261056
## 2023-11-30  1.077597e-01  0.0931972815  0.0665317006  0.137050237 -0.0483955454
## 2023-12-29  1.349114e-02  0.0392628771  0.0510207183  0.057262949  0.0162177594
## 2024-01-31 -4.314466e-02  0.0212288659  0.0061543397  0.217059054  0.0470820679
## 2024-02-29 -1.871727e-02  0.1300782611 -0.0143479204  0.251388463  0.0620581657
## 2024-03-28 -5.264818e-02  0.0202729146  0.0855198700  0.132939782  0.0296685688
## 2024-04-30 -6.728849e-03 -0.0302797899  0.0781716797 -0.044746618 -0.0137217860
## 2024-05-31  1.224142e-01  0.0081949152  0.0550640990  0.238127666  0.1060150534
## 2024-06-28  9.125897e-02  0.0910037984  0.0540905131  0.119508665  0.0292221364
## 2024-07-31  5.298220e-02 -0.0329830511 -0.0576203452 -0.054220172  0.0136415209
## 2024-08-30  3.184114e-02 -0.0464130352 -0.0475462855  0.019883127  0.1207589765
## 2024-09-30  1.731646e-02  0.0429307038  0.0138344637  0.017277918  0.0445699361
## 2024-10-31 -3.090179e-02  0.0003755644  0.0323671889  0.089122612  0.0147513058
## 2024-11-19  1.153584e-02  0.0932108617  0.0391227076  0.101957629  0.0551905300
# Covariance of asset returns
covariance_matrix <- cov(asset_returns_wide_tbl)

covariance_matrix
##             AAPL         AMZN         GOOG        NVDA          WMT
## AAPL 0.006084879 0.0032624087 0.0020724227 0.005064270 0.0011758124
## AMZN 0.003262409 0.0071603669 0.0034772759 0.005623296 0.0008307755
## GOOG 0.002072423 0.0034772759 0.0042259003 0.003930480 0.0005041197
## NVDA 0.005064270 0.0056232960 0.0039304802 0.014924338 0.0013831181
## WMT  0.001175812 0.0008307755 0.0005041197 0.001383118 0.0026338258
# 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.06435807
# 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.01507869 0.01751484 0.009537616 0.02045172 0.001775189
rowSums(component_contribution)
## [1] 0.06435807
# 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.234 0.272 0.148 0.318 0.028
component_percentages %>%

    as_tibble() %>%
    gather(key = "asset", value = "contribution")
## # A tibble: 5 × 2
##   asset contribution
##   <chr>        <dbl>
## 1 AAPL         0.234
## 2 AMZN         0.272
## 3 GOOG         0.148
## 4 NVDA         0.318
## 5 WMT          0.028
# 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.555893e-01  0.0566799395  0.0660632586  0.000000000  0.0248962168
## 2013-02-28 -2.561140e-02 -0.0046435024  0.0584794367  0.038222120  0.0117956058
## 2013-03-28  2.850694e-03  0.0083654162 -0.0087879622  0.013338504  0.0620735396
## 2013-04-30  2.712089e-04 -0.0487507497  0.0375394155  0.070705912  0.0378937598
## 2013-05-31  2.217140e-02  0.0588686246  0.0550324684  0.054652070 -0.0317798579
## 2013-06-28 -1.258957e-01  0.0310507506  0.0104477177 -0.030166835 -0.0046881535
## 2013-07-31  1.321023e-01  0.0813355350  0.0083479130  0.028091422  0.0452743948
## 2013-08-30  8.044301e-02 -0.0695574090 -0.0471075578  0.026270861 -0.0596998497
## 2013-09-30 -2.172366e-02  0.1067688897  0.0336806414  0.053460153  0.0133394429
## 2013-10-31  9.201546e-02  0.1521839116  0.1626137511 -0.024066004  0.0370285962
## 2013-11-29  6.770824e-02  0.0781496860  0.0277602965  0.032034482  0.0540191949
## 2013-12-31  8.861882e-03  0.0130490386  0.0560803550  0.026566918 -0.0232519252
## 2014-01-31 -1.139489e-01 -0.1059765119  0.0523737443 -0.020177211 -0.0523039124
## 2014-02-28  5.591787e-02  0.0094619003  0.0289427889  0.162107756  0.0002678933
## 2014-03-31  1.975654e-02 -0.0737086161 -0.0863761431 -0.025904064  0.0293256967
## 2014-04-30  9.476142e-02 -0.1007565303 -0.0559561430  0.030788586  0.0420197899
## 2014-05-30  7.576503e-02  0.0273091844  0.0611852061  0.032886358 -0.0314089103
## 2014-06-30  2.728629e-02  0.0383836202  0.0271165165 -0.024508257 -0.0223932503
## 2014-07-31  2.832645e-02 -0.0369768154 -0.0064175546 -0.057729900 -0.0200474185
## 2014-08-29  7.465131e-02  0.0799468404  0.0000000000  0.110060179  0.0323257367
## 2014-09-30 -1.722053e-02 -0.0502010184  0.0100265681 -0.052782835  0.0127660411
## 2014-10-31  6.948925e-02 -0.0540982347 -0.0321733827  0.057399308 -0.0026185588
## 2014-11-28  1.007303e-01  0.1031187277 -0.0313402397  0.074852208  0.1378157726
## 2014-12-31 -7.460594e-02 -0.0872368614 -0.0288909542 -0.044863451 -0.0135738377
## 2015-01-30  5.961145e-02  0.1330922557  0.0153077624 -0.043319070 -0.0105348532
## 2015-02-27  9.601619e-02  0.0697992426  0.0437064372  0.142698940 -0.0124329003
## 2015-03-31 -3.187470e-02 -0.0214295755 -0.0188003170 -0.052582503 -0.0142311748
## 2015-04-30  5.769910e-03  0.1253212736 -0.0169024509  0.058908761 -0.0524138927
## 2015-05-29  4.434146e-02  0.0175090293 -0.0097808463  0.001460428 -0.0433516287
## 2015-06-30 -3.793841e-02  0.0112589814 -0.0220411287 -0.095717445 -0.0460132900
## 2015-07-31 -3.348072e-02  0.2111621090  0.1839180810 -0.007988114  0.0146946154
## 2015-08-31 -6.848906e-02 -0.0443525782 -0.0118342473  0.123595579 -0.0993579597
## 2015-09-30 -2.205771e-02 -0.0019516837 -0.0160275192  0.092151037  0.0016976104
## 2015-10-30  8.011234e-02  0.2010808743  0.1555397941  0.140555370 -0.1246695070
## 2015-11-30 -5.821401e-03  0.0602956777  0.0437523642  0.115404974  0.0275686631
## 2015-12-31 -1.167902e-01  0.0165440008  0.0216861739  0.038347250  0.0492992595
## 2016-01-29 -7.822342e-02 -0.1410054620 -0.0212149969 -0.118048437  0.0793147120
## 2016-02-29 -1.288435e-03 -0.0605352209 -0.0627391508  0.071923701 -0.0003016804
## 2016-03-31  1.197463e-01  0.0717834363  0.0654275894  0.127654654  0.0392708212
## 2016-04-29 -1.507311e-01  0.1053453760 -0.0722726482 -0.002810493 -0.0239374458
## 2016-05-31  6.931398e-02  0.0915002899  0.0598050631  0.276388669  0.0641207582
## 2016-06-30 -4.359626e-02 -0.0099694639 -0.0611192226  0.006187796  0.0311572078
## 2016-07-29  8.623532e-02  0.0586021229  0.1050874397  0.194443523 -0.0006849941
## 2016-08-31  2.337661e-02  0.0135476418 -0.0022657966  0.073469238 -0.0143680021
## 2016-09-30  6.344805e-02  0.0848953908  0.0132614319  0.110693590  0.0094735830
## 2016-10-31  4.325076e-03 -0.0583893058  0.0092841065  0.037805166 -0.0295506806
## 2016-11-30 -2.183764e-02 -0.0509721927 -0.0343614160  0.260525638  0.0058383964
## 2016-12-30  4.684072e-02 -0.0009330556  0.0180152337  0.146435672 -0.0116432511
## 2017-01-31  4.664156e-02  0.0936394059  0.0318397939  0.022601815 -0.0350402978
## 2017-02-28  1.255557e-01  0.0258446800  0.0326201874 -0.071875004  0.0608894352
## 2017-03-31  4.754108e-02  0.0479423007  0.0076841239  0.070843930  0.0234088442
## 2017-04-28 -6.977478e-05  0.0424566944  0.0880996386 -0.043434291  0.0421087994
## 2017-05-31  6.560766e-02  0.0725778018  0.0629878767  0.326022403  0.0511561772
## 2017-06-30 -5.891584e-02 -0.0271286156 -0.0599350111  0.001453652 -0.0378578449
## 2017-07-31  3.218045e-02  0.0202278808  0.0236740807  0.117044754  0.0553879431
## 2017-08-31  1.016530e-01 -0.0072953953  0.0094447756  0.042639643 -0.0180254918
## 2017-09-29 -6.213515e-02 -0.0198260355  0.0208389738  0.053600873  0.0008960302
## 2017-10-31  9.240402e-02  0.1395154056  0.0582525835  0.145700376  0.1109631735
## 2017-11-30  2.007536e-02  0.0626577318  0.0046809400 -0.029244659  0.1076142271
## 2017-12-29 -1.536389e-02 -0.0062057845  0.0241716390 -0.036583415  0.0207686265
## 2018-01-31 -1.069325e-02  0.2156265497  0.1115967900  0.239240425  0.0764918362
## 2018-02-28  6.596114e-02  0.0415536279 -0.0573515298 -0.014958941 -0.1691627134
## 2018-03-29 -5.980388e-02 -0.0440034760 -0.0683057993 -0.043969299 -0.0056772594
## 2018-04-30 -1.513379e-02  0.0788803060 -0.0141136248 -0.029312706 -0.0057487508
## 2018-05-31  1.267419e-01  0.0397392430  0.0643892525  0.115144994 -0.0629873580
## 2018-06-29 -9.462655e-03  0.0421636787  0.0278664064 -0.062544363  0.0369861571
## 2018-07-31  2.759863e-02  0.0446635734  0.0871652441  0.033048279  0.0409483750
## 2018-08-31  1.826735e-01  0.1243079079  0.0007637297  0.137075562  0.0774626366
## 2018-09-28 -8.337669e-03 -0.0048359814 -0.0205011057  0.001210483 -0.0205518197
## 2018-10-31 -3.095166e-02 -0.2258869989 -0.1028992086 -0.287373770  0.0656292062
## 2018-11-30 -1.999122e-01  0.0560700324  0.0162678540 -0.253667185 -0.0265762865
## 2018-12-31 -1.240889e-01 -0.1180514843 -0.0552431428 -0.202283265 -0.0417365402
## 2019-01-31  5.368670e-02  0.1348080312  0.0750918489  0.073974193  0.0283646139
## 2019-02-28  4.380306e-02 -0.0469930640  0.0031747966  0.071593830  0.0324429588
## 2019-03-29  9.260240e-02  0.0824420184  0.0465715591  0.151869806 -0.0094924230
## 2019-04-30  5.490125e-02  0.0786806224  0.0128464230  0.007987920  0.0530144580
## 2019-05-31 -1.326323e-01 -0.0818753491 -0.0740704753 -0.288680103 -0.0084087282
## 2019-06-28  1.226771e-01  0.0646557767 -0.0208013947  0.192591572  0.0854574889
## 2019-07-31  7.361706e-02 -0.0142806686  0.1183224942  0.026972518 -0.0009964164
## 2019-08-30 -1.659825e-02 -0.0496880810 -0.0237704414 -0.006208037  0.0394583480
## 2019-09-30  7.042265e-02 -0.0229951159  0.0256755038  0.038414564  0.0379542679
## 2019-10-31  1.049764e-01  0.0232034080  0.0331681707  0.143946905 -0.0120372427
## 2019-11-29  7.469385e-02  0.0134958216  0.0349733820  0.076031451  0.0154856317
## 2019-12-31  9.420378e-02  0.0257863501  0.0242707879  0.082162920  0.0023741933
## 2020-01-31  5.260187e-02  0.0834803026  0.0701848929  0.004791025 -0.0372904658
## 2020-02-28 -1.218305e-01 -0.0642332026 -0.0684586298  0.133626792 -0.0613239258
## 2020-03-31 -7.231396e-02  0.0344213022 -0.1413300093 -0.024248274  0.0581107980
## 2020-04-30  1.444238e-01  0.2381504762  0.1482719939  0.103279417  0.0674663177
## 2020-05-29  8.166666e-02 -0.0128673719  0.0578074784  0.194461744  0.0248289872
## 2020-06-30  1.374867e-01  0.1218341331 -0.0107722179  0.068216635 -0.0351088209
## 2020-07-31  1.528341e-01  0.1372488933  0.0478934005  0.111189768  0.0772515271
## 2020-08-31  1.960348e-01  0.0866005735  0.0971010982  0.231105347  0.0745886119
## 2020-09-30 -1.081715e-01 -0.0916533253 -0.1061509749  0.011895570  0.0076051284
## 2020-10-30 -6.188818e-02 -0.0364089187  0.0980591875 -0.076501388 -0.0083255549
## 2020-11-30  9.120458e-02  0.0425228214  0.0826847480  0.066921655  0.0963905535
## 2020-12-31  1.084721e-01  0.0276719582 -0.0050447089 -0.025900001 -0.0545612688
## 2021-01-29 -5.516635e-03 -0.0156985929  0.0467582140 -0.005010758 -0.0257179769
## 2021-02-26 -8.306887e-02 -0.0359675607  0.1039617314  0.054293167 -0.0782177280
## 2021-03-31  7.312910e-03  0.0003717151  0.0154771604 -0.026723279  0.0486519211
## 2021-04-30  7.345286e-02  0.1139202399  0.1527899045  0.117297942  0.0295951900
## 2021-05-28 -5.181684e-02 -0.0730764715  0.0005973616  0.079070949  0.0189585343
## 2021-06-30  9.449999e-02  0.0651836137  0.0385416543  0.208332102 -0.0071365607
## 2021-07-30  6.295842e-02 -0.0332696301  0.0760718956 -0.025493877  0.0107911374
## 2021-08-31  4.161158e-02  0.0421339363  0.0730045198  0.138204106  0.0418677795
## 2021-09-30 -7.046171e-02 -0.0550034409 -0.0875715395 -0.077484743 -0.0606836171
## 2021-10-29  5.700122e-02  0.0262547651  0.1066949681  0.210396015  0.0695571816
## 2021-11-30  9.991933e-02  0.0391473463 -0.0400333073  0.245338505 -0.0606288156
## 2021-12-31  7.160282e-02 -0.0505062029  0.0155159766 -0.105149624  0.0324795417
## 2022-01-31 -1.583690e-02 -0.1085098142 -0.0640854435 -0.183267241 -0.0343094247
## 2022-02-28 -5.558233e-02  0.0263230079 -0.0059685045 -0.004133273 -0.0338249542
## 2022-03-31  5.588247e-02  0.0596239190  0.0346686578  0.112575897  0.1008102547
## 2022-04-29 -1.021775e-01 -0.2711856801 -0.1944949638 -0.386065775  0.0269631560
## 2022-05-31 -5.603732e-02 -0.0333130879 -0.0081002558  0.006717245 -0.1698039395
## 2022-06-30 -8.493673e-02 -0.1238178226 -0.0417810023 -0.208219376 -0.0563675846
## 2022-07-29  1.728045e-01  0.2394860591  0.0643327037  0.180791929  0.0826081279
## 2022-08-31 -3.170543e-02 -0.0625299224 -0.0663691027 -0.185089160  0.0081251861
## 2022-09-30 -1.289444e-01 -0.1149865758 -0.1268136323 -0.217576886 -0.0217359545
## 2022-10-31  1.039559e-01 -0.0981105335 -0.0156178797  0.106044018  0.0929241833
## 2022-11-30 -3.358532e-02 -0.0593198454  0.0692744160  0.226462028  0.0684914841
## 2022-12-30 -1.304191e-01 -0.1391406409 -0.1339678993 -0.146693561 -0.0685298754
## 2023-01-31  1.048292e-01  0.2051735029  0.1182712047  0.290330125  0.0145630113
## 2023-02-28  2.291852e-02 -0.0902516639 -0.1007318734  0.172531559 -0.0121680333
## 2023-03-31  1.121214e-01  0.0918019370  0.1412534910  0.179536548  0.0408372088
## 2023-04-28  2.857495e-02  0.0206963031  0.0397752355 -0.001008544  0.0235919310
## 2023-05-31  4.502928e-02  0.1340765703  0.1310218349  0.310008260 -0.0237415484
## 2023-06-30  9.014221e-02  0.0779864104 -0.0196454416  0.111729726  0.0678437059
## 2023-07-31  1.270449e-02  0.0251489708  0.0956332795  0.099530518  0.0169068382
## 2023-08-31 -4.330819e-02  0.0318772770  0.0313565693  0.054674262  0.0206048836
## 2023-09-29 -9.285932e-02 -0.0821945627 -0.0408675029 -0.126218876 -0.0166184904
## 2023-10-31 -2.573206e-03  0.0458940197 -0.0509540273 -0.064546100  0.0215261056
## 2023-11-30  1.077597e-01  0.0931972815  0.0665317006  0.137050237 -0.0483955454
## 2023-12-29  1.349114e-02  0.0392628771  0.0510207183  0.057262949  0.0162177594
## 2024-01-31 -4.314466e-02  0.0212288659  0.0061543397  0.217059054  0.0470820679
## 2024-02-29 -1.871727e-02  0.1300782611 -0.0143479204  0.251388463  0.0620581657
## 2024-03-28 -5.264818e-02  0.0202729146  0.0855198700  0.132939782  0.0296685688
## 2024-04-30 -6.728849e-03 -0.0302797899  0.0781716797 -0.044746618 -0.0137217860
## 2024-05-31  1.224142e-01  0.0081949152  0.0550640990  0.238127666  0.1060150534
## 2024-06-28  9.125897e-02  0.0910037984  0.0540905131  0.119508665  0.0292221364
## 2024-07-31  5.298220e-02 -0.0329830511 -0.0576203452 -0.054220172  0.0136415209
## 2024-08-30  3.184114e-02 -0.0464130352 -0.0475462855  0.019883127  0.1207589765
## 2024-09-30  1.731646e-02  0.0429307038  0.0138344637  0.017277918  0.0445699361
## 2024-10-31 -3.090179e-02  0.0003755644  0.0323671889  0.089122612  0.0147513058
## 2024-11-19  1.153584e-02  0.0932108617  0.0391227076  0.101957629  0.0551905300
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.234 0.272 0.148 0.318 0.028

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.