OptiNod 아카데미

백테스트와 실전 — 수익 곡선이 갈라진 첫 거래를 찾는 법

같은 코드·시장·체결 설정부터 맞춘 뒤, 신호·주문·체결·비용 기록을 대조합니다. 곡선 차이의 원인을 단정하지 않고 검증하는 순서를 알아봅니다.

수익 곡선이 갈라졌다면, 먼저 같은 조건을 비교하고 있는지 확인합니다. 그다음 처음 달라진 신호와 체결을 찾습니다.


백테스트는 정해진 데이터와 실행 규칙으로 거래를 재구성한 결과입니다. 같은 소스와 입력값을 썼더라도 데이터 범위, 거래 시장, 주문 설정이 다르면 다른 거래가 나올 수 있습니다. 실전 곡선과 차이가 난다는 사실만으로 전략의 우위가 없거나 체결 시스템이 고장 났다고 판단할 수는 없습니다.


가장 먼저 비교할 것은 수익률이 아니라 조건입니다. 소스 파일과 버전, 입력값, 거래소가 포함된 종목, 현물·무기한 선물 등 계약 종류, 일반 캔들, 시간봉, 세션과 날짜 범위, 초기 자본과 주문 수량, 수수료·슬리피지 설정을 고정합니다. 차트 표시 시간대와 거래소 세션을 구분하고, 데이터 시작점과 준비 구간도 기록합니다.


이 기준이 맞으면 신호 발생, 주문 생성, 거래소 접수, 실제 체결, 비용 반영을 시간순으로 대조할 수 있습니다. 봉 종가에 반드시 체결된다는 가정을 모든 백테스트에 적용하면 오히려 원인을 놓칩니다. 체결 시점부터 데이터 편향까지, 서로 다른 다섯 지점을 나누어 확인해야 합니다.


백테스트 곡선과 실전 곡선의 차이를 거래별로 살펴보는 개념도
백테스트 곡선과 실전 곡선의 차이를 거래별로 살펴보는 개념도

같은 신호라도 주문 생성과 체결 시점은 다릅니다


TradingView 전략의 기본 계산은 봉 마감에 이루어지며, 새 시장가 주문을 그 순간 즉시 체결하는 것이 기본 동작은 아닙니다. 브로커 에뮬레이터는 원칙적으로 다음 이용 가능한 틱에서 체결하며, 과거 봉에서는 보통 다음 봉 시가에 해당합니다. process_orders_on_close 같은 옵션은 이 동작을 바꿉니다. 종가 체결 옵션 자체를 곧바로 미래 누수라고 부를 수는 없지만, 알림 전달과 실제 주문이 그 가격에 체결될 수 있는지는 별도 문제입니다. TradingView 전략 문서


따라서 진입가가 다르면 먼저 신호의 봉과 주문 생성 시각을 맞춥니다. 그다음 백테스트 체결 규칙, 주문 유형, 알림 수신 시각, 거래소 접수 시각과 평균 체결가를 확인합니다. 갭, 거래 중단, 주문 거절, 수량 반올림, 다른 계약 선택도 차이를 만들 수 있습니다. 가격 차이 하나만으로 지연이나 슬리피지를 확정하지 않습니다.


비교용 검증 설정 — 같은 일반 캔들 15분봉에서 종가 확정 신호만 비교하고, 시장가 주문은 기본 에뮬레이터 체결 방식으로 기록합니다. 진입은 그 신호 뒤 처음 가능한 체결, 손절은 미리 정한 신호 봉 저가 아래 가격으로 고정합니다. 실제 거래 권유가 아닌 기록 비교용 조건이며, 신호 시각·수량·손절 규칙 중 하나라도 다르면 그 거래를 체결 품질 비교에서 제외합니다.


신호 확인과 주문 체결 사이의 시간 차이를 살펴보는 개념도
신호 확인과 주문 체결 사이의 시간 차이를 살펴보는 개념도

슬리피지는 기준 가격과 주문 크기를 함께 기록해야 해석됩니다


슬리피지는 선택한 기준 가격과 실제 평균 체결가의 차이입니다. 신호 가격, 주문 직전 중간 호가, 최우선 매수·매도 호가 중 무엇을 기준으로 삼았는지에 따라 숫자가 달라집니다. 시장가 매수 주문이 여러 매도 호가를 소진하면 평균 체결가는 처음 보인 최우선 매도 호가보다 불리해질 수 있습니다. 반대로 주문 도착 전 가격이 유리하게 움직이는 경우도 있으므로 모든 거래의 차이가 손실이라고 가정하지 않습니다.


고정된 몇 bp를 모든 시장의 정답으로 넣지 않습니다. 거래소·계약·시간대·주문 금액별 실제 표본을 모으고, 평상시와 유동성이 줄어든 구간을 나누어 봅니다. 호가 기록이 없다면 시장 충격과 통신 지연의 기여를 분리하기 어렵다는 한계도 남깁니다. 지정가는 가격을 제한하지만 미체결과 부분 체결 가능성을 함께 고려해야 합니다.


검증에서는 관측한 비용을 기준 시나리오로, 더 불리한 비용을 스트레스 시나리오로 둡니다. 비용을 늘렸을 때 남는 거래가 달라지는지도 확인합니다. 고정 슬리피지 옵션은 민감도 점검 도구이며 실제 호가창의 재현은 아닙니다.


수수료는 거래대금, 펀딩은 보유 조건에 맞춰 계산합니다


수수료는 거래소의 해당 상품·계정 등급·메이커와 테이커 조건을 확인해 각 체결 거래대금에 적용합니다. 진입과 청산의 거래대금이 다르거나 부분 체결이 있으면 한 번의 단순 왕복 비율과 차이가 납니다. 수수료 자산의 환산 시점도 실제 명세와 맞춥니다.


예를 들어 설명용 가정으로 매수와 매도 거래대금이 각각 1,000달러이고 각 체결 수수료가 0.05%라면 왕복 비용은 1달러입니다. 같은 거래를 100번 하면 100달러입니다. 이것이 계좌의 몇 %인지는 자본과 수량에 따라 달라집니다. 거래 횟수에 왕복 수수료율을 곱한 값을 그대로 계좌 수익률에서 빼면 안 됩니다.


무기한 선물 펀딩은 상품별 정산 주기, 당시 펀딩률, 포지션 방향과 정산 대상 수량에 따라 지급하거나 받을 수 있습니다. 모든 상품이 8시간마다 같은 비율로 차감되는 것은 아닙니다. 해당 거래소의 정산 기록과 최신 상품 규정을 사용하고, 펀딩을 수수료와 별도 항목으로 대조합니다. 적용 조건은 거래 비용 안내에서도 함께 점검합니다.


거래대금과 횟수에 따라 누적되는 수수료를 살펴보는 개념도
거래대금과 횟수에 따라 누적되는 수수료를 살펴보는 개념도

한 봉 안의 손절과 익절은 네 가격만으로 순서를 알 수 없습니다


일반 OHLC 봉은 시가·고가·저가·종가를 보여주지만 그 안의 모든 가격 순서를 보관하지는 않습니다. 같은 봉에서 손절가와 익절가를 모두 지났다면 어느 주문이 먼저 체결될 수 있었는지가 결과를 바꿉니다. 실제로는 주문이 활성화된 시점과 부분 체결도 확인해야 합니다.


가상 예시로 진입가가 100, 손절가가 98, 익절가가 103인 롱 포지션을 생각해 봅니다. 해당 봉의 고가가 104, 저가가 97이라는 정보만으로 어느 청산이 먼저 일어났는지 알 수 없습니다. TradingView의 기본 브로커 에뮬레이터는 정해진 봉 내부 경로 가정을 사용하므로, 언제나 손절부터 처리한다고 설명하면 틀립니다. Bar Magnifier는 이용 가능한 하위 시간대 데이터로 경로 추정을 개선합니다. 에뮬레이터와 Bar Magnifier


하위 시간대 데이터도 호가 대기열이나 모든 틱, 실제 계정의 체결을 증명하지는 못합니다. 충돌한 거래를 표시하고 더 세밀한 데이터와 주문 기록을 확인하세요. 데이터가 없는 구간은 추정으로 남겨 두어야 합니다. Heikin Ashi나 Renko 같은 비표준 차트는 합성 가격을 포함할 수 있으므로, 우선 일반 캔들로 비교 기준을 맞춥니다. 비표준 차트 데이터


같은 봉에서 손절과 익절이 모두 닿을 때 순서 확인이 필요한 개념도
같은 봉에서 손절과 익절이 모두 닿을 때 순서 확인이 필요한 개념도

종목 선정과 정보의 이용 가능 시점도 검증 대상입니다


현재 살아남은 종목만으로 과거의 투자 대상을 구성하면 당시 실제 선택할 수 있었던 모집단과 달라집니다. 상장 폐지, 거래 정지, 신규 상장과 과거 유동성 기준을 반영했는지 확인합니다. 생존 편향이 있다고 모든 전략이 수익을 내는 것은 아니지만, 손실 종목을 빠뜨린 결과를 전체 시장에 일반화할 수는 없습니다.


미래 누수는 판단 당시 알 수 없던 정보를 과거 의사결정에 넣는 문제입니다. 진행 중인 봉의 현재 가격을 쓰는 것 자체가 미래를 보는 것은 아닙니다. 문제는 나중에 확정된 값을 더 이른 시점에 이미 알고 있었다고 처리하거나, 전체 검증 기간으로 만든 통계를 과거 학습 과정에 쓰는 경우입니다. 상위 시간대 확정값과 피벗의 확인 시점은 룩어헤드·리페인팅 안내에서 따로 확인합니다.


데이터 공급자의 가격 수정이나 계산 시작점 변화도 재실행 결과를 바꿀 수 있습니다. 소스와 입력값뿐 아니라 원본 데이터 범위와 추출 시각을 함께 남겨야 같은 조건으로 되돌아갈 수 있습니다. TradingView 데이터 변화 설명


당시 선택 가능한 종목과 현재 남아 있는 종목을 구분하는 개념도
당시 선택 가능한 종목과 현재 남아 있는 종목을 구분하는 개념도

증상 하나에 원인 하나를 붙이지 않습니다


아래 표는 원인을 확정하는 표가 아니라 다음 확인 대상을 고르는 순서입니다. 첫 차이가 나온 거래부터 조사하면 이후 잔액과 수량이 달라져 생긴 파생 차이를 줄일 수 있습니다.


관찰한 증상가능한 원인확인할 시험·증거판단의 한계
신호의 봉·방향이 다름코드·입력·시장·데이터 차이, 미확정 HTF, 실시간 계산버전과 설정을 고정하고 당시 신호 기록을 재실행 결과와 대조재실행 CSV만으로 당시 실시간 신호를 복원할 수 없음
신호는 같고 진입가가 다름체결 옵션, 지연, 호가·주문 크기, 주문 유형주문 생성·수신·접수·체결 시각과 당시 호가 비교호가와 시계 동기화가 없으면 원인별 기여 분리 어려움
실전에만 거래가 누락됨알림 누락, 거절, 최소 수량, 미체결, 포지션 제한알림 ID와 주문 ID, 거절 코드, 수량·잔액 기록 연결알림 발송이나 API 접수 성공만으로 체결을 증명하지 못함
같은 봉의 청산 결과가 반대임봉 내부 경로, 주문 활성 시각, 갭, 부분 체결하위 시간대 경로와 실제 체결 내역 대조더 짧은 봉도 틱 경로·호가 대기열의 완전한 증거가 아님
매매는 비슷한데 순손익이 다름수수료·펀딩·환산·수량·손익 기준 차이체결별 원금과 비용을 같은 통화로 재계산거래 빈도 하나로 계좌 비용 비율을 정할 수 없음
새로고침 후 과거 신호가 달라짐미확정값, 과거 위치 표시, 데이터 수정, 이력 범위 변경전후 화면·데이터·코드와 최초 인지 시각 대조변화만으로 고의나 미래 누수를 단정할 수 없음
최적화 구간만 좋고 이후 구간이 나쁨반복 선택, 기간 특수성, 데이터 누출시도한 설정·선택 기준을 저장하고 별도 기간에서 같은 절차를 평가결과 하락만으로 과최적화나 리페인팅을 확정할 수 없음


원인을 하나 고르면 그 항목만 바꾸고 같은 첫 거래를 다시 비교합니다. 자료가 없으면 미상으로 남기고 다음 관찰에서 필요한 기록을 수집합니다. 반복 선택의 검증은 워크포워드 분석으로 이어집니다. 기간을 바꿔 성과가 나빠졌다는 사실만으로 원인을 확정하지 않습니다.


기록을 남겨야 백테스트 차이를 다음 검증에 쓸 수 있습니다


실전 또는 모의 실행을 시작하기 전에 비교 조건과 확인 기간을 정합니다. 기간은 거래 수와 전략 주기에 맞춰 정하고, 결과가 좋아 보인다는 이유로 중간에 기준을 바꾸지 않습니다. 신호 ID, 봉의 시작·마감 시각, 신호 확인 시각, 알림과 주문 ID, 요청 수량, 체결가와 비용을 저장하면 같은 거래를 끝까지 연결할 수 있습니다.


  • 코드 버전·입력값·거래소·계약·일반 캔들·시간봉·세션·날짜 범위를 맞췄습니다.
  • 계산 시점, 주문 생성 및 체결 옵션, 자본과 수량 규칙을 기록했습니다.
  • 수수료와 펀딩은 실제 적용 조건으로, 슬리피지는 근거가 있는 범위로 비교했습니다.
  • 손절·익절 충돌과 데이터 공백, 당시 모집단의 한계를 표시했습니다.
  • 첫 불일치 거래의 신호·주문·체결·비용을 같은 시간 기준으로 연결했습니다.

Strategy Tester의 CSV는 해당 시뮬레이션의 거래 기록입니다. Bar Replay도 과거 데이터를 살펴보는 도구입니다. 어느 쪽도 과거에 실시간 신호가 실제로 존재했다는 증거를 혼자 제공하지는 않습니다. 재실행 결과와 별도로 당시의 관찰 기록이 필요합니다. 설명되지 않은 차이가 남아 있다면, 수익 곡선에 확신을 더하기 전에 그 거래의 증거부터 보완하세요.


전략을 차트에 적용하고 비용·기간을 맞추는 과정은 트레이딩뷰 백테스트 기초 가이드에서 실제 실행 예제로 따라갈 수 있습니다.

내 백테스트 결과 점검하기

최적화 결과 CSV나 TradingView 전략 거래 목록을 올리면 성과 지표와 강건성 점검 결과를 함께 보여 줍니다. 로그인하지 않아도 분석할 수 있습니다.

내 결과 파일 분석하기 분석 예시 먼저 보기