백테스팅과 페이퍼 트레이딩: 실전 자금 투입 전 필수 관문

English version

TECH INSIGHT / EXPLAINED

백테스트는 과거에 알 수 있었던 정보로 지정한 모형을 시험합니다. 페이퍼 트레이딩은 실시간 데이터와 모의 주문으로 동작을 점검합니다. 둘 다 실패를 찾는 도구이며 미래 수익이나 실제 거래소 체결을 인증하지 않습니다.

동료 세 명이 백테스트와 모의 주문 검증 주제를 그림으로 설명하는 모습
이해를 돕기 위한 AI 생성 설명 일러스트. 실제 운영 화면이나 실적 자료가 아닙니다.

정보가 사용 가능해진 시각을 정한다

완성된 1분 봉으로 만든 신호가 그 봉 완성 이전 가격에 체결됐다고 가정하면 안 됩니다. 이벤트에 available_at을 두고 판단 시점까지 공개된 정보만 사용하세요. 내일 데이터를 바꾸어도 오늘 신호가 변하지 않는지 시험하면 경계를 확인할 수 있습니다. 과거 호가 데이터로 지연·부분체결을 모형화할 수 있으나 데이터와 체결 가정의 한계 안에서만 가능합니다.

손대지 않은 평가 구간을 남긴다

학습 구간에서 파라미터를 정하고 이후 평가 전에 고정합니다. 평가 결과를 계속 보며 튜닝하면 그 구간도 사실상 학습 데이터가 됩니다. 워크포워드에서는 전처리와 전략 상태도 학습 창 안에서만 다시 만드세요. 99번 작게 이기고 한 번 크게 잃을 수도 있어 승률만으로 판단할 수 없습니다. 비용 후 손익·낙폭·노출·회전율과 시험한 대안 수를 함께 기록합니다.

비용 장부는 한 번만 차감한다

가상으로 100개를 기준가 100에 사서 101에 팔면 총이익은 100입니다. 실제 체결이 100.10과 100.85라면 비용 전 이익은 75입니다. 양쪽 체결대금에 0.1%씩 적용한 수수료는 20.095, 세금·금융비용 전 순이익은 54.905입니다. 실제 체결가를 사용했다면 같은 슬리피지를 또 빼지 않습니다. 수수료 등은 가정이므로 실제 상품 조건으로 바꾸어야 합니다.

페이퍼에는 로그뿐 아니라 모의 상태가 필요하다

dry-run 로그는 신호 시각을 보지만 주문 수명주기를 시험하지 못합니다. 접수·거절·부분체결·취소·불명 상태와 모의 현금·재고 장부를 만드세요. 조회 전용 자격증명이나 실주문 기능이 없는 실행기를 사용합니다. 연결 끊김, 미체결 모의 주문을 둔 재시작, 접수 응답 유실을 주입해 보세요. 통과 기준은 연결이 영원히 안 끊기는 것이 아니라 중복 행동 없음·상태 대사·오래된 데이터 처리입니다.

종목 목록과 기업행동도 당시 상태로 재현하기

오늘 남아 있는 종목만 과거에 넣으면 상장폐지되거나 거래가 중단된 후보가 빠집니다. 실험 날짜별로 편입 가능한 종목 목록을 보관하고, 나중에 변경된 티커와 과거 자산 식별자를 연결해야 합니다. 가격 파일만 과거 것이라고 당시 투자 가능한 대상을 복원한 것은 아닙니다. 데이터가 없는 종목을 조용히 지우지 말고 제외 사유와 날짜를 남깁니다.

주식분할은 장부의 기본 시험이 됩니다. 가상의 2대1 분할에서 100원짜리 10주는 50원짜리 20주가 되어 가치 1,000원이 유지됩니다. 가격만 반으로 만들고 수량을 그대로 두면 가짜 손실을 만듭니다. 배당도 수정주가에 반영한 상태에서 현금에 다시 더하지 않아야 합니다. LEAN의 기업행동 문서처럼 정규화 방식과 분할·배당 이벤트 처리의 관계를 확인하고, 지표·잔고·미체결 주문에 같은 기준을 적용합니다.

하나의 봉으로 주문 도달 순서를 알 수는 없다

가상 봉의 시가·고가·저가·종가가 각각 100·110·90·102이고, 시가에 매수한 뒤 익절 105와 손절 95를 둔다고 합시다. 가격이 연속적으로 이동하고 해당 값에 정확히 체결된다는 단순 가정에서도 100→110→90→102이면 먼저 +5, 100→90→110→102이면 먼저 −5입니다. 두 경로의 OHLC는 완전히 같습니다.

봉 데이터만 있으면서 유리한 순서를 선택하면 체결 모형이 보이지 않는 정보를 발명합니다. 더 세밀한 자료가 없으면 미리 정한 보수적 순서나 가능한 결과 범위를 보고하고 모호한 사례 수를 따로 기록합니다. 실제 갭이나 손절 주문의 가격 미보장은 이 장난감 예제보다 추가 불확실성입니다. 시가 진입 신호 자체는 그 전에 확정된 정보로 만들었다고 가정해야 합니다.

재현 파일에 데이터와 실행 조건을 묶기

각 실행에 데이터 파일 해시, 코드 버전, 파라미터, 거래 달력·시간대, 워밍업 기간, 가격 정규화, 수수료·체결 모형, 난수 시드를 남깁니다. 같은 설정에서 결과가 달라지면 먼저 입력 파일과 이벤트 정렬이 같은지 확인합니다. 종가 없는 휴장일을 전일 가격으로 채웠다면 표시용 보간인지 실제 거래 가능 가격인지도 구분해야 합니다.

최종 손익만 비교하지 말고 첫 신호, 첫 주문, 첫 체결, 첫 장부 차이가 발생한 이벤트를 찾습니다. 이 방식은 긴 자산 곡선 두 개를 눈으로 맞추는 것보다 원인을 좁힙니다. 데이터 수정본을 쓸 때는 이전 결과를 덮어쓰지 않고 새 실행 ID로 보존합니다.

전략 성과보다 먼저 통과해야 하는 작은 시험

거래가 없고 가격도 변하지 않는 입력에서는 비용과 외부 현금흐름이 없다면 자산 가치가 유지되어야 합니다. 분할만 넣어도 같은 결과여야 하며, 동일 체결을 중복 전달해도 현금이 다시 움직이면 안 됩니다. 봉의 고가와 저가 순서가 불명확한데 확정 수익을 내는지도 검사합니다. 위 분할 계산과 두 경로의 상반된 결과는 Python Decimal로 로컬 실행했습니다. 실제 과거 수익률이나 미래의 성공 확률을 산출한 실험은 아닙니다.

공식 문서와 이어 읽기

내용·예제 검토: 2026-10-01

댓글