加速换手因子选股(按次)
> Pay Skill 范式:鉴权型(agent_local)
> 鉴权型:履约在本机执行(需本地取数),远端网关只做支付鉴权,支付通过后返回 fulfillment: "agent_local",Agent 再跑 scripts/ 下的脚本产出结果。
> 把 WorkBuddy 变成一名「加速换手因子选股 因子选股」分析师:输入股票(或股票池),输出因子值、分层与低因子优先的选股结论。仅做因子计算与排序,不构成投资建议。
Overview
因子来自华安证券「量化研究系列报告之十五」。报告从动态视角挖掘换手率中的增量信息,提出将个股择时信号嵌入因子构造:不同时刻的加速换手反映不同博弈含义。其中最强变体是「放量上涨日加速换手」——股价上穿均线且放量时的换手加速是负面信号(筹码松动、多空分歧、见顶前兆),未来难持续上涨。本 Skill 实现该 headline 因子:过去20日中每个「放量上涨日」的日换手变化量(当日换手−前日换手)之和,越低(甚至为负)越优。
When to Use(触发场景)
- 用户说「用加速换手因子选 X」「放量上涨时换手加速的股票」「哪些股票筹码松动、该减仓」时。
- 用户给定股票或股票池,要求基于「量价+换手加速」做因子诊断/排序时。
- 与 CV/CTR/换手率变化率同属交易行为因子家族。
Workflow(处理流程)
1) 解析代码;2) Agent 本机 scripts/run_local.py 抓过去20日 OHLCV+换手率;3) 对每日判「放量上涨日」(今收>近3日均价 且 今量>近3日均量),对其日换手变化量(今换手−昨换手)求和得因子;4) 筛选;5) 单股分层或股票池升序排序,推荐因子最低者;6) 输出报告。
规则与口径
- 因子定义见
references/rules.md;实证数字见references/empirical_evidence.md;输出模板见references/output_templates.md。 - 履约由 Agent 本机
scripts/run_local.py完成:东方财富公开接口取日频行情 → 计算因子 → 应用研报筛选(≥15 交易日、最新日未停牌)→ 单股分层或股票池十分位排序 → 输出报告。 - 取不到的数据标注「未获取」,严禁推测补造。
输出与质量分级
- 单股:因子值 + 分层(低/中/高,越低越优)+ 数据可信度 + 提示。
- 股票池(≥10 只):按因子升序分位,推荐因子最低的前 ~34%。
- 缺失信息明确标注,不假设。
风险提示
- 样本内历史规律,历史有效不代表未来有效;市场系统性风险、流动性风险、政策变动会显著影响表现。
- 本工具不构成任何投资建议或买卖依据;前置筛选(上市满12月、非ST)未自动校验,请自行确认。
Pay Skill 模式(鉴权型,按次付费,已接入 X402)
本 Skill 为付费技能(Pay Skill),按次收费,已通过腾讯 SkillHub +
微信支付 Agent Pay X402 协议接入。不存在免费运行模式——
未完成支付授权前,不得执行本地履约脚本、不得输出任何付费内容;
鉴权型只由服务端返回的 paid: true 解锁本机履约。(加速换手因子选股(按次),定价 2.00 元/次)。
> 使用者须已安装并开通 weixinpay_pay 插件(微信 AI 支付 / AI 专属卡)。
> Step 0 检查不通过时不发起付费调用,直接引导开通后重试。
鉴权型(agent_local):履约在本机执行,远端网关只负责订单鉴权与支付状态确认,
支付通过后返回 fulfillment: "agent_local",不返回业务结果;Agent 收到 paid: true 后才在本机跑 scripts/run_local.py 产出结果。
- 统一网关主接口:
POST https://pay.zerone-iteration.com/api/invoke(请求体{"skill": "accelerated-turnover-factor", "skill_version": "1.0.1", "query": "...", "amount": 200}) - 实现:透明网关(Java 17 / Spring Boot + WechatPay-Java);
skill/skill_version仅做格式校验后透传进 X402 预下单,不查 SkillHub(不查注册表、不反查是否真实存在/已发布);无本地白名单,新增 Skill 免 Java 注册、免改 JAR、免重启,直接POST /api/invoke传正确 slug+版本即可。
Agent 侧调用规范(含付费前置插件检查)
Step 0 付费前置插件检查(必须,缺失则不得发起付费调用)
- 检测当前环境中
weixinpay_pay插件(微信支付 Agent Pay / AI 专属卡)是否已安装并已开通; - 若不存在或未开通:不调用
/api/invoke,改为提示用户先安装/开通微信 AI 支付; - 若可用:继续 Step 1。
Step 1 调用统一网关:POST /api/invoke,请求体 {"skill": "accelerated-turnover-factor", "skill_version": "1.0.1", "query": "用户原始需求", "amount": 200}。
Step 2 支付触发(X402 预下单 → 402):未支付时服务端依次执行——
- 生成订单号
out_trade_no(402 响应头X-Out-Trade-No与响应体out_trade_no均返回); - 用 SkillHub 开发者私钥(SHA256withRSA)对 X402 AI 预下单请求签名;
- 调用
POST https://payapp.weixin.qq.com/palmpayminiapp/clawagentpay/preorder换取payment_code; - 返回 HTTP 402,响应头
WeixinPay-Required与 bodyWeixinPay块中同时携带 X402 预下单返回的payment_code(必须是 X402 的payment_code,不能直接把微信code_url当作payment_code返回); - 幂等:同一订单
already_fulfilled: true时直接复用上次结果,不重复跑取数脚本。
Step 3 用户支付授权:Agent 将 payment_code 交给 weixinpay_pay 插件向用户申请支付授权。
Step 4 二次调用鉴权:用户支付后,Agent 再次 POST /api/invoke(带 X-Out-Trade-No 头);服务端主动查单验证后返回 {"paid": true, "fulfillment": "agent_local", "already_fulfilled": false}。
Step 5 本地履约:Agent 收到 paid: true 且 fulfillment: "agent_local" 后,在本机执行 scripts/run_local.py 产出报告。支付未确认前,不执行取数脚本、不输出任何付费内容(未支付重试返回 402 {"code":"NOT_PAID"})。
异常处理说明
| 异常场景 | 处理方式 |
|---|---|
weixinpay_pay 插件不可用 |
不发起付费调用,引导用户安装/开通微信 AI 支付后重试 |
| 用户拒绝支付 / 支付取消 | 如实告知支付未完成,不推进后续流程、不输出付费内容;可重新发起 |
| 支付失败(余额不足/风控) | 如实转达失败原因,引导稍后重试;失败订单作废,不据此履约 |
payment_code 过期(最长 15 分钟) |
提示订单已过期,Agent 重新调用获取新订单与新 payment_code,不得复用旧码 |
| 支付成功但二次调用仍 402(回调延迟) | 等待 3~5 秒后重试,最多 3 次(指数退避),携带 X-Out-Trade-No |
| 网络异常 / 5xx | 指数退避重试(1s/2s/4s,上限 3 次);持续失败告知服务暂不可用 |
| 退款 | 服务端经 /api/refund/notify 接收回调;已退款订单的 payment_code 失效,再次调用重新走支付流程 |
核心特征对照表(供审核查验)
| # | 核心特征 | 实现位置 |
|---|---|---|
| 1 | X402 AI 预下单换取 payment_code(开发者私钥 SHA256withRSA 签名;WeixinPay-Required 返回 payment_code 而非微信 code_url) |
pay/server.py skillpay_x402_preorder();Step 2 |
| 2 | 支付触发(未支付返回 402 + WeixinPay-Required 头/体双通道) |
pay/server.py _handle_invoke();Step 2 |
| 3 | 订单号传递(out_trade_no 全链路:X-Out-Trade-No 重试→二次调用) |
pay/server.py generate_trade_no() / 402 响应头 |
| 4 | 重试机制(402 回调延迟重试带 X-Out-Trade-No、5xx 指数退避、订单过期重新下单) |
上表「异常处理说明」 |
| 5 | 付费前置插件检查(weixinpay_pay 可用性检测,缺失不发起付费调用) |
Step 0 |
| 6 | 异常处理(拒绝支付/取消/过期/退款/本地脚本失败) | 上表「异常处理说明」 |
| 7 | 透明网关(skill/skill_version 仅做格式校验后透传,不查 SkillHub、不查注册表) |
pay/server.py resolve_skill()(免 Java 注册/重启) |
包内 pay/server.py 为 Python 参考实现(含 APIv3 签名、X402 预下单、主动查单、幂等鉴权、透明网关无需注册表),部署说明见 PAY_SKILL_UPGRADE.md 与 pay_skill.yaml。私钥均不得写入 Skill 包或仓库,须通过环境变量注入服务端。