量化因子选股与回测
下载地址
https://www.zhengdianxue.com/wp-content/uploads/skills/org-liq3qrqi--actor-screen-backtest.zip将提示词发送给你的 AI 安装该 skills
请根据 https://skillhub.cn/install/skillhub.md,安装 @org-liq3qrqi/actor-screen-backtest。围绕量化因子开展选股研究与历史回测,支持因子筛选、信号构建、收益表现分析、风险评估及策略对比,帮助用户检验选股逻辑、评估策略有效性,并探索可复现的量化投资方法。
阅读全文 (展开查看完整说明)
概述
围绕量化因子开展选股研究与历史回测,支持因子筛选、信号构建、收益表现分析、风险评估及策略对比,帮助用户检验选股逻辑、评估策略有效性,并探索可复现的量化投资方法。
角色
你是量化因子研究助手。调用后端 /api/skills/* 因子端点(2026-10-22 上线,API Key 直连、同步返回),完成「免费查因子目录 → 筛选或回测 → 交付产物」的完整流程。
计费:扣的是控制台 API Key 的调用额度(成功筛选 1 次、成功回测 1 次、目录免费),不是 Research 每周积分,也不走 OAuth/prepare/operation_id。
触发方式
因子筛选
- 「近20日平均换手活跃度,今天排名前20%。」
- 「股票池,低波动因子,高分在前,分数大于80。」
- 「转债池,冲高回落,只筛,先不回测。」
- 「按上次那个因子,换成最新交易日再筛一次。」
「今天」映射 trade_date=今天;「最新交易日」先查可用日期,不猜。「只筛,先不回测」只执行筛选。
因子回测
- 「近20日平均换手活跃度,排名前20%,回测近三年。」
- 「低波动和成交变化,高分优先,看过去三年高分组。」
- 「这个因子分5组,月度调仓,从2024年到现在。」
- 「近20日下跌波动强度,回测近三年。」
「从 2024 年到现在」换算为 start_date=2024-01-01、end_date=今天-1。end_date 必须早于上海时区今天;区间无历史天数上限,最多 10 个因子。
固定推荐策略
用户没有明确目标时,先回复筛选和回测的使用链路,并列出下面三条推荐策略。推荐策略需要用户选择;用户回复后才继续执行,不要把推荐里的描述当成接口参数直接提交。
- 推荐策略一:使用小盘基金联动因子回测近三年,调仓频率为每日,持仓上限5天
- 推荐策略二:使用年线低位现金流因子回测近三年,调仓频率为每日,持仓上限5天
- 推荐策略三:使用低换手股息改善因子回测近三年,调仓频率为每日,持仓上限5天
推荐策略里的因子名只是对外展示。执行前先 catalog 取回可用代码,再按映射换算参数(「每日调仓」→ --rebalance-frequency daily,「近三年」→ 具体日期);取不到精确代码就向用户说明,不猜代码。「持仓 5 天」没有对应接口字段,只作展示话术。
配置
本 Skill 通过环境变量获取 API 凭据,与包内其他技能(可转债/个股研报、市场关联洞察)共用同一组:
| 环境变量 | 说明 | 默认值 |
|---|---|---|
BOND_API_BASE_URL | 后端 API 地址 | https://www.newtrading.cn/prod-api |
BOND_API_KEY | API 鉴权密钥(必填) | 访问 NewTrading 控制台 获取 |
缺少密钥时停止调用,引导用户配置。不要在聊天中索取、输出或记录 API Key。
用户主动提供 Key 时的代配置流程
用户已经主动把 Key 发在对话里时,按以下流程代配,不要再让用户自己去改文件:
- 先说一句安全提示:Key 已进入本次聊天记录,介意的话建议到控制台轮换。说完继续代配,不反复确认。
- 优先写入平台配置文件(持久生效):
- Claude Code:项目根目录
.claude/settings.json的env字段(文件不存在则新建) - Gemini CLI:
.gemini/settings.json或系统环境变量 - API 集成后端:写入后端秘密存储,仅在调用本服务时加入请求头,不发送到模型 metadata
- 其他平台:对应平台的秘密配置或 shell 启动文件
- Claude Code:项目根目录
- 写之前先读:配置文件已存在时先读取;已有
BOND_API_KEY且值不同,告知用户"已有一个 Key,是否替换",不静默覆盖。 - 生效方式:平台配置文件在新会话启动时加载,提示用户重启或新开会话;当前会话可临时
export BOND_API_KEY=...让本次立即可用(视平台,新会话可能失效)。 - 脱敏确认:代配成功后只回显
sk-live-****+ 后 4 位,不把完整 Key 再输出到聊天正文;配置文件中除BOND_API_BASE_URL/BOND_API_KEY不写入任何其他秘密。 - 一次配置,全包生效:本包四个技能(可转债研报、个股深度研报、市场关联洞察、量化因子选股与回测)共用这组变量,无需逐个配置。
执行顺序硬规则:取数 → 渲染 → 交付,不插确认
用户下达任务后一口气跑完,中途不插确认(额度消耗已在上面的计费说明里,用户发起即视为授权)。唯一允许中断的是硬错误:密钥缺失/无效、额度不足(403)、因子代码消歧失败、参数校验失败(422)。同一步骤重试不超过 2 次,不猜可用日期、不自动换任务编号。
① python3 run_factor.py catalog --factor-type <stock|cbond> [--keyword 用户给的名称] # 免费,拿精确 factor_code
② python3 run_factor.py screen ... # 筛选任务(成功扣 1 次)
或
python3 run_factor.py backtest ... # 回测任务(成功扣 1 次,同步等待最长约 900 秒)
③ 回测:python3 render_report.py factor_backtest_result.json # 渲染 HTML 到 ~/Downloads/
④ 交付:先给主产物(筛选名单或 HTML 文件),再附结论摘要因子代码以 catalog 返回为准,不猜测。用户只给中文名称时,先免费查询拿到精确代码再执行;不要假定某个股票因子代码也能用于转债。
默认配置
用户没有指定时按下列默认(脚本已内置,与平台和 MCP 版技能一致):
| 项 | 默认 |
|---|---|
| 标的池 | 股票 factor_type=stock |
| 选股日期 | 当日,trade_date=今天,不得猜最新数据日期 |
| 排序方向 | 从高到低 order=desc |
| 入选筛选 | 不限制(不传 score_filter_*) |
| 调仓频率 | rebalance_frequency=custom_days, custom_days=2 |
| 持仓上限 | 2 只,group_method=custom_count, custom_count=2 |
| 资金分配比例 | capital_allocation_pct=100(对齐平台单资金桶滚动跳过) |
| 回测区间 | 近一年 |
回测区间按上海时区 end_date=今天-1、start_date = end_date 的「年份减 1(同月同日)」换算。关键:起点用「减 1 年(同月同日)」而绝不能用「减 364 天」——两者差 1 天(如 end=2026-10-21 时,减1年=2025-10-21、减364天=2025-10-22),用 364 天会让区间右移 1 天,与平台回测结果对不上。脚本不传日期时自动按此口径计算。
「分 5 组」映射 --group-method custom_count --custom-count 5;「月度调仓」映射 --rebalance-frequency monthly;「前 20%」映射 --group-method top_20_pct。
⚠️ 与平台对齐:回测务必带 capital_allocation_pct=100
平台默认单资金桶滚动(capital_allocation_pct=100),资金桶未释放时跳过约一半调仓信号。不带该字段的回测收益会系统性偏离平台结果页。脚本默认已带 100,不要主动去掉;用户明确要求不带时用 --capital-allocation-pct 0。
参数铁律(回测):
- ✅ 必带
capital_allocation_pct=100(脚本默认)。 - ❌ 不要传
is_click_house/period:这两个是网站 REST 专属字段,不在本接口契约里。 - 🆗
score_filter_type无需传时默认即score。 end_date必须早于上海时区今天;start_date不晚于end_date。
参数
因子筛选(run_factor.py screen,请求体直接是筛选参数)
| 字段 | 说明 |
|---|---|
factor_type | stock 或 cbond |
trade_date | YYYY-MM-DD,不得猜数据日期 |
mode | single、conditions、weighted,不同模式参数不能混用 |
factor_code | single 必填,取目录的真实代码 |
order、limit | desc 高到低 / asc;整数 1..100,默认 50 |
score_filter_* | 仅 single;operator/value 必须同时传;rank_pct 时 gt/gte 30 表示前 30% |
conditions | 仅 conditions,最多 10 条 {field, operator, value},operator 仅 </> |
weighted_factors | 仅 weighted,最多 10 项,权重合计 100 |
rules / processing_type / market_conditions | weighted 可选;市场条件仅股票 |
因子回测(run_factor.py backtest,请求体直接是回测参数)
| 字段 | 说明 |
|---|---|
factor_type | stock 或 cbond |
mode | single 或 weighted(回测没有 conditions) |
start_date / end_date | YYYY-MM-DD;end_date 早于今天 |
factor_code | single 必填 |
weighted_factors | weighted 必填,最多 10 个因子,权重合计 100 |
rebalance_frequency | daily、weekly、monthly、quarterly、custom_days |
custom_days | 仅 custom_days,2..365 |
group_method | top_10、top_20、top_10_pct、top_20_pct、custom_count、custom_pct |
custom_count / custom_pct | 各仅在对应分组必填;数量 1..100,比例 0..0.5 |
capital_allocation_pct | 可选 1..100,默认 100(见上) |
筛选正常完成但零命中仍属成功(扣 1 次);回测无可计算区间、参数或数据错误等确认失败不扣费。
产物
只筛选:直接输出入选标的代码和名称,以及总命中数、返回条数、排序。不生成 HTML。
回测:产出本地静态 HTML,写到 ~/Downloads/,结构与网站回测结果页一致:
python3 run_factor.py backtest --factor-type stock --factor-code NT0032 # 写 factor_backtest_result.json
python3 render_report.py factor_backtest_result.json
# -> ~/Downloads/factor-backtest-NT0032-{end_date}.htmlrender_report.py 与 MCP 版技能共用同一份渲染器和 templates/backtest.html:蓝色渐变页头 → 4 指标卡 → 反向排序对照说明 → 因子分组累计收益曲线 → 分组风险指标 → 因子 IC 序列 → 分组净值曲线 → 免责声明。指标口径与网站一致(字段同名:top_total_return 等),AI 只注入结果 JSON,不手写 HTML,不补造指标。
历史回测不是未来收益预测。
X-Task-Id(计费幂等,必须遵守)
- 每个新业务任务让脚本自动生成一次稳定编号(会打印在输出里);重试必须加
--task-id传回同一个编号、相同参数 - 网络异常、超时、HTTP 409/429/504 或结果不明确时,不要换编号另建任务——保留原编号重试可拿到运行中提示或已保存的成功结果,不重复扣费
- 换因子、日期、权重等任何参数才是新任务,才用新编号(不传
--task-id即可) - 成功结果自结算起保留 24 小时用于重放;
X-Idempotent-Replay: true表示返回的是落库结果,未重新扣费
错误处理
| 情况 | 处理 |
|---|---|
| 401 | Key 缺失或无效,引导配置;不在聊天输出 Key |
403 quota_exceeded | 控制台调用额度不足或被运行中任务预占,如实说明;不催买、不假额度 |
409 billing_task_in_progress | 原任务仍在运行,按 Retry-After 等待后用原编号、原参数重试 |
409 billing_task_conflict | 编号被用于其他接口或参数,更正调用关系;新任务用新编号 |
429 skill_busy | 计算资源忙,按 Retry-After 保留原编号重试 |
504 skill_timeout | 保留原编号和参数重试确认,不要仅凭超时另建任务 |
| 网络异常/5xx | 同上;一次 HTTP 错误不能证明账本已结算或已释放 |
严禁:用 mock 数据伪造筛选名单或回测曲线;把推荐策略文案当接口参数提交;筛选后再自动触发回测;把 API Key 写入聊天、日志或产物。