룩어헤드 편향(look-ahead bias, 미래 정보 참조 편향)은 역사적 테스트가 시뮬레이션된 의사결정이나 주문이 있었을 시점에 이용할 수 없었던 정보를 사용할 때 발생합니다. 규칙은 단순할 수 있고 코드는 오류 없이 실행될 수 있지만, 그 결과가 여전히 미래 정보에 의존할 수 있습니다. 유용한 감사는 모든 입력에 대해 다음을 확인합니다. 이 값이 처음 알려진 시점, 규칙이 이를 평가한 시점, 시뮬레이션된 행동에 사용된 이후 가격.
캔들의 종가는 완료된 뒤에야 알 수 있습니다
각 OHLC 봉은 하나의 구간을 요약합니다. 최종 고가, 저가, 종가, 거래량은 봉의 시가 시점에는 완성되지 않습니다. 돌파 규칙이 1시간 캔들의 완료된 종가에 의존한다면, 테스트는 같은 캔들의 더 이른 시가에 진입해서는 안 됩니다. 인과적 예시는 봉이 완료되었을 때 종가를 평가하고, 이후에 이용 가능한 가격—예를 들어 다음 봉의 시가—에서 의사결정이나 진입을 모델링하며, 그러한 관행은 모델로 명확히 표시됩니다. 코드별 타이밍에 대해서는 TradingView의 Pine Script 봉 상태 및 시간 문서가 확정된 봉과 실시간으로 형성 중인 봉을 구분합니다. 그 언어적 세부 사항이 거래소 주문이 다음 시가에 체결된다는 것을 증명하지는 않습니다.
다음 봉 시가가 반드시 체결된다고 가정해서도 안 됩니다. 갭이 해당 레벨을 넘을 수 있고, 스프레드가 상당할 수 있으며, 주문이 거부되거나 부분 체결될 수 있고, 실제 호가창은 알 수 없을 수 있습니다. 정보 타이밍을 바로잡는 것은 하나의 편향을 제거할 뿐, 현실적인 체결 근거를 만들어내지는 않습니다.
예시: 상위 타임프레임 값은 더 늦게 도착합니다
1시간 연구가 4시간 종가를 사용하고 “4시간 종가가 $100을 넘으면 행동한다”는 규칙을 테스트한다고 가정해 보겠습니다. 4시간 봉은 08:00 UTC에 시작합니다. 마지막으로 확정된 4시간 종가는 $98이고, 현재 봉은 결국 12:00에 $104로 마감합니다. 최종 $104는 09:00에는 알 수 없었지만, 오프셋 없이 barmerge.lookahead_on을 사용하는 역사적 request.security() 호출은 그 최종 값을 4시간 창 안의 첫 시간봉들에 배치할 수 있습니다. 따라서 백테스트는 정오 이전에 조건이 충족된 것으로 표시할 수 있습니다. 실시간 데이터에서 현재 4시간 종가는 아직 형성 중이며, 확정되기 전에 $100 위아래로 움직일 수 있습니다. TradingView는 이러한 역사적 미래 누출과 lookahead_on과 함께 1봉 오프셋을 사용하는 확정값 패턴을 모두 문서화합니다. 그 패턴은 의도적으로 이전에 완료된 4시간 값을 사용하며, 현재 봉의 최종 종가를 미리 이용 가능하게 만들지는 않습니다.
이 예시에서 $98은 08:00–12:00 구간 내내 확정된 입력으로 남습니다. 규칙이 대신 완료된 $104 종가를 기다린다면, 의사결정 시각을 12:00 또는 그 이후로 기록하고 주문을 다음 적격 가격에서 모델링하십시오. TradingView의 브로커 에뮬레이터는 기본적으로 다음 틱 관행을 포함한 자체 역사적 체결 가정을 사용합니다. 그 관행도, 깔끔한 차트도 실제 거래소 체결을 보장하지 않습니다. 위의 날짜와 가격은 가상이며 정보 타이밍을 보여줄 뿐입니다.
모든 입력을 시간 순으로 추적하십시오
규칙의 필드—지표 값, 롤링 최댓값 또는 최솟값, 펀딩비 관측, 시장 국면 레이블, 거래량 및 모든 외부 이벤트—로 표를 만드십시오. 각각에 대해 타임스탬프, 확정 시각, 출처를 기록하십시오. 롤링 창이 이전 봉을 설명하기 위한 것일 때 실수로 현재 봉을 포함하고 있지는 않은지 확인하십시오. 수정되거나 정정된 데이터셋이 역사적으로 알려졌을 값을 대체하지 않았는지 확인하십시오.
게시 시각과 이벤트 시각을 서로 다른 필드로 간주하십시오. 펀딩비는 구간 레이블이 있더라도 더 늦은 시점에 게시되거나 정산될 수 있습니다. 경제 또는 거래소 공지가 수정될 수 있습니다. 캔들 종가는 선언된 구간 경계를 가집니다. 이벤트 타임스탬프와 값이 규칙에 이용 가능하게 된 시각을 모두 기록하십시오. 피벗, 스윙 고점과 저점, 또는 확인을 위해 이후 봉이 필요한 레이블의 경우 확인 지연을 명시적으로 저장하십시오. 전략이 그 시점에 이미 수신된 데이터만 사용하여 행동할 수 있었던 경우가 아니라면 확정된 레이블을 전환점으로 소급하지 마십시오.
결과를 알고 나서 만들어진 레이블을 경계하십시오. 캔들을 “국지적 바닥”으로 표시하려면 규칙이 확인 전에 명시적 지연을 제공하지 않는 한 이후 관측이 필요합니다. 최종 기사로부터 구축된 뉴스 분류는 이벤트 이후에 게시된 표현을 포함할 수 있습니다. 현재 구성 종목 목록은 나중에 사라진 자산을 누락할 수 있습니다. 서술적으로 들리는 필터조차 그 계산이 테스트 경계를 넘어서면 미래 정보를 누출할 수 있습니다.
시뮬레이션의 봉 처리 방식 점검
각 관측에 대한 순서를 작성하십시오. 지표 계산, 신호 판단, 관련 현금 흐름 정산, 보유 포지션 평가, 주문 제출 또는 모델링, 보호 레벨 처리, 자산 가치 평가(마킹) 및 원장 저장 순으로 정리하십시오. 순서가 중요합니다. 포지션이 시가 정산 이후에 진입한다면, 그 이전에 열려 있었던 것처럼 비용이 부과되어서는 안 됩니다. 하나의 캔들 안에서 손절과 목표가 모두 발생한다면, OHLC 봉만으로는 어느 것이 먼저였는지 밝혀지지 않을 수 있습니다. 모델에는 보수적이거나 명시적으로 불확실한 관행이 필요합니다.
SuperQuant는 하나의 구체적인 순서를 문서화합니다. 의도는 이전 종료 봉을 사용하고, 기존 포지션은 새 봉의 시가에 적격 펀딩 정산을 받으며, 그런 다음 적격 포지션 종료 및 진입이 평가되고, 봉 내 보호 목적의 포지션 종료는 정의된 불확실성 처리를 따릅니다. 이는 해당 엔진 내에서 룩어헤드 편향을 제한하지만, 단순화된 시간 단위 모델로 남습니다. 번들로 제공되는 히스토리는 합성 데이터입니다. 제품이 변경되면 현재 구현과 방법론을 검토하십시오.
간단한 수동 점검
기록된 거래 하나를 가져와 요약 차트를 사용하지 않고 재구성하십시오. 신호 봉과 그 종가 시점에 알려진 정확한 데이터를 식별하십시오. 이전 기록으로 지표를 다시 계산하십시오. 모델링된 진입 타임스탬프를 찾아 그것이 더 늦은지 확인하십시오. 그런 다음 각 포지션 종료, 수수료, 정산을 그때 알 수 있었던 이벤트로 추적하십시오. 수동 계산을 원장과 비교하십시오. 성과를 해석하기 전에 불일치를 조사하십시오.
이 타이밍 검토 후에는 과최적화 가이드에서 파라미터 선택을 별도로 평가하십시오. 백테스트 튜토리얼과 점검 체크리스트는 가정을 유지하는 데 도움이 됩니다. 타이밍 감사는 수익성 있는 또는 실행 가능한 전략을 증명할 수 없습니다. 다만 테스트가 이용할 수 없는 정보를 알면서 사용하지 않았음을 보여줄 수 있습니다. 이는 일반적인 리서치 교육이며, 투자 조언이 아닙니다.