feat(backtest): 대대적인 Optuna 백테스트 웹 UI 및 백엔드 파이프라인 개편

- Web UI:
  - Optuna 탭 추가 및 mode_combo (최빈값 조합), 사후합격 Top 10 시각화 기능
  - 파라미터 분포(p25~p75, median, mode) 히스토그램 및 과적합(Overfit) 위험도 진단 UI 신설
  - 체크박스 렌더링 깨짐 현상을 네이티브(appearance: auto)로 강제 복구 (CSS)
  - 다단 트레일링 스탑, 꼬리 진입/돌파 손절 등 고급 조건 설정 폼 UI 고도화

- Backend (Optuna Jobs):
  - CLI 환경에서 구동된 Optuna json 결과물을 웹 대시보드로 읽어오는 import 기능 강화
  - JSON 메타데이터에 sort_by, mode, 호가 적용 여부 등 핵심 파라미터 파싱 누락 수정
  - optuna_mode_combo.py 등 최빈값 조합 및 후보군 2차 검증을 위한 신규 모듈 추가

- DB & Execution:
  - WebSocket 호가/틱 피드 수집 통계(api_feed_collect_stats) 메모리 캐시 최적화
  - KIS client 접속 키(approval_key) 등 인프라스트럭처 안정성 및 공유 관리 구조 개선
  - 테스트 및 디버깅용 briefing 마크다운 자동 생성 기능 추가
This commit is contained in:
Your Name
2026-09-01 02:47:51 +09:00
parent 3d0255519e
commit 9ba9ab73b6
92 changed files with 8211 additions and 487 deletions

View File

@@ -303,6 +303,11 @@ ENV_CONFIG_KEYS = (
"TAIL_LIMIT_VALID_BARS", "TAIL_LIMIT_FILL_SLIP_PCT",
"TAIL_MIN_INVEST_RATIO_OF_SLOT",
"TAIL_PARAM_SEARCH_ENTRY_MODE",
"OPTUNA_MODE_POOL",
"OPTUNA_MODE_TOP_N",
"OPTUNA_MODE_BAND_DECAY_IQR",
"OPTUNA_MODE_REFINE_PHASE2_TRIALS",
"OPTUNA_MODE_REFINE_BAND_EXPAND_IQR",
"TAIL_GRID_FAST_MAX_DAILY_CHG", "TAIL_GRID_COARSE_MAX_DAILY_CHG",
"TAIL_GRID_FAST_SYMBOL_LOSS_PCT", "TAIL_GRID_FAST_SYMBOL_LOSS_KRW",
"TAIL_GRID_FAST_REENTRY_MIN_EDGE",
@@ -830,6 +835,10 @@ ENV_CONFIG_KEYS = (
"PSBL_RVSECNCL_TR_ID",
"PSBL_RVSECNCL_INQR_DVSN_1",
"PSBL_RVSECNCL_INQR_DVSN_2",
"CANCELABLE_CCLD_MAX_PAGES",
"SELL_LOCKED_ENQUEUE_COOLDOWN_SEC",
"CANCELABLE_RECONCILE_ENABLED",
"CANCELABLE_RECONCILE_CANCEL_RETRY",
# 잔고 연속조회 최대 페이지 (1p=실전50/모의20종목) — 보유 많을 때 누락 방지
"BALANCE_MAX_PAGES",
# WebSocket 실시간 가격 캐시 유효기간(초): 이 시간 이상 지나면 REST 재조회
@@ -4519,8 +4528,19 @@ class TradeDB:
return saved
def _insert_env_auth_row(self, snapshot: Dict[str, Any], created_at: str) -> Optional[int]:
"""env_auth_config 1행 INSERT (앱키/시크릿/ID/계좌 전용)."""
"""env_auth_config 1행 INSERT (앱키/시크릿/ID/계좌 전용).
snapshot 에 실제 값이 있는 인증키가 하나도 없으면 빈 행 방지를 위해 INSERT 생략.
"""
try:
# 빈 행 방지 가드: 실제 값을 가진 키가 하나도 없으면 저장 생략
has_any = any(
snapshot.get(k) is not None and str(snapshot.get(k)).strip() != ""
for k in ENV_AUTH_KEYS
)
if not has_any:
logger.debug("env_auth_config INSERT 생략 — snapshot에 인증키 값 없음 (빈 행 방지)")
return None
key_list = ", ".join(f"`{k}`" for k in ENV_AUTH_KEYS)
placeholders = ", ".join(["%s"] * (1 + len(ENV_AUTH_KEYS)))
vals = [created_at] + [snapshot.get(k, None) for k in ENV_AUTH_KEYS]