# 돌파 실매↔백테 괴리 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는 봇 없이 완료 가능)