본문 바로가기
자동매매 [ALGO]

자동매매 데이터 검증, 데이터는 있었는데 전략은 못 봤다

by WealthGRID 2026. 10. 6.

자동매매에서 데이터 칸은 가격을 모으고, 저장하고, 거래소와 시각을 맞추는 일을 합니다. 실계좌 전환 첫 주, 수년 치 가격 기록이 멀쩡히 저장돼 있었는데도 판단 코드는 한 줄짜리 임시 데이터를 보고 "사지 않는다"는 결정을 내렸습니다. 오류 메시지는 하나도 없었습니다. 이 글은 그날 무슨 일이 있었는지, 그리고 그 뒤로 데이터 칸에 어떤 원칙을 세웠는지에 대한 기록입니다.

데이터 칸이 하는 세 가지 일

지난 글에서 자동매매를 여섯 칸으로 나눴고, 데이터는 그 첫 번째 칸입니다. 하는 일은 세 가지입니다.

  • 가격 수집: 판단에 필요한 기간만큼 가격 기록을 거래소에서 받아 옵니다.
  • 저장: 받아 온 기록을 내 컴퓨터에 보관합니다. 매번 처음부터 받지 않아도 되고, 거래소가 잠시 응답하지 않아도 판단을 이어갈 수 있습니다.
  • 시각 맞추기: 내 컴퓨터의 시계와 거래소 서버의 시계를 맞춥니다.

저장에는 작은 장치가 하나 있습니다. 새 기록을 기존 파일에 바로 덮어쓰지 않고 임시 파일에 먼저 쓴 뒤, 다 쓰면 한 번에 바꿔 끼웁니다. 쓰는 도중 컴퓨터가 꺼져도 반쯤 쓰다 만 파일이 남지 않게 하기 위해서입니다. 시각 맞추기도 두 겹으로 했습니다. 거래소 서버와 주고받는 시간을 재서 두 시계가 얼마나 어긋나는지 계속 감시하고, 주문에 찍히는 시각은 거래소 서버 기준으로 보정합니다. 시각이 어긋나면 거래소가 주문 자체를 거절하기 때문입니다.

세 가지 모두 전략과는 상관없는 일처럼 보입니다. 하지만 전략은 이 칸이 넘겨주는 데이터를 그대로 믿습니다. 데이터가 틀리면 전략이 아무리 좋아도 틀린 답이 나옵니다.

실제로 있었던 일: 오류 없이 틀린 판단

실계좌로 전환한 첫 주의 아침 매매 시각, 시스템은 정해진 대로 깨어나 판단을 내렸습니다. 결과는 "현금 유지"였습니다. 그런데 그 시기 시장은 이 시스템의 기준으로 추세가 켜져 있었고, 원래라면 사야 하는 날이었습니다.

기록을 거슬러 올라가 보니 이상한 점이 있었습니다. 내 컴퓨터에는 수년 치 가격 기록이 멀쩡히 저장돼 있었는데, 판단 코드에 들어간 데이터는 단 한 줄이었습니다. 한 줄짜리 데이터로는 추세를 계산할 수 없으니, 판단 코드는 "추세 꺼짐"으로 결론을 내리고 현금에 머물렀습니다. 프로그램은 멈추지 않았고, 오류 알림도 오지 않았습니다. 겉으로 보기에는 아무 문제 없이 하루를 마친 것입니다.

데이터는 있었는데 전략은 못 봤다. 저장된 기록 대신 한 줄짜리 임시 데이터가 판단 코드로 들어가 현금 유지로 이어진 흐름
저장된 기록 대신 한 줄짜리 임시 데이터가 판단 코드로 들어가 현금 유지로 이어진 흐름

원인은 이름 하나, 그리고 친절했던 예비 경로

원인은 이름 하나였습니다. 정해진 시각에 시스템을 깨우는 부분은 데이터 칸에 특정 이름의 기능을 찾았고, 데이터 칸은 같은 일을 다른 이름으로 하고 있었습니다. 둘이 서로를 찾지 못한 것입니다.

여기까지는 흔한 실수입니다. 문제는 그다음이었습니다. 개발 단계에서 쓰던 예비 경로가 남아 있었습니다. 데이터를 찾지 못하면 임시 데이터로 대신 계산해서라도 흐름을 이어가는 길입니다. 개발 중에는 이 길 덕분에 데이터 없이도 나머지 부분을 시험할 수 있었습니다. 그런데 실계좌에서는 이 친절한 길이 버그를 숨겼습니다. 데이터를 못 찾았으면 차라리 멈춰야 했는데, 임시 데이터로 판단까지 끝내 버린 것입니다.

같은 날 두 칸의 이름을 맞춰 연결을 고쳤고, 다음 날 아침 판단부터는 저장된 기록 전체를 쓰도록 했습니다. (근거: 시스템 A 검증 이력의 실계좌 첫 주 기록)

더 위험한 건 조용한 버그. 에러가 뜨는 버그는 멈추지만, 조용한 버그는 틀린 판단을 반복한다
에러가 뜨는 버그는 멈추지만, 조용한 버그는 틀린 판단을 반복한다

 

이 일에서 얻은 교훈은 하나입니다. 에러가 뜨는 버그는 시끄러운 만큼 빨리 고쳐집니다. 정말 위험한 것은 틀린 데이터로 조용히 계속 도는 버그입니다. 이번에는 "사지 않는" 쪽으로 틀려서 손실은 없었지만, 반대 방향으로 틀렸다면 사지 말아야 할 날 샀을 수도 있습니다.

고친 원칙: 데이터가 모자라면 거래하지 않는다

연결만 고치고 끝내지 않았습니다. 사흘 뒤 데이터 칸에 원칙을 하나 세웠습니다. 판단에 필요한 기간만큼 가격 기록이 없으면 매매를 거부하고, 가지고 있던 포지션은 그대로 두고, 즉시 휴대폰으로 알림을 보냅니다. 임시 데이터로 대신 계산하는 길은 실계좌와 모의 운용에서는 아예 막았습니다.

이 원칙에는 대가가 있습니다. 데이터 문제로 하루 매매를 건너뛰면 그날의 기회를 놓칠 수 있습니다. 그래도 틀린 판단보다는 판단을 미루는 쪽이 낫다고 봤습니다. 기회는 다음 날 다시 오지만, 틀린 판단으로 생긴 손실은 되돌릴 수 없기 때문입니다. 알림을 보내는 이유도 같습니다. 시스템이 거래를 멈췄다는 사실을 사람이 바로 알아야, 조용한 버그가 며칠씩 이어지지 않습니다.

비슷한 원칙을 평가에도 적용했습니다. 처음에는 계좌 잔고의 가치를 지난 종가로 계산했는데, 이것도 결국 "지난 데이터"였습니다. 지금은 거래소의 실시간 현재가로 평가하도록 바꿨습니다.

정리: 데이터 칸 점검 질문

  • 판단에 필요한 데이터가 모자라거나 비어 있으면, 시스템은 멈추는가 아니면 대신 계산하는가
  • 개발 중에 만든 임시 데이터나 예비 경로가 실계좌에서도 살아 있지는 않은가
  • 데이터를 받아 오는 쪽과 쓰는 쪽이 같은 이름, 같은 형식을 쓰는지 한 번에 흘려보는 테스트가 있는가
  • 저장하다 끊겨도 반쯤 쓴 파일이 남지 않는가
  • 거래소 서버와 내 컴퓨터의 시각 차이를 감시하고 있는가

다음 글에서는 두 번째 칸인 전략을 다룹니다. 하루에 한 번만 판단하도록 만든 이유와, 그 결과 백테스트 기간의 절반 넘게 아무것도 하지 않고 쉬게 된 이야기를 정리합니다. 같은 내용을 카드로 정리한 요약은 인스타그램 @wealthgrid.lab 에 올립니다.

※ 특정 종목·수익을 권유하지 않는 개인 시스템 개발 기록입니다. 투자 판단과 책임은 본인에게 있습니다.