바이낸스 선물 자동매매

자동매매 봇 백테스트 실전 차이, 현재봉 제외 안 해서였다

creator88837 2026. 6. 9. 09:05

 

바이낸스 선물 자동매매 봇의 백테스트 결과가 좋아서 실전에 돌렸다.
근데 신호가 이상했다. 백테스트에서 잡던 타이밍에 진입이 안 되고, 전혀 다른 시점에 들어갔다.
이 글에서는 원인이 된 현재봉 포함 문제와 해결 방법을 실전 로그와 함께 정리한다.

원인을 찾는 데 한참 걸렸다.
코드를 뜯어보고, AI한테 물어보고, 로그를 출력해가며 비교했다.
결국 찾은 원인은 단순했다.
현재 진행 중인 캔들을 포함해서 신호를 잡고 있었던 것이다.

 

현재 진행 중인 캔들이 문제였다 


4시간봉 기준으로 매매 신호를 잡는다고 해보자.
4시간봉 하나가 완성되려면 4시간이 걸린다.
봇은 5분마다 데이터를 가져와서 신호를 체크한다.

그런데 4시간봉이 완성되기 전에도 그 봉의 데이터는 실시간으로 존재한다.
예를 들어 오전 8시에 봉이 시작됐다면, 오전 9시에 봇이 체크할 때 이 봉은 아직 진행 중이다.
오전 12시가 돼야 완성된다.

현재 진행 중인 봉을 포함하면 어떻게 될까.
아직 완성되지 않은 봉의 값으로 신호를 잡는다.
오전 9시 현재 가격 기준으로 MACD나 KDJ 같은 지표가 계산된다.
근데 오전 12시에 봉이 닫힐 때는 그 값이 완전히 달라져 있을 수 있다.

지금 골든크로스처럼 보여도 봉이 완성될 때는 데드크로스일 수 있다.
가짜 신호에 진입하는 것이다.
백테스트는 완성된 봉의 종가 기준으로 계산한다.
그래서 실전이랑 결과가 달라진다.

 

실전 로그에서 직접 확인한 차이 


로그를 뽑아서 확인해봤다.
봇이 오전 10시 30분에 MACD 골든크로스 신호를 잡고 롱 진입을 했다.
4시간봉은 아직 오전 12시까지 진행 중인 봉이었다.

오전 12시에 봉이 완성됐을 때 MACD 값을 다시 계산했다.
골든크로스가 아니었다. 데드크로스로 바뀌어 있었다.
봇은 진입 후 반대 방향으로 움직이는 시장에 묶여 손절로 청산됐다.

백테스트에서는 이 거래가 아예 발생하지 않는다.
완성된 봉 기준으로 계산하면 신호 자체가 없었기 때문이다.
실전 봇만 이 거래를 했고, 백테스트 봇은 안 한 거래다.

이런 가짜 진입이 한 달에 몇 건씩 누적되면 수익률이 크게 벌어진다.
백테스트가 좋아도 실전이 나쁜 이유의 상당 부분이 여기서 나온다.

 

해결법은 간단하다 


현재 진행 중인 봉을 제외하면 된다.
완성된 봉 기준으로만 신호를 잡는 것이다.

코드로는 이 한 줄이면 된다.

df = df.iloc[:-1]



코딩을 몰라도 이 줄이 뭔지는 알아두면 좋다.
df는 봇이 가져온 봉 데이터 전체다.
iloc[:-1]은 마지막 항목을 제외하라는 뜻이다.
데이터를 가져올 때 맨 마지막에 있는 게 현재 진행 중인 봉이다.
그걸 잘라내는 것이다.

이 한 줄이 없으면 현재봉을 포함해서 신호를 잡는다.
이 한 줄이 있으면 완성된 봉 기준으로만 신호를 잡는다.

AI한테 코드를 요청할 때 이 문장을 함께 넣어주면 된다.

"현재 진행 중인 캔들은 제외하고 완성된 캔들 종가 기준으로 신호를 잡아줘"

이 문장 하나로 AI가 코드에 자동으로 반영해준다.

 

왜 이게 중요한가 


백테스트에서는 항상 완성된 봉 데이터만 쓴다.
신호봉이 닫힌 다음 봉에서 진입하는 방식이다.
그게 실전에서도 동일하게 작동해야 백테스트랑 결과가 같아진다.

현재봉을 포함하면 신호가 빨라진다.
빠른 신호 = 가짜 신호 = 실전 결과 하락.

이걸 모르면 백테스트 수익률이 좋아도 실전에서 계속 손실이 난다.
원인도 못 찾고 전략이 나쁜 건지, 봇이 잘못된 건지 헤맨다.
나도 한참을 그랬다.

진입·청산 신호는 반드시 완성된 캔들 종가 기준이어야 한다.
코드 짤 때마다 df = df.iloc[:-1] 있는지 확인하는 습관을 들이면 좋다.
백테스트가 아무리 좋아도 이 한 줄이 빠지면 실전에서 전혀 다른 봇이 된다.
자동매매 봇을 처음 만드는 거라면 이 부분을 제일 먼저 확인해야 한다.

 

현재봉 포함 여부 확인하는 방법 


코드를 보지 않아도 로그만으로 확인할 수 있다.

봇 로그에는 진입 시간이 기록된다.
4시간봉을 쓰는 봇이라면 봉은 0시, 4시, 8시, 12시, 16시, 20시에 마감된다.
신호는 봉 마감 직후에 나와야 한다.
즉 진입 시간이 00:00:05, 04:00:05, 08:00:05처럼 정각 직후여야 정상이다.

진입 시간이 09:30:05, 10:50:05처럼 봉 중간 시간이라면 현재봉 포함 오류다.
봉이 완성되기 전에 신호를 잡은 것이다.

이 방법으로 로그만 확인해도 현재봉 포함 여부를 바로 알 수 있다.
코드를 읽을 줄 몰라도 된다. 진입 시간만 체크하면 된다.

 

결론 


백테스트와 실전 결과가 다르다면 현재봉 포함 여부를 먼저 확인하자.

코드에 df = df.iloc[:-1] 이 있는지 확인한다.
없다면 추가하면 된다.

AI한테 코드 짜달라고 할 때 "완성된 캔들 기준으로 신호 잡아줘"라고 명시하는 습관을 들이자.
이 한 줄이 백테스트와 실전의 차이를 만드는 핵심 원인 중 하나다.

📈 백테스트