我从22年就开始炒股了,但是到现在其实也还是新手,基本上都算是瞎买,对于那些各个平台的博主我觉得都不是很靠谱,所以一直也没什么长进。去年就接触过AI股票分析的项目,用过一段时间觉的不是很好用,很多虽然说接入了AI,但是实时的数据不够,有时候AI不知道现在是什么时候,所以对股票的判断很不准确。股票其实也一直在亏损的,就想着不如自己做一个AI股票分析的工具,AI分析工具不是让AI预测股价,而是"如何让 AI 的输出可取证、可复核、可回看"。AI并不是给我们推荐股票,而是协助我们分析股票,国内的股票走势市场情绪其实占了一部分的,有AI分析,我们可以减少一些工作量。工具只是工具不做股票预测,交易类的,我们只做研究。
项目仓库地址:GitHub 仓库

数据从什么地方来
做AI分析最先要解决的不是模型问题,模型好选择,最先要解决的是数据问题,数据来源、数据的实时性和可靠性。没有正确的数据,我们定义的6个分析师就是6个编故事的人。我这里的数据现阶段都是免费的接口,暂时没有付费源,也还算够用。
| 数据 | 来源 | 说明 |
|---|---|---|
| 实时报价 | 腾讯 → 新浪 → 东财 | 三家按顺序降级 |
| K 线 | 东财 → 腾讯 → 新浪 | 支持日/周/月,前复权/后复权 |
| 财务指标 | 东财 F10 | 最近 6 期财报,缓存 12 小时 |
| 资金流 | 东财(新浪兜底) | 近 30 日主力/超大单/大单流向,缓存 5 分钟 |
| 情绪 | 自己算 | ARBR、换手率、RSI、量比,加上主要指数涨跌 |
能拿到正确的数据,做这个事情才有意义,如果在某些情况下数据缺失了,分析报告里面也会明确的指出来,不会让模型编造,这样我们自己心里也是有底的。
六个分析师分工
一开始我是没有用这种分工的方式的,觉得只要把数据给到AI了,就能合理的分析出有用的数据,但是发现一次性给太多数据,AI反而做的更不理想,甚至出现环境的概率更多了。后来拆成了六个角色:技术面、基本面、资金面、风险、市场情绪、新闻舆情。每个角色只看自己维度的数据,独立出一份报告。
| 分析师 | 看什么 | 评级 |
|---|---|---|
| 技术面 | 均线、MACD、RSI、BOLL、ATR、量比、近期 K 线 | 乐观 / 中性 / 谨慎 |
| 基本面 | 营收净利增速、ROE、毛利率、负债率、估值 | 乐观 / 中性 / 谨慎 |
| 资金面 | 近 10 日主力、超大单、大单净流入及占比 | 乐观 / 中性 / 谨慎 |
| 风险 | 波动率、回撤、超买超卖、事件线索 | 低 / 中等 / 高风险 |
| 情绪 | AR/BR、换手率、量比、指数表现 | 乐观 / 中性 / 谨慎 |
| 新闻 | 元宝搜到的公开网页 | 乐观 / 中性 / 谨慎 |
每一位分析师输出的都是结构化的JSON数据,这样也更方便我们整合数据,先让代码写初稿,再让模型改,每一位分析师都有一份纯代码生成的规则稿,基本面分析师按增速、ROE、负债率逐项加减分,资金面看主力净流入是否连续、价格和资金是否背离,风险分析师从 70 分起步、按 ATR 和回撤扣分。规则稿和该维度的原始数据一起交给模型。
prompt 里的规矩大概是这样(部分):
python
SYSTEM_TEMPLATE = """你是智盈 AI 的{role}。
职责:{duty}
规则:
1. 只使用输入 JSON 中的数据,不得编造财务、资金、新闻或价位;数据缺失时在 risks 中注明。
2. 结论要具体到数字或条件,避免「可能」「或许」这类空转表述。
3. 公开网页信息只作事件背景,必须核对发布日期,不能当作确定事实。
4. 不承诺收益,不写交易指令。
5. 输入中的 rule_draft 是代码基于同一批数据生成的初稿,可参考、可修正,但不得无视数据。
6. 只输出一个 JSON 对象,不要 Markdown 或解释文字。"""
这一步做完了,我们手上就有对应的数据了,当然因为是单独分析的,这里面肯定会有一些有冲突的地方,这就要用到我们后面的讨论和决策了。
为什么要接元宝搜索
前面说的行情、财务、资金流都是结构化数据,拿接口就能取。但是这个股票最近出了什么事情,有什么新闻或者公告,这些就不是数据能体现的,没有这些东西模型就容易产生环境,然后就开始胡编乱造,这样分析的数据也是不准确的。而且有部分模型还会搞错当前的时间节点,因为模型的知识有时间节点,导致分析的东西完全没有可用性。

所以我这里就接入了腾讯的元宝搜索,有了真实数据,AI就不会拿训练的时候的旧新闻来糊弄我们。接入是使用腾讯云官方 API 用 TC3-HMAC-SHA256 签名,把 SecretId/SecretKey 填进环境变量就行,现在其实接入很简单,基本上把文档给AI,AI就知道怎么接入了。查询词可以直接使用代码拼(也可以根据自己的想法替换):
python
def build_query(quote: Quote) -> str:
return f"{quote.name} {quote.symbol} 最新公告 业绩 题材 风险 减持 解禁"
请求带 Cnt=20、Mode=0(公开网页)、Industry=finance,官方模式再加 3 个月时效。返回的网页按 URL 去重,取前 8 条,每条保留标题、站点、日期、摘要和链接。
真正值得说的是使用纪律,我定了四条:
- 一次分析最多搜一次,这里没有采用六个分析师都自己去搜索的方式,如果都自己去搜索这个成本很高,不如一次性搜索,然后拿着数据大家一起使用。
- 结果缓存30分钟,为什么要缓存30分钟?A搜索了B也搜索了,这个时候如果不缓存其实就有点浪费搜索次数了。
- 只作事件背景,不是财务事实,我们搜索出来的是新闻,新闻不代表100%准确,这个不能直接用到事实上,网页上什么都有,不做限制的话会把一些有问题的东西写入结论。
- 失败不阻塞分析,这个其实很重要,虽然现在没有遇到搜索失败的情况,但是要是什么时候次数用完了,或者什么其他情况下,不能因为这一个点就导致了分析功能失效。
那么我们的搜索结果要给谁用呢?四位分析师:新闻舆情分析师拿它当主食,提炼事件和报道倾向;基本面分析师从中找公司动态线索;风险分析师专门扫减持、解禁、处罚这类事件;情绪分析师统计正面负面关键词。报告页有个"公开信息"面板,列出全部来源链接,并标注这些结果被哪些分析师使用过;如果本次没搜索,也会明说"未收录",而不是假装没有。
AI 判断,代码算价
六份报告放在桌上,经常是打架的:技术面 78 分喊乐观,风险分析师 41 分喊高风险,资金面说主力在进、情绪面说已经过热。那我到底要听谁的?
这个时候我们需要使用AI对抗AI,用一次 LLM 调用,让模型扮演圆桌主持人,把六份报告里的分歧整理成最多 6 轮的交叉发言------谁质疑谁、谁补充谁,最后输出一段收敛总结。这一步的成本很低(一次调用),但效果明显:首席拿到的不只是六份孤立的报告,还有一份"哪些是共识、哪些还吵着"的纪要,决策时不会被单个维度带偏。当然这个时候还需要一个能做最终决策的AI,我还定义了一个首席,用做最终的决策。还有这两天是底线:
- 评级只能是:买入 / 持有 / 卖出。
- 价位由系统代码计算,已在输入 levels 中给出;不要自行计算或修改价位。
价格是整个系统里最不能出错的一个数字,而大模型恰恰不擅长精确算术------它算个止损价可能带出小数点错位,还会编一个"看起来合理"的支撑位。所以三档价位全部由代码计算:
python
entry = round(price * 0.98, 2) # 入场:现价回踩 2%
take_profit = round(price * 1.08, 2) # 止盈:现价上方 8%
raw_stop = price - 2.5 * atr14 # 止损:2.5 倍 ATR
stop_loss = round(max(price * 0.92, min(price * 0.95, raw_stop)), 2)
怎么选股呢?
选股和单股分析是两码事。单股分析是把一只股票的资料研究透,选股是面对全市场五千多只股票做筛选。A股市场总的有五千多支股票,不可能把五千多支股都塞进池子里。所以选股是两段式的,规则先圈候选池,AI 在池子里做取舍。
| 策略 | 规则怎么圈 |
|---|---|
| 主力追踪 | 按今日/3/5/10 日主力净流入排行,过滤 ST、创业板/科创板/北交所、市值区间、涨幅上限,取前 100 |
| 低价寻宝 | 股价低于设定上限 + 净利润同比高增长 |
| 小盘精选 | 总市值低于设定上限 + 营收净利双增 |
| 业绩高增 | 净利润同比达到设定下限 |
| 价值洼地 | 低 PE/PB + 近 12 个月股息率 + 最新报告期低负债,用东财 datacenter 的估值、分红、财务三张表拼出来 |
输出是结构化 JSON,prompt 里带两条纪律:
txt
- 推荐数量最多 5 只,按投资价值从高到低排序;
若候选数据不足以支撑,可少于 5 只,不得凑数;
- symbol 必须来自候选股票数据,不得编造;
"可以少选,不得凑数"这条是我特意写的。早期版本模型为了凑满 5 只,会从候选里硬挑明显不符合标准的,或者把理由写得云山雾罩。明确允许它少选之后,结果反而稳定了------市场不好的时候,出 2 只就是 2 只。
踩过的坑和边界
最后说说这个项目里真正费头发的东西,以及它做不了什么。
推理模型是个甜蜜的陷阱。 换推理模型之后,报告质量看着不错,直到日志里频繁出现 finish_reason=length------模型的思考过程也计 completion token,还没开始写正文就把 max_tokens 耗光了。做分析还是不开推理模式的好。
模型的输出永远不能直接信。 三类问题都遇到过:JSON 外面套着 Markdown 代码块、评级写"看多""增持"这种约定外的近义词、讨论里的发言人名字对不上花名册。对策是三道处理:JSON 先提取修复再进 Pydantic 校验,评级做别名归一、不认识就按分数推导,发言人对不上就丢弃。原则就一条------模型输出当原料,不当成品。
然后是边界,这部分比坑更重要。
数据同样有边界,免费接口有延迟,stale 数据会标出来;财报是最新的报告期,不是最新的经营情况;搜索出来的网页也有可能是过时的内容,所以才要求标注日期、对数据只作背景用途。
这个工具只是分析工具,不是做预测的。六位分析师加首席给的是"基于这批数据的研究结论",置信度、数据缺口、风险提示这些,但是它不知道明天有没有利好的消息,能给我们的只有根据当前数据分析出来的结论,给我们用作参考。同一个 prompt 跑两遍,可能会有不一样的结果,这就是模型的本质,我们要善于使用工具,而不是被工具支配。
工具署到服务器后,或者可以部署到NAS,每天都会定时选股、盯价格和发报告(可以配置邮箱),有时候发送的结论虽然没什么用,但是给的结论肯定不会是胡编乱造的,我觉得这才是一个AI的真正用途。