feat(옵투나·웹): 후처리 재탐색·ob_modes·적용감사·수집통계
- Optuna web jobs/TPE/apply snapshot·틱로더 정합, jobs limit·감사로그 - 백테 UI 호가모드·후보 적용 흐름, feed_collect_stats API/탭 - 가설검증·교차검증 룰, 4전략 스모크·OB slot41 진단 스크립트 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -8,7 +8,7 @@ from collections import defaultdict
|
||||
from datetime import datetime, timedelta
|
||||
from typing import Any, Dict, Iterator, List, Optional, Set, Tuple
|
||||
|
||||
from ..utils.env import get_env_from_db, get_env_int
|
||||
from ..utils.env import get_env_bool, get_env_from_db, get_env_int
|
||||
from ..utils.logger import get_logger
|
||||
|
||||
logger = get_logger("kis_trader.breakout_tick_loader")
|
||||
@@ -266,6 +266,37 @@ def load_breakout_ticks_by_code(
|
||||
)
|
||||
|
||||
if total <= 0:
|
||||
# ws_ticks 비어도 LS 3차만으로 재생 가능 (1·2차 공백일)
|
||||
if mkt != "US" and get_env_bool("BT_TICK_LS_THIRD_FALLBACK", True):
|
||||
try:
|
||||
from kis_trader.backtest.ls_history_loaders import load_ls_ticks_by_code
|
||||
from kis_trader.engine.feed_fallback import merge_ls_ticks_third_fallback
|
||||
|
||||
ls_map, ls_raw = load_ls_ticks_by_code(db, start_key, end_key, codes)
|
||||
if ls_raw > 0:
|
||||
added = merge_ls_ticks_third_fallback(out, ls_map)
|
||||
if added:
|
||||
logger.info(
|
||||
"📌 틱 3차 LS만 로드: ls_raw=%s → kept=%s (ws_ticks 0)",
|
||||
f"{ls_raw:,}",
|
||||
f"{added:,}",
|
||||
)
|
||||
try:
|
||||
from kis_trader.backtest.optuna_feed_trace import log_bt_tick_feed_trace
|
||||
from kis_trader.engine.feed_fallback import live_tick_primary
|
||||
|
||||
log_bt_tick_feed_trace(
|
||||
dict(out),
|
||||
table="ls_ws_ticks",
|
||||
main_src=live_tick_primary(),
|
||||
raw_total=ls_raw,
|
||||
context="틱로드(LS만)",
|
||||
)
|
||||
except Exception:
|
||||
pass
|
||||
return dict(out), int(added)
|
||||
except Exception as e:
|
||||
logger.debug("틱 LS-only 로드 스킵: %s", e)
|
||||
logger.warning(
|
||||
"%s 조회 실패 — OHLC 폴백만 사용: 0건 (failed_days=%s/%s)",
|
||||
table, failed_days, len(chunks),
|
||||
@@ -279,7 +310,11 @@ def load_breakout_ticks_by_code(
|
||||
)
|
||||
|
||||
# 일별 SELECT 에 ORDER BY 없음 → 분봉 버킷 시간순 정렬 (틱 재생 정합)
|
||||
from kis_trader.engine.feed_fallback import live_tick_primary, merge_ticks_time_axis_fallback
|
||||
from kis_trader.engine.feed_fallback import (
|
||||
live_tick_primary,
|
||||
merge_ls_ticks_third_fallback,
|
||||
merge_ticks_time_axis_fallback,
|
||||
)
|
||||
|
||||
main_src = live_tick_primary() if mkt != "US" else "kis"
|
||||
kept = 0
|
||||
@@ -294,12 +329,30 @@ def load_breakout_ticks_by_code(
|
||||
kept += len(ticks)
|
||||
if kept != total:
|
||||
logger.info(
|
||||
"📌 틱 시간축 폴백: raw=%d → kept=%d (같은 초 메인 우선, 메인 lag>2s면 보조)",
|
||||
"📌 틱 시간축 폴백: raw=%d → kept=%d (같은 초 메인 우선, 메인 lag>나이면 보조)",
|
||||
total, kept,
|
||||
)
|
||||
raw_before_merge = total
|
||||
total = kept
|
||||
|
||||
# 실매 3차 LS: 같은 초에 1·2차 없으면 ls_ws_ticks (나이=LIVE_FEED_FALLBACK, 기본 3초)
|
||||
if mkt != "US" and get_env_bool("BT_TICK_LS_THIRD_FALLBACK", True):
|
||||
try:
|
||||
from kis_trader.backtest.ls_history_loaders import load_ls_ticks_by_code
|
||||
|
||||
ls_map, ls_raw = load_ls_ticks_by_code(db, start_key, end_key, codes)
|
||||
if ls_raw > 0:
|
||||
added = merge_ls_ticks_third_fallback(out, ls_map)
|
||||
total += int(added or 0)
|
||||
if added:
|
||||
logger.info(
|
||||
"📌 틱 3차 LS 폴백: ls_raw=%s → +%s초 (메인·2차 빈 초만)",
|
||||
f"{ls_raw:,}",
|
||||
f"{added:,}",
|
||||
)
|
||||
except Exception as e:
|
||||
logger.debug("틱 3차 LS 폴백 스킵: %s", e)
|
||||
|
||||
# 옵투나/백테: 틱 벤더(kis|kiwoom|ls) 비율 — 실매 트리거 피드 추적과 동일 축
|
||||
try:
|
||||
from kis_trader.backtest.optuna_feed_trace import log_bt_tick_feed_trace
|
||||
|
||||
Reference in New Issue
Block a user