收盘之后,别急着问 AI 明天涨不涨:我把一套“会核验证据的投委会”做成了 Skill
项目地址https://github.com/AdvancingTitans/stock-analysis下午三点A 股收盘。指数红了账户却没怎么涨新闻里说“市场情绪回暖”自选股中却有一半还趴在水下某个热门概念冲上板块涨幅榜群聊里已经有人开始讨论第二天要不要追而你隐约觉得哪里不对却又说不清究竟是成交不足、资金过于集中还是高位股已经开始松动。屏幕上从来不缺数字。缺的是一种能力把这些数字放回同一个市场语境里判断今天究竟发生了什么它与你的持仓有什么关系以及明天需要观察哪些条件而不是急着给出一个“看多”或者“看空”的答案。这也是我开发stock-analysis的起点。它不是一个预测明天涨跌的水晶球也不是把几个行情接口接到大模型之后让 AI 即兴写一篇股评。它更像一台安静运行在 Agent 背后的市场复盘引擎先寻找证据核对交易日检查字段是否完整判断数据来自哪里然后再把指数、板块、涨跌停结构、市场宽度、风险信号和个人持仓放进统一框架最后才允许投资专家视角进入形成一份有依据、有边界、也能被追溯的复盘报告。截至本文分析时这个技能已覆盖 A 股、港股、美股与基金提供盘前、盘中、盘后复盘、单股与基金速览、持仓分析、证据包、数据源诊断、单专家视角、默认投委会综合和双专家对抗分析。更重要的是这些能力已经摆脱对外部行情分析工具的运行依赖形成了独立的数据适配、缓存、投资记忆、证据评分与报告编排体系。一、市场从来不缺观点真正稀缺的是“观点之前的纪律”今天大模型写一篇市场复盘并不难。把上证指数、成交额、北向资金和几个新闻标题扔进提示词不到一分钟一篇结构完整、语气专业的报告就会出现。它可能会谈风险偏好谈产业趋势谈资金轮动甚至给出仓位建议。问题在于报告写得像研究不等于研究真的发生过。指数数据是不是同一个交易日港股行情是否因为接口延迟而缺了一天成交额为空时模型有没有把空值理解成缩量板块榜抓取失败后报告里所谓的“今日主线”究竟来自真实数据还是来自上一轮缓存新闻是今天的还是历史复盘时混进来的当前新闻当一个字段拿不到时系统究竟会承认不知道还是悄悄用一个看起来合理的数字填上金融分析最危险的错误往往不是结论保守而是输入看起来完整。这类问题也不是某个项目独有。FinSphere 的研究者在讨论股票分析 Agent 时就把“分析深度不足”与“缺少客观报告评价机制”列为当前金融大模型的两类核心问题。实时数据、量化工具和语言模型固然重要但如果没有稳定的数据契约和评估框架模型只是在更流畅地组织不确定信息。因此stock-analysis做的第一件事并不是让Agent在股评时更聪明而是给分析过程加上一套不那么感性、却更加重要的纪律先取数再判断先核验再叙述拿不到的数据就明确写拿不到只有证据足够时才允许生成更深的结论。这句话看起来简单但它决定了这个技能与普通股评工具之间最本质的区别。二、它不是行情查询器而是一台证据驱动的复盘引擎从用户视角看stock-analysis可以很简单。你可以让 Agent 复盘当天 A 股也可以查询某只股票或基金可以要求完整盘后报告也可以在盘中只看关键点可以读取本地持仓也可以指定使用巴菲特、段永平、达利欧或者西蒙斯的框架。但在这条自然语言指令背后技能并不是立刻开始“写”。它先构建一份证据包将市场拆成六个彼此关联、又可以独立检查的模块M1 是大盘指数与市场宽度。它不只看指数涨跌还检查成交额或成交量、A 股与港美股之间的强弱关系、上涨家数与下跌家数是否支持指数表现。指数上涨但市场宽度偏弱与指数下跌但多数个股上涨是完全不同的市场状态。M2 是板块资金与集中度。它观察行业、概念板块排名、资金流向以及涨停主题是否过度集中。市场有十个方向同时活跃与资金全部挤在一个题材里表面上都可能是“指数上涨”但持续性和风险结构完全不同。M3 是赚钱效应与上涨主线。涨停数量、首板与连板结构、龙头梯队、活跃方向都被用来判断市场是否真的存在可扩散的赚钱效应而不是只有少数权重股撑住指数。M4 是下跌风险。跌停数量、炸板数量与炸板率用来观察高位分歧、追涨风险和市场承接能力。它关心的不是“市场跌不跌”而是风险正在以什么方式暴露。M5 是特征分组。早盘涨停、低位异动、成长板块活跃样本、持仓风格等信息被重新分组帮助用户识别当前市场更偏向趋势、成长、低位扩散还是防御与存量博弈。M6 是综合风险与抗跌方向。它将前面的市场结构重新汇总寻找在整体分化中仍能维持相对强度的方向并形成下一交易日的验证清单。在代码层面这六个模块并不是写在提示词中的六个标题。系统会分别构建模块数据记录证据可用状态、来源事件、缺失字段和交易日期再由报告引擎统一生成结果。证据包还会给 M1 至 M6 各自分配基础权重将质量分、缺失模块和模块诊断写入元数据。这意味着报告不是分析流程的唯一产物。正文负责让人阅读证据包负责让人检查。当用户启用证据输出后系统会保留记录证据情况的JSON文件以及 M1 到 M6 的独立模块文件。你可以看到某个结论依赖了哪些指数、哪些板块数据、哪些来源发生过降级以及为什么某个模块被标记为“证据暂缺”。很多 AI 工具努力让用户看不见复杂性。stock-analysis的选择恰好相反正文可以干净但复杂性必须被保存。因为真正可信的自动化不是永远不出错而是出错之后仍能知道错在哪里。三、在国内市场数据源稳定本身就是一种产品能力做过 A 股数据的人大多经历过类似时刻。某个接口昨天还能用今天突然返回空响应同一个代码在不同市场需要不同前缀腾讯和新浪的文本编码出现生僻字时解析异常东财某个端点在部分网络环境下直接断开板块榜抓取失败却因为缓存策略不严谨把空结果保存下来导致后续几次报告都像市场当天没有任何行业数据。因此stock-analysis没有把“支持多个数据源”当成装饰性的功能描述而是把数据源路由写成了一套明确的优先级。A 股基础报价优先走腾讯再走新浪东财更多承担独有数据或末级回退。港股由腾讯和新浪互补美股由新浪与腾讯互补当东财作为港美股 fallback 时系统会通过搜索接口动态解析 secid避免只依赖有限的静态代码映射。基金则使用天天基金与东财公开数据必要时回退新浪基金。对于最容易出问题的板块榜系统采用更谨慎的路线东财clist获取失败后尝试同花顺公开板块页面公开 HTTP 仍不可用时再进入 Camofox、Hermes内置浏览器或 Playwright 等浏览器接管链路。只有拿到非空数据时才允许写入缓存避免一次空响应污染之后的报告。它甚至明确约束了东财请求方式复用 Session、关闭环境代理、串行请求、保持最小间隔、加入随机抖动并进行指数退避。空响应和 HTTP 000 被视为失败而不是被转换成零。这类工程细节很少出现在宣传海报上却决定了产品是否能被长期使用。一个行情工具最令人沮丧的并不是偶尔拿不到数据而是拿不到数据时依然表现得像什么都知道。stock-analysis在字段为空时保留None在报告中留下空单元格价格小于等于零时过滤异常值指数涨跌额与涨跌幅同时为空或异常时切换来源仍然失败就不展示该行并把原因放进证据。它不追求“任何时候都给满一页内容”。它追求的是只要出现在报告里的数字就应该尽量能够被解释。四、为什么默认不是一个专家而是一间投委会股票分析工具很容易陷入另一种表面繁荣不断增加专家角色。一个巴菲特 Agent一个芒格 Agent一个达利欧 Agent再加几个技术分析与风险管理 Agent。角色越多界面越热闹输出也越长。但如果每个 Agent 都基于不同数据、不同口径或者不同上下文自由发挥多专家并不会自动带来更好的判断只会产生更多难以核验的观点。stock-analysis对专家机制的处理更加克制。它内置 15 个结构化投资专家角色包括巴菲特、芒格、格雷厄姆、卡拉曼、彼得·林奇、欧奈尔、伍德、达利欧、索罗斯、利弗莫尔、米勒维尼、西蒙斯、段永平、张坤与冯柳。每个专家不是一段“请模仿某某语气”的提示词而是包含证据权重调整、重点分析模块、风险关注点与委员会角色的结构化定义。默认投资委员会由巴菲特、芒格、段永平、张坤、格雷厄姆和达利欧构成。这些视角不会分别写六篇报告再机械地拼到一起。由投资委员会形成的专家引擎会在同一份证据包上计算综合权重判断哪些模块已经激活并对 M1 与 M6 进行额外综合分析。在 M1 中它检查多个市场指数是否一致上行、一致下行还是明显分化检查指数表现与市场宽度是否矛盾识别交易日不一致、权重股支撑或拖累等异常。在 M6 中它汇总各专家的风险关注点调和框架冲突并根据炸板率、跌停数量与市场分化形成综合风险评分。这里最关键的设计是专家只能改变看问题的顺序不能改变事实本身。巴菲特框架会更重视商业质量、安全边际与永久性本金损失芒格框架强调反向推演、激励错配和不做清单达利欧会更关心宏观周期、流动性、相关性与组合平衡欧奈尔关注盈利加速、行业龙头与量价确认西蒙斯则强调数据口径、样本稳定性、拥挤度和交易成本。但无论选择哪一种视角结论都必须回到相同的指数、成交、板块、风险与持仓证据。这让“专家模式”不再是一种角色扮演而成为一种可切换的研究框架。用户也可以使用 single 模式让整篇报告按照某一个专家的证据优先级重新组织或者使用 adversarial 模式让两个专家从不同角度审视同一份材料。单专家报告不会只在结尾追加一段“巴菲特点评”而是连章节结构、证据顺序、风险表达和观察清单都会发生变化。报告同时禁止虚构专家发言或声明自己就是某位投资者。这是一条看似细小、实际上非常重要的边界借鉴方法不消费人格使用框架不伪造权威。五、真正有用的复盘最终一定要回到“我的持仓”一篇市场报告可以写得很精彩但对于投资者来说真正重要的问题通常只有几个为什么指数涨了我的账户却没涨今天的下跌是市场系统性风险还是我的持仓集中在错误方向某只股票虽然上涨但是否依然跑输对应基准我持有两只基金看起来名称不同底层重仓股是不是高度重复我的组合究竟是在承担成长风格风险、单一市场风险还是单一行业风险因此stock-analysis不把持仓分析当成报告末尾的一张附加表而是将它并入整个复盘语境。用户可以通过结构化输入提供股票与基金持仓完整信息会保存进技能自己的本地投资记忆。之后的复盘可以自动读取该记忆同时计算当前市值、累计浮盈亏、当日盈亏、不同币种的人民币折算、前三大持仓占比、单一市场最高暴露、持仓风格以及相对基准表现。基金持仓还会继续展开重仓股用于观察重复暴露。这里依然保持着严格的输入纪律。代码、买入日期、数量或可推导数量的买入金额必须完整才会进入收益计算。用户新提供的信息不完整时系统不会擅自覆盖旧投资记忆也不会因为本地碰巧存在一份残缺 profile就在普通市场复盘中生成似是而非的持仓结论。一份完整的持仓复盘最终不只告诉你“赚了多少钱”。它还会把持仓放回市场结构中对应板块是否属于当日主线个股相对基准是跑赢还是跑输组合是否过度集中新闻中是否出现高信号事件以及下一交易日什么条件出现时才应该提高暴露、降低风险或继续等待。这也是它与传统持仓记账工具的区别。记账工具回答过去发生了什么stock-analysis试图回答这些变化在当前市场中意味着什么。六、它最适合的不是一次性的问答而是重复发生的投资工作流这个技能的价值只有放进真实场景里才会变得清晰。场景一每天收盘后的固定复盘对于个人投资者最大的困难往往不是看不懂某个指标而是无法长期坚持同一套复盘标准。今天关注指数明天关注新闻后天又因为某只股票大跌而只盯持仓。时间久了每一天的判断都建立在不同信息上很难回看自己当时为什么做出某个决策。stock-analysis用固定 M1–M6 结构解决的是“复盘口径漂移”。市场每天在变问题顺序却相对稳定指数如何市场宽度如何资金去了哪里赚钱效应是否扩散风险在哪里积累哪些特征更强什么方向相对抗跌。长期下来真正沉淀的不是一堆日报而是一套可以比较的市场观察记录。场景二盘中快速判断而不是强行生成完整研报上午十点半用户往往不需要五千字市场分析。此时最重要的是指数和市场宽度是否一致、板块主线有没有形成、赚钱效应是否扩散、炸板率是否上升以及持仓是否明显偏离市场。stock-analysis会根据北京时间识别盘前、盘中、午间和盘后自动选择 summary、key-points 或 full 深度。盘前和盘中输出的是简报结构盘后才进入完整复盘。历史日期则按盘后逻辑处理避免把过去某天的报告写成盘中快照。这种“时段感”非常重要。一个工具不是输出越长越专业而是应该知道在什么时候用户真正需要什么。场景三先查事实再决定是否值得深挖用户问“贵州茅台今天怎么样”未必是在请求一篇价值投资报告。因此单股与基金入口默认是确定性的不默认使用大模型。单股速览先返回价格、涨跌、开高低、成交量、成交额、交易日和数据质量提示基金速览返回估值或净值、长期业绩、费率、规模、基金经理公开画像以及主要重仓股报价。只有当用户继续要求“深度分析”“用段永平视角分析”或者“结合持仓复盘”时才升级到完整证据包与专家分析报告。这个设计避免了一个常见问题用户只是问一个数字系统却先消耗大量模型调用最后生成一篇用户根本不需要的长文。场景四为内容创作者和研究者提供可复用材料每天写市场复盘的人最耗时间的部分并不总是写作而是整理表格、确认交易日、检查指数、计算涨跌停结构、找板块主线再把所有内容转成可发布格式。stock-analysis输出标准 Markdown同时将证据保存为 JSON。正文可以进入微信公众号、知识库或 Obsidian证据包则留作后续核查、二次加工和自动化分析。它不是替内容创作者写一段不可追溯的“今日市场点评”而是在尝试把每天重复的资料整理过程产品化。场景五作为 Agent 系统中的金融分析能力组件它不内置聊天外壳不负责发送消息也不执行真实交易。这反而使它更容易作为 Skill 嵌入 Hermes、Codex、OpenClaw 或其他 Agent 环境上层 Agent 负责理解用户意图、补充持仓信息和组织交互stock-analysis负责行情路由、证据包、质量评分与报告输出。职责越清晰系统越容易扩展。七、与 TradingAgents、FinRobot、AI Hedge Fund、OpenBB 相比它站在什么位置把stock-analysis放到现有开源项目中看它并不是要替代所有金融行情分析工具而是有自己独特的角色定位。TradingAgents 模拟的是一家真实交易机构的角色结构基本面分析师、情绪分析师、新闻分析师、技术分析师、看多与看空研究员、交易员、风险管理团队和投资组合经理共同讨论最后形成交易决策。它强调多 Agent 协作、动态辩论与交易机构工作流并依赖语言模型与相应数据服务。FinRobot 的目标更接近完整金融 AI 平台。它覆盖数据获取、财务预测、DCF 估值、可比公司分析、多 Agent 研究和专业 HTML/PDF 研报生成适合公司级深度研究与金融应用开发。AI Hedge Fund 更像一个开放式实验场不同投资大师 Agent、估值 Agent、情绪 Agent、技术 Agent、风险经理与组合经理共同生成信号并提供回测与未来持续运行的基金化设想。项目本身也明确定位为教育和研究用途。OpenBB 则位于更底层的数据基础设施位置。它强调“连接一次多处消费”把公共、授权和私有数据接入 Python、工作台、Excel、MCP 与 REST API为量化研究、分析界面和 AI Agent 提供统一数据层。与这些项目相比stock-analysis的定位更窄却也更贴近一个高频、具体的问题如何每天稳定地完成一次国内投资者真正能用的市场与持仓复盘。它不试图成为金融数据操作系统不模拟完整交易公司不建立自动交易基金也不生成几十页公司估值报告。它把主要精力集中在几个更小、但更难做好的环节国内市场公开数据的稳定路由盘前、盘中、盘后的报告节奏A 股涨跌停生态与板块结构A、H、美股及基金的统一代码与持仓处理证据包和质量降级在相同证据基础上的多投资框架综合。换句话说TradingAgents 更像一间模拟交易公司FinRobot 更像自动化投研平台OpenBB 更像金融数据基础设施而stock-analysis更像放在投资者桌面上的复盘工作台。它不追求把每一件事都做完而是把“收盘后应该怎样重新理解今天”这件事做深。八、为什么要把它做成 Skill而不是另一个独立 App独立 App 往往要求用户适应产品。Skill 则可以进入用户已经存在的工作流。你可以在对话中说“复盘今天 A 股结合我的持仓。”也可以说“只看盘中风险不需要完整报告。”还可以说“用达利欧视角重新看我的组合暴露。”或者“先查询这只基金的长期业绩和重仓再决定要不要深度分析。”Agent 负责把这些自然语言归一化为命令行参数底层仍走同一条报告路径。这意味着用户不需要记住所有命令也不需要理解数据源 fallback、证据评分和报告渲染器。与此同时它仍然保留行情分析的确定性。对开发者来说可以自动运行、测试、诊断与集成对普通用户来说只需要表达需求。这种“自然语言入口加确定性内核”的组合可能比单纯做一个聊天机器人更接近金融 Agent 的实际形态。大模型擅长理解意图和组织语言程序擅长执行规则和保持数据口径真正可靠的金融 Skill不应该要求其中任何一方独自承担全部工作。九、它仍然有边界而边界恰恰是可信度的一部分stock-analysis并不承诺预测收益也不会发送真实交易指令。公开行情源仍可能受到网络、限流、页面变化和交易日差异影响浏览器 fallback 依赖运行环境法定休市日表需要跨年度维护部分龙虎榜、两融、解禁、大宗交易和研报端点仍属于可扩展能力不会全部进入默认日报。它的质量评分也不等于“这份报告有 80% 正确”。当前评分更多是在衡量模块是否可用、关键字段是否完整、市场宽度与板块数据是否取得。尤其 M3 至 M6 的评分仍主要依据模块可用性未来还可以进一步引入字段级置信度、跨源一致性、时效衰减和历史复盘误差。但我更愿意保留这些边界而不是把它包装成一个“全自动 AI 投资顾问”。因为金融工具最重要的能力之一就是知道什么时候应该停止推断。拿不到市场宽度就不假装指数代表全部股票没有完整持仓就不计算伪精确收益社区样本不足就不输出多空比例历史复盘就不混入今天的新闻数据源全部失败就明确告诉用户数据不可用。承认不知道并不会削弱 AI 的价值。在投资中很多时候它恰恰比自信地给出错误答案更有价值。十、写在最后好的复盘不是替你做决定而是让你知道自己为什么做决定夜深之后市场会逐渐安静。涨停截图不再刷新群聊里的情绪也会慢慢消退。你重新打开当天的报告看到指数、成交、市场宽度、板块集中度、赚钱效应、炸板风险和自己的持仓被放在同一张地图上。有些结论可能仍然不确定。你依旧不知道明天一定会涨还是会跌也无法从一份报告里获得绝对答案。但你开始知道今天的上涨究竟来自广泛修复还是少数权重股知道账户跑输是因为组合风格不匹配还是个股自身走弱知道某个热门方向需要什么条件才能继续确认也知道哪些风险一旦出现就应该停止给自己的持仓寻找理由。这或许才是 AI 在投资复盘中最现实的价值。不是替人预测未来而是帮助人们以更稳定的方式观察现在不是制造更多观点而是让观点回到证据不是把投资变得简单而是把复杂性整理得可以理解。stock-analysis想做的就是这样一件并不喧闹的事在每天收盘之后把散落在行情、板块、新闻、基金与持仓里的信息重新收拢让不同投资框架在同一份证据上提出问题最后留下一份能够阅读、能够检查也值得在第二天重新打开的市场记录。它不是一位永远正确的投资大师。它更像一个不会因为市场情绪而改变复盘纪律的研究搭档。