매매 손익 분석과 부가 기능 구현
— FIFO PnL · AI 스캐너 · ML 전략 · 버그 수정
실전 운용을 시작하면 "지금 얼마 벌고 있는가"를 정확히 알아야 한다. 잔고만 보는 것으로는 부족하다. 여러 번 나눠 산 코인의 평균 단가, 부분 매도 시 수익 계산, 수수료 포함 실질 손익을 모두 정확하게 처리해야 한다. 아래에 FIFO 손익 계산 구현부터 AI 스캐너, 머신러닝 전략, 그리고 24시간 자동 운용에서 발생한 실제 버그들을 정리했다.
01 P&L 분석: FIFO 원가 계산
여러 번에 걸쳐 매수한 코인을 일부 매도했을 때 어떤 수량이 팔린 것으로 볼지를 정해야 한다. FIFO(First In, First Out), 즉 먼저 산 것부터 먼저 판다는 원칙을 적용했다.
# 매수 순서대로 원가 배분 실현 손익 = (매도가 - FIFO 원가) × 수량 - 수수료 # 알고리즘별 분리 계산 > VB(변동성 돌파)와 Grid 매매는 별개로 집계 > 동일 코인이라도 전략별 PnL이 따로 표시됨
전략별로 PnL을 분리한 이유가 있다. 동일 코인에 VB 전략과 그리드 전략을 동시에 적용할 수 있는데, 두 전략의 성과를 뒤섞으면 어떤 전략이 효과적인지 파악할 수 없기 때문이다.
-
기간별 실현 손익 당일 / 주간 / 월간을 선택해 기간별로 확인할 수 있다.
-
알고리즘별 손익 분리 VB, 그리드, RSI 등 전략별로 손익이 개별 집계된다.
-
총 수수료 현황 수수료가 전략 수익성에 미치는 영향을 별도로 추적한다.
02 AI 코인 스캐너
어떤 코인에 어떤 알고리즘을 쓰는 것이 가장 효과적인지 자동으로 찾아주는 기능이다. 수동으로 코인마다 백테스팅을 돌려보는 것은 시간이 너무 많이 걸린다.
백테스팅은 코인 수와 알고리즘 수를 곱한 조합을 병렬로 실행한다. 각 조합의 종합 점수(수익률 40%, 승률 30%, MDD -20%, 샤프비율 10%)를 계산하고, 상위 조합을 원클릭으로 자동매매에 적용할 수 있다.
03 ML 앙상블 전략: LightGBM
단일 지표 하나만 보는 알고리즘의 한계를 극복하기 위해 머신러닝을 도입했다. LightGBM 모델이 21개 피처를 종합적으로 학습해 매수 확률을 예측한다.
| 항목 | 내용 |
|---|---|
| 학습 데이터 | 최근 6시간봉 캔들 |
| 피처 수 | 21개 (RSI, MACD, 볼린저밴드, ADX, DI+/-, 거래량 추세 등) |
| 레이블 | 변동성 돌파(VB, K=0.5) 발생 후 실제 수익 여부 |
| 재학습 주기 | 매일 자동 재학습 |
| 활성화 기준 | AUC ≥ 0.58일 때만 자동 ON |
| 비활성화 기준 | AUC < 0.52이면 자동 OFF |
AUC가 0.5에 가까울수록 모델이 랜덤 수준임을 의미한다. 예측 정확도가 낮은 상태에서 실전에 적용하는 것을 막기 위해 자동 활성화/비활성화 조건을 두었다.
2026년 5월 9일 기준 코인별 ML 학습 결과다.
| 코인 | AUC | 상태 |
|---|---|---|
| XRP | 0.897 | 자동 ON |
| BTC | 0.839 | 자동 ON |
| ETH | 0.571 | 경계값 (주시 필요) |
04 실전에서 발견한 버그들
자동매매는 24시간 사람이 지켜보지 않는다. 그래서 예상치 못한 버그가 실제 돈 손실로 이어진다. 세 가지 대표적인 버그를 공유한다.
버그 1: 매매 인터벌 무시
매매 주기를 2시간으로 설정했는데 30초 간격으로 매수가 6번 연속 발생했다. 스케줄러 루프에서 마지막 거래 시각을 체크하는 로직에 결함이 있었다. 코인별 last_trade_time을 세션 상태에 저장하고, 주기를 검증하는 로직을 별도로 강화해 해결했다.
# 수정 전: 전역 타임스탬프 하나로 모든 코인 체크 # 수정 후: 코인별 last_trade_time 개별 관리 if now - last_trade_time[coin] < min_interval: > skip # 주기 미달 시 매매 건너뜀
버그 2: 동시 다중 매도
동일 시각에 3건 매도가 동시에 실행됐다. 비동기 루프에서 락(lock) 없이 여러 코인이 동시에 매도 조건을 충족한 것이 원인이었다. 코인별 mutex 락을 적용해 해결했다.
# asyncio.Lock()을 코인별로 생성 trade_locks = {coin: asyncio.Lock() for coin in coins} async with trade_locks[coin]: > await execute_order(coin, ...) # 락 내에서만 주문 실행
버그 3: 부분 매도 시 PnL 오계산
부분 매도 후 잔여 보유량이 잘못 계산되어 손익이 틀리게 표시됐다. FIFO 계산 시 부분 수량 처리 로직이 누락된 것이 원인이었다. fill 단위로 거래를 병합한 후 FIFO를 재계산하는 로직을 새로 구현했다.
05 최종 화면 구성
3편 시점의 화면 구성이다. 초기 MVP에 비해 기능이 많이 추가됐다.
-
좌측 패널 (Portfolio) 보유 현금, 코인별 카드(현재가·매수 단가·평가손익·미니 차트), 매매 이력 팝업, 기간별 PnL 패널.
-
우측 패널 (Control) VB 전략 패널(코인별 설정·현재 신호·포지션 상태), 그리드 전략 패널, 시스템 상태 표시, KPI Bar(전체 수익·승률 요약).
모달 팝업 기준으로는 총 7개가 구현됐다. 코인 선택, 알고리즘 선택(백테스팅 결과 포함), 금액/주기 설정, 기간 설정, 그리드 설정, 그리드 현황(사다리 시각화), 시스템 상태 확인이다.
FIFO 원가 계산 기반 P&L 분석으로 전략별·코인별 실질 손익을 추적할 수 있게 됐다. AI 코인 스캐너는 백테스팅 종합 점수 기반으로 코인·알고리즘 최적 조합을 자동 추천한다. LightGBM 머신러닝 전략은 21개 피처를 매일 재학습하며 AUC 임계값으로 자동 ON/OFF된다. 실전에서 발견한 인터벌 무시, 동시 다중 매도, FIFO 오계산 버그는 세션 상태 관리와 비동기 mutex로 해결했다. 4편에서는 2개월 실전 데이터를 바탕으로 한 전략별 성과 분석과 총평을 다룬다.



'비전공자의 바이브 코딩 > 일상 & 기초' 카테고리의 다른 글
| 디아블로2 봇 만들기 #1— (맵핵구현)D2R 게임 메모리 구조 분석 (0) | 2026.06.03 |
|---|---|
| 클로드코드(Claude Code)로 코인 자동매매 프로그램 만들기 : #4. 마무리, 계획 (1) | 2026.05.16 |
| 클로드코드(Claude Code)로 코인 자동매매 프로그램 만들기 : #2. 자동매매 전략 수립 (0) | 2026.05.16 |
| 클로드코드(Claude Code)로 코인 자동매매 프로그램 만들기 : #1. 계획 수립 및 PRD (0) | 2026.05.16 |
| 클로드코드(Claude Code)로 주식 분석 웹 서비스 만들기 : #5. 카카오톡 연동하기 (1) | 2026.05.05 |