# ============================================================
# CAPM 베타 추정: 미래에셋증권(006800.KS) - 4개국 시장
# 모형: (Ri - Rf_KR) = α + β1(Rm_KR - Rf_KR) + β2(Rm_US - Rf_US)
# + β3(Rm_CN - Rf_CN) + β4(Rm_JP - Rf_JP) + ε
# ============================================================
library(tidyquant)
library(tidyr)
library(dplyr)
library(lubridate)
# ── 1. 주가 및 무위험이자율 수집 ─────────────────────────────
raw_data <- tq_get(c("^KS200", "006800.KS", "^SP500TR", "000001.SS", "^N225"),
get = "stock.prices", from = "2010-01-01", to = Sys.Date())
rf_raw <- tq_get(c("TB3MS", # 미국: 3개월 T-Bill
"IRSTCI01KRM156N", # 한국: 콜금리
"IRSTCI01CNM156N", # 중국: 단기금리
"IRSTCI01JPM156N"), # 일본: 콜금리
get = "economic.data", from = "2010-01-01", to = Sys.Date())
# ── 2. 월별 수익률 계산 ──────────────────────────────────────
monthly_returns <- raw_data %>%
drop_na(adjusted) %>%
group_by(symbol) %>%
tq_transmute(select = adjusted, mutate_fun = periodReturn,
period = "monthly", col_rename = "monthly_return")
# ── 3. 무위험이자율 전처리 (연율 % → 월복리) ─────────────────
rf_monthly <- rf_raw %>%
mutate(date = floor_date(date, "month"),
rf_rate = (1 + price / 100)^(1/12) - 1) %>%
select(symbol, date, rf_rate) %>%
pivot_wider(names_from = symbol, values_from = rf_rate) %>%
rename(rf_US = TB3MS,
rf_KR = IRSTCI01KRM156N,
rf_CN = IRSTCI01CNM156N,
rf_JP = IRSTCI01JPM156N)
# ── 4. Wide format 변환 및 무위험이자율 병합 ─────────────────
returns_wide <- monthly_returns %>%
pivot_wider(names_from = symbol, values_from = monthly_return) %>%
rename(KOSPI200 = `^KS200`,
MiraeAsset = `006800.KS`,
SP500 = `^SP500TR`,
SSE = `000001.SS`,
N225 = `^N225`) %>%
mutate(date = floor_date(date, "month")) %>%
left_join(rf_monthly, by = "date") %>%
fill(rf_US, rf_KR, rf_CN, rf_JP, .direction = "down")
# ── 5. 국가별 초과수익률 계산 및 Lag 변수 생성 ───────────────
returns_wide <- returns_wide %>%
mutate(excess_market_KR = KOSPI200 - rf_KR,
excess_stock = MiraeAsset - rf_KR,
excess_market_US = SP500 - rf_US,
excess_market_CN = SSE - rf_CN,
excess_market_JP = N225 - rf_JP,
excess_SP500_lag = lag(excess_market_US),
excess_SSE_lag = lag(excess_market_CN)) %>%
drop_na()
# ── 6. CAPM 회귀분석 ─────────────────────────────────────────
beta_model <- lm(excess_stock ~ excess_market_KR + excess_market_US +
excess_market_CN + excess_market_JP,
data = returns_wide)
summary(beta_model)