209 lines
5.3 KiB
Bash
Executable File
209 lines
5.3 KiB
Bash
Executable File
#!/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
|