150 lines
7.0 KiB
Markdown
150 lines
7.0 KiB
Markdown
# [2026-05-18] 일일 리포트 — 첫 본격 운영일
|
|
|
|
> 모드: 모의투자 (KIS_MOCK=true, DRY_RUN=true)
|
|
> 비고: 오전 봇(price=0 버그) / 오후 봇(버그 수정) 두 구간으로 나뉨
|
|
|
|
---
|
|
|
|
## 매매 결과 요약
|
|
|
|
| 구분 | 건수 | 내용 |
|
|
|------|------|------|
|
|
| 전체 체결 | 26건 | 오전 22건 + 오후 6건 |
|
|
| 유효 데이터 (price>0) | 5건 | 오후 봇 이후 (삼성전자 pnl=None 제외) |
|
|
| 실현손익 (계산 가능분) | **-30,746원** | 아래 상세 참조 |
|
|
| 14:50 강제청산 | ✅ 정상 | 대한광통신·한화생명 2종목 청산 |
|
|
| 15:10 결산 | ❌ 미실행 | 봇이 14:50:05에 종료됨 → 수정 완료 |
|
|
|
|
---
|
|
|
|
## 구간 1 — 오전 봇 (09:00~13:11) ⚠️ 데이터 신뢰 불가
|
|
|
|
entry_price / exit_price 모두 0.0 → pnl 계산 불가.
|
|
ETF 필터 미적용 상태라 인버스/레버리지 ETF가 다수 포함됨.
|
|
|
|
| 시간 | 종목 | 수량 | 사유 | 비고 |
|
|
|------|------|------|------|------|
|
|
| 09:00:29 | 252670 (KODEX 인버스2X) | 13,333 | TP1 | ETF — 필터 필요 |
|
|
| 09:00:36 | 122630 (KODEX 레버리지) | 10 | SL | ETF — 필터 필요 |
|
|
| 09:01:33 | 034220 (LG디스플레이) | 117 | SL | — |
|
|
| 09:02:32 | 047040 (대우건설) | 56 | SL | — |
|
|
| 09:03:41 | 252670 | 12,903 | TP1 | ETF |
|
|
| 09:06:12 | 047040 | 57 | SL | — |
|
|
| 09:12:23 | 271050 (TIGER 인버스2X) | 868 | SL | ETF |
|
|
| 09:14:36 | 252670 | 12,500 | SL | ETF |
|
|
| 09:21:23 | 348340 | 25 | SL | — |
|
|
| 09:22:36 | 122630 | 10 | TP1 | ETF |
|
|
| 09:43:01 | 036540 | 204 | TP1 | — |
|
|
| 09:53:45 | 252670 | 13,008 | SL | ETF |
|
|
| 09:56:32 | 122630 | 10 | TP1 | ETF |
|
|
| 10:05:38 | 252670 | 13,114 | SL | ETF |
|
|
| 10:06:28 | 252670 | 13,333 | TP1 | ETF |
|
|
| 10:31:39 | 252670 | 13,445 | SL | ETF |
|
|
| 10:42:46 | 036540 | 199 | TP1 | — |
|
|
| 10:43:01 | 252670 | 13,675 | SL | ETF |
|
|
| 10:57:08 | 252670 | 13,793 | SL | ETF |
|
|
| 11:12:02 | 271050 | 882 | 미청산 | ETF — 포지션 유실 |
|
|
| 11:15:05 | 252670 | 13,913 | SL | ETF |
|
|
| 11:23:00 | 252670 | 14,159 | TP1 | ETF |
|
|
|
|
- TP1: 7건 / SL: 12건 / 미청산: 1건 (가격 없어 손익 계산 불가)
|
|
- ETF 포함 건수: 16건 이상 (252670, 122630, 271050)
|
|
|
|
---
|
|
|
|
## 구간 2 — 오후 봇 (13:18~14:50) ✅ 수정 후 신뢰 가능
|
|
|
|
버그 수정 후 재시작: entry_price/exit_price 정상 기록, ETF 14종목 필터 적용.
|
|
|
|
| 시간 | 종목 | 수량 | 매수가 | 매도가 | 사유 | 손익 |
|
|
|------|------|------|--------|--------|------|------|
|
|
| 13:19:50 | 삼성전자(005930) | 4주 | 284,750원 | 282,000원 | SL | pnl=None (버그) |
|
|
| 13:19:58 | 대한광통신(010170) | 60주 | 23,100원 | — | — | positions 불일치로 추적 못함 |
|
|
| 14:02:31 | 한화생명(088350) | 242주 | 5,770원 | 5,710원 | SL | **-17,215원** |
|
|
| 14:19:22 | 대한광통신(010170) | 60주 | 23,100원 | 22,850원 | SL | **-17,673원** |
|
|
| 14:23:03 | 대한광통신(010170) | 60주 | 23,050원 | 23,250원 | FORCE | **+9,280원** |
|
|
| 14:25:39 | 한화생명(088350) | 242주 | 5,770원 | 5,760원 | FORCE | **-5,138원** |
|
|
|
|
> **14:50 강제청산**: 14:50:00~14:50:05 사이 대한광통신·한화생명 2종목 정상 청산
|
|
> **실현손익 합계**: -17,215 + (-17,673) + 9,280 + (-5,138) = **-30,746원**
|
|
> (삼성전자 pnl=None 포함 시 추정 **-44,116원**)
|
|
|
|
---
|
|
|
|
## 오늘 발견 및 수정한 버그
|
|
|
|
| # | 버그 | 수정 내용 |
|
|
|---|------|----------|
|
|
| 1 | DRY_RUN 매수/매도 시 price=0 저장 | `order_buy/sell`에서 `get_price()` 호출해 실제 현재가 반환 |
|
|
| 2 | ETF/인버스/레버리지 종목 유니버스 포함 | `_is_etf()` 필터 — 키워드 + Q prefix 차단 |
|
|
| 3 | 종목명 ticker 코드로 저장 | `get_volume_rank()` 캐시로 이름 저장 |
|
|
| 4 | rate limit 초과 | 모의투자 1req/s, 실거래 5req/s로 고정 |
|
|
| 5 | 봇 재시작 시 포지션 유실 | `_restore_positions_from_db()` 추가 |
|
|
| 6 | 매수/매도 시 positions DB 미기록 | `_db_save_position / _db_delete_position` 추가 |
|
|
| 7 | `pnl` 컬럼에 None 저장 | `_update_trade_exit`에서 pnl 계산 후 저장 |
|
|
| 8 | 중복 봇 프로세스 미종료 | PID 파일 + `Get-CimInstance` 이중 종료 |
|
|
| 9 | `daily_summary` DB 미저장 | `daily_summary()` 에서 테이블 INSERT 추가 |
|
|
| 10 | 장중 재시작 시 15:10 결산 미실행 | `trading_loop()` 후 15:10까지 대기 루프 추가 |
|
|
|
|
---
|
|
|
|
## 분석
|
|
|
|
### 오전 신호 패턴
|
|
- 09:00~11:23 사이에 22건 집중 → 변동성 돌파 전략 정상 동작
|
|
- 252670(인버스ETF) 반복 진입 8회 — ETF 필터 없어서 발생, 수정 완료
|
|
- SL 비율이 높음 (약 55%) — 약세장(sentiment 42점) 대비 포지션 잡은 것이 원인일 수 있음
|
|
|
|
### 오후 신호 (수정 후)
|
|
- 유니버스 30 → 14종목으로 축소 (ETF 제외 효과)
|
|
- 삼성전자 13:19 진입 → SL (-0.97%), 대한광통신·한화생명 오후 2회씩 반복 진입
|
|
- 오후 진입은 변동성 돌파 특성상 신뢰도 낮음 → 14:00 이후 신규 진입 제한 검토 필요
|
|
- **강제청산 정상 작동**: 14:50:00~05 사이 2종목 5초 내 완료
|
|
|
|
### 15:10 결산 미실행
|
|
- 원인: 장중 재시작 경로에서 `trading_loop()` 종료 후 즉시 `return` → 결산 코드 미도달
|
|
- 수정: `trading_loop()` 후 15:10까지 대기 → 결산 실행 후 종료 (내일부터 적용)
|
|
|
|
### L3 (3연속 손절) 점검
|
|
- 오전 봇: 034220 SL → 047040 SL → 271050 SL → L3 조건 충족됐으나 차단 미작동
|
|
- price=0 데이터라 risk.record_trade(0)이 호출됐을 가능성 → L3 pnl 합산이 0이라 감지 못함
|
|
- **내일 확인 필요**: 실제 pnl 기록 후 L3 차단 정상 작동하는지 검증
|
|
|
|
---
|
|
|
|
## 전략 변경
|
|
|
|
| # | 항목 | 변경 전 | 변경 후 | 이유 |
|
|
|---|------|---------|---------|------|
|
|
| 1 | 신규 진입 마감 시간 | 14:30 | **14:00** | 14:23 대한광통신·14:25 한화생명 진입 후 25분 내 강제청산 → 청산 여유 없음 |
|
|
| 2 | SL 종목 당일 재진입 | 허용 | **차단** | 대한광통신 14:19 SL → 14:23 재진입 반복, 한화생명 동일 패턴 → 손실 누적 |
|
|
|
|
> 변경 근거: 오늘 -30,746원 손실의 직접 원인이 오후 2시 이후 반복 진입.
|
|
> `/evening` 자동화 범위(config.py 수치 조정)가 아닌 로직 변경이라 직접 수정.
|
|
|
|
---
|
|
|
|
## 실전 전환 조건
|
|
|
|
| 조건 | 기준 | 현재 | 통과 |
|
|
|------|------|------|------|
|
|
| 누적 운영 | 30거래일 이상 | 2일 | ❌ |
|
|
| 승률 | > 48% | 데이터 부족 | ❌ |
|
|
| MDD | < -10% | 데이터 부족 | ❌ |
|
|
| 샤프지수 | > 1.0 | 데이터 부족 | ❌ |
|
|
| L3 발동 | 월 2회 이하 | 미검증 | ❌ |
|
|
|
|
**실전 전환: 미충족**
|
|
|
|
---
|
|
|
|
## 내일 확인사항
|
|
|
|
1. 포지션 DB 복원 정상 동작 확인 (`_restore_positions_from_db`)
|
|
2. pnl 저장 정상 동작 확인 (`_update_trade_exit`)
|
|
3. ETF 필터 후 유니버스 종목 품질 확인
|
|
4. L3 (3연속 손절) 차단 로직 실제 동작 여부
|
|
5. morning 스케줄러 (08:15) 자동 실행 여부 확인
|
|
6. 15:10 결산 정상 실행 및 `daily_summary` 테이블 저장 확인
|
|
7. 14:00 이후 신규 진입 제한 검토 (오후 반복 진입 → 손실 패턴)
|