claude_dev 65021bd32c fix(factor): tears iframe 渲染——patch GridFigure.close 收集 figure 生成 HTML
alphalens-reloaded create_full_tear_sheet 内部每个 tear sheet 末尾调
GridFigure.close()→plt.close(fig),Agg 后端下 figure 被销毁,plt.savefig
只能拿到最后一个空占位 figure(实证 2.3KB 空 PNG);原代码 savefig 存
.png 却把 report_paths 记成 .html,report endpoint os.path.exists 失败
返回 404,iframe 加载空白(回退到 SPA 首页标题)。

monkey-patch GridFigure.close 收集 figure 而非销毁(同 empyrical/demean
适配思路,不改 alphalens 源码),跑完把所有 figure savefig 成 base64 嵌入
真 HTML 文件,report_paths 指向该 html。

浏览器端到端验证(VPS factor_2d01a718):report endpoint 404→200,iframe
渲染 4 张 tearsheet 图(returns/information/turnover/quantile table,2.4MB),
naturalWidth>0 确认非 broken,console 无报错。
2026-07-17 14:38:03 +08:00

Sanguo VeighNa 量化交易平台 v2.0

基于 VeighNa 4.4.0 的二次开发量化交易平台,支持 Web 界面和 Docker 容器化部署。

特性

  • 🚀 基于 VeighNa 4.4.0 - 最新稳定版本
  • 🌐 Web 界面 - FastAPI + WebSocket 实时数据推送
  • 🐳 Docker 部署 - 支持 Synology NAS 等容器环境
  • 📊 完整功能 - 行情订阅、交易下单、策略管理
  • 🔐 安全认证 - JWT Token 认证机制
  • 📡 实时推送 - WebSocket 行情、成交、持仓实时更新

项目结构

sanguo_vnpy_v2/
├── vnpy_v4.4.0/              # VeighNa 上游源码
├── sanguo_trader/             # 核心交易模块
├── sanguo_research/           # 量化投研模块
├── sanguo_data/               # 数据管理模块
├── sanguo_common/             # 公共模块
├── sanguo_web/                # Web 服务模块
│   ├── api/                   # REST API
│   ├── websocket/             # WebSocket 服务
│   └── services/              # 业务服务
├── docker/                    # Docker 配置
│   ├── Dockerfile             # 镜像构建
│   ├── docker-compose.yml     # 容器编排
│   ├── entrypoint.sh          # 启动脚本
│   └── deploy-synology.sh     # NAS 部署脚本
├── tests/                     # 测试代码
├── docs/                      # 文档
└── examples/                  # 示例代码

快速开始

方式 1: Docker 部署(推荐)

本地开发

# 构建镜像
cd docker
docker-compose build

# 启动服务
docker-compose up -d

# 访问 Web 界面
open http://localhost:8000

Synology NAS 部署

  1. 开启 SSH 服务
  2. 上传部署包到 NAS
  3. 运行部署脚本:
cd /volume1/docker/containers/sanguo_vnpy_v2/docker
sudo bash deploy-synology.sh

详细说明请参考 Synology NAS 部署指南

方式 2: 本地开发

环境要求

  • Python 3.10+
  • 推荐 Python 3.13

安装步骤

# 创建虚拟环境
python -m venv venv
source venv/bin/activate  # Linux/Mac
# venv\Scripts\activate   # Windows

# 安装依赖
pip install -r requirements/base.txt

# 启动 Web 服务
python run_web.py

Web 服务启动

# 开发模式(端口 8002
python run_web.py

# 生产模式
uvicorn sanguo_web.api:app --host 0.0.0.0 --port 8000 --workers 2

API 文档

启动服务后访问:

  • Swagger UI: http://localhost:8000/docs
  • ReDoc: http://localhost:8000/redoc

认证

默认登录凭据:

  • 用户名: admin
  • 密码: admin123

⚠️ 重要: 首次登录后请立即修改密码!

WebSocket 连接

// 连接 WebSocket
const ws = new WebSocket('ws://localhost:8080');

// 订阅行情
ws.send(JSON.stringify({
    type: 'subscribe',
    data: { subscription: ['tick', 'order', 'trade'] }
}));

// 接收消息
ws.onmessage = (event) => {
    const message = JSON.parse(event.data);
    console.log('Received:', message);
};

测试

# 运行 API 测试
pytest tests/test_api.py -v

# 运行 WebSocket 测试
python tests/test_websocket.py

# 运行所有测试
pytest tests/ -v

开发指南

详细开发指南请查看:

主要功能模块

1. 认证系统 (/api/v1/auth)

  • 用户登录/登出
  • Token 验证
  • 用户信息获取

2. 网关管理 (/api/v1/gateway)

  • 可用网关列表
  • 网关连接/断开
  • 网关配置管理

3. 行情数据 (/api/v1/market)

  • 实时行情查询
  • 行情订阅/取消订阅
  • 合约信息查询

4. 交易功能 (/api/v1/trading)

  • 账户信息查询
  • 持仓查询
  • 订单管理(下单、撤单)
  • 成交记录查询

5. 策略管理 (/api/v1/strategy)

  • 策略列表
  • 策略启动/停止
  • 策略参数配置

环境变量

主要环境变量(见 docker/.env.example):

# 数据目录
DATA_DIR=/volume1/docker/stock/sanguo_vnpy

# 端口配置
HTTP_PORT=8000
WS_PORT=8080

# 时区
TZ=Asia/Shanghai

# JWT 密钥
JWT_SECRET_KEY=your-secret-key-here

# 数据库
DB_TYPE=sqlite
DB_PATH=/app/data/vnpy.db

分支策略

  • master - 主分支,保持稳定可部署
  • develop - 开发分支,日常开发合并
  • feature/* - 功能分支
  • hotfix/* - 热修复分支

版本历史

查看 CHANGELOG.md

技术栈

  • 后端框架: FastAPI 0.100+
  • WebSocket: websockets 12.0+
  • 数据库: SQLite (可扩展 PostgreSQL)
  • 缓存: Redis 7+
  • 容器: Docker + Docker Compose
  • 认证: JWT (python-jose)
  • 测试: pytest + httpx

许可证

MIT License

致谢

基于 VeighNa 框架开发

联系方式

  • 问题反馈: GitHub Issues
  • 文档: docs/ 目录
S
Description
sanguo_vnpy_v2
Readme 25 MiB
Languages
Jupyter Notebook 90.9%
Python 7.2%
Vue 0.7%
JavaScript 0.4%
HTML 0.2%
Other 0.5%