| name | a-share-quant-backtest |
| description | A股量化策略回测/因子验证。当用户说"回测"、"策略回测"、"backtest"、"因子验证"、"这个策略历史表现怎么样"、"测一下"、"量化回测"、"历史收益率"、"夏普比率"、"最大回撤"时触发。基于历史K线和财务数据,对用户指定的投资策略进行回测验证,计算收益率/夏普比率/最大回撤/胜率等绩效指标。支持研报风格(formal)和快速结果风格(brief)。 |
A 股量化策略回测
数据源
SCRIPTS="$SKILLS_ROOT/cn-stock-data/scripts"
python "$SCRIPTS/cn_stock_data.py" kline --code [CODE] --period [daily/weekly/monthly] --start [YYYYMMDD] --end [YYYYMMDD]
python "$SCRIPTS/cn_stock_data.py" finance --code [CODE]
python "$SCRIPTS/cn_stock_data.py" quote --code [逗号分隔的代码列表]
回测计算使用 Python pandas,不依赖第三方回测框架。所有计算在 Python 脚本中完成。
Workflow
Step 1: 定义策略
明确以下要素(用户未指定则使用默认值):
| 要素 | 说明 | 默认值 |
|---|
| 标的池 | 回测股票范围 | 用户指定(必填) |
| 买入规则 | 入场信号 | 用户指定(必填) |
| 卖出规则 | 出场信号 | 用户指定(必填) |
| 持仓周期 | 最小持仓天数 | 不限(T+1 至少隔日) |
| 调仓频率 | 多久重新评估 | 月度调仓 |
| 仓位管理 | 单只上限/总仓位 | 等权重,单只不超过 20% |
| 回测区间 | 起止日期 | 近 3 年 |
| 基准 | 对标指数 | 沪深300 (000300) |
| 初始资金 | 起始金额 | 100 万元 |
| 交易成本 | 佣金+印花税+滑点 | 佣金万2.5 + 印花税千1(卖出) + 滑点0.1% |
常见策略模板:
- 均线策略: MA5 上穿 MA20 买入,下穿卖出
- 动量策略: 买入近 N 日涨幅前 K 只,定期调仓
- 价值因子: 按 PE/PB/股息率排序,买入低估值组
- 成长因子: 按净利润增速/营收增速排序,买入高成长组
- 多因子组合: 多因子加权打分,买入高分组
Step 2: 获取历史数据
- 通过 cn-stock-data 获取标的池内所有股票的历史K线
- 如涉及财务因子,获取财务指标数据
- 获取基准指数K线(如沪深300)
- 数据清洗:处理停牌日(前值填充)、复权价格
import pandas as pd
df['return'] = df['close'].pct_change()
df['cum_return'] = (1 + df['return']).cumprod() - 1
Step 3: 回测执行
按规则模拟交易,逐日/逐期计算:
- 信号生成: 根据买卖规则生成每日交易信号 (1=买入, -1=卖出, 0=持有)
- 仓位计算: 根据信号和仓位管理规则计算每日持仓
- 收益计算: 考虑交易成本后的每日/每期净收益
- 净值曲线: 计算策略净值序列
Step 4: 绩效指标计算
计算以下核心指标(详见 references/backtest-guide.md):
| 指标 | 公式/说明 |
|---|
| 总收益率 | (期末净值 - 1) * 100% |
| 年化收益率 | (期末净值)^(252/交易天数) - 1 |
| 夏普比率 | (年化收益 - 无风险利率) / 年化波动率 |
| 最大回撤 | max(1 - 净值/历史最高净值) |
| 胜率 | 盈利交易次数 / 总交易次数 |
| 盈亏比 | 平均盈利 / 平均亏损 |
| Calmar 比率 | 年化收益 / 最大回撤 |
| Sortino 比率 | (年化收益 - 无风险利率) / 下行波动率 |
| 年化波动率 | 日收益标准差 * sqrt(252) |
| 交易次数 | 总买卖次数 |
| 平均持仓天数 | 所有交易的平均持仓时长 |
必须与基准对比:同期基准的收益率、最大回撤、夏普比率,计算超额收益。
Step 5: 输出结果
根据风格要求输出,必须包含:
- 策略概述(规则说明 + 回测区间 + 标的池)
- 绩效指标汇总表(策略 vs 基准对比)
- 分年度收益对比
- 关键结论与风险提示
风格说明
| 维度 | formal(研报风格) | brief(快速结果) |
|---|
| 篇幅 | 3-5 页 | 1 页 |
| 策略说明 | 详述策略逻辑、参数选择理由 | 一句话策略概述 |
| 绩效表 | 完整(10+ 指标) | 精简(5-6 核心指标) |
| 分年度 | 逐年收益表 + 月度热力图描述 | 仅逐年收益 |
| 交易明细 | 列出部分典型交易 | 不列出 |
| 风险分析 | 详细回撤分析 + 参数敏感性 | 仅标注最大回撤 |
| 免责声明 | 需要(历史不代表未来) | 简短提示 |
输出格式
绩效汇总表(必含)
| 指标 | 策略 | 基准(沪深300) | 超额 |
|---|
| 年化收益率 | xx% | xx% | xx% |
| 夏普比率 | x.xx | x.xx | — |
| 最大回撤 | xx% | xx% | — |
| 胜率 | xx% | — | — |
| 盈亏比 | x.xx | — | — |
| Calmar 比率 | x.xx | x.xx | — |
| 年化波动率 | xx% | xx% | — |
| 交易次数 | N 次 | — | — |
分年度收益表
关键规则
- 必须考虑交易成本:佣金(万2.5双向)+ 印花税(卖出千1)+ 滑点(0.1%),不考虑成本的回测无意义
- 必须与基准对比:至少对比沪深300,让用户判断策略是否跑赢市场
- 必须标注回测区间:明确起止日期和交易天数
- 历史不代表未来:在结论中必须提示回测局限性
- 警惕过拟合:如参数过多或仅在特定区间有效,需警告过拟合风险
- A股 T+1 规则:当日买入次日才能卖出,回测必须模拟此限制
- 涨跌停处理:涨停板买不进、跌停板卖不出,需在回测中体现
- 停牌处理:停牌期间不可交易,持仓期间停牌不影响持仓但无法调仓
- 无风险利率:默认使用 2.5%(可按用户要求调整)
- 默认风格为 brief:用户未指定时使用快速结果风格