群组文档-禄得会员牛马(-1003971188421)
禄得网三页通用插件骨架:设计、实现与部署记录
Hello World 测试文档(群组文档)
Hello World 测试文档(群组文档)- 仅文本
示范图插件骨架脚本:纠偏实现、最小交付与验证方法
回测结果收益率直方图分布实施方案(已执行)
禄得网回测收益率直方图分布脚本:群组文档版
禄得网转债页面 Hello World 浏览器脚本:实现说明与部署记录
禄得会员牛马 System Prompt 更新说明
禄得助手 2 至 20 号批量雇佣请求记录
禄得网转债、股票与 ETF 页面前端及接口文档:脚本开发参考
禄得网 Hyper Tuning 页面前端及接口文档:群组脚本开发参考
本文档使用 MrDoc 发布
-
+
首页
禄得网转债、股票与 ETF 页面前端及接口文档:脚本开发参考
# 禄得网转债、股票与 ETF 页面前端及接口文档:脚本开发参考 ## 摘要 本文基于群组历史先例、禄得网前端资源清单、静态 JavaScript Bundle 检索结果与路由/接口命名特征,整理转债、股票与 ETF 三类页面的前端结构与接口文档,作为后续浏览器脚本、页面增强工具、自动化测试与接口观测脚本的统一参考。本文遵循 Case Law 原则:一方面沿用本群已有“页面内注入脚本”“回测收益率分布脚本”“群组文档沉淀”的处理先例;另一方面在无法直接读取登录态运行时网络面板的情况下,采用静态 Bundle 逆向法补足页面路由、模块边界与 API 命名信息。该偏离属于最小偏离,因为现有工具链未直接暴露 CDP 网络抓包接口,但静态分析已足够支持第一版脚本开发。 ## 关键词 禄得网;可转债;股票;ETF;前端逆向;接口文档;浏览器脚本;Case Law ## 1. 引言 禄得网量化页面是典型单页应用(SPA)。后续无论开发页面注入脚本、数据提取脚本、操作增强脚本,还是做接口观测与回测辅助,都需要一份稳定的基础文档,用于回答以下问题: 1. 三类页面分别对应哪些路由; 2. 页面共享哪些结构,不同之处位于何处; 3. 前端已暴露哪些接口能力; 4. 哪些 DOM 选择器、状态容器与注入点更稳定; 5. 编写脚本时应如何降低版本漂移风险。 本文将三类页面统一建模,以服务后续脚本开发。 ## 2. Case Law 决策依据 ### 2.1 已检索先例 通过 `get_conversation_history` 与 `wiki_search` 检索到以下直接相关先例: 1. 文档 [464]《回测结果收益率直方图分布实施方案(已执行)》; 2. 文档 [470]《禄得网回测收益率直方图分布脚本:群组文档版》; 3. 文档 [477]《禄得网转债页面 Hello World 浏览器脚本:实现说明与部署记录》; 4. 文档 [478]《示范图插件骨架脚本:纠偏实现、最小交付与验证方法》。 ### 2.2 沿用先例 本次决策沿用如下历史原则: 1. 先检索历史记录与文档,再决定实现路径; 2. 对禄得网页面增强任务,优先沉淀为群组 Wiki 文档; 3. 脚本开发说明采用“摘要—方法—结果—结论”的学术格式; 4. 在缺乏直接页面运行态抓包能力时,可先以静态资源逆向建立第一版参考文档。 ### 2.3 与先例的最小偏离 偏离点在于:本次不直接依赖浏览器 Network 面板实时抓包,而是通过站点 `asset-manifest.json`、主 Bundle 与多个分 Chunk 文件进行静态分析。偏离理由如下: 1. 当前会话可访问当前页面,但未获得可直接导出 Network 请求明细的接口; 2. 目标是“脚本开发参考文档”,并非“接口调试白盒文档”; 3. 静态 Bundle 已暴露明确的路由命名、接口路径模板、方法族命名与页面边界,可满足第一版开发参考需求。 ## 3. 研究方法 ### 3.1 数据来源 本次文档依据如下证据源: 1. 页面入口:`https://next.lude.site/rotation/convertible-bond`; 2. 资源清单:`/asset-manifest.json`; 3. 主 Bundle:`/assets/js/main.d30919d5.js`; 4. 页面相关 Chunk:包括但不限于 `1368.e29433f7.chunk.js`、`3582.bf254173.chunk.js`、`4364.a32643e7.chunk.js`、`3245.c55f7495.chunk.js`、`1336.92e71386.chunk.js`、`7592.36b7b6c1.chunk.js`。 ### 3.2 分析方法 采用以下步骤进行逆向: 1. 从资源清单定位主包与动态 Chunk; 2. 通过关键词检索定位路由常量与页面模块; 3. 通过 API 方法名追踪接口分类; 4. 归纳转债、股票、ETF 三类页面的共性与差异; 5. 输出可用于浏览器脚本开发的稳定锚点与风险项。 ## 4. 页面总体架构 ### 4.1 已识别业务路由 静态 Bundle 中明确出现如下路由: 1. `/rotation/convertible-bond` 2. `/rotation/stock` 3. `/rotation/etf` 4. `/rotation/strategy-correlation` 其中前三者即本文核心对象,第四者为相关扩展页面。 ### 4.2 页面组织形态 从 Chunk 命名与模块职责可推断: 1. 应用为 React 单页应用; 2. UI 组件明显使用 Ant Design 体系; 3. 三类页面采用“同构页面 + 不同数据源”的模式; 4. 转债、股票、ETF 页面分别对应独立业务模块,但共享策略列表、策略详情、回测、筛选、分组策略等抽象; 5. 页面存在动态加载 Chunk,因此脚本注入不能只依赖首次 DOM 渲染,必须容忍异步内容加载。 ### 4.3 可推断的页面功能区域 结合方法名与现有页面经验,可将三类页面抽象为以下区域: 1. **策略列表区**:展示已有策略或策略组; 2. **策略编辑区**:编辑因子、权重、参数、阈值与备注; 3. **回测区**:发起回测、查看历史回测、查看日持仓明细; 4. **筛选区**:实时筛选与历史筛选; 5. **因子配置区**:加载因子配置与函数说明; 6. **分组策略区**: group strategy 的创建、更新与排序; 7. **超参调优扩展区**:在部分 Chunk 中可见 hyper-tunings 相关能力。 ## 5. 三类页面的统一数据模型 ### 5.1 统一对象族 前端对三类资产使用平行命名: 1. CB:Convertible Bond,转债; 2. STK:Stock,股票; 3. ETF:ETF。 这意味着脚本开发时可以优先做“统一框架 + 资产特化适配层”。 ### 5.2 统一能力族 三类页面普遍包含以下能力: 1. 获取可选项 `get*Options`; 2. 获取因子配置 `get*FactorConfig`; 3. 获取策略列表 `get*StrategyList`; 4. 获取策略详情 `get*StrategyDetail`; 5. 创建策略 `create*Strategy`; 6. 更新策略 `update*Strategy`; 7. 删除策略 `delete*Strategy`; 8. 更新策略名称/备注; 9. 更新策略 glance; 10. 批量更新 strategy glances; 11. 发起回测 `startBacktest` 或 `startAdvancedBacktest`; 12. 历史/实时筛选 `historyScreen` 与 `realtimeScreen`; 13. 获取日持仓明细 `getDailyPositionDetail`; 14. 分组策略 list/detail/create/update。 ### 5.3 差异点 三类页面的主要差异并不在页面骨架,而在: 1. 因子集合不同; 2. options 数据结构不同; 3. 回测语义可能略有差异; 4. 股票与 ETF 使用 `startBacktest`,转债模块中可见 `startAdvancedBacktest` 与 `gridBacktest`; 5. 转债存在 `getCBRealtimeFactors`,股票存在 `getSTKRealtimeFactors`,ETF 侧更多围绕因子配置与策略流程。 ## 6. 转债页面文档 ### 6.1 路由 转债主页面路由为: - `/rotation/convertible-bond` 同时还出现引导态路由: - `/rotation/convertible-bond?guide=task_2_save_strategy` - `/rotation/convertible-bond?guide=task_3_backtest` - `/rotation/convertible-bond?guide=task_4_screen` 这说明页面可能存在新手引导或任务流状态,脚本应避免误伤带 `guide` 参数的流程弹层。 ### 6.2 前端模块线索 转债页面相关方法集中在一组独立模块中,包括: - `getBondOptions` - `getBondFactorConfig` - `getCBStrategyList` - `getCBStrategyDetail` - `createCBStrategy` - `updateCBStrategy` - `deleteCBStrategy` - `updateCBStrategyName` - `updateCBStrategyRemark` - `updateCBStrategyGlance` - `batchUpdateCBStrategyGlance` - `getCBGroupStrategyList` - `getCBGroupStrategyDetail` - `createCBGroupStrategy` - `updateCBGroupStrategy` - `startAdvancedBacktest` - `gridBacktest` - `historyScreen` - `realtimeScreen` - `getDailyPositionDetail` - `getCBRealtimeFactors` ### 6.3 接口路径 静态检索到的转债相关接口路径如下: #### 6.3.1 配置与选项 - `GET /v1/quant/convertible-bond/options` - `GET /v1/quant/convertible-bond/factors/{factorSetOrCategory}` - `GET /v1/quant/convertible-bond/realtime-factors` #### 6.3.2 策略管理 - `GET /v1/quant/convertible-bond/strategy/list` - `GET /v1/quant/convertible-bond/strategy/detail/{strategyId}` - `POST /v1/quant/convertible-bond/strategy` - `PUT /v1/quant/convertible-bond/strategy/{strategyId}` - `DELETE /v1/quant/convertible-bond/strategy/{strategyId}` - `PUT /v1/quant/convertible-bond/strategy/{strategyId}/name` - `PUT /v1/quant/convertible-bond/strategy/{strategyId}/remark` #### 6.3.3 分组策略 - `GET /v1/quant/convertible-bond/strategy/group/list` - `GET /v1/quant/convertible-bond/strategy/group/detail/{groupId}` - `POST /v1/quant/convertible-bond/strategy/group` - `PUT /v1/quant/convertible-bond/strategy/group/{groupId}` #### 6.3.4 回测与分析 - `POST /v2/quant/convertible-bond/backtest` - `GET /v2/quant/convertible-bond/backtests` - `GET /v2/quant/convertible-bond/backtest/{backtestId}/detail/{tradeDateOrIndex}` - `POST /v1/quant/convertible-bond/grid-backtest` - `POST /v2/quant/convertible-bond/factor-analysis` - `POST /v2/quant/convertible-bond/binning` #### 6.3.5 筛选与视图状态 - `POST /v2/quant/convertible-bond/screen/history` - `POST /v2/quant/convertible-bond/screen/realtime` - `PUT /v2/quant/convertible-bond/strategy/{strategyId}/glance` - `PUT /v2/quant/convertible-bond/strategy/glances` #### 6.3.6 自定义因子 - `GET /v1/quant/convertible-bond/customized-factors` - `POST /v1/quant/convertible-bond/customized-factors` - `PUT /v1/quant/convertible-bond/customized-factors/{factorId}` - `DELETE /v1/quant/convertible-bond/customized-factors/{factorId}` ### 6.4 脚本开发提示 转债页面更适合开发以下脚本: 1. 回测结果增强脚本; 2. 策略列表批量标注脚本; 3. 转债筛选结果导出脚本; 4. 回测参数快照与恢复脚本; 5. 因子配置观察器。 ## 7. 股票页面文档 ### 7.1 路由 股票页面主路由为: - `/rotation/stock` 同时出现引导态路由: - `/rotation/stock?guide=task_2_save_strategy` - `/rotation/stock?guide=task_3_backtest` - `/rotation/stock?guide=task_4_screen` ### 7.2 前端模块线索 股票页面相关方法包括: - `getStockOptions` - `getStockFactorConfig` - `getSTKStrategyList` - `getSTKStrategyDetail` - `createSTKStrategy` - `updateSTKStrategy` - `deleteSTKStrategy` - `updateSTKStrategyName` - `updateSTKStrategyRemark` - `updateSTKStrategyGlance` - `batchUpdateSTKStrategyGlance` - `getSTKGroupStrategyList` - `getSTKGroupStrategyDetail` - `createSTKGroupStrategy` - `updateSTKGroupStrategy` - `startBacktest` - `historyScreen` - `realtimeScreen` - `getDailyPositionDetail` - `getSTKRealtimeFactors` ### 7.3 接口路径 #### 7.3.1 配置与选项 - `GET /v1/quant/stock/options` - `GET /v1/quant/stock/factors/{factorSetOrCategory}` - `GET /v1/quant/stock/realtime-factors` #### 7.3.2 策略管理 - `GET /v1/quant/stock/strategy/list` - `GET /v1/quant/stock/strategy/detail/{strategyId}` - `POST /v1/quant/stock/strategy` - `PUT /v1/quant/stock/strategy/{strategyId}` - `DELETE /v1/quant/stock/strategy/{strategyId}` - `PUT /v1/quant/stock/strategy/{strategyId}/name` - `PUT /v1/quant/stock/strategy/{strategyId}/remark` #### 7.3.3 分组策略 - `GET /v1/quant/stock/strategy/group/list` - `GET /v1/quant/stock/strategy/group/detail/{groupId}` - `POST /v1/quant/stock/strategy/group` - `PUT /v1/quant/stock/strategy/group/{groupId}` #### 7.3.4 回测与分析 - `POST /v2/quant/stock/backtest` - `GET /v2/quant/stock/backtests` - `GET /v2/quant/stock/backtest/{backtestId}/detail/{tradeDateOrIndex}` - `POST /v2/quant/stock/factor-analysis` - `POST /v2/quant/stock/binning` #### 7.3.5 筛选与视图状态 - `POST /v2/quant/stock/screen/history` - `POST /v2/quant/stock/screen/realtime` - `PUT /v2/quant/stock/strategy/{strategyId}/glance` - `PUT /v2/quant/stock/strategy/glances` #### 7.3.6 自定义因子 - `GET /v1/quant/stock/customized-factors` - `POST /v1/quant/stock/customized-factors` - `PUT /v1/quant/stock/customized-factors/{factorId}` - `DELETE /v1/quant/stock/customized-factors/{factorId}` ### 7.4 脚本开发提示 股票页适合优先开发: 1. 策略列表批量管理脚本; 2. 因子面板折叠/搜索增强脚本; 3. 回测历史筛选与导出脚本; 4. 分组策略重排辅助脚本; 5. 实时筛选结果快照脚本。 ## 8. ETF 页面文档 ### 8.1 路由 ETF 页面主路由为: - `/rotation/etf` ### 8.2 前端模块线索 ETF 页面相关方法包括: - `getETFOptions` - `getETFFactorConfig` - `getETFStrategyList` - `getETFStrategyDetail` - `createETFStrategy` - `updateETFStrategy` - `deleteETFStrategy` - `updateETFStrategyName` - `updateETFStrategyRemark` - `updateETFStrategyGlance` - `batchUpdateETFStrategyGlance` - `getETFGroupStrategyList` - `getETFGroupStrategyDetail` - `createETFGroupStrategy` - `updateETFGroupStrategy` - `startBacktest` - `historyScreen` - `realtimeScreen` - `getDailyPositionDetail` ### 8.3 接口路径 #### 8.3.1 配置与选项 - `GET /v1/quant/etf/options` - `GET /v1/quant/etf/factors/{factorSetOrCategory}` #### 8.3.2 策略管理 - `GET /v1/quant/etf/strategy/list` - `GET /v1/quant/etf/strategy/detail/{strategyId}` - `POST /v1/quant/etf/strategy` - `PUT /v1/quant/etf/strategy/{strategyId}` - `DELETE /v1/quant/etf/strategy/{strategyId}` - `PUT /v1/quant/etf/strategy/{strategyId}/name` - `PUT /v1/quant/etf/strategy/{strategyId}/remark` #### 8.3.3 分组策略 - `GET /v1/quant/etf/strategy/group/list` - `GET /v1/quant/etf/strategy/group/detail/{groupId}` - `POST /v1/quant/etf/strategy/group` - `PUT /v1/quant/etf/strategy/group/{groupId}` #### 8.3.4 回测与分析 - `POST /v2/quant/etf/backtest` - `GET /v2/quant/etf/backtests` - `GET /v2/quant/etf/backtest/{backtestId}/detail/{tradeDateOrIndex}` - `POST /v2/quant/etf/factor-analysis` - `POST /v2/quant/etf/binning` #### 8.3.5 筛选与视图状态 - `POST /v2/quant/etf/screen/history` - `POST /v2/quant/etf/screen/realtime` - `PUT /v2/quant/etf/strategy/{strategyId}/glance` - `PUT /v2/quant/etf/strategy/glances` #### 8.3.6 自定义因子 - `GET /v1/quant/etf/customized-factors` - `POST /v1/quant/etf/customized-factors` - `PUT /v1/quant/etf/customized-factors/{factorId}` - `DELETE /v1/quant/etf/customized-factors/{factorId}` ### 8.4 脚本开发提示 ETF 页更适合: 1. 轻量级策略编辑增强; 2. 回测批量查看脚本; 3. ETF 因子面板可视化整理脚本; 4. 列表筛选与标签增强脚本。 ## 9. 跨页面公共接口 静态分析还识别到多类跨页面公共接口: 1. `GET /v1/quant/backtest/list` 2. `GET /v2/quant/backtests` 3. `GET /v1/quant/strategy/options` 4. `PUT /v1/quant/strategy/{strategyId}/order` 5. `PUT /v1/quant/strategy/strategies-order` 6. `GET /v1/quant/factor-functions` 7. `GET /v1/quant/security-pools` 8. `GET /v1/quant/security-pools/customized` 9. `POST /v1/quant/security-pools/customized` 10. `GET /v2/quant/trade-calendar/{market}/closed-dates` 11. `GET /v2/quant/hyper-tunings` 12. `GET /v2/quant/hyper-tunings/{id}` 13. `GET /v2/quant/hyper-tunings/{id}/answers` 14. `POST /v2/quant/hyper-tunings/{id}/resume` 15. `GET /v2/quant/hyper-tunings/objective-functions` 这些公共接口意味着多个页面共享同一层业务基础设施,适合沉淀为统一拦截器与统一数据观察器。 ## 10. 前端实现特征与脚本注入建议 ### 10.1 技术栈判断 基于 Bundle 特征可判断: 1. 前端使用 React; 2. 组件库高度疑似 Ant Design; 3. 路由为前端路由,切页不会整站刷新; 4. 页面大量使用异步渲染与动态 Chunk。 ### 10.2 推荐注入时机 建议脚本默认使用 `document_idle` 注入,并在注入后继续做以下处理: 1. 监听 `location.href` 变化; 2. 轮询或观察 `#root` 下内容变化; 3. 使用 `MutationObserver` 等待目标面板出现; 4. 对表格、抽屉、弹窗使用延迟挂载逻辑。 ### 10.3 推荐页面识别方式 优先级建议如下: 1. `location.pathname` 精确识别页面类型; 2. 再结合 URL 参数识别是否在引导态; 3. 再结合页面上是否出现策略列表、回测区域、因子面板等结构做二次确认。 示例: - `pathname === '/rotation/convertible-bond'` 判定为转债页; - `pathname === '/rotation/stock'` 判定为股票页; - `pathname === '/rotation/etf'` 判定为 ETF 页。 ### 10.4 稳定选择器策略 由于 Ant Design 与构建产物 class 可能变动,不建议依赖哈希类名。建议优先: 1. 带语义的文本标题; 2. 表格列标题文本; 3. 按钮文案; 4. Drawer/Modal 的标题文本; 5. `location.pathname` + 结构层级联合识别; 6. 业务字段出现顺序,而非样式类名。 ### 10.5 推荐脚本分层 建议将脚本拆为以下层次: 1. **router 层**:识别页面类型与子状态; 2. **dom adapter 层**:定位策略表、因子区、回测区、弹窗区; 3. **api observer 层**:拦截 `fetch`/XHR 并归档请求; 4. **feature 层**:实现导出、标注、增强、统计、快捷操作; 5. **storage 层**:本地缓存用户偏好、上次参数、导出模板。 ## 11. 接口观测脚本建议 为后续开发,建议优先制作一个“统一接口观测器脚本”,其功能如下: 1. 劫持 `window.fetch`; 2. 劫持 `XMLHttpRequest.prototype.open/send`; 3. 仅记录包含 `/v1/quant/`、`/v2/quant/` 的请求; 4. 提取 method、url、status、duration、response 摘要; 5. 按页面类型分别缓存最近 N 条请求; 6. 为转债、股票、ETF 页面各自输出接口样本。 该脚本将为第二版“运行态接口文档”提供真实证据。 ## 12. 风险分析 ### 12.1 静态逆向的局限 本文主要基于静态 Bundle,存在以下限制: 1. 无法百分之百确认每个接口的 HTTP 方法; 2. 无法直接看到请求体字段结构; 3. 无法确认权限拦截、分页参数、筛选参数的完整命名; 4. 无法确认某些接口仅在特定用户等级下出现。 ### 12.2 版本漂移风险 由于 Bundle 哈希会变,以下内容容易漂移: 1. Chunk 文件名; 2. 组件结构层级; 3. 文案细节; 4. 某些引导态参数与交互流程。 ### 12.3 规避策略 建议: 1. 以路由与接口前缀为主锚点; 2. 把 DOM 选择器写成多候选回退链; 3. 把脚本日志与异常收集标准化; 4. 为接口观测器保留导出能力,便于版本更新后快速重建文档。 ## 13. 推荐开发路线图 ### 13.1 第一阶段:观测 1. 统一接口拦截器; 2. 页面区域识别器; 3. DOM 探针与日志面板。 ### 13.2 第二阶段:增强 1. 列表导出; 2. 回测结果增强; 3. 因子搜索与标记; 4. 批量复制参数; 5. 策略标签与备注辅助。 ### 13.3 第三阶段:自动化 1. 策略快照保存与恢复; 2. 批量回测; 3. 筛选结果采集; 4. 多页面统一数据面板。 ## 14. 结论 本文已经为禄得网转债、股票与 ETF 页面建立了一份第一版前端及接口参考文档。其核心结论如下: 1. 三类页面采用明显的统一架构,只是资产类型不同; 2. 接口命名具有高度平行性,适合按模板化方式开发脚本; 3. 路由、策略、因子、回测、筛选与分组策略是最重要的公共抽象; 4. 第一版脚本开发无需等待完整抓包,即可先搭建观察器、导出器与增强器; 5. 后续应以运行态接口观测器补齐请求参数与返回结构,形成第二版白盒文档。 ## 参考证据附录 ### 附录 A:识别出的核心路由 - `/rotation/convertible-bond` - `/rotation/stock` - `/rotation/etf` - `/rotation/strategy-correlation` ### 附录 B:识别出的核心方法名样本 - `getCBStrategyList` - `getSTKStrategyList` - `getETFStrategyList` - `getCBStrategyDetail` - `getSTKStrategyDetail` - `getETFStrategyDetail` - `createCBStrategy` - `createSTKStrategy` - `createETFStrategy` - `updateCBStrategy` - `updateSTKStrategy` - `updateETFStrategy` - `getBondFactorConfig` - `getStockFactorConfig` - `getETFFactorConfig` - `getBondOptions` - `getStockOptions` - `getETFOptions` - `getBacktestHistoryListV2` - `getDailyPositionDetail` ### 附录 C:后续文档更新建议 待运行态拦截脚本完成后,建议在本文基础上补充: 1. 每个接口的 method、query、body 样例; 2. 关键响应字段说明; 3. 失败码与弹窗文案映射; 4. 真实 DOM 截图与选择器样例; 5. 页面状态机描述。 ### 附录 D:可转债策略列表当前回撤与平均回撤率增强脚本验证记录 #### D.1 研究问题 2026-05-14,在 `/rotation/convertible-bond` 策略列表页验证了一个书签脚本需求:用户点击策略行“更新”后,在“最大回撤”附近新增“当前回撤”和“平均回撤率”两列,用于观察完整回测时间轴上的实时回撤状态。 #### D.2 方法 运行态观测表明,策略列表接口 `/v1/quant/convertible-bond/strategy/list` 只提供 `daily_max_drawdown` 等汇总字段,不能直接得到当前回撤或平均回撤率。因此脚本采用以下接口链路: 1. `GET /v1/quant/convertible-bond/strategy/list`:按 `strategy_name` 定位 `strategy_id`; 2. `GET /v1/quant/convertible-bond/strategy/detail/{strategy_id}`:读取策略参数; 3. `POST /v2/quant/convertible-bond/backtest`:提交 `{ ...detail, strategy: detail.parameters, backtest_type: 2 }`,并删除原 `parameters` 字段; 4. 解析返回的 `text/event-stream` 数据块,从 `timelines` 中读取 `drawdown`,若缺失则由 `equity` 运行峰值计算回撤。 #### D.3 结果 v002 版本书签脚本已在当前页面注入验证。以策略“七因子”为样本,脚本返回样本数 883,最后日期 2026-03-25,当前回撤为 -1.14%,平均回撤率为 -1.40%,并已成功写入策略列表新增列。 #### D.4 关键实现约束 脚本使用 `Access-Token` 请求头读取登录态,不使用 `Authorization`。旧 v001 实现曾在 `applyMetricToRows()` 内反向调用 `ensureColumns()`,导致已有指标写回时递归触发 `Maximum call stack size exceeded`;v002 已删除该反向调用,并在新版本注入前调用旧实例 `stop()`,避免重复事件监听。 #### D.5 v003 短书签与性能优化 2026-05-14,长书签在用户侧出现执行无反馈和页面卡顿。运行态检查确认未加载时页面不存在 `window.__LudeDrawdownEnhancer`,因此发布 v003 短书签方案:书签只创建 `<script src="...">` 加载外部脚本文本,避免超长 `javascript:` 内容复制或保存时被截断。 v003 同时将 `MutationObserver` 的直接全表扫描改为 `requestAnimationFrame` 合并调度,减少 Ant Design 表格频繁 DOM 变更时的重复扫描;点击“更新”后不再使用固定延迟,直接进入 `computeStrategyMetric()`,由 `runningNames` 防重入。验证结果表明,外部脚本可通过 `script` 标签加载,当前页实例版本为 `current-average-drawdown-20260514-v003`,并成功显示“当前回撤”和“平均回撤率”两列。 #### D.6 v004 当前回撤日期修正 2026-05-14,用户指出“七因子”当前回撤率应为 -3.90%,而 v003 显示 -1.14%。运行态复核发现:策略列表接口中的“七因子”结束日为 2026-05-13,但详情接口返回的 `end_date` 为 2026-03-25;v003 直接使用详情数据提交回测,导致时间轴只到 2026-03-25。v004 在构造回测 payload 时使用策略列表的 `start_date/end_date` 覆盖详情日期,再提交 `/v2/quant/convertible-bond/backtest`。验证结果:样本数从 883 增至 914,最后日期为 2026-05-13,当前回撤为 -3.90%,平均回撤率为 -1.42%,与页面图表提示一致。 #### D.7 v006 策略列表 Excel 导出 2026-05-14,用户提出在带有“当前回撤”和“平均回撤率”的策略列表界面增加导出能力。v006 在页面按钮区插入“导出Excel”按钮,导出前读取 `/v1/quant/convertible-bond/strategy/list` 的全量 72 条策略;对尚未计算回撤指标的策略,按 v004 的回测链路逐条补算当前回撤和平均回撤率;随后生成 Excel 可打开的 HTML `.xls` 文件。 导出字段包括:序号、策略名称、回测区间、总收益、年化收益、创建以来、最大回撤、当前回撤、平均回撤率、夏普、本月、本年、近1日、近1周、近1月、近3月、近1年、回撤样本数、当前回撤日期。运行态验证显示:v006 成功安装“导出Excel”按钮,导出预览包含 72 行和 19 个字段;以“七因子”为样本,导出行包含当前回撤 -4.86%、平均回撤率 -1.43%、当前回撤日期 2026-05-14。 #### D.8 v009 本地书签与已选策略导出 2026-05-16,用户要求保留“当前回撤/平均回撤率/导出 Excel”功能,但导出时不再全量导出,而是由用户自行决定导出哪些策略行,并要求书签本地运行、不再远程加载脚本。v009 沿用 v006 的回撤计算链路和导出字段,最小改动为:在主策略表新增“导出”勾选列,将按钮文案改为“导出已选Excel”,导出前只读取已勾选策略名,只对已选策略补算当前回撤与平均回撤率;未勾选时提示“请先勾选要导出的策略行”,不触发全量回测。 运行态验证过程发现 v007 初版的行选择器过宽,曾将勾选框插入参数小表;v008 收窄为包含“策略名称/最大回撤/操作”的主 `.ant-table`,并在启动时清理旧误插入的选择列;v009 修正新增“导出”列后策略名称索引偏移的问题。最终验证显示:主策略表 71 行对应 71 个勾选框,外部勾选框数量为 0;勾选“单吊2-新-拟”和“130以上不强赎”后导出,日志显示 `selectedCount=2`,仅补算这两条策略并生成 `.xls` 文件。验证结果:console error 为 0,网络 4xx/5xx 为 0,失败请求为 0。本地交付文件为 `/home/horizon/chat--5179204355/lude_current_average_drawdown_export_select_v009.js` 与 `/home/horizon/chat--5179204355/lude_current_average_drawdown_export_select_v009_bookmarklet.txt`。 ### 附录 E:可转债策略盘后/盘中选债差异书签验证记录 #### E.1 研究问题 2026-05-16,用户提出在 `/rotation/convertible-bond` 策略列表中新增一个可由书签注入的行级按钮。点击某一策略后,脚本应展示该策略盘后选债与盘中选债的差异,包括仅盘后持有、仅盘中持有与共同持有三类集合。 #### E.2 方法 本次实现沿用附录 D 的策略详情接口链路,并复用盘后盘中选债分析小能手(文档 ID:487)的 `screen/history` 与 `screen/realtime` 响应结构假设。运行态验证确认:策略列表 Ant Table 的策略行可通过 `.ant-table-row[data-row-key]` 获取 `strategy_id`;策略名称位于第 5 个单元格,回测区间位于第 6 个单元格。脚本读取 `localStorage.lude_token` 中的 `access_token`,以 `Access-Token` 请求头访问 `https://api-ali.lude.site`。 #### E.3 接口链路 1. `GET /v1/quant/convertible-bond/strategy/detail/{strategy_id}`:读取 `parameters` 与策略详情; 2. `POST /v2/quant/convertible-bond/screen/history`:提交 `{ parameters, trade_date }`,其中 `trade_date` 优先取策略列表回测区间结束日; 3. `POST /v2/quant/convertible-bond/screen/realtime`:提交 `{ parameters }`; 4. 两个响应均从 `data.list_items` 取前 `parameters.hold_method.hold_range_end` 只,按转债代码计算差集与交集。 #### E.4 结果 本地交付文件为 `/home/horizon/chat--5179204355/lude_strategy_after_realtime_diff_bookmark.js` 与 `/home/horizon/chat--5179204355/lude_strategy_after_realtime_diff_bookmarklet.txt`。在当前页面注入验证时,脚本为 71 条策略行注入 71 个“盘中对比”按钮。以策略“单吊2-新-拟”为样本,脚本读取 `hold_range_end=2`,使用策略列表结束日 `2026-05-15` 请求盘后选债,返回盘后全量 86 行、盘中全量 87 行;面板展示盘后 2 只、盘中 2 只、仅盘后 1 只、仅盘中 1 只、共同 1 只。 #### E.5 验证与限制 验证阶段控制台 error 为 0,书签自身接口未产生 4xx/5xx。页面网络日志中存在 `https://api.lude.site/v1/public/maintenance-status` 的 `net::ERR_ABORTED`,该请求来自禄得页面自身 EndpointManager 探测,且页面已选择 `https://api-ali.lude.site`,不影响书签功能。长书签约 17.8KB,若浏览器收藏夹保存时出现截断,应沿用附录 D.5 的短书签加载外部脚本方案。 #### E.6 v002 展示优化 2026-05-16,用户根据截图标注要求优化差异列表展示。v002 将差异行左侧编号从“分组内序号”改为原始盘后/盘中排名;“仅盘后持有”行右侧补充盘中排名状态、收盘价、涨跌幅与成交额;“仅盘中持有”行右侧补充盘后全量排名及行情摘要;共同持有行继续展示盘后排名、盘中排名、排名变化箭头、收盘价、涨跌幅与成交额。以策略“超级无敌123实盘用”为样本复验:仅盘后行显示原始排名 3 与 `盘中:null`,仅盘中行显示原始排名 5 与 `盘后:6`,共同持有中盘后 4 变盘中 3 显示红色下三角。复验结果:console error 为 0,网络 4xx/5xx 为 0,失败请求为 0。 ### 附录 F:可转债策略盘后持仓实时收益书签验证记录 #### F.1 研究问题 2026-05-16,用户提出在可转债策略列表中继续新增一个书签按钮。点击某一策略后,脚本应展示该策略盘后选债持仓的实时行情,包括价格、涨跌幅、成交额、当日最高涨幅、止盈状态,并按“已止盈用止盈点、未止盈用实时涨跌幅”的口径计算策略实时收益率。 #### F.2 方法 本次实现沿用附录 E 的策略列表行级按钮注入、`Access-Token` 认证、`https://api-ali.lude.site` API base、策略详情读取和 `screen/history` 盘后持仓提取方法。新增数据源为 `GET /v1/quant/convertible-bond/realtime-factors`,运行态验证该接口返回 `data.list_items`,样本规模为 351 行,字段包含 `code`、`name`、`close`、`pct_chg`、`amount`、`high`、`time`。该接口属于禄得站内数据源,优先级高于外部行情网站。 #### F.3 计算口径 盘后持仓取 `POST /v2/quant/convertible-bond/screen/history` 返回的前 `parameters.hold_method.hold_range_end` 只,交易日优先使用策略列表回测区间结束日。实时行情按 `code` 与 `realtime-factors` 匹配。前收盘价由 `preClose = close / (1 + pct_chg)` 推导;当日最高涨幅由 `highPct = high / preClose - 1` 计算并以百分比展示。止盈点来自 `detail.parameters.stop_method.stop_value`,如 `0.052000000000000005` 表示 5.20%。若 `highPct >= stopValuePct`,单票贡献取止盈点;否则取实时涨跌幅。策略实时收益率按盘后持仓数作为分母求平均,缺失实时因子的标的在面板中提示未匹配。 #### F.4 结果 本地交付文件为 `/home/horizon/chat--5179204355/lude_strategy_after_realtime_return_bookmark.js` 与 `/home/horizon/chat--5179204355/lude_strategy_after_realtime_return_bookmarklet.txt`。在当前页面注入验证时,脚本为 71 条策略行注入 71 个“实时收益”按钮。以策略“超级无敌123实盘用”为样本,脚本读取 `hold_range_end=5`、`stop_value=0.052000000000000005`、盘后日期 `2026-05-15`;`strategy/detail`、`screen/history` 与 `realtime-factors` 均返回 200。样本盘后 5 只全部匹配实时因子,有效匹配数为 5/5,面板展示策略实时收益率 `-1.50%`,内部计算值为 `-1.50325004%`。 #### F.5 验证与限制 CDP 验证显示:控制台 error 为 0,书签相关网络 4xx/5xx 为 0,失败请求为 0。`realtime-factors` 当前提供的是禄得站内实时因子快照,字段含真实 `high`,但不直接提供 `pre_close`;本实现按用户指定公式所需的前收盘价由 `close` 与 `pct_chg` 反推。若未来接口调整字段单位或缺失某些转债代码,脚本会展示有效匹配数与未匹配标的,避免收益率被静默高估。 #### F.6 v002 最高价交易日口径修正 2026-05-16,用户指出“蒙娜转债”最高价不符合交易日口径:交易日应取当日最高价,非交易时间段应取上一个交易日最高价。运行态排查确认:样本策略“正修双占-带自定义”的盘后交易日为 `2026-05-15`,盘后行中蒙娜转债 `close=137.998`;但禄得 `realtime-factors` 返回同一代码 `high=122.88`、`close=121.543`、`time=13:32:51`,与盘后交易日行情不一致。继续验证外部兜底数据源 `https://push2.eastmoney.com/api/qt/ulist.np/get` 可在页面内 CORS 访问,蒙娜转债返回 `f2=137998`、`f15=149700`、`f18=138602`、`f3=-44`,分别对应收盘价 137.998、最高价 149.700、前收盘价 138.602、涨跌幅 -0.44%。 v002 将行情字段优先级调整为:价格、涨跌幅、成交额、最高价、前收盘价、行情时间优先取东方财富 quote;禄得 `realtime-factors` 仅作为缺失时兜底。复验同一策略:蒙娜转债最高价显示 149.7,最高涨幅 `149.7 / 138.602 - 1 = 8.01%`,超过止盈点 5.80%,状态显示“止盈”,贡献取 +5.80%;策略实时收益率显示 +0.99%。复验结果:console error 为 0,网络 4xx/5xx 为 0,失败请求为 0。 #### F.7 v003-v004 面板扩展转股溢价率与剩余规模 2026-05-16,用户要求在策略盘后持仓实时收益面板中新增“转股溢价率”和“剩余规模”,并指定使用禄得数据。运行态字段核对显示,`screen/history` 盘后持仓行返回 `mod_conv_prem`,其列名在接口 `columns` 中明确为“修正溢价率”,不是“转股溢价率”;`realtime-factors` 返回 `conv_prem`,用户确认“转股溢价率是 `conv_prem`”。因此 v004 将“转股溢价率”改为取禄得 `realtime-factors.conv_prem`,剩余规模继续取 `remain_size`。 v004 复验策略“正修双占-带自定义”:面板表头包含 `转股溢价率`、`剩余规模`,首行蒙娜转债显示 `137.998 / -0.44% / 272933.50 / +116.08% / 3.37亿 / 149.7 / +8.01% / 止盈 / +5.80%`;其余 4 只转股溢价率显示 `+58.25% / +38.43% / +26.84% / +54.89%`。策略实时收益率仍为 +0.99%。复验结果:console error 为 0,网络 4xx/5xx 为 0,失败请求为 0。 #### F.8 v005 删除转股溢价率并保留剩余规模 2026-05-16,用户反馈 `conv_prem` 版本的“转股溢价率”仍不满足实际使用要求,并明确要求删除该列。因此 v005 删除“转股溢价率”表头、取值、格式化函数与日志统计,仅保留禄得 `remain_size` 作为“剩余规模”。该处理沿用 Case Law 的最小变更原则:不继续猜测字段来源,不引入新的外部数据源,只删除争议字段并保留已验证稳定字段。 v005 本地交付文件仍为 `/home/horizon/chat--5179204355/lude_strategy_after_realtime_return_bookmark.js` 与 `/home/horizon/chat--5179204355/lude_strategy_after_realtime_return_bookmarklet.txt`,版本标识为 `lude-strategy-after-realtime-return-20260516-v005`。复验策略“正修双占-带自定义”:面板表头为 `盘后持仓 / 价格 / 涨跌幅 / 成交额 / 剩余规模 / 最高价 / 最高涨幅 / 状态 / 贡献`,不再包含“转股溢价率”;首行蒙娜转债显示 `137.998 / -0.44% / 272933.50 / 3.37亿 / 149.7 / +8.01% / 止盈 / +5.80%`,策略实时收益率仍为 +0.99%。复验结果:console error 为 0,网络 4xx/5xx 为 0,失败请求为 0。 ### 附录 G:可转债策略分析合并书签验证记录 #### G.1 研究问题 2026-05-16,用户提出将附录 E 的“盘后/盘中选债差异”和附录 F 的“盘后持仓实时收益”两个策略列表行级书签合并为一个书签,以减少策略列表操作列按钮数量,并在同一面板内完成两个分析功能。 #### G.2 方法 合并版沿用两个旧书签已经验证的策略行识别、`Access-Token` 鉴权、`api-ali.lude.site` 优先 API base、`strategy/detail` 与 `screen/history` 链路。实现上只注入一个“策略分析”按钮;点击后打开单一浮动面板,顶部提供“实时收益”和“盘中对比”两个 Tab。基础数据 `strategy/detail` 与 `screen/history` 在同一策略分析状态中复用;“实时收益”Tab 继续调用东方财富 quote、禄得 `realtime-factors`;“盘中对比”Tab 在首次切换时调用 `screen/realtime`。 #### G.3 结果 本地交付文件为 `/home/horizon/chat--5179204355/lude_strategy_combined_analysis_bookmark.js` 与 `/home/horizon/chat--5179204355/lude_strategy_combined_analysis_bookmarklet.txt`,版本标识为 `lude-strategy-combined-analysis-20260516-v001`。CDP 注入验证显示:合并按钮数量为 71,旧 `盘中对比` 与 `实时收益` 按钮数量均为 0;点击“策略分析”后默认打开“实时收益”Tab,表头为 `盘后持仓 / 价格 / 涨跌幅 / 成交额 / 剩余规模 / 最高价 / 最高涨幅 / 状态 / 贡献`。切换到“盘中对比”Tab 后,面板展示 `仅盘后持有 - 可能剔除`、`仅盘中持有 - 新入选`、`共同持有` 三个分区,并保持原始排名、对侧排名、收盘价、涨跌幅、成交额展示逻辑。 #### G.4 验证与限制 最终复验中,实时收益 Tab 可计算收益并展示剩余规模;盘中对比 Tab 可加载差异分区,且切换到盘中对比时不再显示实时收益百分比徽标,避免语义混淆。验证结果:console error 为 0,网络 4xx/5xx 为 0,失败请求为 0。合并版 bookmarklet 约 36KB,若浏览器收藏夹保存时出现截断,应沿用附录 D.5 的短书签加载外部脚本方案。 #### G.5 v002 股票页多资产适配验证 2026-05-18,用户要求合并版策略分析书签也适用于 `/rotation/stock` 股票策略列表。依据本文第 5 章三类页面统一对象族与第 7 章股票接口文档,本次没有另做股票专用书签,而是在原合并版中加入资产适配层:当前路由为 `/rotation/convertible-bond` 时沿用可转债接口,当前路由为 `/rotation/stock` 时切换到 `/v1/quant/stock/strategy/detail/{strategyId}`、`/v2/quant/stock/screen/history`、`/v2/quant/stock/screen/realtime` 与 `/v1/quant/stock/realtime-factors`。 实现还统一了证券代码匹配键:对 `300621.SZ`、`SH600455`、`600455` 等形式提取六位代码后再匹配,避免股票页东方财富行情与禄得筛选结果因后缀差异无法合并。东方财富 `secid` 规则扩展为 `6/9/11` 开头走沪市,其余走深市。 运行态验证结果显示: 1. `build=lude-strategy-combined-analysis-20260518-v002-multi-asset`; 2. 股票页 `/rotation/stock` 主策略表识别成功,当前渲染 20 行,成功注入 20 个“策略分析”按钮; 3. 首行策略 `最小市值50` 的 `strategyId=0697746b-54da-7757-8000-f21f0114fefc`,回测区间列仍位于索引 5,结构与可转债页一致; 4. 实时收益 Tab 成功加载:`holdN=50`、盘后持仓 50 行、有效匹配 50/50、缺失 0,估算收益 `+1.3884%`;首行 `300621.SZ / 维业股份` 使用东方财富行情,价格 `0.89`、涨跌幅 `+1.71%`、行情时间 `2026-05-18 15:34:03`; 5. 盘中对比 Tab 成功加载:盘后 50 只、盘中 50 只、仅盘后 0、仅盘中 0、共同持有 50; 6. 验证期间 console error 为 0,网络 4xx/5xx 为 0。 本地交付文件仍为 `/home/horizon/chat--5179204355/lude_strategy_combined_analysis_bookmark.js` 与 `/home/horizon/chat--5179204355/lude_strategy_combined_analysis_bookmarklet.txt`,新版 bookmarklet 长度为 33598 字符。下载链接为 `https://bus.callteam.org/file/8453f72d4421053d93d5ccb74ef20e37.txt`。 #### G.6 v003 路由资产刷新修正 2026-05-18,用户反馈 v002 多资产版在可转债策略列表中打开策略后,面板标题显示为“股票策略盘后持仓实时收益”,且盘后持仓为空、有效匹配为 `0/0`。按 debug_guide 方法提出并验证四个假设:H1 为转债历史接口返回结构变化,H2 为转债代码字段读取错误,H3 为交易日错误导致历史筛选为空,H4 为股票页运行态污染转债页接口选择。运行态证据确认当前 URL 为 `/rotation/convertible-bond`,但 `runtime.asset.label=股票`,且请求链路错误调用 `/v1/quant/stock/strategy/detail/{id}`、`/v2/quant/stock/screen/history` 与 `/v1/quant/stock/realtime-factors`,因此 H4 成立。 v003 将资产判断从“启动时一次性写入 runtime.asset”改为“在注入、打开策略和接口调用前按当前 `location.pathname` 刷新”,并在每次策略分析状态中固定 `state.asset`,使同一浏览器标签从股票页切到转债页时不会沿用旧资产配置。复验可转债页:`build=lude-strategy-combined-analysis-20260518-v003-route-asset-refresh`,运行态资产与状态资产均为“可转债”;首条策略“单吊2-新-拟”调用 `/convertible-bond/` 三条接口,历史行数 87,持仓 2,有效匹配 2/2,盘中对比为盘后 2、盘中 2、共同 1。股票页回归:首条“最小市值50”仍调用 `/stock/` 三条接口,持仓 50,有效匹配 50/50。复验期间 console error 为 0,网络 4xx/5xx 为 0。完整 URL 编码版下载链接为 `https://bus.callteam.org/file/ad6eb955510c8a65049ff95cc621a662.txt`。 用户随后指出完整 bookmarklet 中存在大量 `%20` 且不便使用。依据附录 G.4 对 36KB 级 bookmarklet 截断风险的限制说明,v003 同步交付短书签加载器:将源码以 `.txt` 形式托管,书签只保留 242 字符的 `script src` 加载逻辑,避免 URL 编码中的 `%20` 噪音。由于文件服务阻止 `.js` 上传,交付采用 `.txt` 源码但经浏览器验证可被 `<script src>` 正常执行;`fetch` 方案因 CORS 被拒绝而未采用。股票页实测短加载器执行后仍为 `build=lude-strategy-combined-analysis-20260518-v003-route-asset-refresh`,策略列表注入 20 个按钮。精简短书签下载链接为 `https://bus.callteam.org/file/4a5a63a56d03adedef2a8ebe07e38f23.txt`。 #### G.7 v004 盘中对比实时行情展示修正 2026-05-20,用户指出合并版书签“盘中对比”页展示的价格、涨跌幅和成交额疑似仍为盘后口径,并要求改为盘中实时数据。按 debug_guide 方法提出并验证五个假设:H1 为 `screen/realtime` 只适合盘中筛选排名但行情字段不是最新实时行情;H2 为“仅盘后持有”分组可能把盘后行作为盘中展示兜底;H3 为东方财富 quote 只用于“实时收益”页、未用于“盘中对比”;H4 为禄得 `realtime-factors` 已有实时因子但未参与差异页展示;H5 为用户当前运行版本仍是 v002。 运行态证据确认当前页面执行 `build=lude-strategy-combined-analysis-20260518-v002-multi-asset`,盘中对比面板中 127045.SZ 展示 `收:125.73 / 涨:+0.26% / 成:28729.56`,这些值来自 `/v2/quant/convertible-bond/screen/realtime`;同一代码在 `/v1/quant/convertible-bond/realtime-factors` 中为 `close=130.4255 / pct_chg=-0.014913142 / amount=7151.7805757 / time=13:32:51`,故 H1、H3、H4 成立。v004 保持盘中入选集合与排名继续由 `screen/realtime` 决定,仅将差异页行情展示字段改为“东方财富 quote 优先、禄得 realtime-factors 兜底、screen/realtime 最后兜底”,并在行尾展示行情来源。 复验可转债页首条策略“单吊2-新-拟”:`build=lude-strategy-combined-analysis-20260520-v004-diff-live-market`,运行态资产与状态资产均为“可转债”;盘后 2 只、盘中 2 只、共同 2 只;样本贵燃转债保留盘中排名 1,但面板展示 `收:126.07 / 涨:-1.07% / 成:9468.86 / 禄得实时因子`,不再展示 `screen/realtime` 的 `close=145.6805`。复验期间 console error 为 0,网络 4xx/5xx 为 0,失败请求为 0。完整本地 bookmarklet 长度为 66419 字符,下载链接为 `https://bus.callteam.org/file/78cdf8fafbedb929f0c1c60156ebf9ab.txt`。 ### 附录 H:可转债策略列表一键行级更新书签验证记录 #### H.1 研究问题 2026-05-16,用户要求在 `/rotation/convertible-bond` 策略列表页制作一个“一键更新”书签,并明确约束不要使用网站自带的“批量更新”。因此目标被限定为:由书签逐条执行策略行级更新链路,而不是触发顶部批量更新按钮或批量更新接口。 #### H.2 假设与方法 按照 debug_guide 证据链方法提出并验证五个假设:A. 主策略表可稳定定位行级“更新”;B. 行级更新不会触发批量更新;C. 当前 Ant Design 表格渲染行数足以覆盖策略列表;D. 行级更新存在异步状态,需串行执行;E. 直接调用行级接口比模拟点击更适合作为书签实现。运行态 DOM 探测显示,主策略表包含“策略名称/回测区间/操作”,一次性渲染 71 条策略行;React Fiber 证据显示行级“更新”的处理函数调用 `_(strategy_id)`,而顶部“批量更新”位于 Popconfirm `onConfirm` 链路中。 #### H.3 接口链路 单行点击验证和直接接口验证均显示,行级更新请求为:`PUT /v2/quant/convertible-bond/strategy/{strategy_id}/glance`。脚本从 `localStorage.lude_token.access_token` 读取登录态,并以 `Access-Token` 请求头调用该接口。单条策略“单吊2-新-拟”实测返回 HTTP 200,响应体为 `{ "code": 0, "message": "success", "data": null }`;网络日志中未出现 `batch/bulk/批量` 相关 URL。 #### H.4 结果 本地交付文件为 `/home/horizon/chat--5179204355/lude_one_key_update_bookmark.js` 与 `/home/horizon/chat--5179204355/lude_one_key_update_bookmarklet.txt`,版本标识为 `lude-one-key-update-20260516-v001`。书签会在页面右下角注入进度面板,收集当前主策略表全部策略行,逐条调用 `/strategy/{id}/glance`,显示成功和失败清单;全部成功后触发页面“刷新”按钮刷新列表。实现不点击顶部“批量更新”按钮,也不调用批量更新接口。 #### H.5 验证与限制 验证分为三段:第一,DOM 探测确认主策略表行数为 71,行级“更新”入口存在;第二,真实单条验证确认 `PUT /strategy/{id}/glance` 返回 200,随后页面可刷新策略列表;第三,最终书签使用隐藏 dry-run 开关复验 3 条策略,console 显示 `dryRun=true`、`ok=3`、`failed=0`,network 日志为 0,证明干跑不会误发请求。由于完整一键更新会真实改写所有策略的 glance 数据,交付阶段未主动执行全量更新;应由用户点击书签自行触发。 #### H.6 v003 用户口径修正:逐行点击并等待成功 2026-05-16,用户进一步明确“一键更新”的业务口径:不是直接复刻接口批量更新,而是代替人工在策略列表“操作”列逐行点击“更新”,且必须等上一行更新成功后才能点击下一行。因此 v003 偏离 v002 的直接接口重放方案,改为真实点击每一行的“更新”按钮,并在页面运行态 hook `fetch` 与 `XMLHttpRequest`,监听当前行 `/v2/quant/convertible-bond/strategy/{strategy_id}/glance` 请求返回 2xx 后,再等待该行触发的 `/v1/quant/convertible-bond/strategy/list` 列表刷新空闲,然后进入下一行。 本次同时修复面板不可移动问题:标题栏新增 `cursor: move`,并兼容 `pointerdown/pointermove` 与 `mousedown/mousemove` 两套事件。验证证据:dry-run 前 3 条策略均找到行按钮且不发更新请求;真实限量 1 条点击“单吊2-新-拟”时,网络日志显示 `PUT https://api-ali.lude.site/v2/quant/convertible-bond/strategy/06a0068e-ff12-71b3-8000-2308b8cde2b1/glance` 返回 200,随后 `GET /v1/quant/convertible-bond/strategy/list` 返回 200,console 记录 `row-click:success` 与 `finish ok=1 failed=0`。拖拽复验中面板位置从 `left=750, top=458` 移至 `left=610, top=378`,证明标题栏可移动。交付文件仍为 `/home/horizon/chat--5179204355/lude_one_key_update_bookmark.js` 与 `/home/horizon/chat--5179204355/lude_one_key_update_bookmarklet.txt`,版本标识为 `lude-one-key-update-20260516-v003-click`。 ### 附录 I:可转债回测持仓详情每日贡献涨幅标注书签验证记录 #### I.1 研究问题 2026-05-21,用户在 `/rotation/convertible-bond` 回测详情的“持仓详情”表格中提出增强需求:在“持有标的”列每只转债后展示该日对应的贡献涨幅。用户随后修正计算口径:若当日最高涨幅大于等于止盈点,则显示 `止+止盈点`;若当日最高涨幅小于止盈点,则显示 `未+日涨跌幅`。用户同时明确约束“别用外部数据”,因此实现只能使用禄得页面状态与禄得内部 API。v004 修复止盈点来源必须实时读取当前页面输入,并在持仓详情空白处展示总止盈个数及占比;v005 在同一汇总条增加当前持仓界面的 CSV 导出能力。 #### I.2 字段来源与口径 运行态验证表明,`/v2/quant/convertible-bond/screen/history` 返回的 `pct_chg` 即禄得内部“涨跌幅(日涨跌幅)”,单位为小数比例;将自定义因子 `custom_OKeCd` 作为禁用 rank 因子追加到请求参数后,禄得返回列 `当日最高涨幅`,字段为 `custom_OKeCd`,单位同样为小数比例。脚本统一转换为百分比点后计算:`custom_OKeCd >= 当前页面 #stop_value` 时贡献为当前止盈点,否则贡献为 `pct_chg`。v004 起不再把 `reachedStop`、`contributionPct`、`stopValuePct` 固化进历史缓存,而是只缓存单票 `dailyPct/highPct`,每轮扫描按当前页面止盈点重算标签与 tooltip。v005 导出复用同一计算结果,避免 CSV 与页面标签口径分叉。 #### I.3 方法 实现沿用本文 Case Law 中的浏览器书签/页面注入先例:脚本 hook `fetch` 与 `XMLHttpRequest` 以捕获策略参数,并通过 React Fiber 作为兜底读取当前策略参数;通过 Ant Design 表格表头定位同时包含“选债周期”“持有标的”“持仓涨跌幅”的持仓详情表;按每行日期调用禄得内部 `POST /v2/quant/convertible-bond/screen/history`。为避免当前过滤条件排除已持有债,调用 history 时清空 `filter_factors` 与 `link_factors`,保留排序/排除池等策略上下文,并追加禁用 `custom_OKeCd` rank 因子以获取全池行情字段。请求采用串行队列,避免并发过多时禄得返回空表。v004 新增 `#stop_value/#hold_range_end` 的 `input/change` 监听,参数变化时直接用已缓存的 raw 行情重算展示。v005 在 `#lude-cb-daily-contribution-summary` 内追加“导出CSV”按钮,采集当前持仓详情 DOM 中的日期、债券代码/名称与 runtime 贡献结果,生成带 UTF-8 BOM 的 CSV 文件以兼容 Excel。 #### I.4 结果 本地交付文件为 `/home/horizon/chat--5179204355/lude_cb_daily_position_contribution_bookmark.js` 与 `/home/horizon/chat--5179204355/lude_cb_daily_position_contribution_bookmarklet.txt`,版本标识为 `lude-cb-daily-position-contribution-20260521-v005`。脚本在每个债券 span 内追加 `.lude-cb-daily-contribution-tag`,文本形如 `未-1.22%` 或 `止+3.00%`;正贡献使用红色,负贡献使用绿色,缺失值使用灰色。持仓详情表格 wrapper 顶部新增 `#lude-cb-daily-contribution-summary`,格式为“总止盈个数:N/D天×H只,占比 R;止盈点 S;导出CSV”,其中 `H` 来自当前页面 `#hold_range_end`,占比公式为 `总止盈个数 / (回测总天数 × 本策略只数)`。CSV 列包括:选债周期、序号、转债代码、转债名称、贡献标记、贡献涨幅、是否止盈、当日最高涨幅、日涨跌幅、止盈点、持仓涨跌幅、累计收益率、累计净值。v001 的 `(last_price - cost_price) / cost_price` 口径已废弃,因为它不是用户要求的回测止盈贡献口径。 #### I.5 验证与限制 CDP 页面为 `https://next.lude.site/rotation/convertible-bond`,tab id 为 `1151544799`。v005 复验证据:当前运行 `build=lude-cb-daily-position-contribution-20260521-v005`;页面当前 `#stop_value=3.00`、`#hold_range_end=10`;10 个可见日期均缓存到 `screen/history`,持仓详情表 100 个标签全部命中,`dashCount=0`。汇总验证结果为“总止盈个数:13/10天×10只,占比 +13.00%;止盈点 +3.00%;导出CSV”。导出验证结果:按钮文本为“导出CSV”,`collectExportRows()` 返回 100 行、10 个唯一日期、缺失贡献 0 行、100 行止盈点均为 `+3.00%`;首行样例为 `2026-05-20, 127044, 蒙娜转债, 止+3.00%, 当日最高 +3.03%, 日涨跌幅 -3.14%, 持仓涨跌幅 -0.49%`。验证期间 console error 为 0,网络 4xx/5xx 为 0,failed network 为 0。限制:脚本不使用东方财富等外部行情;导出范围为当前持仓详情界面已渲染的可见持仓行,若页面分页或虚拟滚动只渲染当前页,则 CSV 对应当前页。 ### 附录 J:可转债策略排除因子阈值优化记录 #### J.1 摘要 2026-05-21,在 `/rotation/convertible-bond` 页面继续优化策略“三低均衡试验”。本轮研究问题限定为“适当调整排除因子的值的范围,寻找最优路线”,因此不再改变上一轮已经验证的打分权重组合,而是围绕现有排除阈值做小批量粗到细回测。最终证据显示,仅将自定义排除因子 `custom_eASle` 的上界从 `> 28` 放宽到 `> 30` 能稳定改善综合表现,其它排除阈值及组合均未超过该单项调整。 #### J.2 Case Law 与方法 本轮沿用本文既有 Case Law:先检索历史记录与 Wiki 文档,确认禄得回测接口、页面注入与串行回测先例;使用页面原生请求模板而非手写 payload;避免并发回测;采用“粗搜—赢家邻域细化—组合反证”的路线,不做全网格暴力搜索。页面通过 CDP extension code `32ysqe` 附着到 `https://next.lude.site/rotation/convertible-bond`,运行态捕获原生回测请求 `POST https://api-ali.lude.site/v2/quant/convertible-bond/backtest`,请求区间为 `2022-08-01` 至 `2026-05-20`,`benchmark="EQUALWEIGHT"`,`backtest_type=2`。 #### J.3 基线策略 本轮基线继承上一轮已验证的打分权重:`bond_prem=16`、`remain_size=8`、`volatility_stk=10`、`conv_prem=15`、`custom_rHUyk=14`、`custom_VzOHZ=8`、`custom_MQPFY=2`。其它核心参数为持有范围 `1-9`、换仓阈值 `3`、止盈止损值 `5.2%`、排除新债 `5` 天、排除强赎剩余计数 `12` 天。基线排除因子为 `left_years < 1.01`、`custom_eASle < -25`、`custom_eASle > 28`、`close > 145`、`custom_ZMiBU < 1000`。原生模板基线回测结果为总收益率 `410.49%`、年化收益率 `53.62%`、最大回撤 `-11.23%`、夏普比 `2.5456`、索提诺比 `3.8607`、卡玛比 `4.7743`、日均换手 `21.63%`。 #### J.4 搜索结果 第一轮粗搜测试了剩余年限、浮动阈值下界、浮动阈值上界、收盘价上限、20 日均成交额、新债排除天数与强赎剩余天数。粗搜中 `custom_eASle > 31` 排名第一,年化 `54.78%`、最大回撤 `-11.32%`、卡玛比 `4.839`,优于基线;新债天数、成交额阈值、剩余年限等单项均未超越该结果。第二轮围绕上界做步进细化,`custom_eASle > 30` 成为全局最优:总收益率 `434.90%`、年化收益率 `55.52%`、最大回撤 `-11.22%`、夏普比 `2.5916`、索提诺比 `3.9624`、卡玛比 `4.948`、日均换手 `21.72%`。随后对 `30` 进行最后组合验证,包括搭配 `custom_eASle` 下界、`custom_ZMiBU`、`close`、`left_years`、新债天数和强赎剩余天数,均未超过 `custom_eASle > 30` 单项调整。 #### J.5 页面应用与验证 最终仅修改排除因子 `custom_eASle` 的 `gt` 阈值:`28 -> 30`,同时写入页面受控输入与 `localStorage.cbStrategy`,未点击“覆盖策略”或“另存策略”。页面原生回测再次捕获的请求体确认包含 `custom_eASle > 30`、`remain_size=8`、`custom_rHUyk=14`;页面可见回测结果刷新为“当前策略:总收益率 `434.90%`、累计资产 `213.96` 万、年化收益率 `55.52%`、最大回撤 `-11.22%`、夏普比 `2.592`、索提诺比 `3.962`、卡玛比 `4.948`、日均换手 `21.72%`”。结论是:在本次模板与样本区间下,最优排除因子路线为保持其它排除阈值不变,仅将浮动阈值上界放宽到 `30`。
禄得会员
2026年5月21日 09:43
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
PDF文档(打印)
分享
链接
类型
密码
更新密码