2008년 금융위기를 주제로 한 영화 '빅쇼트(Big Short)'는 공매도(Short Selling)으로 큰 수익을 본 사람들 이야기입니다. 

              빅쇼트 영화에 대한 이미지 검색결과


영화에서 헤지 펀드를 운영하는 마이클 버리(배우 : 크리스찬 베일)는 공매도로 489%라는 수익률을 올리고 멋지게(?) 퇴장합니다.



최근 주식시장이 폭락하면서 공매도에 대한 논란이 많아지는 것 같습니다. 역사상 가장 유명한 공매도는 조지 소로스의 영국 파운화 공매도일 겁니다. (참고 : 소로스, 1992년 영국을 어떻게 침몰시켰나?) 소로스는 파운드화 공매도로 1조의 수익을 낸 것으로 알려졌습니다. 


그러나, 이런 성공만큼이나 실패도 있었습니다. 1998년 홍콩 달러에 대한 공매도에서는 손실을 보고 물러납니다 ( 참고 : 홍콩, 헤지펀드와의 전투 승리 ). 그리고 2017년 트럼프 대통령 당선으로 주식이 폭락할 것으로 베팅을 해 1조 가량의 손실을 입었습니다. (참고 : 버핏은 '대박', 소로스는 '쪽박'


잘 알려진 국내의 사례인 '셀트리온' 공매도의 경우도 큰 손실을 남겼습니다. ( 참고 : 꼬리 내리는 셀트리온 공매도 세력


이런 이야기를 보면 공매도는 성공시 높은 수익만큼이나 실패시 손실도 막대한 것 같습니다.


논리적으로 보자면, 공매도는 상당히 위험한 도박입니다. 

주식을 매수할 경우, 최대 손실은 회사가 파산하여 주식이 가치가 없어지는 경우일 것입니다. 그러나 공매도는 주식이 계속적으로 상승하면 손실은 무한대로 증가합니다. 그리고, 국내 증시의 경우는 공매도를 하기위해서는 반드시 주식을 대차(빌려오기)를 해야 합니다. 이때, 돈을 빌릴 때의 이자와 같이 빌리는 값을 지불해야 합니다. 그리고, 무엇보다도 위험한 것은 시점에 대한 판단이 어렵다는 것 같습니다. 주가가 하락할 것이라는 판단이 옳았더라도 언제 하락하는냐에 따라 손실과 수익이 결정됩니다. 


영화 '빅쇼트(Big Short)' 에서 헤지 펀드 운영자 '마이클 버리'는 분명히 하락해야할 모기지 채권이 하락하지 않아서 애를 먹습니다. 쏟아지는 투자자들의 환매 요청으로 심한 스트레스를 받습니다. 그리고, 단호하게 요청을 거절하며 버텨냅니다. 거기서 무너졌다면 공매도 투자는 실패로 끝났을 것입니다.


주식 분석가 '제러미 시겔'은 200여년 미국 주식 시장을 분석한 저서 '투자의 미래'에서 버블 징후로 돈을 벌기 어려움을 이야기합니다. 


"버블은 생각하는 것보다 더 오래 지속된다. 이는 신봉자를 우쭐하게 하면, 회의론자를 좌절에 빠트린다"





공매도는 가치투자에 비해 돈을 벌 가능성이 높지 않은 것 같습니다.


2002년 개봉한 영화 '마이너리티 리포트(Minority Report)'는 2054년 미래를 그린 공상과학 영화의 수작(秀作)이라 생각합니다.  예고편에 등장하는 다음의 문구가 인상적입니다. ( 참고 : 마이너리티 리포트 예고편

  - Future can be Seen       ( 미래는 볼 수 있다. )

  - Murder can be Stopped ( 살인은 멈출 수 있다. )

  - System can't be Wrong  ( (예측) 시스템은 틀리지 않는다. ) 



                                                 < 사진 출처 : 다음 영화 >


영화에서와 같이 인공지능(AI - Artificial Intelligence)에 의한 범죄예측은 시작 단계이지만  약간의 성과도 내고 있습니다. ( 참고 : 마이너리티 리포트가 현실로 )


금융에서도 컴퓨터의 활용은 다양한 분야에서 시도가 되고, 또 많이 사용되고 있습니다. 대표적인 부분이 자동으로 주식을 사고 팔아서 수익을 내도록 하는 프로그램 매매(알고리즘 매매)입니다. 특히나, 2016년 '알파고'가 바둑을 정복하면서 인공지능에 대한 기대가 커지면서, 모든 증권사에서 알고리즘 매매에 대한 투자가 급증하였습니다.


바둑천재를 쉽게 제압하는 컴퓨터가 투자를 한다면 어느 주식천재보다 더 쉽고 빠르게 많은 수익을 낼 것만 같습니다. 그러나, 월스트리트의 철학자 '나심 탈레브(Nassim Taleb)'는 불운은 블랙스완(검은 백조)와 같이 홀연히 나타난다며 (평소의) '행운에 속지마라'라고 경고합니다. 



현대 금융과 같은 복잡하게 얽힌 극단의 세계 - 부가 편중되어 평균과 분산을 기반으로 한 분석이 어려운 세계 -에서 빅데이터를 기반으로 한 금융공학은 취약하다고 역설합니다. 그리고, 금융계에서는 블랙스완(Black Swan -검은 백조)과 같은 플래시 크래시(Flash Crash - 단기 급락)은 언제든 발생할 수 있다고 경고합니다.


실제로 2010년 5월 6일 발생한 뉴욕증시의 단기급락은 프로그램 매매의 취약점을 이용한 트레이더에 의한 사건으로 밝혀졌습니다. (참고 : 2010 미증시 폭락 범인 잡혔다 )




프로그램 매매의 위험성을 보여주는 사례은 이외에도 많습니다. 국내에서 있었던 사례로 2013년에 있었던 '한맥투자증권'의 경우를 볼 수 있습니다. ( 참고 : 한 번의 주문실수에 파산 ) 프로그램 설정값을 잘못 입력함으로서 야기된 대규모 프로그램 매매는 단 5분만에 462억의 손실을 남겼습니다. 그리고, 2015년 최종 파산 선고를 받았습니다.


이와 같이 잘 동작하던 프로그램 매매도 (프로그램에서 예상하지 못한 ) 특정 상황에서는 예상치 못한 결과를 낳게 됩니다. 특히나 기관 들에 의한 프로그램 매매가 증가하는 현대의 증권 시장에서는 비슷한 조건에 반응하는 프로그램이 많아질 것으로 예상됩니다. 이런 프로그램 들이 한꺼번에 공명 현상을 일으키면 이전에 보지 못했던 규모의 '플래시 크래시'를 보게 되지 않을까요?


개인적으로는 '단기 급락'의 기회에 대응하기 위한 것으로  기본 가치를 믿는 종목에 감시주문을 예약해 두고 있습니다. 


  - Result can be Predictive       ( 결과는 예측해볼 수 있습니다. )

  - Prescription must be Ready     ( 대응을 준비해야 합니다. )

  - System can be Wrong         ( (예측) 시스템은 틀릴 수 있으니까요... ^^; ) 










무용수에서 성공한 투자가로 변신한 니콜라스 다비스의 이야기를 소개해 드린 적이 있습니다. 스스로를 테크노-펀더멘털리스트로 표현한 그는 관심있는 주식이 상승하는 시점에 매수하여, 상승세가 하락으로 변화되는 시점에 매도하는 방식으로 수익을 냈습니다. 


이 방식을 '박스이론'으로 정리했습니다. 관심 종목의 주가를 평소 관찰하다가 정해진 박스를 넘어서면 매수, 박스 하단으로 내려가면 매도하는 방식입니다. 이를 그림으로 표현해보면 아래와 같습니다.



실제 매매에 적용하자면, 재무제표 분석을 통해서 매매할 종목을 선정한 후에 증권사에서 제공하는 매매프로그램에서 그 종목이 특정가격 이상이면 매수하도록 설정합니다. 그리고 매수가 이루어지면 '트레일링 스탑(Trailing Stop)' 을 설정하여 최고가 대비 특정 % 이상 하락하면 매도하도록 설정하면 됩니다.


이런 박스이론의 기본 생각은 '주가가 박스를 벗어날 때에 새로운 상태(상승 혹은 하락)로 움직인다'는 것입니다. 돌려서 얘기하자면 주가가 '변하는 시점(변화 시점 - Change Point)에 도달했다'라고 말할 수 있을 것입니다. 이렇게 주가가 변하는 시점을 잘(^^;;) 탐지하면, 미리 사서 오래 기다리는 것이 아니라, 상승 시점에 매수하고, 상승이 끝나면 바로 매도할 수 있습니다. 


이런 거래 방법은 폭락에 대비할 수 있을 뿐 아니라, 현금의 활용도(같은 시간에 많은 거래)를 높일 수 있습니다. 단, 매수한 주식이 상승한 크기(비율과 금액)가 하락한 크기보다 커야 수익이 날 것입니다. 


변화 시점 탐지(Change Point Detection, 혹은 변화탐지(Change Detection))는 제조업의 품질 관리(Quality Control)에서 먼저 사용되었습니다. 관리 상한값(UCL -Upper Control Limit)과 하한값(LCL - Lower Control Limit)를 설정하여, 이 범위를 넘어가는 제품이 생산되었을 경우에는 생산라인에 문제가 생겼을 가능성이 높으므로 경고(Alarm)를 발생하여 조치를 취하도록 합니다. 보통은 평균값에서 3 표준편차를 잡습니다.  즉, (평균값) + 3*(표준편차)를 상한값, (평균값) - 3*(표준편차)를 하한값으로 하는 경우가 많습니다. 3*(표준편차)의 의미는 정규분포 상에서 99%가 포함되는 영역을 의미합니다.


주식 매매기법에서 박스이론을 다르게 표현한 것이 '볼린저 밴드'라고 생각합니다. 볼린저 밴드는 '주가는 대부분 (평균가격)에서 2*(표준편차)의 범위에서 움직인다'는 생각을 바탕으로 합니다. 정규분포에서 2*(표준편차) 구간은 95% 범위를 의미합니다. 이를 벗어나는 흐름이 보이면 이 경우를 '변화 시점(Change Point)'으로 보고 대응하는 것입니다. 볼린저는 표준편차의 변화에 따라 세분화하여 대응하는 전략을 얘기했습니다.


저는 약간 다른 방법 - 베이스 확률을 이용한 방법 - 의 변화 시점 탐지를 시도해 봤습니다. 

아래의 그림에 제가 생각한 변화 탐지 방법을 정리했습니다. (관련 장표 : 주가 변화시점탐지 )




주가가 특정상태에 있을 경우에 주가는 (평균값)을 중심으로 정규분포를 이룬다고 가정한다면 특정 가격이 될 확률을 구할 수 있습니다. 그리고, 주식의 현재 거래 가격이 나오면, '기존 평균'의 정규분포에 존재할 확률과 '새로운 평균(예를 들어 15% 상승 상태, 혹은 15% 하락 상태)'의 정규분포에 존재할 확률를 비교합니다. 만일 새로운 평균의 정규분포에 존재할 확률이 높다면 새로운 상태로 보고 매수 혹은 매도를 수행합니다. 이를 Python 프로그램으로 작성하여 몇 가지 주식에 대해서 테스트를 진행했습니다. 프로그램에서 매수/매도 시점에 대해서 몇 가지 변수를 변화시키면 수익률을 비교하였습니다. 제 테스트 결과로는(몇번 테스트하지는 않았습니다.... 시간 관계상~~~ ^^;) 평균적으로 상승 가능성은 15배, 하락 가능성은 10배일 경우에 매수/매도를 하는 것이 수익률이 좋았습니다.


주가 정보는 야후 파이낸스에서 다운로드하여 테스트 하였습니다. ( 예 : df = web.DataReader(company_code, "yahoo",start,end) ) 더존비즈온을 2013년부터 감시하여 매수/매도를 한다고 테스트를 했습니다.  더존비즈온의 2013년 초 종가는 11700원이고, 2018년 10월 31일 종가는 43350원 입니다.



Date               Open     High      Low    Close     Adj Close  Volume 

2013-01-02  11750.0  12100.0  11600.0  11700.0  10867.021484  653943

..........

2018-10-31  43800.0  44600.0  42700.0  43350.0  43350.000000   98580



2013년에 사서 보유하고 있다면, (배당을 고려하지 않는다면) 31650원 수익을 보고 있을 겁니다. 이를 변화시점 감시 프로그램으로 매수/매도를 한 결과는 다음과 같습니다. ( 상승 가능성 15배에서 매수, 하락 가능성 10배에서 매도.)


 #######################################################################
 CP UP point with threshold of  15  ==============================
CP_up_val = 23.7330892976 UP data =  2014-12-29 00:00:00 9150.0  Mean =  8369   (매수)
......
CP_down_val = 14.9195885872 DOWN data =  2015-09-07 00:00:00 18900.0  Mean =  21055 (매도)


CP_up_val = 51.4008931393 UP data =  2016-01-27 00:00:00 21450.0  Mean =  18925 (매수)
........
CP_down_val = 59.1181616939 DOWN data =  2018-10-25 00:00:00 43600.0  Mean =  50700 (매도)

#####################################################

 CP에 의한 최종 주당 이익 for  Douzone_Bizon.data  =  31900.0


참고로, 하락에 민감하게 반응하도록 하락가능성 5배로 변경하여 테스트를 하면 다음과 같습니다.

##################################################

 CP UP point with threshold of  15  ==============================
CP_up_val = 23.7330892976 UP data =  2014-12-29 00:00:00 9150.0  Mean =  8369
....
CP_down_val = 14.9195885872 DOWN data =  2015-09-07 00:00:00 18900.0  Mean =  21055 


CP_up_val = 51.4008931393 UP data =  2016-01-27 00:00:00 21450.0  Mean =  18925

.....
CP_down_val = 5.54231878136 DOWN data =  2018-10-11 00:00:00 53700.0  Mean =  59210 

##################################

 CP에 의한 최종 주당 이익 for  Douzone_Bizon.data  =  42000.0


이익은 그냥 보유하고 있을 때보다, 이 경우에는 더 나은 결과를 보여줍니다. 

그리고, 주식 보유 기간은 전체 약 6년의 시간 동안에서 약 3년 반으로 줄어듭니다. 좋은 쪽으로 보자면, 남은 기간에는 다른 종목에 투자할 여유가 생기는 겁니다. 그리고, 폭락장이 올 경우에는 자동으로 매도가 되서 안전하게 자산을 보전할 수 있을 거라 생각됩니다.


그런데, 이 테스트는 종가를 기준으로 한 것입니다. 종가만으로 테스트를 하는 경우에는 급등 혹은 급락한 날에 대한 대응이 되지 않습니다. 보다 정확한 테스트는, 주가의 실시간 변화 데이터를 사용해야 할 것입니다. 


그리고, 확률이 몇배일때 매수/매도할 지, 몇 % 변화를 탐지할 것인지에 대한 값은 업종마다 다를 것으로 생각됩니다. 이를 위한 최적화 과정도 필요할 것으로 생각합니다. 


그런데, 참고로 주가 추세가 하락세인 경우는 전체 변화시점탐지 방법을 사용해도 손실을 보는 경우가 많은 것 같습니다. 예를 들어 2012년 부터 현대중공업 주가에 대해 테스트한 결과로는 -62,013원 손실을 기록되었습니다. 

이를 보면, 추세가 상승할 것이라는 것에 대한 판단은 기본적 분석이 유효할 것이라 생각합니다.


기본적 분석으로 대세 판단을 하고, 변화 시점을 탐지하여 매수/매도 시점을 결정하는 것이 테크노-펀더멘털리스트, 니콜라스 다비스가 주창한 '박스이론' 입니다. 

2011년 12월 19일 정오쯤이었습니다.


'북 김정일 사망'이라는 뉴스가 알려지고, 증시는 급락했습니다. (사망일은 17일이었는데, 국내에 보도된 일자가 19일 입니다.)



급락하는 시장에서 평소에 지켜보던 '고려아연'을 보유 현금으로 전액 매수하였습니다. '전쟁이 일어난다면 현금이든 주식이든 모두 가치가 없어질 것'이라는 생각에서 모험(?)을 한 것입니다. 다행히 전쟁은 없었고, 시장은 빠르게 안정되었습니다. 



30만원 이하의 좋은 가격으로 매수를 할 수 있어서 단기간에 두자리 수의 수익을 볼 수 있었습니다. 


돌이켜보면 수익을 낼 수 있었던 이유는 2가지라고 생각됩니다. 

첫째, 공포의 대상 (전쟁위험??)을 이해하여 매수, 매도, 보유 등 상황 비교를 빠르게 할 수 있었다는 것입니다. 어느 경우나 위험은 동일하나, 매수를 할 경우에 회복이 되면 큰(??) 수익을 기대할 수 있을 것이라는 판단이었습니다. 

둘째, 평소에 관심을 갖고 매수 가격을 정해둔 종목이 있었다는 것입니다. 고려아연은 안정적인 수익구조를 가진 기업으로 재무적 안정성이 높습니다. 그리고 배당도 비교적 높아서 적당한 가격에 매수하면 정기예금정도의 배당을 받을 수 있습니다. 2011년 고려아연의 배당은 5,000 원으로 배당율은 1.7%에 가까웠습니다. 12월 19일이면 며칠만 보유하면 바로 배당을 받을 수 있는 상황이었습니다.



워렌 버핏의 이야기 중에 '남들이 공포에 질렸을 때 욕심을 부려야 하고, 남들이 탐욕에 빠졌을 때 두려워워 하라' 라는 얘기가 떠오릅니다.


최근 복잡한 국제정세 (무역분쟁, 금리상등)에 시장이 공포에 빠져들어 가는 것 같습니다. 

이번 공포에도 욕심을 부려보고자 합니다. 보유하고 있는 현금으로 평소에 보아둔 주식을 저가에 매수 예약해 두웠습니다. 이번 공포는 단기간에 해소되기 어려울 것이라 예상하고 있습니다. 따라서 배당이 좋고 경기를 덜 타는 종목으로 매수하고 있습니다. 


1800년대 부터 2000년 초까지의 미국 금융시장을 연구한 제러미 시겔은 저서 '투자의 미래(The future of Investors)' 에서 말합니다. 



'주식의 현금 흐름은 (순이익이 아닌) 배당이다'. 



( 이미지 출처 : YES24 )





지난 번 캘리의 공식을 테스트하면서 이상한 부분이 있어서 추가 테스트를 진행했습니다.

( 지난 글 : 현금도 종목이다. - 켈리(Kelly)의 공식 )


몬테카를로 시뮬레이션에서 왜 거의 항상 항상 켈리의 공식 값보다 크게 나오는가?


투자 횟수(년수)가 증가함에 따라서 최대 수익을 보이는 투자비율은 점차 켈리 값(켈리 공식의 값)에 가까워지기는 하지만, 거의 항상 켈리 값보다 컸습니다. 이유를 곰곰히 생각하다가 한 가지 가능성을 찾았습니다.  분산투자를 하는 일반적인(?) 투자 계정의 예를 살펴보겠습니다.  



위에서 보시면 확실하게 (90% 이상) 수익을 이끌고 있는 3 종목이 보입니다. 그리고, 어떤 종목은 손실을 보고 있습니다. 그런데 그 크기를 보시면 수익은 100% 이상도 가능한데, 손실은 100%가 최대입니다. 현실적인 투자에서 (제 경험상으로는... ^^;) 손실은 30% 이상 가기가 어렵습니다.  분산투자에서 한두종목이 100% 이상 수익이 나면 복리 효과로 그 금액은 상당히 빠르게 커져갑니다. 

즉, 분산투자를 하게 되면 크게 수익을 주는 주식을 만날 가능성이 높고, 이런 경우에 전체적인 수익금액을 높일 수가 있습니다.


이를 확인하기 위해 다시 몬테카를로 시뮬레이션을 진행했습니다. (맨 아래에 R 스크립트를 적습니다.)


성공확률 0.55, 성공시 보상 비율 0.4, 실패시 손실 비율 0.3일 경우, 켈리의 공식에서는 70.8 %를 제시합니다.  ( ( 0.55 * 0.4 - 0.45 * 0.3)/ (0.4 * 0.3) = 0.708333... )


이 경우에 대해서, 투자 종목 수를 각각 1, 5, 20 로 50회(년)을 투자할 경우 최대 수익이 나오는 투자 비율을 100회 찾아서 그래프로 표시했습니다.


  


0.85, 0.88, 0.91로 종목 수에 따라서 최대 수익을 내는 투자 비율이 1에 가까워 지는 것을 볼 수 있습니다. 그리고, 분산값도 줄어들고 있어서 최대 수익을 내는 비율이 점점 집중되고 있음을 알 수 있습니다.


결론적으로 분산투자는 최대 수익을 내기 위한 좋은 방법입니다.



============== 


require(dplyr)
require(ggplot2)
require(gridExtra)


set.seed(1234)

Init_money <- 100  # 초기 투자금

# 투자 년수
N <- 50

win_p <- 0.55       # 수익 확률
win_ret_rate <- 0.4        # 수익 비율
lose_ret_rate <- 0.3     # 손실 비율
bin_count = 100      # 투자 비율 변화 간격 1/100
bet_rate <- c(1:bin_count)/bin_count    # 투자 비율 배열

# 투자 종목 수
num_stocks_1 <- 1
num_stocks_2 <- 5
num_stocks_3 <- 20


# 켈리 공식의 제안 비율
bet_rate_kelly <- ( win_p * win_ret_rate - (1- win_p) * lose_ret_rate)/(win_ret_rate * lose_ret_rate)


num_tests = 100
text_size = 5
bin_width = bin_count - 10


for (num_stocks in c(num_stocks_1, num_stocks_2, num_stocks_3)) {
  max_rate <- 0     # max 결과를 보이는 rate
  # 수정 : 사용되지 않는 변수 : p_num <- p_num + 1
 
  for( l in c(1:num_tests)) {
    total_money_all_avg <- 0   # 투자 결과를 넣을 배열 초기화
   
   
    for ( k in c(1:bin_count)) {
      total_money <- 0
     
      for( j in c(1: num_stocks)){
       
        # 수익, 손실을 정해진 비율에 따라 추출
        ret_test <- sample(c(win_ret_rate, -lose_ret_rate), N, replace=TRUE, prob=c(win_p, 1-win_p))
       
        cur_money <- Init_money
        bet_money <- 0
        gain_money <- 0
       
        # 수익, 손실을 더함
        for ( i in c(1:N) ) {
          bet_money <- bet_rate[k] * cur_money
          gain_money <- bet_money *ret_test[i]
          cur_money <- cur_money + gain_money
        }
       
        total_money <- total_money + cur_money/num_stocks
      }
      # 지정된 투자 비율에 대한 투자 결과 저자
      total_money_all_avg[k] <- total_money 
    }
   
   
   
    df_result_all_avg   <- data.frame(bet_rate, total_money = round(total_money_all_avg))
    df_result_all_avg
    # 최대값 확인
    df_result_all_avg[which.max(total_money_all_avg),]
    max_rate[l] <- df_result_all_avg[which.max(total_money_all_avg),]$bet_rate
  }
 
  df_max_rate <- data.frame(max_rate)
 
 
 
 
  avg <- round( mean(max_rate), 2)
  sd  <- round(sd(max_rate), 2)
 
  if ( num_stocks == num_stocks_1) {
    p_num_stocks_1 <- df_max_rate %>% ggplot(aes(x = max_rate ) )  +
      geom_dotplot(fill="blue", binwidth = 1/bin_width) +
      xlim(0,1) +
      ylim(0,6) +
      geom_density(color="red", fill="red", alpha=0.3) +
      geom_text(x=0.5, y=6, label=paste0("종목수 = " , num_stocks), size=text_size ) +
      geom_text(x=0.5, y=5, label=paste0("평균   = " , avg), size=text_size ) +
      geom_text(x=0.5, y=4, label=paste0("분산   = ", sd), size = text_size)
  }  else if ( num_stocks == num_stocks_2) {
    p_num_stocks_2 <- df_max_rate %>% ggplot(aes(x = max_rate ) )  +
      geom_dotplot(fill="blue", binwidth = 1/bin_width) +
      xlim(0,1) +
      ylim(0,6) +
      geom_density(color="red", fill="red", alpha=0.3) +
      geom_text(x=0.5, y=6, label=paste0("종목수 = " , num_stocks), size=text_size ) +     
      geom_text(x=0.5, y=5, label=paste0("평균 = " , avg), size=text_size ) +
      geom_text(x=0.5, y=4, label=paste0("분산 = ", sd), size = text_size)
  }else {
    p_num_stocks_3 <- df_max_rate %>% ggplot(aes(x = max_rate ) )  +
      geom_dotplot(fill="blue", binwidth = 1/bin_width) +
      xlim(0,1) +
      ylim(0,6) +
      geom_density(color="red", fill="red", alpha=0.3) +
      geom_text(x=0.5, y=6, label=paste0("종목수 = " , num_stocks), size=text_size ) +     
      geom_text(x=0.5, y=5, label=paste0("평균 = " , avg), size=text_size ) +
      geom_text(x=0.5, y=4, label=paste0("분산 = ", sd), size = text_size)
  }
}

grid.arrange(p_num_stocks_1, p_num_stocks_2, p_num_stocks_3, ncol=1)


==============




몇 년 전부터 투자금의 일부는 항상 현금으로 보유하고 있습니다.

현금은 주식시장에서 가치가 변하지 않는(?)  종목입니다. '현금' 이라는 종목은 폭락장에서 위력을 발휘합니다. 좋은 종목을 저렴한 가격에 매수할 큰 기회를 줍니다. 


그러면 현금 비중을 어느 정도로 유지하면 좋을까요?

이에 대한 수학적 답은 켈리(Kelly)의 공식에서 찾을 수 있습니다 (무승부는 없다고 가정하면...)


     (적정 투자 비율) = (p*W - q*L)/ ( W* L)

     p  : 성공 확률

     q  : 실패확률

     W : 성공시 이익 비율

      L :  실패시 손해 비율


(공식에 대한 증명은 다음 기회로 미루어 두겠습니다 ~~ ^^;)


예를 들어, 투자금 100 원을 투자할 경우에,


성공할 확률을 0.55 (55%) 이라고 하면, 실패할 확률은 0.35 (35%)이고, 

성공시 이익은  0.4 (40%), 실패시 손실을 0.3 (30%) 라고 한다면,


성공할 확률을 0.55 (55%) 이라고 하면, 실패할 확률은 0.45 (45%)이고, 

성공시 이익은  0.4 (40%), 실패시 손실을 0.3 (30%) 라고 한다면,

(적정 투자 비율) = ( 0.55*0.4 - 0.45*0.3)/ ( 0.4 * 0.3 ) = 70.8 

즉, 켈리의 공식은 약 71%를 투자하고 29%를 현금으로 보유하는 것을 권장합니다.


그런데, 실제로 그런지가 궁금해졌습니다.... 

R 프로그램으로 몬테카를로 시뮬레이션(Monte-Carlo Simulation)을 수행했습니다. (프로그램 소스는 맨 아래에 두었습니다. )

10년을 투자한다고 가정하고, 장기투자자(?? ^^)인 저는 1년 혹은 반년 정도 보유를 하기 때문에... 

투자 횟수 N을 10으로 설정하여 시뮬레이션을 돌렸습니다....

그~런~데~.... 0.71 근처에서 최대값을 기대했는데.... 아래의 그래프는 어떻게 된 일일까요?

0.94 (94% 투자)일 때 최대값을 보였습니다...



Random generator를 위한 seed 값을 변경하고 투자 횟수를 20으로 수행하니... 

0.79 (79%)에서 최대값이 나오네요..

( set.seed(12345), N <-20 )


행운(Random generation)에 따른 변화가 많은 것 같습니다....

투자는 운이 따라야 하는 것 같습니다.



며칠을 고민한 끝에..... 답을 찾았습니다....  :-)

답은 캘리의 법칙을 증명하는 과정에 있었습니다.


캘리의 법칙은 N -> ∞ 일 경우를 가정하고 증명합니다.... 

즉, 투자 횟수(년수)가 상당히 큰 경우의 결과 입니다.....


저는 단지 10회를 가지고 시뮬레이션을 해서, 캘리의 법칙과는 차이가 많이 났습니다.



N을 키워나가면서 점차 캘리의 투자 비율이 성과가 좋아지는 것을 확인할 수 있었습니다...

다시 말하자면,캘리의 공식은 투자 횟수가 상당히 많을 경우를 가정한 것입니다.... 



그렇다면, 저처럼 투자횟수가 많지 않은 경우라면 캘리의 공식 대신에 몬테카를로 시뮬레이션 결과의 값을 사용하는 게 낫지 않을까 생각합니다..


아래의 그래프는 반년에 한번 종목 교체한다고 하여 10년을 고려하여,  N을 20으로 잡고,

종목 적중률을 0.7 (70%), 성공할 경우 100% 수익, 실패할 경우 30% 손실로 하여 시뮬레이션 결과입니다.


최대값은 0.94 (94%) 에서 볼 수 있었습니다. ( 몬테카를로 시뮬레이션이므로, 실행 시마다 약간씩은 다르게 나옵니다. )


평소 제 포트폴리오에 현금 비중은 5~7% 입니다. 최근 폭락장에서 그동안 관심을 두던 종목을 좋은(?제 입장에서는) 가격에 매수하여 현재는 1.5% 정도 유지하고 있습니다.

향후 시장이 회복되면 다시 5~7% 현금을 유지할 생각을 하고 있습니다.


( 2019/Aug 추가 )

행운(Random Generation)에 따른 변화를 고려하기 위해... 

다수의 Test를 진행하여 평균을 내야 할 것이란 생각을 하게 됩니다.



몬테카를로 시뮬레이션 프로그램 소스

=========


require(dplyr)
require(ggplot2)


rm(list = ls())

set.seed(1234)

Init_money <- 100  # 초기 투자금
N <- 20          # 투자 횟수 (년도)
win_p <- 0.7       # 수익 확률

win_ret_rate <- 1        # 수익 비율
lose_ret_rate <- 0.3     # 손실 비율


bin_count = 100      # 투자 비율 변화 간격 1/100
loop = 100           # 투자 비율당 시뮬레이션 횟수
bet_rate <- c(1:bin_count)/bin_count    # 투자 비율 배열

# 캘리 공식의 제안 비율
bet_rate_kelly <- ( win_p * win_ret_rate - (1- win_p) * lose_ret_rate)/(win_ret_rate * lose_ret_rate)


total_money_all_avg <- 0   # 투자 결과를 넣을 배열 초기화


for ( k in c(1:bin_count)) {
  total_money <- 0
 
  for( j in c(1: loop)){
   
    # 수익, 손실을 정해진 비율에 따라 추출
    ret_test <- sample(c(win_ret_rate, -lose_ret_rate), N, replace=TRUE, prob=c(win_p, 1-win_p))
   
    cur_money <- Init_money
    bet_money <- 0
    gain_money <- 0
   
    # 수익, 손실을 더함
    for ( i in c(1:N) ) {
      bet_money <- bet_rate[k] * cur_money
      gain_money <- bet_money *ret_test[i]
      cur_money <- cur_money + gain_money
    }
   
    total_money <- total_money + cur_money/loop
  }
  # 지정된 투자 비율에 대한 투자 결과 저자
  total_money_all_avg[k] <- total_money 
}


df_result_all_avg   <- data.frame(bet_rate, total_money = round(total_money_all_avg))
df_result_all_avg
# 최대값 확인
df_result_all_avg[which.max(total_money_all_avg),]

# 그래프
df_result_all_avg %>% ggplot(aes(x= bet_rate, y = total_money)) +
  geom_point() +
  geom_line(color = "red")



=========


+ Recent posts