A-Share Quant Report Reproducer
适用场景
当用户希望复现一篇A股量化/金工研报时使用本技能。目标是把“研报文字”转成“可回测策略”:
- 拆解研报逻辑
- 生成可计算的alpha表达式
- 选择合适的A股回测平台或MCP
- 根据研报和用户要求,确定下载多少只股票做回测
- 输出回测结果、图表、偏差说明
你必须收集的输入
如果用户没有明确给出,先补齐以下信息再执行:
report_input:研报URL / PDF / 文本摘要max_download_stocks:最多下载多少只股票用于回测(必须询问或给出默认值)universe_preference:全A / 沪深300 / 中证500 / 中证1000 / 行业池 / 跟随研报rebalance_freq:日 / 周 / 月holding_count:持有前N只股票,或分组回测backtest_platform:自动选择 / Qlib / RQAlphaPlus / JoinQuant / FinQ4Cn-MCP / QMT-MCPcost_assumption:双边费率、滑点,若用户没给则使用A股日频保守默认值
默认值:
max_download_stocks = 1000universe_preference = 跟随研报rebalance_freq = 周holding_count = 20backtest_platform = 自动选择cost_assumption = 手续费万3,冲击/滑点单边15bp(可根据平台能力调整)
核心原则
1. 先尊重研报,再尊重用户的下载上限
数据集选择顺序严格如下:
- 如果研报明确写了股票池(如沪深300、中证500、全A、某行业),优先按研报股票池。
- 如果用户又指定了
max_download_stocks,则在研报股票池约束内截取可交易性最强的前K只股票。 - 如果研报没有写股票池,则根据研报逻辑自动匹配股票池,再应用
max_download_stocks。 - 如果用户明确要求“就下载N只股票回测”,把 N 视为硬上限。
2. 数据集匹配规则
按以下逻辑选择数据集:
- 研报是大盘增强/核心资产/宽基增强:优先沪深300;若用户指定下载数量,则取流动性最好的前K只。
- 研报是中盘/成长增强:优先中证500。
- 研报是小盘/弹性/高换手:优先中证1000,但要提示冲击成本更高。
- 研报是全市场多因子/横截面选股:优先“流动性过滤后的全A”,并按
max_download_stocks下载前K只。 - 研报是行业轮动/行业内选股:使用相关行业成分股,必要时按行业均衡方式截取。
- 研报是事件驱动/财报因子:股票池应先满足事件或财务披露可得性,再应用K只上限。
3. 股票下载数量的解释
max_download_stocks 的语义是“参与回测的数据集最大股票数量”,不是最终持仓数。
- 下载股票数:用于计算因子、排序和生成候选池。
- 持仓数:由
holding_count控制。 - 一般应满足:
max_download_stocks >= holding_count * 5。 - 如果用户设置不合理(例如下载20只却想持仓20只),要明确提示样本太窄,建议扩大到至少1000只以上;若受研报原始股票池限制,则需解释无法达到1000只的原因。
4. 平台路由规则
- 用户强调开源研究/本地复现:优先 Qlib。
- 用户强调A股制度细节、分钟级/真实撮合约束:优先 RQAlphaPlus。
- 用户强调快速在线回测:优先 JoinQuant。
- 用户强调 MCP / skill 化接入 / AI工作流:优先 FinQ4Cn-MCP。
- 用户已有 QMT/XTQuant/Windows实盘环境:优先 QMT-MCP。
- 如果没有明确偏好,先给出自动选择理由,再执行。
执行步骤
Step 1:拆解研报
从研报中提取:
- 研究对象:选股 / 择时 / 行业轮动 / 事件驱动 / 风险模型
- 因子来源:量价 / 基本面 / 分析师预期 / 另类数据
- 信号逻辑:反转 / 动量 / 估值修复 / 资金行为 / 拥挤度 / 风险补偿
- 组合构建:top N / 分层 / 中性化 / 权重约束 / 调仓周期
- 回测设定:样本区间、基准、成本、剔除规则
Step 2:把文字逻辑转成alpha表达式
优先输出一个最小可运行表达式,再输出一个增强版表达式。 表达式应尽量使用以下组件:
- 收益率:
ret_1,ret_5,ret_20 - 成交量/换手:
volume,turnover,adv20 - 波动率:
std(ret_1, 20) - 排序:
rank(x) - 时序统计:
ts_mean,ts_std,ts_rank - 中性化:
neutralize(x, industry),neutralize(x, log_mktcap)
如果研报逻辑无法完全量化,先给出“代理表达式”,并明确说明替代关系。
Step 3:决定数据集与下载规模
使用 dataset-selection-rules.md 的规则,输出:
- 原始候选池
- 过滤规则
- 最终下载股票数量
- 选择理由
- 可能引入的偏差(如存续偏差、流动性偏差)
Step 4:选择回测平台
必须说明为什么选择该平台,并指出备选平台:
- 平台名称
- 是否适合A股
- 是否支持因子研究
- 是否支持MCP或自动化接入
- 是否能处理用户要求的数据下载规模
Step 5:运行回测
回测时务必区分:
- 候选股票池数量
- 最终持仓股票数量
- 调仓频率
- 成本参数
- 基准指数/ETF
Step 6:结果展示
输出必须采用多因子模型常见回测展示范式,至少包含:
- 研报逻辑拆解
- 数据集选择说明(含下载多少只股票)
- alpha表达式与因子预处理说明
- 回测配置
- 因子诊断:覆盖率、缺失率、去极值/标准化/中性化说明
- 因子有效性:IC均值、RankIC均值、ICIR、月度IC胜率、分层单调性
- 组合表现:多空组合、多头组合、超额收益、累计净值、年化收益、Sharpe、最大回撤、年化波动、换手率、胜率
- 稳定性分析:分年收益、分阶段表现、风格/行业暴露摘要
- 与研报不一致的原因
- 下一步优化建议
- 自动展示回测过程中生成的全部关键图片
输出格式
严格按以下结构输出:
1. 研报逻辑树
- 策略类型
- 核心假设
- 因子来源
- 组合构建方式
2. 数据集方案
- 研报原始股票池
- 用户要求下载上限
- 最终下载股票数
- 数据过滤规则
- 最终回测股票池说明
3. Alpha表达式
先给最小可运行版,再给增强版。
4. 回测平台选择
- 主平台
- 备选平台
- 选择理由
5. 回测结果
- 因子诊断表
- IC/RankIC汇总表
- 分组收益表
- 多头/多空/基准/超额指标表
- 分年收益表
- 关键图片展示(必须内联展示)
6. 图片展示要求
- 在回测执行完成后,自动按顺序展示全部关键图片,而不是只给文件路径。
- 至少展示:因子分层收益图、累计净值图、超额收益图、回撤图、IC时间序列图、月度IC热力图、换手率或持仓分布图。
- 如果生成了更多诊断图(如行业暴露图、风格暴露图、收益归因图),也应一并展示。
- 每张图下方用一句话解释图的含义与结论。
7. 复现偏差说明
- 数据口径差异
- 股票池差异
- 成本和成交约束差异
- 研报未披露细节带来的误差
8. 下一步优化
至少给3条可执行优化建议。
特别约束
- 如果用户给了研报,就不要直接套通用alpha,必须优先复原研报逻辑。
- 如果用户只给主题、不给研报全文,可以先做“近似复现”,但必须说明不是严格复现。
- 如果用户要求“下载多少只股票”,这个值必须出现在最终报告中,不能只体现在代码或配置里。
- 如果回测平台或MCP不支持全部交易细节,要明确告知能力边界。
- 如果数据集太小导致结果不稳,要明确建议扩大
max_download_stocks;默认目标是至少1000只股票,除非研报股票池本身不足1000只。 - 回测报告不是只输出文字摘要,必须尽量以表格+图片形式完成展示。
- 如果回测过程中生成了图片,最终回复中必须逐张展示关键图片,不能只给本地路径或附件说明。
示例触发语句
- 复现这篇A股金工研报,并至少下载1000只股票做回测
- 根据这篇研报自动选择股票池,最多下载1200只股票
- 用Qlib复现这篇研报,若股票池足够则下载不少于1000只股票
- 帮我把研报拆成alpha表达式,并用MCP回测,下载前1500只流动性最好的A股
请始终把“研报逻辑 -> 数据集规模 -> alpha表达式 -> 回测平台 -> 回测结果”串成一个完整闭环,而不是只做摘要或只给公式。