감정을 없애면 트레이딩이 쉬워질 것이라고 생각했다
자동매매를 만들기 시작했을 때 내가 기대했던 것은 비교적 단순했다. 사람이 매매하면 감정 때문에 규칙을 어기지만, 프로그램은 정해진 조건을 그대로 실행한다. 그렇다면 내가 사용하는 매매법을 코드로 옮기고 손절과 익절, 포지션 관리까지 자동화하면 훨씬 안정적인 트레이딩이 가능하지 않을까 생각했다. 손절을 미루지도 않고, 수익을 보고 겁이 나서 너무 빨리 익절하지도 않으며, 좋은 조건이 나왔는데 망설이다 진입을 놓치는 일도 없을 것이다. 당시에는 인간의 약점을 제거하면 전략의 장점만 남을 것처럼 느껴졌다.
그런데 직접 전략을 코드로 만들기 시작하면서 가장 먼저 부딪힌 것은 프로그램의 문제가 아니라 내 생각의 모호함이었다. 평소 차트를 볼 때는 너무 자연스럽게 사용하는 표현들이 코드에서는 전혀 자연스럽지 않았다. ‘추세가 강하다’, ‘지지가 잘 버틴다’, ‘거래량이 들어온다’, ‘조금 더 기다려보자’, ‘이 정도면 휩쏘 같다’ 같은 판단은 사람에게는 익숙하지만 컴퓨터에게는 아무 의미가 없다. 어느 이동평균선 위에 있어야 상승 추세라고 할 것인지, 몇 봉 동안 지지를 유지해야 버틴 것으로 볼 것인지, 거래량이 평균보다 몇 퍼센트 증가해야 의미 있는 증가라고 할 것인지 숫자로 정의해야 했다.
이 과정에서 내가 알고 있다고 생각했던 많은 것들이 사실은 정확하게 설명하지 못하는 감각에 가까웠다는 사실을 알게 됐다. 차트를 보면서는 ‘이건 아니다’라고 쉽게 판단하는데, 왜 아닌지를 조건문으로 적으려 하면 막혔다. 반대로 코드로는 완벽하게 정의할 수 있는 조건이 실제 차트에서는 별 의미가 없는 경우도 있었다. 결국 사람이 차트를 보는 것과 프로그램이 시장을 보는 방식 사이에는 생각보다 큰 차이가 있었다.
자동매매를 만들면서 두 번째로 알게 된 것은 하나의 문제를 해결하면 다른 문제가 생긴다는 사실이었다. 진입이 너무 많으면 필터를 추가하고 싶어진다. 이동평균선을 넣고, 추세 조건을 강화하고, 변동성 조건을 넣으면 나쁜 진입이 줄어드는 것처럼 보인다. 하지만 동시에 좋은 진입도 줄어든다. 필터를 더 강화하면 백테스트의 승률은 좋아질 수 있지만 거래 횟수가 급격하게 줄어들고, 실제 시장에서는 큰 움직임의 초입을 놓치는 경우가 생긴다.
손절도 마찬가지였다. 너무 자주 손절되면 손절폭을 넓히고 싶어진다. 그러면 승률은 높아질 수 있지만 평균 손실이 커진다. 반대로 손절을 지나치게 짧게 잡으면 손실 금액은 작아 보여도 시장의 정상적인 변동에 계속 잘릴 수 있다. 익절을 빠르게 설정하면 승률은 좋아지는 것처럼 보이지만 큰 추세를 가져가지 못하고, 익절을 멀리 두면 좋은 움직임은 크게 먹을 수 있지만 상당수의 수익 거래가 다시 손절이나 본절로 돌아온다.
처음에는 이런 문제를 조건 하나씩 추가해서 해결하려 했다. 첫 번째 익절 이후에는 남은 포지션을 트레일링으로 가져가고, 갑작스러운 급락이 나오면 별도의 청산 조건을 만들고, 추세 전환이 나오면 기존 포지션을 먼저 닫은 뒤 반대 방향으로 진입하도록 했다. 같은 봉에서 청산과 진입이 동시에 발생하면 주문이 꼬일 수 있어 재진입을 한 박자 늦추는 규칙도 필요했다. 전략을 실제 거래 시스템과 연결하면서는 단순히 매수와 매도 신호를 만드는 것만으로 끝나지 않았다. 포지션이 정말 닫혔는지, 부분 익절 이후 잔여 수량은 얼마인지, 같은 신호가 중복으로 전달되지는 않는지 같은 실행 문제까지 모두 전략의 일부가 되었다.
지금 바로 작가의 멤버십 구독자가 되어
멤버십 특별 연재 콘텐츠를 모두 만나 보세요.