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

monthly_returns <- etf_data %>% group_by(symbol) %>% tq_transmute(select = adjusted, mutate_fun = periodReturn, period = “monthly”, type = “arithmetic”, col_rename = “monthly_return”)

Weekly returns

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)

Load the file - adjust path to where you saved the CSV

ff_raw <- read_csv(“F-F_Research_Data_Factors_CSV.zip”, skip = 3)

Clean and format

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 )

Merge by date

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”

Reshape to wide format

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()

Calculate covariance matrix

cov_matrix <- cov(returns_5y[,-1]) inv_cov <- solve(cov_matrix)

Minimum Variance Portfolio weights

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)

Realized portfolio returns

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), “”)