量化策略回测平台 - 基于 FastAPI + React 的完整前后端分离架构
本项目是一个量化交易策略回测平台,支持:
- 策略管理:创建、编辑、删除量化交易策略
- 技术指标:支持 SMA、EMA、RSI、MACD 等多种技术指标
- 信号规则:可视化配置交易信号(买入/卖出条件)
- 风险管理:设置止损、止盈、仓位控制等风控参数
- 回测引擎:基于历史数据执行策略回测
- 结果分析:收益率、夏普比率、最大回撤等指标展示
- FastAPI: 高性能异步 Web 框架
- Pydantic: 数据验证和序列化
- SQLAlchemy + SQLite: 持久化存储
- numexpr: 安全表达式评估(替代 eval)
- Python 3.11+: 运行环境
- React 18: UI 框架
- Vite: 构建工具
- Ant Design: 组件库(迁移中)
- Axios: HTTP 客户端
quant-backtest-platform/
├── backend/ # 后端服务
│ ├── app/
│ │ ├── api/ # API 路由
│ │ ├── core/ # 核心配置
│ │ ├── data/ # 数据服务
│ │ │ └── sources/ # 数据源(mock / akshare)
│ │ ├── models/ # Pydantic 数据模型
│ │ ├── services/ # 业务逻辑(回测引擎)
│ │ └── storage.py # SQLite 持久化
│ ├── requirements.txt
│ └── venv/
├── frontend/ # 前端应用
│ ├── src/
│ │ ├── components/ # React 组件
│ │ ├── pages/ # 页面组件
│ │ ├── services/ # API 服务
│ │ ├── App.jsx
│ │ └── main.jsx
│ ├── package.json
│ └── vite.config.js
├── docs/ # 开发文档
└── start.sh # 启动脚本
- Python 3.11+
- Node.js 18+
- npm 或 yarn
cd backend
python3.11 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
# 开发模式
uvicorn app.main:app --host 127.0.0.1 --port 8000 --reload
# 生产模式
uvicorn app.main:app --host 127.0.0.1 --port 8000 --workers 4cd frontend
npm install
npm run dev前端默认运行在 http://localhost:8080
./start.sh启动后端后访问:http://localhost:8000/docs
| 方法 | 路径 | 描述 |
|---|---|---|
| GET | /health | 健康检查 |
| GET | /api/v1/strategies/ | 获取策略列表 |
| POST | /api/v1/strategies/ | 创建策略 |
| GET | /api/v1/strategies/{id} | 获取策略详情 |
| PUT | /api/v1/strategies/{id} | 更新策略 |
| DELETE | /api/v1/strategies/{id} | 删除策略 |
| POST | /api/v1/strategies/{id}/backtest | 运行回测 |
| GET | /api/v1/strategies/{id}/backtests | 获取策略回测历史 |
| GET | /api/v1/backtests/ | 获取所有回测历史 |
| GET | /api/v1/backtests/{id} | 获取回测详情 |
| GET | /api/v1/backtests/{id}/chart-data | 获取回测图表数据 |
{
"id": "string",
"name": "string",
"description": "string",
"category": "trend|mean_reversion|momentum|custom",
"tags": ["string"],
"indicators": [
{"name": "ma5", "type": "sma", "period": 5}
],
"signals": [
{"name": "金叉", "condition": "close > ma5", "action": "buy", "weight": 1.0}
],
"risk_management": {
"max_position": 0.9,
"max_position_per_stock": 0.3,
"stop_loss": 0.05,
"take_profit": 0.1
},
"created_at": "datetime",
"updated_at": "datetime"
}{
"strategy_id": "string",
"universe": ["000001.SZ", "000002.SZ"],
"start_date": "2024-01-01",
"end_date": "2024-12-31",
"initial_capital": 100000,
"data_source": "mock|akshare",
"commission_rate": 0.0003,
"slippage": 0.001
}{
"id": "string",
"strategy_id": "string",
"strategy_name": "string",
"config": {...},
"metrics": {
"total_return": 0.0953,
"annual_return": 0.0953,
"sharpe_ratio": 0.59,
"max_drawdown": -0.0842,
"volatility": 0.15,
"win_rate": 0.52,
"total_trades": 52,
"winning_trades": 27,
"losing_trades": 25
},
"trades": [...],
"daily_values": [...]
}| 类型 | 说明 |
|---|---|
| sma | 简单移动平均 |
| ema | 指数移动平均 |
| rsi | 相对强弱指数(含除零保护) |
| macd | 移动平均收敛发散(规划中) |
| bollinger | 布林带(规划中) |
信号条件使用安全的表达式语法,由 numexpr 执行:
- 数学运算:
+,-,*,/,** - 比较运算:
>,<,>=,<=,==,!= - 逻辑运算:
and,or,not - 括号优先级
示例:
close > ma5 and close > ma20
pct_change > 1.5
rsi_14 < 30
在 backend/app/services/backtest.py 的 _calculate_indicators 方法中添加:
elif ind.type == 'your_indicator':
df[ind.name] = ... # 计算逻辑在 backend/app/data/sources/ 目录下创建新的数据源类,实现 get_daily_data 方法。
- 开发阶段服务监听
127.0.0.1,通过 SSH 隧道访问 - 信号条件使用 numexpr 评估,防止代码注入
- RSI 指标含除零保护
- 生产环境建议配置反向代理(Nginx)+ HTTPS
- 添加身份认证和授权
详细的技术决策、问题追踪、API 设计见 docs/DEVELOPMENT.md
MIT License