매수는 맞았는데 청산에서 무너졌던 기록
키움헌터v2 초기 버전은 매수 신호의 방향성 자체는 나쁘지 않았는데도 계좌 곡선이 좀처럼 우상향하지 않았습니다. 거래 로그를 처음부터 끝까지 다시 읽고서야 원인을 찾았는데, 문제는 ‘어디서 사느냐’가 아니라 ‘어디서, 어떻게 파느냐’에 있었습니다.
당시 봇에는 단순한 고정 손절선 하나만 걸려 있었습니다. 그러다 보니 매수 직후 크게 올랐다가 도로 꺼지는 종목에서는 벌어 둔 이익을 전부 반납한 뒤에야 겨우 본전 근처에서 빠져나왔고, 시장 전체가 급락하는 날에는 손절 주문이 줄줄이 체결되며 하루 만에 계좌가 크게 흔들렸습니다. 종목을 고르는 모델은 멀쩡했지만, 포지션을 빠져나오는 규칙이 현실의 여러 상황을 감당하지 못했던 것입니다.
먼저 분명히 해 두겠습니다. 이 글은 특정 종목을 추천하거나 수익을 보장하려는 글이 아닙니다. 저는 부동산 실무를 20년 해 오다 AI의 도움을 받아 자동매매 봇을 직접 만들어 본 사람이고, 여기서 다루는 것은 포지션을 정리하는 규칙을 어떻게 설계하느냐에 관한 프로그래밍·리스크 관리 개념일 뿐입니다. 자동매매는 원금 손실이 발생할 수 있으며, 청산 규칙을 정교하게 짠다고 해서 손실이 사라지거나 수익이 보장되지는 않습니다. 다만 청산 설계가 허술하면 좋은 진입 신호도 결국 손실로 바뀐다는 점만큼은 실제 로그로 확인한 사실입니다.
단일 청산 조건이 번번이 어긋나는 이유
초보가 처음 짜는 봇은 대개 청산 규칙이 하나뿐입니다. ‘몇 퍼센트 빠지면 판다’는 고정 손절선만 두거나, 거기에 ‘몇 퍼센트 오르면 판다’는 고정 익절선을 하나 더 붙이는 정도입니다. 코드는 단순하지만, 시장은 이 단순함을 가만두지 않습니다.
고정 손절·익절만으로 대응하기 어려운 상황은 크게 세 가지입니다. 첫째, 추세를 길게 타는 종목에서 익절선을 낮게 잡으면 큰 흐름을 너무 일찍 끊어 버립니다. 둘째, 익절선을 높게 잡으면 앞 사례처럼 올랐던 이익을 도로 반납합니다. 셋째, 손절선이 종목의 평소 변동 폭을 고려하지 않으면, 정상적인 출렁임에도 손절이 튀어 나가 ‘잘 가다가 흔들려 털리는’ 거래가 반복됩니다.
여러 출구를 조합하는 하이브리드 청산
하이브리드 청산은 이 한계를 풀기 위해 성격이 다른 청산 조건을 여러 개 겹쳐 두고, 그중 먼저 조건을 만족하는 쪽으로 포지션을 정리하는 방식입니다. 대표적으로 다음 네 가지 성격의 출구를 섞습니다.
- 고정 손절: 한 거래에서 감내할 최대 손실을 정해 두는 하한선입니다.
- 추적 손절(trailing stop): 주가가 오르면 손절선도 따라 올려, 번 이익의 일부를 지키면서 추세를 더 태웁니다.
- 시간 기반 청산: 정해진 기간 동안 결판이 나지 않으면 자금 효율을 위해 정리합니다.
- 변동성 기반 조정: 종목의 평소 변동 폭에 맞춰 청산선의 폭을 종목마다 다르게 잡습니다.
단일 규칙과 하이브리드의 대조
세 방식을 나란히 놓으면 왜 조건을 겹쳐야 하는지 드러납니다.
| 구분 | 고정 손절만 | 고정 손절+익절 | 하이브리드 청산 |
|---|---|---|---|
| 이익 보전 | 약함 | 중간 | 추적 손절로 방어 |
| 추세 추종 | 불가 | 익절선에 막힘 | 추적으로 연장 |
| 미결 포지션 | 방치됨 | 방치됨 | 시간 경계로 정리 |
| 종목별 적응 | 없음 | 없음 | 변동성으로 조정 |
핵심은 어느 하나가 만능이 아니라는 점입니다. 추적 손절은 이익을 지키지만 횡보장에서는 잦은 청산을 부르고, 시간 청산은 자금을 돌리지만 큰 추세의 초입을 끊을 수 있습니다. 서로의 약점을 다른 조건이 메우도록 겹쳐 두는 것이 하이브리드 청산의 본질입니다. 구체적인 손절 폭이나 추적 간격, 보유 기간 같은 수치는 계좌의 위험 감내 수준과 종목 특성에 따라 달라지는 튜닝 영역이라 여기서는 다루지 않습니다.
킬스위치, 포지션이 아니라 ‘시스템’을 멈추는 장치
하이브리드 청산이 개별 포지션을 다루는 미시적 장치라면, 킬스위치(kill switch)는 계좌와 시스템 전체를 다루는 거시적 장치입니다. 둘은 역할이 전혀 다릅니다. 개별 청산 규칙이 모두 정상 작동하더라도, 봇 자체가 오작동하거나 시장이 비정상적으로 움직이는 날에는 개별 청산만으로 큰 사고를 막지 못합니다.
킬스위치는 미리 정한 비상 조건이 충족되면 신규 진입을 멈추고, 필요하면 보유 포지션까지 일괄 정리한 뒤 봇을 대기 상태로 돌리는 안전장치입니다. 비상 조건은 두 갈래로 나뉩니다. 하나는 손익 기준입니다. 하루 누적 손실이 한도에 닿거나 손실이 연속으로 쌓이면, 그날은 더 이상 거래하지 않도록 강제로 멈춥니다. 다른 하나는 시스템 이상 기준입니다. 시세 데이터 피드가 끊기거나, 주문 거부가 비정상적으로 몰리거나, 네트워크가 불안정해지면 봇이 잘못된 정보로 매매를 이어 가지 않도록 차단합니다.
제가 킬스위치의 필요성을 절감한 것도 손실이 아니라 시스템 이상 때문이었습니다. 데이터 피드가 잠시 지연되는 사이 봇이 낡은 가격으로 판단을 이어 가며 엉뚱한 주문을 반복한 적이 있는데, 당시에는 이를 자동으로 멈출 장치가 없어 수동으로 프로세스를 내려야 했습니다. 손실 한도만큼이나 ‘봇이 스스로를 못 믿을 상황’을 감지해 멈추는 규칙이 중요하다는 것을 그때 배웠습니다. 발동 기준이 되는 손실 한도나 연속 횟수 같은 구체 수치는 계좌마다 달라지는 영역이라 공개하지 않습니다.
봇에 얹기 전 스스로 점검할 항목
개념을 코드로 옮기기 전에 확인할 것을 정리합니다. 방향만 잡아 두겠습니다.
- 청산 조건이 서로 충돌하지 않는가: 여러 출구를 겹치면 두 조건이 동시에 걸리는 순간이 옵니다. 어느 조건을 우선할지 순서를 명시해야 봇이 멈칫하지 않습니다.
- 추적 손절과 고정 손절의 관계를 정했는가: 추적선이 고정 하한선을 침범할 때 어느 쪽을 따를지 미리 규칙으로 못 박아야 합니다.
- 킬스위치를 손익뿐 아니라 시스템 이상에도 걸었는가: 손실 한도만 보는 킬스위치는 데이터 오류나 주문 폭주 같은 사고를 놓칩니다.
- 발동 이후 재가동 규칙이 있는가: 킬스위치가 작동한 뒤 아무 점검 없이 다시 켜지면 같은 사고가 반복됩니다. 사람이 상황을 확인하고 재가동하는 절차를 함께 설계해야 합니다.
가장 흔한 실수는 진입 모델에만 공을 들이고 청산과 비상 정지를 뒷전으로 미루는 조합입니다. 진입이 성패의 절반이라면 나머지 절반은 청산과 킬스위치가 쥐고 있습니다. 좋은 신호로 들어가는 규칙만큼이나, 틀렸을 때 질서 있게 빠져나오고 사고가 났을 때 전체를 멈추는 규칙을 먼저 세워 두는 것이 검증 가능한 봇의 조건입니다.
답글 남기기