#!/bin/bash # ============================================ # sanguo_vnpy 端到端全自动化 CI/CD 回测 # 作者:姜维 伯约 # 日期:2026年3月28日 # ============================================ set -e # 配置信息 NAS_IP="192.168.2.154" NAS_USER="admin" SANGUO_PROJECT_DIR="/Users/chufeng/.openclaw/sanguo_projects/sanguo_quant_live" NAS_TARGET_DIR="/volume1/stock/sanguo_vnpy" DOCKER_CONTAINER_NAME="sanguo_vnpy" # 说明: # 这个方案会同步整个 sanguo_quant_live 项目,包括: # - strategies/ 所有策略 # - sanguo_vnpy/ 框架代码(包括修改后的vnpy) # - jiangwei-platform/ 三国量化实战项目 # - pangtong-value/ 价值投资研究 # - 所有其他模块 # 颜色 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' log_info() { echo -e "${GREEN}[INFO]${NC} $1" } log_warn() { echo -e "${YELLOW}[WARN]${NC} $1" } log_error() { echo -e "${RED}[ERROR]${NC} $1" } # 步骤 1: 拉取最新代码 pull_latest_code() { log_info "步骤 1/6: 拉取最新代码" cd "$SANGUO_PROJECT_DIR" if git pull origin main; then log_info "✅ 代码已更新到最新版本" return 0 else log_error "❌ 拉取代码失败" return 1 fi } # 步骤 2: 同步所有文件到 NAS sync_to_nas() { log_info "步骤 2/6: 同步所有文件到 NAS" # 确保目标目录存在 ssh "$NAS_USER@$NAS_IP" "mkdir -p $NAS_TARGET_DIR" # 使用 rsync 同步所有文件(包括策略和框架代码) # 会同步整个 sanguo_quant_live 项目,包括: # - strategies/ 所有策略 # - sanguo_vnpy/ 框架代码(包括您修改后的 vnpy) # - jiangwei-platform/ 三国量化实战 # - pangtong-value/ 价值投资研究 # - 所有其他模块 rsync -av --delete \ "$SANGUO_PROJECT_DIR"/ \ "$NAS_USER@$NAS_IP:$NAS_TARGET_DIR"/ \ --exclude='.git' \ --exclude='__pycache__' \ --exclude='*.log' \ --exclude='*.pyc' \ --exclude='.ipynb_checkpoints' \ --exclude='backtest_results/*.png' \ --exclude='.DS_Store' log_info "✅ 文件同步完成" } # 步骤 3: 重建 Docker 容器 rebuild_docker() { log_info "步骤 3/6: 重建 Docker 容器" ssh "$NAS_USER@$NAS_IP" << 'EOF' cd /volume1/stock/sanguo_vnpy # 停止并删除旧容器 if docker ps -a | grep -q sanguo_vnpy; then docker stop sanguo_vnpy docker rm sanguo_vnpy fi # 构建新镜像 docker-compose build --no-cache # 启动新容器 docker-compose up -d # 等待容器启动 sleep 10 # 检查容器状态 if docker ps | grep -q sanguo_vnpy; then echo "✅ 容器启动成功" else echo "❌ 容器启动失败" exit 1 fi EOF if [ $? -eq 0 ]; then log_info "✅ Docker 容器重建完成" return 0 else log_error "❌ Docker 容器重建失败" return 1 fi } # 步骤 4: 运行自动化回测 run_backtest() { log_info "步骤 4/6: 运行自动化回测" ssh "$NAS_USER@$NAS_IP" << 'EOF' cd /volume1/stock/sanguo_vnpy/scripts # 运行全自动化回测 ./run_backtest_auto.sh EOF if [ $? -eq -ne 0 ]; then log_warn "回测运行中,请等待完成..." fi log_info "✅ 回测已启动" } # 步骤 5: 获取结果 get_results() { log_info "步骤 5/6: 获取回测结果" # 创建本地结果目录 mkdir -p "./backtest_results" # 下载最新结果 rsync -av --delete \ "$NAS_USER@$NAS_IP:$NAS_TARGET_DIR/backtest_results/"* \ "./backtest_results"/ log_info "✅ 结果已下载到本地: ./backtest_results/" # 显示最新结果 LATEST_RESULT=$(ls -t ./backtest_results/*.txt | head -1) if [ -f "$LATEST_RESULT" ]; then echo "" echo "============================================" echo " 📊 最新回测结果" echo "============================================" echo "" cat "$LATEST_RESULT" echo "" echo "============================================" fi } # 步骤 6: 完成通知 finish() { log_info "步骤 6/6: 完成!" echo "" echo "╔═════════════════════════════════════════════════════════════════╗" echo "║ 🎉 端到端自动化回测完成! ║" echo "╚═════════════════════════════════════════════════════════════════╝" echo "" echo "📍 结果位置:" echo " NAS: $NAS_TARGET_DIR/backtest_results/" echo " 本地: ./backtest_results/" echo "" echo "🚀 下次更新代码后,直接运行 ./sanguo_nas_ci_cd.sh 就能全自动完成!" echo "" } # 主函数 main() { echo "============================================" echo " sanguo_vnpy 端到端全自动化回测" echo "============================================" echo "" pull_latest_code && \ sync_to_nas && \ rebuild_docker && \ run_backtest && \ get_results && \ finish echo "" } # 运行 main