The hardware and bandwidth for this mirror is donated by dogado GmbH, the Webhosting and Full Service-Cloud Provider. Check out our Wordpress Tutorial.
If you wish to report a bug, or if you are interested in having us mirror your free-software or open-source project, please feel free to contact us at mirror[@]dogado.de.
library(FFdownload)
library(tidyverse)
outd <- paste0("data/", format(Sys.time(), "%F_%H-%M"))
outfile <- paste0(outd, "FFData_tbl.RData")This vignette covers the tidyverse workflow. For the step-by-step xts
workflow (with separate download and processing stages), see
vignette("FFD-xts-how-to").
FFget() (new in v1.2.0)FFget() is the simplest way to get a single dataset into
your session. It returns a tibble directly — no intermediate
.RData file, no load() call. Missing-value
sentinels (-99, -999, -99.99) are
converted to NA by default.
# Monthly FF 3-factor data as a tibble, NAs handled automatically
ff3 <- FFget("F-F_Research_Data_Factors", subtable = "Temp2")
head(ff3)
#> # A tibble: 6 × 5
#> date Mkt.RF SMB HML RF
#> <yearmon> <dbl> <dbl> <dbl> <dbl>
#> 1 Jul 1926 2.89 -2.55 -2.39 0.22
#> ...Use frequency = NULL to get all frequencies at once, or
subtable = NULL to get all sub-tables within a
frequency:
# All sub-tables for the monthly frequency
ff3_monthly <- FFget("F-F_Research_Data_Factors", subtable = NULL)
names(ff3_monthly) # e.g. "Temp2"
# Annual data as xts
ff3_ann_xts <- FFget("F-F_Research_Data_Factors", frequency = "annual", format = "xts")FFlist() and
FFmatch()Before downloading, browse all available datasets and check that your search strings match the intended files:
FFmatch(c("Research_Data_Factors", "Momentum_Factor"))
#> # A tibble: 2 × 4
#> requested matched edit_distance similarity
#> <chr> <chr> <int> <dbl>
#> 1 Research_Data_Factors F-F_Research_Data_Factors 3 0.87
#> 2 Momentum_Factor F-F_Momentum_Factor 4 0.78FFdownload() (classic API)For downloading multiple datasets in one call and/or saving a dated
snapshot for reproducible research, use FFdownload()
directly with format = "tibble".
For a detailed explanation of the download / process separation, see
vignette("FFD-xts-how-to"). Here we download and process in
one step:
inputlist <- c("F-F_Research_Data_Factors_CSV","F-F_Momentum_Factor_CSV")
FFdownload(exclude_daily=TRUE, tempd=outd, download=TRUE, download_only=FALSE,
inputlist=inputlist, output_file=outfile, format="tibble")
#> Step 1: getting list of all the csv-zip-files!
#> Step 2: Downloading 2 zip-files
#> Step 3: Start processing 2 csv-files
#> | | | 0% | |=================================== | 50% | |======================================================================| 100%
#> Be aware that as of version 1.0.6 the saved object is named FFdata rather than FFdownload to not be confused with the corresponding command!Replace French’s missing-value codes with NA during
processing:
FFdownload(exclude_daily=TRUE, tempd=outd, download=TRUE, download_only=FALSE,
inputlist=inputlist, output_file=outfile, format="tibble",
na_values=c(-99, -999, -99.99))Return the data list directly in addition to saving the file:
FFdata <- FFdownload(exclude_daily=TRUE, tempd=outd, download=TRUE,
download_only=FALSE, inputlist=inputlist,
output_file=outfile, format="tibble",
return_data=TRUE)load(outfile)
ls.str(FFdata)
#> x_F-F_Momentum_Factor : List of 3
#> $ annual :List of 1
#> $ monthly:List of 1
#> $ daily : Named list()
#> x_F-F_Research_Data_Factors : List of 3
#> $ annual :List of 1
#> $ monthly:List of 1
#> $ daily : Named list()Verify that the sub-tables are tibbles:
str(FFdata$`x_F-F_Research_Data_Factors`$monthly$Temp2)
#> tibble [1,194 × 5] (S3: tbl_df/tbl/data.frame)
#> $ date : 'yearmon' num [1:1194] Jul 1926 Aug 1926 Sep 1926 Okt 1926 ...
#> $ Mkt.RF: num [1:1194] 2.89 2.64 0.38 -3.27 2.54 2.62 -0.05 4.17 0.14 0.47 ...
#> $ SMB : num [1:1194] -2.55 -1.14 -1.36 -0.14 -0.11 -0.07 -0.32 0.07 -1.77 0.39 ...
#> $ HML : num [1:1194] -2.39 3.81 0.05 0.82 -0.61 0.06 4.58 2.72 -2.38 0.65 ...
#> $ RF : num [1:1194] 0.22 0.25 0.23 0.32 0.31 0.28 0.25 0.26 0.3 0.25 ...Merge the two datasets (the date column is a
yearmon object and serves as the join key):
FFfour <- FFdata$`x_F-F_Research_Data_Factors`$monthly$Temp2 %>%
left_join(FFdata$`x_F-F_Momentum_Factor`$monthly$Temp2, by="date")
FFfour %>% head()
#> # A tibble: 6 × 6
#> date Mkt.RF SMB HML RF Mom
#> <yearmon> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 Jul 1926 2.89 -2.55 -2.39 0.22 NA
#> 2 Aug 1926 2.64 -1.14 3.81 0.25 NA
#> 3 Sep 1926 0.38 -1.36 0.05 0.23 NA
#> 4 Okt 1926 -3.27 -0.14 0.82 0.32 NA
#> 5 Nov 1926 2.54 -0.11 -0.61 0.31 NA
#> 6 Dez 1926 2.62 -0.07 0.06 0.28 NAPlot cumulative wealth indices using pivot_longer() and
ggplot2:
FFfour %>%
pivot_longer(Mkt.RF:Mom, names_to="FFVar", values_to="FFret") %>%
mutate(FFret=FFret/100, date=as.Date(date)) %>%
filter(date>="1960-01-01", !FFVar=="RF") %>%
group_by(FFVar) %>% arrange(FFVar, date) %>%
mutate(FFret=ifelse(date=="1960-01-01",1,FFret), FFretv=cumprod(1+FFret)-1) %>%
ggplot(aes(x=date, y=FFretv, col=FFVar, type=FFVar)) + geom_line(lwd=1.2) +
scale_y_log10() +
labs(title="FF4 Factors", subtitle="Cumulative wealth plots", ylab="cum. returns") +
scale_colour_viridis_d("FFvar") +
theme_bw() + theme(legend.position="bottom")
#> Ignoring unknown labels:
#> • ylab : "cum. returns"These binaries (installable software) and packages are in development.
They may not be fully stable and should be used with caution. We make no claims about them.
Health stats visible at Monitor.