91 lines
4.0 KiB
Bash
Executable File
91 lines
4.0 KiB
Bash
Executable File
#!/bin/bash
|
|
# =============================================================================
|
|
# run_optuna_today_afternoon.sh
|
|
# 웹 UI 잡 트래킹에 표시되도록 curl API를 통해 Optuna 실행
|
|
# 순서: 메인 TPE (4전략 순차) → 호가 후처리 → 휩쏘 후처리
|
|
# =============================================================================
|
|
set -e
|
|
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
|
|
cd "$ROOT"
|
|
PY=".venv/bin/python3"
|
|
WEB="http://192.168.0.149:5050"
|
|
|
|
# 가장 최근 거래일 자동 계산
|
|
LAST_TRADE=$(python3 -c "
|
|
from datetime import date, timedelta
|
|
import sys
|
|
d = date.today()
|
|
for _ in range(7):
|
|
d -= timedelta(days=1)
|
|
if d.weekday() < 5:
|
|
print(d.strftime('%Y-%m-%d'))
|
|
sys.exit(0)
|
|
")
|
|
echo "최근 거래일: $LAST_TRADE"
|
|
mkdir -p logs
|
|
|
|
echo "================================================================="
|
|
echo " KIS Optuna 순차 실행 — 웹 API 방식 (프로그레스바 표시됨)"
|
|
echo " 날짜: $LAST_TRADE | 시작: $(date +%H:%M:%S)"
|
|
echo " 순서: 메인 TPE → 호가 후처리 → 휩쏘(호가 종속)"
|
|
echo "================================================================="
|
|
|
|
# ─── STEP 1: 메인 TPE (4전략 순차 — 웹 API로 실행) ─────────────────
|
|
echo ""
|
|
echo "[STEP 1] 메인 TPE 탐색 (4전략 순차) — $(date +%H:%M:%S)"
|
|
echo " ※ 웹 UI 프로그레스바 및 잡 목록에 표시됩니다"
|
|
|
|
RESP=$(curl -s -X POST "$WEB/api/optuna/start" \
|
|
-H "Content-Type: application/json" \
|
|
-d "{\"strategies\":[\"momentum\",\"breakout\",\"scalp\",\"tail\"],\"start\":\"$LAST_TRADE\",\"end\":\"$LAST_TRADE\",\"trials\":200,\"mode\":\"fast\"}")
|
|
echo " API 응답: $RESP"
|
|
|
|
JOB_ID=$(echo "$RESP" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('job',{}).get('job_id',''))" 2>/dev/null || echo "")
|
|
if [ -z "$JOB_ID" ]; then
|
|
echo " ❌ 잡 시작 실패. 응답: $RESP"
|
|
exit 1
|
|
fi
|
|
echo " ✅ 잡 시작: job_id=$JOB_ID"
|
|
|
|
# 완료 대기 폴링 (30초 간격)
|
|
echo " ⏳ 완료 대기 중 (웹 UI에서 진행률 확인 가능) ..."
|
|
while true; do
|
|
STATUS=$(curl -s "$WEB/api/optuna/status/$JOB_ID" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('status',''))" 2>/dev/null || echo "unknown")
|
|
echo " $(date +%H:%M:%S) status=$STATUS"
|
|
if [ "$STATUS" = "done" ] || [ "$STATUS" = "error" ]; then
|
|
break
|
|
fi
|
|
sleep 30
|
|
done
|
|
echo "🏁 [STEP 1] 메인 TPE 완료 (status=$STATUS) — $(date +%H:%M:%S)"
|
|
|
|
# ─── STEP 2: 호가 후처리 (직접 실행 허용) ────────────────────────────
|
|
echo ""
|
|
echo "[STEP 2] 호가 필터 후처리 — $(date +%H:%M:%S)"
|
|
for strat in MOMENTUM BREAKOUT SCALP TAIL; do
|
|
echo "▶ [호가] $strat — $(date +%H:%M:%S)"
|
|
$PY scripts/apply_optuna_ob_consensus.py --strategy "$strat" --n-trials 1000
|
|
echo "✅ [호가] $strat 완료"
|
|
done
|
|
echo "🏁 [STEP 2] 완료 — $(date +%H:%M:%S)"
|
|
|
|
# ─── STEP 3: 휩쏘 후처리 (호가 종속 체인, 직접 실행 허용) ─────────────
|
|
echo ""
|
|
echo "[STEP 3] 휩쏘 필터 후처리 (호가 통과건 기반) — $(date +%H:%M:%S)"
|
|
echo " ※ TAIL/BREAKOUT은 UI 참고용 — DB 미적용"
|
|
for strat in MOMENTUM BREAKOUT SCALP TAIL; do
|
|
echo "▶ [휩쏘] $strat — $(date +%H:%M:%S)"
|
|
$PY scripts/apply_optuna_whipsaw_consensus.py --strategy "$strat" --n-trials 500
|
|
echo "✅ [휩쏘] $strat 완료"
|
|
done
|
|
echo "🏁 [STEP 3] 완료 — $(date +%H:%M:%S)"
|
|
|
|
# ─── 웹 재시작 ──────────────────────────────────────────────────────
|
|
echo ""
|
|
echo "🔄 웹 서비스 재시작..."
|
|
sudo systemctl restart kis_backtest_web.service
|
|
echo "================================================================="
|
|
echo " 전체 완료! — $(date +%H:%M:%S)"
|
|
echo " 확인: $WEB/ → Optuna 탭"
|
|
echo "================================================================="
|