sgkstudio.
엔지니어링

생존자 편향 보정 — 랭커가 진 달을 넣자 기대수익이 3분의 1로

생존자 편향 보정을 하자 랭커의 청산 습관은 살아남았고, 기대 수익은 3분의 1 남짓으로 줄었습니다. 지속 랭커 26명이 랭킹에 못 든 달의 체결 14,857행을 더해 왕복 표본을 960건에서 1,933건으로 늘렸고, 비용을 뺀 평균 순수익은 +0.79%에서 +0.28%로 내려갔습니다. 약세장 구간의 손실은 착시가 아니라 더 뚜렷한 사실이었습니다.

2026-10-07측정 조건 — 지속 랭커 26명, 전체 체결 35,367행 중 랭킹 밖 달 체결 14,857행(42%) 추가 수집처음 잰 숫자 — 이긴 달만 담긴 왕복 960건, 비용 차감 평균 순수익 +0.77%반증된 가설 1 — 청산 습관은 진 달에도 유지(손익비 1.68 대 1.51, 보유 시간 비율 2.6배 대 2.1배)반증된 가설 2 — 약세장 손실은 표본을 2배(175→359건)로 늘리자 -0.05%에서 -0.28%로 더 뚜렷재측정 — 왕복 1,933건, 전체 평균 순수익 +0.62%, 지속 랭커 +0.79%→+0.28%남은 한계 — 26명 상한, 74명 프로필 조회 차단, 지속 랭커 자체가 골라진 표본

생존자 편향 보정이 왜 필요했나? 랭커가 이긴 달만 보고 있었다

생존자 편향 보정을 하자 상위 랭커의 청산 습관은 그대로 살아남았지만, 그 습관으로 기대할 수 있는 수익은 비용을 뺀 거래당 평균 +0.79%에서 +0.28%로 3분의 1 남짓까지 줄었습니다. 약세장 구간의 손실도 착시가 아니라 더 뚜렷한 사실로 드러났습니다. 이 글은 실전 매매 대회 랭커의 매매 기록에서 「잘 파는 법」을 뽑아내려다, 표본이 랭커가 이긴 달로만 채워져 있다는 약점을 정면으로 고친 과정을 숫자 그대로 적은 기록입니다.

처음 분석은 그럴듯했습니다. 여러 달 연속 랭킹에 오르는 지속 랭커의 매수·매도 체결을 짝지어 왕복 거래로 복원하고, 손실은 짧게 끊고 이익은 길게 끌고 가는 청산 습관을 확인했습니다. 비용을 뺀 거래당 평균 순수익도 +0.77%로 양수였습니다. 문제는 그 표본이 어디서 왔느냐였습니다. 랭킹 화면에서 모은 체결은 그 사람이 랭킹에 든 달, 즉 성적이 좋았던 달의 기록이었습니다.

이런 표본에서 뽑은 규칙은 비싸게 터집니다. 이긴 달에만 보이는 습관을 「이기는 습관」으로 착각하면, 그 규칙을 그대로 자동매매에 옮겼을 때 진 달의 손실까지 함께 떠안습니다. 기대 수익을 부풀려 읽으면 거는 금액도 커집니다. 그래서 규칙을 실제 돈에 연결하기 전에, 같은 사람들이 랭킹에 못 든 달에는 어떻게 사고팔았는지를 먼저 봐야 했습니다.

처음 잰 숫자: 이긴 달만 담긴 왕복 960건

첫 번째 분석의 왕복 표본은 960건이었습니다. 측정 방법은 단순합니다. 같은 종목의 매수 체결과 매도 체결을 시간 순서대로 짝지어 한 번의 왕복 거래로 만들고, 거래마다 수익률·보유 시간·수수료와 세금을 뺀 순수익을 계산했습니다. 그 위에서 손익비(payoff ratio, 이긴 거래의 평균 이익을 진 거래의 평균 손실로 나눈 값)와 보유 시간 비율(이익 거래를 손실 거래보다 몇 배 오래 들고 갔는지)을 봤습니다.

이 960건에서 비용을 뺀 거래당 평균 순수익은 +0.77%였습니다. 숫자만 보면 「랭커의 청산 방식을 기계로 옮기면 비용을 내고도 남는다」는 결론으로 바로 갈 수 있었습니다. 실제로 그 결론으로 바로 가자는 선택지도 있었습니다. 생존자 편향을 무시하고 +0.77%를 그대로 믿는 안입니다.

그 안을 붙잡지 않은 이유는 표본의 출처 하나였습니다. 랭킹에 든 달의 기록만 있다는 말은, 이 숫자가 그 사람들이 가장 잘한 달의 평균이라는 뜻입니다. 지속 랭커라 하더라도 매달 랭킹에 드는 사람은 없습니다. 랭킹 밖으로 밀려난 달의 체결이 빠져 있는 한, +0.77%는 상한선에 가까운 값으로 읽어야 했습니다.

막대 그래프. 왕복 표본 첫 분석 960건, 보정 후 랭킹에 든 달 922건, 랭킹에 못 든 달 1,011건, 합계 1,933건
보정 전후 왕복 표본 — 진 달의 거래가 이긴 달보다 많았다

세운 가설: 청산 습관은 이긴 달에만 보이는 현상인가?

보정 전에 품은 의심은 두 가지였습니다. 첫째는 청산 습관 자체가 승리의 결과일 수 있다는 의심입니다. 시장이 잘 맞는 달에는 누구나 이익을 오래 끌고 가고 손실은 빨리 끊을 여유가 생깁니다. 그렇다면 「손절은 짧게, 익절은 길게」라는 모양은 실력이 아니라 운 좋은 달의 부산물이고, 진 달의 기록을 넣는 순간 그 모양이 무너져야 합니다.

둘째는 반대 방향의 의심입니다. 첫 분석에서 2024년 하반기 약세장 구간은 왕복 175건, 비용을 뺀 평균 순수익 -0.05%로 거의 본전이었습니다. 175건이라는 작은 표본에서 나온 -0.05%는 우연히 음수 쪽에 걸린 값일 수도 있었습니다. 표본을 늘리면 0 근처로 돌아오거나, 오히려 양수로 바뀔 수도 있다고 봤습니다.

어떤 숫자가 나오면 어느 쪽인지도 미리 정리해 둘 수 있었습니다. 진 달의 손익비가 1 아래로 떨어지고 보유 시간 비율이 뒤집혀 손실 거래를 더 오래 들고 갔다면, 첫 번째 의심이 맞는 셈입니다. 반대로 진 달에도 두 지표가 이긴 달과 같은 방향을 가리키면 습관은 진짜입니다. 약세장 쪽은 더 단순합니다. 표본을 늘린 뒤 평균 순수익이 0을 넘거나 0에 붙으면 착시, 더 내려가면 실재입니다.

두 가설은 결과에 정반대로 작용합니다. 첫 번째가 맞으면 청산 규칙을 기계로 옮기는 계획 자체가 무너지고, 두 번째가 맞으면 약세장을 따로 걱정할 이유가 사라집니다. 둘 다 같은 방법으로 확인할 수 있었습니다. 지속 랭커가 랭킹에 못 든 달의 체결을 모아 표본에 넣고, 이긴 달과 진 달을 나눠서 다시 재는 방법입니다.

보정 방법: 랭킹 밖 달의 체결 14,857행을 추가로 모았다

대상은 지속 랭커 26명이었습니다. 이 사람들이 랭킹에 들지 못한 달의 체결 기록을 따로 찾아 수집했고, 그렇게 모은 체결이 14,857행이었습니다. 전체 체결 35,367행의 42%에 해당합니다. 랭킹 화면만 보고 있었다면 이 사람들 기록의 4할 넘게를 보지 못한 채 결론을 냈다는 뜻입니다.

체결을 짝지은 결과 왕복 표본은 960건에서 1,933건으로 늘었습니다. 랭킹에 든 달 922건, 랭킹에 못 든 달 1,011건입니다. 진 달의 거래가 이긴 달의 거래보다 많았습니다. 첫 분석의 960건과 이번 랭킹에 든 달 922건은 정확히 같지 않은데, 원문 기록에는 그 차이의 사유가 남아 있지 않습니다. 이 글에서는 두 숫자를 각자 기록된 그대로 씁니다.

코드에서 바꾼 부분은 하나입니다. 왕복 거래를 복원하는 파이썬 모듈 hero_round_trip.py에 거래마다 「랭킹에 든 달(ranked)」인지 「못 든 달(loss)」인지를 붙이는 표시 축을 추가했습니다. 같은 복원 엔진을 그대로 쓰고 표시만 하나 늘렸기 때문에, 이긴 달과 진 달의 숫자는 같은 계산 방식에서 나옵니다. 이 변경에는 테스트 24건을 붙였고, 첫 분석 결과 문서는 덮어쓰지 않고 그대로 보존했습니다.

측정 방법을 바꾸지 않은 점이 중요합니다. 표본을 늘리면서 계산 방식까지 손대면, 숫자가 달라졌을 때 그게 표본 탓인지 계산 탓인지 가를 수 없습니다. 이번에는 같은 계산 위에 진 달의 거래만 더했기 때문에, 바뀐 숫자는 전부 생존자 편향을 걷어낸 효과로 읽을 수 있습니다.

가설이 틀린 지점: 습관은 버텼고, 약세장 손실은 더 커졌다

첫 번째 가설은 틀렸습니다. 손익비는 랭킹에 든 달 1.68, 못 든 달 1.51이었습니다. 진 달에도 이긴 거래의 평균 이익이 진 거래의 평균 손실보다 분명히 컸습니다. 보유 시간 비율도 랭킹에 든 달 2.6배, 못 든 달 2.1배로 양쪽 모두 이익 거래를 훨씬 오래 들고 갔습니다. 이익이 난 종목을 나눠 파는 분할 매도가 이긴 거래 쪽에 몰리는 모양도 양쪽에서 똑같이 나왔습니다.

표. 손익비 랭킹에 든 달 1.68, 못 든 달 1.51. 이익 거래 보유 시간 비율 랭킹에 든 달 2.6배, 못 든 달 2.1배
청산 습관 비교 — 진 달에도 모양은 그대로였다

숫자가 조금 약해지긴 했지만 모양은 그대로였습니다. 「손절은 짧게, 익절은 길게」는 운 좋은 달의 부산물이 아니라, 성적과 무관하게 그 사람들이 늘 하는 습관이었습니다. 습관이라면 규칙으로 적어 기계에 옮길 수 있습니다. 첫 번째 의심은 여기서 풀렸습니다.

두 번째 가설도 틀렸는데, 반대 방향으로 틀렸습니다. 2024년 하반기 약세장 구간의 왕복은 175건에서 359건으로 2배가 됐고, 비용을 뺀 평균 순수익은 -0.05%에서 -0.28%로 더 내려갔습니다. 거래 금액으로 가중한 평균은 -3.58%였습니다. 표본을 늘리자 0 근처로 돌아오기는커녕 음수가 더 선명해졌습니다.

약세장에서 진 달의 거래만 떼어 보면 손익비가 1.07까지 떨어졌습니다. 이긴 거래의 평균 이익이 진 거래의 평균 손실과 거의 같아졌다는 뜻입니다. 평균 손실은 -1.50%에서 -2.76%로 커졌습니다. 같은 사람, 같은 습관인데 약세장의 진 달에서는 손실을 끊는 칼이 무뎌졌습니다. 앞에서 습관의 「모양」은 버텼다고 했지만, 약세장에서는 그 습관이 내는 「값」이 무너졌습니다.

단순 평균과 거래 금액 가중 평균의 차이도 눈여겨볼 부분입니다. 거래 한 건을 똑같이 한 표로 세면 -0.28%인데, 거래 금액만큼 무게를 주면 -3.58%로 벌어집니다. 계산 방식만 놓고 읽으면, 약세장에서 큰돈을 실은 거래일수록 더 크게 잃었다는 뜻입니다(원문에 거래 규모별 분해는 없어 여기까지만 읽습니다). 자동매매로 옮길 때 이 차이는 그대로 계좌 손익이 됩니다. 기계는 거래 한 건이 아니라 투입한 금액 단위로 손익을 내기 때문입니다.

손익비 1.07이 왜 위험한지도 짚고 넘어가야 합니다. 손익비가 1에 가까우면 이긴 거래와 진 거래의 크기가 비슷하다는 뜻이고, 그때 수익 여부는 거의 전적으로 승률에 달립니다. 여기에 수수료와 세금이 매 거래마다 빠지면 승률이 절반을 넉넉히 넘지 않는 한 남는 게 없습니다. 이긴 달의 1.68은 승률이 조금 낮아도 버틸 여유가 있는 숫자였고, 약세장 진 달의 1.07은 그 여유가 사라진 숫자입니다.

표. 2024년 하반기 약세장 구간 왕복 175건에서 359건, 평균 순수익 -0.05%에서 -0.28%, 금액 가중 -3.58%, 진 달만 본 손익비 1.07, 평균 손실 -1.50%에서 -2.76%
약세장 구간 — 표본을 2배로 늘리자 음수가 더 뚜렷해졌다

진짜 원인은 무엇이었나: 표본이 고른 것은 사람이 아니라 달이었다

첫 분석의 약점은 랭커를 고른 데 있지 않았습니다. 랭커의 「달」을 골랐다는 데 있었습니다. 랭킹 화면은 그 달 성적이 좋은 사람만 보여 주기 때문에, 화면에서 모은 체결은 자동으로 이긴 달의 기록이 됩니다. 사람을 고정해도 달이 걸러지면 생존자 편향은 그대로 남습니다.

이 편향이 숫자에 남긴 흔적은 크기 쪽이었습니다. 청산의 모양은 바꾸지 못했지만 기대 수익의 크기는 부풀렸습니다. 비용을 뺀 평균 순수익은 전체 표본에서 +0.77%에서 +0.62%로 내려갔고, 지속 랭커만 보면 랭킹에 든 달 +0.79%가 진 달까지 넣자 +0.28%로 줄었습니다. 첫 분석의 숫자를 그대로 믿었다면, 진 달까지 넣은 값의 세 배에 가까운 기대 수익을 잡고 출발했을 겁니다.

막대 그래프. 비용 차감 평균 순수익 첫 분석 전체 +0.77%, 보정 후 전체 +0.62%, 지속 랭커 랭킹에 든 달 +0.79%, 지속 랭커 진 달 포함 +0.28%
비용을 뺀 거래당 평균 순수익 — 진 달을 넣자 3분의 1 남짓으로

두 번째 원인은 시장 국면이었습니다. 앞선 분석에서 이 랭커들의 진입 신호는 시장 국면이 바뀌어도 성질이 유지된다는 결과가 나와 있었습니다. 그런데 청산 쪽의 기대 수익은 국면에 따라 달랐습니다. 상승장과 횡보장에서는 같은 습관이 이익을 남기고, 약세장에서는 손실을 남깁니다. 진입이 국면을 타지 않는다고 해서 전략 전체가 국면을 타지 않는 건 아니었습니다.

조치: 진입·청산·시장 국면 필터, 3층으로 다시 설계했다

이번 결과로 거부한 안이 두 개입니다. 하나는 청산 규칙을 지금 모양 그대로 실거래에 넣는 안입니다. 약세장 진 달의 손익비가 1.07인 상태로 넣으면 그 구간에서 손실이 나는 것은 거의 확실했습니다. 다른 하나는 생존자 편향을 무시하고 +0.77%를 기대치로 잡는 안입니다. 진 달을 넣자 +0.28%로 3분의 1 남짓이 된 이상, 그 숫자로 판단할 수는 없었습니다.

남은 설계는 세 층입니다. 첫째 층은 진입으로, 시장 국면과 무관하게 유지되는 진입 신호를 씁니다. 둘째 층은 청산 규칙으로, 이긴 달과 진 달 양쪽에서 모양이 유지된 「손절은 짧게, 익절은 길게」와 분할 매도를 규칙으로 옮깁니다. 셋째 층은 시장 국면 필터로, 약세장으로 판정한 구간에서는 신규 진입을 막거나 규모를 줄입니다.

층의 순서에도 이유가 있습니다. 시장 국면 필터를 맨 앞에 두는 이유는, 약세장 손실이 청산 단계에서 생기더라도 그걸 막을 수 있는 지점은 진입 전뿐이기 때문입니다. 이미 산 종목은 청산 규칙대로 정리할 수밖에 없고, 약세장 진 달에는 그 규칙의 손익비가 1.07까지 내려가 있었습니다. 그래서 필터는 청산을 고치는 장치가 아니라 애초에 그 구간에 들어가지 않게 하는 장치로 설계했습니다.

도식. 진입 신호(국면 무관)에서 청산 규칙(모양 유지)으로, 그 앞에 약세장이면 진입 차단 또는 축소하는 시장 국면 필터
재설계한 3층 구조 — 셋째 층이 없으면 약세장 손실을 피할 수 없다

셋째 층이 이번 보정에서 새로 생긴 부분입니다. 첫 분석만 봤다면 진입과 청산 두 층으로 충분하다고 결론 냈을 겁니다. 약세장 -0.05%는 본전에 가까워 보였기 때문입니다. 진 달을 넣고 나서야 약세장이 본전이 아니라 거래 금액 가중 -3.58%의 손실 구간이라는 사실이 보였고, 그 구간을 피하는 장치 없이는 청산 규칙이 아무리 좋아도 손실을 막을 수 없다는 결론이 나왔습니다.

백테스트 수치가 좋을수록 표본 구성을 먼저 의심해야 한다는 교훈은, 같은 매매 시스템에서 샤프 지수 3.24 전략이 5년 검증에서 음수로 뒤집힌 사례와도 닮았습니다. 그 과정은 백테스트 과최적화 — 5년 검증 기록에 따로 정리했습니다.

재측정 결과: 1,933건에서 다시 잰 숫자

보정 후 다시 잰 숫자를 한곳에 모으면 이렇습니다. 왕복 표본은 960건에서 1,933건으로 늘었고, 그중 랭킹에 든 달이 922건, 못 든 달이 1,011건입니다. 늘어난 체결은 26명의 14,857행으로, 전체 35,367행의 42%입니다.

재측정 결과: 1,933건에서 다시 잰 숫자
항목첫 분석보정 후
왕복 표본960건1,933건 (이긴 달 922 · 진 달 1,011)
비용 차감 평균 순수익(전체)+0.77%+0.62%
지속 랭커 평균 순수익+0.79% (이긴 달)+0.28% (진 달 포함)
손익비1.68 (이긴 달)1.51 (진 달)
이익 거래 보유 시간 비율2.6배 (이긴 달)2.1배 (진 달)
2024년 하반기 약세장 왕복175건359건
약세장 평균 순수익-0.05%-0.28% (금액 가중 -3.58%)
약세장 평균 손실-1.50%-2.76% (진 달)

전체 표본의 평균 순수익은 +0.62%로 여전히 양수입니다. 청산 습관을 기계로 옮길 근거는 살아남았습니다. 다만 그 근거의 크기는 첫 분석이 말한 것보다 얇고, 약세장에서는 음수라는 조건이 붙었습니다. 「규칙은 성립하지만 시장 국면을 가리지 않으면 손실이 난다」가 재측정의 결론입니다.

한 번 재고 끝내지 않은 것이 결론을 바꿨습니다. 첫 측정만으로는 「청산 규칙 기계화 가능, 기대 수익 +0.77%」가 결론이었습니다. 두 번째 측정은 앞부분을 살리고 뒷부분을 지웠고, 그 자리에 시장 국면 필터라는 새 요구를 남겼습니다.

남는 한계: 26명이라는 상한과 이미 골라진 표본

생존자 편향은 이번 보정으로 다 걷히지 않았습니다. 진 달의 기록을 모을 수 있었던 사람은 26명이 상한이었고, 나머지 74명은 프로필 조회가 막혀 진 달 기록을 볼 수 없었습니다. 볼 수 있었던 사람만으로 보정했다는 점에서, 보정 자체에도 한 겹의 선택이 남아 있습니다.

더 근본적인 한계는 지속 랭커라는 집단 자체입니다. 여러 달 랭킹에 오른다는 조건이 이미 실력 있는 사람 쪽으로 표본을 골라 놓았습니다. 이 사람들이 진 달까지 넣어도 +0.28%라는 숫자는, 그 조건을 통과하지 못한 대다수 참가자에게는 더 낮을 가능성이 높습니다. 이번 분석은 그 대다수의 기록을 담고 있지 않습니다.

표본 크기 쪽의 한계도 있습니다. 약세장 구간은 359건으로 늘었지만, 그중 진 달만 떼어 낸 손익비 1.07은 더 작은 부분 집합에서 나온 값입니다. 방향은 첫 분석과 같은 쪽으로 더 선명해졌기 때문에 결론을 뒤집을 정도의 불확실성은 아니라고 판단했지만, 정확한 크기를 믿고 손실 한도를 정하기에는 아직 이릅니다. 약세장 필터의 문턱을 정할 때는 이 숫자를 상한이 아닌 대략의 방향으로만 씁니다.

세 층 설계도 아직 사양일 뿐입니다. 진입·청산·시장 국면 필터를 규칙으로 적어 과거 데이터 위에서 돌리는 기계적 백테스트가 다음 단계이고, 이 글을 쓰는 시점의 원문 기록에는 그 결과가 없습니다. 약세장 필터가 손실을 얼마나 줄이는지는 그 백테스트가 끝나야 숫자로 말할 수 있습니다.

내 데이터에서 같은 생존자 편향을 찾으려면 무엇을 보면 되나?

가장 먼저 볼 것은 표본이 어떤 화면이나 목록에서 왔는지입니다. 랭킹·인기 순위·후기 상위처럼 「성과가 좋은 것만 보여 주는 화면」에서 모은 데이터라면, 사람이나 상품을 고정해도 기간이나 사례가 걸러져 있을 수 있습니다. 이번 경우 체결의 42%가 그 화면 밖에 있었습니다.

두 번째는 보정할 때 계산 방식을 그대로 두는 일입니다. 같은 복원 엔진에 「이긴 달 / 진 달」 표시만 붙였기 때문에 숫자가 바뀐 이유를 하나로 좁힐 수 있었습니다. 세 번째는 모양과 크기를 나눠서 보는 일입니다. 이번에는 청산 습관의 모양은 버텼고 기대 수익의 크기는 3분의 1 남짓으로 줄었습니다. 둘 중 하나만 봤다면 「습관이 가짜였다」거나 「수익이 그대로다」 둘 중 하나로 틀렸을 겁니다.

이 점검은 주식 매매에만 해당하지 않습니다. 잘 팔린 광고 문구만 모아 「잘 팔리는 문구의 공통점」을 뽑거나, 성과가 좋았던 영업 담당자의 좋은 분기 기록만 보고 영업 절차를 만드는 일도 같은 구조입니다. 규칙을 만들기 전에, 같은 사람이나 같은 문구가 실패했던 기간의 기록을 같은 방식으로 모아 나란히 놓아 보는 것만으로 모양과 크기를 가를 수 있습니다.

성과 데이터에서 규칙을 뽑아 자동화하려는데 표본이 어디서 왔는지 확신이 서지 않는다면, 데이터 출처와 보정 방법부터 함께 점검해 볼 수 있습니다. 상담에서 지금 가진 데이터의 구성을 알려 주시면 됩니다.

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

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

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

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