Files
Stock-trading-programming/reports/daily/2026-05-18.md
T

128 lines
5.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# [2026-05-18] 일일 리포트 — 첫 본격 운영일
> 모드: 모의투자 (KIS_MOCK=true, DRY_RUN=true)
> 비고: 오전 봇(price=0 버그) / 오후 봇(버그 수정) 두 구간으로 나뉨
---
## 매매 결과 요약
| 구분 | 건수 | 내용 |
|------|------|------|
| 전체 체결 | 26건 | 오전 22건 + 오후 4건 |
| 유효 데이터 (price>0) | 2건 | 오후 봇 이후만 신뢰 가능 |
| 실현손익 (계산 가능분) | **-13,370원** | 삼성전자 손절 |
| 미청산 포지션 | 1종목 | 대한광통신 60주 @ 23,100원 |
---
## 구간 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~) ✅ 수정 후 신뢰 가능
버그 수정 후 재시작: entry_price/exit_price 정상 기록, ETF 14종목 필터 적용.
| 시간 | 종목 | 수량 | 매수가 | 매도가 | 사유 | 손익 |
|------|------|------|--------|--------|------|------|
| 13:19:50 | 삼성전자(005930) | 4주 | 284,750원 | 282,000원 | SL | **-13,370원** |
| 13:19:58 | 대한광통신(010170) | 60주 | 23,100원 | 미청산 | — | 미정 |
> 삼성전자 손익 계산: (282,000 - 284,750) × 4 - 수수료(2,370) = **-13,370원**
---
## 오늘 발견 및 수정한 버그
| # | 버그 | 수정 내용 |
|---|------|----------|
| 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` 이중 종료 |
---
## 분석
### 오전 신호 패턴
- 09:00~11:23 사이에 22건 집중 → 변동성 돌파 전략 정상 동작
- 252670(인버스ETF) 반복 진입 8회 — ETF 필터 없어서 발생, 수정 완료
- SL 비율이 높음 (약 55%) — 약세장(sentiment 42점) 대비 포지션 잡은 것이 원인일 수 있음
### 오후 신호 (수정 후)
- 유니버스 30 → 14종목으로 축소 (ETF 제외 효과)
- 삼성전자 오후 돌파 신호 포착 → 손절 (-0.97%) — 장 막판이라 모멘텀 약했던 것으로 보임
- 오후 1~2시 신호는 변동성 돌파 특성상 신뢰도 낮음
### L3 (3연속 손절) 점검
- 오전 봇: 034220 SL → 047040 SL → 271050 SL → L3 조건 충족됐으나 차단 미작동
- price=0 데이터라 risk.record_trade(0)이 호출됐을 가능성 → L3 pnl 합산이 0이라 감지 못함
- **내일 확인 필요**: 실제 pnl 기록 후 L3 차단 정상 작동하는지 검증
---
## 파라미터 변경
변경 없음. 오늘은 데이터 정합성 복구가 우선이었고, 의미있는 pnl 데이터가 삼성전자 1건뿐이라 전략 파라미터 판단 불가.
---
## 실전 전환 조건
| 조건 | 기준 | 현재 | 통과 |
|------|------|------|------|
| 누적 운영 | 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) 자동 실행 여부 확인