量化策略规划及管理

来源: Obsidian Vault

量化策略规划及管理

统一管理所有量化策略的规划、开发、回测和运营规范 基于 fractal-system 从零到G1的完整迭代经验 + 策略库批量管理方法论 最后更新:2026-06-09


一、策略库总览

当前已开发/规划中的策略:

策略 类型 周期 方向 过滤器 笔数 胜率 年化 状态
fractal-system 反转(左侧) 日线 多头 amp<2% 105 42.9% 6.8% 🔄 实盘观察期
Ross-trade 趋势跟随(右侧) 日线 多+空 趋势/量/波动/布林 待测 🔄 开发中
eod-overnight 短线(尾盘) 日线 多头 大盘/黑名单/止跌 393 63.9% 105%(*) 🔄 实盘观察期

每个策略在 mystocks/策略/ 下有代码仓库([策略名]/)和策略卡片([策略名].md)。


二、构建完整量化策略的七层框架

一个可上线运行的量化策略,需要逐层满足以下七层条件。任何一层缺失都会导致实盘失败。

第1层:数据基础

条件 说明 案例与教训
1.1 数据质量 历史数据干净、完整、无缺失 CH日线585行/股(2020-2026),足够回测
1.2 数据粒度 时间周期必须与策略逻辑匹配 15min日内策略在T+1下不匹配——76.7%被overnight_exit强制结束
1.3 复权一致性 前复权/不复权必须统一 trade_audit前复权 vs K线不复权,除权股偏差5-10%
1.4 数据量充足 样本内+样本外均需覆盖 60min模式失败:单日仅4根bar,lookback不够

核心教训: 数据粒度是第一道门槛。在错误的时间周期上优化参数是徒劳。fractal-system花了5轮参数优化(V2-V7b)才发现瓶颈在时间周期本身。

第2层:市场制度适配

条件 说明 案例与教训
2.1 交易制度 T+0/T+1、涨跌停、交易时间 T+1是A股根本约束——日内持仓到收盘被迫清仓,价格大概率回落
2.2 交易成本 手续费、滑点、印花税 千一→万一差10倍:策略从"亏-40%"变"盈+1.4%"
2.3 多空方向 A股做空受限,天然偏多 空头103笔胜率23.3%,占总亏损63%。取消后立即改善
2.4 交易时间 盘中仅4小时 15min仅16根bar,0.8%已是能触及的止盈上限

核心教训: 策略必须与制度匹配。T+1下做日内、A股做空、高手续费下做高频——这些不是策略问题,是制度不匹配。

第3层:策略逻辑

条件 说明 案例与教训
3.1 入场可量化 规则用数学表达式描述,无歧义 LSwing拐头 + 收盘价>前低,可编码可回测
3.2 出场完整 止损/止盈/时间止盈,三者缺一不可 初版缺时间止盈→持仓无限;后版优先级错→TIME_EXIT被截断
3.3 信号过滤 过滤假信号是策略的核心差异 amp<2%将收益从+1.4%提升到+16.95%(单步最大改善)
3.4 左侧vs右侧 预测反转 vs 确认后入场 左侧触碰魔法线后58.9%的LSwing值与前值相同,反转概率低

核心教训: 信号过滤 > 出场规则 > 入场信号。入场容易想到,但决定盈亏的是过滤和出场。

第4层:统计有效性

条件 说明 案例与教训
4.1 样本量 交易笔数足够多 9笔/2.5年不可信 → 105笔才有统计意义
4.2 股票池广度 足够多的股票验证泛化 8只→80只,从"无法判断"到"发现振幅过滤规律"
4.3 盈亏平衡意识 任何参数组合都有最低胜率要求 盈亏比1.67:1需37.5%胜率,38.1%仅超0.6%,无安全边际
4.4 收益率归因 区分毛利和净利 零手续费+6,110 → 有手续费+1,398,手续费吃掉77%

第5层:统计陷阱规避

条件 说明 案例与教训
5.1 前视偏差 回测不能使用未来信息 振幅过滤用回测前1年数据,用回测区间自身数据是自欺欺人
5.2 过拟合警觉 参数优化有天花板 SL/TP/持仓天数全部调过,边际仅0.29%。真正突破来自换架构
5.3 幸存者偏差 回测收益可能不反映真实能力 +16.95%/2.5年看似不错,但样本仍有限,需实盘验证
5.4 选择偏差 股票池选择可能引入偏差 80只手动选股有偏好 → 解决:全市场扫描+规则过滤

第6层:迭代方法论

维度 改善幅度 优先级
架构层:换时间周期 最大 ⭐⭐⭐
逻辑层:加过滤/改方向 中等 ⭐⭐
参数层:调SL/TP 最小

改善幅度对比(fractal-system实证): - 架构(15min→日线):+3.11% - 逻辑(只做多):+42.1% - 逻辑(amp<2%过滤):+15.55% - 参数(V3→V7b):+0.29%

迭代纪律: 1. 每次失败必须有明确根因诊断——信号太少?止盈不可及?手续费太高?制度不匹配? 2. 不要在失败方向过度优化——15min调参5轮仍亏,应更早切换 3. 快速试错——每次迭代有明确假设和验证 4. 先验证方向,再优化参数——参数天花板到了就说明瓶颈在架构层

第7层:工程与运营

条件 说明 实施方式
7.1 可配置参数 所有阈值放配置文件 TOML: sl_pct=0.015, tp1_ratio=1.67
7.2 回测框架 独立于实盘的回测脚本 scripts/backtest_daily.py 支持批量/分组/统计
7.3 版本控制 Git管理每个里程碑 402e93b可追溯到任何历史版本
7.4 自动化部署 Cron日扫描+周报 日扫描(15:05) + 周报(周五18:00)
7.5 评估节点 明确实盘评估规则 2026-06-22: WR≥40%→上线, 35-40%→观察, <35%→迭代

三、策略库管理规范

吸收自《一键回测整个策略库》方法论

3.1 目录结构

mystocks/策略/
├── README.md                  ← 策略库入口说明
├── INDEX/                     ← HTML看板(http://ip:端口 浏览)
│   ├── index.html             ←   总览仪表盘
│   ├── fractal-system.html    ←   策略详情页
│   └── Ross-trade.html        ←   策略详情页
│
├── cards/                     ← 策略卡片(.md)
│   ├── fractal-system.md      ←   分形投资体系卡片
│   ├── Ross-trade.md          ←   洛氏霍克卡片
│   └── [future].md            ←   未来新策略卡片
│
├── docs/                      ← 管理文档
│   ├── 量化策略规划及管理.md    ←   本文件(总览+规范)
│   ├── 新策略开发必读.md        ←   提交前检查清单+评估标准
│   ├── 常见失败路径避坑清单.md  ←   所有策略共享的失败路径库
│   └── 一键回测整个策略库.md    ←   参考文档(批量回测方法论)
│
├── fractal-system/            ← 代码仓库(Gitea clone)
│   ├── src/ scripts/ config/ docs/
│
├── Ross-trade/                ← 代码仓库(Gitea clone)
│   ├── ross_trade/ scripts/ configs/ docs/
│
├── eod-overnight/             ← 代码仓库(从hermes/local复制)
│   ├── tasks/ config/ docs/ conditions/ phases/
│
└── [future-strategy]/         ← 未来新策略(同结构)

目录职责: - README.md — 策略库入口,链接到各子目录 - INDEX/ — HTML看板,浏览器访问查看策略总览、回测对比、详情页 - cards/ — 策略卡片(.md),每个策略一个文件,含参数/回测/运维/迭代历史 - docs/ — 管理文档,规范/必读/避坑清单/参考 - [策略名]/ — 代码仓库(Gitea克隆)

每个策略占三个位置: - [策略名]/ — 代码仓库(Gitea克隆,含源码/配置/脚本/测试) - cards/[策略名].md — 策略卡片(人读摘要,含参数/回测/运维/迭代历史) - INDEX/[策略名].html — 策略详情页(浏览器可读,含图表)

3.2 策略接口规范

状态: 暂缓 — 等Ross-trade完成开发后再评估统一接口

为支持批量回测和横向对比,每个策略应暴露统一接口:

# 每个策略模块必须实现以下接口
STRATEGY_NAME = "fractal-system"       # 策略唯一标识
STRATEGY_DIR = "/root/.hermes/mycode/fractal-system"  # 代码路径

def run_backtest(stock_pool=None, start=None, end=None, params=None):
    """运行回测,返回标准结果"""
    return BacktestResult(
        trades=[],           # 交易列表
        win_rate=0.0,        # 胜率
        total_return=0.0,    # 总收益率
        annual_return=0.0,   # 年化收益
        max_drawdown=0.0,    # 最大回撤
        sharpe=0.0,          # 夏普比率
        exit_reasons={},     # 离场原因分布
    )

def run_daily_scan():
    """每日扫描,生成信号"""
    pass

def get_config():
    """返回当前配置"""
    pass

3.3 批量回测流水线

状态: 暂缓 — 依赖3.2统一接口

参照"一键回测整个策略库"的核心设计:

策略库目录 → 自动发现每个策略模块 → 统一数据集 → 运行回测 → 对比基准 → 排名汇总

关键设计原则:

  1. 自动发现 — 扫描策略目录,动态加载每个策略模块(importlib
  2. 统一数据集 — 所有策略用同一份数据,保证横向可比
  3. 统一基准 — 用买入持有(Buy and Hold)作为统一参照
  4. 统一初始资金 — 所有策略用相同的 initial_capital
  5. 失败隔离 — 单个策略异常不中断整体运行,记录到 failures.csv
  6. 结果归档 — 每次运行生成: - summary.csv — 策略排名汇总 - failures.csv — 失败记录 - 每个策略的独立优化结果和资金曲线图
  7. 命令行控制 — 同一引擎,不同数据集: bash python backtest_all.py --pool amp_lt_2pct --period 2024-01-01:2026-06-08

3.4 排除核心工具模块

策略目录中并非每个文件都是"可交易策略",需排除: - 包初始化文件 (__init__.py) - 工具函数库 (utils.py, common.py) - 配置文件 (config.py, settings.py) - 注册表/调度器

3.5 策略评估标准

指标 权重 说明
年化收益 20% 扣除手续费后
最大回撤 25% 核心指标,回撤>收益不可接受
夏普比率 20% 风险调整后收益
胜率 15% 需超过盈亏平衡线
样本量 10% 最少30笔交易
实盘验证 10% 至少2周实盘观察

评估节点规则: - 每2周评估一次实盘胜率 - WR ≥ 40% → 可上线 - 35-40% → 继续观察1周 - < 35% → 启动迭代

3.6 资金管理规则

多策略运行时的资金分配与风险敞口控制

策略状态 资金权重 说明
实盘盈利(≥6个月) 60% 已验证策略,主力仓位
实盘观察期(2-4周) 25% 观察中策略,限定风险
回测盈利(未实盘) 15% 待验证策略,最小仓位试水
开发中 0% 不分配实盘资金

组合级约束:

约束 说明
单策略最大持仓 5只 防止单一策略过度集中
总风险敞口 ≤6% 所有策略持仓市值/总资金
单票最大仓位 ≤20% 跨策略合并计算
现金最低保有 ≥10% 应对极端行情

仓位评估可参考凯利公式:f = (p×b - q) / b,其中p=胜率, b=盈亏比, q=1-p。 后续策略多了可以增加动态资金分配制度(按近期表现动态调整权重)。

3.7 策略淘汰规则

策略不是永久的。市场环境变化时,策略可能失效。需要明确的退役机制。

条件 动作 说明
实盘连续4周亏损 ⚠️ 暂停,进入观察 可能是环境变化,暂停新开仓,持仓自然到期
实盘连续8周亏损 ⛔ 退役,归档 策略失效,关闭Cron,代码归档保留
回测胜率 < 35% 且无改善路径 🗑️ 放弃开发 不浪费时间,记录失败原因后归档
3个月无信号 📦 归档休眠 策略逻辑可能不适配当前市场,保留代码随时唤醒
最大回撤 > 20% ⚠️ 暂停,诊断 可能是参数/过滤失效,需回测验证

退役流程: 1. 关闭Cron任务 2. 策略卡片状态改为 ⚰️ 已退役 3. 代码仓库保留(不删除,作为历史参考) 4. 在本文件总览表中标记退役日期和原因 5. 如果未来市场环境变化,可重新唤醒


四、策略完整度对照表

以fractal-system G1为例,逐层检查:

层级 条件 状态 备注
1 数据基础 CH日线585行/股,前1年振幅计算
2 市场制度适配 日线+只做多+万分之一手续费
3 策略逻辑 LSwing触碰+斜率确认+amp过滤
4 统计有效性 105笔/42.9%WR/+16.95%
5 统计陷阱 无前视偏差,参数天花板已确认
6 迭代方法论 6版迭代,每版有根因诊断
7 工程运营 🔄 Cron已部署,实盘观察期中(06-09~06-22)

五、常见失败路径与应对

失败路径 根因 应对 效果
时间周期与制度不匹配 T+1下做日内,隔夜清仓亏损 换日线级别 -1.71%→+1.40%
空头在A股天然劣势 无法真正做空,亏损占63% 只做多头 -40.7%→+1.40%
手续费模型错误 千一vs万一差10倍 修正为万分之一 策略从"亏损"变"盈利"
信号稀疏无法判断 8只股票9笔交易 扩大到80只 发现振幅过滤规律
高振幅股票信号不可靠 LSwing频繁变化,触碰后继续跌 amp<2%过滤 +1.40%→+16.95%
参数优化天花板 调SL/TP边际仅0.29% 停止调参,改架构 识别真正瓶颈
斜率确认太严格 58.9%的LSwing值与前值相同 >>= 0笔→6笔信号
出场优先级错误 TIME_EXIT被overnight截断 重排check()顺序 TIME_EXIT正常触发

六、新策略开发流程

开发一个新策略时,按以下步骤推进:

1. 规划 → 确认策略逻辑/时间周期/数据源/市场制度约束
2. 数据 → 确认数据质量/粒度/复权一致性
3. 实现 → 编码信号生成/风控/回测框架
4. 初始回测 → 验证逻辑是否产生信号
5. 根因诊断 → 如果亏损,诊断是架构/逻辑/参数哪层的问题
6. 迭代优化 → 按优先级:架构 > 逻辑 > 参数
7. 扩大验证 → 扩大股票池/时间窗口
8. 固化 → Git commit + 配置文件 + 策略卡片
9. 部署 → Cron日扫描 + 实盘观察期
10. 评估 → 2周评估节点,决定上线/继续/迭代

每一步的详细要求见上方"七层框架"对应层级。


七、fractal-system 迭代版本历史

版本 周期 核心变更 笔数 胜率 收益 年化
V1 15min 初始信号生成 0 - - -
V2 15min +P0过滤+P3冷却 0 - - -
V3 15min +斜率确认放宽 9 33% -1.71% -0.7%
V4 60min 连续60min模式 15 20% -10.75% -4.3%
V5 日线 切换日线 334 34.1% -40.7% -
F2 日线 +只做多+SL1.5% 236 38.1% +1.40% 0.6%
G1 日线 +amp<2%过滤 105 42.9% +16.95% 6.8%

八、一句话总结

量化策略的alpha来自"正确的时间周期 + 正确的方向 + 正确的股票过滤",而非参数微调。 80%的时间花在发现哪个维度是瓶颈上,20%的时间花在修复上。 架构(周期) > 逻辑(过滤/方向) > 参数(SL/TP),优先级不可颠倒。 策略库的价值在于批量验证、横向对比、快速淘汰——把时间花在值得深入的候选者上。


附录:策略卡片模板

新建策略时,复制此模板到 mystocks/策略/[策略名].md

# {策略名称}

> {一句话描述策略核心逻辑}

---

## 基本信息

| 项目 | 内容 |
|------|------|
| 策略名称 | {名称} |
| 代码仓库 | `mystocks/策略/{名称}/` (Gitea: {URL}) |
| 运行仓库 | {Hermes执行路径} |
| 数据源 | {CH/MySQL/TDX...} |
| 配置格式 | {TOML/YAML} |
| 数据处理 | {polars/pandas} |
| Git | {commit hash} |
| 状态 | {🔄实盘观察期 / ✅已上线 / 📋规划中 / ⚰️已退役} |

## 策略逻辑

**入场:**
- {规则1}
- {规则2}
- {过滤条件}

**出场:**
- 止损: {参数}
- 止盈TP1: {参数}
- 止盈TP2: {参数}
- 时间止盈: {参数}

**过滤:**
- {过滤器1}: {参数}
- {过滤器2}: {参数}

## 当前参数

| 参数 | 值 | 说明 |
|------|-----|------|
| {param} | {value} | {desc} |

## 回测结果

**回测区间:** {start} ~ {end}
**股票池:** {N只, 筛选条件}

| 指标 | 值 |
|------|-----|
| 总交易 | {N}笔 |
| 胜率 | {WR}% |
| 总收益 | {pnl}% |
| 年化收益 | {annual}% |
| 最大回撤 | {dd}% |
| 盈亏比 | {pf} |

**离场分布:**
- stop_loss: {N}笔 ({pct}%)
- take_profit_1: {N}笔 ({pct}%)
- take_profit_2: {N}笔 ({pct}%)
- time_exit: {N}笔 ({pct}%)

## 风控规则

| 规则 | 参数 | 说明 |
|------|------|------|
| {rule} | {value} | {desc} |

## 运维

| 项目 | 详情 |
|------|------|
| Cron日扫描 | {时间} (job: {id}) |
| Cron周报 | {时间} (job: {id}) |
| 评估节点 | {date} |
| 评估规则 | WR≥40%→上线 / 35-40%→观察 / <35%→迭代 |

## 迭代历史

| 版本 | 周期 | 核心变更 | 笔数 | 胜率 | 收益 | 年化 |
|------|------|---------|------|------|------|------|
| V1 | {period} | {change} | {N} | {WR} | {pnl} | {annual} |
| **当前** | **{period}** | **{change}** | **{N}** | **{WR}** | **{pnl}** | **{annual}** |

附录B:新策略添加流程(必读)

当一个新策略完成开发并通过回测验证后,必须按以下5步将其登记到策略库。 每个策略在策略库中占4个位置,缺一不可。

总览:4个登记位置

# 位置 路径 作用
1 代码仓库 mystocks/策略/[策略名]/ 源码、配置、脚本、报告
2 策略卡片 cards/[策略名].md 人读摘要(参数/回测/运维/迭代)
3 HTML详情页 INDEX/[策略名].html 浏览器看板(暗色主题)
4 总览入口 INDEX/index.html + README.md 策略卡片+对比表+目录

Step 1: 创建代码仓库

cd "/mnt/c/Users/John Cheng/Documents/Obsidian Vault/mystocks/策略"
# 如果代码已在别处开发,复制或clone到此处
cp -r /path/to/[策略名] [策略名]/
# 或 git clone
git clone http://192.168.123.104:3001/john/[策略名].git

代码仓库标准结构(参考zt-chaser):

[策略名]/
├── config.yaml          # 可配置参数(权重/阈值/过滤条件)
├── README.md            # 策略说明
├── .gitignore           # 排除缓存/数据
├── src/                 # 源码模块
├── scripts/             # 运行脚本(回测/扫描/模拟盘)
├── data/cache/          # 数据缓存(.gitignore排除)
└── reports/             # HTML分析报告

Step 2: 创建策略卡片

cards/ 下创建 [策略名].md,使用附录A的卡片模板。必填内容:

  • 基本信息:名称/类型/周期/数据源/代码位置/状态
  • 核心指标:回测区间/样本量/胜率/收益/回撤/连亏
  • 因子/逻辑体系:每个因子的权重/IC/p值/数据源
  • 实盘参数:阈值/仓位/止损/卖出规则
  • 迭代历史:版本表格
# 参考
cp cards/zt-chaser.md cards/[策略名].md
# 然后修改内容

Step 3: 创建HTML详情页

INDEX/ 下创建 [策略名].html,使用暗色主题(CSS变量与index.html一致)。

:root {
  --bg:#0d1117; --card:#161b22; --border:#30363d;
  --text:#c9d1d9; --dim:#8b949e; --accent:#58a6ff;
  --green:#3fb950; --red:#f85149; --yellow:#d29922; --purple:#bc8cff;
}

关键组件(参考 INDEX/zt-chaser.html): - 核心指标3列网格 - 因子表(含IC/p值/数据源标签) - 回测阈值扫描表 - 成交率/风控模型(如有) - 版本迭代时间线 - 返回总览按钮

Step 4: 更新总览看板

修改 INDEX/index.html,在策略卡片网格 <div class="grid"> 中添加新卡片:

<!-- [策略名] -->
<div class="card">
  <div class="card-header">
    <div class="card-icon" style="background:linear-gradient(...)">ICON</div>
    <div>
      <div class="card-title">[策略名]</div>
      <div class="card-type">类型 · 理论 · 周期</div>
    </div>
    <span class="status obs/dev">状态</span>
  </div>
  <div class="stats">
    <div class="stat"><div class="stat-value green">XX%</div><div class="stat-label">胜率</div></div>
    <div class="stat"><div class="stat-value green">+XX%</div><div class="stat-label">收益</div></div>
    <div class="stat"><div class="stat-value green">-XX%</div><div class="stat-label">回撤</div></div>
  </div>
  <div class="params"><table>...关键参数...</table></div>
  <div class="version-bar">...版本条...</div>
  <br>
  <div class="actions">
    <a class="btn btn-primary" href="[策略名].html">查看详情</a>
    <a class="btn btn-outline" href="../cards/[策略名].md">Markdown卡片</a>
  </div>
</div>

同时在对比表 <table class="compare-table"> 中添加新列。

Step 5: 更新README和总纲

  1. README.md — 目录表加行 + 策略总览表加行
  2. docs/量化策略规划及管理.md — 第一章"策略库总览"表格加行

检查清单

完成添加后逐项确认:

# 检查项 命令/方法
1 代码仓库存在且有内容 ls mystocks/策略/[策略名]/
2 策略卡片存在且内容完整 浏览 cards/[策略名].md
3 HTML详情页可访问 curl localhost:8890/[策略名].html 返回200
4 总览看板显示新卡片 浏览器打开 localhost:8890
5 对比表包含新策略列 查看index.html对比表
6 README总览表已更新 查看README.md
7 HTTP服务已启动 curl localhost:8890 返回200

启动/重启HTTP看板服务

pkill -f "http.server 8890"
cd "/mnt/c/Users/John Cheng/Documents/Obsidian Vault/mystocks/策略/INDEX"
/root/miniconda3/envs/stock/bin/python -m http.server 8890 &
# 验证
curl -s -o /dev/null -w "%{http_code}" http://localhost:8890

浏览器访问:http://localhost:8890http://192.168.123.104:8890