install.packages(“remotes”) remotes::install_github(“ropensci/tabulizer”)
install.packages(“pdftools”) library(pdftools)
setwd(“C:\Users\Richard\Documents\KULIAH”)
text <- pdf_text(“EEM Advisor Report.pdf”) cat(text[1]) # Print first page
text <- pdf_text(“GLD Advisor Report.pdf”) cat(text[1]) # Print first page
text <- pdf_text(“IYR Advisor Report.pdf”) cat(text[1]) # Print first page
text <- pdf_text(“TLT Advisor Report.pdf”) cat(text[1]) # Print first page
text <- pdf_text(“EFA Advisor Report.pdf”) cat(text[1]) # Print first page
text <- pdf_text(“IWM Advisor Report.pdf”) cat(text[1]) # Print first page
text <- pdf_text(“QQQ Advisor Report.pdf”) cat(text[1]) # Print first page
text <- pdf_text(“SPY Advisor Report.pdf”) cat(text[1]) # Print first page
library(tidyquant) library(lubridate) library(timetk) library(purrr)
tickers <- c(“SPY”, “QQQ”, “EEM”, “IWM”, “EFA”, “TLT”, “IYR”, “GLD”) start_date <- “2010-01-01” end_date <- Sys.Date()
etf_data <- tq_get(tickers, from = start_date, to = end_date, get = “stock.prices”)
library(dplyr) library(tidyquant)
monthly_returns <- etf_data %>% group_by(symbol) %>% tq_transmute(select = adjusted, mutate_fun = periodReturn, period = “monthly”, type = “arithmetic”, col_rename = “monthly_return”)
weekly_returns <- etf_data %>% group_by(symbol) %>% tq_transmute(select = adjusted, mutate_fun = periodReturn, period = “weekly”, type = “arithmetic”, col_rename = “weekly_return”)
library(readr) library(dplyr)
ff_raw <- read_csv(“F-F_Research_Data_Factors_CSV.zip”, skip = 3)
ff3 <- ff_raw %>% rename(Date = X1, Mkt_RF =
Mkt-RF, SMB = SMB, HML = HML, RF = RF) %>%
filter(!is.na(RF), Date != “Annual Factors: January-December”) %>%
mutate( Date = as.Date(paste0(Date, “01”), format = “%Y%m%d”),
across(Mkt_RF:RF, ~ as.numeric(.) / 100) # Convert from % to decimals
)
monthly_merged <- monthly_returns %>% left_join(ff3, by = c(“date” = “Date”))
library(tidyquant) library(dplyr) library(tidyr)
tickers <- c(“SPY”, “QQQ”, “EEM”, “IWM”, “EFA”, “TLT”, “IYR”, “GLD”) etf_data <- tq_get(tickers, from = “2010-01-01”, to = Sys.Date())
monthly_returns <- etf_data %>% group_by(symbol) %>% tq_transmute(select = adjusted, mutate_fun = periodReturn, period = “monthly”, type = “arithmetic”, col_rename = “monthly_return”
returns_5y <- monthly_returns %>% filter(date >= as.Date(“2019-03-01”) & date <= as.Date(“2024-02-01”)) %>% pivot_wider(names_from = symbol, values_from = monthly_return) %>% na.omit()
cov_matrix <- cov(returns_5y[,-1]) inv_cov <- solve(cov_matrix)
ones <- rep(1, ncol(cov_matrix)) weights_capm <- inv_cov %% ones / as.numeric(t(ones) %% inv_cov %*% ones) colnames(weights_capm) <- colnames(cov_matrix)
returns_ff <- monthly_merged %>% filter(date >= as.Date(“2019-03-01”) & date <= as.Date(“2024-02-01”)) %>% mutate(excess_return = monthly_return - RF) %>% select(symbol, date, excess_return) %>% pivot_wider(names_from = symbol, values_from = excess_return) %>% na.omit()
cov_matrix_ff <- cov(returns_ff[,-1]) inv_cov_ff <- solve(cov_matrix_ff)
weights_ff <- inv_cov_ff %% ones / as.numeric(t(ones) %% inv_cov_ff %*% ones) colnames(weights_ff) <- colnames(cov_matrix_ff)
march_returns <- monthly_returns %>% filter(date == as.Date(“2024-03-01”)) %>% pivot_wider(names_from = symbol, values_from = monthly_return)
capm_return_mar2024 <- as.numeric(as.matrix(march_returns[,-1]) %% weights_capm) ff_return_mar2024 <- as.numeric(as.matrix(march_returns[,-1]) %% weights_ff)
cat(“📈 CAPM Portfolio Return (March 2024):”, round(capm_return_mar2024, 4), “”) cat(“📉 Fama-French Portfolio Return (March 2024):”, round(ff_return_mar2024, 4), “”)