Analýza denných výnosov 10 najväčších akcií S&P 500
Author
Livia
Published
21. 10. 2026
Popis zvolenej databázy
Pre ďalšie hodiny som si zvolila denné burzové údaje 10 najväčších firiem indexu S&P 500 (podľa váhy v indexe): NVDA, AAPL, MSFT, AMZN, GOOGL, GOOG, META, AVGO, TSLA a BRK.B. Ide o časový rad za posledné 2 roky (od 21. 10. 2024 do 16. 10. 2026). Pre každý obchodný deň sú k dispozícii cena otvorenia (Open), najvyššia (High), najnižšia (Low) a zatváracia (Close) cena a objem obchodov (Volume).
Prečo som si ich vybrala. Ide o časový rad, teda údaje zoradené v čase, s pravidelnou dennou frekvenciou. Údaje sú voľne dostupné a dajú sa kedykoľvek aktualizovať, takže sa na nich dá pracovať aj na ďalších hodinách. Súvisia s mojím štúdiom v odbore Data Analytics in Management a so záujmom o využitie dátovej analytiky v investovaní. Desať najväčších firiem indexu S&P 500 predstavuje významnú časť celého trhu, a preto sa na nich dá dobre ukázať riziko a výnos akcií, vzťahy medzi akciami (korelácie, variančno-kovariančná matica) aj regresné modely.
Code
Ticker <-c("NVDA","AAPL","MSFT","AMZN","GOOGL","GOOG","META","AVGO","TSLA","BRK.B")Firma <-c("Nvidia Corp","Apple Inc.","Microsoft Corp","Amazon.com Inc","Alphabet Class A","Alphabet Class C","Meta Platforms","Broadcom Inc.","Tesla Inc.","Berkshire Hathaway Class B")Vaha <-c(7.54, 7.11, 5.61, 3.93, 3.08, 2.87, 2.58, 2.31, 2.01, 1.62)firmy <-data.frame(Ticker, Firma, Vaha)firmy %>%kable(col.names =c("Symbol", "Firma", "Váha v indexe (%)"),align =c("l", "l", "r"),caption ="Vybrané firmy z indexu S&P 500") %>%kable_styling(bootstrap_options =c("striped", "hover", "condensed"),full_width =FALSE, position ="center")
Vybrané firmy z indexu S&P 500
Symbol
Firma
Váha v indexe (%)
NVDA
Nvidia Corp
7.54
AAPL
Apple Inc.
7.11
MSFT
Microsoft Corp
5.61
AMZN
Amazon.com Inc
3.93
GOOGL
Alphabet Class A
3.08
GOOG
Alphabet Class C
2.87
META
Meta Platforms
2.58
AVGO
Broadcom Inc.
2.31
TSLA
Tesla Inc.
2.01
BRK.B
Berkshire Hathaway Class B
1.62
Import údajov
Údaje sú v jednom hárku Excelu, firmy sú pod sebou (každá má približne 500 riadkov) v poradí ako v tabuľke vyššie. Každá firma začína vlastnou hlavičkou. Nový blok údajov preto rozpoznám podľa toho, že dátum skočí späť na začiatok obdobia.
Code
cesta <-"C:/Users/livia/Desktop/modregmet/ekonometria/S&P500.xlsx"tickery <- firmy$Ticker # poradie firiem v Exceli (zhora nadol)# všetko načítame ako text, aby opakované hlavičky (Date, Open, ...) neprekážaliraw <-as.data.frame(read_excel(cesta, col_types ="text"))raw <- raw[, 1:6]names(raw) <-c("Date", "Open", "High", "Low", "Close", "Volume")# prevod dátumu (excelovské poradové číslo alebo text RRRR-MM-DD)na_datum <-function(x) { d <-as.Date(suppressWarnings(as.numeric(x)), origin ="1899-12-30") chyba <-is.na(d) &!is.na(x) d[chyba] <-as.Date(x[chyba], format ="%Y-%m-%d") d}raw$Date <-na_datum(raw$Date)raw <- raw[!is.na(raw$Date), ] # preč opakované hlavičky a prázdne riadkyfor (s inc("Open", "High", "Low", "Close", "Volume")) { raw[[s]] <-suppressWarnings(as.numeric(raw[[s]]))}# nový blok začína tam, kde dátum skočí späťraw$Blok <-cumsum(c(TRUE, diff(raw$Date) <0))stopifnot(max(raw$Blok) ==length(tickery))S_P500 <- raw %>%mutate(Ticker = tickery[Blok]) %>%select(Ticker, Date, Open, High, Low, Close, Volume) %>%arrange(Ticker, Date)head(S_P500)
Výsledkom je jedna tabuľka s 4990 riadkami, v ktorej jeden riadok predstavuje jednu firmu a jeden obchodný deň.
Code
S_P500 %>%group_by(Ticker) %>%summarise(od =min(Date), do =max(Date), pocet_dni =n(), .groups ="drop") %>%kable(caption ="Rozsah údajov podľa firmy") %>%kable_styling(bootstrap_options =c("striped", "hover", "condensed"),full_width =FALSE)
Rozsah údajov podľa firmy
Ticker
od
do
pocet_dni
AAPL
2024-10-21
2026-10-16
499
AMZN
2024-10-21
2026-10-16
499
AVGO
2024-10-21
2026-10-16
499
BRK.B
2024-10-21
2026-10-16
499
GOOG
2024-10-21
2026-10-16
499
GOOGL
2024-10-21
2026-10-16
499
META
2024-10-21
2026-10-16
499
MSFT
2024-10-21
2026-10-16
499
NVDA
2024-10-21
2026-10-16
499
TSLA
2024-10-21
2026-10-16
499
Čistenie údajov
Názvy stĺpcov (Ticker, Date, Open, High, Low, Close, Volume) neobsahujú medzery ani zátvorky, takže ich netreba upravovať. Skontrolujem ešte chýbajúce hodnoty:
Code
colSums(is.na(S_P500))
Ticker Date Open High Low Close Volume
0 0 0 0 0 0 0
V údajoch sa nenachádzajú žiadne chýbajúce hodnoty, preto netreba nič doplňovať (imputovať).
Denné výnosy
Denný logaritmický výnos je \(r_t = \ln(P_t / P_{t-1})\). Pridám ho do tabuľky spolu s cenou prepočítanou na bázu 100 (cena prvého dňa = 100), aby sa dali porovnať firmy s rôznou cenou akcie.
Graf ukazuje, ako sa vyvíjala hodnota 100 € investovaných do jednotlivých akcií v prvý deň sledovaného obdobia. Firmy sa výrazne líšia v tom, ako rýchlo rástli a ako veľmi ich cena kolísala.
Boxplot denných výnosov
Code
S_P500 %>%filter(!is.na(Vynos)) %>%ggplot(aes(x = Ticker, y = Vynos)) +geom_boxplot(fill ="lightblue", color ="darkblue", outlier.size =0.8) +theme_minimal() +labs(title ="Rozdelenie denných výnosov", x ="Firma", y ="Log. výnos")
Výnosy všetkých firiem sa sústreďujú okolo nuly. Najužšiu škatuľu (najmenšie kolísanie) má BRK.B, najširšiu TSLA a AVGO. U všetkých firiem vidno extrémne dni (body mimo škatule), čo je pri akciách typické.
Scatter plot
Pre ďalšie výpočty potrebujem výnosy v „širokom“ tvare, teda jeden stĺpec na firmu a jeden riadok na deň:
ggplot(vynosy_wide, aes(x = MSFT, y = AAPL)) +geom_point(alpha =0.5) +geom_smooth(method ="lm", se =FALSE, colour ="darkorange2") +theme_minimal() +labs(title ="Denné výnosy: MSFT vs AAPL", x ="MSFT", y ="AAPL")
Medzi dennými výnosmi MSFT a AAPL je kladný vzťah: keď rastie jedna akcia, spravidla rastie aj druhá. Vzťah však nie je veľmi tesný, body sú okolo priamky dosť rozptýlené.
Priemerný denný výnos je u všetkých firiem veľmi malý (od 0,03 % u BRK.B po 0,15 % u GOOGL). Rozdiely vo volatilite (smerodajná odchýlka) sú oveľa výraznejšie. Najstabilnejšia je BRK.B (0,011), najrizikovejšia TSLA (0,037), čo je približne trojnásobok. Vyššie riziko však v tomto období neprinieslo úmerne vyšší priemerný výnos.
Testovanie hypotéz
t-test: porovnanie priemerného výnosu NVDA a MSFT
Code
t.test(vynosy_wide$NVDA, vynosy_wide$MSFT)
Welch Two Sample t-test
data: vynosy_wide$NVDA and vynosy_wide$MSFT
t = 0.27391, df = 856.79, p-value = 0.7842
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
-0.002513385 0.003328689
sample estimates:
mean of x mean of y
0.0008472028 0.0004395507
Priemerný denný výnos NVDA (0,085 %) je vyšší ako MSFT (0,044 %), ale rozdiel nie je štatisticky významný (p = 0,78), interval spoľahlivosti obsahuje nulu. Na hladine 5 % teda nezamietame, že sú priemerné výnosy rovnaké.
ANOVA: líšia sa priemerné denné výnosy medzi firmami?
Code
vynosy_long <- S_P500 %>%filter(!is.na(Vynos))anova.result <-aov(Vynos ~ Ticker, data = vynosy_long)summary(anova.result)
Df Sum Sq Mean Sq F value Pr(>F)
Ticker 9 0.0008 0.0000889 0.152 0.998
Residuals 4970 2.9079 0.0005851
Ani medzi všetkými desiatimi firmami nie je štatisticky významný rozdiel v priemerných denných výnosoch (p = 0,998). Treba však dodať, že výnosy firiem v ten istý deň spolu súvisia, takže predpoklad nezávislosti skupín nie je celkom splnený a výsledok je skôr orientačný.
Lineárna regresia: výnos AAPL vysvetlený výnosmi MSFT a NVDA
Code
model <-lm(AAPL ~ MSFT + NVDA, data = vynosy_wide)summary(model)
Call:
lm(formula = AAPL ~ MSFT + NVDA, data = vynosy_wide)
Residuals:
Min 1Q Median 3Q Max
-0.087122 -0.008264 0.000190 0.008299 0.098735
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.0005263 0.0007613 0.691 0.49
MSFT 0.2162356 0.0460445 4.696 3.44e-06 ***
NVDA 0.1310085 0.0303476 4.317 1.91e-05 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 0.01695 on 493 degrees of freedom
Multiple R-squared: 0.1247, Adjusted R-squared: 0.1212
F-statistic: 35.12 on 2 and 493 DF, p-value: 5.509e-15
Výnosy MSFT aj NVDA významne (p < 0,001) vysvetľujú výnos AAPL. Ak výnos MSFT vzrastie o 1 percentuálny bod, výnos AAPL vzrastie v priemere o 0,22 p. b. (pri nezmenenom NVDA). Pri NVDA je to 0,13 p. b. Konštanta nie je významná (p = 0,49). Model však vysvetľuje len okolo 12 % variability výnosu AAPL (R² = 0,125), výnos Apple teda závisí najmä od iných faktorov než od týchto dvoch akcií.
Prvá vlastná hodnota vysvetľuje približne 49 % celkového rozptylu výnosov a prvé tri spolu približne 74 %. Prvá hlavná zložka teda zodpovedá spoločnému pohybu celého trhu, ktorý ovplyvňuje všetky akcie naraz. Najmenšia vlastná hodnota je takmer nulová (\(1{,}5 \cdot 10^{-6}\)), pretože GOOG a GOOGL sú dve triedy akcií tej istej firmy a ich výnosy sú takmer totožné (korelácia približne 0,99). Matica je preto takmer singulárna, čo treba mať na pamäti pri ďalších výpočtoch (napríklad pri inverzii matice).
Záver
V dokumente som načítala denné údaje 10 najväčších akcií indexu S&P 500, overila ich kvalitu (bez chýbajúcich hodnôt), spočítala denné výnosy a ukázala ich základné štatistiky, vzťahy medzi akciami a jednoduchý regresný model. Na ďalších hodinách chcem údaje využiť na modelovanie rizika a výnosu portfólia z týchto akcií.
Zdroje
Cenové údaje: Google Finance (funkcia GOOGLEFINANCE v Google Sheets).
Váhy firiem v indexe S&P 500: verejne dostupný zoznam najväčších zložiek indexu.