Files
kis_bot/docs/BREAKOUT_LIVE_BT_QA.md
Your Name fc27e726f9 feat: 새로운 안전 규칙 및 최적화 적용을 통한 트레이딩 시스템 개선
변경 사항 (Changes):

구문 오류(Syntax error) 및 토큰 낭비를 방지하기 위해 에이전트 쉘(Agent shell)과 파이썬 코드 스니펫에 다수의 신규 안전 규칙(Safety rules)을 추가함.

스키마 검증 및 적절한 SQL 포맷팅을 보장하기 위해 임시(Ad-hoc) 데이터베이스 쿼리 작성 가이드라인을 도입함.

코드 수정 후 UI 기능이 정상 작동하는지 확인하기 위해, 백테스트 웹 서비스 재시작 및 브라우저 검증에 대한 새로운 규칙을 구현함.

시스템 전반의 무결성(Integrity)을 유지하기 위해 실전 매매(Live trading), 웹 백테스팅, 파라미터 탐색(Parameter searches) 간의 일관성 검사(Consistency checks) 체계를 확립함.

기대 효과 (Impact):

이러한 개선 사항들은 트레이딩 시스템의 견고성(Robustness)과 신뢰성을 향상시키며, 에러 발생을 최소화하고 다양한 시스템 컴포넌트 간의 원활한 상호작용을 보장함.
2026-07-17 01:09:09 +09:00

123 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.
# 돌파 실매↔백테 괴리 Q&A (2026-07-16 기준)
> **패치 적용 완료 (2026-07-17).** 실매 봇은 재시작하지 않음. 백테 웹만 재시작.
---
## 1번 — 웜업 넣으면 되나?
**네 → 적용됨.**
- env: `BREAKOUT_BACKTEST_CANDLE_WARMUP_BARS` (기본 **50**, DB 시드)
- `prepend_breakout_candle_warmup` — 기간 시작 전 1분봉 prepend
- 포트폴리오 `all_times``_backtest_period_start_key` 이후만 (전일 시계 오염 방지)
- 모멘텀 `MOMENTUM_BACKTEST_CANDLE_WARMUP_BARS`와 동일 계열
---
## 2번 — 유니버스 sticky/grace
**실매 따라가기 → 적용됨.**
### 동작
- 공통 `resolve_universe_exit_debounce_sec()` → 기본값 = `CONDITION_EXIT_GRACE_SEC`(운영 **120**)
- 돌파/꼬리/모멘텀 타임라인 `debounce_sec`에 연결
- 전략별 오버라이드: `BREAKOUT_UNIVERSE_EXIT_DEBOUNCE_SEC` / `TAIL_*` / `MOMENTUM_*` (있으면 우선, `0`=OFF)
### 09:07 1종 스냅샷 점검 결과
| event_time | n |
|---|---|
| 03:16 | 22 |
| 09:07 | **1** (248170만) |
| 09:11 | 2 |
- history는 **effective 유니버스 저장** 설계 → 09:07에 1종이면 그 tick의 live effective도 1종으로 보는 게 맞음 (저장이 grace를 빼먹은 버그로 단정하지 않음). 새벽 스냅샷 후 장초 첫 변동·콜드스타트 가능성이 큼.
- 디바운스 ON 시: 09:07 스냅샷에서도 overnight 종목을 **120초** 유지 → 09:11(약 4분 후)에는 신규 스냅샷 기준으로 정리. 실매 EXIT grace와 같은 전환 규칙.
### 영향 범위
- **백테 유니버스 재생** (돌파·꼬리·모멘텀 등 타임라인 사용 전략). 실매 주문 로직 자체는 변경 없음.
- 망가뜨리는 패치가 아니라 **실매 grace 정합** 쪽. 백테 거래수/PnL은 실매에 가까워지도록 **바뀔 수 있음**.
---
## 3번 — 슬롯 늘려서 테스트
**사용자 검증용 (코드 변경 없음).** 총한도/동시보유↑로 슬롯 경쟁 효과 확인.
---
## 4번 — 미청산 flatten / EOD
**적용됨 (돌파·모멘텀·RANGE_BREAK).**
- 공통 `flatten_remaining_portfolio_trades` — 루프 끝 미청산을 **마지막 확정봉 종가**로 장부 기록
- `eod_enabled``sell_reason=eod`, 아니면 `bt_flatten`
- skip_stats: `bt_flatten_count`
- 모멘텀: 웜업은 기존, **flatten은 이번에 추가** (이전 “미완” 해소)
---
## (부수) invest_cap 이중 % 스케일
**적용됨 (돌파·RANGE_BREAK).**
- `_resolve_breakout_sl_pct_ui`: `stop_loss_pct`(비율) → UI% ; `sl_pct`만 있으면 UI%/비율 자동 판별
- `breakout_invest_amount_krw`**UI% 한 번만** 전달 (×100 이중 제거)
---
## 패치 상태
| 순위 | 항목 | 상태 |
|------|------|------|
| 1 | 돌파 백테 **전일 봉 웜업** | **완료** |
| 2 | 유니버스 **sticky/grace 디바운스** + 09:07 점검 | **완료** |
| 3 | 슬롯/한도 검증용 백테 | 사용자 |
| 4 | 백테 종료 **미청산 flatten** | **완료** (돌파·모멘텀·레인지) |
| 부수 | `invest_cap` `%` 이중 스케일 | **완료** |
---
## 관련 파일
- 웜업·디바운스: `kis_trader/backtest/breakout_backtest_common.py`
- 공통 디바운스: `kis_trader/backtest/universe_timeline.py` (`resolve_universe_exit_debounce_sec`)
- flatten: `kis_trader/backtest/backtest_portfolio_common.py`
- 포트폴리오: `breakout_portfolio_backtest.py`, `momentum_portfolio_backtest.py`, `range_break_portfolio_backtest.py`
- 꼬리 디바운스: `tail_backtest_common.py`
- env 키: `database.py` (`BREAKOUT_BACKTEST_CANDLE_WARMUP_BARS` 등)
---
## 검증
- `py_compile` OK
- 스모크: debounce(03:16→09:07 유지→09:11 정리) / invest_cap(30만) / flatten(`eod`) → `SMOKE_OK`
- DB: `BREAKOUT_BACKTEST_CANDLE_WARMUP_BARS=50` 시드, config 컬럼 추가
- `kis_backtest_web.service` 재시작 (`active` + HTTP 200)
- 브라우저: `http://192.168.0.149:5050/`**돌파매매 백테스트** 탭 클릭, 폼·「백테스트 실행」버튼 정상 표시
### 잔여 / 다음 확인
| 순위 | 항목 | 상태 |
|------|------|------|
| 다음 | **2번 검증** — 장초 이노테나·한울: 실매 RAM/틱 vs DB 확정봉 `직전봉약세` 가설 검증 (후보, 미확정) | **다음 순서** |
| 후보 | 1번 A — 마지막 봉 경과 시 포트폴리오 루프에서 **즉시** 슬롯 해제 (전 전략 공통) | 대기 — 저유동은 C로도 분 생성 불가 시 필요 |
| 진행 | **1번 C — 판 뒤 1회 REST 백필** | **적용** (아래) |
| — | 3번 슬롯 경쟁 | 패스 |
### 1번 C 적용 (2026-07-17)
- 모듈: `kis_trader/engine/post_sell_candle_backfill.py`
- 실매 훅: `order_manager._finalize_sell_fill` → 매도 후 **비동기 1회** (시세=키움 **실키**)
- env: `POST_SELL_CANDLE_BACKFILL` (기본 true), `POST_SELL_CANDLE_ROLLUP_3M`, sleep 1~3초
- 즉시 백필 CLI: `scripts/backfill_trade_candles.py --like '2026-07-16%'`
- 로그: `/tmp/backfill_trade_candles_0716c.log` (및 선행 0716b)
- 한계: 거래 자체가 없는 분(저유동)은 REST에도 없음 → **C만으로는 완전 메꿈 불가**, A 보완 여지
- 웹 돌파 **2026-07-16** 재백테 ↔ 실매 비교는 C 반영 후 / 2번 검증과 병행
- 실매 봇: post-sell 훅 반영하려면 **재시작 필요** (백필 CLI는 봇 없이 완료 가능)