A股量化策略回测/因子验证。当用户说"回测"、"策略回测"、"backtest"、"因子验证"、"这个策略历史表现怎么样"、"测一下"、"量化回测"、"历史收益率"、"夏普比率"、"最大回撤"时触发。基于历史K线和财务数据,对用户指定的投资策略进行回测验证,计算收益率/夏普比率/最大回撤/胜率等绩效指标。支持研报风格(formal)和快速结果风格(brief)。
Scanned 9/7/2026
Install to Claude Code
npx -y skills add aifinlab/FinClaw --skill a-share-quant-backtest --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of A Share Quant Backtest?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/aifinlab-a-share-quant-backtest)More formats (shields.io, HTML) on the badges page.
---
name: a-share-quant-backtest
description: A股量化策略回测/因子验证。当用户说"回测"、"策略回测"、"backtest"、"因子验证"、"这个策略历史表现怎么样"、"测一下"、"量化回测"、"历史收益率"、"夏普比率"、"最大回撤"时触发。基于历史K线和财务数据,对用户指定的投资策略进行回测验证,计算收益率/夏普比率/最大回撤/胜率等绩效指标。支持研报风格(formal)和快速结果风格(brief)。
---
# A 股量化策略回测
## 数据源
```bash
SCRIPTS="$SKILLS_ROOT/cn-stock-data/scripts"
# 历史K线(日/周/月)
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: 获取历史数据
1. 通过 cn-stock-data 获取标的池内所有股票的历史K线
2. 如涉及财务因子,获取财务指标数据
3. 获取基准指数K线(如沪深300)
4. 数据清洗:处理停牌日(前值填充)、复权价格
```python
import pandas as pd
# 示例:加载K线数据后的基本处理
df['return'] = df['close'].pct_change()
df['cum_return'] = (1 + df['return']).cumprod() - 1
```
### Step 3: 回测执行
按规则模拟交易,逐日/逐期计算:
1. **信号生成**: 根据买卖规则生成每日交易信号 (1=买入, -1=卖出, 0=持有)
2. **仓位计算**: 根据信号和仓位管理规则计算每日持仓
3. **收益计算**: 考虑交易成本后的每日/每期净收益
4. **净值曲线**: 计算策略净值序列
```python
# A股特殊处理
# T+1: 当日买入次日才能卖出
# 涨跌停: 涨停无法买入,跌停无法卖出
# 停牌: 停牌期间无法交易
# 手续费: 佣金(双向) + 印花税(卖出千1) + 滑点
```
### Step 4: 绩效指标计算
计算以下核心指标(详见 `references/backtest-guide.md`):
| 指标 | 公式/说明 |
|------|----------|
| 总收益率 | (期末净值 - 1) * 100% |
| 年化收益率 | (期末净值)^(252/交易天数) - 1 |
| 夏普比率 | (年化收益 - 无风险利率) / 年化波动率 |
| 最大回撤 | max(1 - 净值/历史最高净值) |
| 胜率 | 盈利交易次数 / 总交易次数 |
| 盈亏比 | 平均盈利 / 平均亏损 |
| Calmar 比率 | 年化收益 / 最大回撤 |
| Sortino 比率 | (年化收益 - 无风险利率) / 下行波动率 |
| 年化波动率 | 日收益标准差 * sqrt(252) |
| 交易次数 | 总买卖次数 |
| 平均持仓天数 | 所有交易的平均持仓时长 |
**必须与基准对比**:同期基准的收益率、最大回撤、夏普比率,计算超额收益。
### Step 5: 输出结果
根据风格要求输出,**必须包含**:
1. 策略概述(规则说明 + 回测区间 + 标的池)
2. 绩效指标汇总表(策略 vs 基准对比)
3. 分年度收益对比
4. 关键结论与风险提示
## 风格说明
| 维度 | 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 次 | — | — |
### 分年度收益表
| 年份 | 策略收益 | 基准收益 | 超额收益 |
|------|---------|---------|---------|
## 关键规则
1. **必须考虑交易成本**:佣金(万2.5双向)+ 印花税(卖出千1)+ 滑点(0.1%),不考虑成本的回测无意义
2. **必须与基准对比**:至少对比沪深300,让用户判断策略是否跑赢市场
3. **必须标注回测区间**:明确起止日期和交易天数
4. **历史不代表未来**:在结论中必须提示回测局限性
5. **警惕过拟合**:如参数过多或仅在特定区间有效,需警告过拟合风险
6. **A股 T+1 规则**:当日买入次日才能卖出,回测必须模拟此限制
7. **涨跌停处理**:涨停板买不进、跌停板卖不出,需在回测中体现
8. **停牌处理**:停牌期间不可交易,持仓期间停牌不影响持仓但无法调仓
9. **无风险利率**:默认使用 2.5%(可按用户要求调整)
10. **默认风格为 brief**:用户未指定时使用快速结果风格
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!