4월 16일 매매 일지 -- 시스템 대개편, 5단계 전략 고도화
양시장 BOTH_BULL 유지. 오늘은 매매보다 시스템 대개편이 핵심이다. 손실이 큰 미청산 포지션들을 정리하기 위해 진입/청산 로직을 5가지 축에서 동시에 개선했고, 하루 동안 그 효과가 즉시 나타났다. 특히 7일째 보유 중이던 LG화학·POSCO홀딩스·신한지주가 신규 TIME_STOP(시간 손절)에 의해 자동 청산되었다.
시장 환경
| 지수 | 상태 |
|---|---|
| KOSPI | BULL |
| KOSDAQ | BULL |
BOTH_BULL 유지 → ALL_BULL(예산 100%) 적용.
시스템 개편 (5가지 축)
오늘 대규모 개편이 있었다. 아침 보유 종목 분석 결과 미실현 손실이 큰 포지션이 많다는 문제 인식에서 출발:
| # | 개선 | 변경 내용 |
|---|---|---|
| 1 | 시간 기반 손절 | 5일 이상 보유 + 수익 <+1% → TIME_STOP 자동 청산 |
| 2 | 초기 타이트 손절 | 진입 시 ATR×1.5, 2일 후 ATR×2.0으로 확대 |
| 3 | 거래량 필터 강화 | MIN_VOLUME_RATIO 1.2x → 1.5x |
| 4 | 매도 사유 정확 분류 | DB entry_price 기반 → TRAILING_STOP / BREAKEVEN_STOP / STOP_LOSS 정확 구분 |
| 5 | 돌파 확인 대기 | 1회 감지 후 다음 사이클에서도 유지될 때만 매수 (순간 돌파 필터) |
추가로 청산 사유별 자동 WATCHING 복귀 구현: TARGET/TRAILING_STOP은 즉시, STOP_LOSS는 1일, TIME_STOP은 3일 쿨다운 후 재진입 가능 상태로 자동 전환.
매수 내역 (2건)
| 시각 | 종목 | 코드 | 진입가 | 수량 | 금액 | 비고 |
|---|---|---|---|---|---|---|
| 09:07 | 삼성전기 | 009150 | 632,000 | 1주 | 632,000 | BOTH_BULL, 확인 대기 통과 |
| 13:34 | 비츠로셀 | 082920 | 54,900 | 18주 | 988,200 | 중복 매수 사고 |
비츠로셀 중복 매수 이슈
13:31 매수 직후 13:34에 같은 종목이 한 번 더 매수되는 사고 발생. 원인은 구글시트에 동일 종목 행이 2개 존재했던 것:
- 행 A: 어제(4/15) 매도된 DONE 상태 → 오늘 아침 자동 복귀로 WATCHING 전환
- 행 B: 어제 update_watchlist.py가 추가한 신규 WATCHING 행
두 행이 동시에 돌파 감지되어 순차적으로 매수가 실행됐다. 수동으로 18주 매도하여 50% 포지션만 남김.
재발 방지 3단 방어벽 구축:
_execute_buy에서 DB 미청산 포지션 체크 → 중복 매수 차단- 자동복귀 시 같은 symbol의 활성 행이 있으면 복귀 스킵
update_watchlist.py는 신규 추가 대신 기존 DONE/DROPPED 행 재활용
매도 내역 (5건)
| 시각 | 종목 | 진입가 | 청산가 | PnL | 사유 | 보유일 |
|---|---|---|---|---|---|---|
| 09:31 | 신성이엔지 | 4,610 | 4,790 | +38,880 (+3.9%) | TRAILING_STOP | D+0 |
| 10:31 | LG화학 | 362,000 | 355,000 | -21,000 (-1.9%) | TIME_STOP | D+7 |
| 10:31 | POSCO홀딩스 | 368,500 | 369,500 | +3,000 (+0.3%) | TIME_STOP | D+7 |
| 10:31 | 신한지주 | 99,100 | 99,900 | +8,800 (+0.8%) | TIME_STOP | D+6 |
| 14:08 | 비츠로셀(#1) | 55,000 | 54,400 | -10,800 (-1.1%) | MANUAL_SELL | D+0 |
매도 손익 합계: +18,880원
TIME_STOP 자동 청산 (첫 발동!)
봇 재시작 후 첫 사이클(10:31)에서 3건 연속 발동:
- LG화학: 4/9 진입 → 7영업일 보유, -1.93% → 청산. 가장 큰 손실.
- POSCO홀딩스: 4/9 진입 → 7영업일, +0.27% → 청산. 1% 기준 미달.
- 신한지주: 4/10 진입 → 6영업일, +0.81% → 청산. 1% 기준 미달.
3종목 합계 PnL: -9,200원 (수수료 제외). 큰 손실 없이 정리 완료.
매도 사유 분류 정상 작동
어제 "개선" 항목이었던 매도 사유 분류가 오늘부터 정상 기록:
- TRAILING_STOP: 신성이엔지 (+3.9%)
- TIME_STOP: 3건 (신규 사유)
- MANUAL_SELL: 비츠로셀 중복분 (수동 청산)
어제처럼 "수익 청산인데 STOP_LOSS로 기록"되는 오류 사라짐.
보유 종목 현황 (7종목)
| 종목 | 진입가 | 진입일 | 비고 |
|---|---|---|---|
| 하나금융지주 | 120,800 | 4/10 | D+6, 시간 손절 임박 |
| 현대로템 | 220,000 | 4/14 | D+2, 타이트→확대 손절 전환 |
| 쏠리드 | 19,180 | 4/15 | D+1 |
| 산일전기 | 198,000 | 4/15 | D+1 |
| 에이피알 | 411,000 | 4/15 | D+1 |
| 삼성전기 | 632,000 | 4/16 | D+0, 오늘 신규 |
| 비츠로셀 | 54,900 | 4/16 | D+0, 오늘 신규 (50% 포지션) |
하나금융지주(D+6)가 내일 수익 <+1%면 TIME_STOP 대상. 예의주시.
오늘의 교훈
즉시 효과를 본 개선
- TIME_STOP: 7일째 손실 + 횡보 중이던 LG화학을 기계적으로 정리. 감정 개입 없이 룰에 따라 잘라냄.
- 매도 사유 분류: 어제까지 모든 청산이 STOP_LOSS로 기록되어 백테스트 분석이 왜곡됐던 것을 해결.
뼈아픈 교훈
- 구글시트 중복 행 이슈: 사전에 상상하지 못한 실패 모드. DB만 믿고 시트 상태를 보조로 쓴 것이 독이 됐다.
_execute_buy에서 DB 미청산 체크가 없었다면 계속 반복될 문제. "시트 = UI, DB = 진실" 원칙 재확인. - 자동복귀 로직의 부작용: 좋은 의도로 만든 기능이 예상치 못한 부작용(중복)을 만들었다. 기능 추가 시 기존 데이터 상태와의 상호작용을 더 신중히 검토해야 한다.
내일 체크포인트
- 하나금융지주 TIME_STOP 발동 여부
- 현대로템 손절 확대(ATR×1.5 → ATR×2.0) 자동 전환 로그 확인
- 거래량 필터 1.5x 상향 효과 (어제 통과한 매수 중 몇 건이 오늘 기준으로 걸러졌을지)
- 돌파 확인 대기 로직으로 인한 "기회 놓침" 빈도 체크
소감
매매 자체는 평범했으나 시스템 관점에서는 가장 밀도 높은 날. 9개의 개선 항목을 하루 만에 적용하고 검증했다. 특히 비츠로셀 중복 매수는 아프지만, 덕분에 3단 방어벽을 구축할 수 있었다. 실전 봇 운영 3주차, 이제 진짜 "전략의 고도화" 단계로 진입한 느낌이다.


'Project Archive > Quant & Auto Trading' 카테고리의 다른 글
| [자동매매] 실전운영 7일차 - 매수 6건, 매도 4건, 회전율 최고치 (0) | 2026.04.15 |
|---|---|
| [자동매매] 실전운영 6일차 - 거래량 필터 첫 실전 작동, 신규 매수 2건 (0) | 2026.04.14 |
| [자동매매] 실전운영 5일차 - 거래 없음, 거래량 필터 첫 실전 가동 (1) | 2026.04.13 |
| [자동매매] 실전운영 4일차 - ISC 청산 + 금융주 3종목 신규 매수 (0) | 2026.04.13 |
| [자동매매] 실전운영 3일차 - 첫 실전 매수 3건 (0) | 2026.04.10 |
댓글