이즈음 여러 가지 자동매매 알고리즘을 찾아보면서 우연히 보게 된 격언(이랄게 있을까 하지만)이 있다.
알고리즘은 간단할수록 좋다
물론 이렇게 간단하게 말하지 않았고, 뭔가 멋들어진 설명도 있었는데, 잘 기억은 나지 않는다. 여하튼, 최대한 간단하게 해 보고자, MACD를 활용한 자동매매 알고리즘을 시도했다.
MACD는 Moving Average Convergence Divergence라는 이름에서 알 수 있듯이, 여러 이동평균선들이 서로 합쳐지거나(Convergence) 멀어지려고(Divergence) 하는 성질을 사용한다.
이때 총 3번의 지수 이동평균(Exponential moving average)이 사용된다. 첫 번째는 짧은 기간의 이동평균(보통 12개 봉을 사용)이고, 두 번째는 긴 기간의 이동평균(보통 26개 봉을 사용)이다. 이 두 개 이동평균의 차이를 MACD 선이라고 하고, 다시 이 MACD선을 이동 평균시키면(이때 9개 봉을 사용한다) 시그널 선이 된다. 또다시(!) MACD선에서 시그널 선을 빼면 MACD 오실레이터가 된다.
물론, MACD를 사용하기 위해서는 '장기 이동평균선과 단기 이동평균선은 같아지려고 한다'라는 전제에 동의해야 한다. 그러니까, MACD 선은 0을 기준으로 0보다 작아진 후에는 반드시 0으로 올라가야 한다. 반대방향의 움직임은 나타나면 안 된다. 마치 싸인/코싸인 함수처럼 말이다. 하지만 위 그림에서 보다시피, MACD선인 파란 색선의 움직임은 그다지 일정하지 않다. 대체로 맞는 듯 하지만, 거짓 신호가 자주 발생한다.
게다가, '이동평균의 차이에 이동평균을 적용하고 그걸 다시 빼는' 이상한 과정, 해괴망측한 계산을 용인해야 한다. '이동평균이 수렴하려고 한다' 내용에는 어느 정도 수긍이 가지만, 이 부분은 이해하기가 어렵다. 왜? 어째서?라고 목구멍까지 의문이 차오른다. 뭐, 어찌 되었든, 사람들이 이렇게 쓰는 건 잘 맞으니까 하는 거겠지?라고 위안을 삼을 수밖에.
이번 알고리즘에서는 딱 두 가지 보조지표를 활용했다.
MACD 오실레이터
200봉 지수 이동평균
먼저, MACD는 기본 세팅인 window_slow = 26, window_fast = 12, window_sign=9를 그대로 사용하였다. 이때 macd_diff함수는 MACD 오실레이터를 반환한다. 또, 200일 지수 이동평균을 사용하였다. 참고로 5분 봉을 활용했다.
알고리즘은 퍽 간단하다. '상승장인 경우'와 'MACD오실레이터가 음수에서 양수로 변할 때'를 동시에 만족하면 해당 코인을 50,000원어치 사고, 산 가격에서 1%가 오르거나(이득) 1% 내려가면(손절) 판다는 것이다.
이렇게 설정해두고, 11월 26일부터 12월 4일까지 대략 8일 정도 코드를 실행했다. 아무래도 저번 BB+RSI알고리즘을 돌릴 때 너무 짧게 돌린 것 같아서 이번엔 좀 길게 잡아보았다.
뭐, 결과는 좋지 않다.
먼저, 승률이 42%이다. 저번 BB+RSI 알고리즘의 승률인 32%보다는 좀 더 나아졌지만, 여전히 승률이 50%도 넘지 못했다. 손실은 약 5% 정도 보았는데, 같은 기간 비트코인이 3%나 올랐다는 사실이 나를 가슴 아프게 한다. 뭐, 저번 알고리즘에서 35%에 가가운 상승을 보였던 샌드박스는 이번에는 -15%나 빠졌기는 했지만 말이다.
확실히, 이 알고리즘의 오답노트를 보면서 드는 생각은, BB+RSI보다 '추세가 전환되는 강도'는 MACD알고리즘이 훨씬 약하다는 것이었다. 오답의 대부분은 위의 예시처럼, 빨간색 화살표에서 사고, 잠깐의 조정(Pullback) 과정에서(파란색 화살표) 나타났다. 실제로 초록색 화살표로 표시될 부분이 나타날 수 있음에도 말이다. 즉, 비록 추세 지속 시기가 짧더라도 BB+RSI 알고리즘에서는 추세의 전환 자체는 확실한 반면, MACD는 추세 지속 시기가 길지만 추세 전환 강도가 약하다.
뭐, 나타나는 현상 자체는 BB+RSI와 동일하기는 하다.
'자잘하게 이기고, 크게 잃는다'
는 고질적인 문제점 말이다.
다음에는 RSI와 스토캐스틱을 활용한 알고리즘을 소개할 예정이다.