feat: 새로운 안전 규칙 및 최적화 적용을 통한 트레이딩 시스템 개선
변경 사항 (Changes): 구문 오류(Syntax error) 및 토큰 낭비를 방지하기 위해 에이전트 쉘(Agent shell)과 파이썬 코드 스니펫에 다수의 신규 안전 규칙(Safety rules)을 추가함. 스키마 검증 및 적절한 SQL 포맷팅을 보장하기 위해 임시(Ad-hoc) 데이터베이스 쿼리 작성 가이드라인을 도입함. 코드 수정 후 UI 기능이 정상 작동하는지 확인하기 위해, 백테스트 웹 서비스 재시작 및 브라우저 검증에 대한 새로운 규칙을 구현함. 시스템 전반의 무결성(Integrity)을 유지하기 위해 실전 매매(Live trading), 웹 백테스팅, 파라미터 탐색(Parameter searches) 간의 일관성 검사(Consistency checks) 체계를 확립함. 기대 효과 (Impact): 이러한 개선 사항들은 트레이딩 시스템의 견고성(Robustness)과 신뢰성을 향상시키며, 에러 발생을 최소화하고 다양한 시스템 컴포넌트 간의 원활한 상호작용을 보장함.
This commit is contained in:
122
docs/BREAKOUT_LIVE_BT_QA.md
Normal file
122
docs/BREAKOUT_LIVE_BT_QA.md
Normal file
@@ -0,0 +1,122 @@
|
||||
# 돌파 실매↔백테 괴리 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는 봇 없이 완료 가능)
|
||||
Reference in New Issue
Block a user