문제
연단위 기대 수익률과 기대 변동성(표준편차)이 정규 분포를 따르는 두 상품 A와 B가 있다. 기대 변동성과 기대 수익률이 변하지 않는다고 가정하고 장기 투자한다면, 상품 B의 누적 투자 수익률이 상품 A의 누적 기대 수익률을 하회할 확률은 어떻게 변하는가?
- 상품 A: 기대 수익률 10%, 변동성 5%
- 상품 B: 기대 수익률 20%, 변동성 20%
주의
수익률이 일반 정규 분포가 아닌 로그 정규 분포를 따른다고 가정하면, 복리 수익률은 로그 정규 분포로 근사할 수 있습니다. 그러니 통계적으로 해석하는 것이 보다 수월할 수 있습니다. 이 글에서는 랜덤 샘플을 생성하여 추정해 봅니다.
(잘 이해가 안 되는 부분입니다. 두 정규 분포의 합은 정규 분포입니다. 그렇다면 두 로그 정규 분포의 합도 로그 정규 분포가 아닐까 예상되고, 로그의 합은 곱과 동일하니 복리 수익률 분포도 로그 정규 분포가 되지 않을까 싶었는데, 완전히 동일하지는 않은가 봅니다.)
코드
library(ggplot2) ## for ggplot().
library(purrr) ## for accumulate().
library(dplyr) ## for mutate(), tibble().
# Set up constatns.
n_samples <- 10000 # number of samples for b.
n_years <- 30 # max number of years.
a_gain <- 0.1 # yearly gain of A.
a_sd <- 0.05 # yearly standard deviation of A.
b_gain <- 0.2 # yearly gain of B.
b_sd <- 0.2 # yearly standard deviation of B.
# Generate random gains + 1 for B.
b_rsamples <- vector("list")
for (i in 1:n_samples) {
b_rsamples[[i]] <- rnorm(n_years, 1 + b_gain, b_sd)
}
# Calculuate cummulative gains.
b_cumm_gains <- lapply(b_rsamples, function(x) {accumulate(x, `*`)})
# Calcuate expected yearly gains of B.
a_expect <- accumulate(rep(1 + a_gain, n_years), `*`)
# Count number of samples under the expection.
under_expects <- lapply(b_cumm_gains, function(x) {x < a_expect})
under_expects_sum <- accumulate(under_expects, `+`)[[n_samples]]
under_expects_yearly <- tibble(
year = 1:n_years,
prob = under_expects_sum / n_samples
)
# Plot a probabilty distribution graph of gain(B) < gain(A).
ggplot(data = under_expects_yearly) +
geom_line(aes(x = year, y = prob * 100))
결과 및 해석
아래는 30년까지 B 상품에 투자했을 때 A 상품의 기대 수익률보다 낮은 수익률을 거둘 확률 그래프입니다. 상품 A가 기대 변동성 대비 기대 수익률이 A보다 낮지만, 장기 투자를 통해 위험 대비 수익률이 낮아짐을 알 수 있습니다.
아래는 1, 5, 10, 15, 20, 25, 30년째 B 상품의 투자 결과가 A 상품의 기대 수익률에 미치지 못할 확률표입니다. 10년간 투자 시 대략 9.6%, 20년간 투자 시 대략 3.4%, 30년간 투자 시 대략 1.3% 확률로 B의 기대 수익률보다 저조한 성과를 거둘 수 있습니다.
# Show a table for sample years.
under_expects_yearly %>%
filter(year %in% c(1, 5, 10, 15, 20, 25, 30)) %>%
mutate(prob = prob * 100)
----------
# A tibble: 7 × 2
year prob
<int> <dbl>
1 1 30.5
2 5 17.6
3 10 9.57
4 15 5.49
5 20 3.39
6 25 2.1
7 30 1.29
참고
'R' 카테고리의 다른 글
[R + Python 연습] 증권사 Open API를 이용하여 종목의 일일 시세를 다운로드하라. (1) | 2023.12.05 |
---|---|
[R 연습] 증권사에서 다운받은 일일주가 데이터를 구글 시트에 올려 공유하고, 이를 가져오는 코드를 작성하라. (0) | 2023.12.04 |
[R 연습] KOPSI 200을 추종하는 KODEX 200 ETF를 매매하는 전략을 선형 회귀 분석으로 도출하라. (0) | 2023.11.30 |
[R 연습] 국내 주요 지수를 추종하는 ETF의 요일별 밤낮 평균 수익률은? (0) | 2023.11.29 |
[R 연습] 한국과 미국의 주요 주가지수를 추종하는 ETF들의 누적 수익률 그래프 그리기 (0) | 2023.11.28 |