첫 번째로 시도한 알고리즘이라, 벌써 6개월도 전의 이야기이다.
소위 말해 코인을 잘하는 친구가 소개한 알고리즘인데, 이야기를 들었던 당시에는 굉장히 설득력 있었다. 수학적으로 타당했으니까. 구현하는 것도 어렵지 않아 보였다. 그 당시에는 전체 코드 구조가 굉장히 허접했던 터라, 알고리즘 자체보다는 '돌아가기라도 하는 코드'만 작성해도 감지덕지였다.
그렇게 시작한 첫 번째 알고리즘은 Bollinger band(볼린져 밴드, BB)와 Relative Strength Index(상대 강도지수, RSI)의 조합으로 자동매매를 진행하는 것이다. 아는 사람은 알겠지만 BB와 RSI는 주식이나 코인 관련해서 대표적으로 쓰이는 보조지표 중에 하나다.
먼저, 볼린저 밴드(BB)는 이전 봉의 값(보통 종가를 이용한다)의 N일 동안의 이동평균을 구한 뒤, 이때 N일간의 종가 표준편차의 K배에 해당하는 범위를 각각 밴드의 하단과 상단으로 구성한다. 이를 풀어보면 다음과 같다.
만약 주가가 완벽히 무작위 한 방향으로 움직인다고 하면(다른 말로 이전 봉의 움직임이 다음봉에 영향을 주지 않는다면) 주가의 움직임은 정규분포를 이룬다고 가정할 수 있다. 이때 만약 진짜 주가의 움직임이 정규분포를 따른다면, 2*표준편차 사이에 주가의 평균이 위치할 확률은 95.4%에 달한다.
즉, 만약 주가에 갑작스러운 일이 생겨서 빠른 시간 안에 볼린져 밴드 하단에 닿았다면, 높은 확률로 올라갈 것이라고 예측할 수 있고(아래 그림 왼쪽처럼), 볼린져 밴드 상단에 닿았다면 내려갈 것이라고 예측할 수 있다.
물론 이러한 캔들의 움직임은 타당하지 않다. 가격의 분포 자체는 정규분포를 따르지만(답답해서 히스토그램 그려서 확인해봄) 문제는 많은 경우 볼린저 밴드에 닿았다는 사실 자체만으로 일종의 모멘텀(한쪽 방향으로 가려는 움직임)을 보인다는 것이다. 즉, 이전 가격이 다음 가격에 영향을 미치기 때문에 볼린저 밴드에서 가격 움직임이 반전된다는 가정은 옳지 않다.
따라서 볼린저 밴드 하나만 사용하면 쪽박 차기 딱 좋다. 흔히, 바닥인 줄 알았는데 지하실이 있는 경우가 나오는 것이다. 그래서 볼린저 밴드는 '가격이 반등할 수 있는 지점들의 집합' 정도로 생각하면 좋을 것 같다.
볼린저 밴드를 보완하기 위해 RSI(Relative Strength Index)를 사용해보았다. RSI는 1978년 Welles Wilder라는 사람이 만들었다는데...... 솔직히 그가 누군지는 관심 없다. 하여튼, RSI는 N봉의 상승폭과 하락폭을 상대 비율로 표시한 것이다. 쉽게 생각하면 가격이 내려가는 이벤트가 생길 때마다 RSI가 낮아지고, 가격이 높아지는 이벤트가 생길 때마다 RSI가 높아진다.
RSI는 변동성 지표인 BB와는 달리 흔히 모멘텀 지표로 분류가 된다. 모멘텀 지표란 한쪽 방향으로 움직이는 세기라고 정의가 되고(물론 진짜 모멘트를 배우는 토목 공학도의 입장에서는 난감한 정의긴 한데) RSI는 주가의 변동을 비율로 나타내어 일정 방향으로의 가격 변동 추이와 그 세기를 측정할 수 있다.
그렇다면 RSI를 어떻게 알고리즘에서 활용할 것인가? 이 지표를 고안한 Welles Wilder의 제안에 따르면 N= 14일 때 RSI 가 30 이하이면 과매도 구간, 70 이상이면 과매수 구간으로 설정하였다. 즉, 사람들이 '너무 많이 연속으로 산 구간' 이 있고, '너무 많이 연속으로 판 구간'이 있다고 본 것이다. 그리고 너무 많이 팔거나 샀다면, 곧 추세의 전환으로 이어질 수 있다는 게 기본적인 RSI의 사용방법이다.
역시 RSI의 단점은, 추세가 지속되는 경우 가짜 신호가 발생할 수 있다는 점이다. 즉, 횡보하는 구간에서 RSI는 추세 변환을 아주 잘 맞히지만, 계속해서 상승하거나 하락할 때에는 그다지 신뢰할 수 없다.
물론 모든 투자의 기본이겠지만, 기본적인 원리는 '낮은 가격에 사서 높은 가격에 판다'이다. 하지만 '언제가 낮은 가격인가'에 대한 것은 좀처럼 알기 힘들다. 이때, 볼린저 밴드는 가격의 모멘텀에 대한 고려가 없고, RSI는 상승/하강 추세의 가격 변동에 대한 고려가 없다. 이 둘을 잘 섞어서 사용하면 Profitable 한 자동매매를 할 수 있지 않을까? 하강하는 추세가 상승하는 추세로 변할 때 사고, 작은 이익을 보고 빠지는, 전형적으로 알고리즘 매매투자 형식의 첫 번째 알고리즘의 아이디어였다.
물론 아이디어만 놓고 보면 높은 승률을 보일 것 같기는 하다.
기본 파라미터로, N=20, 표준편차 구간 2인 볼린져 밴드와 N=14인 RSI를 설정하였다. 또한 모든 코인 중에서 거래량 상위 80개만 사용하였으며, 5분 봉 차트를 활용했다. 그리고 매수/매도 조건은 각각 다음과 같이 설정했다.
매수 조건
이전 봉이 음봉이고, 볼린져 밴드 하단을 음봉으로 돌파, 가장 최근 봉이 다시 양봉으로 치고 나옴
이전 봉의 RSI가 30 이하이고, 최근 봉의 RSI가 이전 봉의 RSI보다 큼
매도 조건
0.5% 이익을 보면 팜
-1.0% 손해를 보면 팜
이를 코드로 나타내면 다음과 같다.
(코드의 실행 방법에 대해서는 이전 포스트를 참조해주시길 바란다.)
초기 잔고를 100만 원으로 시작하고, 한 번 거래에 20만 원씩 거래하도록 하였다. 그리고 3일 정도 코드를 실행했다. 결과는 어떨까? 아래 그림은 잔고 100만 원으로 시작해 3일 정도 코드를 가동한 결과이다.
3일 동안, 약 3.5%의 손실을 보았다. 3만 원 정도 잃은 셈인데, 기분이 참 씁쓸하다. 참고로 옛날에 코드를 실행해도 비슷한 결과를 얻었었다. 솔직히 큰 수익은 아니더라도 완만하더라도 확실한 증가를 생각했는데 말이다.
도대체 뭐가 문제였을까? 다음글에서 알아보도록 하겠다.