2018년 증시 지수는 17% 하락해서 2017년 초 정도로 돌아간 것 같습니다.

( 출처 : 서울신문 )
1월에 상승을 잠시 보이다가, 2월에 1차로 하락해서 충격을 주었습니다. 6월 초까지 보합을 보이던 지수는 6월 중순에 다시 2차 하락으로 타격을 더했습니다. 그리고, 10월에 3차 하락으로 마무리 펀치를 날렸습니다.

폭락한 주가 지수에 비해서 제 포트폴리오의 올해 성과는 나쁘지 않습니다. 몇 종목에서 운이 만나서, 전체 결과로는 18.9% 수익으로 마무리했습니다. 올초 더존비즈온으로 제법 좋은 성과를 거둔 후, SK텔레콤, 중앙에너비스 등으로 추가 수익을 거두었습니다. 몇 종목의 실패는 있었지만 비중이 크지 않아 상대적으로 타격은 작았습니다.

올해 32 종목에 투자를 했었습니다. 그리고, 현재 14 종목을 보유하고 있습니다. 투자한 32종목의 수익률 분포를 살펴봅니다. 최대 157% 수익(더존비즈온 입니다), 최저 -28.3% 손실(향후 포스팅에서 적겠습니다.) 중앙값은 0.5% 이고, 평균은 11.4%입니다. 평균은 큰 의미는 없습니다. 종목의 비중에 따라 수익의 크기가 크게 달라지기 때문입니다.

수익률의 분포를 그래프로 그려보면 결과에 대한 이해에 도움이 될 것 같습니다. 오른쪽으로 많이 치우친 종목(더존비즈온)이 수익률을 끌어올렸습니다. 그리고, 최대값을 제외한 그래프에서도 0을 중심으로 전체적으로 오른쪽에 많이 분포되어 있습니다.

2018년 결과를 켈리의 공식에 대입하여 최대 수익을 낼 수 있었던 투자 비율을 구해보겠습니다.
p (수익 확률) = 0.63
q (손실 확률) = 0.37
W (수익 비율) = 0.27
L (손실 비율) = 0.09
(적정 투자 비율) = (p*W - q*L)/(W*L) = 4.51
올해만 같다면 최대 수익을 위해서는 가진 현금의 약 4.51배를 투자(빌려서 투자)해야 한다는 것입니다.
그런데, 150% 넘는 수익률은 쉽게 찾아오는 행운은 아닙니다. 이값을 제거하고 다시 투자비율을 계산해 보겠습니다.
p_normal (수익 확률) = 0.5
q_normal (손실 확률) = 0.31
W_normal (수익 비율) = 0.19
L _normal (손실 비율) = 0.09
(적정 투자 비율) = (p_normal*W_normal - q_normal*L _normal)/(W_normal*L _normal) = 3.68
더존비즈온의 수익을 제거해도 약 3.68배를 투자하라는 숫자가 나오네요~~ 2018년 한해의 투자에는 많은 운이 따랐던 것 같습니다.
그러나, 내년에도 올해와 같은 행운이 오기는 어려울 것입니다. 예측할 수 없는 국제 정세와 불안한 시장 상황을 생각한다면 10% 정도의 현금을 유지해서 중간 중간의 급락에 대응할 계획입니다.
참고로, 분석을 위해 사용한 R 프로그램을 아래에 붙입니다.
( R 스크립트 )
=========================================
library(readxl)
library(ggplot2)
library(dplyr)
library(extrafont)
# 폰트 변경
theme_update(text = element_text(family = "HUIncludemyungjo140"))
# 수익률 정리한 Excel file 읽기
setwd("c:\\MyData\\산업분석\\투자\\mine\\2018투자정리")
column_types <- c("text", "numeric", "numeric", "numeric", "numeric", "numeric")
my_invest_2018 <- read_excel("2018_good_bad_stocks.xlsx", col_types = column_types)
# 종목 수익률 분포 히스토그램
my_invest_2018 %>% ggplot(aes(x=earn_rate)) +
stat_bin(binwidth = 0.1, aes(fill = ..count..)) +
stat_bin(binwidth = 0.1, geom = "text", aes(label=..count..), vjust= - 1.5) +
ylim(0,15) +
ggtitle("2018년 종목 수익률 분포")
## percent 표시를 위한 함수
percent <- function(x, digits = 2, format = "f", ...){
paste0(format(100*x, format=format, digits = digits, ...), "%")
}
# summary 구하기
summary.earn_rate <- percent(round(summary(my_invest_2018$earn_rate),3))
#summary
names( summary.earn_rate ) <- c("최소값", "1사분위값", "중간값", "평균값", "3사분위값", "최대값")
# summary 표시
summary.earn_rate
# Kelly의 비율 구하기
num_total <- length(my_invest_2018$earn_rate)
p <- sum( my_invest_2018$earn_rate > 0 )/num_total
q <- sum( my_invest_2018$earn_rate < 0 )/num_total
W <- mean( my_invest_2018[ my_invest_2018$earn_rate >0,]$earn_rate)
L <- abs( mean( my_invest_2018[ my_invest_2018$earn_rate <0,]$earn_rate))
kelly_rate <- (p*W - q*L)/(W*L)
# 특이값 제거 후 kelly 비율
my_invest_2018_normal <- my_invest_2018[my_invest_2018$earn_rate < 1,]
num_total_normal <- length(my_invest_2018_normal$earn_rate)
p_normal <- sum( my_invest_2018_normal$earn_rate > 0 )/num_total
q_normal <- sum( my_invest_2018_normal$earn_rate < 0 )/num_total
W_normal <- mean( my_invest_2018_normal[ my_invest_2018_normal$earn_rate >0,]$earn_rate)
L_normal <- abs( mean( my_invest_2018_normal[ my_invest_2018_normal$earn_rate <0,]$earn_rate))
kelly_rate_normal <- (p_normal*W_normal - q_normal*L_normal)/(W_normal*L_normal)
=============================================================================