观潮诞生记:两个半小时的 AI 炒股引擎,不止「观望」

观潮诞生记:两个半小时的 AI 炒股引擎,不止「观望」

朋友发来一个链接:"看看我最近搞的东西。"

打开一看——Tickick,一个 AI 多模型股票分析工具。暗色主题,卡片化布局,DeepSeek / Qwen / Kimi 三个模型并行出信号,量价分层展示。做得挺有想法的。

我拿威海广泰(002111)跑了一下。三个模型,6 轮分析,结论都一样:

观望。

技术面看,确实是中性。但"观望"告诉了我什么?我今天早上也知道"观望",问题是——观望的同时,主力资金在流出吗?大盘处于什么阶段?如果明天放量突破我该怎么办?

Tickick 回答不了这些。不是因为它做得不好——相反,多模型共识的思路很棒——而是它只看了技术面一个维度。

我关上页面,跟我的 AI 搭档说:"我们自己搞一个更猛的。"

不做仪表盘,做投研搭档

在动手之前,我先想清楚了三个问题。

第一,别人的 AI 炒股工具在做什么? 基本都是:拿到 K 线数据 → 扔给 LLM → 输出买/卖/观望。本质上是"给 ChatGPT 喂数据让它说一段话"。

第二,为什么结果总是"观望"? 因为只看技术面,多空信号经常对冲归零。MA5 涨了加分,MACD 绿柱扣分,最后约等于零——"中性观望"。就像你同时问了三个医生,一个说没事一个说有事一个说再看看,你能得到什么结论?

第三,散户真正需要什么? 不是一堆指标表格,而是——

"威海广泰技术面偏多,但主力资金在流出,可能是诱多。等回调到 MA5 再介入。"

一段像分析师聊天一样的话,有立场、有理由、有矛盾提示、有操作建议。

基于这些思考,我确定了观潮的三个核心差异化:

MCP-Native 架构

别人做 Web App,我做 MCP Server。什么意思?装好之后,我在 Cursor 或 Claude 里直接说"帮我分析茅台",引擎自动调用,30 秒出完整报告。不需要开浏览器,不需要登录,不需要等 loading 转圈。

而且 MCP 是协议,引擎是引擎——以后要加 Web UI 就套一层皮,要接微信推送就加一个 channel。引擎只写一次。

市场体制感知

这是 Tickick 缺的最关键一环。同一个技术形态在不同市场环境下含义完全不同。

牛市里的回调是买入机会,熊市里的反弹可能是诱多陷阱。横盘市里看什么都是"观望"——不是因为分析不准,而是市场本来就没方向。

观潮会先判断大盘处于 6 种体制中的哪一种(🐂牛市 / 🐻熊市 / 🦀横盘 / 🌊高波动 / 📈震荡偏强 / 📉震荡偏弱),然后调整个股信号的解读。横盘市里评分 +5,体制调整后还是 +5,给"观望";牛市里同样的 +5,调整后可能变成 +15,给"偏多"。

冲突检测

这是我最得意的设计。

技术面看多但主力资金在流出?→ ⚠️ 可能是诱多,等资金回流确认再进场。

个股强势但大盘偏弱?→ 📉 逆势走强需关注持续性,轻仓试探。

放量下跌?→ 🚨 主力出逃信号,别抄底。

缩量上涨?→ 📊 上行动能不足,可能是假突破。

矛盾信号才是真正有价值的洞察。"看多"谁都能说,"看多但小心——主力在出货"这种话才值钱。

两个半小时开发实录

晚上 9 点开始动手。

技术选型(5 分钟)

  • MCP 框架:FastMCP(Python),和我 Master-Translator 项目同款,驾轻就熟
  • 数据源:AKShare(开源 Python 库),免费、零认证、覆盖 A 股行情/基本面/资金流/龙虎榜/北向资金/新闻
  • 技术指标:全手写(MA/RSI/MACD/KDJ/BOLL/ATR/OBV),不依赖 ta-lib 的 C 库

架构设计(10 分钟)

src/tidewatch/
├── server.py      ← MCP 入口,7 个工具定义
├── data.py        ← AKShare 数据获取层
├── technical.py   ← 技术分析引擎
├── regime.py      ← 市场体制识别
└── narrative.py   ← 叙事式报告生成

职责清晰,每个模块做且只做一件事。

核心实现(90 分钟)

最费时间的是技术分析引擎(453 行)。8 个评分维度,每个都要仔细调权重:

维度权重范围评什么
均线系统±25多头/空头排列,MA5 斜率
均线位置±16价格相对 MA5/MA20 的偏离
RSI±13超买超卖 + 方向
MACD±19红绿柱 + 金叉/死叉
KDJ±5J 值极端位
量能±15OBV 斜率 + 量比方向
布林带±8价格在通道中的位置
K线形态±12锤子线、射击之星、三连阳等

第一版把阈值设成了 ±30 才给信号,结果……和 Tickick 一样,永远"观望"。降到 ±8 才有了"偏多/偏空"的立场,±25 给"看多/看空"。

教训:评分体系调参比写指标更重要。

首秀测试(30 分钟)

配置到 VS Code MCP → 重启 → 输入"帮我分析 002111"——

第一次卡住了。VS Code 注入了代理环境变量,AKShare 的请求全部超时。加了 NO_PROXY=* 解决。

第二次出了 outputSchema validation error。FastMCP 2.x 会从 dict[str, Any] 类型注解自动生成 schema,但实际返回的嵌套结构通不过校验。删掉返回类型注解解决。

第三次——跑通了。

两轮 Code Review

开发完让搭档做了两轮 Review(7.5 → 8.5 分),修了这些:

问题修复
包结构 src/ 太扁平→ src/tidewatch/,import tidewatch.xxx
未用的 ta 库依赖删除
全市场数据每次都拉加 30s 缓存 + 60s 失败冷却
没有叙事式报告新增 narrative.py
资金单位混乱元→万/亿智能转换

实战效果

威海广泰 002111(同一只票对比)

Tickick 的结果:观望。强度 45-60。6 轮全部观望。

观潮的结果:

002111 当前 10.86,近 5 日小幅涨了 3.1%,处于 20 日区间的 48% 位置。

多空在博弈——利多方面有 MA5 上行(+1.4%)、站上 MA5(+0.6%)、OBV 上升(资金流入);但要注意 MACD 绿柱放大。综合评分 +12,多头占优。

大盘震荡偏强(可轻仓参与强势个股)。主力资金净流出 205 万,和技术面方向矛盾。

⚠️ 技术面偏多但主力资金在流出,可能是诱多。

整体偏积极,但信号还不够强,建议轻仓试探或等回调到 MA5(10.79) 再介入。

区别在哪?

  1. 不再是无差别的"观望",给出了"偏多"的立场(评分 +17)
  2. 识别出了冲突:技术面向上但主力在出货
  3. 给了具体操作建议:等回调到 10.79 再介入
  4. 加入了大盘体制判断:当前震荡偏强

贵州茅台 600519

观潮给出了看空(评分 -36,强空头):

RSI 19.3 极度超卖,近 20 日位置仅 9.1%,MACD 绿柱 -21.5 深度空头。主力资金净流出 2.67 亿,与技术面共振向下。

下方支撑看布林下轨 1359.97。

同时抓到消息面:茅台在持续回购(累计 8.01 亿),但短期技术面和资金面都指向下行。即使有回购护盘,观潮也说了真话——别接飞刀。

克制的艺术

做完 Phase 1 之后,搭档写了一份终极畅想:早上推送持仓预警、盘中实时监控、产业链联动分析、多端推送(微信/Telegram/Siri)、回测引擎、Web Dashboard……

听起来超酷。但我说了一句:

先把引擎做到你自己每天真的用再说触达。

畅想我的判断
多端推送先让自己每天用 → 后面做
全市场每 5 分钟扫描太重,先做自选股监控
回测引擎先积累真实信号数据
Web DashboardMCP 里看更快

Phase 2 只做三件事:

  1. 信号追踪表(SQLite)—— 每次出信号自动记录,追踪胜率。这是时间的朋友,越积累越值钱
  2. 行为护栏 v1 —— 追高检测、集中度预警、连续亏损检测。最好的交易系统不是告诉你买什么,而是阻止你犯蠢
  3. scan_market —— 全市场扫描 Top/Bottom 10 强弱股

最后

1618 行代码,5 个模块,7 个 MCP 工具。从看到朋友的作品到自己的引擎跑通,两个半小时。

这不是对朋友项目的否定——Tickick 的多模型共识思路很好,UI 也做得专业。只是看完之后我想:"如果在技术面的基础上,再加上资金面、市场体制、冲突检测呢?如果不只是给信号,而是像一个分析师跟你聊天呢?"

观潮就是这个想法的产物。

开源在 GitHub: Polly2014/TideWatch。如果你也玩 A 股,装个 MCP Server 试试——在 Claude 里说一句"帮我分析 600519",体验一下被 AI 怼"别接飞刀"的感觉。

Comments