# 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

Choose your stocks from 2012-12-31 to present.

symbols <- c("AMD", "NVDA", "AAPL", "INTC", "GOOG")

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

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          AMD          GOOG         INTC         NVDA
## 2013-01-31 -1.555898e-01  0.080042631  0.0660632586  0.020164366  0.000000000
## 2013-02-28 -2.561119e-02 -0.043228694  0.0584794367  0.003056544  0.038221601
## 2013-03-28  2.850272e-03  0.023810626 -0.0087878655  0.044951282  0.013339006
## 2013-04-30  2.716317e-04  0.100643521  0.0375393189  0.092225292  0.070706078
## 2013-05-31  2.217154e-02  0.349557500  0.0550324684  0.023060529  0.054651957
## 2013-06-28 -1.258956e-01  0.019802609  0.0104477177 -0.002061383 -0.030167461
## 2013-07-31  1.321020e-01 -0.079021973  0.0083478266 -0.037423260  0.028091872
## 2013-08-30  8.044283e-02 -0.142285017 -0.0471073807 -0.050298101  0.026270339
## 2013-09-30 -2.172315e-02  0.152839195  0.0336805508  0.041876977  0.053460252
## 2013-10-31  9.201550e-02 -0.131658393  0.1626137511  0.065437811 -0.024065843
## 2013-11-29  6.770778e-02  0.086012929  0.0277603690 -0.016765096  0.032034485
## 2013-12-31  8.862430e-03  0.061270767  0.0560803510  0.085191590  0.026567314
## 2014-01-31 -1.139496e-01 -0.120694197  0.0523736758 -0.056252163 -0.020177205
## 2014-02-28  5.591842e-02  0.078471606  0.0289427889  0.018415588  0.162107502
## 2014-03-31  1.975631e-02  0.077759411 -0.0863761431  0.041532748 -0.025903992
## 2014-04-30  9.476112e-02  0.019753709 -0.0559562158  0.033526929  0.030788446
## 2014-05-30  7.576506e-02 -0.022250646  0.0611852104  0.031886089  0.032886160
## 2014-06-30  2.728639e-02  0.046406386  0.0271165183  0.123136963 -0.024508262
## 2014-07-31  2.832646e-02 -0.069163352 -0.0064174879  0.092364017 -0.057729554
## 2014-08-29  7.465175e-02  0.064378658  0.0000000000  0.036569559  0.110060100
## 2014-09-30 -1.722070e-02 -0.201203738  0.0100266345 -0.002867590 -0.052782832
## 2014-10-31  6.948925e-02 -0.197092916 -0.0321734491 -0.023537749  0.057399304
## 2014-11-28  1.007303e-01 -0.003577818 -0.0313403105  0.097533170  0.074852026
## 2014-12-31 -7.460594e-02 -0.043963081 -0.0288908834 -0.026110053 -0.044863518
## 2015-01-30  5.961152e-02 -0.038172628  0.0153077624 -0.093822797 -0.043318820
## 2015-02-27  9.601578e-02  0.190716820  0.0437064372  0.013482719  0.142698875
## 2015-03-31 -3.187409e-02 -0.148805873 -0.0188002471 -0.061395674 -0.052582385
## 2015-04-30  5.769568e-03 -0.170452010 -0.0169025209  0.040118431  0.058908308
## 2015-05-29  4.434133e-02  0.008810621 -0.0097808463  0.064226615  0.001460651
## 2015-06-30 -3.793822e-02  0.051293347 -0.0220412022 -0.124698951 -0.095717212
## 2015-07-31 -3.348093e-02 -0.217948801  0.1839181544 -0.049529927 -0.007988113
## 2015-08-31 -6.848900e-02 -0.064193162 -0.0118342473 -0.005989995  0.123595346
## 2015-09-30 -2.205756e-02 -0.051002506 -0.0160275192  0.054546137  0.092151046
## 2015-10-30  8.011248e-02  0.209091727  0.1555397941  0.116381080  0.140555210
## 2015-11-30 -5.821329e-03  0.107245540  0.0437523642  0.033540208  0.115405310
## 2015-12-31 -1.167905e-01  0.195650415  0.0216860731 -0.009245828  0.038347321
## 2016-01-29 -7.822334e-02 -0.265854608 -0.0212148962 -0.104877119 -0.118048585
## 2016-02-29 -1.288262e-03 -0.027651504 -0.0627392605 -0.038432274  0.071923468
## 2016-03-31  1.197460e-01  0.286513083  0.0654275963  0.089177330  0.127655160
## 2016-04-29 -1.507311e-01  0.219628629 -0.0722726559 -0.066126645 -0.002810767
## 2016-05-31  6.931389e-02  0.252565652  0.0598051735  0.050954302  0.276388358
## 2016-06-30 -4.359635e-02  0.117539811 -0.0611191121  0.037587682  0.006188211
## 2016-07-29  8.623550e-02  0.288654408  0.1050873292  0.060911369  0.194443845
## 2016-08-31  2.337637e-02  0.075772552 -0.0022657966  0.036670579  0.073468813
## 2016-09-30  6.344821e-02 -0.068510397  0.0132615302  0.050526472  0.110693590
## 2016-10-31  4.324930e-03  0.045269423  0.0092841056 -0.079358796  0.037805166
## 2016-11-30 -2.183735e-02  0.208935186 -0.0343615135  0.002655694  0.260525323
## 2016-12-30  4.684064e-02  0.241162087  0.0180152337  0.044251364  0.146435625
## 2017-01-31  4.664149e-02 -0.089419301  0.0318397939  0.015050533  0.022602444
## 2017-02-28  1.255554e-01  0.332469208  0.0326200945 -0.009868727 -0.071875080
## 2017-03-31  4.754144e-02  0.006204787  0.0076842168 -0.003597425  0.070843829
## 2017-04-28 -6.988898e-05 -0.089826957  0.0880997230  0.002215632 -0.043434287
## 2017-05-31  6.560746e-02 -0.172743565  0.0629877923  0.006304226  0.326022310
## 2017-06-30 -5.891564e-02  0.109106841 -0.0599350111 -0.067885732  0.001453586
## 2017-07-31  3.218024e-02  0.086677465  0.0236741629  0.050003368  0.117044821
## 2017-08-31  1.016531e-01 -0.045855434  0.0094446934 -0.003862794  0.042639415
## 2017-09-29 -6.213496e-02 -0.019418086  0.0208389738  0.082343677  0.053601101
## 2017-10-31  9.240403e-02 -0.148545524  0.0582525835  0.177802961  0.145700750
## 2017-11-30  2.007508e-02 -0.009140779  0.0046809400 -0.008483269 -0.029245032
## 2017-12-29 -1.536341e-02 -0.057644734  0.0241716390  0.029013141 -0.036583515
## 2018-01-31 -1.069325e-02  0.290111036  0.1115967900  0.041999690  0.239240524
## 2018-02-28  6.596077e-02 -0.126279741 -0.0573515298  0.030369296 -0.014959100
## 2018-03-29 -5.980361e-02 -0.186458876 -0.0683057993  0.055059818 -0.043968890
## 2018-04-30 -1.513359e-02  0.079353598 -0.0141136248 -0.008871939 -0.029312870
## 2018-05-31  1.267419e-01  0.232656934  0.0643892525  0.072808751  0.115145137
## 2018-06-29 -9.462827e-03  0.087800110  0.0278664749 -0.104757033 -0.062544755
## 2018-07-31  2.759872e-02  0.201155761  0.0871651755 -0.032924012  0.033048678
## 2018-08-31  1.826733e-01  0.317113754  0.0007637297  0.012900460  0.137075326
## 2018-09-28 -8.337669e-03  0.204779675 -0.0205011698 -0.023820491  0.001210415
## 2018-10-31 -3.095166e-02 -0.528461644 -0.1028991445 -0.008707496 -0.287373427
## 2018-11-30 -1.999123e-01  0.156736193  0.0162678540  0.056809166 -0.253667341
## 2018-12-31 -1.240885e-01 -0.143100857 -0.0552431428 -0.049469773 -0.202283382
## 2019-01-31  5.368668e-02  0.279386699  0.0750917804  0.004040478  0.073974259
## 2019-02-28  4.380295e-02 -0.036716646  0.0031748651  0.123157658  0.071593764
## 2019-03-29  9.260247e-02  0.081186244  0.0465716243  0.013876406  0.151870020
## 2019-04-30  5.490115e-02  0.079439632  0.0128463578 -0.050803468  0.007987706
## 2019-05-31 -1.326324e-01 -0.007994204 -0.0740704060 -0.141405891 -0.288679961
## 2019-06-28  1.226770e-01  0.102547402 -0.0208014640  0.083390790  0.192591197
## 2019-07-31  7.361692e-02  0.002630713  0.1183224942  0.054473874  0.026972979
## 2019-08-30 -1.659795e-02  0.032312988 -0.0237704414 -0.057400564 -0.006207922
## 2019-09-30  7.042244e-02 -0.081448072  0.0256755038  0.083330803  0.038414001
## 2019-10-31  1.049765e-01  0.157348653  0.0331681100  0.092607456  0.143947125
## 2019-11-29  7.469386e-02  0.143100874  0.0349734427  0.032021665  0.076031804
## 2019-12-31  9.420400e-02  0.158192829  0.0242707879  0.030536784  0.082162730
## 2020-01-31  5.260166e-02  0.024554311  0.0701848929  0.065947220  0.004790944
## 2020-02-28 -1.218303e-01 -0.032874943 -0.0684586298 -0.136132889  0.133626995
## 2020-03-31 -7.231413e-02  0.000000000 -0.1413300093 -0.025539405 -0.024248630
## 2020-04-30  1.444238e-01  0.141443063  0.1482721074  0.102807242  0.103279489
## 2020-05-29  8.166687e-02  0.026557731  0.0578073650  0.053644676  0.194462068
## 2020-06-30  1.374866e-01 -0.022367226 -0.0107722179 -0.050515720  0.068216210
## 2020-07-31  1.528341e-01  0.386468079  0.0478934005 -0.225946970  0.111189689
## 2020-08-31  1.960349e-01  0.159505216  0.0971010982  0.072053228  0.231105455
## 2020-09-30 -1.081717e-01 -0.102282260 -0.1061508709  0.016158880  0.011895712
## 2020-10-30 -6.188804e-02 -0.085249927  0.0980590834 -0.156470648 -0.076501459
## 2020-11-30  9.120451e-02  0.207589583  0.0826847480  0.095180124  0.066921655
## 2020-12-31  1.084722e-01 -0.010305505 -0.0050446216  0.029950574 -0.025900148
## 2021-01-29 -5.516871e-03 -0.068478958  0.0467581267  0.108146388 -0.005010612
## 2021-02-26 -8.306882e-02 -0.013282561  0.1039617314  0.096749347  0.054293237
## 2021-03-31  7.312911e-03 -0.073771271  0.0154771604  0.051622229 -0.026723134
## 2021-04-30  7.345293e-02  0.038975739  0.1527899045 -0.106576487  0.117297791
## 2021-05-28 -5.181677e-02 -0.019048206  0.0005974250 -0.001012141  0.079071238
## 2021-06-30  9.450016e-02  0.159523669  0.0385416519 -0.017305606  0.208332035
## 2021-07-30  6.295830e-02  0.122680138  0.0760718346 -0.044063193 -0.025494261
## 2021-08-31  4.161137e-02  0.041774537  0.0730045198  0.012786314  0.138204289
## 2021-09-30 -7.046171e-02 -0.073246845 -0.0875715395 -0.014533399 -0.077484551
## 2021-10-29  5.700144e-02  0.155648945  0.1066948649 -0.083740660  0.210395738
## 2021-11-30  9.991913e-02  0.275527434 -0.0400332042  0.011003317  0.245338388
## 2021-12-31  7.160309e-02 -0.095815465  0.0155159766  0.045688233 -0.105149637
## 2022-01-31 -1.583689e-02 -0.230729542 -0.0640854435 -0.053441766 -0.183267111
## 2022-02-28 -5.558241e-02  0.076555710 -0.0059683911 -0.015619866 -0.004133430
## 2022-03-31  5.588255e-02 -0.120482480  0.0346685444  0.038252643  0.112575914
## 2022-04-29 -1.021777e-01 -0.245712033 -0.1944949638 -0.128356434 -0.386065635
## 2022-05-31 -5.603732e-02  0.174849100 -0.0081002558  0.026735898  0.006717041
## 2022-06-30 -8.493685e-02 -0.286700804 -0.0417810722 -0.171751920 -0.208219297
## 2022-07-29  1.728047e-01  0.211383814  0.0643327736 -0.029844736  0.180792160
## 2022-08-31 -3.170562e-02 -0.107161630 -0.0663691728 -0.118815533 -0.185089265
## 2022-09-30 -1.289442e-01 -0.292287949 -0.1268135622 -0.214021779 -0.217576729
## 2022-10-31  1.039558e-01 -0.053488672 -0.0156179604  0.098233898  0.106044003
## 2022-11-30 -3.358512e-02  0.256609830  0.0692745722  0.069498627  0.226461886
## 2022-12-30 -1.304193e-01 -0.181111434 -0.1339679747 -0.129028290 -0.146693626
## 2023-01-31  1.048294e-01  0.148643655  0.1182712812  0.066947619  0.290330385
## 2023-02-28  2.291841e-02  0.044631101 -0.1007318653 -0.113264002  0.172531281
## 2023-03-31  1.121214e-01  0.220952299  0.1412534063  0.270385077  0.179536630
## 2023-04-28  2.857513e-02 -0.092284450  0.0397753062 -0.050536267 -0.001008544
## 2023-05-31  4.502909e-02  0.279677610  0.1310217643  0.016246810  0.310008260
## 2023-06-30  9.014236e-02 -0.037054001 -0.0196454416  0.061671648  0.111729726
## 2023-07-31  1.270441e-02  0.004292397  0.0956332795  0.067356945  0.099530518
## 2023-08-31 -4.330819e-02 -0.078906991  0.0313565693 -0.014178264  0.054674107
## 2023-09-29 -9.285950e-02 -0.027814218 -0.0408675029  0.011599962 -0.126218633
## 2023-10-31 -2.573206e-03 -0.042923335 -0.0509540273  0.026372089 -0.064546188
## 2023-11-30  1.077599e-01  0.207055468  0.0665317006  0.205944141  0.137050155
## 2023-12-29  1.349106e-02  0.196105829  0.0510207183  0.117037006  0.057263031
## 2024-01-31 -4.314466e-02  0.128899206  0.0061543397 -0.153951576  0.217059116
## 2024-02-29 -1.871719e-02  0.138134928 -0.0143479204  0.002230120  0.251388401
## 2024-03-28 -5.264836e-02 -0.064576574  0.0855198700  0.025683568  0.132939782
## 2024-04-30 -6.728849e-03 -0.130678165  0.0781716797 -0.371303188 -0.044746618
## 2024-05-31  1.224143e-01  0.052397554  0.0550640990  0.016447718  0.238127666
## 2024-06-28  9.125897e-02 -0.028502961  0.0540905131  0.003882183  0.119508665
## 2024-07-31  5.298220e-02 -0.115750773 -0.0576203452 -0.007454249 -0.054220172
## 2024-08-30  3.184114e-02  0.027847841 -0.0475462855 -0.326382133  0.019883127
## 2024-09-30  1.731646e-02  0.099365224  0.0138344637  0.062437778  0.017277918
## 2024-10-31 -3.090179e-02 -0.130054782  0.0323671889 -0.086314048  0.089122612
## 2024-11-19  1.153584e-02 -0.033023588  0.0391227076  0.117369908  0.101957629
# Covariance of asset returns
covariance_matrix <- cov(asset_returns_wide_tbl)

covariance_matrix
##             AAPL         AMD        GOOG        INTC        NVDA
## AAPL 0.006084880 0.004067025 0.002072423 0.002243854 0.005064274
## AMD  0.004067025 0.023291011 0.003758969 0.003257509 0.010217313
## GOOG 0.002072423 0.003758969 0.004225900 0.001879687 0.003930481
## INTC 0.002243854 0.003257509 0.001879687 0.007661920 0.003738245
## NVDA 0.005064274 0.010217313 0.003930481 0.003738245 0.014924334
# 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.07296305
# 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        AMD        GOOG       INTC       NVDA
## [1,] 0.01338917 0.03174393 0.008420738 0.01002559 0.00938362
rowSums(component_contribution)
## [1] 0.07296305
# Component contribution in percentage
component_percentages <- (component_contribution / sd_portfolio[1,1]) %>%
    round(3) %>%
    as_tibble()

component_percentages
## # A tibble: 1 × 5
##    AAPL   AMD  GOOG  INTC  NVDA
##   <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 0.184 0.435 0.115 0.137 0.129
component_percentages %>%

    as_tibble() %>%
    gather(key = "asset", value = "contribution")
## # A tibble: 5 × 2
##   asset contribution
##   <chr>        <dbl>
## 1 AAPL         0.184
## 2 AMD          0.435
## 3 GOOG         0.115
## 4 INTC         0.137
## 5 NVDA         0.129

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          AMD          GOOG         INTC         NVDA
## 2013-01-31 -1.555898e-01  0.080042631  0.0660632586  0.020164366  0.000000000
## 2013-02-28 -2.561119e-02 -0.043228694  0.0584794367  0.003056544  0.038221601
## 2013-03-28  2.850272e-03  0.023810626 -0.0087878655  0.044951282  0.013339006
## 2013-04-30  2.716317e-04  0.100643521  0.0375393189  0.092225292  0.070706078
## 2013-05-31  2.217154e-02  0.349557500  0.0550324684  0.023060529  0.054651957
## 2013-06-28 -1.258956e-01  0.019802609  0.0104477177 -0.002061383 -0.030167461
## 2013-07-31  1.321020e-01 -0.079021973  0.0083478266 -0.037423260  0.028091872
## 2013-08-30  8.044283e-02 -0.142285017 -0.0471073807 -0.050298101  0.026270339
## 2013-09-30 -2.172315e-02  0.152839195  0.0336805508  0.041876977  0.053460252
## 2013-10-31  9.201550e-02 -0.131658393  0.1626137511  0.065437811 -0.024065843
## 2013-11-29  6.770778e-02  0.086012929  0.0277603690 -0.016765096  0.032034485
## 2013-12-31  8.862430e-03  0.061270767  0.0560803510  0.085191590  0.026567314
## 2014-01-31 -1.139496e-01 -0.120694197  0.0523736758 -0.056252163 -0.020177205
## 2014-02-28  5.591842e-02  0.078471606  0.0289427889  0.018415588  0.162107502
## 2014-03-31  1.975631e-02  0.077759411 -0.0863761431  0.041532748 -0.025903992
## 2014-04-30  9.476112e-02  0.019753709 -0.0559562158  0.033526929  0.030788446
## 2014-05-30  7.576506e-02 -0.022250646  0.0611852104  0.031886089  0.032886160
## 2014-06-30  2.728639e-02  0.046406386  0.0271165183  0.123136963 -0.024508262
## 2014-07-31  2.832646e-02 -0.069163352 -0.0064174879  0.092364017 -0.057729554
## 2014-08-29  7.465175e-02  0.064378658  0.0000000000  0.036569559  0.110060100
## 2014-09-30 -1.722070e-02 -0.201203738  0.0100266345 -0.002867590 -0.052782832
## 2014-10-31  6.948925e-02 -0.197092916 -0.0321734491 -0.023537749  0.057399304
## 2014-11-28  1.007303e-01 -0.003577818 -0.0313403105  0.097533170  0.074852026
## 2014-12-31 -7.460594e-02 -0.043963081 -0.0288908834 -0.026110053 -0.044863518
## 2015-01-30  5.961152e-02 -0.038172628  0.0153077624 -0.093822797 -0.043318820
## 2015-02-27  9.601578e-02  0.190716820  0.0437064372  0.013482719  0.142698875
## 2015-03-31 -3.187409e-02 -0.148805873 -0.0188002471 -0.061395674 -0.052582385
## 2015-04-30  5.769568e-03 -0.170452010 -0.0169025209  0.040118431  0.058908308
## 2015-05-29  4.434133e-02  0.008810621 -0.0097808463  0.064226615  0.001460651
## 2015-06-30 -3.793822e-02  0.051293347 -0.0220412022 -0.124698951 -0.095717212
## 2015-07-31 -3.348093e-02 -0.217948801  0.1839181544 -0.049529927 -0.007988113
## 2015-08-31 -6.848900e-02 -0.064193162 -0.0118342473 -0.005989995  0.123595346
## 2015-09-30 -2.205756e-02 -0.051002506 -0.0160275192  0.054546137  0.092151046
## 2015-10-30  8.011248e-02  0.209091727  0.1555397941  0.116381080  0.140555210
## 2015-11-30 -5.821329e-03  0.107245540  0.0437523642  0.033540208  0.115405310
## 2015-12-31 -1.167905e-01  0.195650415  0.0216860731 -0.009245828  0.038347321
## 2016-01-29 -7.822334e-02 -0.265854608 -0.0212148962 -0.104877119 -0.118048585
## 2016-02-29 -1.288262e-03 -0.027651504 -0.0627392605 -0.038432274  0.071923468
## 2016-03-31  1.197460e-01  0.286513083  0.0654275963  0.089177330  0.127655160
## 2016-04-29 -1.507311e-01  0.219628629 -0.0722726559 -0.066126645 -0.002810767
## 2016-05-31  6.931389e-02  0.252565652  0.0598051735  0.050954302  0.276388358
## 2016-06-30 -4.359635e-02  0.117539811 -0.0611191121  0.037587682  0.006188211
## 2016-07-29  8.623550e-02  0.288654408  0.1050873292  0.060911369  0.194443845
## 2016-08-31  2.337637e-02  0.075772552 -0.0022657966  0.036670579  0.073468813
## 2016-09-30  6.344821e-02 -0.068510397  0.0132615302  0.050526472  0.110693590
## 2016-10-31  4.324930e-03  0.045269423  0.0092841056 -0.079358796  0.037805166
## 2016-11-30 -2.183735e-02  0.208935186 -0.0343615135  0.002655694  0.260525323
## 2016-12-30  4.684064e-02  0.241162087  0.0180152337  0.044251364  0.146435625
## 2017-01-31  4.664149e-02 -0.089419301  0.0318397939  0.015050533  0.022602444
## 2017-02-28  1.255554e-01  0.332469208  0.0326200945 -0.009868727 -0.071875080
## 2017-03-31  4.754144e-02  0.006204787  0.0076842168 -0.003597425  0.070843829
## 2017-04-28 -6.988898e-05 -0.089826957  0.0880997230  0.002215632 -0.043434287
## 2017-05-31  6.560746e-02 -0.172743565  0.0629877923  0.006304226  0.326022310
## 2017-06-30 -5.891564e-02  0.109106841 -0.0599350111 -0.067885732  0.001453586
## 2017-07-31  3.218024e-02  0.086677465  0.0236741629  0.050003368  0.117044821
## 2017-08-31  1.016531e-01 -0.045855434  0.0094446934 -0.003862794  0.042639415
## 2017-09-29 -6.213496e-02 -0.019418086  0.0208389738  0.082343677  0.053601101
## 2017-10-31  9.240403e-02 -0.148545524  0.0582525835  0.177802961  0.145700750
## 2017-11-30  2.007508e-02 -0.009140779  0.0046809400 -0.008483269 -0.029245032
## 2017-12-29 -1.536341e-02 -0.057644734  0.0241716390  0.029013141 -0.036583515
## 2018-01-31 -1.069325e-02  0.290111036  0.1115967900  0.041999690  0.239240524
## 2018-02-28  6.596077e-02 -0.126279741 -0.0573515298  0.030369296 -0.014959100
## 2018-03-29 -5.980361e-02 -0.186458876 -0.0683057993  0.055059818 -0.043968890
## 2018-04-30 -1.513359e-02  0.079353598 -0.0141136248 -0.008871939 -0.029312870
## 2018-05-31  1.267419e-01  0.232656934  0.0643892525  0.072808751  0.115145137
## 2018-06-29 -9.462827e-03  0.087800110  0.0278664749 -0.104757033 -0.062544755
## 2018-07-31  2.759872e-02  0.201155761  0.0871651755 -0.032924012  0.033048678
## 2018-08-31  1.826733e-01  0.317113754  0.0007637297  0.012900460  0.137075326
## 2018-09-28 -8.337669e-03  0.204779675 -0.0205011698 -0.023820491  0.001210415
## 2018-10-31 -3.095166e-02 -0.528461644 -0.1028991445 -0.008707496 -0.287373427
## 2018-11-30 -1.999123e-01  0.156736193  0.0162678540  0.056809166 -0.253667341
## 2018-12-31 -1.240885e-01 -0.143100857 -0.0552431428 -0.049469773 -0.202283382
## 2019-01-31  5.368668e-02  0.279386699  0.0750917804  0.004040478  0.073974259
## 2019-02-28  4.380295e-02 -0.036716646  0.0031748651  0.123157658  0.071593764
## 2019-03-29  9.260247e-02  0.081186244  0.0465716243  0.013876406  0.151870020
## 2019-04-30  5.490115e-02  0.079439632  0.0128463578 -0.050803468  0.007987706
## 2019-05-31 -1.326324e-01 -0.007994204 -0.0740704060 -0.141405891 -0.288679961
## 2019-06-28  1.226770e-01  0.102547402 -0.0208014640  0.083390790  0.192591197
## 2019-07-31  7.361692e-02  0.002630713  0.1183224942  0.054473874  0.026972979
## 2019-08-30 -1.659795e-02  0.032312988 -0.0237704414 -0.057400564 -0.006207922
## 2019-09-30  7.042244e-02 -0.081448072  0.0256755038  0.083330803  0.038414001
## 2019-10-31  1.049765e-01  0.157348653  0.0331681100  0.092607456  0.143947125
## 2019-11-29  7.469386e-02  0.143100874  0.0349734427  0.032021665  0.076031804
## 2019-12-31  9.420400e-02  0.158192829  0.0242707879  0.030536784  0.082162730
## 2020-01-31  5.260166e-02  0.024554311  0.0701848929  0.065947220  0.004790944
## 2020-02-28 -1.218303e-01 -0.032874943 -0.0684586298 -0.136132889  0.133626995
## 2020-03-31 -7.231413e-02  0.000000000 -0.1413300093 -0.025539405 -0.024248630
## 2020-04-30  1.444238e-01  0.141443063  0.1482721074  0.102807242  0.103279489
## 2020-05-29  8.166687e-02  0.026557731  0.0578073650  0.053644676  0.194462068
## 2020-06-30  1.374866e-01 -0.022367226 -0.0107722179 -0.050515720  0.068216210
## 2020-07-31  1.528341e-01  0.386468079  0.0478934005 -0.225946970  0.111189689
## 2020-08-31  1.960349e-01  0.159505216  0.0971010982  0.072053228  0.231105455
## 2020-09-30 -1.081717e-01 -0.102282260 -0.1061508709  0.016158880  0.011895712
## 2020-10-30 -6.188804e-02 -0.085249927  0.0980590834 -0.156470648 -0.076501459
## 2020-11-30  9.120451e-02  0.207589583  0.0826847480  0.095180124  0.066921655
## 2020-12-31  1.084722e-01 -0.010305505 -0.0050446216  0.029950574 -0.025900148
## 2021-01-29 -5.516871e-03 -0.068478958  0.0467581267  0.108146388 -0.005010612
## 2021-02-26 -8.306882e-02 -0.013282561  0.1039617314  0.096749347  0.054293237
## 2021-03-31  7.312911e-03 -0.073771271  0.0154771604  0.051622229 -0.026723134
## 2021-04-30  7.345293e-02  0.038975739  0.1527899045 -0.106576487  0.117297791
## 2021-05-28 -5.181677e-02 -0.019048206  0.0005974250 -0.001012141  0.079071238
## 2021-06-30  9.450016e-02  0.159523669  0.0385416519 -0.017305606  0.208332035
## 2021-07-30  6.295830e-02  0.122680138  0.0760718346 -0.044063193 -0.025494261
## 2021-08-31  4.161137e-02  0.041774537  0.0730045198  0.012786314  0.138204289
## 2021-09-30 -7.046171e-02 -0.073246845 -0.0875715395 -0.014533399 -0.077484551
## 2021-10-29  5.700144e-02  0.155648945  0.1066948649 -0.083740660  0.210395738
## 2021-11-30  9.991913e-02  0.275527434 -0.0400332042  0.011003317  0.245338388
## 2021-12-31  7.160309e-02 -0.095815465  0.0155159766  0.045688233 -0.105149637
## 2022-01-31 -1.583689e-02 -0.230729542 -0.0640854435 -0.053441766 -0.183267111
## 2022-02-28 -5.558241e-02  0.076555710 -0.0059683911 -0.015619866 -0.004133430
## 2022-03-31  5.588255e-02 -0.120482480  0.0346685444  0.038252643  0.112575914
## 2022-04-29 -1.021777e-01 -0.245712033 -0.1944949638 -0.128356434 -0.386065635
## 2022-05-31 -5.603732e-02  0.174849100 -0.0081002558  0.026735898  0.006717041
## 2022-06-30 -8.493685e-02 -0.286700804 -0.0417810722 -0.171751920 -0.208219297
## 2022-07-29  1.728047e-01  0.211383814  0.0643327736 -0.029844736  0.180792160
## 2022-08-31 -3.170562e-02 -0.107161630 -0.0663691728 -0.118815533 -0.185089265
## 2022-09-30 -1.289442e-01 -0.292287949 -0.1268135622 -0.214021779 -0.217576729
## 2022-10-31  1.039558e-01 -0.053488672 -0.0156179604  0.098233898  0.106044003
## 2022-11-30 -3.358512e-02  0.256609830  0.0692745722  0.069498627  0.226461886
## 2022-12-30 -1.304193e-01 -0.181111434 -0.1339679747 -0.129028290 -0.146693626
## 2023-01-31  1.048294e-01  0.148643655  0.1182712812  0.066947619  0.290330385
## 2023-02-28  2.291841e-02  0.044631101 -0.1007318653 -0.113264002  0.172531281
## 2023-03-31  1.121214e-01  0.220952299  0.1412534063  0.270385077  0.179536630
## 2023-04-28  2.857513e-02 -0.092284450  0.0397753062 -0.050536267 -0.001008544
## 2023-05-31  4.502909e-02  0.279677610  0.1310217643  0.016246810  0.310008260
## 2023-06-30  9.014236e-02 -0.037054001 -0.0196454416  0.061671648  0.111729726
## 2023-07-31  1.270441e-02  0.004292397  0.0956332795  0.067356945  0.099530518
## 2023-08-31 -4.330819e-02 -0.078906991  0.0313565693 -0.014178264  0.054674107
## 2023-09-29 -9.285950e-02 -0.027814218 -0.0408675029  0.011599962 -0.126218633
## 2023-10-31 -2.573206e-03 -0.042923335 -0.0509540273  0.026372089 -0.064546188
## 2023-11-30  1.077599e-01  0.207055468  0.0665317006  0.205944141  0.137050155
## 2023-12-29  1.349106e-02  0.196105829  0.0510207183  0.117037006  0.057263031
## 2024-01-31 -4.314466e-02  0.128899206  0.0061543397 -0.153951576  0.217059116
## 2024-02-29 -1.871719e-02  0.138134928 -0.0143479204  0.002230120  0.251388401
## 2024-03-28 -5.264836e-02 -0.064576574  0.0855198700  0.025683568  0.132939782
## 2024-04-30 -6.728849e-03 -0.130678165  0.0781716797 -0.371303188 -0.044746618
## 2024-05-31  1.224143e-01  0.052397554  0.0550640990  0.016447718  0.238127666
## 2024-06-28  9.125897e-02 -0.028502961  0.0540905131  0.003882183  0.119508665
## 2024-07-31  5.298220e-02 -0.115750773 -0.0576203452 -0.007454249 -0.054220172
## 2024-08-30  3.184114e-02  0.027847841 -0.0475462855 -0.326382133  0.019883127
## 2024-09-30  1.731646e-02  0.099365224  0.0138344637  0.062437778  0.017277918
## 2024-10-31 -3.090179e-02 -0.130054782  0.0323671889 -0.086314048  0.089122612
## 2024-11-19  1.153584e-02 -0.033023588  0.0391227076  0.117369908  0.101957629
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 may vary with those of other assets withing 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()
  
  return(component_percentages)
}

asset_returns_wide_tbl %>% calculate_component_contribution(w = c(.25, .25, .2, .2, .1))
## # A tibble: 1 × 5
##    AAPL   AMD  GOOG  INTC  NVDA
##   <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 0.184 0.435 0.115 0.137 0.129

6 Plot: Colum Chart of Component Contribution and Weight

plot_data <- asset_returns_wide_tbl %>%
  
  calculate_component_contribution(w = c(.25, .25, .2, .2, .1)) %>%
  
 # Transform to long form
  pivot_longer(cols = everything(), names_to = "Asset", values_to = "Contribution") %>%

  # Add weights
  add_column(weight = c(.25, .25, .2, .2, .1)) %>%
  
  # 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)

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?

AMD is the the largest contributor to the portfolio volatility, AMD makes up around 45% of the portfolio. The next closest is AAPL with around 17%. I would say that the portfolio is heavily concentrated in AMD and it would be wise to diversify the portfolio more.