Assets represent bundles of factors
자산은 여러 factor risk들로 구성되어 있으며, 이러한
factor risk들의 exposure에 의해 투자자는 risk
premium의 형태로 보상을 받는다. 이것이 바로 Factor Theory의
핵심이다. 현대 금융학에 한 획을 그은 CAPM(Capital Asset Pricing Model)은
자산이 오직 market portfolio라는 단일 팩터에만 노출되어
있다고 가정하지만, 이러한 가정은 현실의 복잡한 자산 가격 결정 메커니즘을
충분히 설명하지 못한다.
이 한계를 극복하기 위해 다양한 팩터 모델이 개발되었다. 1993년 Fama와
French는 market portfolio 외에도 size와
value 팩터를 추가한 3팩터 모델을
제시하여 자산 수익률의 단면적 차이를 효과적으로 설명했고, 이는 자산 가격
결정 연구와 실무에 큰 영향을 미쳤다. 그러나 이후 다수의 연구에서는
momentum 팩터와 같은 추가적인 팩터의 중요성이
지속적으로 제기되었고, 2015년 Fama와 French는 이를 보완하기 위해
profitability와 investment 팩터를
포함한 5팩터 모델을 발표하였다.
본 리포트에서는 국내 ETF 5개를 대상으로 Fama-French 3팩터 모델을 R을
활용해 실증 분석하고, 각 팩터(\(\beta~factor\))의 통계적 유의성을
검증할 것이다. 더불어, momentum 팩터의 중요성과 함께 5팩터 모델의 한계
및 논쟁점을 논의하여, 국내 시장에서 팩터 모델의 적용 가능성과 향후 개선
방향을 모색하고자 한다.
Fama-French 3-Factor Model은 자산 수익률을 다음 3가지 팩터로 기반으로 설명한다.
\(E(R_i) = R_f + \beta_{i, MKT} \times E(R_M-R_F) + \beta_{i, SMB} \times E(SMB) + \beta_{i, HML} \times E(HML)\)
CAPM에서는 average stock \(\beta\)와
market \(\beta\)가 1로 동일하다. 이는
투자자가 분산된 포트폴리오를 보유할 경우, 기본적으로 시장 수익률만을
얻는다는 의미다. 반면, Fama-French model에서는 \(\beta_{SMB}\)과 \(\beta_{HML}\)은 기본적으로
0을 중심으로 분포하도록 구성된다. 즉, 평균적인 투자자인
경우 \(\beta_{MKT}\)만을 얻게 된다.
따라서 \(\beta_{SMB}\)과 \(\beta_{HML}\)에서 추가적인 premium을 얻기
위해서는, 투자자는 size play를 할 건지, value play를 할 건지
선택해야 한다.
또한 CAPM과 Fama-French model은 \(\beta\)가 일정하다고 가정하지만, 실증
연구에 따르면 \(\beta\)는
시간이 지남에 따라 변동하며, 특히 경제 상황이 악화되는 시기에
\(\beta\)가 상승하는 경향이 있다. 이는
risk premium과 수익률 간의 관계에 추가적인 변동성을 가져올 수 있음을
시사한다.
library(purrr)
package <- c("tidyverse", "quantmod", "broom", "timetk", "pander", "broom", "scales")
pack_map <- map(package, ~ library(.x, character.only = TRUE))
options(scipen = 999)
실증 분석을 하기 위해서는 해당 팩터들이 tradeable assets이어야 하므로 ETF를 이용해 style analysis를 진행하도록 한다.
ticker <- tibble(ticker = c("305720.KS", "161510.KS", "385720.KS", "091230.KS", "326230.KS"))
ETF_df <- ticker %>%
mutate(data = map(ticker, ~getSymbols(Symbols = .x,
from = "2020-01-01",
to = "2025-02-28",
auto.assign = FALSE,
warnings = FALSE) %>%
Ad() %>%
na.omit()),
monthly_ret = map(data, ~monthlyReturn(.x, type = "log")))
factor_ticker <- tibble(ticker = c("069500.KS", "229200.KS", "227570.KS"))
factor_df <- factor_ticker %>%
mutate(data = map(ticker, ~getSymbols(Symbols = .x,
from = "2020-01-01",
to = "2025-02-28",
auto.assign = FALSE,
warnings = FALSE) %>%
Ad() %>%
na.omit()),
monthly_ret = map(data, ~monthlyReturn(.x, type = "log")))
factor_matrix <- purrr::reduce(factor_df$monthly_ret, merge) %>%
`colnames<-`(c("MKT", "SMB", "HML"))
ETF_df <- ETF_df %>%
mutate(matrix = map(monthly_ret, ~merge(.x, factor_matrix) %>% na.omit()),
model = map(matrix, ~lm(formula = `monthly.returns` ~ MKT + SMB + HML, data = .x)))
tiny_df <- ETF_df %>%
mutate(tidy = map(model, tidy)) %>%
unnest(tidy) %>%
dplyr::select(ticker, term, estimate, statistic, p.value)
glance_df <- ETF_df %>%
mutate(glance = map(model, glance)) %>%
unnest(glance) %>%
dplyr::select(ticker, `adj.r.squared`)
| term | estimate | statistic | p.value |
|---|---|---|---|
| (Intercept) | 0.002961 | 0.2995 | 0.7656 |
| MKT | 0.793 | 2.154 | 0.03539 |
| SMB | 0.7099 | 3.334 | 0.001497 |
| HML | -0.104 | -0.4142 | 0.6803 |
Adj.R2 = 57.92%
\(E(R_i) = 0.793 \times E(MKT) + 0.7099 \times E(SMB)\)
| term | estimate | statistic | p.value |
|---|---|---|---|
| (Intercept) | 0.004125 | 1.367 | 0.1768 |
| MKT | 0.1865 | 1.661 | 0.1021 |
| SMB | -0.1042 | -1.604 | 0.1141 |
| HML | 0.8172 | 10.67 | 0.000000000000002654 |
Adj.R2 = 82.51%
\(E(R_i) = 0.8172 \times E(HML)\)
| term | estimate | statistic | p.value |
|---|---|---|---|
| (Intercept) | 0.001301 | 0.4749 | 0.6373 |
| MKT | 0.6301 | 5.512 | 0.00000199 |
| SMB | 0.2656 | 4.247 | 0.0001176 |
| HML | -0.001343 | -0.01572 | 0.9875 |
Adj.R2 = 89.14%
\(E(R_i) = 0.6301 \times E(MKT) + 0.2656 \times E(SMB)\)
| term | estimate | statistic | p.value |
|---|---|---|---|
| (Intercept) | -0.0008076 | -0.1455 | 0.8848 |
| MKT | 1.303 | 6.306 | 0.00000004237 |
| SMB | 0.22 | 1.841 | 0.07077 |
| HML | -0.2906 | -2.063 | 0.04363 |
Adj.R2 = 76.33%
\(E(R_i) = 1.303 \times E(MKT) - 0.2907 \times E(HML)\)
| term | estimate | statistic | p.value |
|---|---|---|---|
| (Intercept) | -0.004664 | -1.459 | 0.1499 |
| MKT | 0.1138 | 0.9563 | 0.3429 |
| SMB | 0.1712 | 2.488 | 0.01574 |
| HML | 0.5448 | 6.715 | 0.000000008828 |
Adj.R2 = 76.27%
\(E(R_i) = 0.1712 \times E(SMB) + 0.5448 \times E(HML)\)
앞서 제시한 3팩터 모델의 분석 결과를 살펴보면, 각 ETF마다 시장(MKT), 사이즈(SMB), 밸류(HML) 팩터의 역할은 분명히 나타나지만, 다음 ETF 종목에서는 전체 설명력이 낮거나 추가적인 팩터의 존재를 시사하는 결과가 도출되었다.
이와 같이, 3팩터 모델은 국내 ETF의 수익률을 어느 정도 설명할 수
있으나, 모든 대상 종목들에서 \(\alpha\)가 유의하지 않고, 낮은 \(Adj.R^2\)으로 인해 ‘hidden risk
factor’가 존재할 가능성이 높다.
또한, CAPM 및 Fama-French model이 \(\beta\)의 시변동성을 고려하지
않는다는 점도 실제 금융시장에서는 중요한 이슈로 작용한다. 이러한
관점에서 볼 때, 5팩터 모델은 보다 다양한 risk factor를 반영해 자산
수익률의 설명력을 높일 수 있는 방법이 될 수 있다.
2015년 Fama와 French는 기존 3팩터 모델을 개선한 5팩터 모델을 발표하였다. 이러한 개선에도 불구하고 여러 문제점이 제기됐다. 다음은 글로벌 자산 관리 회사 Robeco에 개제된 사설의 요약이다.
본 리포트에서는 국내 ETF 5개를 대상으로 Fama-French 3팩터 모델을 R을
활용해 실증 분석하였으며, 각 ETF에서 나타난 팩터의 통계적 유의성을
검토하였다. 분석 결과, 일부 ETF에서는 시장, 사이즈, 밸류 요인이
유의미하게 작용하는 반면, 다른 ETF에서는 특정 요인의 역할이 미미하거나
설명력이 낮은 사례가 관찰되었다. 이는 기존 3팩터 모델만으로는
국내 ETF의 수익률 변동성을 완벽하게 설명하기 어렵다는 점을
시사한다.
특히, 모멘텀과 같은 추가적인 요인이 실제 투자 수익률에 영향을 미칠
가능성이 있으며, 기존 연구 및 Robeco의 주요 우려 사항에서도 이러한 점이
강조되고 있다. 또한, 베타의 시변동성과 시장 악화 시 베타 상승 현상은
정적 모형의 한계를 보여준다.
따라서, 향후 국내 시장에 적용할 팩터 모델은 기존 3팩터 모델에
모멘텀, 수익성, 투자 요인 등 추가 요인을 고려하거나, 베타의
시변동성을 반영하는 동적 모형으로 확장할 필요가 있다.