바이낸스 선물 자동매매

바이낸스 자동매매 봇 버그, 신호를 엉뚱한 캔들에서 잡는 이유

creator88837 2026. 6. 25. 23:46

바이낸스 선물 자동매매 봇 신호봉 오류를 정리했다.
df[-2]를 신호봉으로 고정하는 방식이 특정 상황에서 틀린다.
이 글에서는 버그 원인과 해결 방법을 실전 로그와 함께 정리한다.

봇이 돌아가고 있는데 진입 타이밍이 계속 어긋난다.
신호가 난 캔들이 아닌 한두 봉 뒤에 들어가거나, 신호를 아예 통째로 놓친다.
이 경우 코드 안에서 엉뚱한 캔들을 신호봉으로 보고 있을 가능성이 높다.

백테스트에서는 이 문제가 절대 나오지 않는다.
백테스트는 이미 완성된 데이터를 순서대로 읽기 때문에 API 지연이 없다.
실전에서만 나타나는 버그라서 발견하기가 어렵다.

 

df[-2]를 신호봉으로 고정하는 코드가 틀리는 경우 


자동매매 봇은 4시간봉 신호를 잡을 때 배열에서 특정 위치의 봉을 꺼낸다.

배열은 캔들 목록을 순서대로 줄 세운 것이다.
맨 뒤 줄이 가장 최신 캔들이다.

df[-1] — 배열 맨 끝, 현재 열려있는 봉 (아직 완성 안 됨)
df[-2] — 그 이전 봉, 방금 완성된 봉

봇이 4시간봉 마감 직후 실행되면 df[-2]가 방금 마감된 신호봉이다.
그래서 대부분의 코드가 df[-2]를 고정으로 쓴다.
정상 상황에서는 맞다. 문제는 정상이 아닌 경우다.

AI한테 봇 코드를 짜달라고 하면 보통 이런 식으로 나온다.


signal_bar = df.iloc[-2]
if signal_bar['macd'] > signal_bar['macd_signal']:
    # 롱 진입 로직



이 코드는 4시간봉이 정상적으로 열린 상황에서만 맞다.
바이낸스 API 특성 때문에 틀리는 상황이 생긴다.

 

바이낸스 API가 새봉을 즉시 열지 않는 상황 


4시간봉이 닫힌 직후 바이낸스가 새봉을 즉시 열지 않는 경우가 있다.
바이낸스 서버가 봉을 처리하고 배열을 갱신하는 데 짧은 시간이 걸리기 때문이다.
봇이 그 짧은 틈에 실행되면 배열이 아직 갱신되지 않은 상태다.

새봉이 아직 안 열렸을 때 배열은 이렇게 생겼다.

df[-3] — 신호봉보다 이전 봉
df[-2] — 신호봉보다 이전 봉  ← 봇이 신호봉으로 착각
df[-1] — 방금 마감된 진짜 신호봉  ← 봇이 현재 열린봉으로 오해해서 무시

봇은 df[-2]를 보고 신호를 판단한다.
진짜 신호봉(df[-1])에서 골든크로스가 났어도 봇은 그걸 모른다.
결과: 진입 기회를 통째로 놓친다.

반대로 df[-2]에 이미 지나간 신호가 남아있으면 그걸 새 신호로 착각해 엉뚱한 방향으로 진입할 수도 있다.

이 상황은 항상 발생하는 게 아니라 바이낸스 서버 상태에 따라 간헐적으로 발생한다.
그래서 더 찾기 어렵다. 어떤 날은 괜찮고, 어떤 날은 타이밍이 어긋난다.

 

실전 로그에서 타이밍 버그를 발견한 과정 


실전 로그를 보다가 이상하다는 걸 알아챘다.
신호가 났을 것 같은 시간대에 진입 기록이 없고, 한두 봉 뒤에 진입 기록이 찍혀 있었다.
차트와 비교해봤더니 신호봉 타이밍이 맞지 않았다.
AI한테 물어봤더니 "새봉이 열리기 전에 실행됐을 수 있다"는 설명이 나왔다.
그때서야 이 버그의 원인을 알게 됐다.

로그에서 확인하는 방법은 간단하다.
신호봉 타임스탬프를 함께 출력하면 된다.

AI한테 이렇게 요청하면 된다.

"신호봉 타임스탬프를 로그에 출력해줘. 예상 신호봉 시각과 비교할 수 있게."

출력된 타임스탬프가 기대한 봉보다 한 봉 앞이면 이 버그다.
예를 들어 04:00에 신호가 나야 할 때 로그에 00:00 타임스탬프가 찍혀 있으면, 봇이 이전 봉을 신호봉으로 잡은 것이다.

 

봉이 두 개 밀리면 수익률에 어떤 영향이 생기나 


신호가 난 봉(N봉)이 마감됐을 때 새봉이 아직 안 열려서 신호를 못 잡는다.
다음봉(N+1) 구간에서도 타이밍 문제로 또 놓친다.
결국 그 다다음봉(N+2)에 가서야 진입한다.

진입 시점이 두 봉 밀리면 이미 움직임의 대부분이 지나간 후다.
신호가 났을 때 10% 상승하는 구간인데, 두 봉 뒤에 들어가면 이미 7~8%가 지나간 시점이다.
수익률에 직접적인 손실이 생기고, 백테스트와 실전 차이가 벌어진다.

더 나쁜 경우도 있다.
진입 시점이 밀리면서 손절가에 더 가까운 위치에서 시작하는 경우다.
백테스트에서는 신호봉에서 익절로 끝난 거래가 실전에서 손절로 바뀌는 일이 생긴다.
이게 백테스트와 실전 수익률 차이가 벌어지는 원인 중 하나다.

 

타임스탬프 비교로 신호봉을 동적으로 결정하는 방법 


df[-1]의 타임스탬프를 현재 4시간봉 구간 시작 시간과 비교해서 신호봉을 결정한다.

df[-1]이 현재 구간보다 이전이면 새봉이 아직 안 열린 것 → df[-1]이 진짜 신호봉
df[-1]이 현재 구간 안에 있으면 정상 상황 → df[-2]가 신호봉

AI한테 봇 코드를 짜달라고 할 때 이 내용을 명시해야 한다.

"신호봉은 df[-2]로 고정하지 말고, df[-1] 타임스탬프를 현재 4시간봉 시작 시간과 비교해서 신호봉을 결정해줘"

이걸 안 적으면 대부분 df[-2]로 고정하는 코드가 나온다.

타임스탬프 비교가 복잡하게 느껴진다면 임시 해결법이 있다.
봇 실행 시간을 4시간봉 마감 후 5분 뒤로 설정하는 것이다.
예를 들어 4시간봉이 00:00에 마감되면 00:05에 봇을 실행하도록 스케줄을 잡는다.
5분이면 바이낸스가 새봉을 여는 데 충분한 시간이다.

임시 해결법에는 단점이 있다.
4시간봉 마감 후 5분간 진입 기회를 놓치는 셈이다.
빠르게 움직이는 구간에서 5분은 꽤 긴 시간이다.
임시 해결법으로 시작하되, 여유가 생기면 타임스탬프 비교 방식으로 전환하는 것을 권장한다.

 

결론 


바이낸스 API는 봉이 닫힌 직후 새봉을 즉시 열지 않을 수 있다.
df[-2]를 고정으로 쓰면 이 상황에서 엉뚱한 봉을 신호봉으로 판단한다.
타임스탬프 비교로 신호봉을 동적으로 결정해야 진입 타이밍이 맞는다.

봇이 신호를 자꾸 늦게 잡거나 놓친다면 이 부분을 먼저 확인하자.
로그에 신호봉 타임스탬프를 출력해서 기대한 봉과 비교하면 바로 확인할 수 있다.

📈 백테스트