【元宝搜索开发者征文大赛】用 FastAPI + Vue3 做了个 AI 炒股工具,接了六个分析师和腾讯元宝搜索

我从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 条,每条保留标题、站点、日期、摘要和链接。

真正值得说的是使用纪律,我定了四条:

  1. 一次分析最多搜一次,这里没有采用六个分析师都自己去搜索的方式,如果都自己去搜索这个成本很高,不如一次性搜索,然后拿着数据大家一起使用。
  2. 结果缓存30分钟,为什么要缓存30分钟?A搜索了B也搜索了,这个时候如果不缓存其实就有点浪费搜索次数了。
  3. 只作事件背景,不是财务事实,我们搜索出来的是新闻,新闻不代表100%准确,这个不能直接用到事实上,网页上什么都有,不做限制的话会把一些有问题的东西写入结论。
  4. 失败不阻塞分析,这个其实很重要,虽然现在没有遇到搜索失败的情况,但是要是什么时候次数用完了,或者什么其他情况下,不能因为这一个点就导致了分析功能失效。

那么我们的搜索结果要给谁用呢?四位分析师:新闻舆情分析师拿它当主食,提炼事件和报道倾向;基本面分析师从中找公司动态线索;风险分析师专门扫减持、解禁、处罚这类事件;情绪分析师统计正面负面关键词。报告页有个"公开信息"面板,列出全部来源链接,并标注这些结果被哪些分析师使用过;如果本次没搜索,也会明说"未收录",而不是假装没有。

AI 判断,代码算价

六份报告放在桌上,经常是打架的:技术面 78 分喊乐观,风险分析师 41 分喊高风险,资金面说主力在进、情绪面说已经过热。那我到底要听谁的?

这个时候我们需要使用AI对抗AI,用一次 LLM 调用,让模型扮演圆桌主持人,把六份报告里的分歧整理成最多 6 轮的交叉发言------谁质疑谁、谁补充谁,最后输出一段收敛总结。这一步的成本很低(一次调用),但效果明显:首席拿到的不只是六份孤立的报告,还有一份"哪些是共识、哪些还吵着"的纪要,决策时不会被单个维度带偏。当然这个时候还需要一个能做最终决策的AI,我还定义了一个首席,用做最终的决策。还有这两天是底线:

  1. 评级只能是:买入 / 持有 / 卖出。
  2. 价位由系统代码计算,已在输入 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的真正用途。

相关推荐
2601_966949651 小时前
为什么不应该把 QuantDash API Key 直接写进公开代码仓库?从 Git 提交历史理解凭证泄露风险
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
在世修行1 小时前
智学文枢:文科分析引擎
python·ai·pyside·文科分析
LittroInno1 小时前
边缘AI模组选型:把视频带宽、压缩和推理吞吐分别算清
人工智能·音视频·边缘计算·视频编码·模组选型·视频带宽·tofu6
niucloud-admin1 小时前
NIUCLOUD PHP SAAS上门家政使用文档:机构报表
前端·人工智能
AI小百科1 小时前
Embedding 是什么?为什么它是 AI 的“翻译官“
人工智能·embedding
进击的横打1 小时前
【人工智能】AI 落地:先理流程,再做 Agent
人工智能
虎鲸不是鱼1 小时前
AI 自动化逆向(二十二)换行比峰值法:让 AI 自己发现图像的宽度
人工智能·自动化·大模型·逆向·ai逆向
包小黑1 小时前
Python 转 EXE (实用工具)
开发语言·python
qingyunliushuiyu1 小时前
企业选数据BI AI服务商时,需关注哪些核心能力?
人工智能·经验分享