并非机构级 A股量化研究/回测框架:无前视偏差引擎、完整 A股 约束、16+ 绩效指标、因子 IC/IR 验证、walk-forward 样本外验证。 从零构建的个人量化研究项目,代码与结论全部公开,欢迎交流指正。
v1 核心策略:五因子选股组合(低换手 0.40 / 低PB 0.20 / 高股息 0.15 / E-P 0.10 / 低PS 0.10),Top8 双周调仓 + 行业≤3 约束。
v2 因子库扩展(研究候选版):在 v1 骨架上扩展至 19 因子(价值底仓 + 现金流 + 质量 + 低波 + 52周位置),Top20 周频调仓 + 行业≤5。聚宽在线平台实跑结果见下表——累计收益高于 v1,但风险调整后表现平庸(夏普 ~0.12),收益高度集中在 2024 红利大年;高股息因子因线上因子库字段受限,改用 finance.STK_XR_XD 分红表手工计算(10派X元口径除以10)。属于研究候选,不是加仓依据。
| 验证渠道 | 策略 | 区间 | 收益 | 年化 | 最大回撤 | 夏普 |
|---|---|---|---|---|---|---|
| 本地回测 | v1 | 2023-01 ~ 2026-08 | +35.02% | +8.71% | -9.0% | 0.98 |
| 聚宽平台复现 | v1 | 2020-01 ~ 2026-08 | +35.33% | +4.66% | -26.81% | 0.278 |
| 聚宽平台实跑 | v2(19因子) | 2020-01 ~ 2026-08 | +44.90% | +5.92% | -17.45% | 0.121 |
聚宽版覆盖 6.6 年完整周期(本地数据仅 2023 起),两实现交叉验证一致。reference/joinquant/backtest_report.md。
⚠️ 免责声明:本项目为量化研究学习框架,不构成任何投资建议。回测收益不代表未来表现,因子存在失效风险。实盘决策风险自负。
| 类别 | 内容 |
|---|---|
| 无前视 | 信号 T 日收盘产生 → T+1 成交;财报/情绪数据按公告日 T+1 对齐(merge_asof 防未来函数) |
| A股约束 | 涨跌停(涨停买不进/跌停卖不出)、停牌、100 股整手、T+1 |
| 成本模型 | 佣金(万2.5, 最低5元) + 印花税(卖出0.05%) + 过户费(0.001%) + 滑点 |
| 绩效套件 | 16+ 项:夏普/索提诺/卡玛/最大回撤/胜率/盈亏比/换手/alpha/beta/IR |
| 因子验证 | RankIC / ICIR / t 值 / 行业+市值中性化 / 分年 / 相关矩阵(防重复下注) |
| 过拟合防护 | walk-forward 样本外分段验证;模拟盘双组合并行 |
| 工程化 | pytest 123 用例、.env 密钥管理、脚本-库分层、GitHub Actions 就绪 |
# 环境(Python 3.11+)
uv venv .venv && uv pip install -e ".[dev]" -i https://pypi.tuna.tsinghua.edu.cn/simple
cp .env.example .env # 可选:填 TUSHARE_TOKEN(akshare 免 token 可跑)
# 跑测试
.venv\Scripts\python.exe -m pytest
# 单标的回测(MACD 示例)
.venv\Scripts\python.exe scripts\run_backtest.py --symbol 600744.SH --strategy macd
# v1 五因子组合回测(Top8 + 双周 + 行业≤3)
.venv\Scripts\python.exe scripts\run_factor_portfolio.py --top-n 8 --max-per-industry 3 --rebalance biweekly
# 因子面板验证(正式复跑链路)
.venv\Scripts\python.exe scripts\validate_factor_panels.py --kind financial --horizons 1 4 13
.venv\Scripts\python.exe scripts\validate_factor_panels.py --kind sentiment --horizons 1 4
# v2 因子库增强策略(聚宽在线 IDE 版)
# 复制 reference/joinquant/v2_factor_library.py 到聚宽 IDE 直接运行:
# 区间 2020-01-02 ~ 2026-08-25,日频,初始 200000,基准 000300.XSHGquant/
├── src/quant/ # 核心库(逻辑全部在库内,脚本只做编排)
│ ├── data/ # 数据源(tushare/akshare/csv)+ 面板 + 质量检查
│ │ ├── financial.py # 财务面板(公告日 T+1 无前视)
│ │ └── sentiment.py # 情绪面板(两融/龙虎榜,含陈旧值清洗)
│ ├── backtest/ # 回测引擎(T+1+约束迭代)、成本、指标
│ ├── factors/ # 因子处理(winsorize/zscore/中性化)+ IC 检验
│ ├── portfolio/ # 组合引擎(周频再平衡、权重合成、行业约束)
│ └── research/ # walk-forward、归因、通用因子面板验证
├── scripts/ # CLI 入口(fetch/backtest/validate/paper_select)
├── tests/ # pytest 123 用例(无前视/停牌/风控死锁回归)
├── reference/ # 参考实现
│ ├── joinquant/ # ★ 聚宽在线平台复现(v1 五因子 + v2 因子库增强 + 探针 + 回测报告)
│ │ ├── v1_five_factor.py # v1 五因子(Top8 双周)
│ │ ├── v2_factor_library.py # v2 19 因子(Top20 周频,研究候选)
│ │ ├── factor_whitelist_probe.py# 线上因子白名单探针
│ │ ├── alpha_factor_probe.py # alpha101/191 全量探针
│ │ └── backtest_report.md # 聚宽回测报告
│ ├── qlib_*.py # Qlib 参考
│ ├── vnpy_*.py # vn.py 参考
│ └── backtrader_sizers.py # Backtrader 参考
├── data/ # 数据缓存(gitignore)与输出
├── ARCHITECTURE.md # 仓库内部架构与目录纪律
├── pyproject.toml # 依赖与打包(editable install)
├── .env.example # 密钥模板(.env 不入库)
└── LICENSE # MIT
| 数据源 | 费用 | 用途 |
|---|---|---|
| tushare | 2000+ 积分 | 主力:daily_basic(PE/PB/PS/市值/换手/股息率)+ adj_factor 复权 |
| akshare | 免费免 token | 财务面板(业绩报表)、情绪面板(两融/龙虎榜)、备份行情 |
| 聚宽(在线回测) | 免费 | 长周期交叉验证(2020 起全量数据,不占 JQData 额度) |
| 因子 | ICIR | 状态 |
|---|---|---|
| 低换手 | 0.887 | ✅ v1 核心(0.40) |
| 高股息 | 0.527 | ✅ v1(0.15) |
| 低PB | 0.523 | ✅ v1(0.20) |
| E/P | 0.485 | ✅ v1(0.10) |
| 低PS | 0.371 | ✅ v1(0.10) |
| 净利增速 | 0.323(4周) | ⏳ 截面过门槛,组合层拖累(v2 候选已关闭) |
| 情绪(融资/龙虎榜反向) | 截面显著 | ❌ 组合层拖累(IC 正≠组合有效) |
| 质量/成长/动量 | <0.2 或负 | ❌ 截面无效(A股 动量为负 alpha) |
v2 在 v1 五因子骨架上扩展,四组:
| 组 | 因子(权重) | 说明 |
|---|---|---|
| 价值底仓(v1 骨架,0.58) | 低换手 0.22 / 低PB 0.12 / 高股息 0.10 / E-P 0.08 / 低PS 0.06 | 本地验证过,降权避免价值族重复下注 |
| 现金流(0.20) | cash_flow_to_price_ratio 0.10 / cfo_to_ev 0.06 / sales_to_price_ratio 0.04 | 聚宽因子库引入,本地近一年 ICIR≈0.40(未中性化,仅作候选) |
| 质量/盈利(0.23) | profit_margin_ttm 0.05 / gross_income_ratio 0.04 / roe_ttm 0.04 / cash_rate_of_sales 0.04 / asset_turnover_ttm 0.03 / debt_to_asset_ratio 0.03 | 聚宽因子库引入,防"低估值陷阱";不重押成长(本地 profit_yoy 组合层失败) |
| 低波/情绪/动量(0.18) | DAVOL20 0.04 / turnover_volatility 0.04 / Variance120 0.04 / sharpe_ratio_120 0.03 / fifty_two_week_close_rank 0.03 | 低波防御;52周位置权重很小(本地牛市区制候选,避免动量负 alpha 反噬) |
- Top8 集中效应:v1 本地 +35% 是 Top8 深度小组合(含集中持有成分);Top20 分散后 ≈0.15%,alpha 不可规模化
- 风格依赖强:聚宽 6.6 年周期显示 2024 红利大年 +40% 撑起总收益,2020/2026 风格逆风年亏 10-19%;v2 同样高度依赖红利风格(收益集中 2024,夏普仅 ~0.12)
- walk-forward 门未过:2025-26 样本外为负——模拟盘盈利 ≠ 加仓依据
- 数据短:本地仅 2023-2026(3.6 年),参数有拟合风险(聚宽版补足长周期验证)
- v2 高股息因子口径:style_pro 类因子(含 divyild)在聚宽线上不可用,改用
finance.STK_XR_XD分红表手工计算股息率(a_xr_date+bonus_ratio_rmb,10派X元除以10);覆盖不足时自动跳过该因子,不让弱覆盖污染打分