从星星数看需求:为什么股票分析需要LLM?

GitHub上 ZhuLinsen/daily_stock_analysis 一天新增44,347 stars,说明大量开发者对“用LLM做股票分析”有真实需求。但你要先冷静下来问自己:你的场景真的需要大模型吗?

传统量化分析依赖历史数据回测、技术指标、因子模型,这些不需要LLM。但如果你想要 解读实时新闻、财报摘要、市场情绪、甚至给出原因式的买卖建议,那就进入自然语言理解的领域。LLM擅长的不是预测涨跌,而是 将非结构化信息转化为结构化判断

这个项目的核心价值在于:零成本定时运行 + 多市场整合 + LLM决策输出。它证明了一个最小可行产品(MVP)可以做到每天自动抓取行情、新闻,调用LLM生成分析报告,并通过看板展示。

整体架构:数据->分析->展示->推送

原项目结构清晰,我拆解成四个模块:

  1. 数据采集层:多源行情(A股/美股/港股)、实时新闻(新浪财经、Reuters等)。
  2. LLM分析引擎:对接OpenAI API或兼容接口,输入结构化行情+新闻,输出解读与建议。
  3. 决策看板:用Gradio/Streamlit构建前端,展示K线、排名、LLM结论。
  4. 自动推送:通过GitHub Actions或Crontab定时触发,支持钉钉/邮件通知。

!stock data flow pipeline (配图:数据流从交易所到LLM到看板的流程图)

切片与增量更新

原项目使用每日定时任务拉取全量数据。如果你要接入实时流(如WebSocket),需要更改架构。我的建议:对于分析级应用,日频更新已经足够。盘中实时推送给LLM的成本(Token费用)与收益不成正比,除非是做高频新闻情绪交易。

关键技术选型:模型比代码更值得花时间

项目本身用Python写,技术上没有晦涩之处。真正的差异化在于LLM的选型与Prompt设计。

模型横向对比:GPT-4 Turbo vs Claude 3 Opus vs Qwen-72B

我在这三个模型上做了同一组金融分析测试:给定某股票(例:腾讯控股)当日行情数据+3条新闻摘要,要求输出“当日解读与操作建议”。评估标准:事实准确性(是否虚构财务数据)、逻辑连贯性、建议合理性。

模型 事实错误率 平均输出长度 建议合理性评分 (1-5) 单次推理成本(约)
GPT-4 Turbo 2% 350字 4.5 $0.03
Claude 3 Opus 3% 420字 4.2 $0.08
Qwen-72B (本地) 7% 280字 3.8 硬件成本→0.001

数据来源:我实测20个样本(涵盖不同市场),事实错误指捏造市盈率、营收等。不适用统计显著性,但趋势明显。

结论

  • 如果你预算充足、追求分析质量,选GPT-4 Turbo。
  • 如果你想零成本运行(使用本地部署的Qwen-72B),需要接受更高的事实错误率和较短的输出。原项目使用OpenAI API,我建议至少使用GPT-4(不要用GPT-3.5,金融场景幻觉太高)。
  • Claude 3在长文本理解上更优(新闻多时),但价格翻倍,性价比不如GPT-4。

参数配置与Prompt秘诀

调用LLM时,金融分析最关键的参数是 temperaturesystem message

python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
import openai

client = openai.OpenAI(api_key="sk-xxx")

response = client.chat.completions.create(
    model="gpt-4-turbo",
    messages=[
        {"role": "system", "content": """你是资深股票分析师。
规则:
1. 只基于给出的行情和新闻数据,不要编造任何财务数据。
2. 如果无法判断,直接说“数据不足”。
3. 输出格式:<股票名称> 当日解读 | 关键因素 | 操作建议(选:观望/持有/减仓)| 置信度(高/中/低)
4. 禁止给出具体的买入卖出价格建议。"""},
        {"role": "user", "content": f"今日行情:{行情文本}\n新闻:{新闻文本}\n请分析并给出操作建议。"}
    ],
    temperature=0.2,  # 低温度减少创意,提高事实准确性
    max_tokens=500
)

参数解释

  • temperature=0.2:金融分析需要保守,0.2 保证输出稳定。原项目没有强调,很多人默认0.7,结果LLM胡编概率大增。
  • max_tokens=500:足够输出结构化的分析,过长浪费Token。
  • System message 中的约束“不要编造”是防止幻觉的关键,效果立竿见影。

实测效果:一次完整的每日分析案例

我克隆项目后配置了A股“宁德时代”和美股“特斯拉”两只股票,运行一周(5个交易日)。以下是一个典型输出(节选):

text
1 2
宁德时代 当日解读 | 关键因素:碳酸锂价格反弹+新产能落地传闻 | 操作建议:观望 | 置信度:中
特斯拉 当日解读 | 关键因素:FSD入华进展延迟+Q2交付预期下调 | 操作建议:减仓 | 置信度:高

对照当天真实走势:宁德时代当日微涨0.8%(观望合理);特斯拉当日下跌2.5%(减仓正确)。但LLM给出的“碳酸锂价格反弹”是真实新闻,“FSD入华进展延迟”也是真新闻。LLM的正确判断本质是正确解读了已公开信息,而非预测。

调优记录:一次失败的Prompt

最初我使用 temperature=0.7 并让LLM“给出具体买入价格”。结果两次出现LLM幻想了一个根本不存在的“内部消息”,生成“建议在280元以下买入”,而当天最低价285。这是非常危险的。所以我强制删除了价格建议输出,并加入约束。

常见坑和解决方案

坑1:LLM幻觉金融数据

  • 现象:LLM自己编造营收增长率、市盈率。
  • 原因:训练数据中包含财务信息,但上下文没有时它自动补全。
  • 解决:在Prompt中明确“只使用下面给出的数据”,同时将行情数据中的关键财务指标(如PE、EPS)结构化传入。原项目传入的是新闻摘要,我建议额外传入 市盈率 市净率 等数值。

坑2:成本失控

  • 现象:每天分析10只股票,每只股票传入5条新闻+行情文本,Token数飙升。
  • 计算:一条新闻平均500 tokens,5条=2500,加上回复500,每次3000 tokens。一天10次=30K tokens。GPT-4 Turbo输入$10/1M tokens → 每天$0.3,一个月$9。看起来不多,但如果你加更多股票或实时推送,成本线性增长。
  • 解决:对新闻做摘要(可用更便宜的模型做预处理,例如GPT-3.5将5条新闻压缩成200字摘要,再传给GPT-4)。这是原项目可以优化的方向。

坑3:免费定时运行的限制

  • 现象:GitHub Actions免费额度(3000分钟/月)如果分析任务超过6分钟/次,每月500次会超限。
  • 解决:优化代码减少运行时间,或使用自建CRON(例如树莓派)。原项目使用了schedule库配合本地运行,但“零成本”只适用于个人低频使用。

!github actions cost breakdown (配图:Actions运行时长与费用关系)

坑4:多市场时区差异

  • 现象:A股收盘时美股还在盘中,同一份分析报告时间错位。
  • 解决:分时区调用,A股在15:30后分析,美股在16:00后(纽约时间),港股在16:00后。原项目统一在UTC 0点运行,对于中国市场来说滞后了6小时。建议改为北京时间下午4点后触发

什么时候不应该用LLM做股票分析?

  • 高频交易:LLM响应时间>1秒,跟不上。
  • 纯技术指标策略:MACD/RSI等用Python库更快。
  • 需要90%以上准确率:LLM在事实性上做不到。
  • 合规敏感场景:LLM建议可能被视为投资建议,有法律风险。

总结与行动建议

读完这篇文章,你应该带走三件事:

  1. 股票分析值得上LLM的场景是:解读新闻、情绪分析、生成结构化报告。不是预测。
  2. 选模型优先考虑GPT-4 Turbo(平衡成本与质量),Prompt中必须限制幻觉。
  3. 部署时注意定时策略和Token成本控制,新闻预处理能省一半钱。

现在你可以拉取 daily_stock_analysis,替换API Key,配置你的股票池,开始运行。遇到问题回到这篇文章看看第四部分。

延伸思考:如果未来有更强的开源金融大模型(如FinGPT),本地部署将消除成本隐患。但今天,OpenAI仍是性价比最优解。