#!/bin/bash # 중편입·틱가 주입 후 전전략 Optuna 재탐색 + 1위 적용 # 순서: 미장(전역+종목cfg) 우선 → 국장4 (내일용) # 이후: 웹백테 스모크 + 요약 리포트 # # nohup bash scripts/run_optuna_mid_enroll_full_apply.sh >> logs/optuna_mid_enroll_master_nohup.log 2>&1 & # tail -f "$(cat logs/optuna_mid_enroll_latest_master.logpath)" set -euo pipefail cd /home/hoon/kis_bot mkdir -p logs kis_trader/backtest/results START="${START:-2026-07-21}" END="${END:-2026-07-23}" MODE="${MODE:-tpe}" # 미장 22시 전 우선: US는 100, 국장은 200 (필요 시 env 오버라이드) US_TRIALS="${US_TRIALS:-100}" KR_TRIALS="${KR_TRIALS:-200}" MIN_TRADES="${MIN_TRADES:-1}" MIN_WIN_RATE="${MIN_WIN_RATE:-0}" MIN_PF="${MIN_PF:-0}" # 종목 cfg — DB us_momentum_stock_config US_SYMBOLS="${US_SYMBOLS:-QQQM SPCX SPYM TSLA}" PY="${PY:-.venv/bin/python}" TS0="$(date +%Y%m%d_%H%M%S)" MASTER="logs/optuna_mid_enroll_${START}_${END}_${TS0}_master.log" REPORT="logs/optuna_mid_enroll_${START}_${END}_${TS0}_report.txt" { echo "======== mid-enroll/tick Optuna FULL+APPLY $(date -Is) ========" echo "START=$START END=$END MODE=$MODE" echo "US_TRIALS=$US_TRIALS KR_TRIALS=$KR_TRIALS" echo "US_SYMBOLS=$US_SYMBOLS" echo "apply-best=ON (gated 1위, pnl<=0 스킵)" echo "master=$MASTER" free -h | sed -n '1,2p' } | tee -a "$MASTER" echo "$MASTER" > logs/optuna_mid_enroll_latest_master.logpath echo "$REPORT" > logs/optuna_mid_enroll_latest_report.path run_one() { local strat="$1" local trials="$2" local symbol="${3:-}" local ts study log sort_by tag ts="$(date +%Y%m%d_%H%M%S)" tag="$strat" if [[ -n "$symbol" ]]; then tag="${strat}_${symbol}" fi study="${tag}_${MODE}_${START//-/}_${END//-/}_${ts}" log="logs/optuna_${tag}_${MODE}_${ts}.log" sort_by="pnl" case "$strat" in momentum|us_momentum|scalp) sort_by="score" ;; esac { echo "" echo "-------- [$tag] START $(date -Is) study=$study trials=$trials --------" } | tee -a "$MASTER" echo "$log" > "logs/optuna_${tag}_${MODE}_latest.logpath" echo "$study" > "logs/optuna_${tag}_${MODE}_latest.study" set +e local cmd=( "$PY" -u kis_trader/backtest/param_search_optuna.py --strategy "$strat" --mode "$MODE" --start "$START" --end "$END" --trials "$trials" --min_trades "$MIN_TRADES" --min_win_rate "$MIN_WIN_RATE" --min_pf "$MIN_PF" --orderbook-filter off --no-progress --study-name "$study" --sort-by "$sort_by" --apply-best ) if [[ -n "$symbol" ]]; then cmd+=(--symbol "$symbol") fi "${cmd[@]}" >"$log" 2>&1 local rc=$? set -e { echo "-------- [$tag] END rc=$rc $(date -Is) --------" echo "LOG=$log" grep -E 'OPTUNA_RESULT_JSON=|Best trial|apply-best|gated|DB 미적용|❌|KeyError|Traceback' "$log" | tail -n 30 || true } | tee -a "$MASTER" if [[ "$rc" -ne 0 ]]; then echo "⚠️ [$tag] 실패 rc=$rc — 계속" | tee -a "$MASTER" fi return 0 } # ── 1) 미장 전역 + 종목 cfg (22시 오픈 우선) ── run_one us_momentum "$US_TRIALS" for sym in $US_SYMBOLS; do run_one us_momentum "$US_TRIALS" "$sym" done # ── 2) 국장 4전략 (내일) ── for s in momentum tail breakout scalp; do run_one "$s" "$KR_TRIALS" done { echo "" echo "======== Optuna ALL DONE $(date -Is) ========" } | tee -a "$MASTER" # ── 3) 웹백테 스모크(현재 DB) + 요약 ── { echo "" echo "======== POST: web backtest smoke $(date -Is) ========" } | tee -a "$MASTER" set +e "$PY" -u scripts/post_optuna_mid_enroll_verify.py \ --start "$START" --end "$END" \ --report "$REPORT" \ >>"$MASTER" 2>&1 vrc=$? set -e echo "verify_rc=$vrc report=$REPORT" | tee -a "$MASTER" { echo "" echo "======== ALL PIPELINE DONE $(date -Is) ========" echo "master=$MASTER" echo "report=$REPORT" echo "봇 재시작은 verify 스크립트가 필요 시 수행" } | tee -a "$MASTER"