# Load packages
# Core
library(tidyverse)
library(tidyquant)
Examine how each asset contributes to portfolio standard deviation. This is to ensure that our risk is not concentrated in any one asset.
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")
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
## 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
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)
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.