Downloading Stock and Factor Data
Simon Mueller
2026-09-06
Source:vignettes/data-download.Rmd
data-download.RmdIntroduction
The EventStudy package includes helper functions to download stock
price data and Fama-French factor data, pre-formatted for use with
EventStudyTask. This eliminates the need for manual data
preparation.
The code in this article is shown for illustration purposes and is not executed at build time because it requires a live network connection.
Downloading Stock Data
The download_stock_data() function downloads adjusted
close prices from Yahoo Finance. It requires either the
tidyquant or quantmod package.
library(EventStudy)
# Download a single stock
aapl <- download_stock_data("AAPL", from = "2023-01-01", to = "2024-12-31")
head(aapl)
#> # A tibble: 6 x 3
#> symbol date adjusted
#> <chr> <chr> <dbl>
#> 1 AAPL 02.01.2023 130.
#> 2 AAPL 03.01.2023 126.
#> ...Multiple Stocks
stocks <- download_stock_data(
c("AAPL", "MSFT", "GOOGL", "AMZN"),
from = "2023-01-01",
to = "2024-12-31"
)Format for EventStudyTask
When format_for_task = TRUE (default), dates are
converted to the dd.mm.yyyy format required by
EventStudyTask:
# Formatted for direct use
firm_data <- download_stock_data(
c("AAPL", "MSFT"),
from = "2022-01-01",
format_for_task = TRUE
)
# Download index data
index_data <- download_stock_data(
"^GSPC", # S&P 500
from = "2022-01-01",
format_for_task = TRUE
)
# Create the task directly
request <- tibble::tibble(
event_id = 1:2,
firm_symbol = c("AAPL", "MSFT"),
index_symbol = "^GSPC",
event_date = c("15.06.2023", "15.06.2023"),
group = "Tech",
event_window_start = -5,
event_window_end = 5,
shift_estimation_window = -6,
estimation_window_length = 120
)
task <- EventStudyTask$new(firm_data, index_data, request)Raw Format
Set format_for_task = FALSE to get the original data
without date conversion:
raw_data <- download_stock_data("AAPL", from = "2023-01-01",
format_for_task = FALSE)Downloading Factor Data
The download_factor_data() function downloads
Fama-French factor data directly from the Kenneth French Data
Library.
Fama-French 3-Factor
ff3 <- download_factor_data(model = "ff3", frequency = "daily")
head(ff3)
#> # A tibble: 6 x 5
#> date market_excess smb hml risk_free_rate
#> <chr> <dbl> <dbl> <dbl> <dbl>
#> 1 03.01.2023 0.0112 0.0023 -0.0045 0.0002
#> ...Fama-French 5-Factor
ff5 <- download_factor_data(model = "ff5", frequency = "daily")
# Includes: market_excess, smb, hml, rmw, cma, risk_free_rateMonthly Frequency
ff3_monthly <- download_factor_data(model = "ff3", frequency = "monthly")Using with Factor Models
# Download data
firm_data <- download_stock_data(c("AAPL", "MSFT"), from = "2022-01-01")
index_data <- download_stock_data("^GSPC", from = "2022-01-01")
factor_tbl <- download_factor_data(model = "ff3", frequency = "daily")
# Create task with factor data
task <- EventStudyTask$new(firm_data, index_data, request,
factor_tbl = factor_tbl)
# Use a factor model
ps <- ParameterSet$new(
return_model = FamaFrench3FactorModel$new()
)
task <- run_event_study(task, ps)Downloading Risk-Free Rate
The download_risk_free_rate() function extracts the
risk-free rate from the FF3 data:
rf <- download_risk_free_rate(frequency = "daily")
head(rf)
#> # A tibble: 6 x 2
#> date risk_free_rate
#> <chr> <dbl>
#> 1 03.01.2023 0.0002
#> ...