AI PLAY玩法更新持续收录
← 回到更新流

2026-09-24 · 原文发布日

n8n流程:持仓大幅波动时让AI解释原因并推送Telegram

这个n8n模板在工作日固定时段运行,从Google Sheets的持仓表读取股票代码,批量抓取Yahoo Finance行情和欧元汇率,计算单日涨跌幅,超过设定阈值才继续。对触发的持仓,流程会查SEC EDGAR近期申报文件并用SerpAPI搜相关新闻,把这些证据连同价格变动交给OpenAI生成一段基于事实的HTML解读,推送到Telegram,同时把时间和触发标的摘要写回Sheets日志表,同一天内重复波动不会重复告警。需要自备Telegram机器人、SerpAPI和OpenAI凭证。

原文要点

原模板由Friedrich Bremer发布:工作日欧洲柏林时间10:00、14:00、18:00定时运行,也可被Execute Workflow触发器按需调用;从Google Sheets的portfolio页读取持仓(ticker、name、market、可选yahoo列),批量抓Yahoo Finance行情并用Frankfurter取欧元汇率,计算单日涨跌幅并对当日重复告警去重;超过阈值才查SEC EDGAR申报与SerpAPI谷歌新闻,交OpenAI(GPT-5)生成HTML解读,推Telegram并把时间戳、触发标的、摘要预览写回finance_alert日志页。需Telegram、Google Sheets OAuth、SerpAPI、OpenAI四类凭证。

这次做成什么

在本站练习中,不下载原工作流,而是按原文描述的节点链路在n8n里手工搭一个最小可跑版本:定时触发→读持仓→算涨跌幅→阈值分支→AI写解读→发Telegram→写日志,用合成持仓数据验证去重逻辑。本站未实测原模板,界面与节点参数需在n8n实际版本中核对。

准备什么

  • n8n账号(自托管或云端均可)与一个Telegram机器人及其chat ID
  • 一份含portfolio和finance_alert两个工作表的Google Sheets及OAuth凭证
  • OpenAI API密钥;SerpAPI与SEC EDGAR查询在本练习中用静态数据代替
  • 合成持仓CSV数据,不使用真实券商账户

具体怎么做

  1. 建持仓表并配置定时触发

    在Google Sheets建portfolio页,表头为ticker、name、market、yahoo四列,填入下方合成CSV;n8n新建工作流,加Schedule Trigger,设工作日10:00/14:00/18:00(时区选Europe/Berlin),后接Google Sheets读取节点指向该表。

  2. 取行情并计算单日涨跌幅

    练习阶段用Code节点模拟行情:对每个ticker给出prevClose与lastPrice,计算pctChange=(lastPrice-prevClose)/prevClose*100,并输出EUR换算系数占位字段;正式使用时按原文改为Yahoo Finance批量请求加Frankfurter汇率接口。

  3. 阈值过滤与当日去重

    用IF节点判断pctChange绝对值是否≥阈值(练习设3%);通过后先读finance_alert日志页,用Code节点检查同一ticker当天是否已有记录,有则丢弃,实现同一天重复波动不重复告警。

  4. 生成AI解读并推送

    把触发标的的涨跌幅、练习用静态新闻摘要拼入OpenAI节点,用下方提示词生成Telegram HTML;后接Telegram节点发送到chat ID,再用Google Sheets追加节点把date(当天日期)、ticker(写入tickers列)、pctChange、摘要前80字写入finance_alert页,字段名需与去重代码判断保持一致。

  5. 跑一条测试数据验证

    手动执行工作流一次,确认ACME与BRVO两条触发告警入日志且Telegram收到两条消息;再立即重跑,确认同样的标的被去重节点拦截、finance_alert不新增记录、Telegram不再收到消息。

可直接复制的材料

portfolio页合成持仓数据

本站虚构练习数据,ticker均为编造,正式使用替换为真实持仓;yahoo列用于指定精确Yahoo代码

ticker,name,market,yahoo
ACME,ACME工业,US,ACME
BRVO,Bravo食品,US,BRVO
CRSP,Crisper半导体,DE,CRSP.DE
DLTA,Delta物流,US,DLTA

OpenAI解读提示词

本站独立编写,占位符在n8n中用表达式替换;原文未公开提示词全文

你是投资资讯编辑。根据以下证据,为持仓{{ticker}}({{name}})写一段适合Telegram的HTML解读:单日涨跌幅为{{pctChange}}%。已知线索:{{newsSummary}}。要求:1)只用给定证据,不编造未提供的申报或新闻;2)先用一句话说清发生了什么,再列两到三个可能原因,标注哪些是事实哪些是推测;3)用<b>、<i>标签排版,总长不超过120字;4)结尾加一句风险提示,说明不构成投资建议。

去重判断代码(Code节点)

本站编写的练习版示意代码,字段名需与你日志页实际列名对齐,未在原模板中核对

// Code节点模式:Run Once for All Items(对所有项目运行一次)
// 上游先用Merge合并两个输入:触发标的各含ticker与pctChange,另有一项含当日日志logs数组
const today = new Date().toISOString().slice(0,10);
const all = $input.all().map(i => i.json);
const logs = (all.find(x => x.logs) || {}).logs || [];
const fresh = all.filter(m => m.ticker && !logs.some(l =>
  l.date === today && (l.tickers || '').includes(m.ticker)));
return fresh.map(m => ({json: m}));

输入与输出示例

本站虚构演示,非原作者运行结果

输入

持仓表四行:ACME、BRVO、CRSP.DE、DLTA;模拟行情ACME昨收50.00今收52.10(+4.2%),BRVO昨收30.00今收28.50(-5.0%),CRSP.DE昨收80.00今收81.20(+1.5%),DLTA昨收25.00今收25.40(+1.6%),阈值3%

对应输出

触发的只有ACME(+4.2%)和BRVO(-5.0%);Telegram收到两条HTML告警,例如“<b>ACME工业 +4.2%</b> 单日大幅上涨,可能与盘前公告有关(推测)……不构成投资建议”;finance_alert追加两行日志,date为当天、tickers分别为ACME与BRVO;立刻重跑时两个标的均被去重节点拦下,无新增消息

做完检查这些

  • Schedule触发后,涨跌幅≥3%的标的进入告警分支,低于阈值的不发消息
  • 同一天内对同一ticker第二次执行时,去重逻辑生效且日志不新增该标的记录
  • finance_alert页每行含date、tickers、摘要预览三个字段且时间戳为当日
  • Telegram消息为HTML格式且包含b标签排版与风险提示句

容易卡住的地方

  • Yahoo Finance非官方接口可能限频或改字段,批量抓取失败时需加重试
  • SEC EDGAR只对能解析出美国CIK的标的有效,欧洲股票此分支可能为空
  • Google Sheets OAuth凭证过期会导致读持仓和写日志同时失败
  • 阈值和时区都在Config与Schedule节点中,改一处忘改另一处会造成告警时间错位
  • Telegram chat ID填错时流程看似成功但消息发给了错误的会话

原文与作者资料 ↗

本站借助AI整理来源事实,独立编写中文操作指南与示例。示例不代表实际运行结果;来源效果尚未由本站独立复现。付费模板与模型、服务费用分别计算。

原文标题
Send portfolio price move alerts with Google Sheets, OpenAI and Telegram
原作者
Friedrich Bremer
原始发布日期
2026-09-24T07:55:48.347Z
来源
https://n8n.io/workflows/19890