226 lines
11 KiB
Markdown
226 lines
11 KiB
Markdown
# quanxiel 量化系统 · 完善路线图(ROADMAP)
|
||
|
||
> 编制:小五 | 2026-09-28
|
||
> 定位:在现有「数据导入 + alpha 研究闭环」基础上,补齐 **回测可信度 / 风控 / 归因 / 自动化** 四块地基,打通「研究 → 实盘」。
|
||
|
||
---
|
||
|
||
## 0. 现状定位
|
||
|
||
| 已有 | 位置 |
|
||
|---|---|
|
||
| 数据导入(Tushare / 同花顺)+ 增量 + schema | `quantitative_data/` |
|
||
| 数据加载(DB + 模拟回退) | `alpha/data_loader.py` |
|
||
| 因子研究(注册表 / IC / 分层 / 中性化 / 换手) | `alpha/factors.py` |
|
||
| 策略(信号生成 / 分位 / 组合打分 / 权重) | `alpha/strategy.py` |
|
||
| 事件驱动回测(组合 / 持仓 / 交易成本) | `alpha/backtest.py` |
|
||
| 绩效评估(收益 / 风险 / 报告) | `alpha/evaluation.py` |
|
||
| 7 个策略 notebook | `alpha/*.ipynb` |
|
||
|
||
**结论**:研究闭环已成;「研究 → 实盘」的整条链路基本缺失。缺口见下表。
|
||
|
||
---
|
||
|
||
## 1. 模块矩阵(已有 / 不完整 / 缺失)
|
||
|
||
| 层 | 状态 | 说明 |
|
||
|---|---|---|
|
||
| 数据导入 | ✅ | 行情/财务/基本面/增量 |
|
||
| 数据质检 | ⚠️ | 仅 `check_daily_coverage`,缺系统化 DQ |
|
||
| Point-in-Time | ❌ | 财报未按公告日对齐;无成分股历史快照 |
|
||
| 因子研究 | ✅ | 基础技术+基本面因子 |
|
||
| 风格/风险模型 | ❌ | 无 Barra 类暴露与正交化 |
|
||
| 组合构建 | ⚠️ | 有简单权重,无优化器/约束求解 |
|
||
| 回测引擎 | ⚠️ | 无涨跌停/停牌/T+1/整手/参与率约束 |
|
||
| 风控 | ❌ | 基本空白 |
|
||
| 归因分析 | ❌ | 无 |
|
||
| 稳健性验证 | ❌ | 无 WFO / PBO |
|
||
| 实盘执行 | ❌ | 无交易接口/订单管理/对账 |
|
||
| 工程运维 | ⚠️ | 有导入脚本,无调度/监控 |
|
||
| 报告可视化 | ⚠️ | 有 markdown/df,无自动报告/dashboard |
|
||
|
||
---
|
||
|
||
## 2. P0 — 让研究「可信」(最先做)
|
||
|
||
> 不做这层,回测收益大概率是**假的**(未来函数 + 不可成交 + 无风控)。
|
||
|
||
### P0-1 回测真实性:A 股交易规则引擎
|
||
- **新增** `alpha/market_rules.py`
|
||
- **接口**:
|
||
```python
|
||
class MarketRules:
|
||
"""A股交易规则约束,供回测下单前校验"""
|
||
def can_buy(self, ts_code, date, price) -> bool: ... # 涨停/停牌/次新
|
||
def can_sell(self, ts_code, date, price) -> bool: ... # 跌停/停牌
|
||
def round_lot(self, qty, side) -> int: ... # 100股整手(卖出可零股)
|
||
def max_volume(self, ts_code, date, participation=0.1) -> float: ... # 参与率上限
|
||
def is_tradable(self, ts_code, date) -> bool: ... # 停牌过滤
|
||
```
|
||
- **集成**:`BacktestEngine(config, market_rules=MarketRules(...))`;下单前 `execute()` 走校验
|
||
- **数据依赖**:`daily` 已有 `pre_close/pct_chg`,涨跌停按 ±10%/±20% 阈值 + `stock_basic.market` 判定;停牌用 `vol=0` 或 `trade_cal`
|
||
- **验收**:构造一个"次日涨停买入"用例,断言该笔被拒
|
||
|
||
### P0-2 Point-in-Time(防未来函数)
|
||
- **数据侧** `quantitative_data/schema.sql` 新增表 `index_weight`(成分股历史)
|
||
```sql
|
||
CREATE TABLE index_weight (
|
||
index_code VARCHAR(20), con_code VARCHAR(20),
|
||
trade_date DATE, weight NUMERIC(10,6),
|
||
PRIMARY KEY (index_code, con_code, trade_date));
|
||
```
|
||
- **加载侧** `alpha/data_loader.py` 增加 `as_of` 语义
|
||
```python
|
||
def load_financials(self, fields, start, end, as_of=None):
|
||
"""as_of 非空时,仅取 ann_date <= as_of 的财报(点对点快照)"""
|
||
def load_universe(self, index_code, date) -> list[str]:
|
||
"""取 date 当日在成分列表内的股票(历史成分)"""
|
||
```
|
||
- **验收**:同一财报在公告日前后取到不同值(公告前取不到)
|
||
|
||
### P0-3 风控限额(事前约束)
|
||
- **新增** `alpha/risk/limits.py`
|
||
```python
|
||
class RiskLimits:
|
||
def __init__(self, config: AlphaConfig): ...
|
||
def clamp_weights(self, weights, industry_map) -> pd.Series: ...
|
||
# 单票上限 max_position_pct / 行业上限 / 总仓位
|
||
def check_drawdown_stop(self, nav_curve) -> bool: ... # 回撤熔断
|
||
def risk_budget(self, weights, cov) -> dict: ... # 风险预算/贡献
|
||
```
|
||
- **集成**:回测每期调仓前 `clamp_weights`;净值触发回撤阈值→降仓/清仓
|
||
- **验收**:给定超限组合,输出满足全部限额的权重
|
||
|
||
---
|
||
|
||
## 3. P1 — 提升质量
|
||
|
||
### P1-4 收益归因
|
||
- **新增** `alpha/attribution.py`
|
||
```python
|
||
class BrinsonAttribution:
|
||
def run(self, portfolio_weights, benchmark_weights,
|
||
returns, industry_map) -> pd.DataFrame:
|
||
"""返回 配置/选股/交互 三因子分解"""
|
||
class FactorAttribution:
|
||
def run(self, weights, factor_exposures, factor_returns) -> dict:
|
||
"""因子收益贡献分解"""
|
||
```
|
||
|
||
### P1-5 组合优化器
|
||
- **新增** `alpha/optimizer.py`(依赖 `cvxpy`)
|
||
```python
|
||
class MeanVariance: def solve(self, mu, cov, constraints) -> weights
|
||
class RiskParity: def solve(self, cov) -> weights
|
||
class BlackLitterman: def solve(self, prior, views, ...) -> mu
|
||
# constraints: 行业/风格中性、换手上限、个股上限、多空约束
|
||
```
|
||
- **验收**:约束可行域内求解,权重和=1,满足全部约束
|
||
|
||
### P1-6 稳健性 / 过拟合检验
|
||
- **新增** `alpha/validation.py`
|
||
```python
|
||
class WalkForward: def run(self, strategy_factory, folds) -> pd.DataFrame # 滚动样本外
|
||
def pbo(returns_matrix) -> float # 过拟合概率 (Bailey et al.)
|
||
def deflated_sharpe(returns, n_trials) -> float
|
||
def sensitivity(param_grid, evaluator) -> pd.DataFrame
|
||
```
|
||
|
||
---
|
||
|
||
## 4. P2 — 走向实盘
|
||
|
||
### P2-7 调度 + 监控
|
||
- `ops/daily_pipeline.py`:盘后自动 增量导入 → 信号生成 → 风控 → 报告
|
||
- 调度:群晖 DSM 计划任务 / cron;失败告警走 OpenClaw(webhook)
|
||
- **新增** `ops/monitor.py`:数据到达检测、任务失败、仓位异常
|
||
|
||
### P2-8 实盘执行 + 对账
|
||
- **新增** `execution/`
|
||
```python
|
||
class BrokerAdapter(ABC):
|
||
def place_order(self, order) -> str: ...
|
||
def cancel_order(self, order_id): ...
|
||
def query_position(self) -> pd.DataFrame: ...
|
||
class QmtAdapter(BrokerAdapter): ... # A股 QMT/miniQMT
|
||
class SimAdapter(BrokerAdapter): ... # 仿真盘
|
||
```
|
||
- **对账**:每日 `query_position` vs 内部账本,差异告警
|
||
|
||
### P2-9 报告 + Dashboard
|
||
- **新增** `report/`:自动日报/周报(净值/回撤/持仓/归因/暴露)
|
||
- Dashboard:复用 gemdalepi 静态站点方式,生成净值/回撤/暴露可视化页
|
||
|
||
---
|
||
|
||
## 5. 目录规划(目标)
|
||
|
||
```
|
||
quanxiel/
|
||
├── quantitative_data/ # 数据(现有)+ index_weight
|
||
├── alpha/ # 研究(现有)
|
||
│ ├── market_rules.py # [P0-1] 新增
|
||
│ ├── risk/ # [P0-3] 新增
|
||
│ ├── attribution.py # [P1-4] 新增
|
||
│ ├── optimizer.py # [P1-5] 新增
|
||
│ └── validation.py # [P1-6] 新增
|
||
├── execution/ # [P2-8] 新增
|
||
├── report/ # [P2-9] 新增
|
||
└── ops/ # 运维(现有)+ daily_pipeline.py / monitor.py
|
||
```
|
||
|
||
---
|
||
|
||
## 6. 建议实施顺序
|
||
|
||
1. **P0-1 交易规则** → 2. **P0-2 PIT** → 3. **P0-3 风控限额**
|
||
4. P1-4 归因 → 5. P1-5 优化器 → 6. P1-6 稳健性
|
||
7. P2-7 调度 → 8. P2-8 实盘 → 9. P2-9 报告
|
||
|
||
> 交付节奏建议:每个模块「接口 + 最小实现 + 单测/验收用例」三件套,合入前跑通验收。
|
||
|
||
---
|
||
|
||
## 7. 版本 v1.1 — 书库佐证与增补(2026-09-28)
|
||
|
||
> 依据自家 talebook 书库 8 本量化书交叉验证本路线图,补充以下模块与验收项。
|
||
> 参考书(talebook id):打开量化投资的黑箱(155) · Quantitative Trading, Chan(986) · Python for Algorithmic Trading, Hilpisch(1125) · 主动投资组合管理, Grinold&Kahn(183) · 量化交易之路, 阿布(149) · Python量化交易教程(167) · Quantitative Trading: Algorithms... Guo(983) · 量化投资策略:超额收益Alpha(1202)
|
||
|
||
### 7.1 目标架构对齐「黑箱」六模型
|
||
《黑箱》(155) 给出交易系统标准结构:**Alpha 模型 + 风险模型 + 交易成本模型 → 投资组合构建模型 ↔ 执行模型**(另含 数据 / 研究)。
|
||
|
||
| 黑箱模块 | 本项目对应 | 状态 |
|
||
|---|---|---|
|
||
| Alpha 模型 | `alpha/factors.py` + `alpha/strategy.py` | ✅ |
|
||
| 风险模型 | 需新增 `alpha/risk/risk_model.py`(因子协方差/暴露) | ❌ |
|
||
| 交易成本模型 | `alpha/config.py` 有费率,缺**滑点/市场冲击**模型 | ⚠️ |
|
||
| 组合构建模型 | 有简单权重,缺**优化器** | ⚠️ |
|
||
| 执行模型 | 需新增 `execution/` | ❌ |
|
||
|
||
> 结论:现有目录只覆盖了黑箱 6 模型中的 **Alpha +(半)组合构建**;风险模型、成本模型、执行模型需显式补齐。
|
||
|
||
### 7.2 新增模块(在原 P0/P1/P2 上增补)
|
||
- **P0-4 数据质检细化**(986:数据是否复权/是否 survivorship-bias free)→ 新增 `quantitative_data/dq.py`:①复权口径核对(除权除息) ②幸存者偏差检查(point-in-time 股票池)③高低价数据口径 ④停牌/退市标记
|
||
- **P1-7 资金管理 / 仓位分配**(149 凯利公式;986 Optimal Capital Allocation)→ 新增 `alpha/money_mgmt.py`:Kelly / 固定比例 / 波动率目标;对应"避免重仓"
|
||
- **P1-8 因子处理流水线显式化**(167 优矿 RDP:去极值/中性化/标准化)→ 新增 `alpha/preprocess.py`:`winsorize()` / `zscore()` / `neutralize(industry, size)`,做成可复用管线(`factors.py` 已有部分,建议独立)
|
||
- **P2-10 部署工程化**(1125 副标题即 *From Idea to Cloud Deployment*)→ Docker 化 + 依赖锁定 + CI(单测) + 定时任务容器化
|
||
- **P2-11 纸面交易 / 仿真盘**(986:Paper Trading 是"最终的样本外检验")→ `execution/SimAdapter` + 与回测结果对比报告,**建议提前为 P2 第一项**
|
||
|
||
### 7.3 方法论 / 验收项增补
|
||
- **回测偏差自检清单**(986 第3章 / 1125 第4章):前视偏差 · 数据窥探(data-snooping) · 交易成本 · 幸存者偏差 · 高低价数据 —— 作为回测模块验收 checklist
|
||
- **样本外 + 参数近邻稳定性**(155/149):网格寻优后检查近邻参数结果是否相近;不相近 ⇒ 疑似过拟合
|
||
- **数据挖掘四方针**(183):直觉 · 克制 · 合乎情理 · 样本外测试
|
||
- **IC→Alpha 基本定律**(183 预测基本定理):`α = IC × 波动率 × 标准化信号`,`IR = IC × √广度`;建议在 P1-5 优化器上游加入此转换,用于衡量研究"深度 vs 广度"
|
||
|
||
### 7.4 修订后的实施顺序
|
||
1. **P0-4 数据质检** → 2. P0-1 交易规则 → 3. P0-2 PIT → 4. P0-3 风控
|
||
5. **P1-8 因子管线** → 6. P1-4 归因 → 7. **P1-7 资金管理** → 8. P1-5 优化器 → 9. P1-6 稳健性
|
||
10. **P2-11 仿真盘** → 11. **P2-10 部署工程化** → 12. P2-7 调度监控 → 13. P2-8 实盘 → 14. P2-9 报告
|
||
|
||
### 7.5 主要「新发现」的缺口(原 ROADMAP 未列)
|
||
1. **资金管理/仓位分配**(凯利/波动率目标)—— 原稿完全没有
|
||
2. **交易成本模型细化**到滑点 + 市场冲击(不只费率)
|
||
3. **显式风险模型**(因子协方差/暴露),而非仅在 config 里放限额
|
||
4. **纸面交易**作为回测→实盘之间的强制关卡
|
||
5. **部署工程化**(Docker/CI/云)—— 原稿只在 P2 一句带过
|