| name | quant-strategy-quick-backtest |
| description | 证券金融工程研究员轻量化策略速回测技能。当用户要求进行策略回测、量化策略测试、简易策略验证、快速计算年化收益/最大回撤/夏普比率、策略过拟合检测时使用。包括"回测一下这个策略"、"测试均线交叉策略"、"策略速评"、"快速回测"、"算一下策略收益"、"策略有效性验证"、"帮我回测下"、"看看这个策略怎么样"、"策略表现如何"、"量化回测"、"策略回测报告"等表述。即使用户只说"回测"、"测试策略"、"算下收益"等简短表述也要触发。本技能自动解析策略规则、获取行情数据或模拟数据、执行回测计算、输出核心绩效指标,并附带过拟合风险提示,生成标准化Markdown格式回测报告。 |
量化策略速回测技能 (Quant Strategy Quick Backtest)
技能定位
为金融工程研究员提供轻量化、快速响应的策略回测能力,支持简易策略规则的解析与验证,快速输出核心绩效指标,并系统性提示过拟合风险。
适用场景:策略灵感快速验证、晨会策略速评、投研交流中的即时测算、策略框架初步筛选。
不适用场景:高频策略回测、复杂多因子模型、需要精细交易成本模拟的实盘级回测。
数据采集指引 (gildata-aidata 工具映射)
所有行情数据必须通过 gildata-aidata 服务获取,具体工具调用如下:
1. 指数行情数据 (作为基准或标的)
finx gildata-aidata IndexDailyQuote --body '{"query": "查询沪深300指数过去3年的每日收盘价、涨跌幅、成交量"}'
- 用途:获取宽基指数(如沪深300、中证500、创业板指)的历史日线行情,用于计算基准收益或作为 ETF 轮动策略的标的。
2. 个股行情数据 (作为策略标的)
finx gildata-aidata StockDailyQuote --body '{"query": "查询贵州茅台过去3年的每日收盘价、开盘价、最高价、最低价、成交量"}'
- 用途:获取个股历史日线行情,用于单标的策略回测或构建股票池。
3. 财务/估值数据 (用于基本面策略)
finx gildata-aidata StockValueAnalysis --body '{"query": "查询全市场A股最新PE(TTM)、PB(LF)"}'
执行流程
第一步:解析策略规则
从用户输入中提取以下关键信息:
| 要素 | 说明 | 示例 |
|---|
| 策略类型 | 均线/动量/反转/突破/轮动/自定义 | 双均线交叉 |
| 标的范围 | 个股/指数/ETF/行业/自定义池 | 沪深300成分股 |
| 入场条件 | 触发买入的信号规则 | MA5上穿MA20 |
| 出场条件 | 触发卖出的信号规则 | MA5下穿MA20 / 止损8% |
| 持仓权重 | 等权/市值加权/自定义 | 等权配置 |
| 调仓频率 | 每日/每周/每月/信号驱动 | 信号驱动 |
| 回测区间 | 起止时间(默认近3年) | 2023-01-01 至 2026-04-27 |
| 基准指数 | 对比基准(默认沪深300) | 沪深300 |
参数缺失处理:若用户未明确指定,使用以下默认值:
- 回测区间:近3年
- 初始资金:100万元
- 基准指数:沪深300(000300.SH)
- 交易成本:单边千分之一(含佣金+印花税+滑点)
- 调仓频率:信号驱动
第二步:获取行情数据
按优先级尝试以下数据源:
- gildata-aidata:调用
IndexDailyQuote 或 StockDailyQuote 获取标的历史日线行情数据(开盘价、收盘价、最高价、最低价、成交量)。这是首选数据源。
- eastmoney-mx:若
gildata-aidata 未覆盖,可尝试调用 search-data 获取补充数据。
- Python 代码 + 开源库:在沙箱中使用
akshare 或 yfinance 获取数据。
- 网络搜索:通过
web_search 搜索关键数据点,辅助构建数据集。
- 模拟数据:若以上均不可用,生成符合统计特征的模拟数据,并在报告中明确标注。
数据要求:
- 频率:日线级别(最低要求)
- 字段:日期、开盘价、收盘价、最高价、最低价、成交量(至少需要收盘价)
- 长度:覆盖完整回测区间,含至少250个交易日/年
第三步:执行回测计算
使用 Python 代码在沙箱环境中执行回测,核心逻辑:
import pandas as pd
import numpy as np
class QuickBacktest:
def __init__(self, prices, signals, initial_capital=1000000, cost_rate=0.001):
self.prices = prices
self.signals = signals
self.initial_capital = initial_capital
self.cost_rate = cost_rate
def run(self):
positions = self.signals.cumsum().clip(-1, 1)
daily_returns = prices.pct_change()
strategy_returns = positions.shift(1) * daily_returns
trades = positions.diff().abs()
strategy_returns -= trades * self.cost_rate
nav = (1 + strategy_returns).cumprod() * self.initial_capital
return nav, strategy_returns
第四步:计算核心绩效指标
必须计算以下指标:
| 指标 | 计算公式 | 说明 |
|---|
| 年化收益率 | (总收益率 + 1)^(252/交易日数) - 1 | 年化复利收益 |
| 最大回撤 | max((nav_peak - nav_trough) / nav_peak) | 历史最大亏损幅度 |
| 夏普比率 | (年化收益 - 无风险利率) / 年化波动率 | 风险调整后收益,无风险利率取2.5% |
| 胜率 | 盈利交易次数 / 总交易次数 | 交易成功比例 |
| 盈亏比 | 平均盈利 / 平均亏损 | 盈利与亏损的比值 |
| 年化波动率 | 日收益率标准差 × √252 | 收益波动程度 |
| Calmar比率 | 年化收益 / 最大回撤 | 收益回撤比 |
| 超额收益 | 策略年化收益 - 基准年化收益 | 相对基准的alpha |
| 信息比率 | 超额收益均值 / 超额收益标准差 × √252 | 超额收益的稳定性 |
第五步:过拟合风险检测
系统性检查以下过拟合信号,逐项评估:
过拟合检测清单
| 检测项 | 评估标准 | 风险等级 |
|---|
| 参数数量 | 自由参数 ≤ 3 个为安全,> 5 个高风险 | 🟢🟡🔴 |
| 样本外表现 | 训练期与测试期夏普差异 > 50% 预警 | 🟢🟡🔴 |
| 交易频率 | 年化交易次数 > 100 次可能过度拟合噪音 | 🟢🟡🔴 |
| 参数敏感性 | 参数微调 ±10% 导致夏普变化 > 30% 预警 | 🟢🟡🔴 |
| 经济逻辑 | 策略是否有合理的经济学解释 | 🟢🟡🔴 |
| 数据窥探 | 是否经过大量策略筛选后报告最优结果 | 🟢🟡🔴 |
| 幸存者偏差 | 是否仅使用当前存活标的回测 | 🟢🟡🔴 |
过拟合风险评级:
- 🟢 低风险:0-1 项预警
- 🟡 中风险:2-3 项预警
- 🔴 高风险:≥4 项预警
第六步:生成回测报告
严格按照以下模板生成 Markdown 格式报告:
# [策略名称] 速回测报告
> **报告日期**:YYYY-MM-DD
> **回测区间**:YYYY-MM-DD 至 YYYY-MM-DD
> **数据频率**:日线
> **标的范围**:[标的描述]
---
## 一、策略概要
| 要素 | 内容 |
|------|------|
| 策略类型 | [均线/动量/反转/突破/轮动] |
| 入场信号 | [具体规则] |
| 出场信号 | [具体规则] |
| 持仓方式 | [等权/市值加权/自定义] |
| 调仓频率 | [每日/每周/每月/信号驱动] |
| 交易成本 | 单边 ‰ |
---
## 二、核心绩效指标
| 指标 | 策略 | 基准(沪深300) | 超额 |
|------|------|-----------------|------|
| 年化收益率 | **%** | % | +.% |
| 最大回撤 | **.%** | .% | -.% |
| 夏普比率 | **.** | . | — |
| Calmar比率 | **.** | . | — |
| 年化波动率 | .% | .% | — |
| 胜率 | **.%** | — | — |
| 盈亏比 | **.** | — | — |
| 信息比率 | **.** | — | — |
| 总交易次数 | **次** | — | — |
---
## 三、净值曲线与关键统计
[如有条件,生成并插入净值曲线对比图]
### 分年度表现
| 年份 | 策略收益 | 基准收益 | 超额收益 |
|------|----------|----------|----------|
| 2024 | .% | .% | +.% |
| 2025 | .% | .% | +.% |
| 2026 | .% | .% | +.% |
### 最大回撤区间
- **最大回撤**:.%
- **回撤区间**:YYYY-MM-DD 至 YYYY-MM-DD(持续 个交易日)
- **恢复时间**:个交易日(若未恢复则标注"尚未恢复")
---
## 四、过拟合风险评估
### 风险检测清单
| 检测项 | 结果 | 风险等级 |
|--------|------|----------|
| 参数数量 | [ ] 个 | 🟢/🟡/🔴 |
| 样本外表现 | [描述] | 🟢/🟡/🔴 |
| 交易频率 | [ ] 次/年 | 🟢/🟡/🔴 |
| 参数敏感性 | [描述] | 🟢/🟡/🔴 |
| 经济逻辑 | [描述] | 🟢/🟡/🔴 |
| 数据窥探 | [描述] | 🟢/🟡/🔴 |
| 幸存者偏差 | [描述] | 🟢/🟡/🔴 |
### 综合评级:🟢低风险 / 🟡中风险 / 🔴高风险
### 风险解读
[针对每一项预警项,给出具体解释和改进建议。例如:
- **参数数量**:策略使用2个自由参数(MA5、MA20周期),在安全范围内。但需注意,若后续优化中增加止损、止盈、仓位管理等参数,可能引发参数过拟合。
- **交易频率**:年化交易次数45次,处于合理区间。若超过100次/年,需警惕策略可能在拟合市场噪音。]
---
## 五、策略评价与建议
### 优势
[列出策略的核心优势]
[...]
[列出策略的已知局限]
[...]
[给出具体可操作的改进方向]
[...]
---
常见策略模板
模板1:双均线交叉策略
策略规则:
- 短期均线:MA_N(N=5/10/20)
- 长期均线:MA_M(M=20/60/120)
- 入场:MA_N 上穿 MA_M
- 出场:MA_N 下穿 MA_M
- 持仓:全仓或等权
模板2:动量策略
策略规则:
- 观察窗口:过去N日(N=20/60/120)
- 排序指标:区间收益率
- 买入:排名前K%的标的
- 卖出:排名后K%或持仓跌出排名
- 调仓:每月/每季度末
模板3:均值反转策略
策略规则:
- 参考基准:MA_N 或布林带
- 入场:价格跌破下轨 / 偏离均线超过X个标准差
- 出场:价格回归均线 / 触及上轨
- 止损:固定百分比或ATR倍数
模板4:突破策略
策略规则:
- 突破参考:N日最高/最低价、唐奇安通道
- 入场:收盘价突破N日高点
- 出场:收盘价跌破M日低点
- 过滤:突破时需伴随成交量放大
注意事项
- 数据源优先:优先使用
gildata-aidata 获取行情数据,确保数据质量和一致性。
- 参数稳健性:建议在报告中展示参数敏感性分析(如参数 ±20% 的表现变化)。
- 基准选择:基准应与策略风险特征匹配,股票策略用沪深300,债券策略用中债综合。
- 报告透明度:若使用模拟数据,必须在报告开头显著位置标注。
- 迭代建议:速回测仅用于初步筛选,有潜力的策略应进入深度回测流程。