R

[R 연습] 기대 수익률이 더 높지만 기대 변동성도 더 높은 투자 상품은 장기적으로 얼마나 더 유리한가?

오렌지사과키위 2023. 11. 29. 18:27

문제

연단위 기대 수익률과 기대 변동성(표준편차)이 정규 분포를 따르는 두 상품 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

참고

 

[이런저런 생각] 장기 투자 시 변동성을 얼마나 고려해야 할까?

요즘 고민하고 있는 주제와 관련이 있는 글을 가치투자 연구소 카페에 월가아재님이 올리셔서 생각난 김에 ...

blog.naver.com

도움이 되었다면, 이 글을 친구와 공유하는 건 어떻까요?

facebook twitter kakaoTalk naver band