Stock Thesis Tracker — 持仓股跟踪器
一句话概括
围绕你的投资逻辑(Thesis),每天自动告诉你的持仓有没有变化需要关注。
怎么用(3 句话讲完)
- 写逻辑:用自然语言告诉我每只股票的投资逻辑——"我看盐湖是因为锂价中枢抬升 + 钾肥战略属性"
- 说「跟踪持仓」:我自动从 Wind 专业数据(行情/财务/公告/新闻/宏观/行业景气/板块大盘情绪)+ 知识星球(券商点评/外资研报/专家交流,看你这行今天在讨论什么、预期什么) + 行业信源多路抓增量,先拆清涨跌里多少是市场给的、多少是公司自己的,再逐条标注对你的逻辑是利好还是利空、市场有没有已经定价,异动了帮你溯源
- 要审视时:说「审查这个逻辑」——我帮你找假设漏洞、反方论点、失效路径、隐藏风险,逼你重新想一遍
使用说明
日常跟踪
对 AI 说「跟踪持仓」或「跟踪 [标的名]」。AI 自动完成:
- 先看市场:抓大盘/板块/主题指数,判断今天的风向和资金流向
- 再看预期:扫知识星球当下热点(券商点评/外资研报/专家交流),看市场今天在讨论什么、预期什么
- 再看景气:抓行业量价库存指标(EDB),判断生意本身在变好还是变差
- 最后看个股:多路数据源抓增量信息,并拆出涨跌里多少是板块带的、多少是公司自己的
- 逐条标注对你的逻辑是利好(+)还是利空(-),市场是否已定价
- 若满足异动判定任一条件(跌幅 ≥ 默认 5% 阈值 或 |z| ≥ 2σ),触发 7 维度异动溯源
- 生成结构化日度报告(市场环境 + 今日热点 + 横截面快照 + 逐标的增量分析 + 一句话结论)
- 更新每只标的的事件日志
示例对话:
> 你:跟踪持仓
> AI:[运行采集 → 分析 → 输出报告]
深度分析(每周)
对 AI 说「深度分析持仓」。在日度摘要基础上增加:
- 短/中/长期逻辑逐段验证(成立/需观察/边际削弱)
- 行业景气周期定位(更长序列的 EDB 量价库存,判断在产能/库存周期哪个阶段)
- 板块趋势与个股背离检查(板块涨而个股跌 = alpha 为负,要查原因)+ 板块估值历史分位
- 竞品横截面对比(估值分位、近期催化、财务横截面)
- 估值状态快照(当前 PE/PB 分位 vs 历史)
- 本周预期差全景
建议每周一执行一次。
建立新标的
直接告诉 AI:
> 「我要跟踪 XX 股票,代码 XXXX,投资逻辑是:[你的逻辑]」
AI 会自动完成所有配置:创建 thesis.md + 配置 portfolio.json + 自动匹配行业信源 + 拆解投资逻辑为跟踪清单。
也可以手动操作(见下方「上手准备」)。
拆解投资逻辑
对 AI 说「拆解 [标的名] 的投资逻辑」。AI 会将你的逻辑拆成:
| 类别 | 跟踪指标 | 优先级 | 信源 |
|---|---|---|---|
| [需求/供给/价格/政策] | [具体可量化数据] | ★★★/★★/★ | [网站/报告] |
日常跟踪时 AI 会按这个清单重点采集对应数据。
对抗式审查
对 AI 说「审查 [标的名] 的投资逻辑」。AI 会:
- 逐条假设挑战——"这条逻辑成立需要什么前提?如果前提不成立最可能的原因?"
- 搜集市场上反对这条逻辑的观点和论据
- 列出最可能击穿你逻辑的 2-3 条具体事件链
- 检查隐藏风险——逻辑对但赚不到钱的场景(估值陷阱、时间成本、杠杆风险等)
建议每月执行一次,或在重大市场事件后立即执行。
修改投资逻辑
直接告诉 AI 你想修改哪个标的的哪部分逻辑。AI 会更新 thesis.md,并自动重新拆解跟踪清单。
上手准备(AI 自动创建更简单,见上方「建立新标的」)
如果需要手动操作:
- 复制
coverage/portfolio_example.json→portfolio.json,编辑为你的持仓 - 复制
coverage/thesis_template.md为每只标的写投资逻辑 pip install akshare pandas- 对 AI 说「跟踪持仓」
> v5.7 数据源优先级:Wind Alice(硬数据)+ 知识星球(市场预期,主源) 为必配;IMA 浑水知识库(id: 7297249738490228)可选——仅回溯完整研报原文时才需要,不添加则日常跟踪不受影响。
功能概览
| 模式 | 触发方式 | 输出 | 频率 |
|---|---|---|---|
| 摘要模式 | "跟踪持仓" / "跟踪[标的名]" | 市场环境与板块情绪 + 今日市场在讨论什么(星球热点) + 行业景气(EDB) + 增量信息标注(+/-/0) + 失效条件检查 + 三层归因横截面快照 + 波动率标尺(σ20/z-score/一年分位) | 日常 |
| 深度模式 | "深度分析持仓" | 短/中/长期逻辑完整验证 + 竞品分析 + 估值状态 | 每周/事件触发 |
| Thesis 拆解 | "拆解[标的名]投资逻辑" / 修改 thesis 后 | 关键假设→可跟踪指标→数据清单(含优先级+信源) | 新建/修改 thesis 时 |
| 对抗式审查 | "审查[标的名]投资逻辑" / "对抗式审查持仓" | 逻辑漏洞扫描+反方论点+失效路径+隐藏风险 | 按需/定期 |
数据源
| 优先级 | 数据源 | 内容 | 用途 | 配置 |
|---|---|---|---|---|
| ★★★ 首选 | Wind Alice | 行情快照/财务/估值分位/公告/新闻/事件/股东/技术指标/风险/宏观/板块与大盘指数/行业景气指标(EDB) | 一站式结构化数据,可追溯 | 连接 Wind 连接器 |
| ★★ 兜底 | 巨潮/港交所 WebFetch | cninfo + hkexnews 公告 | Wind 公告不可用时 | portfolio.json → announcement_source |
| ★★ 兜底 | 脚本三源链 | 新浪→东方财富→腾讯行情 | Wind 行情不可用时 | 无需配置 |
| ★★ 兜底 | AKShare | 东方财富个股新闻 | Wind 新闻不可用时 | pip install akshare |
| ★★★ 市场预期主源 | 知识星球 zsxq-cli | 券商点评 / 外资研报 / 专家交流 / 当日异动快评 | 市场当下在讨论什么、预期什么(目标价/业绩预测/一致预期)+ 叙事解释 + 数据口径变更预警 —— v5.7 起替代浑水作为预期差判定的第一来源 | portfolio.json → zsxq_groups |
| ★ 可选 | IMA 浑水调研 | 53k+ 外资研报/电话会 | 仅在需要完整研报原文时调用;日常预期差判定已由知识星球覆盖(星球更快、更贴当下) | IMA 知识库 |
| ★★ 补充 | 行业信源映射表 | 25 行业 × 3 类信源 | 行业定点 WebSearch | portfolio.json → industry_sources |
| ★★ 补充 | WebSearch | 全品类实时信息 | 政策/竞品/共识 | 无需配置 |
> 已清理:旧版 search_config 配置块(含 ima_cninfo.folder_id 巨潮公告库路径)已从 portfolio.json 移除。公告统一走 Wind get_company_announcements,Wind 不可用兜底走 cninfo/hkexnews WebFetch。
Wind Alice 数据接入(v5.2 新增)
Wind Alice 是 AI 层的 MCP 工具,脚本层(fetch_data.py)无法调用。因此 Wind 作为 AI 层第一优先数据源,脚本三源链降为兜底。连接 Wind 连接器后,以下所有数据优先走 Wind。
windcode 规则
| 交易所 | 后缀 | 示例 |
|---|---|---|
| 深交所 | .SZ | 000792.SZ / 300750.SZ |
| 上交所 | .SH | 600897.SH |
| 北交所 | .BJ | 920522.BJ |
| 港股 | .HK | 00700.HK |
每只标的的 wind_code 已写入 portfolio.json,竞品的 competitors_wind_codes 也已预生成。
> 已知代码不一致(纳科诺尔):symbol=688047(688 是科创板前缀,历史遗留错误),真实北交所代码是 em_code=920522。
> 处理规则(不要"修正" symbol):symbol 维持 688047 不变——coverage/688047_纳科诺尔/ 文件夹路径、log.md、snapshot.json 全部依赖它,改动会牵动所有历史引用。所有外部数据源(Wind、行情接口)统一用 wind_code=920522.BJ / em_code=920522 绕开。脚本侧已由 exchange=北交所 正确推导(v4.0 修复)。
跟踪需求 → Wind 工具映射(核心)
| 跟踪需求 | Wind 工具 | 关键参数 | 替代的旧数据源 |
|---|---|---|---|
| 实时价格+涨跌幅+主力资金+PE/PB/股息率/市值 | get_stock_price_indicators |
windcode 批量逗号分隔;indexes 逐字取清单 | 新浪三源链 + 乐估全市场PB |
| 周涨跌幅/52周高低/年初至今 | 同上,indexes 加「5日涨跌幅」「52周最高」 | 手工算「较上周」 | |
| 日K/周K | get_stock_kline |
windcode + begin_date/end_date + period | — |
| 财务(ROE/毛利率/营收净利) | get_stock_fundamentals |
question 自然语言 | 深度分析手工查 |
| PE/PB/股息率历史分位 | get_stock_fundamentals |
question 含「历史分位」 | 乐估全市场PB |
| 公司公告(年报/季报/分红) | get_company_announcements |
query + top_k | cninfo WebFetch |
| 财经新闻 | get_financial_news |
query + top_k | AKShare 新闻 |
| 分红/增发/减持/解禁/ST/诉讼 | get_stock_events |
question | 失效条件手工搜 |
| 股东结构/前十大/解禁时间表 | get_stock_equity_holders |
question | 融资盘/解禁手工搜 |
| 技术指标/连涨连跌/新高新低 | get_stock_technicals |
question | — |
| Beta/波动率/最大回撤 | get_risk_metrics |
question | 隐藏风险手工估 |
| 大盘/指数行情+资金面 | get_index_price_indicators |
windcode 000300.SH 等 | 异动溯源「大盘资金」 |
| 行业指数估值 | get_index_fundamentals |
question | 行业估值对比 |
| 宏观/行业时间序列(碳酸锂价/储能装机) | natural_language_get_edb_data |
executionMode + question | WebSearch 碎片搜 |
| 跨实体聚合/竞品对比 | get_financial_data |
question | 竞品横截面手工算 |
| 公司身份/行业分类(建仓校验) | get_stock_basicinfo |
question | — |
| 日内分钟走势(异动形态) | get_stock_quote |
windcode + begin/end + count=-20(从后往前取,控体积) | 只能看收盘价的空白 |
| 大盘/板块行情+情绪(宽度/资金/强弱) | get_index_price_indicators |
windcode 逗号分隔;indexes 加「上涨家数,下跌家数,平盘家数,换手率,近5日主力净流入额」 | 「板块联动」口头判断 |
| 行业景气指标(量/价/库存/产能) | natural_language_get_edb_data |
仅提数 + 已固化代码,observation=4~6 | WebSearch 碎片搜 |
| 板块指数 K 线(趋势/beta 归因) | get_index_kline |
windcode + begin_date/end_date + period | — |
| 板块指数估值(PE/PB/分位) | get_index_fundamentals |
question 含「市盈率 市净率 历史分位」 | — |
| ETF/REIT 行情(贴水率/IOPV) | get_fund_price_indicators |
windcode 如 508039.SH | — |
| 基金分红/分派(REIT 分派率验证) | get_fund_financials |
question 含「分红次数/单位分红/分红总额」 | 手工翻招募书 |
效率要点
- 一次
get_stock_price_indicators批量调用即可拿到全部持仓的价格、涨跌幅、主力资金净流入、PE(TTM)、PB、股息率、总市值——原来要脚本+乐估+WebSearch 三个数据源拼。 indexes字段值必须逐字取自工具可选值清单(如「涨跌幅」「市盈率(TTM)」「市净率(LF)」「近5日主力净流入额」),不能自造字段名。
- ⚠️ 实测坑:用「市净率」返回 0.000,必须用「市净率(LF)」才返回真实值(LF=最新财报口径)。
- 港股代码 Wind 会规范化为 4 位(00700.HK → 返回 0700.HK),传 00700.HK 或 0700.HK 均可。- 港股(腾讯 00700.HK)用同一套股票工具,代码 .HK 后缀。
- 北交所(纳科诺尔)Wind 可能数据不全,若
get_stock_price_indicators返回空,回退脚本腾讯行情(qt.gtimg.cn 含北交所)。 - Wind 取价后必须落盘(见下方「价格落盘」),否则
snapshot.json的 price_history 会断档。 - 时间序列类工具必须控体积:
get_stock_quote单日约 240 条、get_stock_kline长区间按天放大、natural_language_get_edb_data宽泛词 318KB——三者都会撑爆上下文。规则:分钟级用count=-20;K 线限定日期区间;EDB 一律两步走(见下)。 - 指数快照支持超大批量的逗号分隔(实测一次取 18 个指数正常返回),大盘+行业+概念可以一次调用拿全,不必分批。但任一代码无效会导致整批失败,新代码先单独验证。
- EDB 批量提数以最低频指标对齐(实测
S6137468,S5479685取 observation=4 正常返回且体积小)。混合月频/年频指标时会按最低频补齐,别把日频和年频混在一次调用里。
⚠️ EDB 宏观指标:必须两步走(实测硬规则)
natural_language_get_edb_data 用 executionMode="搜索并提数" + 宽泛词会返回 318KB 直接 token 溢出(实测「碳酸锂价格」)。必须拆两步:
| 步骤 | executionMode | question | 返回 |
|---|---|---|---|
| ① 找代码 | 仅搜索 |
「电池级碳酸锂 现货均价」 | 约 11 个指标的 meta(含 code/单位/频率/更新日期),精简不溢出 |
| ② 取数据 | 仅提数 |
指标代码,如 S5811336 |
时间序列数值 |
禁止:搜索并提数 + 宽泛词。仅提数 可逗号分隔多代码批量取:S5811336,D6067904。
指标代码一旦验证可用,固化进 portfolio.json 的 wind_edb_codes,下次直接「仅提数」,不再重复搜索。
已固化的盐湖股份指标(2026-09-21 实测验证):
| 指标 | EDB 代码 | 单位/频率 | 说明 |
|---|---|---|---|
| 碳酸锂价格(电池级99.5%国产) | S5811336 |
元/吨 / 日 | Wind 官方源,thesis 头号指标 |
| 碳酸锂注册仓单量 | D6067904 |
手 / 日 | 广期所,库存代理变量 |
| 钾肥现货价 | S5470454 |
元/吨 / 日 | 化工在线,钾肥端主价格锚(有真实波动) |
| 钾肥港口库存(主要港口合计) | S5444348 |
万吨 / 周 | 隆众,进口供给代理,交叉判读的价格对手方 |
| 氯化钾到站价(青海盐湖) | S5424440 |
元/吨 / 日 | 隆众,盐湖自家报价,⚠️ 已僵死见下 |
| ~~氯化钾市场价(俄白62%边贸)~~ | ~~S9984052~~ |
— | 已报废:无权限,由 S5470454 替代 |
> ⚠️ 报价类指标要先查「是否僵死」:S5424440(盐湖到站价)自 2026-05-21 起连续 4 个月钉死在 3100 元/吨,任意时间取数都一样——这种指标没有边际信息量,用它做判断会得出"价格稳定"的错误结论。同期 S5470454 从 3090 走到 3075,才是可用的价格信号。取值后先看近 N 期是否完全相同,全等则视为僵死并在报告中标注。
> 实测样例(2026-09-18):碳酸锂 S5811336 = 134,360 元/吨,较 8 月的 14.6 万继续下行——这类日频数据替代了原来 WebSearch 的碎片搜索。
行业基本面数据:从「个股指标」升级到「景气度」
> v5.5 设计原则:机构持仓是季频、滞后 1-2 个月的存量数据,且只反映"谁拿着",不反映"生意好不好"。跟踪的价值重心应放在行业景气度——它高频、前瞻、直接驱动盈利预期修正。因此 v5.5 移除了机构持仓穿透模块,把 EDB 从「个股 thesis 指标」扩展为「行业景气指标组」。
景气指标六维框架
不要只盯一个价格。行业景气要多维交叉,单维数据会骗人(价格涨可能是供给收缩而非需求好):
| 维度 | 回答的问题 | 典型指标 | 盐湖 | 宁德/纳科 | 厦门空港 | 腾讯 |
|---|---|---|---|---|---|---|
| 价 | 产品卖多少钱 | 现货价/出厂价 | 碳酸锂、氯化钾 | 电芯/储能系统价 | 票价 | 游戏ARPU |
| 量 | 卖出去多少 | 产量/销量/装车量 | 钾肥产量、锂盐产量 | 动力电池装车量 | 机场旅客吞吐量 | 游戏市场收入 |
| 库存 | 渠道压了多少 | 仓单/社会库存 | 碳酸锂仓单、钾肥港口库存 | 电池厂库存 | — | — |
| 产能 | 供给端什么状态 | 开工率/新增产能/装机 | 盐湖产能利用率 | 锂电设备招标 | 机场时刻 | 版号发放 |
| 下游 | 需求端什么状态 | 新能源车销量/装机 | 新能源车产销 | 新能源车+储能 | 出入境客流 | 手游月活 |
| 成本 | 利润空间变化 | 原材料/运费 | 卤水采集成本 | 碳酸锂(宁德是买方) | 航油 | 算力成本 |
交叉判读矩阵(核心)
单一指标的方向没有意义,两维交叉才有信号:
| 价格 | 量 / 库存 | 解读 | 对 Thesis 的含义 |
|---|---|---|---|
| ↑ | ↓ | 需求驱动的真景气(买得多把库存买空了) | [+] 强信号,可持续 |
| ↑ | ↑ | 补库/投机囤货,顶部风险 | [±] 警惕,可能是最后一波 |
| ↓ | ↓ | 主动去库,供给收缩 | [0/+] 接近底部,等价格企稳 |
| ↓ | ↑ | 过剩格局,最差组合 | [-] 强利空,规避 |
| 平 | ↑ | 需求走弱,价格还没反应 | [-] 领先指标,价格将补跌 |
> 「量」与「库存」在多数场景下互为镜像(卖得多 = 库存降),两列可互换使用——没有库存数据时用产量/销量代替。
> 实测样例(盐湖 2026-09):碳酸锂价 13.4 万(较 8 月 14.6 万继续下行)+ 钾肥产量 70.14 万吨(较 5 月 89.51 万吨大幅回落)→ 锂端「价↓量↓」= 主动去库接近底部区间;钾肥端若只看产量会读成"供给收缩支撑价格"。
> ⚠️ 同一个标的可以同时有两个方向的信号,别急着下结论。加上钾肥端的价 × 库存交叉再看(2026-09-21 实测):钾肥现货价 3090 → 3075 元/吨(微降),主要港口库存 367.5 → 391.92 万吨(连续 6 周累库,+6.6%)→ 落在矩阵「价↓ 库存↑」= 过剩/需求走弱,与"产量下滑利好"方向相反。
>
> 这正是矩阵的价值:只看产量会得出"供给收缩利好",补上库存维度才发现港口在累库——进口钾肥供给充裕正在压制价格。
> 维度冲突时的优先级:价 + 库存(贴近当下成交)> 产量(月度滞后)。 库存是"当期卖不动"的直接证据,产量只是"产了多少"。
已验证的行业 EDB 指标库(固化进 portfolio.json)
natural_language_get_edb_data 用 executionMode="仅提数" + 以下代码,可逗号分隔批量取,observation=4~6 控体积:
| 行业 | 指标 | EDB 代码 | 频率 | 单位 | 来源 | 更新时间 |
|---|---|---|---|---|---|---|
| 锂电 | 中国:装车量:动力电池 | S6137468 |
月 | 兆瓦时 | 新闻整理 | 2026-09-15 |
| 锂电/储能 | 中国:装机容量:新能源:新型储能 | T3206609 |
年 | 万千瓦 | 国家能源局 | 2026-09-03 |
| 锂电/储能 | 中国:当年新增装机容量:新能源:新型储能 | U4654734 |
年 | 万千瓦 | 国家能源局 | 2026-09-03 |
| 化肥 | 中国:产量:钾肥 | S5479685 |
月 | 万吨 | 隆众资讯 | 2026-08-31 |
| 化肥 | 中国:现货价:钾肥 | S5470454 |
日 | 元/吨 | 化工在线 | 2026-09-21 |
| 化肥 | 中国:主要港口:库存量:钾肥 | S5444348 |
周 | 万吨 | 隆众资讯 | 2026-09-17 |
| 民航 | 中国:机场旅客吞吐量 | S0180516 |
月 | 万人次 | 中国民航局 | 2026-09-21 |
| 民航 | 中国:民航机场旅客吞吐量:厦门/高崎 | F5629379 |
年 | 人 | 从统计看民航 | 2026-03-30 |
| 传媒/游戏 | 中国:实际销售收入:游戏市场 | H4434598 |
月 | 亿元 | 新闻整理 | 2026-09-20 |
| 传媒/游戏 | 中国:实际销售收入:游戏市场:当月同比 | O3600946 |
月 | % | 新闻整理 | 2026-09-20 |
| 传媒/游戏 | 中国:实际销售收入:游戏市场 | T2720599 |
季 | 亿元 | 新闻整理 | 2026-07-31 |
> ⚠️ 四个实测坑:
> 1. 搜索词要「用行业通用词」,不要用化学名/学名——指标库的命名用的是行业口语,不是化工命名。实测:
> - 搜「钾肥」→ 命中 11 条(现货价 / 主要港口库存 / 分港库存 / 开工率 / 竞品库存)✅
> - 搜「氯化钾」→ 几乎命中不到有效指标 ❌
> 这和「搜行业词不搜公司名」是同一条原则的延伸:先想行业里大家怎么叫它,而不是它的化学名。
> 但也别走向另一个极端——另一个方向是太宽泛:搜「民航机场旅客吞吐量」返回 47 条(含一堆年频分机场垃圾)。目标是一个词能圈住 5-15 条。
> 2. magnitude 字段不可靠,以 unit/enUnit 为准。如 S6137468 的 magnitude 标 "mn" 但 unit 是 MWh,值 79000 = 79 GWh(符合中国月装车量常识)。
> 3. 固化前必须查 endDate——搜索结果 meta 里的 endDate 距今超过 1 年 = 已停更。实测「钾肥」返回的 11 条里有 4 条是死数据:开工率 S9987168/S9987257 停在 2023-12-31、赤湾港库存 S5444344 停在 2025-12-25、竞品库存 B2934380 是年频。光看名称会全部固化进来,白占配置。
> 4. 「无权限」≠「代码不存在」,两者报错行为不同:
> - 软剔除:返回 "受限指标已剔除:无权限:S9984052",同批其他代码照常返回 → 不影响批量取数,剔除该条即可
> - 硬失败:代码写错 / 不存在 → 整批报错,全军覆没
> 所以看到软剔除不用慌;但代码本身写错会废掉整批,新代码仍须单独先试。
配置结构
portfolio.json 里两类 EDB 代码分开存放,用途不同:
| 字段 | 粒度 | 用途 | 调用频率 |
|---|---|---|---|
holdings[].wind_edb_codes |
个股 thesis 指标(★★★) | 验证「我的逻辑」 | 每次跟踪 |
industry_edb_codes(顶层,按行业 key) |
行业景气指标 | 判断「生意好不好」 | 每次跟踪(每组 2-3 个即可) |
日常跟踪必取行业景气(v5.5 起从"深度分析才取"提升为"日常必取")——它比公告和新闻更早反映拐点。
板块与大盘情绪:三层归因(v5.5 新增)
个股每天的涨跌里,大部分是市场给的,不是公司给的。不拆开就会把 beta 当 alpha——涨了以为逻辑兑现,跌了以为逻辑破了。
指数代码速查(实测可用)
| 层级 | 指数 | Wind 代码 | 说明 |
|---|---|---|---|
| 大盘-A股 | 上证指数 | 000001.SH |
全市场涨跌家数最全(实测 1663涨/620跌/78平) |
| 沪深300 | 000300.SH |
大盘基准 | |
| 中证500 / 中证1000 | 000905.SH / 000852.SH |
中小盘风格 | |
| 创业板指 / 北证50 | 399006.SZ / 899050.BJ |
成长/北交所风格 | |
| 大盘-港股 | 恒生指数 / 恒生科技 | HSI.HI / HSTECH.HI |
⚠️ 后缀是 .HI 不是 .HK,传 HSI.HK 报"未识别标的" |
| 申万行业 | 基础化工 | 801030.SI |
801xxx.SI 系列,带涨跌家数 |
| 电力设备 / 传媒 | 801730.SI / 801760.SI |
||
| 机械设备 / 交通运输 | 801890.SI / 801170.SI |
||
| Wind 概念 | 固态电池 / 锂电池 | 8841671.WI / 884039.WI |
884xxx.WI、886xxx.WI |
| 储能 / 盐湖提锂 / 机场 | 884790.WI / 8841082.WI / 886029.WI |
> 💡 概念指数可以用中文名直接查(实测传「固态电池指数」返回代码 8841671.WI)——记不住代码就传中文名,工具会回带 Wind 代码,验证后固化进配置。
> ⚠️ 批量查询一旦有一个代码无效,整批失败(实测「机场指数,免税指数,游戏指数,钾肥指数」因"免税指数"不存在全批报错)。未验证过的代码必须单独试。
> ⚠️ 指数「量比」字段实测全返回 0.000,不要用。
采集方式(一次调用拿全)
get_index_price_indicators(
windcode="000001.SH,000300.SH,000905.SH,000852.SH,399006.SZ,899050.BJ,HSI.HI,HSTECH.HI,801030.SI,801730.SI,801760.SI,801890.SI,801170.SI,8841671.WI,884039.WI,884790.WI,8841082.WI,886029.WI",
indexes="中文简称,最新成交价,涨跌幅,5日涨跌幅,20日涨跌幅,年初至今涨跌幅,成交额,换手率,上涨家数,下跌家数,平盘家数,当日主力净流入额,近5日主力净流入额,市盈率(TTM),市净率(LF)"
)
> 全部代码已验证,可安全批量。新增代码先单独验证再并入。
三层归因公式
个股涨跌幅 ≈ 大盘涨跌 + 板块相对强弱 + 个股特质(alpha)
| 拆解项 | 计算 | 含义 |
|---|---|---|
| 大盘贡献 | 对应基准指数涨跌幅(A股用沪深300 或上证;港股用恒指) | 今天市场给的 |
| 板块强弱 | 板块指数涨跌幅 − 大盘涨跌幅 | 行业今天相对强/弱 |
| 个股 alpha | 个股涨跌幅 − 板块指数涨跌幅 | 真正属于这家公司的部分 |
用法:报告里每只标的都给这三个数。若「个股 alpha ≈ 0」说明今天只是跟着板块走,不构成 thesis 层面的信号,不要写进增量分析。
情绪打分卡(每日输出)
| 指标 | 取数 | 乐观区间 | 谨慎区间 |
|---|---|---|---|
| 市场宽度 | 上涨家数 / (上涨+下跌) | > 0.6 普涨 | < 0.4 普跌 |
| 成交额 | 上证+深证成交额 vs 20 日均值 | 放量上行 | 缩量(观望) |
| 主力资金 | 近5日主力净流入额(大盘/板块) | 持续净流入 | 持续净流出 |
| 板块相对强弱 | 板块 5日/20日涨跌幅 − 大盘同期 | 跑赢 = 资金在流入该行业 | 跑输 = 行业遭抛弃 |
| 位置 | 52周最高/最低 + 年初至今涨跌幅 | 距高点远 = 空间大 | 创新高 = 追高风险 |
输出要求:报告开头必须有「市场环境」块(见下方报告模板),5 行以内说清——今天大盘怎么样、钱在往哪个板块流、我的持仓所在板块是顺风还是逆风。
波动率标尺:用个股自己的尺度判断今天算不算事(v5.9 新增)
为什么需要它:不同标的的日常波动能差 5 倍。实测 2026-10-09:
| 标的 | σ20(日) | ATR14% | 波动比20/60 | hv20 一年分位 |
|---|---|---|---|---|
| 沪深300 | 0.83% | 1.31% | 0.64 | 20% |
| 盐湖股份 | 1.58% | 2.39% | 0.75 | 2% |
| 腾讯控股 | 1.91% | 2.88% | 0.88 | 52% |
| 宁德时代 | 2.09% | 3.61% | 0.89 | 38% |
| 厦门空港 | 2.84% | 3.55% | 1.58 | 82% |
| 纳科诺尔 | 4.43% | 6.22% | 1.05 | 80% |
同一套固定阈值(如「跌 5% 才算异动」「|alpha| < 1pct 是噪声」)在这批标的上不是同一个意思:纳科一天 ±4.4% 是日常,5% 阈值几乎天天假报警;反过来厦门空港 2026-10-08 跌 3.18%(翔安方案落地)按 5% 不触发,但相对它自己 1.8% 的日常波动已是近 2σ 的真事件。用百分比做门槛 = 用同一把尺子量不同东西。
指标口径(脚本自算,update_volatility.py)
| 指标 | 算法 | 用来干什么 |
|---|---|---|
| σ20 / σ60 | 近 20/60 个交易日对数收益率的标准差(前复权) | 这只票一天正常晃多少 |
| hv_ann | σ × √252 | 年化,便于与研报/Wind 口径对话 |
| parkinson20 | √(Σln(H/L)²/(4·ln2·n)) × √252 | 用高低价的估计量,效率约为收盘价口径 5 倍;与 σ 差太多 = 有跳空或长上下影,形态层要去看分钟线 |
| z_today ⭐ | 当日涨跌幅 ÷ σ20 | 核心。今天是常态还是异常 |
| 波动比 | σ20 / σ60 | >1.2 波动抬升(有事发生/分歧加大)、<0.8 收敛(趋于平静) |
| 一年分位 | 当前 σ20 在过去一年滚动 σ20 序列中的位置 | 100% = 一年里最躁的时候;接近 0% = 极度平静,平静本身也是信号(变盘前夜) |
判读标准:
| |z_today| | 判定 | 动作 |
|---|---|---|
| < 1σ | 常态 | 不写进增量分析,不溯源 |
| 1 - 2σ | 偏大 | 正常跟踪,报告里点一句 |
| ≥ 2σ | 异常 | 触发 7 维溯源(即使没到 5%) |
用法
python scripts/update_volatility.py # 全部持仓
python scripts/update_volatility.py --symbol 600897 # 单只
python scripts/update_volatility.py --event 600897=2026-09-30 # 事件前后波动对比
python scripts/update_volatility.py --no-bench # 不取大盘基准
输出 reports/volatility_latest.json(单份覆盖):每标的 + 两地大盘基准的 σ/年化/分位/z,以及 --event 的事前 20 日 σ vs 事后 σ。
数据源与坑(实测)
- 主源:东方财富
push2his日线fqt=1(前复权),300 根。覆盖 A股/北交所/港股(北交所 secid=0.920522实测 260 行正常)。 - 备源:腾讯
web.ifzq.gtimg.cn日线qfq。⚠️ 北交所只返回 1 根,救不了北交所标的;东财偶发Remote end closed(实测 1/6 概率),此时腾讯接管,结果差异 <0.03σ。 - 港股指数(
100.HSI)在东财不通,基准恒指走腾讯hkHSI。 - 盘中 bar 必须排除:脚本一律用
rows[:-1]算 σ(当日 bar 未完成),只拿最后一根算当日涨跌幅。收盘后跑则最后一根是完整日线,JSON 会标note。 - 事件窗口样本 <5 个交易日时 σ 估计不稳,脚本输出
warn,报告中要照抄这个提醒。
Wind 双轨:什么时候信谁
get_risk_metrics 给「过去 1 年年化波动率 / Beta / 最大回撤」,可与脚本交叉。但两处要当心:
- 偶发返回空(实测 600897 首次返回「没找到数据」,换宁德正常,再问一次又正常)→ 不要因为 Wind 空就写"无数据",跑脚本。
- Beta 口径存疑:实测厦门空港「过去1年 Beta = 0.106」而「年化波动率 = 28.72%」——这两个数不可能同时成立。Wind Beta 的基准未明示,不要直接用于归因;要用 beta 就自己拿「个股 vs 沪深300」日收益回归。
- 不一致时以脚本为准并标注:脚本口径完全透明(窗口=20/60、√252、前复权),可复现。Wind 值差 20% 以上时在报告里写
[口径差异] Wind年化X% vs 脚本Y%(窗口/复权可能不同)。
日内分钟走势:异动形态的第 6 个维度
异动溯源原来只有 5 个维度(公司/行业/竞品/大盘/资金),但都回答不了"这根阴线是怎么走出来的"。get_stock_quote 补上第 6 维:
{"windcode": "000792.SZ", "begin": "2026-09-18", "end": "2026-09-18", "count": -20}
> ⚠️ 体积控制:单日约 240 条,全量返回会撑爆上下文。必须传 count(负数 = 从结束时间往前取 N 条)。日常取 count=-20(尾盘 20 分钟)即可判断形态,最多 -60。
形态判读:
| 形态 | 分钟数据特征 | 归因方向 |
|---|---|---|
| 尾盘突袭 | 全天平稳、最后 1-3 分钟放量急跌/急涨 | 被动指数调仓、集合竞价、程序化单 |
| 全天阴跌 | 逐分钟重心持续下移 | 资金持续出货,情绪性抛压 |
| 开盘跳水后横盘 | 前 30 分钟跌完,之后走平 | 消息面一次性定价,非持续抛压 |
| 午后拉升 | 13:00 后放量上行 | 资金午后进场,可能有增量信息 |
实测样例(盐湖 9/18):14:39–14:57 平稳在 24.85–24.88,15:00 集合竞价单分钟成交 1.006 亿股、价格砸到 24.74——典型尾盘被动单冲击,而非全天资金出逃。这类信息收盘价完全看不出来。
价格落盘(Wind 时代必做)
Wind 接管行情后,fetch_data.py 的 update_snapshot() 不再被调用(它依赖脚本自己抓的价格)。若不落盘,snapshot.json 的 price_history 会断档——实测 2026-08-25 → 09-21 断了 27 天,导致「较上周」失去历史基准。
取到 Wind 价格后,执行:
# 1) 把 Wind 价格写成 JSON(键为 portfolio.json 的 symbol)
cat > reports/wind_prices.json <<'EOF'
{"000792": {"price": 25.01, "change_pct": 1.09, "source": "Wind"},
"600897": {"price": 15.31, "change_pct": 1.26, "source": "Wind"},
"300750": {"price": 299.63, "change_pct": -0.77, "source": "Wind"},
"00700": {"price": 426.80, "change_pct": 1.86, "source": "Wind"},
"688047":{"price": 17.27, "change_pct": 0.12, "source": "Wind"}}
EOF
# 2) 落盘
python scripts/sync_snapshot.py --prices-file reports/wind_prices.json
脚本按日去重追加 price_history(保留最近 60 条),不触碰 thesis.md / log.md。
分层调用原则
- 日常跟踪:Wind 个股行情快照(1 次批量)+ 落盘 + 板块与大盘情绪快照(
get_index_price_indicators1 次批量取全部指数) + 行业景气指标 EDB(每标的 2-3 个,1 次批量) + Wind 公告/新闻(每标的 1-2 次)+ 知识星球双路采集(热点扫描 + 主题深挖,市场预期主源) + 行业信源 + WebSearch 补充(IMA 浑水可选) - 深度分析:日常基础上加
get_stock_fundamentals(财务+估值分位)+get_stock_events+get_stock_equity_holders(解禁时间表)+get_index_fundamentals(板块估值/历史分位)+get_index_kline(板块趋势 vs 个股趋势背离检查)+get_financial_data(竞品财务横截面) - 对抗式审查:深度基础上加
get_risk_metrics(Beta/波动率/最大回撤,量化隐藏风险) +get_stock_technicals+ 行业景气指标的更长序列(判断周期位置:当前在产能周期的哪个阶段) - 异动溯源 7 维度:公司层
get_company_announcements+ 行业景气层natural_language_get_edb_data+ 竞品层get_stock_price_indicators(竞品) + 大盘/板块层get_index_price_indicators(含涨跌家数判宽度) + 资金层get_stock_price_indicators(主力净流入) + 形态层get_stock_quote(分钟走势,判尾盘突袭 vs 全天阴跌) + 圈内舆情层zsxq-cli topic +search(口径变更/相反说法)
可选扩展:基金 / ETF / REITs 数据线(非个股持仓业务线)
> 本节不属于个股 Thesis 跟踪主流程,仅当用户从事基金/ETF/REITs 相关工作时按需启用。
Wind 的基金工具(10 个)可覆盖公募/ETF/REITs 全链路:
| 需求 | 工具 | 实测要点 |
|---|---|---|
| REIT/ETF 实时行情(价格/涨跌/YTD/贴水率/IOPV/流通市值) | get_fund_price_indicators |
场内代码带交易所后缀,如首农REIT = 508039.SH |
| REIT 实际分派(分红次数/单位分红/分红总额) | get_fund_financials |
可用于验证招募书分派率真实性(实测首农REIT:区间分红 2.547 亿、2 次、单位 0.2547 元) |
| 基金净值/区间收益/同类排名/最大回撤/夏普 | get_fund_performance |
货基用万份收益、7 日年化 |
| 基金重仓股 + 申万行业配置 + 持股集中度 | get_fund_holdings |
FOF 穿透底层用 |
| 规模变动 / 机构 vs 个人持有比例 / 申赎 | get_fund_holders |
看资金进出 |
| 基金公司档案(在管规模/经理团队) | get_fund_company_info |
管理人尽调用 |
| 按条件反查产品 | search_funds / search_stocks |
选基/选股筛选 |
> ⚠️ get_fund_financials 的「区间」口径需确认(累计 or 年化),算分派率前先用 get_fund_info 核对成立日与分红条款。
市场预期采集:知识星球替代浑水(v5.7 重构)
v5.7 定位变更:「市场当下在讨论什么、预期什么」的第一来源改为知识星球,IMA 浑水降为可选。
| 维度 | 知识星球 | IMA 浑水 |
|---|---|---|
| 内容形态 | 券商点评 + 外资研报 + 专家交流 + 当日异动快评 | 外资研报/电话会存量库 |
| 时效 | 当天(实测 30 条全落在当日 13:01–14:17) | 偏存量,滞后 |
| 预期载体 | 标题自带 【券商+行业组】,正文含目标价/业绩预测 |
需翻研报全文才能提取 |
| 「当下热度」 | ✅ group +topics 时间倒序 = 当日热点快照 |
❌ 无此能力 |
| 日常用途 | 预期差判定的主源 | 仅当需要完整研报原文时 |
浑水备用规则(被星球替代,仅在需要完整研报原文时调用):搜索是话题驱动而非公司名驱动——
CATL/BYD/Tencent/Potash/ESS ✅ 有效;中文公司名(宁德时代)、股票代码(000792)、泛化词(锂矿/互联网)❌ 0 条。
> 核心原则:搜行业不搜公司。 这条对星球同样适用。
知识星球:市场预期与当下共识的主源(v5.6 新增,v5.7 定位升级)
定位:市场预期的一手载体(v5.7 升级)
星球里流动的就是卖方当天正在输出的东西——券商点评、外资研报摘要、专家交流纪要、异动快评。这正好回答了双层验证第二层最难的问题:市场当下在讨论什么、预期什么。
| 信息源 | 给的是什么 | 缺什么 |
|---|---|---|
| Wind EDB | 硬数据(价/量/库存的数值) | 不说为什么变,更不会说口径变了 |
| Wind 财务/估值 | 已实现的历史 + 估值分位 | 不含未实现的预期 |
| 浑水研报 | 卖方观点(目标价/一致预期) | 滞后,且是卖方立场 |
| 行业信源 WebSearch | 新闻/报价 | 碎片,无分析 |
| 知识星球 | 市场当下在讨论什么 + 券商目标价/业绩预测 + 专家一手说法 + 数据口径变化解释 | 质量参差,需交叉验证 |
星球独有的三类信息:
- 市场预期——当日券商点评里的目标价、业绩预测、"强CALL / 推荐 / 超预期 / 低于预期"措辞。这是预期差判定的原料,其他数据源都拿不到"当天版本"的卖方预期。
- 叙事解释——数字背后的原因。实测样例(2026-09-11):碳酸锂主力跌 4.99%,星球给出的解释是「SMM 启用新版库存统计口径,把贸易商/电芯厂纳入样本,周度库存一次性从 7 万余吨上修至 16.93 万吨」——旧口径"持续去库、现货紧缺"的叙事被改写为"隐性库存远超预期"。Wind EDB 只会给你库存数字,不会告诉你口径变了。
- 即时点评——当日盘中券商点评、交易台纪要,比正式研报快 1-3 天。
内容类型识别:读懂标题就知道怎么用
实测(2026-09-21 group +topics --limit 30)返回的 30 条中,类型按标题特征清晰可分:
| 类型 | 标题特征 | 实测样例 | 用法 | 可信度 |
|---|---|---|---|---|
| 券商点评 | 【券商名+行业组】(东财食饮/长江电新/中信电子/国金机械…) |
【西南机械】金刚石散热专题报告、【中泰地产】地产股因何连续大涨 |
提取目标价/观点 → 市场预期主料 | 中高(卖方立场,注意"强CALL"是推销) |
| 专家交流 | 专家交流 / 对话产业链 / 调研 |
固态电池专家交流要点、【固态电池设备专家】对话产业链 |
产业链一手信息,比研报原始 | 中(必须交叉验证) |
| 异动快评 | 大涨点评 / 回调 / 涨停封板 / ❗ / 🔥 |
福赛科技大涨点评、白电回调主要或跟产… |
当日异动的解释 | 中(情绪化,别当结论) |
| 深度专题 | 深度 / 专题报告 / 系列 |
[烟花]【长江电新】深度丨掘金… |
逻辑框架 | 高(少见,遇到就读) |
| 外资研报 | 外资行名——(伯恩斯坦/野村/美银/高盛/摩根大通/GS) |
伯恩斯坦——全球储能:中国电池…、摩根大通——储能需求:逆流而上、📌GS 中国午间#交易台 |
外资视角 + 全球可比,与内资观点对照看分歧 | 高(注意立场与中国资产偏好) |
| 数据跟踪 | 数据跟踪 / 高频数据 |
电力设备出口数据跟踪、【招商房地产】高频数据 |
补 Wind EDB 之外的硬数据 | 高 |
| 附件 | 标题就是 「文件」 / 「图片」 |
— | 标题零信息,无法匹配,需 +detail 或跳过 |
— |
> 表情前缀是星球的标记习惯(🔥 [红包] [烟花] ❗️ 🍁),通常表示星主主推,不等于重要性更高——反而要警惕推销倾向。
可用星球(2026-09-21 实测,10 个里只有 2 个开通权限)
| group_id | 名称 | 类型 | 定位(2026-09-21 实测) | 30 条覆盖时长 |
|---|---|---|---|---|
15552822254242 |
⭕ 短评&信息 | pay(3468 人) | 内资券商即时点评(天风/广发/长城/中泰/华泰…)+ 异动快评(XX大涨点评/XX在跌什么)+ 小作文 |
≈11 分钟(极高频) |
15285211418852 |
⭕ 基业长青 | pay | 外资券商研报主阵地(伯恩斯坦×3 / 野村×2 / 美银 / 高盛 / 摩根大通 / GS午间交易台)+ 深度专题 + 专家会 | ≈8.5 小时 |
> 两个星球互补,都要跑:短评看「当下内资在说什么」(高频切片),基业长青看「外资研报和深度」(覆盖大半天)。
> 🔴 覆盖时长差 40 倍:短评 30 条只覆盖约 11 分钟——只看一次等于只看了一个瞬间。要覆盖更多时段需分多次采样(间隔几小时)。基业长青一次就够。
> 🔴 「文件」类型是盲区:部分条目标题就是「文件」(研报 PDF 附件),标题无法判断内容,做不了关键词匹配——只能 topic +detail 看描述,或直接跳过。实测基业长青 30 条里有 8 条是「文件」。
> 🔴 8/10 星球未开通 Skill 权限:思想钢印、看多君和他的朋友圈、FundTalk-精英路演、喵财君带你一起去探店、免费调研纪要研报投研快评、财经财富、自由讨论、换到新短评星球。调用 +topics / +search 一律报「该星球暂未开通 Skill 权限,如需使用可联系星主申请开通」。
> 处理:写进配置的 blocked 列表,不要反复重试。需要时让用户向星主申请开通,开通后把 group_id 从 blocked 移到 enabled 即可。
> 新增星球先跑一次 group +topics 探活,能返回再写进 enabled。
双路采集法:一路看「当下」,一路挖「主题」
两个接口能力不同,必须并用(topic +search --help 实测只有 group-id/query/json 三个参数,无排序、无时间过滤、无 limit):
| 目的 | 接口 | 排序方式 | 实测表现 |
|---|---|---|---|
| 市场当下在讨论什么(热点扫描) | group +topics --limit 30 |
时间倒序,天然新鲜 | 30 条全部落在当日 13:01–14:17 |
| 某个主题的脉络(主题深挖) | topic +search --query [行业词] |
按相关性,无时间过滤 | 搜「固态电池」15 条,横跨 2024-03 ~ 2026-09 |
> 🔴 顺序不能反:先 group +topics 定「今天市场在说什么」,再 topic +search 挖具体主题。
> 只跑搜索会看不到当下热点——搜索按相关性排,最新一条也可能是一个月前的。
热点扫描怎么用:拿到 30 条标题后,按每只标的 zsxq_queries.hot_match 做标题匹配(不是再搜一遍),命中的即「今天有人在说我的行业」。一条都没命中就直接跳过,不要硬凑。
> 🔴 必须用 hot_match,不要用 keywords:热点标题只有十几个字,泛词会大量误命中。实测当日 30 条里出现 AI制药 / AI安全 / AI中长视频 / 通用AI厂商——用裸「AI」匹配会误报腾讯控股(实际与游戏/AI变现无关)。所以腾讯的 hot_match = 游戏/腾讯/版号/微信/AI应用/AI变现,而 keywords 仍保留 AI(供 topic +search 深挖用,搜索有正文可判相关性)。
四条硬规则(实测踩过)
- 🔴 搜索没有时间过滤,按相关性排序——实测搜「锂」返回 2022-08、2022-12、2026-02、2026-04、2026-09,跨度 4 年。
必须先看CREATED AT:>30 天直接丢弃,不要读详情。 对星球内容,时效筛是强制的,不是可选的。
实测演示(2026-09-21 搜「钾肥」,12 条结果正好铺满三档):
| 时效档 | 命中示例 | 处置 |
|---|---|---|
| ≤7 天(增量) | 藏格矿业收购刚果布钾盐矿点评(09-18) | ✅ 读 detail,进增量分析 |
| 8-30 天(已知事实) | 亚钾国际中报点评(08-28)、中金海外农化(09-08)、基础化工 26H1 综述(09-11) | 进背景区 |
| >30 天(丢弃) | 钾肥行业更新(2025-12-16)、Mosaic K3(2025-12-16) | ❌ 不读、不写 |
> 「藏格矿业收购刚果布钾盐矿」是盐湖股份的直接竞品动态,且落在增量窗口内——这类信息正是竞品公告交叉验证之外最有价值的补充。
2. 列表/搜索只给摘要(DIGEST 截断)——要全文必须 topic +detail。单条详情约 2KB,体积安全;但只对「≤7 天 + 与 thesis 相关」的主题取详情,不要批量 detail。
3. 搜行业词不搜公司名——与浑水同理。搜「碳酸锂」能命中盐湖相关的完整分析,搜「盐湖股份」命中率低。
🔴 也不要搜「预期」「目标价」这类元词——实测搜「预期」返回的全是无关跨年内容(沃尔调研 2024-07、NVIDIA 2024-05、CPI 2024-03)。市场预期要从券商点评的正文里「提取」,不是靠搜索词「搜」出来的。
4. 🔴 --limit 上限是 30(实测 31 即报 无效的count)。且高频星球的 30 条只覆盖约 1–2 小时(实测 13:01–14:17)——短评类星球一天发几百条,30 条只是一个时间窗口的切片,不是全天汇总。要覆盖更长时段就分多次跑。
调用方式
# 1) 热点扫描(先跑):时间倒序,看「当下市场在讨论什么」。limit 上限 30,不可超
zsxq-cli group +topics --group-id 15552822254242 --limit 30
# 2) 主题深挖(后跑):行业关键词搜索。搜行业词,别搜公司名,别搜「预期」
zsxq-cli topic +search --group-id 15552822254242 --query "固态电池"
# 3) 命中后取全文(只对 ≤7 天且相关的)
zsxq-cli topic +detail --topic-id 22258815182821211 --json
> Windows 环境两个坑:
> ① zsxq-cli 可能不在 PATH。定位顺序:先 Get-Command zsxq-cli;若为空,到 ~/.workbuddy/binaries/node/cli-connector-packages/node_modules/zsxq-cli/node_modules/ 下找 @zsxq/cli-<平台> 目录(Windows 为 cli-win32-x64,macOS 为 cli-darwin-arm64 等),其 bin/zsxq-cli 即为可执行文件,调用时写全路径。
> ② 输出是 UTF-8,PowerShell 捕获需先执行 [Console]::OutputEncoding = [System.Text.Encoding]::UTF8,否则中文全部乱码。
⭐ 数据口径变更预警(跨模块整合,最值钱的一点)
星球是唯一能提前告诉你"数据口径变了"的信源。口径一变,历史序列就断层,环比分析全部失效。
发现「调整统计口径 / 启用新样本 / 纳入新来源」时的处理:
- 立即在报告的行业景气块标注
⚠️ 口径变更 [日期],写清变化方向(上修/下修/幅度) - 暂停该指标的环比解读,只做定性描述,等新口径积累 2-3 期后再恢复
- 同步写进
portfolio.json该指标的note字段,避免下次重复踩坑
> 实测案例:SMM 碳酸锂库存口径变更后,周度库存 7 万吨 → 16.93 万吨。不标注就会误判成"库存暴增 140% = 过剩利空",实际是统计范围扩大,真实供需没变那么多。这类误判会直接导致 [-] 误标。
从星球提取市场预期(v5.7 核心)
这是星球不可替代的能力:拿到"当天版本"的卖方预期,而不是滞后的存量研报。
Step 1|识别预期载体——券商点评(【券商+行业组】前缀)正文里找这些信号词:
| 信号词 | 提取什么 | 对预期差的用处 |
|---|---|---|
目标价 XX 元 / 看至 XX |
卖方目标价 | 与现价对比 → 隐含空间 |
预计 26 年净利润 XX 亿 / 上调至 / 下调至 |
盈利预测 | 判断修正方向(比绝对值更重要) |
强CALL / 重点推荐 / 强烈推荐 |
卖方立场强度 | 强推=预期已高,警惕"利好出尽" |
超预期 / 大超预期 / 低于预期 |
相对一致预期的方向 | 直接就是预期差标注 |
市场担心 / 普遍认为 / 一致预期是 |
市场共识本身 | 罕见且珍贵,直接用作第二层基准 |
Step 2|热度 → 定价程度判定([已定价] vs [未定价] 的可操作标准):
| 观察 | 判定 |
|---|---|
| 同一主题当天被 ≥3 家券商点评覆盖,或标题反复出现 | [已定价]——利好也推动不了股价 |
| 当天仅 1 条提及、无券商跟进、只出现在专家交流里 | [未定价]——最值钱的窗口 |
| 圈内说法与卖方研报相反 | 预期差信号,优先核实 |
星主用 🔥/[红包] 主推但无券商跟进 |
警惕:可能是推销不是共识,按 [未定价但存疑] 处理 |
Step 3|纪律:
- 星球内容只能生成假设,必须经 Wind/公告/EDB 交叉验证,验证前一律标
[待验证] - 卖方预期天然偏乐观("强CALL"是推销话术),与 Wind 实际数据冲突时以 Wind 为准
- 报告中标注
[星球-星球名]+ 内容类型(券商点评 / 专家交流 / 异动快评),便于回查可信度
> ⚠️ 星球内容质量参差、无署名责任,不能单独作为 thesis 判断依据。正确用法是用它生成假设 → 用 Wind 数据或公告交叉验证,验证前一律标 [待验证]。
行业信源自动查表(v5 新增)
系统根据标的 industry 字段自动从 portfolio.json 顶层的 industry_sources 映射表获取行业信源,无需手动配置。
映射规则
- 标的声明
industry: ["基础化工/钾肥化肥", "有色金属/锂业/碳酸锂"] - 系统先试子级 key(精确定位),不命中回退父级
- 每个行业 key 含 3 类信源:协会/官方 + 数据/价格平台 + 行业媒体
- AI 层逐站用
WebSearch site:[站名] [关键词]定点搜索(共 6-9 站/标的)
搜索策略分支
| 站点类型 | 策略 | 示例 |
|---|---|---|
| SEO 可达 | site:[站名] [关键词] |
site:bjx.com.cn 固态电池 |
| paywall/JS 渲染 | [站名] [关键词](去 site:) |
smm.cn 碳酸锂 报价 |
| 数据平台 | 优先 WebFetch 价格页 | oilchem.net 钾肥报价表 |
预置覆盖 13 个父级行业(基础化工、电力设备/新能源、互联网/传媒等)+ 12 个子行业(钾肥化肥、锂电设备、速冻预制菜等),新增标的只需声明 industry 即可自动对号入座。
执行流程(MUST 强顺序)
每次执行「跟踪持仓」时,必须严格按以下顺序执行,不可跳过:
Step 1:数据采集(Wind 优先,脚本兜底)
- 板块与大盘情绪快照(先行,定环境):读
portfolio.json的market_indexes.watchlist+ 每标的wind_index_codes(benchmark / sector_sw / themes),去重后合并为一份代码清单,get_index_price_indicators一次批量取全,indexes 取「中文简称,最新成交价,涨跌幅,5日涨跌幅,20日涨跌幅,年初至今涨跌幅,成交额,换手率,上涨家数,下跌家数,平盘家数,当日主力净流入额,近5日主力净流入额,市盈率(TTM),市净率(LF)」。据此先算好「大盘涨跌 / 板块相对强弱 / 市场宽度」,后面分析个股时才知道哪些波动是市场给的。⚠️ 新指数代码未验证前必须单独调用试错,不能混进批量(一个无效代码整批失败)。 - Wind 个股行情快照:
get_stock_price_indicators批量查询全部持仓(wind_code 逗号分隔),indexes 取「最新成交价,涨跌幅,近5日主力净流入额,市盈率(TTM),市净率(LF),股息率,总市值1」。若 Wind 断开或返回空 → 回退fetch_data.py --mode all(脚本三源链:价格+异动+AKShare新闻+PB+公告源导出) - 价格落盘(不可跳过):把上一步 Wind 价格写成
reports/wind_prices.json(键为 symbol),执行python scripts/sync_snapshot.py --prices-file reports/wind_prices.json。不做这步 price_history 会断档,「较上周」失去基准。 - 行业景气指标 + Thesis 指标取数(EDB,两类都取):
a) 行业景气:读portfolio.json顶层industry_edb_codes,按每标的industry取 2-3 个景气指标(executionMode="仅提数",observation=4~6)。v5.5 起为日常必做项——行业量价库存比公告更早反映拐点。优先取「价 + 库存」两个维度(才能跑交叉判读);只有单维度时在报告中说明无法交叉。
b) 个股 thesis 指标:读holdings[].wind_edb_codes,取 thesis ★★★ 指标序列(observation=6~10)。
c) 取完先做「数据体检」(3 秒,但能避免误读):- 僵死? 近 N 期数值完全相同 → 是滞后挂牌价,无边际信息量,改用有波动的同类指标,并在报告「指标可用性」行标注
- 停更?
endDate距今 > 1 年 → 剔除不用 - 无权限? 报错含
受限指标已剔除→ 剔除该条(同批其他不受影响),并在配置中标注
d) 按「交叉判读矩阵」做两维交叉(价 × 库存 / 价 × 量),不要只报单一指标的方向;两维冲突时以价+库存优先(贴近当下成交 > 月度滞后)。
禁止用「搜索并提数」+宽泛词(会 318KB 溢出)。无固化代码时,先「仅搜索」找代码并回填配置——搜索词用行业通用词(如「钾肥」),不要用化学名(如「氯化钾」);也不要过宽(返回几十条垃圾)。
- 公告采集(Wind 优先,两轮):
a) 标的公告:get_company_announcements(query="[标的名] 最新公告",top_k=5)。Wind 不可用 → 读announcement_sources.json用 cninfo/hkexnews WebFetch(仅取标题+日期)
b) 竞品交叉公告:读 holdings[i].competitors_a / competitors_global,优先用competitors_wind_codes(已预生成 .SZ/.SH/.BJ 后缀)作为 query 提高命中率;对每个竞品get_company_announcements(top_k=5),合并为"[标的]+竞品公告流"。报告中标注[Wind-竞品名]区分来源 - 财经新闻(Wind 优先):
get_financial_news(query="[标的名]",top_k=5);Wind 不可用 → AKShare/WebSearch 兜底 - 知识星球(市场预期主源,双路采集):读
portfolio.json的zsxq_groups.enabled(跳过blocked),对每个可用星球:
a) 热点扫描(先跑):group +topics --limit 30(上限 30,31 会报无效的count)。拿标题后按每标的zsxq_queries.keywords做标题匹配——命中的即「今天有人在说我的行业」。
b) 主题深挖(后跑):topic +search --query [行业关键词](行业词;不搜公司名,不搜「预期」)。
时效筛强制:按CREATED AT筛——>30 天直接丢弃不读详情,≤7 天才topic +detail取全文(单条约 2KB)。
重点提取四类信息:① 市场预期——券商点评里的目标价/业绩预测/「超预期」措辞(走「从星球提取市场预期」流程);② 数据口径变更(命中则走「口径变更预警」流程);③ 与卖方研报相反的圈内说法;④ 专家交流的产业链一手信息。
全部标注[星球-星球名]+ 内容类型(券商点评/专家交流/异动快评),未经 Wind/公告交叉验证前一律标[待验证]。 - IMA 浑水(可选,v5.7 降级):仅在需要完整研报原文时才调用(如某条星球点评需回溯研报全文)。日常预期差判定已由第 7 步覆盖,不必每次跑。若跑:搜行业关键词(不搜公司名),
is_end=false或数据截断时用next_cursor逐页取,累计 5-10 条后停止,避免 token 溢出。 - 读
portfolio.json的industry_sources和每标的industry字段,自动查表获取对应行业协会/数据平台/媒体站点 → 按站点类型选择搜索策略:SEO 可见站用site:[站名] [关键词],paywall/JS 渲染站用[站名] [关键词](去 site: 限制)。 - 并行 WebSearch 补充(competitor + thesis_trigger + consensus_search)
- 波动率标尺(脚本,一次全组合):
python scripts/update_volatility.py(需事件对比时加--event SYM=YYYY-MM-DD),读输出的reports/volatility_latest.json。Step 3 做归因前先看它——同一天的涨跌在低波动票上是信号、在高波动票上可能只是呼吸。
Step 2:时效筛 ← 关键步骤,不可跳过
在写入报告之前,逐条检查所有采集到的信息的日期。
- 日期 ≤ 7 天 → 放入「增量信息标注」
- 日期 8-30 天,且仍影响 Thesis → 放入「已知事实」
- 日期 > 30 天 → 丢弃,不写入报告
- 如果一条信息没有明确日期 → 标记为「日期未确认」放在已知事实区
豁免:以下属于状态数据(描述当前状态而非事件),不走时效筛,直接进估值/风险快照区——
Wind 的 PE/PB/市值/股息率、估值历史分位、Beta/波动率/最大回撤、股东结构与解禁时间表、大盘/板块指数行情与情绪指标(涨跌幅/涨跌家数/主力净流入/换手率)、EDB 行业景气指标当前值。
(这些数据的"最新更新日期"在 Wind 返回的 updateDate 字段,若距今 > 30 天需标注「数据陈旧」。)
时效筛检查清单:在生成每只标的的报告前,先回答——"这条信息的原始发布日期是哪天?距离今天几天了?属于哪个区域?"
Step 3:双层分析
每条款式标注:
[日期 来源] 事件 → [+] / [-] / [0] ← Thesis影响
→ [超预期] / [符合预期] / [低于预期] / [已定价] / [未定价] ← 预期差
Step 4:生成报告
严格按下方强制模板输出。 横截面表的列名和顺序不可改变。
Step 5:更新 log.md
追加关键事件的日志到每只标的的 coverage/{标的}/log.md。
数据源降级矩阵
| 数据源 | 正常状态 | 降级方案 | 检测方法 |
|---|---|---|---|
| Wind Alice | 返回结构化数据 | 行情→脚本三源链;公告→cninfo/hkexnews WebFetch;新闻→AKShare/WebSearch;财务/估值→WebSearch 手工查 | 工具调用报错或返回空 |
| 知识星球 zsxq-cli | 返回主题列表 | ① 某星球「未开通 Skill 权限」→ 跳过(在 blocked 列表里),换下一个可用星球;② 全部不可用 → 用 WebSearch site:xueqiu.com [行业词] + 行业信源替代,报告标注星球不可用 |
报 未开通 Skill 权限 / 无效的count / 命令不存在 |
| IMA 浑水 | 搜索返回结果 | 由知识星球替代(v5.7 起浑水非必需);再不行切 WebSearch 增补 | 搜索返回空或 connector disconnected |
| 巨潮/港交所公告 | WebFetch 正常返回 | WebSearch site:cninfo.com.cn [标的名] 或 site:hkexnews.hk [标的名] 替代 |
WebFetch 无公告列表数据 |
| 新浪实时行情 | 返回有效价格 | 新浪空→东方财富push2(重试3次)→腾讯行情(qt.gtimg.cn)→快照回退/占位 | 价格=null |
| 行业信源定点站 | WebSearch site: 有返回 | 降级为普通关键词搜索(去 site: 限制) | 连续3站无返回 |
| WebSearch | 正常返回 | 报告底部标注不可用 | 返回空 |
> 核心原则:数据源断了不能导致报告不生成。降级后标注,不停机。
Wind 不可用时的公告/行情降级接口(v5.9 实测可用)
Wind connector 未连上时(表现为 ToolSearch 找不到 mcp__wind-finance__*、DeferExecuteTool 报 not found),不要干等,直接切这两个 HTTP 接口(2026-10-08 实跑验证):
① 公告列表(免 Key,返回 JSON)
https://np-anotice-stock.eastmoney.com/api/security/ann?page_size=50&page_index=1&ann_type=A&client_source=web&stock_list=600897&f_node=0&s_node=0
stock_list填纯数字代码(沪深通用);page_size最大 50- 关键字段:
notice_date(披露日)、art_code(正文 ID)、columns[].column_name(公告类型,用它快速筛这批在讲什么事)、title_ch - ⚠️ Bash 直接 curl 中文会 GBK 乱码 → 用 Python
urllib抓 +decode('utf-8')后写文件,再用 Read 工具读,不要靠 stdout
② 公告全文(拿 art_code 换正文,够读关联交易/框架协议的条款和数字)
https://np-cnotice-stock.eastmoney.com/api/content/ann?art_code=AN202609301830055487&client_source=web&page_index=1
- 取
data.notice_content,剥 HTML 标签后即得全文 - ⚠️ PDF 类公告(年报全文、审计报告、部分估值报告)返回的是空壳,提取不到正文 → 遇到这类改用同类「摘要」公告 / 相关议案公告取数,不要在这上面反复重试
- 📌 同一控制下追溯调整公告、法案的「提示性公告」、临时股东会通知往往藏着主线,务必一并读
③ 价格兜底(腾讯行情,沙箱可达率最高)
https://qt.gtimg.cn/q=sh600897,sh600004,sh000001 # 快照:现价/昨收/今开/PE/PB/市值/换手
https://web.ifzq.gtimg.cn/appstock/app/fqkline/get?param=sh600897,day,,,15,qfq # 15日前复权K线
- 快照为
~分隔的一维串,用图标注对照解析;sh/sz/bj前缀 - K 线 JSON:
data['sh600897']['qfqday'] - ⚠️ 多个代码批量时任一代码无效不影响其他(与 Wind 整批失败相反,这也是它的好处)
强制输出模板(MUST)
A0. 市场环境与板块情绪(MUST,放在报告最顶部)
先看市场,再看个股。5 行以内说清今天的风向:
## 市场环境 — YYYY-MM-DD
| 层级 | 指数 | 涨跌幅 | 5日 | 20日 | YTD | 涨跌家数 | 主力净流入(5日) |
|------|------|--------|-----|------|-----|---------|---------------|
| 大盘 | 上证指数 | | | | | 1663涨/620跌 | |
| 大盘 | 沪深300 / 恒生指数 | | | | | | |
| 板块 | [标的所属申万行业] | | | | | | |
| 主题 | [相关概念指数] | | | | | | |
**一句话**:[市场宽度 0.68 = 普涨 / 缩量分化 / 放量下跌];资金[流入/流出][XX]板块;我的持仓所在板块今日[顺风/逆风],跑[赢/输]大盘 [X]pct。
必答三问(答不上来说明 Step 1 第 1 步没做):
1. 今天是普涨还是普跌?(市场宽度 = 上涨家数 /(上涨+下跌))
2. 钱在往哪个板块流?(对比各板块 5 日主力净流入 + 板块相对强弱)
3. 我的持仓今天是板块带的还是自己的?(个股 alpha = 个股涨跌幅 − 板块涨跌幅)
A0.5 今日市场在讨论什么(MUST,星球热点扫描)
紧跟市场环境。用 group +topics --limit 30 的标题匹配结果,说清「今天卖方在聊什么、预期什么」,并标出与持仓相关的部分:
**今日圈内热点**([星球名],30 条覆盖 HH:MM–HH:MM):[主题1] / [主题2] / [主题3] …
| 命中持仓 | 内容类型 | 要点 | 预期信号 |
|---------|---------|------|---------|
| 宁德时代(动力电池) | 券商点评【XX电新】 | [一句话] | 目标价 XX元 / 预计26年净利 XX亿 |
| 纳科诺尔(固态电池) | 专家交流 | [一句话] | [待验证] |
**与持仓无关的热点**:[一句话,如「今日热点集中在 AI制药/机器人刀具,与持仓无关」]
规则:
- 一条都没命中就写「今日圈内热点与持仓无关」,不要硬凑——热点不在你的行业是正常且有价值的信息(说明今天没有行业级催化)
- 「预期信号」列只填正文中真实出现的目标价/业绩预测/共识措辞,没有就留空或写「无明确预期」
- 同一主题若被 ≥3 家券商同时覆盖 → 在「预期信号」标 [已定价];仅 1 条且无券商 → [未定价]
放在市场环境之后。列名和顺序不可变:
| 标的 | 收盘价 | 日涨跌幅 | 板块涨跌 | 个股alpha | 较上周 | 预期差信号 | 优先级 |
|---|---|---|---|---|---|---|---|
- 「板块涨跌」:该标的所属申万行业指数(或最贴近的概念指数)当日涨跌幅
- 「个股alpha」:个股涨跌幅 − 板块涨跌幅。|alpha| < 1pct 视为噪声,不写进增量分析(并行参考:|alpha| < 0.5σ20 也在个股自身尺度上属于噪声,两只取严者)
- 「较上周」:与上一个交易周收盘的累计涨跌幅
- 「预期差信号」:选择最显著的预期差标注(超预期/低于预期/未定价/符合预期)
B. 每只标的章节
## [标的名] (代码) 每日跟踪摘要
### 涨跌归因(MUST)
- 大盘贡献:[基准指数] [X]%
- 板块贡献:[板块指数] [Y]% − 大盘 [X]% = [Z]%
- 个股 alpha:个股 [A]% − 板块 [Y]% = [B]%
- 判断:[今天主要是市场/板块在动,公司层面无新信息] 或 [跑赢/跑输板块 B pct,需查原因]
### 波动位置(MUST)
- 自身尺度:σ20 [X]%(年化 [Y]%) / σ60 [Z]% → 波动比 [R](>1.2 抬升 / <0.8 收敛)
- 今日定位:涨跌幅 [A]% ÷ σ20 = **z = [N] 倍** → [常态<1σ / 偏大1-2σ / **异常≥2σ**]
- 一年分位:[P]%(0% 极度平静 = 变盘前夜;100% 一年最躁)
- 大盘参照:[沪深300/恒指] σ20 [B]%、今日 [C]% → [今天主要是市场在动 / 个股独立行情]
(数据来自 `reports/volatility_latest.json`;脚本取不到时降级用 Wind `get_risk_metrics` 的年化波动率,手算 z = 涨跌幅 ÷ 年化/√252,并标注「估算」)
### 行业景气(EDB,MUST)
| 指标 | 最新值 | 上期 | 环比 | 维度 |
|------|--------|------|------|------|
| [如 动力电池装车量] | 79,000 MWh | 74,600 | +5.9% | 量 |
| [如 碳酸锂价格] | 134,360 元/吨 | ... | ... | 价 |
**交叉判读**:[价↑量↓ → 主动去库,接近底部] / [价↓库存↑ → 过剩,最差组合](用交叉判读矩阵,不要只报单一方向)
**⚠️ 口径变更**:[无] 或 [例:SMM 碳酸锂库存 2026-09-11 启用新口径,7万吨→16.93万吨,本期环比暂停解读]
**⚠️ 指标可用性**:[全部正常] 或 [例:S5424440 连续 4 个月恒为 3100 = 僵死报价,价格判断改用 S5470454;S9984052 无权限已剔除](取到僵死/停更/无权限数据时必须在此标注,避免误读成"价格稳定")
### 增量信息标注(≤7天)
[日期 来源] 事件描述
→ Thesis: [+] / [-] / [0]
→ 预期差: [超预期] / [符合预期] / [低于预期] / [已定价] / [未定价]
### 预期差检查
- 市场共识:[当前市场一致预期的核心假设]
- 偏差发现:[新信息与市场共识之间的差距在哪里?]
### 已知事实(8-30天持续背景)
[仍在影响Thesis但超过7天的关键信息]
### 失效条件状态
[逐条检查,标注是否触发]
### ⚠️ 股价异动溯源(仅触发阈值时)
7维度:公司公告 / 行业景气(EDB量价) / 竞品联动 / 大盘板块(三层归因) / 资金流向 / 分时形态 / 圈内舆情
### 一句话结论
> [Thesis判断] + [预期差判断]
C. ⚠️ 异动溯源(触发阈值时)
满足以下任一条件时必须输出完整 7 维度溯源(两条规则并行,不可省略为普通跟踪格式):
| 规则 | 触发条件 | 适用 |
|---|---|---|
| a. 绝对阈值 | 单日跌幅 ≥ alert_threshold_pct(默认 5%) |
兜底:保证大幅下杀一定被查 |
| b. 相对尺度 ⭐ | |z_today| ≥ 2σ(个股自身波动 2 倍标准差) | 抓「低波动票的小跌幅其实是大事」——如厦门空港 -3.18%(σ20≈1.8%)被捕捉到 |
> 只满足 b 不满足 a 时,通常意味着个股自身事件而非普跌,直接锁定第 1 维(公告/公司)和第 7 维(圈内舆情)。
> 两条都不满足时不要溯源——把日常呼吸当成信号是另一种噪声。
先做归因再溯源——如果三层归因显示 alpha ≈ 0(跟着板块走),则第 1、3 维度基本可排除,重点查 2、4、5:
| 维度 | 查什么 | Wind 工具 |
|---|---|---|
| 1. 公司层 | 有无公告/事件 | get_company_announcements |
| 2. 行业景气层 | 量价库存有无异动、有无行业新闻 | natural_language_get_edb_data + get_financial_news |
| 3. 竞品层 | 竞品是否同涨同跌(同跌=行业性,独跌=公司性) | get_stock_price_indicators(competitors_wind_codes) |
| 4. 大盘/板块层 | 大盘涨跌 + 板块相对强弱 + 市场宽度 | get_index_price_indicators |
| 5. 资金层 | 个股与板块主力净流入方向 | get_stock_price_indicators + get_index_price_indicators |
| 6. 形态层 | 尾盘突袭 vs 全天阴跌 | get_stock_quote(count=-20) |
| 7. 圈内舆情层 | 星球里有无相关讨论/口径变更/相反说法 | zsxq-cli topic +search |
深度分析模式(周度/事件触发)
触发方式:说「深度分析持仓」。每周一自动执行。
内容要求
深度模式 = 日度摘要骨架 + 以下 4 个额外维度:
1. 短/中/长期逻辑逐段验证
- 对 thesis.md 中每段逻辑,写明当前状态:“成立 / 需观察 / 边际削弱”
- 引述本周增量信息作为证据
2. 竞品横截面对比
- 当前价格位置、估值分位、近期催化对比表
- 回答:“相对竞品,我的持仓被高估还是低估?”
3. 估值状态快照
- 当前 PE/PB 分位 vs 历史分位
- 当前隐含的长期增长预期 vs 我的 thesis 假设
- 标注:“当前估值在定价什么故事?”
4. 预期差全景
- 市场共识(EPS/目标价/关键假设)vs 我的判断
- 本周新增的预期差有哪些?有哪些旧预期差被修复了?
Wind 调用清单(深度模式额外调用)
日常跟踪的 Wind 数据不够支撑深度分析,额外调用:
| 深度维度 | Wind 工具 | 说明 |
|---|---|---|
| 逻辑逐段验证 | get_stock_fundamentals |
question 自然语言问 ROE/毛利率/营收净利趋势 |
| 估值分位 | get_stock_fundamentals |
question 含「历史分位」,替代乐估全市场 PB |
| 事件扫描 | get_stock_events |
分红/增发/减持/解禁/ST/诉讼,检查失效条件 |
| 股东与解禁 | get_stock_equity_holders |
前十大股东变动 + 限售解禁时间表(解禁压制量化) |
| 竞品对比 | get_financial_data |
跨实体聚合;竞品行情用 competitors_wind_codes 批量取 |
| 行业景气全景 | natural_language_get_edb_data |
取更长序列(observation=12~24)判周期位置:当前在产能/库存周期哪个阶段;按「价×库存」交叉判读矩阵定调 |
| 板块估值与趋势 | get_index_fundamentals + get_index_kline |
板块 PE/PB 历史分位 + 板块趋势;与个股趋势做背离检查(板块涨个股跌 = 个股 alpha 为负,要查原因) |
输出格式
# 持仓股深度分析 — YYYY-MM-DD
## 全景透视
[所有标的的横截面对比表 + 预期差矩阵]
## 逐标深度分析
### [标的1]
#### 短/中/长篇逻辑逐段验证
#### 竞品对比
#### 估值快照
#### 本周预期差
### [标的2] ...
频率
- 常规:每周一 08:00 自动执行(模型 deepseek-V4-Pro)
- 手动:市场有重大事件时手动触发
文件结构
项目根目录/
├── coverage/
│ ├── portfolio.json ← 持仓配置 + industry_sources + market_indexes + industry_edb_codes + zsxq_groups + zsxq_expect_terms
│ ├── market_pb_latest.json ← 全市场PB分位(单份)
│ └── {代码}_{名称}/
│ ├── thesis.md ← 投资逻辑(必填)
│ ├── log.md ← 边际变化流水账(自动追加)
│ ├── snapshot.json ← 价格快照 + price_history
│ └── news_latest.json ← AKShare新闻快照
├── scripts/
│ ├── fetch_data.py ← 数据采集脚本 v4.1(兜底链 + 公告源导出)
│ ├── sync_snapshot.py ← Wind 价格落盘(v5.3,防 price_history 断档)
│ └── update_volatility.py ← 波动率标尺 v5.9(σ20/60、z_today、波动比、一年分位、事件前后对比)
└── reports/
├── YYYY-MM-DD_daily.md ← 日度分析报告
├── fetch_report_latest.json ← 脚本采集汇总(覆盖)
├── intraday_latest.json ← 盘中异动检测
├── volatility_latest.json ← 波动率标尺输出(v5.9,覆盖,含各地大盘基准)
├── announcement_sources.json← 公告源导出(AI层消费)
└── wind_prices.json ← Wind 价格中间文件(供 sync_snapshot 消费)
Thesis 拆解模式(新建/修改投资逻辑时)
触发方式
- 用户说「拆解 [标的名] 的投资逻辑」
- 用户新建或修改 thesis.md 后主动询问是否需要拆解
- 输入:thesis.md 中用户写的投资逻辑文本 OR 用户口述的逻辑
拆解流程(MUST 顺序)
Step T1:提取关键假设
从用户的短/中/长期逻辑中逐段提取隐含假设。每条假设表述为"如果 X 成立,则 Y 成立"。区分三个时间维度。
Step T2:映射为可跟踪指标
将每条假设拆解为可量化、可观测的数据指标。每个指标标注:
- 优先级:★★★(核心,每期必看)/ ★★(重要,每周看)/ ★(参考,月度看)
- 数据来源:具体网站或报告(优先从 industry_sources 查表匹配)
- 跟踪频率:日度/周度/月度
Step T3:构建数据清单
按类别(价格/需求/供给/政策/竞争)组织为结构化表格,包含指标名称、优先级、信源建议。写入 thesis.md 底部的「跟踪数据清单」章节。
示例(盐湖 v2 拆解结果)
[用户输入] 锂价中枢抬升:需求端全球电车+储能IRR拐点,供给端资本开支萎缩+边际成本12万
[拆解输出]
需求-电车:全球新能源车月度销量 ★★★ → 乘联会/SNE
需求-储能:中国储能IRR及容量电价 ★★★ → 国家能源局
供给-资本开支:全球锂矿资本开支数据 ★★★ → IEA/机构研报
供给-成本线:江西锂云母边际成本 ★★ → SMM/百川盈孚
完整的盐湖 v2 拆解结果参考 coverage/000792_盐湖股份/thesis.md 底部的「跟踪数据清单」。
对抗式审查模式(审视投资逻辑)
触发方式
- 用户说「审查 [标的名] 的投资逻辑」
- 用户说「对抗式审查持仓」
- 重大市场事件后用户要求重新审视逻辑
审查流程(MUST 顺序)
Step A1:逐条假设挑战
对 thesis.md 中每条短/中/长期逻辑,依次执行以下检查:
1. 隐含假设显性化——"这条逻辑成立需要哪些前提?"
2. 假设失效测试——"如果这个前提不成立,最可能的原因是?"
3. 未明说的信仰——"作者没说出来但默认相信的是什么?"
Step A2:反方论点矩阵
为每只标的构建市场反方观点表。来源包括:知识星球里的看空/分歧观点(搜行业词,重点找与卖方主流相反的说法)、浑水研报中的看空观点、财报中的风险提示、行业竞争者的威胁、WebSearch 的负面讨论。
| 反方论点 | 来源 | 可信度 | 对Thesis的冲击 |
|---|---|---|---|
| [反方观点] | [出处] | 高/中/低 | 哪些逻辑会被击穿 |
Step A3:最可能失效路径分析
列出 2-3 条最可能击穿 thesis 的路径(不是泛泛的不利情况,而是具体的事件链),并评估每条路径的触发概率。
Step A4:隐藏风险清单
找出那些"逻辑正确但可能赚不到钱"的场景:
- 估值陷阱:基本面正确,但市场永远不给合理估值(如市场把"稳定盈利"当"没有增长")
- 时间成本:逻辑需要 3-5 年兑现,但持仓期只有 12-18 个月
- 杠杆/仓位风险:正确的逻辑被融资盘/仓位管理放大为亏损
- 相关性风险:标的与大盘/板块高度相关,Beta 掩盖 Alpha(用三层归因验证:连续 10 个交易日个股 alpha 均 < 1pct,说明你买的其实是板块 beta,不是这家公司)
- 流动性风险:小市值标的即使逻辑兑现也无法顺利退出
先用 Wind 量化,再定性判断(不要凭感觉估):
get_risk_metrics(question="查询 [标的1](代码)、[标的2](代码) 过去1年的Beta、年化波动率和最大回撤")
一次批量返回全部持仓,可直接支撑上表后三项:
| 风险类型 | 用什么 Wind 数据判断 | 参考阈值 |
|---|---|---|
| 相关性风险 | 过去1年 Beta | Beta > 1.5 = 涨跌被板块放大,Alpha 难分离 |
| 杠杆/仓位风险 | 过去1年年化波动率 | 波动率 > 50% = 杠杆仓位极易被打爆 |
| 流动性/回撤风险 | 过去1年最大回撤 | 回撤 > -50% = 需评估自己能否扛住 |
> 实测基准(2026-09-21,过去1年):纳科诺尔 Beta 1.67 / 波动率 61.6% / 回撤 -70.2%;宁德时代 1.02 / 33.6% / -34.1%;盐湖股份 1.00 / 44.6% / -39.4%。——纳科诺尔是三只里风险最极端的,此前只定性说"北交所流动性差",有了数据才知波动是宁德的 1.8 倍。
Step A5:生成审查报告
输出结构化报告,包含:
# 对抗式审查 — [标的名] ([代码])
## 一、逐条假设挑战
[对短/中/长期每条逻辑的挑战分析]
## 二、反方论点矩阵
[表格:反方观点、来源、可信度、冲击评估]
## 三、最可能失效路径 Top 3
1. [具体事件链] — 触发概率: X%
2. [具体事件链] — 触发概率: X%
3. [具体事件链] — 触发概率: X%
## 四、隐藏风险
- [估值陷阱/时间成本/杠杆风险/相关性风险/流动性风险]
## 五、综合评分
- 逻辑稳健度: ★★★☆☆ (评估整体逻辑结构)
- 反方说服力: ★★★☆☆ (反方论点的杀伤力)
- 隐藏风险: ★★★☆☆ (风险严重程度)
- 建议:保持 / 减仓观察 / 重新审视
使用原则
- 不替你决策——审查报告是镜子,不是命令
- 必看隐藏风险——"逻辑正确但赚不到钱"比"逻辑错误导致亏损"更隐蔽
- 定期执行——建议每月一次,或重大市场事件后立即执行
核心分析框架:双层验证
第一性原理
持仓跟踪的本质目的不是"验证自己是对是错",而是识别市场定价与客观现实之间的偏差。
可操作的信号 = (新信息 vs 你的Thesis) + (新信息 vs 市场共识)
两层验证
| 层次 | 对比对象 | 回答的问题 | 信息来源 |
|---|---|---|---|
| 第一层:Thesis 验证 | 我的投资逻辑 | "这个信息是否改变了我的判断?" | thesis.md |
| 第二层:预期差验证 | 市场共识预期 | "这个信息是否超出/低于市场已有预期?" | 知识星球券商点评(当日预期) / 浑水研报 / WebSearch 一致性预期 |
预期差判定
对于每条增量信息,不仅标注对 Thesis 的影响,还需判断市场是否已经定价:
| 标注 | 含义 | 场景示例 |
|---|---|---|
[超预期] |
信息好于市场一致预期 | 订单6亿,市场只估了3亿 |
[符合预期] |
信息与市场预期一致 | 业绩在一致预期±5%范围内 |
[低于预期] |
信息差于市场一致预期 | 碳酸锂跌破15万,市场原以为16万是底 |
[未定价] |
市场尚未充分反应 | 新政策刚出台,卖方报告还没跟上 |
[已定价] |
市场早已反应 | 连续下跌后,负面信息已经price-in |
重要:一条信息可能同时是 [+]利好Thesis 但 [已定价],这意味着它对股价已经没有推动力。最值钱的信号是 [+]利好Thesis + [未定价]——这是买入窗口。
如何获取市场共识
- 知识星球(v5.7 主源,当日版本):
a) 券商点评正文——提取目标价、业绩预测、超预期/低于预期措辞,以及市场担心/普遍认为/一致预期是这类直述共识的句子(罕见且珍贵,可直接作为第二层基准)。
b) 讨论热度——判断「已定价 vs 未定价」的可操作代理:同一主题当天被 ≥3 家券商覆盖 =[已定价];仅 1 条提及、无券商跟进 =[未定价](最值钱的窗口)。详见「从星球提取市场预期」。
⚠️ 星球内容只生成假设,必须经 Wind/公告/EDB 交叉验证,验证前标[待验证];与 Wind 实际数据冲突时以 Wind 为准(卖方天然偏乐观)。 - 浑水研报(可选):需完整研报原文或外资视角时,从目标价和一致预期中提取
- WebSearch:搜索
[标的] 一致预期 2026 EPS券商 目标价 [标的] - 近期价格:价格本身隐含了市场当前定价
- 估计修正方向:最近一个月 EPS 估计是上调还是下调?(修正方向比绝对值更重要)
> ⚠️ 旧版 portfolio.json 的 search_config 字段已移除,不要引用它。v5.7 起共识预期主源改为知识星球券商点评(当日版本),辅以 WebSearch「[标的] 一致预期 EPS 目标价」;Wind 侧可用 get_stock_fundamentals 问「一致预期净利润」补充。浑水仅在需完整研报原文时调用。
重要原则
- 围绕 Thesis 分析 — 所有结论必须映射回你的投资逻辑
- 增量思维 — 只关注边际变化,不重复已知信息
- 失效条件优先 — 首先检查 Thesis 的失效条件是否被触发
- 预期差优先于方向 —
[+]利好+[已定价]不如[0]中性+[未定价]有价值 - 不替你做决策 — 提供分析框架,买卖由你决定
- 时效纪律 — 每日摘要只展示最近 7 天增量,老数据放背景区
依赖
- Wind Alice 连接器(第一优先数据源:行情/财务/公告/新闻/事件/股东/宏观/指数/EDB)
- 知识星球连接器 zsxq-cli(推荐:市场预期主源——券商点评/外资研报/专家交流;10 个星球只有 2 个开通权限,见 zsxq_groups 配置。全部不可用则降级 WebSearch + 行业信源)
- IMA MCP 连接(可选:浑水调研知识库,v5.7 起仅用于回溯完整研报原文,日常已被知识星球替代;巨潮公告库已由 cninfo WebFetch 替代)
- Python 3.8+ (
pip install akshare pandas) — 仅脚本兜底需要,Wind 可用时非必需 - 网络连接(脚本三源链 + cninfo + hkexnews + WebSearch)