# Load packages
# Core
library(tidyverse)
library(tidyquant)
library(readr)
# Time series
library(lubridate)
library(tibbletime)
# modeling
library(broom)
Examine how each asset contributes to portfolio standard deviation. This is to ensure that our risk is not concentrated in any one asset.
Choose your stocks from 2012-12-31 to present.
symbols <- c("NVDA", "WMT", "GOOG", "AAPL", "AMZN")
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
## AAPL AMZN GOOG NVDA WMT
## 2013-01-31 -1.555895e-01 0.0566799395 0.0660632798 0.000000000 0.0248964862
## 2013-02-28 -2.561086e-02 -0.0046435024 0.0584792173 0.038221622 0.0117959352
## 2013-03-28 2.850072e-03 0.0083654162 -0.0087877361 0.013338757 0.0620728977
## 2013-04-30 2.711569e-04 -0.0487507497 0.0375394422 0.070706346 0.0378943615
## 2013-05-31 2.217194e-02 0.0588686246 0.0550323967 0.054651763 -0.0317802558
## 2013-06-28 -1.258960e-01 0.0310507506 0.0104476577 -0.030167154 -0.0046876002
## 2013-07-31 1.321026e-01 0.0813355350 0.0083479451 0.028091793 0.0452743022
## 2013-08-30 8.044266e-02 -0.0695574090 -0.0471074902 0.026270625 -0.0596998487
## 2013-09-30 -2.172356e-02 0.1067688897 0.0336806763 0.053460221 0.0133385480
## 2013-10-31 9.201562e-02 0.1521839116 0.1626137117 -0.024066344 0.0370291256
## 2013-11-29 6.770813e-02 0.0781496860 0.0277603257 0.032035029 0.0540194407
## 2013-12-31 8.861837e-03 0.0130490386 0.0560802043 0.026566717 -0.0232522463
## 2014-01-31 -1.139491e-01 -0.1059765119 0.0523738801 -0.020176833 -0.0523034611
## 2014-02-28 5.591844e-02 0.0094619003 0.0289427580 0.162107250 0.0002677538
## 2014-03-31 1.975599e-02 -0.0737086161 -0.0863762133 -0.025903999 0.0293258436
## 2014-04-30 9.476153e-02 -0.1007565303 -0.0559561467 0.030788690 0.0420196946
## 2014-05-30 7.576502e-02 0.0273091844 0.0611851461 0.032886358 -0.0314089184
## 2014-06-30 2.728661e-02 0.0383836202 0.0271166371 -0.024508565 -0.0223930067
## 2014-07-31 2.832602e-02 -0.0369768154 -0.0064175410 -0.057729646 -0.0200477931
## 2014-08-29 7.465189e-02 0.0799468404 0.0000000000 0.110060269 0.0323258024
## 2014-09-30 -1.722075e-02 -0.0502010184 0.0100264942 -0.052783013 0.0127659211
## 2014-10-31 6.948855e-02 -0.0540982347 -0.0321733230 0.057399397 -0.0026189665
## 2014-11-28 1.007310e-01 0.1031187277 -0.0313403078 0.074852179 0.1378163877
## 2014-12-31 -7.460603e-02 -0.0872368614 -0.0288908374 -0.044863678 -0.0135737394
## 2015-01-30 5.961174e-02 0.1330922557 0.0153077121 -0.043318607 -0.0105353173
## 2015-02-27 9.601593e-02 0.0697992426 0.0437064049 0.142698813 -0.0124325358
## 2015-03-31 -3.187455e-02 -0.0214295755 -0.0188002124 -0.052582641 -0.0142314927
## 2015-04-30 5.769711e-03 0.1253212736 -0.0169025636 0.058909013 -0.0524137229
## 2015-05-29 4.434117e-02 0.0175090293 -0.0097807214 0.001459651 -0.0433514047
## 2015-06-30 -3.793780e-02 0.0112589814 -0.0220412667 -0.095716821 -0.0460135050
## 2015-07-31 -3.348140e-02 0.2111621090 0.1839181240 -0.007988109 0.0146947358
## 2015-08-31 -6.848860e-02 -0.0443525782 -0.0118342108 0.123595788 -0.0993582739
## 2015-09-30 -2.205763e-02 -0.0019516837 -0.0160275436 0.092150498 0.0016979334
## 2015-10-30 8.011224e-02 0.2010808743 0.1555398378 0.140555354 -0.1246697486
## 2015-11-30 -5.821141e-03 0.0602956777 0.0437522973 0.115405464 0.0275687452
## 2015-12-31 -1.167902e-01 0.0165440008 0.0216859867 0.038347310 0.0492989546
## 2016-01-29 -7.822393e-02 -0.1410054620 -0.0212149266 -0.118048739 0.0793152644
## 2016-02-29 -1.288332e-03 -0.0605352209 -0.0627389924 0.071923621 -0.0003019546
## 2016-03-31 1.197463e-01 0.0717834363 0.0654277078 0.127655013 0.0392708788
## 2016-04-29 -1.507313e-01 0.1053453760 -0.0722728572 -0.002810730 -0.0239374670
## 2016-05-31 6.931408e-02 0.0915002899 0.0598051178 0.276388583 0.0641208394
## 2016-06-30 -4.359630e-02 -0.0099694639 -0.0611191959 0.006187771 0.0311569345
## 2016-07-29 8.623564e-02 0.0586021229 0.1050874544 0.194443851 -0.0006848016
## 2016-08-31 2.337648e-02 0.0135476418 -0.0022657856 0.073468945 -0.0143682073
## 2016-09-30 6.344789e-02 0.0848953908 0.0132613605 0.110693825 0.0094735775
## 2016-10-31 4.325033e-03 -0.0583893058 0.0092842751 0.037805123 -0.0295506001
## 2016-11-30 -2.183740e-02 -0.0509721927 -0.0343614641 0.260525005 0.0058384312
## 2016-12-30 4.684052e-02 -0.0009330556 0.0180152114 0.146436015 -0.0116433958
## 2017-01-31 4.664166e-02 0.0936394059 0.0318396138 0.022602091 -0.0350396664
## 2017-02-28 1.255554e-01 0.0258446800 0.0326201813 -0.071874729 0.0608887833
## 2017-03-31 4.754149e-02 0.0479423007 0.0076841167 0.070843684 0.0234092096
## 2017-04-28 -6.948519e-05 0.0424566944 0.0880998194 -0.043434222 0.0421085985
## 2017-05-31 6.560687e-02 0.0725778018 0.0629878379 0.326022273 0.0511562506
## 2017-06-30 -5.891557e-02 -0.0271286156 -0.0599350913 0.001453787 -0.0378574769
## 2017-07-31 3.218054e-02 0.0202278808 0.0236741699 0.117044681 0.0553875613
## 2017-08-31 1.016528e-01 -0.0072953953 0.0094447228 0.042639686 -0.0180256417
## 2017-09-29 -6.213454e-02 -0.0198260355 0.0208390414 0.053601227 0.0008963248
## 2017-10-31 9.240355e-02 0.1395154056 0.0582525387 0.145699904 0.1109628938
## 2017-11-30 2.007489e-02 0.0626577318 0.0046809605 -0.029244863 0.1076144265
## 2017-12-29 -1.536311e-02 -0.0062057845 0.0241716428 -0.036583533 0.0207683569
## 2018-01-31 -1.069346e-02 0.2156265497 0.1115967462 0.239240694 0.0764919287
## 2018-02-28 6.596099e-02 0.0415536279 -0.0573515072 -0.014959068 -0.1691626187
## 2018-03-29 -5.980378e-02 -0.0440034760 -0.0683058094 -0.043969090 -0.0056771259
## 2018-04-30 -1.513365e-02 0.0788803060 -0.0141135966 -0.029312700 -0.0057486138
## 2018-05-31 1.267423e-01 0.0397392430 0.0643891622 0.115144834 -0.0629874247
## 2018-06-29 -9.462936e-03 0.0421636787 0.0278664867 -0.062544600 0.0369863553
## 2018-07-31 2.759879e-02 0.0446635734 0.0871652464 0.033048541 0.0409478821
## 2018-08-31 1.826733e-01 0.1243079079 0.0007637402 0.137075515 0.0774629470
## 2018-09-28 -8.337505e-03 -0.0048359814 -0.0205010934 0.001210694 -0.0205521056
## 2018-10-31 -3.095171e-02 -0.2258869989 -0.1028992930 -0.287373721 0.0656295122
## 2018-11-30 -1.999127e-01 0.0560700324 0.0162678346 -0.253667635 -0.0265766877
## 2018-12-31 -1.240882e-01 -0.1180514843 -0.0552430676 -0.202282897 -0.0417363612
## 2019-01-31 5.368643e-02 0.1348080312 0.0750918282 0.073974090 0.0283645779
## 2019-02-28 4.380302e-02 -0.0469930640 0.0031747935 0.071593993 0.0324432059
## 2019-03-29 9.260252e-02 0.0824420184 0.0465716076 0.151869878 -0.0094927305
## 2019-04-30 5.490106e-02 0.0786806224 0.0128463463 0.007987947 0.0530143331
## 2019-05-31 -1.326322e-01 -0.0818753491 -0.0740704194 -0.288680191 -0.0084087038
## 2019-06-28 1.226771e-01 0.0646557767 -0.0208014749 0.192591471 0.0854575696
## 2019-07-31 7.361715e-02 -0.0142806686 0.1183225574 0.026972619 -0.0009961943
## 2019-08-30 -1.659836e-02 -0.0496880810 -0.0237704953 -0.006207983 0.0394582091
## 2019-09-30 7.042270e-02 -0.0229951159 0.0256755699 0.038414427 0.0379539897
## 2019-10-31 1.049763e-01 0.0232034080 0.0331681674 0.143946784 -0.0120369749
## 2019-11-29 7.469385e-02 0.0134958216 0.0349734715 0.076031703 0.0154858360
## 2019-12-31 9.420403e-02 0.0257863501 0.0242706486 0.082163082 0.0023739988
## 2020-01-31 5.260181e-02 0.0834803026 0.0701850863 0.004790585 -0.0372906121
## 2020-02-28 -1.218302e-01 -0.0642332026 -0.0684587808 0.133626976 -0.0613237161
## 2020-03-31 -7.231453e-02 0.0344213022 -0.1413299776 -0.024248260 0.0581110081
## 2020-04-30 1.444240e-01 0.2381504762 0.1482720206 0.103279476 0.0674660211
## 2020-05-29 8.166654e-02 -0.0128673719 0.0578073161 0.194461437 0.0248286140
## 2020-06-30 1.374866e-01 0.1218341331 -0.0107722281 0.068216722 -0.0351084444
## 2020-07-31 1.528343e-01 0.1372488933 0.0478934250 0.111189855 0.0772516584
## 2020-08-31 1.960348e-01 0.0866005735 0.0971010316 0.231105224 0.0745885726
## 2020-09-30 -1.081714e-01 -0.0916533253 -0.1061506874 0.011895609 0.0076049219
## 2020-10-30 -6.188831e-02 -0.0364089187 0.0980589394 -0.076501466 -0.0083254750
## 2020-11-30 9.120484e-02 0.0425228214 0.0826849071 0.066921657 0.0963907628
## 2020-12-31 1.084718e-01 0.0276719582 -0.0050446964 -0.025899896 -0.0545614647
## 2021-01-29 -5.516586e-03 -0.0156985929 0.0467581389 -0.005010664 -0.0257179018
## 2021-02-26 -8.306877e-02 -0.0359675607 0.1039617672 0.054292855 -0.0782174175
## 2021-03-31 7.312841e-03 0.0003717151 0.0154771777 -0.026722864 0.0486516361
## 2021-04-30 7.345274e-02 0.1139202399 0.1527898791 0.117297878 0.0295951215
## 2021-05-28 -5.181644e-02 -0.0730764715 0.0005973392 0.079070858 0.0189586294
## 2021-06-30 9.449976e-02 0.0651836137 0.0385416692 0.208332129 -0.0071367001
## 2021-07-30 6.295852e-02 -0.0332696301 0.0760718946 -0.025494040 0.0107910215
## 2021-08-31 4.161135e-02 0.0421339363 0.0730044848 0.138204144 0.0418682078
## 2021-09-30 -7.046167e-02 -0.0550034409 -0.0875714257 -0.077484672 -0.0606836923
## 2021-10-29 5.700123e-02 0.0262547651 0.1066947199 0.210396143 0.0695570278
## 2021-11-30 9.991924e-02 0.0391473463 -0.0400332145 0.245338529 -0.0606289021
## 2021-12-31 7.160291e-02 -0.0505062029 0.0155159762 -0.105149809 0.0324794999
## 2022-01-31 -1.583671e-02 -0.1085098142 -0.0640854509 -0.183267303 -0.0343090224
## 2022-02-28 -5.558244e-02 0.0263230079 -0.0059682847 -0.004133287 -0.0338251663
## 2022-03-31 5.588259e-02 0.0596239190 0.0346686274 0.112575858 0.1008101182
## 2022-04-29 -1.021777e-01 -0.2711856801 -0.1944951028 -0.386065708 0.0269633748
## 2022-05-31 -5.603720e-02 -0.0333130879 -0.0081002919 0.006717049 -0.1698040379
## 2022-06-30 -8.493693e-02 -0.1238178226 -0.0417809926 -0.208219210 -0.0563676929
## 2022-07-29 1.728044e-01 0.2394860591 0.0643327814 0.180792291 0.0826080882
## 2022-08-31 -3.170505e-02 -0.0625299224 -0.0663691019 -0.185089376 0.0081252642
## 2022-09-30 -1.289441e-01 -0.1149865758 -0.1268137319 -0.217576866 -0.0217358814
## 2022-10-31 1.039556e-01 -0.0981105335 -0.0156178462 0.106043987 0.0929242403
## 2022-11-30 -3.358533e-02 -0.0593198454 0.0692744662 0.226462114 0.0684914656
## 2022-12-30 -1.304189e-01 -0.1391406409 -0.1339679265 -0.146693623 -0.0685302243
## 2023-01-31 1.048291e-01 0.2051735029 0.1182713564 0.290330213 0.0145631730
## 2023-02-28 2.291852e-02 -0.0902516639 -0.1007319530 0.172531448 -0.0121679609
## 2023-03-31 1.121214e-01 0.0918019370 0.1412533862 0.179536469 0.0408373846
## 2023-04-28 2.857496e-02 0.0206963031 0.0397753350 -0.001008501 0.0235919492
## 2023-05-31 4.502915e-02 0.1340765703 0.1310218362 0.310008368 -0.0237417953
## 2023-06-30 9.014245e-02 0.0779864104 -0.0196454520 0.111729523 0.0678438856
## 2023-07-31 1.270419e-02 0.0251489708 0.0956332966 0.099530705 0.0169067453
## 2023-08-31 -4.330822e-02 0.0318772770 0.0313565924 0.054674139 0.0206048549
## 2023-09-29 -9.285926e-02 -0.0821945627 -0.0408674843 -0.126218634 -0.0166184735
## 2023-10-31 -2.573292e-03 0.0458940197 -0.0509540720 -0.064546283 0.0215261238
## 2023-11-30 1.077599e-01 0.0931972815 0.0665316608 0.137050195 -0.0483955215
## 2023-12-29 1.349097e-02 0.0392628771 0.0510206296 0.057262978 0.0162176573
## 2024-01-31 -4.314458e-02 0.0212288659 0.0061544736 0.217059090 0.0470821823
## 2024-02-29 -1.871724e-02 0.1300782611 -0.0143480231 0.251388473 0.0620582484
## 2024-03-28 -5.264825e-02 0.0202729146 0.0855197990 0.132939814 0.0296684161
## 2024-04-30 -6.728823e-03 -0.0302797899 0.0781716500 -0.044746643 -0.0137217594
## 2024-05-31 1.224142e-01 0.0081949152 0.0550643605 0.238127592 0.1060150622
## 2024-06-28 9.125894e-02 0.0910037984 0.0540904177 0.119508730 0.0292220838
## 2024-07-31 5.298215e-02 -0.0329830511 -0.0576203345 -0.054220221 0.0136416985
## 2024-08-30 3.184118e-02 -0.0464130352 -0.0475463552 0.019883122 0.1207588278
## 2024-09-30 1.731647e-02 0.0429307038 0.0138345586 0.017277905 0.0445700315
## 2024-10-31 -3.090179e-02 0.0003755644 0.0323671809 0.089122711 0.0147512106
## 2024-11-29 5.041443e-02 0.1091142212 -0.0128215042 0.040520676 0.1210994093
## 2024-12-31 5.368794e-02 0.0538418744 0.1117943508 -0.028993151 -0.0213044630
## 2025-01-31 -5.930764e-02 0.0800742352 0.0765953722 -0.111926733 0.0829078126
## 2025-02-28 2.554335e-02 -0.1130190481 -0.1771597253 0.039598590 0.0045738759
## 2025-03-31 -8.501350e-02 -0.1095146233 -0.0963049079 -0.141937952 -0.1134827708
## 2025-04-30 -4.432080e-02 -0.0311757737 0.0293916110 0.004970100 0.1023373489
## 2025-05-30 -5.507314e-02 0.1058429765 0.0717033061 0.215623633 0.0174174905
## 2025-06-23 3.230990e-03 0.0167364202 -0.0391749102 0.064825280 -0.0086474770
# Covariance of asset returns
covariance_matrix <- cov(asset_returns_wide_tbl)
covariance_matrix
## AAPL AMZN GOOG NVDA WMT
## AAPL 0.005988286 0.0031693563 0.0020006526 0.004946944 0.0011482645
## AMZN 0.003169356 0.0071702537 0.0036288704 0.005523510 0.0009447362
## GOOG 0.002000653 0.0036288704 0.0044921405 0.003823419 0.0005812436
## NVDA 0.004946944 0.0055235098 0.0038234190 0.014836717 0.0013762290
## WMT 0.001148264 0.0009447362 0.0005812436 0.001376229 0.0027830049
# 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.06417463
# 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.01477903 0.01756867 0.009750324 0.02021753 0.001859061
rowSums(component_contribution)
## [1] 0.06417463
# 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.23 0.274 0.152 0.315 0.029
component_percentages %>%
as_tibble() %>%
gather(key = "asset", value = "contribution")
## # A tibble: 5 × 2
## asset contribution
## <chr> <dbl>
## 1 AAPL 0.23
## 2 AMZN 0.274
## 3 GOOG 0.152
## 4 NVDA 0.315
## 5 WMT 0.029
# 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.555895e-01 0.0566799395 0.0660632798 0.000000000 0.0248964862
## 2013-02-28 -2.561086e-02 -0.0046435024 0.0584792173 0.038221622 0.0117959352
## 2013-03-28 2.850072e-03 0.0083654162 -0.0087877361 0.013338757 0.0620728977
## 2013-04-30 2.711569e-04 -0.0487507497 0.0375394422 0.070706346 0.0378943615
## 2013-05-31 2.217194e-02 0.0588686246 0.0550323967 0.054651763 -0.0317802558
## 2013-06-28 -1.258960e-01 0.0310507506 0.0104476577 -0.030167154 -0.0046876002
## 2013-07-31 1.321026e-01 0.0813355350 0.0083479451 0.028091793 0.0452743022
## 2013-08-30 8.044266e-02 -0.0695574090 -0.0471074902 0.026270625 -0.0596998487
## 2013-09-30 -2.172356e-02 0.1067688897 0.0336806763 0.053460221 0.0133385480
## 2013-10-31 9.201562e-02 0.1521839116 0.1626137117 -0.024066344 0.0370291256
## 2013-11-29 6.770813e-02 0.0781496860 0.0277603257 0.032035029 0.0540194407
## 2013-12-31 8.861837e-03 0.0130490386 0.0560802043 0.026566717 -0.0232522463
## 2014-01-31 -1.139491e-01 -0.1059765119 0.0523738801 -0.020176833 -0.0523034611
## 2014-02-28 5.591844e-02 0.0094619003 0.0289427580 0.162107250 0.0002677538
## 2014-03-31 1.975599e-02 -0.0737086161 -0.0863762133 -0.025903999 0.0293258436
## 2014-04-30 9.476153e-02 -0.1007565303 -0.0559561467 0.030788690 0.0420196946
## 2014-05-30 7.576502e-02 0.0273091844 0.0611851461 0.032886358 -0.0314089184
## 2014-06-30 2.728661e-02 0.0383836202 0.0271166371 -0.024508565 -0.0223930067
## 2014-07-31 2.832602e-02 -0.0369768154 -0.0064175410 -0.057729646 -0.0200477931
## 2014-08-29 7.465189e-02 0.0799468404 0.0000000000 0.110060269 0.0323258024
## 2014-09-30 -1.722075e-02 -0.0502010184 0.0100264942 -0.052783013 0.0127659211
## 2014-10-31 6.948855e-02 -0.0540982347 -0.0321733230 0.057399397 -0.0026189665
## 2014-11-28 1.007310e-01 0.1031187277 -0.0313403078 0.074852179 0.1378163877
## 2014-12-31 -7.460603e-02 -0.0872368614 -0.0288908374 -0.044863678 -0.0135737394
## 2015-01-30 5.961174e-02 0.1330922557 0.0153077121 -0.043318607 -0.0105353173
## 2015-02-27 9.601593e-02 0.0697992426 0.0437064049 0.142698813 -0.0124325358
## 2015-03-31 -3.187455e-02 -0.0214295755 -0.0188002124 -0.052582641 -0.0142314927
## 2015-04-30 5.769711e-03 0.1253212736 -0.0169025636 0.058909013 -0.0524137229
## 2015-05-29 4.434117e-02 0.0175090293 -0.0097807214 0.001459651 -0.0433514047
## 2015-06-30 -3.793780e-02 0.0112589814 -0.0220412667 -0.095716821 -0.0460135050
## 2015-07-31 -3.348140e-02 0.2111621090 0.1839181240 -0.007988109 0.0146947358
## 2015-08-31 -6.848860e-02 -0.0443525782 -0.0118342108 0.123595788 -0.0993582739
## 2015-09-30 -2.205763e-02 -0.0019516837 -0.0160275436 0.092150498 0.0016979334
## 2015-10-30 8.011224e-02 0.2010808743 0.1555398378 0.140555354 -0.1246697486
## 2015-11-30 -5.821141e-03 0.0602956777 0.0437522973 0.115405464 0.0275687452
## 2015-12-31 -1.167902e-01 0.0165440008 0.0216859867 0.038347310 0.0492989546
## 2016-01-29 -7.822393e-02 -0.1410054620 -0.0212149266 -0.118048739 0.0793152644
## 2016-02-29 -1.288332e-03 -0.0605352209 -0.0627389924 0.071923621 -0.0003019546
## 2016-03-31 1.197463e-01 0.0717834363 0.0654277078 0.127655013 0.0392708788
## 2016-04-29 -1.507313e-01 0.1053453760 -0.0722728572 -0.002810730 -0.0239374670
## 2016-05-31 6.931408e-02 0.0915002899 0.0598051178 0.276388583 0.0641208394
## 2016-06-30 -4.359630e-02 -0.0099694639 -0.0611191959 0.006187771 0.0311569345
## 2016-07-29 8.623564e-02 0.0586021229 0.1050874544 0.194443851 -0.0006848016
## 2016-08-31 2.337648e-02 0.0135476418 -0.0022657856 0.073468945 -0.0143682073
## 2016-09-30 6.344789e-02 0.0848953908 0.0132613605 0.110693825 0.0094735775
## 2016-10-31 4.325033e-03 -0.0583893058 0.0092842751 0.037805123 -0.0295506001
## 2016-11-30 -2.183740e-02 -0.0509721927 -0.0343614641 0.260525005 0.0058384312
## 2016-12-30 4.684052e-02 -0.0009330556 0.0180152114 0.146436015 -0.0116433958
## 2017-01-31 4.664166e-02 0.0936394059 0.0318396138 0.022602091 -0.0350396664
## 2017-02-28 1.255554e-01 0.0258446800 0.0326201813 -0.071874729 0.0608887833
## 2017-03-31 4.754149e-02 0.0479423007 0.0076841167 0.070843684 0.0234092096
## 2017-04-28 -6.948519e-05 0.0424566944 0.0880998194 -0.043434222 0.0421085985
## 2017-05-31 6.560687e-02 0.0725778018 0.0629878379 0.326022273 0.0511562506
## 2017-06-30 -5.891557e-02 -0.0271286156 -0.0599350913 0.001453787 -0.0378574769
## 2017-07-31 3.218054e-02 0.0202278808 0.0236741699 0.117044681 0.0553875613
## 2017-08-31 1.016528e-01 -0.0072953953 0.0094447228 0.042639686 -0.0180256417
## 2017-09-29 -6.213454e-02 -0.0198260355 0.0208390414 0.053601227 0.0008963248
## 2017-10-31 9.240355e-02 0.1395154056 0.0582525387 0.145699904 0.1109628938
## 2017-11-30 2.007489e-02 0.0626577318 0.0046809605 -0.029244863 0.1076144265
## 2017-12-29 -1.536311e-02 -0.0062057845 0.0241716428 -0.036583533 0.0207683569
## 2018-01-31 -1.069346e-02 0.2156265497 0.1115967462 0.239240694 0.0764919287
## 2018-02-28 6.596099e-02 0.0415536279 -0.0573515072 -0.014959068 -0.1691626187
## 2018-03-29 -5.980378e-02 -0.0440034760 -0.0683058094 -0.043969090 -0.0056771259
## 2018-04-30 -1.513365e-02 0.0788803060 -0.0141135966 -0.029312700 -0.0057486138
## 2018-05-31 1.267423e-01 0.0397392430 0.0643891622 0.115144834 -0.0629874247
## 2018-06-29 -9.462936e-03 0.0421636787 0.0278664867 -0.062544600 0.0369863553
## 2018-07-31 2.759879e-02 0.0446635734 0.0871652464 0.033048541 0.0409478821
## 2018-08-31 1.826733e-01 0.1243079079 0.0007637402 0.137075515 0.0774629470
## 2018-09-28 -8.337505e-03 -0.0048359814 -0.0205010934 0.001210694 -0.0205521056
## 2018-10-31 -3.095171e-02 -0.2258869989 -0.1028992930 -0.287373721 0.0656295122
## 2018-11-30 -1.999127e-01 0.0560700324 0.0162678346 -0.253667635 -0.0265766877
## 2018-12-31 -1.240882e-01 -0.1180514843 -0.0552430676 -0.202282897 -0.0417363612
## 2019-01-31 5.368643e-02 0.1348080312 0.0750918282 0.073974090 0.0283645779
## 2019-02-28 4.380302e-02 -0.0469930640 0.0031747935 0.071593993 0.0324432059
## 2019-03-29 9.260252e-02 0.0824420184 0.0465716076 0.151869878 -0.0094927305
## 2019-04-30 5.490106e-02 0.0786806224 0.0128463463 0.007987947 0.0530143331
## 2019-05-31 -1.326322e-01 -0.0818753491 -0.0740704194 -0.288680191 -0.0084087038
## 2019-06-28 1.226771e-01 0.0646557767 -0.0208014749 0.192591471 0.0854575696
## 2019-07-31 7.361715e-02 -0.0142806686 0.1183225574 0.026972619 -0.0009961943
## 2019-08-30 -1.659836e-02 -0.0496880810 -0.0237704953 -0.006207983 0.0394582091
## 2019-09-30 7.042270e-02 -0.0229951159 0.0256755699 0.038414427 0.0379539897
## 2019-10-31 1.049763e-01 0.0232034080 0.0331681674 0.143946784 -0.0120369749
## 2019-11-29 7.469385e-02 0.0134958216 0.0349734715 0.076031703 0.0154858360
## 2019-12-31 9.420403e-02 0.0257863501 0.0242706486 0.082163082 0.0023739988
## 2020-01-31 5.260181e-02 0.0834803026 0.0701850863 0.004790585 -0.0372906121
## 2020-02-28 -1.218302e-01 -0.0642332026 -0.0684587808 0.133626976 -0.0613237161
## 2020-03-31 -7.231453e-02 0.0344213022 -0.1413299776 -0.024248260 0.0581110081
## 2020-04-30 1.444240e-01 0.2381504762 0.1482720206 0.103279476 0.0674660211
## 2020-05-29 8.166654e-02 -0.0128673719 0.0578073161 0.194461437 0.0248286140
## 2020-06-30 1.374866e-01 0.1218341331 -0.0107722281 0.068216722 -0.0351084444
## 2020-07-31 1.528343e-01 0.1372488933 0.0478934250 0.111189855 0.0772516584
## 2020-08-31 1.960348e-01 0.0866005735 0.0971010316 0.231105224 0.0745885726
## 2020-09-30 -1.081714e-01 -0.0916533253 -0.1061506874 0.011895609 0.0076049219
## 2020-10-30 -6.188831e-02 -0.0364089187 0.0980589394 -0.076501466 -0.0083254750
## 2020-11-30 9.120484e-02 0.0425228214 0.0826849071 0.066921657 0.0963907628
## 2020-12-31 1.084718e-01 0.0276719582 -0.0050446964 -0.025899896 -0.0545614647
## 2021-01-29 -5.516586e-03 -0.0156985929 0.0467581389 -0.005010664 -0.0257179018
## 2021-02-26 -8.306877e-02 -0.0359675607 0.1039617672 0.054292855 -0.0782174175
## 2021-03-31 7.312841e-03 0.0003717151 0.0154771777 -0.026722864 0.0486516361
## 2021-04-30 7.345274e-02 0.1139202399 0.1527898791 0.117297878 0.0295951215
## 2021-05-28 -5.181644e-02 -0.0730764715 0.0005973392 0.079070858 0.0189586294
## 2021-06-30 9.449976e-02 0.0651836137 0.0385416692 0.208332129 -0.0071367001
## 2021-07-30 6.295852e-02 -0.0332696301 0.0760718946 -0.025494040 0.0107910215
## 2021-08-31 4.161135e-02 0.0421339363 0.0730044848 0.138204144 0.0418682078
## 2021-09-30 -7.046167e-02 -0.0550034409 -0.0875714257 -0.077484672 -0.0606836923
## 2021-10-29 5.700123e-02 0.0262547651 0.1066947199 0.210396143 0.0695570278
## 2021-11-30 9.991924e-02 0.0391473463 -0.0400332145 0.245338529 -0.0606289021
## 2021-12-31 7.160291e-02 -0.0505062029 0.0155159762 -0.105149809 0.0324794999
## 2022-01-31 -1.583671e-02 -0.1085098142 -0.0640854509 -0.183267303 -0.0343090224
## 2022-02-28 -5.558244e-02 0.0263230079 -0.0059682847 -0.004133287 -0.0338251663
## 2022-03-31 5.588259e-02 0.0596239190 0.0346686274 0.112575858 0.1008101182
## 2022-04-29 -1.021777e-01 -0.2711856801 -0.1944951028 -0.386065708 0.0269633748
## 2022-05-31 -5.603720e-02 -0.0333130879 -0.0081002919 0.006717049 -0.1698040379
## 2022-06-30 -8.493693e-02 -0.1238178226 -0.0417809926 -0.208219210 -0.0563676929
## 2022-07-29 1.728044e-01 0.2394860591 0.0643327814 0.180792291 0.0826080882
## 2022-08-31 -3.170505e-02 -0.0625299224 -0.0663691019 -0.185089376 0.0081252642
## 2022-09-30 -1.289441e-01 -0.1149865758 -0.1268137319 -0.217576866 -0.0217358814
## 2022-10-31 1.039556e-01 -0.0981105335 -0.0156178462 0.106043987 0.0929242403
## 2022-11-30 -3.358533e-02 -0.0593198454 0.0692744662 0.226462114 0.0684914656
## 2022-12-30 -1.304189e-01 -0.1391406409 -0.1339679265 -0.146693623 -0.0685302243
## 2023-01-31 1.048291e-01 0.2051735029 0.1182713564 0.290330213 0.0145631730
## 2023-02-28 2.291852e-02 -0.0902516639 -0.1007319530 0.172531448 -0.0121679609
## 2023-03-31 1.121214e-01 0.0918019370 0.1412533862 0.179536469 0.0408373846
## 2023-04-28 2.857496e-02 0.0206963031 0.0397753350 -0.001008501 0.0235919492
## 2023-05-31 4.502915e-02 0.1340765703 0.1310218362 0.310008368 -0.0237417953
## 2023-06-30 9.014245e-02 0.0779864104 -0.0196454520 0.111729523 0.0678438856
## 2023-07-31 1.270419e-02 0.0251489708 0.0956332966 0.099530705 0.0169067453
## 2023-08-31 -4.330822e-02 0.0318772770 0.0313565924 0.054674139 0.0206048549
## 2023-09-29 -9.285926e-02 -0.0821945627 -0.0408674843 -0.126218634 -0.0166184735
## 2023-10-31 -2.573292e-03 0.0458940197 -0.0509540720 -0.064546283 0.0215261238
## 2023-11-30 1.077599e-01 0.0931972815 0.0665316608 0.137050195 -0.0483955215
## 2023-12-29 1.349097e-02 0.0392628771 0.0510206296 0.057262978 0.0162176573
## 2024-01-31 -4.314458e-02 0.0212288659 0.0061544736 0.217059090 0.0470821823
## 2024-02-29 -1.871724e-02 0.1300782611 -0.0143480231 0.251388473 0.0620582484
## 2024-03-28 -5.264825e-02 0.0202729146 0.0855197990 0.132939814 0.0296684161
## 2024-04-30 -6.728823e-03 -0.0302797899 0.0781716500 -0.044746643 -0.0137217594
## 2024-05-31 1.224142e-01 0.0081949152 0.0550643605 0.238127592 0.1060150622
## 2024-06-28 9.125894e-02 0.0910037984 0.0540904177 0.119508730 0.0292220838
## 2024-07-31 5.298215e-02 -0.0329830511 -0.0576203345 -0.054220221 0.0136416985
## 2024-08-30 3.184118e-02 -0.0464130352 -0.0475463552 0.019883122 0.1207588278
## 2024-09-30 1.731647e-02 0.0429307038 0.0138345586 0.017277905 0.0445700315
## 2024-10-31 -3.090179e-02 0.0003755644 0.0323671809 0.089122711 0.0147512106
## 2024-11-29 5.041443e-02 0.1091142212 -0.0128215042 0.040520676 0.1210994093
## 2024-12-31 5.368794e-02 0.0538418744 0.1117943508 -0.028993151 -0.0213044630
## 2025-01-31 -5.930764e-02 0.0800742352 0.0765953722 -0.111926733 0.0829078126
## 2025-02-28 2.554335e-02 -0.1130190481 -0.1771597253 0.039598590 0.0045738759
## 2025-03-31 -8.501350e-02 -0.1095146233 -0.0963049079 -0.141937952 -0.1134827708
## 2025-04-30 -4.432080e-02 -0.0311757737 0.0293916110 0.004970100 0.1023373489
## 2025-05-30 -5.507314e-02 0.1058429765 0.0717033061 0.215623633 0.0174174905
## 2025-06-23 3.230990e-03 0.0167364202 -0.0391749102 0.064825280 -0.0086474770
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.23 0.274 0.152 0.315 0.029
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.