sgkstudio.
엔지니어링

생존자 편향 없이 비교한 손절 규칙, 승률 붕괴의 원인

실거래 승률이 55.6%에서 10.7%로 무너진 진짜 원인은 종목 선택이 아니라 손실 관리 방식에 있었습니다. 이 결론은 생존자 편향(살아남은 사례만 보고 판단해 실패 사례를 놓치는 오류)을 피하려고, 이미 한 번 이상 실전 매매 대회 상위권에 든 사람들끼리만 비교하는 방식으로 검증했습니다. 국내 한 증권사가 매달 발표하는 실전 매매 대회 상위 200명 데이터에서, 반복해서 상위권에 오르는 79명과 한 번만 오른 897명의 실제 매매 기록 28,100건을 비교한 결과입니다.

2026-09-11실전 매매 대회 상위 랭커 1,015명 · 왕복매매 28,100건 분석가설 검정 3회 (순위-재랭크 상관 · 손익구조 대조 · 보유구간별 기여도)실거래 승률 55.6%→10.7% 붕괴 원인 소급 규명

실거래 승률은 왜 갑자기 무너졌나

자동매매 시스템은 사람이 화면을 보며 사고파는 대신, 미리 정해 둔 규칙대로 기계가 매수·매도를 실행하는 프로그램입니다. 1분봉 단위로 매매하는 이 자동매매 전략은 급등한 종목이 눌림목에서 다시 반등할 때 매수하는 방식의 초단타 버전입니다. 같은 전략의 청산 로직을 실측해 결론을 뒤집은 기록은 청산 방식을 실측해 결론을 뒤집은 기록에 이미 정리해 뒀습니다. 이번 문제는 매수 신호가 아니라 손절, 그중에서도 시간을 기준으로 강제 청산하는 규칙에서 시작했습니다.

규칙 하나를 새로 짤 때 참고할 만한 실전 데이터가 필요했습니다. 국내 증권사들은 실계좌로 매매하는 개인 투자자를 대상으로 실전 매매 대회를 운영하는데, 매달 수익률 상위 200명의 매매 기록을 공개 랭킹 화면에 띄웁니다. 실계좌 돈이 걸린 실제 매매 기록이라, 시뮬레이션이 아니라 사람이 실제로 어떻게 매매하는지 볼 수 있는 드문 공개 데이터입니다.

이 전략에는 매수 후 20분이 지나도 포지션이 손실 상태면 강제로 정리하는 규칙이 들어 있었습니다. 이 규칙은 국내 한 증권사가 매달 운영하는 실전 매매 대회 데이터를 참고해 설계했습니다. 이 대회는 매달 실계좌 수익률 상위 200명을 공개 랭킹으로 발표하는데, 상위권에 오르는 사람들이 손실을 빨리 정리한다는 인상을 근거로 20분 손절 규칙을 넣었습니다.

그런데 이 규칙을 켠 채로 실거래에 투입하자 승률이 크게 떨어졌습니다. 과거 데이터로 되돌려 확인하는 백테스트 단계에서는 문제가 드러나지 않았고, 실제 계좌로 돈이 오가는 실거래 구간에서만 나타난 문제였습니다. 승률 하락은 이 전략이 손실을 내는 방향으로 계속 매매하고 있다는 뜻이라, 원인을 찾을 때까지 이 규칙을 계속 켜 둘 수 없었습니다.

백테스트를 통과한 규칙이 실거래에서만 무너지면 보통 두 가지 중 하나를 의심합니다. 하나는 체결 가격이나 슬리피지처럼 과거 데이터에는 없던 실거래 특유의 마찰 비용이고, 다른 하나는 규칙 자체가 애초에 잘못된 관찰에서 출발했을 가능성입니다. 이 전략은 이미 청산 로직 전반을 한 차례 실측한 이력이 있어서 마찰 비용 쪽은 어느 정도 걸러진 상태였고, 그래서 이번에는 규칙의 근거가 됐던 실전 매매 대회 데이터 쪽을 다시 열어 보기로 했습니다.

처음 잰 숫자 — 55.6%에서 10.7%로

이 규칙을 켜기 전 실거래 승률은 55.6%였습니다. 규칙을 켠 뒤 다시 재보니 승률은 10.7%로 떨어져 있었습니다. 두 숫자를 나란히 놓고 보니 이 규칙이 전략을 개선한 게 아니라 망가뜨렸다는 게 분명했고, 2026년 7월 21일에 이 규칙을 일단 껐습니다.

실거래 승률 변화
구간승률
20분 손절 규칙을 켜기 전55.6%
20분 손절 규칙을 켠 뒤10.7%

실거래에서 측정한 값입니다. 2026년 7월 21일에 이 규칙을 껐습니다.

막대그래프. 20분 손절 규칙을 켜기 전 실거래 승률 55.6%, 켠 뒤 10.7%로 떨어졌다
규칙을 끈 이유 — 승률이 절반 아래로 떨어졌다

규칙을 끈 시점에는 정확한 원인을 몰랐습니다. 다만 그전에 따로 재 둔 숫자가 하나 있었습니다. 실전 매매 대회에서 6월 상위 200위 안에 든 사람이 7월에도 다시 상위 200위에 드는 비율, 즉 재랭크율이 7.8%였습니다. 이 숫자를 처음 봤을 때는 「7.8%는 낮은 숫자니까 반복 상위권 진입은 대부분 운이다」로 읽었습니다. 비교할 기준선이 없는 상태에서 내린 판단이었습니다.

반복 상위권 진입은 정말 운이었을까

연속으로 랭크하는 사람이 있으면, 그 사람은 운이나 변동성을 체계적으로 관리하고 있다는 뜻 아닐까?

이 질문이 가설이 됐습니다. 반복 상위권 진입이 순전한 운이라면, 6월 순위는 7월 재랭크와 아무 관련이 없어야 합니다. 반대로 위험을 체계적으로 관리하는 사람이 따로 있다면, 6월 순위가 7월 재랭크를 어느 정도 예측할 수 있어야 합니다. 두 가능성을 가르는 기준을 미리 정해 두지 않으면, 결과가 나온 뒤에 어느 쪽으로든 끼워 맞춰 해석하기 쉬워집니다.

이 가설을 검증하려고 실전 매매 대회에서 2개월 연속 상위 200위 안에 든 「지속 랭커」 79명과, 한 번만 상위 200위에 들고 다음 달엔 밀려난 「1회성 랭커」 897명을 나눴습니다. 두 집단 모두 이미 한 번은 상위 200위 안에 든 사람들이라, 애초에 상위권에 오른 이유가 순전히 운이었을 가능성(생존자 편향)은 이 비교 설계에서 상당 부분 통제됩니다. 살아남은 사례만 보고 판단하는 함정을 피하려면 실패한 쪽도 같이 봐야 하는데, 여기서는 「실패한 쪽」도 이미 한 번 상위권에 오른 사람들이기 때문입니다.

생존자 편향은 흔히 이렇게 설명합니다. 전쟁에서 돌아온 전투기의 총알 자국만 보고 그 부위를 보강하면, 정작 총알을 맞고 못 돌아온 기체가 어디를 맞았는지는 영영 알 수 없습니다. 이번 경우 상위 200명 전체를 「살아 돌아온 전투기」로 보고 그 안에서 매매 습관을 뽑으면, 200위 밖에서 사라진 나머지 참가자들의 습관은 비교 대상에서 빠집니다. 지속 랭커와 1회성 랭커를 나눠 비교하는 방식은 이 문제를 완전히 없애지는 못해도, 비교 대상 둘 다 이미 한 번 살아남은 사례라는 점에서 격차를 줄입니다.

완전히 없애지 못한다고 말한 이유는, 지속 랭커 79명도 1회성 랭커 897명도 결국 더 큰 참가자 무리 중 상위권만 골라낸 결과이기 때문입니다. 그래도 두 집단을 나눠 비교하면 「상위권에 들었다는 사실 자체」가 만드는 편향은 양쪽에 똑같이 걸리고, 남는 차이는 상위권 안에서의 차이로 좁혀집니다. 이 좁혀진 차이를 재는 것이 이번 검증의 목표였습니다.

가설을 세울 때 놓쳤던 것 — 종목을 잘 고른 게 아니었다

가설을 세울 때 자연스럽게 떠오른 그림은 「지속 랭커는 종목을 더 잘 고른다」였습니다. 위험을 체계적으로 관리한다는 말을 들으면, 승률이 높고 평균 수익이 큰 매매를 상상하기 쉽습니다. 지속 랭커 79명과 1회성 랭커 897명의 왕복매매 28,100건을 비교했더니, 이 그림은 정확히 반대였습니다.

지속 랭커와 1회성 랭커의 승률·평균이익 비교
지표지속 랭커 (79명·2,477건)1회성 랭커 (897명·25,619건)
승률50.3%55.0%
평균 이익2.65%3.91%

특성은 6월 매매로만 계산하고 결과는 7월 재랭크 여부로 판단해, 미래 정보가 과거 판단에 섞이는 문제를 없앴습니다.

지속 랭커의 승률(50.3%)은 1회성 랭커(55.0%)보다 낮았고, 평균 이익(2.65%)도 1회성 랭커(3.91%)보다 낮았습니다. 종목을 더 잘 고르는 사람이 반복해서 상위권에 오른다는 가정은 이 숫자 앞에서 성립하지 않았습니다. 반복 상위권 진입을 설명하는 요인은 다른 곳에 있었습니다.

이 비교에서 왕복매매란 한 종목을 사서 다시 팔기까지의 거래 한 건을 뜻합니다. 매수 체결과 매도 체결은 각각 따로 남는 기록이라, 이 둘을 하나의 거래로 짝지어야 승률이나 손익 같은 지표를 계산할 수 있습니다. 그리고 특성을 6월 매매로만 계산하고 결과는 7월 재랭크 여부로 판단한 이유도 있습니다. 만약 6월과 7월 매매를 섞어서 특성을 계산하면, 7월에 잘한 매매가 6월 특성에도 영향을 줘 「원인이 결과를 예측한다」는 착시가 생깁니다. 시점을 나눠야 진짜 인과 방향을 볼 수 있습니다.

진짜 원인은 손실 폭과 보유 시간이었다

같은 28,100건 안에서 손실 쪽 지표를 나란히 놓으면 이야기가 달라집니다. 지속 랭커는 덜 먹고, 덜 잃고, 성적이 덜 흩어졌습니다.

손실 통제 지표 비교
지표지속 랭커1회성 랭커
평균 손실−1.93%−2.68%
−5% 이하 손실 비중8.5%14.5%
최악 손실−49.4%−77.6%
이익 99%분위20.3%36.0%
보유 시간 중앙값0.8시간2.7시간

표준편차도 지속 랭커 19.7, 1회성 랭커 21.9로 지속 쪽 성적이 덜 흩어졌습니다. 1회성 쪽은 6월 한 달 수익률이 최대 728%까지 치솟은 사례가 섞여 있는데, 지속 랭커의 6월 최대치는 249%였습니다. 큰 한 방은 다음 달에 반복되지 않았습니다.

표준편차는 값이 평균에서 얼마나 흩어져 있는지를 보여 주는 숫자입니다. 지속 랭커의 개인별 승률 표준편차가 더 작다는 사실은, 이 집단 안에서는 어떤 달에는 잘 되고 어떤 달에는 완전히 무너지는 식의 극단적인 편차가 덜하다는 뜻입니다. 최악 손실도 지속 랭커는 −49.4%에서 멈췄지만 1회성 랭커는 −77.6%까지 밀렸습니다. 종목 선택 능력이 아니라 손실 확대를 막는 능력, 그리고 그 능력을 매달 비슷하게 유지하는 일관성이 두 집단을 가르고 있었습니다.

손실 폭 다음으로는 보유 시간대별로 수익이 어디서 나오는지를 봤습니다. 왕복매매 하나하나를 보유 구간별로 나눠 그 구간이 전체 수익에서 차지하는 몫을 계산했습니다.

보유 구간별 거래 비중과 수익 기여
보유 구간지속 랭커 (건수 비중 / 수익 기여)1회성 랭커 (건수 비중 / 수익 기여)
6.5시간 미만69% / −16.2%57% / −0.3%
당일~1일12% / +49.3%16% / +24.0%
1~3일8% / +33.8%11% / +18.3%
3일 이상11% / +28.6%15% / +57.9%

건수 비중은 전체 왕복매매 대비, 수익 기여는 각 구간이 전체 손익에서 차지하는 몫입니다.

흐름도. 매수 후 20분이 지나도 손실이면 강제 청산하는 규칙이, 수익이 나오는 하루 이상 보유 구간에 도달하기 전에 포지션을 잘라낸다
20분 손절 규칙이 자르는 자리가 수익이 나는 자리와 겹쳤다

보유 6.5시간 미만 거래는 지속 랭커와 1회성 랭커 모두 순손실이었고, 두 집단의 수익은 사실상 하루를 넘겨 보유한 거래에서만 나왔습니다. 그런데 매수 후 20분이 지나도 손실이면 강제로 정리하는 규칙은, 정확히 이 하루 이상 보유 구간에 도달하기 전에 포지션을 잘라내는 규칙입니다. 승률이 55.6%에서 10.7%로 무너진 원인은 우연이 아니라, 데이터가 말하는 방향과 정반대되는 규칙을 그대로 구현한 결과였습니다.

규칙을 만들 때는 「상위권 랭커는 손실을 빨리 정리한다」는 인상만 보고 20분이라는 시간을 골랐습니다. 그런데 실제로 상위권 랭커를 가르는 기준은 손실을 빨리 정리하는 속도가 아니라, 손실이 일정 폭 이상 커지지 않게 막는 폭이었습니다. 시간을 기준으로 자르는 규칙과 손실 폭을 기준으로 자르는 규칙은 언뜻 비슷해 보이지만, 이번 경우에는 정반대 결과를 냈습니다. 시간 기준 규칙은 아직 손실 폭이 크지 않은 초반 20분에 발동해, 수익으로 이어질 수 있는 자리까지 도달하기 전에 포지션을 강제로 정리했기 때문입니다.

무엇을 고쳤나

  • 개별 매수·매도 체결 기록을 하나의 왕복매매로 복원하는 엔진을 새로 만들었습니다. 이 엔진이 없었으면 28,100건이라는 표본 자체가 없었습니다.
  • 실거래 감사 데이터에서 시스템 사고로 오염된 구간 33건을 제외했습니다. 이 33건을 빼자 그전까지 나왔던 결론 하나의 부호가 반대로 바뀌었습니다.
  • 손실 상태에서 20분이 지나면 강제 청산하는 규칙을 코드 배선 단계에서 껐습니다. 2026년 7월 21일에는 감시 화면에서 수동으로 껐을 뿐이라, 다음 배포에서 설정값이 초기화되면 같은 규칙이 조용히 되살아날 위험이 있었습니다. 이번에는 코드 자체에서 규칙을 빼서 그 위험을 없앴습니다.
  • 그때그때 다르게 짜서 흩어져 있던 분석 코드 4건을 저장소 안의 재현 가능한 스크립트 하나로 합치고, 이 스크립트에 유닛 테스트 9건을 붙였습니다.

왕복매매 복원 엔진을 먼저 만든 이유는 이 분석의 시작점이었기 때문입니다. 증권사 데이터는 매수 체결과 매도 체결이 각각 낱개 기록으로 남고, 어떤 매수가 어떤 매도와 짝이 되는지는 저절로 정해지지 않습니다. 같은 종목을 하루에 여러 번 사고팔면 어떤 매도가 어떤 매수와 짝인지 헷갈리기 쉬운데, 이 엔진은 체결 순서와 수량을 맞춰 가며 자동으로 짝을 지어 줍니다. 이 엔진이 없었다면 승률·평균이익·보유 시간 같은 지표 자체를 계산할 방법이 없었고, 28,100건이라는 표본도 존재하지 않았습니다.

사고 구간 33건을 제외한 조치는 별도의 라이브 감사 과정에서 나왔습니다. 시스템 오류로 정상 매매가 아닌 기록이 뒤섞여 있으면, 그 33건이 만드는 손익이 진짜 매매 성과에 그대로 얹혀 결론의 부호까지 바꿀 수 있습니다. 실제로 이 33건을 빼기 전과 뺀 후 결론의 부호가 반대로 바뀌었다는 사실은, 표본을 눈으로만 검토해서는 걸러내기 어려운 오염이 섞여 있었다는 뜻입니다.

네 가지 중 마지막 조치가 이 글의 표와 그림에 나온 숫자 전부를 만든 재현 경로입니다. 그전까지는 세션마다 따로 짠 스크래치 코드로 분석했는데, 코드가 저장소에 남지 않으니 다음에 같은 계산을 다시 돌리려면 처음부터 다시 짜야 했습니다. 지금은 기준 달과 다음 달을 바꿔 넣으면 같은 계산을 다른 달 조합으로도 다시 돌릴 수 있고, 유닛 테스트 9건이 계산 로직이 바뀌지 않았는지 매번 확인합니다.

python3 scripts/hero_persistence_analysis.py --base 202606 --next 202607

재측정 결과 — 운 가설은 4배 격차로 기각됐다

7.8%라는 하나의 숫자 대신, 6월 순위 구간별로 나눠 7월 재랭크율을 다시 쟀습니다. 결과는 순위가 높을수록 재랭크율도 뚜렷하게 높은 형태였습니다.

막대그래프. 6월 순위 1~10위(71명)는 7월 재랭크율 16.9%, 51~100위(247명)는 9.7%, 101~200위(495명)는 4.2%
6월 순위가 높을수록 7월에 다시 랭크될 확률이 4배 높았다
6월 순위 구간별 7월 재랭크율
6월 순위표본 수7월 재랭크율
1~10위71명16.9%
51~100위247명9.7%
101~200위495명4.2%

전체 표본은 1,015명입니다. 순위와 재랭크 여부의 상관은 r=−0.123(n=1,015, t=−3.95, p<0.01)이었습니다.

1~10위였던 71명 중 16.9%가 7월에도 상위 200위 안에 들었지만, 101~200위였던 495명 중에서는 4.2%만 그랬습니다. 순전한 운이라면 6월 순위는 7월 결과에 아무 정보도 주지 못해야 하는데, 실제로는 4배 가까운 격차가 났습니다. 이 차이를 검정한 z값은 4.26, 양측 검정 p값은 2.07e-05였습니다.

z값과 p값은 「이 정도 격차가 순전히 우연히 나올 확률이 얼마나 낮은가」를 보여 주는 숫자입니다. p값 2.07e-05는 순위와 재랭크가 아무 관계가 없다는 가정 아래에서는 이런 격차가 사실상 나오기 어렵다는 뜻이고, 통계학에서 흔히 쓰는 기준(p<0.05)보다 훨씬 엄격한 기준도 가볍게 통과합니다. 순위와 재랭크 여부 사이의 상관관계도 r=−0.123(n=1,015, t=−3.95, p<0.01)으로, 통계적으로 우연이라고 보기 어려운 수준이었습니다.

그래서 「재랭크율 7.8%는 낮은 숫자니까 대부분 운이다」라는, 2026년 8월 16일 이전에 내렸던 해석은 철회합니다. 그 숫자는 틀린 숫자가 아니라, 비교할 기준선 없이 읽은 숫자였습니다. 순위 구간별로 나눠 다시 재자 같은 데이터가 정반대 결론을 지지했습니다.

아직 못 푼 것 — 남는 한계

이 분석은 실전 매매 대회 참가자들의 데이터입니다. 1분봉 단위로 매매하는 자동매매 전략과는 참가자 구성도, 매매 시간 축도 다릅니다. 보유 시간에 관한 이번 결론을 그 전략에 그대로 옮기면, 이미 한 번 실패한 바로 그 경로를 다시 걷는 셈입니다. 20분 손절 규칙 자체가 그렇게 만들어졌다가 실패했기 때문에, 이번 분석의 결과도 「이 전략을 이렇게 고쳐라」가 아니라 「이 실전 매매 대회 참가자 안에서는 무엇이 반복 상위권 진입을 만드는가」로만 읽어야 합니다.

두 모집단이 왜 다른지도 짚어 둘 필요가 있습니다. 실전 매매 대회 참가자는 하루에서 몇 주 단위로 종목을 들고 가는 스윙 매매자가 많고, 1분봉 자동매매 전략은 짧으면 몇 분, 길어도 하루 안에 포지션을 정리하는 초단타 매매입니다. 시장이 움직이는 속도도, 손실이 커지는 속도도 서로 다른 시간축 위에 있어서, 한쪽에서 「보유를 늘리면 낫다」는 결론이 다른 쪽에서는 전혀 다른 의미로 작동할 수 있습니다.

또 하나 남은 교란 변수는 참가 자체를 통제하지 못했다는 점입니다. 「재랭크」라는 지표는 실력이 있어서 다시 상위권에 든 경우와, 그냥 다음 달에도 계속 참가했을 뿐인 경우를 구분하지 못합니다. 매달 전체 참가자 명단이 따로 있다면 「참가했을 때 랭크될 확률」로 나눠 이 둘을 분리할 수 있지만, 지금 쓰는 수집 방식은 공개 랭킹 화면에 실제로 나타나는 행만 가져오는 방식이라 200위 너머까지 명단이 남아 있는지는 아직 확인하지 못했습니다.

지금 확인할 수 있는 범위는 「상위 200위 안에 든 사람들 사이에서는 무엇이 다른가」뿐이고, 「애초에 대회에 계속 참가하는 사람들 전체에서는 어떤가」는 다른 질문입니다. 이 두 질문을 같은 질문으로 섞으면 또 하나의 편향이 생깁니다. 매달 조용히 대회를 그만두는 사람들의 습관은 지금 이 분석에 전혀 담기지 않았고, 그 습관이 지속 랭커와 얼마나 다른지는 여전히 열려 있는 질문입니다. 전체 참가자 명단 접근 가능성을 확인하는 일은 다음 분석 주기로 넘겼습니다.

실거래 데이터를 실측해 결론이 뒤집힌 다른 기록은 청산 방식을 실측해 결론을 뒤집은 기록에도 있습니다. 자동화 전략이나 파이프라인을 검증할 때 어디까지 믿을 수 있는지 판단이 필요하다면 상담에서 이야기할 수 있습니다.

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

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

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

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