#!/bin/bash # 4전략 Optuna 5거래일(2026-07-21~27) 순차 + --apply-best # 거래일: 21,22,23,24,27 (토·일 제외) # mode=tpe · trials=200 · 호가 OFF · SKIP_HTS 건드리지 않음(실매/기본 false) # # nohup bash scripts/run_optuna_4strat_5d_apply_20260721_27.sh \ # >> logs/optuna_4strat_5d_apply_nohup.out 2>&1 & # tail -f "$(cat logs/optuna_4strat_5d_apply_latest_master.logpath)" # # 완료 후 실매 봇 재시작(DB 파람 로드). 서버는 켜 둔 채 PC만 꺼도 됨. set -euo pipefail cd /home/hoon/kis_bot mkdir -p logs kis_trader/backtest/results START="${START:-2026-07-21}" END="${END:-2026-07-27}" MODE="${MODE:-tpe}" TRIALS="${TRIALS:-200}" MIN_TRADES="${MIN_TRADES:-1}" MIN_WIN_RATE="${MIN_WIN_RATE:-0}" MIN_PF="${MIN_PF:-0}" STRATEGIES="${STRATEGIES:-scalp momentum breakout tail}" PY="${PY:-}" if [[ -z "$PY" ]]; then if [[ -x .venv/bin/python ]]; then PY=".venv/bin/python" else PY="python3" fi fi RESTART_BOT="${RESTART_BOT:-1}" TS0="$(date +%Y%m%d_%H%M%S)" MASTER="logs/optuna_4strat_5d_apply_${START//-/}_${END//-/}_${TS0}_master.log" { echo "======== Optuna 4전략 5일+apply-best 시작 $(date -Is) ========" echo "START=$START END=$END (거래일 5: 21~24,27)" echo "MODE=$MODE TRIALS=$TRIALS STRATEGIES=$STRATEGIES" echo "apply-best=ON orderbook=off n_jobs=1 RESTART_BOT=$RESTART_BOT" echo "PY=$PY" echo "master_log=$MASTER" free -h | sed -n '1,2p' df -h / | tail -1 } | tee -a "$MASTER" echo "$MASTER" > logs/optuna_4strat_5d_apply_latest_master.logpath run_one() { local strat="$1" local ts study log sort_by ts="$(date +%Y%m%d_%H%M%S)" study="${strat}_${MODE}_5d_apply_${START//-/}_${END//-/}_${ts}" log="logs/optuna_${strat}_${MODE}_5d_apply_${ts}.log" sort_by="pnl" case "$strat" in momentum|us_momentum|scalp) sort_by="score" ;; esac { echo "" echo "-------- [$strat] START $(date -Is) study=$study --------" echo "LOG=$log" } | tee -a "$MASTER" echo "$log" > "logs/optuna_${strat}_5d_apply_latest.logpath" echo "$study" > "logs/optuna_${strat}_5d_apply_latest.study" set +e "$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" \ --sort-by "$sort_by" \ --orderbook-filter off \ --no-progress \ --n-jobs 1 \ --study-name "$study" \ --apply-best \ >"$log" 2>&1 local rc=$? set -e { echo "-------- [$strat] END rc=$rc $(date -Is) --------" if [[ "$rc" -ne 0 ]]; then echo "⚠️ [$strat] 실패 rc=$rc — 다음 전략 계속. tail: $log" else echo "✅ [$strat] 완료(+apply-best 시도). log=$log" fi grep -E 'OPTUNA_RESULT_JSON=|OPTUNA_BRIEFING_MD=|Best trial|optuna_best|apply-best|DB 적용|env_config|스킵|gated|Traceback|KeyError' "$log" | tail -n 30 || true free -h | sed -n '2p' } | tee -a "$MASTER" return 0 } for s in $STRATEGIES; do run_one "$s" done { echo "" echo "======== ALL DONE $(date -Is) ========" echo "JSON/briefing: kis_trader/backtest/results/optuna_*_tpe_*5d* 또는 로그의 OPTUNA_RESULT_JSON=" echo "개별 로그: logs/optuna_*_5d_apply_*.log" } | tee -a "$MASTER" if [[ "$RESTART_BOT" == "1" ]]; then { echo "$(date -Is) 실매 봇 재시작 (적용 파람 로드)..." sudo systemctl restart kis_trader_main.service sleep 2 systemctl is-active kis_trader_main.service || true } | tee -a "$MASTER" fi echo "$(date -Is) script exit 0" | tee -a "$MASTER"