백테스팅 데이터 파이프라인 구축하기

🌐 English

백테스트의 신뢰도는 전략이 아니라 데이터 파이프라인에서 절반이 결정됩니다. 쓰레기 데이터를 넣으면 아무리 좋은 전략도 쓰레기 결과를 냅니다. 시세 데이터를 백테스트용으로 가공하며 정리한 실전 노트입니다.

⚠️ 이 글은 교육·정보 제공 목적입니다. 투자 권유가 아니며, 투자 손실 책임은 본인에게 있습니다.

1. 수집 — 캔들(OHLCV)을 모은다

백테스트의 기본 단위는 캔들입니다. 증권사 API는 보통 기간·주기별로 캔들을 내줍니다.

  • 일봉/주봉/월봉 — 기간 조회(예: inquire-daily-itemchartprice)
  • 분봉 — 당일 위주, 한 번에 소량씩 역순 조회

주의할 점은 한 번에 가져오는 개수 제한입니다. 분봉은 30건씩만 주는 식이라, 긴 구간이 필요하면 기준시각을 옮겨가며 여러 번 호출해 이어붙여야 합니다.

# 개념: 기준시각을 뒤로 옮기며 페이지네이션

all_candles = []

cursor = end_time

while len(all_candles) < needed:

    batch = fetch_candles(symbol, base_time=cursor, count=30)

    if not batch:

        break

    all_candles.extend(batch)

    cursor = batch[-1].time  # 가장 오래된 캔들 시각으로 이동

2. 정제 — 믿을 수 있는 데이터로

원본 데이터는 지저분합니다. 백테스트에 넣기 전에 반드시 정제합니다.

  • 시간순 정렬 — API가 역순으로 주는 경우가 많으니 오름차순으로 뒤집습니다.
  • 중복 제거 — 페이지 경계에서 같은 캔들이 겹칠 수 있습니다. 타임스탬프 기준으로 유일화.
  • 결측·이상치 처리 — 거래 정지일의 빈 캔들, 0 또는 음수 가격은 걸러냅니다.
  • 타입 변환 — 문자열로 오는 숫자를 float로. 파싱 실패는 None으로 안전 처리.
def to_float(v):

    try:

        return float(v)

    except (TypeError, ValueError):

        return None  # 파싱 실패를 조용히 삼키지 말고 명시적으로 표시

3. 저장 — 재현 가능하게

정제한 데이터는 파일(CSV/Parquet 등)로 저장해 한 번 받은 데이터를 재사용합니다. 매번 API를 다시 때리면 느리고, 무엇보다 결과가 달라질 수 있습니다. 저장할 때 심볼·주기·기간을 파일명이나 메타데이터에 남겨, 어떤 데이터로 돌린 백테스트인지 항상 추적할 수 있게 합니다.

지표(이동평균, RSI, 볼린저 등)는 캔들과 함께 미리 계산해 저장해 두면 백테스트 반복이 빨라집니다.

4. 가장 위험한 함정: 미래참조(look-ahead)

백테스트를 통째로 거짓말로 만드는 버그입니다. 계산 시점에 아직 알 수 없는 값을 슬쩍 참조하는 것이죠. 예를 들어 "오늘 시가로 판단"해야 하는데 실수로 "오늘 종가"를 참조하면, 미래를 아는 봇이 되어 성과가 마법처럼 좋아집니다. 실전엔 존재하지 않는 정보라 그대로 무너지고요.

구조적으로 막는 방법은 하나입니다 — 그 시점의 봇이 실제로 알 수 있는 데이터만 넘긴다.

# 나쁜 예: 전체 배열을 통째로 넘겨 미래를 훔쳐볼 여지를 준다

signal = strategy(all_candles, i)   # all_candles[i+1] 참조 위험

# 좋은 예: 현재 시점까지로 잘라서 넘긴다

window = all_candles[: i + 1]       # i 시점엔 여기까지만 알 수 있다

signal = strategy(window)

지표 계산도 마찬가지입니다. i 시점의 이동평균은 i까지의 데이터로만 계산해야 합니다. "전체 데이터로 지표를 한 번에 계산한 뒤 슬라이싱"하는 코드는 경계에서 미래참조가 새기 쉬우니 특히 조심하세요.

정리

  • 캔들을 페이지네이션으로 수집하고 개수 제한을 우회
  • 정렬·중복제거·이상치 처리·타입변환으로 정제
  • 파일로 저장해 재현 가능하게, 지표는 미리 계산
  • 미래참조는 데이터를 시점까지 잘라 넘겨 구조적으로 차단

백테스트가 "너무 좋으면" 전략을 의심하기 전에 파이프라인부터 의심하세요. 대개 데이터나 미래참조에 문제가 있습니다.

댓글

이 블로그의 인기 게시물

한국투자증권 KIS API로 실시간 시세 받기 (WebSocket 실전)

파이썬으로 업비트 API 연동하기 — 시세 조회부터 주문까지 기초

Go로 자동매매 신호봇 프레임워크 설계하기