Files
quanxiel/docs/ROADMAP.md
T

226 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 一句带过