79 lines
2.9 KiB
Bash
Executable File
79 lines
2.9 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# 맥미니에서 전체 학습 파이프라인을 실행하고 LXC로 배포한다.
|
|
# 사용법: bash scripts/train_and_deploy.sh [mlx|lgbm] [wf-splits]
|
|
#
|
|
# 예시:
|
|
# bash scripts/train_and_deploy.sh # LightGBM + Walk-Forward 5폴드 (기본값)
|
|
# bash scripts/train_and_deploy.sh mlx # MLX GPU 학습 + Walk-Forward 5폴드
|
|
# bash scripts/train_and_deploy.sh lgbm 3 # LightGBM + Walk-Forward 3폴드
|
|
# bash scripts/train_and_deploy.sh mlx 0 # MLX 학습만 (Walk-Forward 건너뜀)
|
|
# bash scripts/train_and_deploy.sh lgbm 0 # LightGBM 학습만 (Walk-Forward 건너뜀)
|
|
|
|
set -euo pipefail
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
|
|
|
VENV_PATH="${VENV_PATH:-$PROJECT_ROOT/.venv}"
|
|
if [ -f "$VENV_PATH/bin/activate" ]; then
|
|
# shellcheck source=/dev/null
|
|
source "$VENV_PATH/bin/activate"
|
|
else
|
|
echo "경고: 가상환경을 찾을 수 없습니다 ($VENV_PATH). 시스템 Python을 사용합니다." >&2
|
|
fi
|
|
|
|
BACKEND="${1:-lgbm}"
|
|
WF_SPLITS="${2:-5}" # 두 번째 인자: Walk-Forward 폴드 수 (0이면 건너뜀)
|
|
|
|
cd "$PROJECT_ROOT"
|
|
|
|
echo "=== [1/3] 데이터 수집 (XRP + BTC + ETH 3심볼, 35일치 Upsert + OI/펀딩비) ==="
|
|
# OI/펀딩비 API 제한(30일) + 버퍼 5일 = 35일치 신규 수집 후 기존 parquet에 Upsert
|
|
# 최초 실행 시 data/combined_15m.parquet 없으면 35일치로 시작
|
|
# 이후 매일: 35일치 신규 데이터로 기존 파일의 0.0 구간을 채우고 최신 행 추가
|
|
python scripts/fetch_history.py \
|
|
--symbols XRPUSDT BTCUSDT ETHUSDT \
|
|
--interval 15m \
|
|
--days 35 \
|
|
--output data/combined_15m.parquet
|
|
|
|
echo ""
|
|
echo "=== [2/3] 모델 학습 (23개 피처: XRP 13 + BTC/ETH 8 + OI/펀딩비 2) ==="
|
|
DECAY="${TIME_WEIGHT_DECAY:-2.0}"
|
|
if [ "$BACKEND" = "mlx" ]; then
|
|
echo " 백엔드: MLX (Apple Silicon GPU), decay=${DECAY}"
|
|
python scripts/train_mlx_model.py --data data/combined_15m.parquet --decay "$DECAY"
|
|
else
|
|
echo " 백엔드: LightGBM (CPU), decay=${DECAY}"
|
|
python scripts/train_model.py --data data/combined_15m.parquet --decay "$DECAY"
|
|
fi
|
|
|
|
# Walk-Forward 검증 (WF_SPLITS > 0 인 경우)
|
|
if [ "$WF_SPLITS" -gt 0 ] 2>/dev/null; then
|
|
echo ""
|
|
echo "=== [2.5/3] Walk-Forward 검증 (${WF_SPLITS}폴드) ==="
|
|
if [ "$BACKEND" = "mlx" ]; then
|
|
python scripts/train_mlx_model.py \
|
|
--data data/combined_15m.parquet \
|
|
--decay "$DECAY" \
|
|
--wf \
|
|
--wf-splits "$WF_SPLITS"
|
|
else
|
|
python scripts/train_model.py \
|
|
--data data/combined_15m.parquet \
|
|
--decay "$DECAY" \
|
|
--wf \
|
|
--wf-splits "$WF_SPLITS"
|
|
fi
|
|
fi
|
|
|
|
echo ""
|
|
echo "=== [3/3] LXC 배포 ==="
|
|
bash scripts/deploy_model.sh "$BACKEND"
|
|
|
|
echo ""
|
|
echo "=== 전체 파이프라인 완료 ==="
|
|
echo ""
|
|
echo "봇 재시작이 필요하면:"
|
|
echo " ssh root@10.1.10.24 'cd /root/cointrader && docker compose restart cointrader'"
|