ashare-quant-analyst 是一个面向 A 股策略开发与回测的 Codex Skill,用于把用户的自然语言策略想法转化为可执行的 Pandas 信号、带 A 股交易制度约束的沙盒回测结果,以及可直接展示的绩效指标与收益曲线图。
该 Skill 适合在用户提出“开发并回测策略”“回测经典策略”“开发 A 股交易策略”“绘制收益曲线”“验证某个择时/轮动/均线策略”等需求时使用。
- 策略生成:将双均线、突破、动量、均值回归、行业轮动等策略描述落地为 Pandas 信号逻辑。
- 信号标准化:要求生成包含
buy_signal与sell_signal的signals.csv,便于统一接入回测引擎。 - A 股制度建模:内置 T+1、佣金、印花税、滑点、100 股整数手等基础交易约束。
- 安全校验:通过 AST 检查禁止危险模块/函数,并识别典型未来函数风险,例如
shift(-1)。 - 绩效分析:计算年化收益、夏普比率、最大回撤、Calmar 比率等核心指标。
- 图表输出:生成
performance_chart.png,用于在最终答复中直接展示收益曲线。
- 回测经典技术策略,例如双均线金叉死叉、唐奇安通道、布林带反转、RSI 超买超卖。
- 验证 A 股单标的择时策略,例如沪深 300 ETF、中证 500 ETF、行业 ETF 或个股。
- 开发事件驱动策略,例如公告、龙虎榜、北向资金、解禁、热点题材等信号与价格序列结合。
- 生成策略研究报告中的结构化回测指标和收益曲线图片。
- 对用户给出的策略代码做安全检查和未来函数检查。
先明确用户希望回测的要素:
- 标的:股票、ETF、指数或股票池。
- 时间区间:起止日期、频率(日线为默认)。
- 入场条件:例如均线金叉、突破 N 日新高、因子排名进入前 N。
- 出场条件:例如均线死叉、跌破止损线、持有期到期、排名跌出阈值。
- 仓位规则:满仓、等权、单标的、固定比例或现金约束。
- 成本假设:如未指定,采用 Skill 默认 A 股交易成本。
策略代码通常需要至少包含以下列:
| 字段 | 含义 | 说明 |
|---|---|---|
date |
交易日期 | 建议使用 YYYY-MM-DD |
open |
开盘价 | 可选,但建议保留 |
high |
最高价 | 可选,但建议保留 |
low |
最低价 | 可选,但建议保留 |
close |
收盘价 | 回测引擎必需 |
volume |
成交量 | 可选 |
buy_signal |
买入信号 | 回测引擎必需,布尔值或 0/1 |
sell_signal |
卖出信号 | 回测引擎必需,布尔值或 0/1 |
当与 a-stock-data Skill 配合使用时,可优先通过其行情数据能力获取 A 股、ETF 或指数历史行情,再在本 Skill 中生成信号并回测。
生成策略信号后,统一保存为:
signals.csv示例结构:
date,open,high,low,close,volume,buy_signal,sell_signal
2024-01-02,10.00,10.20,9.95,10.10,1200000,0,0
2024-01-03,10.12,10.50,10.05,10.45,1500000,1,0
2024-01-04,10.40,10.42,10.00,10.08,1300000,0,1对自动生成或用户提供的策略脚本,建议先运行:
python scripts/code_validator.py --code_path strategy.py校验器会检查:
- 禁止导入
os、sys、subprocess、requests、urllib、socket等系统或网络相关模块。 - 禁止使用
eval()、exec()、open()等高风险函数。 - 禁止使用
shift(-1)一类容易引入未来数据的写法。
使用标准信号文件运行回测:
python scripts/backtest_engine.py --signals signals.csv --output backtest_log.csv回测输出:
backtest_log.csv典型字段:
| 字段 | 含义 |
|---|---|
date |
日期或原始行索引 |
net_value |
每日组合净值 |
运行:
python scripts/metric_calculator.py --log backtest_log.csv脚本会输出标准 JSON 指标,并生成:
performance_chart.png最终回复用户时,应同时包含:
ashare-quant-analyst/
├── SKILL.md # Skill 触发说明与强制工作流
├── README.md # 项目说明文档
├── output_schema.json # 回测指标输出 Schema
├── assets/ # 图片、模板等静态资源目录
├── references/
│ └── ashare_market_rules.md # A 股交易制度与回测限制
└── scripts/
├── backtest_engine.py # A 股沙盒回测引擎
├── code_validator.py # 策略代码 AST 安全校验器
└── metric_calculator.py # 指标计算与收益曲线绘图脚本
signals.csv 是策略与回测引擎之间的核心契约。至少需要:
close:用于按收盘价估值和模拟成交。buy_signal:为真时尝试买入。sell_signal:为真时尝试卖出。
建议额外提供:
date:便于绘图与分析。open、high、low、volume:便于扩展更复杂的成交和风控逻辑。
回测引擎输出每日净值序列,用于后续绩效计算。
metric_calculator.py 当前输出的核心结构为:
{
"performance": {
"cagr": 0.1234,
"sharpe_ratio": 1.2345,
"max_drawdown": -0.1234,
"calmar_ratio": 1.0000
}
}output_schema.json 还定义了更完整的扩展字段,包括:
strategy_id:策略代码哈希。annualized_volatility:年化波动率。sortino_ratio:Sortino 比率。trade_statistics.total_trades:交易次数。trade_statistics.win_rate:胜率。trade_statistics.profit_factor:盈亏比。
这些字段可作为后续增强脚本时的目标输出格式。
默认假设来自 references/ashare_market_rules.md:
- T+1 交收:当天买入的股票不能当天卖出。
- 佣金:默认双向万分之 2.5,即
0.00025。 - 印花税:卖出单边千分之一,即
0.001。 - 滑点:默认
0.001。 - 交易单位:买入数量必须为 100 股整数倍。
- 涨跌停:普通 A 股通常 ±10%,科创板/创业板通常 ±20%;复杂涨跌停撮合逻辑可在后续版本扩展。
- 不得使用未来数据,例如
shift(-1)、未来日期收益、回测期末已知排名等。 - 不得在信号生成阶段读取未来收盘价、未来最高价或未来财务数据。
- 不得跳过
signals.csv、backtest_log.csv、指标 JSON、收益曲线图这条标准链路。 - 策略结果必须说明样本区间、标的、成本假设和主要限制。
- 使用
rolling()、shift(1)等只依赖历史数据的方式构建指标。 - 在生成交易信号时,将信号与执行价格的时间关系写清楚。
- 对指标中的小数统一保留 4 位,方便阅读和对比。
- 当策略依赖随机过程时,固定全局随机种子,保证结果可复现。
下面是信号生成逻辑的简化示例:
import pandas as pd
import numpy as np
np.random.seed(42)
df = pd.read_csv("market_data.csv")
df["ma_short"] = df["close"].rolling(5).mean()
df["ma_long"] = df["close"].rolling(20).mean()
previous_short = df["ma_short"].shift(1)
previous_long = df["ma_long"].shift(1)
df["buy_signal"] = (previous_short <= previous_long) & (df["ma_short"] > df["ma_long"])
df["sell_signal"] = (previous_short >= previous_long) & (df["ma_short"] < df["ma_long"])
df.to_csv("signals.csv", index=False)然后依次运行:
python scripts/code_validator.py --code_path strategy.py
python scripts/backtest_engine.py --signals signals.csv --output backtest_log.csv
python scripts/metric_calculator.py --log backtest_log.csv当 Skill 完成回测后,建议最终答复包含:
- 策略简述:一句话说明入场、出场、标的和时间区间。
- 成本假设:说明佣金、印花税、滑点、T+1 和 100 股约束。
- 指标 JSON:原样贴出脚本输出的 JSON。
- 收益曲线:用 Markdown 图片语法展示
performance_chart.png。 - 风险提示:说明历史回测不代表未来收益,并指出样本依赖和数据质量限制。
示例:
策略:沪深300ETF 双均线择时,5 日均线上穿 20 日均线买入,下穿卖出。
成本:佣金 0.025%,卖出印花税 0.1%,滑点 0.1%,遵循 T+1 与 100 股整数手。
```json
{
"performance": {
"cagr": 0.0821,
"sharpe_ratio": 0.9132,
"max_drawdown": -0.1567,
"calmar_ratio": 0.5239
}
}
```
a-stock-data:负责获取 A 股行情、研报、公告、新闻、行业和资金流等数据。ashare-quant-analyst:负责将数据转化为交易信号、执行回测、计算指标并输出图表。make-presentation:可将回测结果、收益曲线和策略说明整理成演示文稿。
推荐组合流程:
数据获取 → 信号生成 → 安全校验 → 回测执行 → 指标计算 → 图表展示 → 研究报告/演示稿
- 当前回测引擎偏向单标的或简化仓位模型,多标的组合、调仓、停牌和涨跌停撮合需要进一步扩展。
- 当前指标脚本输出的是核心绩效字段,尚未完整覆盖
output_schema.json中的全部扩展字段。 - 当前成交模型以信号行的
close为基础模拟成交,未区分次日开盘成交、VWAP 成交或盘口流动性。 - 当前交易日志记录的是净值序列,不包含逐笔交易明细;如需胜率、盈亏比和交易次数,需要扩展成交记录。
- 数据源质量会显著影响回测结论,需关注复权方式、停牌、分红、退市和指数成分变化等问题。
shift(-1) 会把未来数据移动到当前行,常见于错误地使用“明日收益”或“未来价格”生成今天的交易信号,会导致未来函数和虚高回测结果。
signals.csv 是策略层与回测层的解耦协议。无论策略来自自然语言、用户代码还是外部因子,只要生成统一字段,就可以进入同一个回测与绩效计算流程。
单一指标容易掩盖风险。收益曲线可以直观看到回撤、震荡、收益集中期和策略失效阶段,是验证策略稳定性的必要补充。
不建议直接用于实盘。该 Skill 的定位是研究、教学和策略原型验证。实盘前还需要更严格的数据清洗、撮合仿真、风控、组合管理、合规检查和实时监控。
- 增加多标的组合回测与定期调仓。
- 增加逐笔交易日志、持仓日志和换手率统计。
- 完整实现
output_schema.json中的交易统计字段。 - 增加涨跌停、停牌、ST、退市、复权方式等 A 股细节处理。
- 支持基准收益曲线、超额收益、信息比率和回撤区间可视化。
- 增加参数扫描、网格搜索、walk-forward 验证和样本外测试。
本 Skill 生成的策略、回测结果和图表仅用于研究与技术演示,不构成投资建议。历史收益不代表未来表现,任何交易决策都应结合独立判断、风险承受能力和合规要求。