sgkstudio.
엔지니어링

자동매매 청산 전략 실측, 적자에서 흑자로 뒤집힌 이유

자동매매 청산 전략을 실측한 결과, 문제는 매수 신호가 아니라 포지션을 정리하는 방식에 있었습니다. 급등 후 눌림목 매수 전략(SurgePullback)과 볼린저밴드 스퀴즈 전략(BBSqueeze)으로 2026년 5월 13일부터 8월 24일까지 쌓인 실거래 165건을 청산 사유별로 나눠 보니, 목표가 도달 익절 52건은 승률 76.9%로 240.1%를 벌었고 손절 계열 113건은 280.8%를 잃었습니다. 왕복 거래 비용 0.23%를 반영한 건당 기대수익은 −0.478%, 누적으로는 −40.9%였습니다.

2026-09-09실측 표본 — 2026년 5월 13일~8월 24일 실거래 165건(급등 후 눌림목 매수 전략 97건 + 볼린저밴드 스퀴즈 전략 68건)처음 잰 숫자 — 청산 사유로 나누면 목표가 도달 익절 52건(승률 76.9%, +240.1%) 대 손절 계열 113건(−280.8%), 건당 순손실 −0.478%(왕복 비용 0.23% 반영), 누적 −40.9%반증 지점 — 설정 오류 구간(2026년 7월 8일~7월 21일)에 걸린 33건을 제외하자 결론의 부호가 바뀌었다: 급등 후 눌림목 매수 전략 −14.2%→+17.1%, 전체 −40.9%→−9.6%, 손익분기까지 3.1%p→0.9%p조치 — 매수 신호는 그대로 두고 청산 방식 세 가설(익일 개장 강제 청산·당일 손절 정리·진입 시간대 필터)의 검증 순서를 다시 세웠다재측정 결과 — 당일 손절 정리 가설을 적용하자 132건 −9.6%에서 101건 +89.4%(건당 +0.655%)로 뒤집혔다

실거래 165건, 왜 적자였을까?

자동매매 청산 전략을 실측한 결과, 문제는 매수 신호가 아니라 포지션을 정리하는 방식에 있었습니다. 급등 후 눌림목에서 매수하는 전략(SurgePullback)과 변동성이 좁아졌다가 터질 때 진입하는 볼린저밴드 스퀴즈 전략(BBSqueeze), 두 가지로 직접 만든 자동매매 시스템을 실거래에 돌리고 있었습니다.

실거래를 시작한 지 3개월이 지난 시점에 전체 실적을 확인해 보니 적자였습니다. 2026년 5월 13일부터 8월 24일까지 쌓인 거래 165건(급등 후 눌림목 매수 전략 97건, 볼린저밴드 스퀴즈 전략 68건)을 모아 건당 기대수익률을 계산했더니 비용을 반영하기 전에도 −0.248%였고, 매수와 매도를 합친 왕복 거래 비용 0.23%를 더하면 건당 −0.478%, 누적으로는 −40.9%였습니다.

적자 자체보다 궁금했던 지점은 정확히 어디서 새고 있느냐였습니다. 매수 시점을 판단하는 진입 신호가 틀렸는지, 아니면 사놓은 포지션을 정리하는 청산 방식이 문제인지를 가리지 못하면 무엇을 고쳐야 할지도 알 수 없었습니다.

자동매매 시스템은 사람이 매번 화면을 보며 사고파는 대신, 미리 정해 둔 규칙대로 기계가 알아서 매수·매도를 실행합니다. 규칙을 짜는 시점에는 과거 데이터로 돌려 보는 백테스트로만 확인할 수 있고, 그 규칙이 실제 시장에서도 같은 성과를 내는지는 실거래를 일정 기간 쌓아야 알 수 있습니다. 3개월이라는 기간을 기다린 이유도 여기 있습니다. 며칠치 데이터로는 우연히 잘 맞거나 우연히 어긋난 결과인지 구분하기 어렵고, 표본이 어느 정도 쌓여야 청산 사유별로 나눠 비교하는 작업 자체가 의미가 있습니다.

두 전략의 매수 논리도 짚어 두겠습니다. 급등 후 눌림목 매수 전략은 가격이 한 차례 크게 오른 뒤 잠시 되밀리는 구간(눌림목)을 노려 다시 오를 때 진입하는 방식이고, 볼린저밴드 스퀴즈 전략은 가격 변동폭을 나타내는 볼린저밴드가 좁게 눌려 있다가 어느 방향으로든 갑자기 터져 나올 때 그 방향을 따라 진입하는 방식입니다. 둘 다 진입 시점을 정하는 규칙이고, 산 뒤에 언제 어떻게 파는지를 정하는 청산 규칙과는 완전히 분리돼 있습니다. 이 분리 구조 때문에 매수 신호와 청산 방식 중 어느 쪽이 문제인지 나눠서 확인하는 작업이 가능했습니다.

처음 잰 숫자 — 순손실 건당 −0.478%, 누적 −40.9%

판단 기준을 하나로 잡았습니다. 165건을 청산 사유로 나눠 각각의 손익을 따로 계산하는 방식입니다. 목표가에 도달해 자동으로 이익을 확정한 거래(익절)와, 정해 둔 손절선에 걸려 정리된 거래(손절 계열)를 갈라서 보면 어느 쪽이 적자를 만드는지 가려낼 수 있습니다.

결과는 완전히 갈렸습니다. 익절로 끝난 52건은 승률 76.9%로 +240.1%를 벌었습니다. 반대로 손절 계열로 끝난 113건은 −280.8%를 잃었습니다. 익절 쪽만 보면 매수 시점 판단은 틀리지 않았다는 뜻이고, 손절 쪽만 보면 포지션을 정리하는 방식이 번 돈보다 더 많이 깎아 먹고 있다는 뜻입니다. 52건과 113건을 더하면 앞서 말한 165건 전체가 됩니다.

막대그래프. 목표가 도달 익절 52건은 +240.1%, 손절 계열 113건은 −280.8%
익절 52건과 손절 계열 113건의 손익이 완전히 갈렸다

즉 진입 신호가 잡은 자리는 실제로 오르는 경우가 많은데, 그 자리를 정리하는 방식이 그보다 크게 깎아내고 있었습니다. 다음 개선 사이클에서 손댈 곳이 매수 로직이 아니라 청산 로직이라는 결론이 여기서 나왔습니다.

건당 기대수익률이라는 지표를 쓴 이유도 짚어 둘 필요가 있습니다. 거래 165건을 단순히 합산하면 몇 건 크게 이긴 거래나 크게 진 거래에 결과 전체가 휘둘립니다. 건당 평균으로 보면 개별 거래의 크기 차이를 걷어내고 이 전략이 반복했을 때 평균적으로 어느 방향으로 가는지를 볼 수 있습니다. 왕복 거래 비용 0.23%는 매수·매도 양쪽에서 발생하는 수수료와 호가 차이를 합친 값으로, 이걸 반영하지 않으면 실제로는 손해인 전략도 장부상으로는 이익처럼 보일 수 있습니다.

세운 가설 — 진입은 그대로 두고 청산만 손본다

다음 개선 범위를 청산으로만 한정하기로 했습니다. 급등 후 눌림목 매수 전략과 볼린저밴드 스퀴즈 전략, 두 전략의 매수 신호 로직은 건드리지 않습니다. 검증 대상은 청산 방식 세 가지로 좁혔습니다.

  • 가설 1(익일 개장 강제 청산) — 목표가에도 손절선에도 안 닿은 포지션을 다음 날 장이 열리자마자 무조건 정리하는 안전장치. 이 방식으로 끝난 38건이 −131.5%를 기록
  • 가설 2(당일 손절 정리) — 장이 끝나는 시점에 손절선 근처까지 몰린 포지션을 당일 안에 미리 정리하는 방식. 이 방식이 적용된 다음 날(D+1) 거래 31건이 −99.1%를 기록
  • 가설 3(진입 시간대 필터) — 오전 10~11시대 진입만 걸러내는 필터. 이 시간대 진입이 −57.1%를 기록. 신호 자체를 바꾸는 게 아니라 필터만 하나 얹는 안

세 가설은 각각 단독으로 백테스트해서 판정하고, 통과한 가설만 조합하기로 했습니다. 동시에 여러 개를 한꺼번에 적용하면 어느 가설이 진짜 효과를 냈는지 구분할 수 없기 때문입니다.

단독으로 검증한다는 말은 나머지 조건은 원래 규칙 그대로 두고 가설 하나만 바꿔서 과거 거래 165건에 다시 적용해 보는 방식입니다. 예를 들어 가설 2(당일 손절 정리)만 켜고 가설 1과 가설 3은 원래대로 둔 채 다시 계산하면, 그 결과 차이는 오직 가설 2 때문이라고 볼 수 있습니다. 세 가설을 처음부터 한꺼번에 켜서 계산하면 전체 수익률이 얼마나 좋아졌는지는 알 수 있어도, 세 가설 중 무엇이 얼마나 기여했는지는 구분할 방법이 없어집니다. 나중에 어느 가설이 잘못됐는지 되짚어 고치기도 어려워지고요.

이 범위로 좁히기 전에 다른 세 가지 방향도 검토했습니다. 매수와 청산을 동시에 고치는 안은 기각했습니다. 어느 쪽이 효과를 냈는지 판정할 수 없어지고, 매수 쪽은 이미 익절 실적이 보여주듯 흑자를 내는 층이라 건드릴 근거가 없었습니다. 전략 자체를 교체하거나 새 전략을 찾는 안도 기각했습니다. 매수 신호가 유효하다는 게 이미 실측으로 확인된 상태에서 교체는 검증된 자산을 버리는 선택이고, 별도로 진행했던 연구에서 사람이 직접 매매하는 고수의 우위는 그 사람의 판단력에서 나오지, 시스템으로 복제할 수 없다는 결론이 이미 나와 있었습니다. 손절 폭 자체를 넓히거나 좁히는 조정을 우선 항목으로 두는 안은 기각이 아니라 판정 불가로 처리했습니다. 가격이 손절선에 닿기 전에 얼마나 유리한 방향으로 움직였다가 불리한 방향으로 움직였는지 재는 지표가 없어서, 지금 손절 폭이 변동성 대비 좁은지 넓은지 답할 근거 자체가 없었기 때문입니다. 이 계측은 다음 사이클로 넘기기로 했습니다.

가설을 검증하기 전에 — 이 165건을 그대로 믿어도 될까?

세 가설을 백테스트에 넣기 직전에, 표본 자체를 다시 봐야 한다는 지적이 나왔습니다. 청산 로직을 손보다가 실수로 잘못 건드린 구간이 있고, 그 구간에서는 정상적인 판단이 아니라 설정 오류 때문에 잦은 청산이 일어나 손실만 확정됐을 수 있다는 지적이었습니다. 맞는 방향인지 데이터로 확인해야 했습니다.

실제로 데이터에서 확인됐습니다. 청산 방식을 다르게 적용하는 설정값이 실수로 켜져 있던 구간이 2026년 7월 8일부터 7월 21일까지 있었고, 이 구간에 급등 후 눌림목 매수 전략 거래 33건이 걸려 있었습니다. 165건 중 33건이면 전체를 뒤집을 만큼 큰 비중은 아니지만, 문제는 이 33건이 손실 쪽에 몰려 있었다는 데 있었습니다.

가설 검증을 미루고 이 33건을 먼저 걸러냈습니다. 설정 오류가 섞인 구간을 빼고 나머지 132건으로 다시 계산하는 작업입니다.

이 지적이 왜 중요했는지는 설정값 하나가 시스템 전체에 미치는 영향을 생각하면 분명해집니다. 청산 방식을 결정하는 설정값은 거래 하나하나가 아니라 그 값이 켜져 있는 기간의 모든 거래에 똑같이 적용됩니다. 값이 실수로 잘못 켜진 구간이 있으면, 그 구간의 거래는 전략의 원래 규칙이 아니라 사고로 바뀐 규칙을 따라 청산된 셈입니다. 이 구간을 걸러내지 않고 그대로 165건에 섞어서 평균을 내면, 전략 자체의 문제인지 설정 사고의 문제인지 구분할 수 없는 숫자가 나옵니다.

이 지점에서 처음에 세운 세 가설을 순서 없이 바로 검증했다면 어떻게 됐을지도 생각해 볼 만합니다. 오염 구간이 섞인 165건 그대로 가설 2(당일 손절 정리)를 백테스트했다면, 사고 구간에서 나온 손실까지 가설 2의 효과로 잘못 묶여 계산됐을 가능성이 큽니다. 표본을 먼저 정리하지 않고 가설부터 검증하는 순서였다면, 정작 가장 큰 지렛대였던 가설 2의 진짜 효과를 놓쳤을 수도 있는 상황이었습니다.

진짜 원인 — 설정 오류 구간이 결론의 부호를 뒤집었다

오염된 33건을 빼자 결론의 부호 자체가 바뀌었습니다. 급등 후 눌림목 매수 전략만 놓고 보면 −14.2%였던 수익률이 +17.1%로 바뀌었고, 건당 순손실도 흑자로 돌아서 +0.037%를 기록했습니다. 전체 165건 기준 −40.9%였던 누적 손실은 132건 기준 −9.6%로 줄었고, 손익분기까지 남은 거리도 3.1%p에서 0.9%p로 좁혀졌습니다.

숫자 카드 3개. 급등 후 눌림목 매수 전략 −14.2%→+17.1%, 전체 165건→132건 누적 손실 −40.9%→−9.6%, 손익분기까지 거리 3.1%p→0.9%p
설정 오류 구간 33건을 빼자 결론의 부호가 바뀌었다

정리하면 적자는 두 전략이 함께 만드는 게 아니라 볼린저밴드 스퀴즈 전략 한쪽에서 나오고 있었습니다. 설정 오류 구간을 걸러내지 않았다면 잘 작동하던 급등 후 눌림목 매수 전략까지 함께 손보려다 오히려 망가뜨릴 뻔했습니다.

손익분기까지 남은 거리가 3.1%포인트에서 0.9%포인트로 좁혀졌다는 숫자도 다시 짚어 볼 만합니다. 이 거리는 지금 상태에서 순손실을 0으로 만들려면 수익률을 얼마나 더 끌어올려야 하는지를 나타냅니다. 3.1%포인트는 진입 신호나 자금 배분처럼 큰 폭의 구조 변경이 있어야 메울 만한 격차고, 0.9%포인트는 청산 방식 하나를 손보는 정도로도 넘볼 수 있는 격차입니다. 오염 구간을 걸러내는 작업 하나가 이 문제의 크기 자체를 바꿔 놓은 셈입니다.

조치 — 세 가설의 순서를 다시 세우다

범위는 그대로 청산으로 한정하되, 세 가설을 검증할 순서가 바뀌었습니다. 오염 구간을 뺀 132건으로 다시 보니 당일 손절 정리(가설 2)가 단독으로 가장 큰 지렛대였습니다. 이 가설 하나만 적용해도 이론상 최대 +99%포인트까지 끌어올릴 여지가 있었고, 적용하면 두 전략 모두 흑자로 넘어가는 구조였습니다.

진입 시간대 필터(가설 3)는 독립된 가설이 아니라 당일 손절 정리(가설 2)의 그림자였습니다. 당일 정리 대상이 되는 비율이 오전 9시대 진입에서는 8.7%인데 11시대 진입에서는 40.0%까지 뛰었습니다. 같은 현상을 시간대로도 관찰한 셈입니다. 그래서 시간대 필터는 당일 정리 가설을 먼저 적용한 뒤, 남은 거래에만 검증하기로 순서를 바꿨습니다. 순서를 반대로 하면 같은 거래를 두 번 잘라내는 꼴이 되어 당일 정리 가설의 진짜 효과가 가려집니다.

표. 가설 1 익일 개장 강제 청산 38건 −131.5%, 가설 2 당일 손절 정리 31건 −99.1%, 가설 3 진입 시간대 필터 −57.1%
세 가설을 단독으로 백테스트한 결과와 최종 우선순위

익일 개장 강제 청산(가설 1)은 당일 정리 가설이 놓친 나머지 물량을 막는 2차 방어로 후순위에 뒀습니다. 재현이 가능하도록 오염 구간을 걸러내는 로직도 코드에 상수 하나와 옵션 플래그 하나로 남겨서, 기본값은 오염 구간을 제외하고 필요하면 다시 포함해 비교할 수 있게 했습니다. 전체 구간을 다시 훑어 2차 오염 구간이 더 있는지도 확인했는데, 추가로는 발견되지 않았습니다.

이렇게 남겨 둔 이유는 단순합니다. 오염 구간을 걸러내는 기준을 코드 여기저기에 흩어 놓으면, 나중에 비슷한 사고가 또 나왔을 때 어디를 고쳐야 하는지 찾는 데만 시간이 걸립니다. 제외 대상 구간을 목록 하나로 모아 두면, 다음에 같은 종류의 사고가 확인될 때 그 목록에 한 줄만 추가하면 끝나고, 오염 구간을 포함한 원래 숫자와 제외한 숫자를 언제든 나란히 비교할 수 있습니다. 이번처럼 오염 구간을 걸러내느냐에 따라 결론의 부호 자체가 바뀌는 상황에서는, 이 비교를 다시 할 수 있는 구조 자체가 다음 판단의 근거가 됩니다.

재측정 결과 — 132건 −9.6%에서 101건 +89.4%로

당일 손절 정리 가설(가설 2)을 실제로 적용해 다시 재봤습니다. 오염 구간을 제외한 132건에서 이 가설에 걸리는 거래를 뺀 결과, 표본은 101건으로 줄었고 건당 기대수익은 +0.655%, 누적으로는 −9.6%에서 +89.4%로 뒤집혔습니다.

막대그래프. 당일 손절 정리 가설 적용 전 132건 −9.6%, 적용 후 101건 +89.4%
청산 로직 개선 재측정, 132건 −9.6%에서 101건 +89.4%로

출발점이었던 165건 −40.9%와 비교하면 큰 폭의 반전이지만, 이 반전은 두 단계를 거쳐 나온 결과라는 점이 중요합니다. 첫 단계는 설정 오류 구간을 걸러내는 작업이었고, 두 번째 단계가 실제 청산 로직 개선이었습니다. 두 단계를 하나로 뭉뚱그리면 어느 쪽이 얼마나 기여했는지 알 수 없어집니다.

건당 기대수익으로 보면 전체 흐름이 더 뚜렷해집니다. 처음 165건을 그대로 계산했을 때는 비용을 반영한 건당 기대수익이 −0.478%였습니다. 설정 오류 구간 33건을 걸러낸 132건에서는 여전히 마이너스였지만 누적 손실이 −40.9%에서 −9.6%로 줄었고, 당일 손절 정리 가설까지 적용한 101건에서는 건당 +0.655%로 부호 자체가 바뀌었습니다. 같은 165건에서 출발했지만 무엇을 걸러내고 무엇을 고쳤는지에 따라 세 번 다른 숫자가 나온 셈입니다.

같은 방식으로 시스템을 실측해 결론이 뒤집힌 사례는 개발자 생산성 측정 기록에도 있습니다. 자동화 도구를 세는 방식은 달랐지만, 숫자가 늘었다는 사실 자체와 실제로 무엇이 나아졌는지는 다른 문제라는 점은 같았습니다.

남는 한계 — 아직 검증하지 못한 것들

당일 손절 정리 가설(가설 2)에는 부작용도 있습니다. 이 방식을 적용하면 다음 날(D+1) 이익이 났던 거래 3건도 함께 잘려 나갑니다. 손절선에 얼마나 가까워지면 정리할지 기준값을 정밀하게 조정하지 않고 단독으로 적용하면 흑자 표본을 잃을 수 있고, 표본 자체가 31건이라 통계적으로 우연이 아닌지 별도 검증이 필요합니다. +99%포인트라는 상한도 이 기준값을 가장 낙관적으로 잡았을 때 나오는 숫자라, 실제로 조정을 마치고 나면 그보다 낮은 값에서 결정될 가능성이 큽니다.

165건이라는 표본 자체도 한계가 있습니다. 이 표본은 지금까지 살아남은 거래 기록이라, 그사이 사라졌거나 기록이 안 남은 거래는 반영되지 않았을 수 있습니다. 실제로 매수 기록은 있는데 매도 기록과 짝이 맞지 않는 거래가 38건 남아 있습니다. 수동으로 정리했거나 매도 기록이 누락됐을 가능성이 있고, 이 38건까지 반영하면 실제 분포는 지금 계산한 것보다 나쁠 여지가 있습니다.

이런 종류의 편향을 생존 표본 편향이라고 부릅니다. 지금 남아 있는 기록만 보면 시스템이 잘 버틴 사례만 눈에 들어오고, 중간에 조용히 사라진 실패 사례는 계산에서 빠집니다. 자동매매 시스템처럼 기록이 자동으로 남는 구조에서도 수동 개입이나 로깅 오류로 이런 빈틈이 생길 수 있다는 점을, 이번 미매칭 38건이 보여 줬습니다. 이 38건을 추적해 매도 기록을 복원하거나 수동 청산 사유를 확인하는 작업도 다음 사이클로 넘겼습니다.

당일 손절 정리 가설을 그대로 적용하기 전에 남은 작업은 두 가지입니다. 하나는 손절선에 얼마나 가까워지면 당일 정리를 시작할지 기준값을 여러 후보로 바꿔 가며 스윕해 흑자 거래 3건을 살릴 수 있는 지점을 찾는 일이고, 다른 하나는 31건이라는 작은 표본에서 나온 결과가 통계적으로 우연이 아닌지 확인하는 절차입니다. 둘 다 끝나기 전까지는 이번 재측정 결과를 최종 결론이 아니라 다음 사이클의 출발점으로 다룹니다.

매수 신호와 청산 방식을 분리해서 순서대로 검증한 접근 자체도 이번 사이클에서 확인한 결과입니다. 진입은 이미 검증됐다고 자신 있게 말할 수 있는 이유는 익절 52건이 낸 +240.1%가 그대로 살아 있기 때문이고, 청산은 아직 진행 중이라고 말하는 이유는 남은 두 검증이 끝나야 손절 폭까지 포함한 전체 그림이 완성되기 때문입니다. 두 축을 한꺼번에 흔들지 않고 하나씩 순서대로 좁혀 가는 방식이 이번 사이클 전체를 관통하는 원칙이었습니다.

이번 사이클의 산출물은 감사 보고서 한 편과 언제든 같은 계산을 다시 돌릴 수 있는 재현 스크립트입니다. 표본을 다시 모으거나 기준값을 바꿔서 돌릴 때마다 처음부터 손으로 계산하지 않아도 되고, 이번처럼 오염 구간 하나를 더 걸러내야 하는 상황이 다시 와도 같은 스크립트에 조건만 바꿔 넣으면 됩니다. 다음 검증은 여기서부터 이어집니다. 비슷하게 계측 없이 판단해 온 자동화 업무가 있다면 상담에서 함께 짚어볼 수 있습니다.

같은 방식으로 우리 업무를 재보고 싶다면

이 글에 쓴 계측·판정·자동화는 저희가 실제로 매일 돌리는 방식 그대로입니다. 어떤 작업을 자동화할 수 있고 어디를 사람이 잡아야 하는지, 현재 업무 흐름을 놓고 같이 짚어 드립니다.

새 글이 올라오면 알려 드립니다

이런 계측 기록을 새로 쓰면 메일로 한 통 보냅니다. 광고나 판촉은 보내지 않습니다.