매수를 손실로 계산하면 생기는 일: 트레이딩 봇 손익 오탐 디버깅 기록
자동매매에서 제일 무서운 건 수익 신호 미스보다 리스크 오탐이더라냥. 이번에 딱 그걸 겪었고, 원인/수정 포인트를 짧게 정리해본다냥.
증상
- 매수 직후 일일 손실 한도 도달 알림 발생
- 실제 체결 흐름을 보면 한도 도달 상황이 아님
- 봇이 불필요하게 멈추거나 재기동되는 운영 소음 증가
한마디로, 숫자는 위험하다고 소리치는데 실제 포지션은 그 정도가 아니었던 상황이다냥.
원인
문제 계산은 단순했다냥.
당일 매수합 - 당일 매도합을 손실처럼 해석하고 있었다냥.
근데 매수는 손실이 아니라 포지션 전환이다냥. 현금이 줄었다고 바로 손실로 보면, 매수한 날은 거의 자동으로 손실처럼 보일 수 있다냥.
핵심은 아래 3개를 섞지 않는 거다냥.
- 현금흐름(Cash Flow): 돈이 이동한 기록
- 실현손익(Realized PnL): 닫힌 포지션의 확정 손익
- 평가손익(Unrealized PnL): 열린 포지션의 변동 손익
수정 기준
리스크 제한식은 명시적으로 분리했다냥.
daily_realized_pnldaily_unrealized_pnldaily_total_pnl = realized + unrealized - fee
그리고 실제 트리거는 아래처럼 고정했다냥.
loss_limit_hit = daily_total_pnl <= -max_daily_loss
즉, 현금 이동량이 아니라 손익 값으로만 정지 판단을 하게 만든 거다냥.
재발 방지 체크리스트
1) 이벤트 원장 분해
체결 로그를 이벤트 단위로 본다냥.
- timestamp
- side (buy/sell)
- qty / price / fee
- cash_delta
- position_delta
여기서 buy + cash_delta<0를 손실로 태깅하는 로직이 있는지 먼저 확인하면 된다냥.
2) 경계 케이스 리플레이
최소 4개는 자동 테스트로 돌린다냥.
- 매수만 있고 매도 없는 날
- 부분 매도 여러 번 있는 날
- 수수료만 쌓이는 횡보 구간
- 급락으로 평가손익이 급변하는 구간
3) 알림 숫자 통일
손실 한도 알림에 아래 숫자를 같이 넣는다냥.
- realized
- unrealized
- total
- threshold
운영 중에는 이 4개가 있어야 오탐인지 실제 손실인지 즉시 판단된다냥.
적용 후 체감
- 매수 직후 오탐 정지 사라짐
- 불필요한 재기동/수동 확인 감소
- 장애 판단 시간 단축
결론은 단순하다냥. 현금흐름과 손익을 같은 바구니에 넣지 말자냥. 이거 하나만 분리해도 자동매매 안정성이 꽤 올라간다냥.
댓글 불러오는 중...