# 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("XOM", "QQQ", "SPY", "TSLA")

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
##                     QQQ           SPY         TSLA           XOM
## 2013-01-31  0.026365142  4.992222e-02  0.102078114  3.875395e-02
## 2013-02-28  0.003433704  1.267923e-02 -0.074128640  1.689077e-03
## 2013-03-28  0.029799114  3.726754e-02  0.084208138  6.233985e-03
## 2013-04-30  0.025056677  1.903053e-02  0.354111531 -1.250680e-02
## 2013-05-31  0.035149994  2.333515e-02  0.593716684  2.338800e-02
## 2013-06-28 -0.024244510 -1.343399e-02  0.093672163 -1.327425e-03
## 2013-07-31  0.061227254  5.038564e-02  0.223739522  3.694032e-02
## 2013-08-30 -0.003967347 -3.045125e-02  0.229971642 -6.599790e-02
## 2013-09-30  0.047190670  3.115566e-02  0.134706620 -1.293289e-02
## 2013-10-31  0.048379532  4.526690e-02 -0.189806595  4.076621e-02
## 2013-11-29  0.034895845  2.920682e-02 -0.228409405  4.894999e-02
## 2013-12-31  0.028851062  2.559597e-02  0.167108541  7.935114e-02
## 2014-01-31 -0.019400577 -3.588433e-02  0.187261714 -9.357268e-02
## 2014-02-28  0.050241079  4.451029e-02  0.299722785  5.068829e-02
## 2014-03-31 -0.027716593  8.261119e-03 -0.160783242  1.454020e-02
## 2014-04-30 -0.003198968  6.927568e-03 -0.002690122  4.728727e-02
## 2014-05-30  0.043879374  2.294118e-02 -0.000577422 -1.176162e-02
## 2014-06-30  0.030760363  2.043459e-02  0.144457224  1.491203e-03
## 2014-07-31  0.011750493 -1.352864e-02 -0.072372676 -1.743353e-02
## 2014-08-29  0.048880249  3.870474e-02  0.188794007  1.218402e-02
## 2014-09-30 -0.007595039 -1.389210e-02 -0.105566477 -5.592903e-02
## 2014-10-31  0.026076573  2.327769e-02 -0.004046477  2.789017e-02
## 2014-11-28  0.044460402  2.710122e-02  0.011599801 -5.873120e-02
## 2014-12-31 -0.022661092 -2.540014e-03 -0.094774519  2.087660e-02
## 2015-01-30 -0.021043112 -3.007645e-02 -0.088365289 -5.594434e-02
## 2015-02-27  0.069718056  5.468171e-02 -0.001277808  2.022942e-02
## 2015-03-31 -0.023872505 -1.583028e-02 -0.074350051 -4.080312e-02
## 2015-04-30  0.019041069  9.785864e-03  0.180226808  2.750017e-02
## 2015-05-29  0.022235322  1.277448e-02  0.103899574 -1.691337e-02
## 2015-06-30 -0.025154596 -2.052161e-02  0.067300935 -2.375406e-02
## 2015-07-31  0.044569331  2.233797e-02 -0.007896616 -4.914485e-02
## 2015-08-31 -0.070685055 -6.288659e-02 -0.066366250 -4.210637e-02
## 2015-09-30 -0.022320236 -2.584723e-02 -0.002653519 -1.189913e-02
## 2015-10-30  0.107686908  8.163487e-02 -0.182659777  1.069192e-01
## 2015-11-30  0.006069904  3.648448e-03  0.106828586 -4.458780e-03
## 2015-12-31 -0.016076296 -1.743331e-02  0.041471519 -4.649706e-02
## 2016-01-29 -0.071608159 -5.106856e-02 -0.227360626 -1.283761e-03
## 2016-02-29 -0.015777207 -8.266685e-04  0.003810669  3.815157e-02
## 2016-03-31  0.066280132  6.510016e-02  0.179948109  4.202374e-02
## 2016-04-29 -0.032386795  3.933394e-03  0.046721797  5.594812e-02
## 2016-05-31  0.042772388  1.686863e-02 -0.075597968  1.535839e-02
## 2016-06-30 -0.023043626  3.469884e-03 -0.050296440  5.166419e-02
## 2016-07-29  0.069067450  3.582199e-02  0.100785334 -5.245119e-02
## 2016-08-31  0.010445779  1.196897e-03 -0.102058091 -1.206679e-02
## 2016-09-30  0.021894002  5.773221e-05 -0.038366372  1.605124e-03
## 2016-10-31 -0.014679461 -1.748897e-02 -0.031364583 -4.643258e-02
## 2016-11-30  0.004350111  3.617630e-02 -0.043041267  5.547846e-02
## 2016-12-30  0.011258809  2.006862e-02  0.120665178  3.334333e-02
## 2017-01-31  0.050123501  1.773692e-02  0.164624916 -7.318781e-02
## 2017-02-28  0.042820488  3.853911e-02 -0.007730364 -2.201188e-02
## 2017-03-31  0.020065943  1.249160e-03  0.107278727  8.448874e-03
## 2017-04-28  0.026904931  9.877091e-03  0.120916212 -4.399149e-03
## 2017-05-31  0.038232596  1.401430e-02  0.082295892 -4.785570e-03
## 2017-06-30 -0.023451917  6.354618e-03  0.058654468  2.853207e-03
## 2017-07-31  0.039810305  2.034593e-02 -0.111459860 -8.583958e-03
## 2017-08-31  0.020523746  2.913517e-03  0.095543446 -3.781431e-02
## 2017-09-29 -0.002956932  1.994921e-02 -0.042474144  7.140890e-02
## 2017-10-31  0.045034658  2.329054e-02 -0.028457409  1.657368e-02
## 2017-11-30  0.019525581  3.010807e-02 -0.070862541  8.492045e-03
## 2017-12-29  0.006012867  1.205493e-02  0.008061928  4.193504e-03
## 2018-01-31  0.083946553  5.482843e-02  0.129254571  4.282859e-02
## 2018-02-28 -0.013012676 -3.703800e-02 -0.032266877 -1.318704e-01
## 2018-03-29 -0.041643135 -2.779331e-02 -0.253920408 -1.503172e-02
## 2018-04-30  0.005045558  5.154786e-03  0.099254576  4.122397e-02
## 2018-05-31  0.055178688  2.401880e-02 -0.031698139  5.399393e-02
## 2018-06-29  0.011385331  5.734108e-03  0.186043257  1.817478e-02
## 2018-07-31  0.027580174  3.637667e-02 -0.140021491 -1.485644e-02
## 2018-08-31  0.056197616  3.142120e-02  0.011737389 -6.314966e-03
## 2018-09-28 -0.002820477  5.928050e-03 -0.130439038  5.873714e-02
## 2018-10-31 -0.089877858 -7.160829e-02  0.242170576 -6.486771e-02
## 2018-11-30 -0.002653540  1.837915e-02  0.038271580  7.824423e-03
## 2018-12-31 -0.090588975 -9.216814e-02 -0.051761952 -1.534589e-01
## 2019-01-31  0.086276378  7.702157e-02 -0.080628789  7.198978e-02
## 2019-02-28  0.029473505  3.190186e-02  0.041032981  8.658063e-02
## 2019-03-29  0.038494998  1.793839e-02 -0.133656413  2.214942e-02
## 2019-04-30  0.053533776  4.003996e-02 -0.159123803 -6.456375e-03
## 2019-05-31 -0.085832031 -6.589530e-02 -0.253945372 -1.146881e-01
## 2019-06-28  0.073157939  6.727200e-02  0.188012109  7.955318e-02
## 2019-07-31  0.023079596  1.500629e-02  0.078092373 -3.007034e-02
## 2019-08-30 -0.019177936 -1.688479e-02 -0.068516948 -7.001911e-02
## 2019-09-30  0.009136685  1.927089e-02  0.065449565  3.063013e-02
## 2019-10-31  0.042868624  2.186375e-02  0.268061253 -4.400770e-02
## 2019-11-29  0.039887629  3.555857e-02  0.046592176  2.024120e-02
## 2019-12-31  0.038127846  2.864136e-02  0.237359743  2.392982e-02
## 2020-01-31  0.029931882 -4.039131e-04  0.441578342 -1.162797e-01
## 2020-02-28 -0.062486527 -8.247510e-02  0.026424253 -1.743976e-01
## 2020-03-31 -0.075648993 -1.333845e-01 -0.242781458 -3.036194e-01
## 2020-04-30  0.139533628  1.195448e-01  0.400209535  2.020104e-01
## 2020-05-29  0.063921640  4.654470e-02  0.065730500 -2.550278e-03
## 2020-06-30  0.060969701  1.757929e-02  0.257108657 -1.663195e-02
## 2020-07-31  0.070892034  5.722314e-02  0.281420674 -6.084817e-02
## 2020-08-31  0.103861716  6.746870e-02  0.554719320 -3.265860e-02
## 2020-09-30 -0.059522974 -3.816265e-02 -0.149762306 -1.513587e-01
## 2020-10-30 -0.030922178 -2.524971e-02 -0.100371771 -5.109407e-02
## 2020-11-30  0.106391730  1.032575e-01  0.380308519  1.799158e-01
## 2020-12-31  0.047860531  3.637859e-02  0.217730753  7.792216e-02
## 2021-01-29  0.002610451 -1.024278e-02  0.117343701  8.417702e-02
## 2021-02-26 -0.001336194  2.742591e-02 -0.161038203  2.095518e-01
## 2021-03-31  0.017022041  4.439901e-02 -0.011269836  2.649875e-02
## 2021-04-30  0.057417577  5.155812e-02  0.060292565  2.494163e-02
## 2021-05-28 -0.012084823  6.544649e-03 -0.126372343  3.401205e-02
## 2021-06-30  0.060738754  2.217969e-02  0.083547955  7.760166e-02
## 2021-07-30  0.028207919  2.411923e-02  0.010973846 -9.140217e-02
## 2021-08-31  0.041320993  2.932553e-02  0.068224268 -3.941177e-02
## 2021-09-30 -0.058510264 -4.772652e-02  0.052632612  7.591434e-02
## 2021-10-29  0.075701020  6.781166e-02  0.362230202  9.171810e-02
## 2021-11-30  0.019771518 -8.067367e-03  0.027237848 -6.117598e-02
## 2021-12-31  0.011457602  4.521017e-02 -0.079968440  2.230941e-02
## 2022-01-31 -0.091534449 -5.418290e-02 -0.120597475  2.162231e-01
## 2022-02-28 -0.045792429 -2.996135e-02 -0.073397011  4.289716e-02
## 2022-03-31  0.045622263  3.690103e-02  0.213504290  5.180956e-02
## 2022-04-29 -0.146133394 -9.186211e-02 -0.213125289  3.169957e-02
## 2022-05-31 -0.015993260  2.254680e-03 -0.138340062  1.289512e-01
## 2022-06-30 -0.093298697 -8.605956e-02 -0.118657126 -1.141955e-01
## 2022-07-29  0.118242744  8.809096e-02  0.280480149  1.238365e-01
## 2022-08-31 -0.052685826 -4.165765e-02 -0.075250271 -4.251460e-03
## 2022-09-30 -0.111328634 -9.700208e-02 -0.038313992 -9.060318e-02
## 2022-10-31  0.039219217  7.814131e-02 -0.153346760  2.383520e-01
## 2022-11-30  0.053959421  5.410126e-02 -0.155866121  1.278954e-02
## 2022-12-30 -0.094461036 -5.935544e-02 -0.457813194 -9.384627e-03
## 2023-01-31  0.101138009  6.098923e-02  0.340915767  5.047243e-02
## 2023-02-28 -0.003604316 -2.546427e-02  0.171904973 -4.634906e-02
## 2023-03-31  0.090687898  3.640716e-02  0.008471140 -2.277198e-03
## 2023-04-28  0.005066252  1.584862e-02 -0.233183710  7.617707e-02
## 2023-05-31  0.075884418  4.605462e-03  0.216021889 -1.381858e-01
## 2023-06-30  0.061131234  6.278689e-02  0.249689452  4.842652e-02
## 2023-07-31  0.037874673  3.220893e-02  0.021391609 -9.318555e-05
## 2023-08-31 -0.014941116 -1.638553e-02 -0.035588260  4.433509e-02
## 2023-09-29 -0.052134360 -4.859640e-02 -0.030929027  5.587855e-02
## 2023-10-31 -0.020871156 -2.194780e-02 -0.219831983 -1.050960e-01
## 2023-11-30  0.102726511  8.740992e-02  0.178463656 -2.071877e-02
## 2023-12-29  0.054364711  4.464380e-02  0.034390133 -2.723123e-02
## 2024-01-31  0.018028627  1.580099e-02 -0.282704160  2.791230e-02
## 2024-02-29  0.051485088  5.087070e-02  0.075015304  2.574664e-02
## 2024-03-28  0.012669115  3.217856e-02 -0.138383423  1.062786e-01
## 2024-04-30 -0.044723148 -4.115494e-02  0.041724969  1.731309e-02
## 2024-05-31  0.059700139  4.934204e-02 -0.028782134 -4.867061e-04
## 2024-06-28  0.062694255  3.467204e-02  0.105427913 -1.841869e-02
## 2024-07-31 -0.016923448  1.203641e-02  0.159378271  2.969709e-02
## 2024-08-30  0.010978186  2.309676e-02 -0.080549177  2.522510e-03
## 2024-09-30  0.025878211  2.078712e-02  0.200441406 -6.123529e-03
## 2024-10-31 -0.008683899 -8.963637e-03 -0.046070548 -3.760711e-03
## 2024-11-29  0.052125819  5.792306e-02  0.323147326  1.823731e-02
## 2024-12-12  0.032350559  2.949805e-03  0.191712565 -5.345514e-02
# Covariance of asset returns
covariance_matrix <- cov(asset_returns_wide_tbl)

covariance_matrix
##              QQQ         SPY         TSLA          XOM
## QQQ  0.002483360 0.001890446 0.0042708902 0.0011441004
## SPY  0.001890446 0.001723526 0.0028475598 0.0016497565
## TSLA 0.004270890 0.002847560 0.0292059200 0.0008456403
## XOM  0.001144100 0.001649756 0.0008456403 0.0052751114
# 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.06323799
# 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
##             QQQ         SPY       TSLA         XOM
## [1,] 0.00967456 0.008016629 0.03673623 0.008810574
rowSums(component_contribution)
## [1] 0.06323799
# Component contribution in percentage
component_percentages <- (component_contribution / sd_portfolio[1,1]) %>%
    round(3) %>%
    as_tibble()

component_percentages
## # A tibble: 1 × 4
##     QQQ   SPY  TSLA   XOM
##   <dbl> <dbl> <dbl> <dbl>
## 1 0.153 0.127 0.581 0.139
component_percentages %>%

    as_tibble() %>%
    gather(key = "asset", value = "contribution")
## # A tibble: 4 × 2
##   asset contribution
##   <chr>        <dbl>
## 1 QQQ          0.153
## 2 SPY          0.127
## 3 TSLA         0.581
## 4 XOM          0.139

6 Plot: Column Chart of Component Contribution and Weight

asset_returns_wide_tbl <- asset_returns_tbl %>%
    
    pivot_wider(names_from = asset, values_from = returns) %>%
    
    column_to_rownames(var = "date")

asset_returns_wide_tbl
##                     QQQ           SPY         TSLA           XOM
## 2013-01-31  0.026365142  4.992222e-02  0.102078114  3.875395e-02
## 2013-02-28  0.003433704  1.267923e-02 -0.074128640  1.689077e-03
## 2013-03-28  0.029799114  3.726754e-02  0.084208138  6.233985e-03
## 2013-04-30  0.025056677  1.903053e-02  0.354111531 -1.250680e-02
## 2013-05-31  0.035149994  2.333515e-02  0.593716684  2.338800e-02
## 2013-06-28 -0.024244510 -1.343399e-02  0.093672163 -1.327425e-03
## 2013-07-31  0.061227254  5.038564e-02  0.223739522  3.694032e-02
## 2013-08-30 -0.003967347 -3.045125e-02  0.229971642 -6.599790e-02
## 2013-09-30  0.047190670  3.115566e-02  0.134706620 -1.293289e-02
## 2013-10-31  0.048379532  4.526690e-02 -0.189806595  4.076621e-02
## 2013-11-29  0.034895845  2.920682e-02 -0.228409405  4.894999e-02
## 2013-12-31  0.028851062  2.559597e-02  0.167108541  7.935114e-02
## 2014-01-31 -0.019400577 -3.588433e-02  0.187261714 -9.357268e-02
## 2014-02-28  0.050241079  4.451029e-02  0.299722785  5.068829e-02
## 2014-03-31 -0.027716593  8.261119e-03 -0.160783242  1.454020e-02
## 2014-04-30 -0.003198968  6.927568e-03 -0.002690122  4.728727e-02
## 2014-05-30  0.043879374  2.294118e-02 -0.000577422 -1.176162e-02
## 2014-06-30  0.030760363  2.043459e-02  0.144457224  1.491203e-03
## 2014-07-31  0.011750493 -1.352864e-02 -0.072372676 -1.743353e-02
## 2014-08-29  0.048880249  3.870474e-02  0.188794007  1.218402e-02
## 2014-09-30 -0.007595039 -1.389210e-02 -0.105566477 -5.592903e-02
## 2014-10-31  0.026076573  2.327769e-02 -0.004046477  2.789017e-02
## 2014-11-28  0.044460402  2.710122e-02  0.011599801 -5.873120e-02
## 2014-12-31 -0.022661092 -2.540014e-03 -0.094774519  2.087660e-02
## 2015-01-30 -0.021043112 -3.007645e-02 -0.088365289 -5.594434e-02
## 2015-02-27  0.069718056  5.468171e-02 -0.001277808  2.022942e-02
## 2015-03-31 -0.023872505 -1.583028e-02 -0.074350051 -4.080312e-02
## 2015-04-30  0.019041069  9.785864e-03  0.180226808  2.750017e-02
## 2015-05-29  0.022235322  1.277448e-02  0.103899574 -1.691337e-02
## 2015-06-30 -0.025154596 -2.052161e-02  0.067300935 -2.375406e-02
## 2015-07-31  0.044569331  2.233797e-02 -0.007896616 -4.914485e-02
## 2015-08-31 -0.070685055 -6.288659e-02 -0.066366250 -4.210637e-02
## 2015-09-30 -0.022320236 -2.584723e-02 -0.002653519 -1.189913e-02
## 2015-10-30  0.107686908  8.163487e-02 -0.182659777  1.069192e-01
## 2015-11-30  0.006069904  3.648448e-03  0.106828586 -4.458780e-03
## 2015-12-31 -0.016076296 -1.743331e-02  0.041471519 -4.649706e-02
## 2016-01-29 -0.071608159 -5.106856e-02 -0.227360626 -1.283761e-03
## 2016-02-29 -0.015777207 -8.266685e-04  0.003810669  3.815157e-02
## 2016-03-31  0.066280132  6.510016e-02  0.179948109  4.202374e-02
## 2016-04-29 -0.032386795  3.933394e-03  0.046721797  5.594812e-02
## 2016-05-31  0.042772388  1.686863e-02 -0.075597968  1.535839e-02
## 2016-06-30 -0.023043626  3.469884e-03 -0.050296440  5.166419e-02
## 2016-07-29  0.069067450  3.582199e-02  0.100785334 -5.245119e-02
## 2016-08-31  0.010445779  1.196897e-03 -0.102058091 -1.206679e-02
## 2016-09-30  0.021894002  5.773221e-05 -0.038366372  1.605124e-03
## 2016-10-31 -0.014679461 -1.748897e-02 -0.031364583 -4.643258e-02
## 2016-11-30  0.004350111  3.617630e-02 -0.043041267  5.547846e-02
## 2016-12-30  0.011258809  2.006862e-02  0.120665178  3.334333e-02
## 2017-01-31  0.050123501  1.773692e-02  0.164624916 -7.318781e-02
## 2017-02-28  0.042820488  3.853911e-02 -0.007730364 -2.201188e-02
## 2017-03-31  0.020065943  1.249160e-03  0.107278727  8.448874e-03
## 2017-04-28  0.026904931  9.877091e-03  0.120916212 -4.399149e-03
## 2017-05-31  0.038232596  1.401430e-02  0.082295892 -4.785570e-03
## 2017-06-30 -0.023451917  6.354618e-03  0.058654468  2.853207e-03
## 2017-07-31  0.039810305  2.034593e-02 -0.111459860 -8.583958e-03
## 2017-08-31  0.020523746  2.913517e-03  0.095543446 -3.781431e-02
## 2017-09-29 -0.002956932  1.994921e-02 -0.042474144  7.140890e-02
## 2017-10-31  0.045034658  2.329054e-02 -0.028457409  1.657368e-02
## 2017-11-30  0.019525581  3.010807e-02 -0.070862541  8.492045e-03
## 2017-12-29  0.006012867  1.205493e-02  0.008061928  4.193504e-03
## 2018-01-31  0.083946553  5.482843e-02  0.129254571  4.282859e-02
## 2018-02-28 -0.013012676 -3.703800e-02 -0.032266877 -1.318704e-01
## 2018-03-29 -0.041643135 -2.779331e-02 -0.253920408 -1.503172e-02
## 2018-04-30  0.005045558  5.154786e-03  0.099254576  4.122397e-02
## 2018-05-31  0.055178688  2.401880e-02 -0.031698139  5.399393e-02
## 2018-06-29  0.011385331  5.734108e-03  0.186043257  1.817478e-02
## 2018-07-31  0.027580174  3.637667e-02 -0.140021491 -1.485644e-02
## 2018-08-31  0.056197616  3.142120e-02  0.011737389 -6.314966e-03
## 2018-09-28 -0.002820477  5.928050e-03 -0.130439038  5.873714e-02
## 2018-10-31 -0.089877858 -7.160829e-02  0.242170576 -6.486771e-02
## 2018-11-30 -0.002653540  1.837915e-02  0.038271580  7.824423e-03
## 2018-12-31 -0.090588975 -9.216814e-02 -0.051761952 -1.534589e-01
## 2019-01-31  0.086276378  7.702157e-02 -0.080628789  7.198978e-02
## 2019-02-28  0.029473505  3.190186e-02  0.041032981  8.658063e-02
## 2019-03-29  0.038494998  1.793839e-02 -0.133656413  2.214942e-02
## 2019-04-30  0.053533776  4.003996e-02 -0.159123803 -6.456375e-03
## 2019-05-31 -0.085832031 -6.589530e-02 -0.253945372 -1.146881e-01
## 2019-06-28  0.073157939  6.727200e-02  0.188012109  7.955318e-02
## 2019-07-31  0.023079596  1.500629e-02  0.078092373 -3.007034e-02
## 2019-08-30 -0.019177936 -1.688479e-02 -0.068516948 -7.001911e-02
## 2019-09-30  0.009136685  1.927089e-02  0.065449565  3.063013e-02
## 2019-10-31  0.042868624  2.186375e-02  0.268061253 -4.400770e-02
## 2019-11-29  0.039887629  3.555857e-02  0.046592176  2.024120e-02
## 2019-12-31  0.038127846  2.864136e-02  0.237359743  2.392982e-02
## 2020-01-31  0.029931882 -4.039131e-04  0.441578342 -1.162797e-01
## 2020-02-28 -0.062486527 -8.247510e-02  0.026424253 -1.743976e-01
## 2020-03-31 -0.075648993 -1.333845e-01 -0.242781458 -3.036194e-01
## 2020-04-30  0.139533628  1.195448e-01  0.400209535  2.020104e-01
## 2020-05-29  0.063921640  4.654470e-02  0.065730500 -2.550278e-03
## 2020-06-30  0.060969701  1.757929e-02  0.257108657 -1.663195e-02
## 2020-07-31  0.070892034  5.722314e-02  0.281420674 -6.084817e-02
## 2020-08-31  0.103861716  6.746870e-02  0.554719320 -3.265860e-02
## 2020-09-30 -0.059522974 -3.816265e-02 -0.149762306 -1.513587e-01
## 2020-10-30 -0.030922178 -2.524971e-02 -0.100371771 -5.109407e-02
## 2020-11-30  0.106391730  1.032575e-01  0.380308519  1.799158e-01
## 2020-12-31  0.047860531  3.637859e-02  0.217730753  7.792216e-02
## 2021-01-29  0.002610451 -1.024278e-02  0.117343701  8.417702e-02
## 2021-02-26 -0.001336194  2.742591e-02 -0.161038203  2.095518e-01
## 2021-03-31  0.017022041  4.439901e-02 -0.011269836  2.649875e-02
## 2021-04-30  0.057417577  5.155812e-02  0.060292565  2.494163e-02
## 2021-05-28 -0.012084823  6.544649e-03 -0.126372343  3.401205e-02
## 2021-06-30  0.060738754  2.217969e-02  0.083547955  7.760166e-02
## 2021-07-30  0.028207919  2.411923e-02  0.010973846 -9.140217e-02
## 2021-08-31  0.041320993  2.932553e-02  0.068224268 -3.941177e-02
## 2021-09-30 -0.058510264 -4.772652e-02  0.052632612  7.591434e-02
## 2021-10-29  0.075701020  6.781166e-02  0.362230202  9.171810e-02
## 2021-11-30  0.019771518 -8.067367e-03  0.027237848 -6.117598e-02
## 2021-12-31  0.011457602  4.521017e-02 -0.079968440  2.230941e-02
## 2022-01-31 -0.091534449 -5.418290e-02 -0.120597475  2.162231e-01
## 2022-02-28 -0.045792429 -2.996135e-02 -0.073397011  4.289716e-02
## 2022-03-31  0.045622263  3.690103e-02  0.213504290  5.180956e-02
## 2022-04-29 -0.146133394 -9.186211e-02 -0.213125289  3.169957e-02
## 2022-05-31 -0.015993260  2.254680e-03 -0.138340062  1.289512e-01
## 2022-06-30 -0.093298697 -8.605956e-02 -0.118657126 -1.141955e-01
## 2022-07-29  0.118242744  8.809096e-02  0.280480149  1.238365e-01
## 2022-08-31 -0.052685826 -4.165765e-02 -0.075250271 -4.251460e-03
## 2022-09-30 -0.111328634 -9.700208e-02 -0.038313992 -9.060318e-02
## 2022-10-31  0.039219217  7.814131e-02 -0.153346760  2.383520e-01
## 2022-11-30  0.053959421  5.410126e-02 -0.155866121  1.278954e-02
## 2022-12-30 -0.094461036 -5.935544e-02 -0.457813194 -9.384627e-03
## 2023-01-31  0.101138009  6.098923e-02  0.340915767  5.047243e-02
## 2023-02-28 -0.003604316 -2.546427e-02  0.171904973 -4.634906e-02
## 2023-03-31  0.090687898  3.640716e-02  0.008471140 -2.277198e-03
## 2023-04-28  0.005066252  1.584862e-02 -0.233183710  7.617707e-02
## 2023-05-31  0.075884418  4.605462e-03  0.216021889 -1.381858e-01
## 2023-06-30  0.061131234  6.278689e-02  0.249689452  4.842652e-02
## 2023-07-31  0.037874673  3.220893e-02  0.021391609 -9.318555e-05
## 2023-08-31 -0.014941116 -1.638553e-02 -0.035588260  4.433509e-02
## 2023-09-29 -0.052134360 -4.859640e-02 -0.030929027  5.587855e-02
## 2023-10-31 -0.020871156 -2.194780e-02 -0.219831983 -1.050960e-01
## 2023-11-30  0.102726511  8.740992e-02  0.178463656 -2.071877e-02
## 2023-12-29  0.054364711  4.464380e-02  0.034390133 -2.723123e-02
## 2024-01-31  0.018028627  1.580099e-02 -0.282704160  2.791230e-02
## 2024-02-29  0.051485088  5.087070e-02  0.075015304  2.574664e-02
## 2024-03-28  0.012669115  3.217856e-02 -0.138383423  1.062786e-01
## 2024-04-30 -0.044723148 -4.115494e-02  0.041724969  1.731309e-02
## 2024-05-31  0.059700139  4.934204e-02 -0.028782134 -4.867061e-04
## 2024-06-28  0.062694255  3.467204e-02  0.105427913 -1.841869e-02
## 2024-07-31 -0.016923448  1.203641e-02  0.159378271  2.969709e-02
## 2024-08-30  0.010978186  2.309676e-02 -0.080549177  2.522510e-03
## 2024-09-30  0.025878211  2.078712e-02  0.200441406 -6.123529e-03
## 2024-10-31 -0.008683899 -8.963637e-03 -0.046070548 -3.760711e-03
## 2024-11-29  0.052125819  5.792306e-02  0.323147326  1.823731e-02
## 2024-12-12  0.032350559  2.949805e-03  0.191712565 -5.345514e-02
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.25, 0.25, 0.25, 0.25))
## # A tibble: 1 × 4
##     QQQ   SPY  TSLA   XOM
##   <dbl> <dbl> <dbl> <dbl>
## 1 0.153 0.127 0.581 0.139
plot_data <- asset_returns_wide_tbl %>%
    
    calculate_component_contribution(w = c(0.25, 0.25, 0.25, 0.25)) %>%
    
    # Transform to long form
    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 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?

Based on the data the asset(s) in my portfolio which was the largest contributor to portfolio volatility was TSLA the reason behind that is be contribution to volatility was 58%!

Yes I do believe that the portfolio risk was mainly focused on one asset which was TSLA. This is because meanwhile every stock had the same weight in the portfolio each at 25% and TSLA was the only stock which it’s contribution to volatility was more than the it’s weight. The closest stock QQQ contribution to volatility was of 16%, SPY had a contribution of 12% and XOM had a contribution of 14%. There is an astronomical difference between TSLA and every other stock in the portfolio.