指增基金周度业绩分析报告
| 项 | 值 |
|---|---|
| 中文名 | 指增基金周度业绩分析报告 |
| 英文名 | index-enhance-weekly-report |
| 技能目录 | C:/Users/HT/.workbuddy/skills/index-enhance-weekly-report |
| 产物 | 单文件自包含 HTML(内置 ECharts,可离线打开) |
跑完得到一份按板块分章的交互式报告:300 / 500 / 1000 / 2000 / A500 各一章,每章含 KPI 卡、聚类气泡图、管理人定位按钮、聚类结果表、各簇特点、板块分析、产品明细表。
何时使用
- 用户要分析「指增 / 指数增强」基金的周度业绩:超额收益、超额回撤、超额波动率、跟踪误差、信息比率。
- 要求分板块分析(不要把 5 个板块混在一张排名里)。
- 要求气泡图(纵轴超额收益、横轴超额回撤、气泡大小=超额波动)+ 聚类分簇 + 管理人维度定位。
- 需要每周自动更新(配合自动化任务)。
快速开始
python "C:/Users/HT/.workbuddy/skills/index-enhance-weekly-report/scripts/make_report.py" \
--wkdir "C:/Users/HT/.workbuddy/skills/index-enhance-weekly-report/data/wk" \
--snapshot "C:/Users/HT/.workbuddy/skills/index-enhance-weekly-report/data/snapshot.txt" \
--out "C:/Users/HT/Desktop/指增基金分板块业绩分析_超额收益与超额回撤_近六个月.html" \
--window 26 --min-weeks 12
| 参数 | 说明 |
|---|---|
| --wkdir | 周度 CSV 目录(一文件一周),必填 |
| --snapshot | 最新一期快照 TSV(12 字段),补充「管理规模」「今年以来超额」两列,必填 |
| --out | 输出 HTML 路径,必填 |
| --window | 滚动窗口周数,只取最近 N 周;默认 26(约 6 个月);0 = 全部 |
| --min-weeks | 纳入门槛,产品至少 N 周有有效记录;默认 12 |
| --win-label | 覆盖报告内窗口文案(默认按周数自动推断:24~28 周→「近六个月」,否则「近 N 周」) |
| --warn | 往页头注入 HTML 警示横条(数据异常时用) |
滚动机制:每次执行自动只取最近 N 周,窗口终点随最新一期周报前移,无需人工干预。跨年(如 1229-0102 与 0106-0110)已按自然时间修正排序。
目录结构
index-enhance-weekly-report/
├─ SKILL.md
├─ scripts/
│ ├─ make_report.py 报告生成器(自包含,优先读 lib/echarts.min.js)
│ └─ check_weekly.py 周度数据体检(量级/缺失/重复/连续性)
├─ data/
│ ├─ wk/ 周度序列库,一文件一周:<周标签>.csv
│ └─ snapshot.txt 最新一期快照(12 字段 TSV,含表头)
├─ lib/echarts.min.js 内置图表库(1.0 MB),保证技能可独立迁移
└─ references/
└─ collection.md IMA 采集细则(文件夹 ID 对照、字段下标、单位陷阱)
采集流程:增量补漏(每周执行的标准动作)
数据是逐周累加的,本地 data/wk/ 就是历史库,所以永远不要全量重抓——
每次只补「远端有、本地没有」的那几周(正常 1 周)。
- 列远端周标签集合
R:mcp__ima-mcp__get_knowledge_list(knowledge_base_id="7337674910215195"、folder_id="folder_7354341090423503"= 「周度业绩」文件夹,ID 已实测确认、cursor=""、limit=50、sort_type="UPDATE_TS_DESC_SORT_TYPE") →knowledge_list[].title即周标签(形如0907-0911),media_id即该周的folder_id。is_end=false时用next_cursor翻页取完(该目录total_size约 36,大于单页条数)。 - 列本地周标签集合
L:data/wk/*.csv的文件名去掉.csv。 - 缺失 =
R − L(只处理最近 30 周内的)。对每个缺失周: a.get_knowledge_list(folder_id= 该周)→ 找title含 「量化股票策略业绩榜」 的条目,取media_idb.fetch_media_content(约 4 万字符 Markdown)→ ⚠️ 不要贴进回复,只本地抽取 c. 只抽 5 个指增板块(跳过[量化选股]、[市场中性]),每行取策略类型 | 基金管理人 | 近一周超额(字段下标 1 / 2 / 6) d. 写data/wk/<周标签>.csv:UTF-8 无 BOM、LF 行尾、无表头,格式周标签|策略类型|基金管理人|近一周超额,数值统一为小数(0.0151= 1.51%) e. 用该期内容刷新data/snapshot.txt(12 字段 TSV,第一行表头type|manager|scale|wk_exc|ytd_ret|ytd_exc|ytd_dd|ytd_exc_dd|ann_ret|ann_vol|sharpe|ret2025) - 缺失为空 → 本期无新数据,不写任何文件,直接用现有数据出报告。
- 跑
check_weekly.py体检(含周次跳空检测,是漏抓的唯一哨兵)→ 通过后跑make_report.py。
若某次执行没能跑成(电脑关机 / ima 掉线),下次执行会因为第 3 步按「集合差」计算, 自动把落下的那几周一起补回来;
check_weekly.py的跳空检测用于二次确认。
批量回补历史(窗口不足 26 周时):把周文件夹按 6~7 周分 4 组,用 Agent(general-purpose)并行派发,
子代理各自「查文件夹 → 取文件 → 只抽三列 → 写 CSV」,只回报行数。
不要在主上下文串行抓 26 周——26 × 4 万字符会撑爆上下文。
指标口径
- 区间超额 = Π(1 + 周超额) − 1
- 年化超额 = (1 + 区间超额)^(52 / 观测周数) − 1
- 年化超额波动率(=年化跟踪误差)= 周超额标准差 × √52,来自真实周度超额序列,不是「成立以来年化波动率」代理口径
- 信息比率 = 年化超额 ÷ 年化超额波动率
- 区间超额最大回撤 = 累计超额曲线相对前期高点的最大回撤
- 周胜率 = 周超额 > 0 的周数占比
⚠️ 窗口短于 20 周时不要看年化类指标:年化系数 √(52/n),n = 6 时放大约 2.94 倍,IR 会虚高到 6~8,属失真。
报告结构与交互(用户明确要求,别做偏)
气泡图:纵轴=区间超额收益,横轴=区间超额最大回撤,气泡大小默认=超额波动率 (可切换:波动率 / 回撤 / 信息比率 / 统一大小),着色可切「按簇 / 按管理规模」。 标签只显示管理人简称(如「衍复」,不是「衍复1000P-XXX」)。
管理人定位按钮(在原有聚类气泡图正下方):
- ✅ 正确:气泡图下方放一整面管理人按钮(按区间超额排序);点击 → 图中其余点淡出、
该管理人气泡放大 2.1 倍并保留名称标签,按钮下方出一行「📍 当前位置」:
管理人全名 + 所属簇 + 所在象限 + 区间超额 / 区间超额回撤 / 超额波动率 / 信息比率
- 与板块中位的对比结论。再点一次或点「清除定位」复位。
- ❌ 不要:另外新建第二张图(走势图、折线图等),也不要堆一排指标卡。 用户明确反馈过「不是让你重新做一个交互图」。
聚类:每个板块内部独立聚类,按「区间超额 × 区间超额回撤」二维特征 Z-Score 标准化后 K-Means(k=3,确定性 maximin 初始化),按「平均超额 − 平均超额回撤」降序命名 优选梯队 / 中游梯队 / 落后梯队,同时标注该簇均值在气泡图中所处象限。 聚类属描述性分组,不代表统计显著性。
数据体检
python "C:/Users/HT/.workbuddy/skills/index-enhance-weekly-report/scripts/check_weekly.py" \
--wkdir "C:/Users/HT/.workbuddy/skills/index-enhance-weekly-report/data/wk"
- 逐周行数 + 板块分布 + 中位/最大 |近一周超额| → 抓「漏抓」和「单位错」
- 周次跳空检测(漏抓哨兵):相邻两期起始日相差 > 11 天 即判为缺期并指出"约缺 N 期"。
实测 2026 年正常间隔为 5~10 天(五一等假期造成 5 天与 9~10 天),缺一期会跳到约 14 天,故阈值 11 可安全区分。
可用
--max-gap调整。 - 量级红线:中位 |近一周超额| 应落在 0.003 ~ 0.03;出现 0.3~3 说明该周原表是百分比格式,漏了 ÷100
- 重复 (周,板块,管理人)、整段窗口缺失板块、产品出现周数不足窗口一半的清单
- 有告警时加
--strict可让返回码为 1(自动化里可用于中断出报告)
跳空检测本身只负责"报警",不负责修。修法是回到「采集流程」第 3 步按集合差补抓; 缺的周若较久远,可直接查
references/collection.md的 folder_id 对照表。
已知的行数结构性断点(不是 bug)
各期榜单收录产品数会变,且不同板块变化不同步。实测 2026 年:
0420-0424之前:300指增 20 只、2000指增 11~13 只、A500指增 15~16 只0420-0424起:300指增 38、2000指增 37、A500指增 39500 / 1000指增全程稳定在 56~71 只
已用「表头列结构 + 序号连续性」核验为原表如此,不是解析漏行。遇到类似跳变先核验再下结论。
自动化
技能已全参数化,可被定时任务直接调用。每周执行时的标准动作:
- 增量采集:列远端周标签 − 本地
data/wk/已有周标签 = 缺失集合,只补缺失的周 (正常 1 周;若上次漏跑会自动补齐多周)→ 追加data/wk/<周标签>.csv+ 刷新data/snapshot.txt - 数据体检:跑
check_weekly.py→ 看「量级异常」与「周次跳空」两类告警,有问题先补数据 - 跑
make_report.py --window 26 --min-weeks 12→ 输出到桌面 - 用
present_files把 HTML 交给用户(说明里点出本次新增了哪一期)
幂等性:按集合差采集,已存在的周不会重复抓;同名 CSV 重复写入只覆盖、不污染窗口。
失败处理:ima 不可用或当期榜单未发布 → 不写空文件,直接用已有数据出报告并在页头加 --warn 说明。
唯一原则:本地 data/wk/ 是历史数据的唯一载体,只增不减;窗口滚动由 --window 控制,不删数据。
常见坑
- ima 连接器断开:工具不可见时报
not found in any connected connector。让用户在设置页重连, 并新开一个会话(中途连上的连接器本会话加载不到)。这是运行时的连接掉线,不是配置问题。 - 不要走
~/.config/ima/api_key:本地ima-skills1.1.9 缺知识库子模块,且该 Key 常已失效 (401 / code 200002skill auth failed)。正确前缀是openapi/wiki/v1/...,但优先用 MCP 工具。 - 单位陷阱:早期周报是百分比格式,近期是小数格式,必须统一折算为小数。
- 路径:本机
bash的 PATH 偶尔异常(ls/grep/head找不到),优先用 Python 或 PowerShell 做文件操作。 - Python 依赖:仅标准库(无需 numpy / sklearn / pandas)。
微信扫一扫