---
name: aifinlab/a-share-quant-backtest
source: https://app.decimal.ai/s/aifinlab-a-share-quant-backtest@1/SKILL.md
source_sha256: abba832be323
---

# 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**：用户未指定时使用快速结果风格