# quantlab —— 偏好参数驱动的量化策略生成与回测(Python + PHP) 一句话:**调因子、调周期,直接给出下个周期的推荐股票(含量化权重);想验证就先跑回测、出报告。** Python 侧负责"资料研究 → 策略生成 → 回测 → HTML 报告";PHP 侧提供同规则、可挂到现有 nginx + PHP-FPM 后端的轻量策略/信号引擎(配置 JSON 两边通用)。 > ⚠️ 免责声明:全部输出仅供量化学习与研究,不构成投资建议。历史回测不代表未来表现,市场有风险,投资需谨慎。 ## 目录结构 ``` map/ ├── run.py # 回测入口:偏好参数 → 策略 → 回测 → HTML 报告 ├── recommend.py # 推荐入口:调因子+调周期 → 下个周期推荐股票 ├── quantlab/ │ ├── periods.py # 周期定义:周/双周/月/季/半年/年 + 自定义交易日数 │ ├── dashboard.py # 交互式选股看板(单文件 HTML,前端实时重算) │ ├── dataloader.py # 腾讯/新浪日线抓取(分段窗口+缓存)、沪深300池 │ ├── factors.py # 7 个价量因子 + MAD去极值 + 截面Z-score │ ├── strategy_generator.py # 偏好参数 → 策略规格推导(核心) │ ├── backtest.py # T+1 回测引擎(成本/波动率目标/回撤降仓/IC统计) │ ├── metrics.py # CAGR/夏普/回撤/卡玛/月度/年度收益 │ ├── report.py # HTML 报告(ECharts) │ ├── data/ │ │ ├── universe_sample.csv # 内置大市值样本池(静态,有幸存者偏差) │ │ └── kline/*.csv # 日线缓存(自动生成) │ └── docs/量化研究资料汇编.md # 量化资料收集成果 ├── quantlab-php/ # PHP 7.3+ 版(无外部依赖) │ ├── src/StrategyGenerator.php # 与 Python 同一套偏好映射 │ ├── src/FactorEngine.php # 因子计算 + 截面选股 │ ├── cli.php # 命令行:生成配置 + 最新信号 │ └── api.php # HTTP API(可挂 nginx) └── out/ # 策略规格/回测明细/推荐清单 JSON、HTML 报告与看板 ``` ## 快速开始 ### 环境要求 | 依赖 | 版本 | 说明 | |---|---|---| | Python | 3.10+(本项目 3.13 实测) | 负责数据抓取、因子计算、回测、报告 | | pandas | 最新即可 | Python 唯一第三方依赖 | | PHP | 7.3+(本项目 7.3.4 实测) | 仅 PHP 侧信号引擎需要,无外部依赖、无需 Composer | ```bash # 1) 安装 Python 依赖 pip install pandas # 2) 用偏好参数生成并回测(首次运行自动抓取约 120 只股票的日线,几分钟) python run.py --risk 稳健 --horizon 波段 python run.py --risk 进取 --horizon 中线 --style momentum=0.4,low_vol=0.2,trend=0.4 --positions 8 python run.py --risk 保守 --horizon 长线 --cash 0.2 --report out/report.html # 3) 下个周期推荐股票(最常用,见"用法一") python recommend.py --period 月 # 4) PHP 侧(复用同一份日线缓存,见 quantlab-php/README.md) php quantlab-php/cli.php --risk 稳健 --horizon 波段 ``` ### PHP 版单独说明 PHP 版有独立的完整使用文档:**[`quantlab-php/README.md`](quantlab-php/README.md)**, 包含环境要求、CLI 全部参数、HTTP API 定义、以及挂到 nginx + PHP-FPM 的分步部署教程。 ## 用法一:下个周期推荐股票(最常用) ```bash python recommend.py --period 月 # 月度推荐(默认) python recommend.py --period 周 # 周度(动量20日+反转) python recommend.py --period 季 --top 8 # 季度,只要 8 只 python recommend.py --days 15 --risk 进取 # 自定义 15 个交易日 python recommend.py --period 月 --style momentum=0.5,low_vol=0.2,trend=0.3 # 自定义因子权重 python recommend.py --period 月 --dashboard out/dashboard.html # 生成交互看板 ``` 周期档位(自动匹配因子回看窗口,避免“用周线数据做季度决策”): | 周期 | 交易日 | 动量窗口 | 趋势窗口 | 反转权重 | |---|---|---|---|---| | 周 | 5 | 20 | 20 | 20% | | 双周 | 10 | 60 | 60 | 10% | | 月 | 20 | 120 | 120 | 0 | | 季 | 60 | 180 | 200 | 0 | | 半年 | 120 | 250 | 250 | 0 | | 年 | 250 | 250 | 250 | 0 | | 自定义 | 3–250 | ≈3×N | ≈6×N | 0 | 输出:每只票的综合得分、因子贡献拆解(如“动量+0.50、质量动量+0.32、低波+0.14”)、 建议权重、收盘价、距 200 日线幅度、年化波动;外加**各周期推荐对比**,一眼看出周期切换后换了哪些票。 ### 交互式选股看板 `out/dashboard.html` 是单文件、离线可用的看板:左侧拖 7 个因子权重滑块、点周期按钮(周/双周/月/季/半年/年, 或填自定义交易日数),右侧排序、权重、单票得分实时重算;点某一行可展开该票的因子贡献,支持导出 CSV。 前端算法与 Python 后端完全一致(已做逐票得分对齐校验)。 ## 用法二:回测验证(可选) ```bash python run.py --risk 稳健 --horizon 月 --report out/report_月.html ``` ## 可调偏好参数 | 参数 | CLI 选项 | 取值 | 说明 | |---|---|---|---| | 风险偏好 | `--risk` | 保守/稳健/平衡/进取/激进 | 决定目标波动率、回撤熔断线、持仓数、单票上限、低波倾斜 | | 持有周期 | `--horizon` | 短线/波段/中线/长线,或 周/双周/月/季/半年/年 | 决定调仓频率、动量/趋势回看窗口、反转权重 | | 风格权重 | `--style` | momentum / quality_momentum / low_vol / trend / reversal / high_52w / liquidity | 覆盖默认因子权重,自动归一化 | | 持仓数量 | `--positions` | 整数 | 覆盖风险等级默认值 | | 调仓间隔 | `--rebalance` | 交易日数 | 覆盖周期默认值 | | 现金缓冲 | `--cash` | 0~1 | 常备现金比例 | | 趋势过滤 | `--no-trend-filter` | 开关 | 关闭"低于200日线不入选" | 生成器会把偏好翻译成:因子权重表、回看窗口、调仓频率、目标波动率、回撤降仓阈值、 单票/现金约束、成本假设等完整策略规格(JSON 落盘到 `out/`),并输出推导说明。 ## 回测假设(重要) - T 日收盘出信号,T+1 生效(无前向偏差);持仓权重按日收益自然漂移 - 成本:佣金 0.03%/单边 + 卖出印花税 0.05% + 滑点 0.10%/单边(可改 JSON) - 风控覆盖层:60 日已实现波动率超目标 → 降仓;组合回撤超阈值 → 减半仓位 - 数据:腾讯行情日线前复权(公开接口,非一手),沪深300 基准;股票池为**静态样本池** (幸存者偏差:只含当前存活大市值股,回测收益因此偏乐观,正式研究需用历史成分快照) ## 两个口径的关系 - `recommend.py`(推荐)= 用最新截面因子值排一次序,回答"下个周期买什么"; - `run.py`(回测)= 历史上每隔 N 天重复同样的排序,回答"这套规则靠不靠谱"。 两者共用同一套因子定义、去极值/标准化逻辑与权重口径,改动一处另一处同步生效。 ## 扩展点 - 基本面因子(PE/PB/ROE):需要历史基本面面板数据(当前接口只有快照),接入后可加价值/质量因子 - 历史(point-in-time)成分股:消除幸存者偏差 - 分钟级执行 / VWAP 拆单:见资料汇编 §2