2026-09-28 · 原文发布日
每周扫描高股息陷阱并生成风险摘要
免费n8n模板:每周读取Google Sheets自选股,经HTTP拉取未来7天除息日历和分红基本面,按派息率、盈利与营收增长、分红增长、近五年削减记录计算可持续分和陷阱风险分;风险分60以上的标的交给OpenAI生成警示说明、核心担忧和投资者提问JSON,结果写入表格Risk Results页和Supabase,最后把排序后的周报发到Slack和Gmail。
原文要点
这是n8n.io上WeblineIndia发布的免费模板(工作流20010)。流程为:周计划触发器读取Google Sheets自选股Watchlist并只保留enabled行;HTTP请求拉取未来7天除息日历与分红基本面(模板默认是mock URL需替换);按派息率、盈利增长、营收增长、分红增长、近五年削减记录计算可持续分与陷阱风险分;风险分≥60的标的交OpenAI仅依据给定指标生成caution_note、key_concern、investor_question三段JSON;结果写入Sheets的Risk Results页和Supabase的dividend_risk_analysis表,最后把排序后的周报发Slack与Gmail,无风险时发no-risk摘要。enabled字段接受true、yes、1或布尔true。
这次做成什么
在自己的n8n实例里搭一条每周自动扫描的股息陷阱检测流:用合成测试数据先跑通全链路,确认打分、AI解读、双路存储和双路通知都工作,再决定是否接入真实行情数据源。
准备什么
- 一个可编辑的n8n实例(Cloud或自托管均可),以及OpenAI、Google Sheets、Supabase、Slack、Gmail五组凭据
- Google Sheets中准备含symbol和enabled列的Watchlist页,以及用于写入结果的Risk Results页
- 一个Supabase项目,并预先建好dividend_risk_analysis表(列见下方材料)
- OpenAI API key(模型调用会按OpenAI计费),Slack目标频道ID和Gmail收件人地址
具体怎么做
导入模板并准备Watchlist测试表
在n8n中从模板库导入该工作流(作者提供模板页可复制,本站不另造可导入JSON)。在Google Sheets建Watchlist页,列至少为symbol、enabled,可选company_name、sector、notes。填入下方合成测试数据,enabled列用true/yes/1/布尔true均被识别;先在Prepare Watchlist Context节点手动执行,确认只有启用的行被保留。
用合成数据替换两个HTTP节点
原模板两个HTTP节点(Get Upcoming Ex-Dividend Data1、Get Dividend Fundamentals1)默认指向mock URL。练习阶段不要急着接真实API:把节点临时换成Code节点或本地测试端点,返回下方材料里的两段合成JSON,字段必须包含symbol、ex_dividend_date、dividend_yield、payout_ratio、earnings_growth、revenue_growth、dividend_growth、dividend_cuts_last_5_years,否则下游打分节点会因字段缺失给出异常低分。
核对打分与60分阈值分支
依次执行Calculate Dividend Sustainability1、Calculate Yield Trap Risk1、Identify Yield Trap Red Flags1三个Code节点,查看每条输出中的可持续分、风险分和红旗列表。Risk Above Threshold节点只放行风险分≥60的记录。用合成数据中的TRAP(高派息率、负增长、五年两次削减)应过阈值,SAFE(低派息率、正增长、无削减)应被拦下,以此验证分支逻辑。
配置OpenAI解读节点
在Message a model节点填入下方完整提示词,让模型只基于传入指标输出三个字段的JSON。执行后在Normalize AI Response节点确认解析出caution_note、key_concern、investor_question三个键;若为空,通常是模型没返回合法JSON,需要在提示词中强调只输出JSON。
接通双存储与双通知
Log Flagged Risks to Google Sheets节点填Spreadsheet ID和Risk Results页名并核对列映射;Store Flagged Risks in Supabase节点选dividend_risk_analysis表并确认字段名一致。Slack节点填频道ID,Gmail节点填收件人。各发一条测试消息后手动跑一次完整流程:有过阈值记录时应收到排序后的风险周报,全部低于60时应收到no-risk摘要。
可直接复制的材料
OpenAI高风险解读提示词(粘贴进Message a model节点)
本站独立编写的示例提示词,需与原模板Normalize AI Response节点期望的caution_note、key_concern、investor_question三键保持一致;表达式路径请按你实际的字段名调整。
你是一名谨慎的股息投资研究助手。下面给你一只股票的分红基本面指标,请只基于这些指标判断其股息可持续性风险,不要引入外部数据或编造未提供的数字。
输入指标:
- 股票代码:{{ $json.symbol }}
- 股息率:{{ $json.dividend_yield }}
- 派息率:{{ $json.payout_ratio }}
- 盈利增长:{{ $json.earnings_growth }}
- 营收增长:{{ $json.revenue_growth }}
- 分红增长:{{ $json.dividend_growth }}
- 近五年削减分红次数:{{ $json.dividend_cuts_last_5_years }}
- 已识别红旗:{{ $json.red_flags }}
- 陷阱风险分:{{ $json.risk_score }}
请严格只输出一个JSON对象,不要输出任何其他文字,格式如下:
{"caution_note":"两到三句中文警示说明,指出为什么这只股票可能是高股息陷阱","key_concern":"一句中文,指出最核心的一个担忧","investor_question":"一句中文,给出投资者在买入前应该追问公司的一个问题"}合成除息日历测试数据(替换mock HTTP端点)
本站虚构测试数据。TRAP和SAFE在未来7天窗口内应被保留,SKIP超出7天应被过滤;换成真实数据源时字段名需与下游Code节点一致。
[
{"symbol":"TRAP","ex_dividend_date":"2026-10-05","dividend_yield":0.118},
{"symbol":"SAFE","ex_dividend_date":"2026-10-06","dividend_yield":0.031},
{"symbol":"SKIP","ex_dividend_date":"2026-11-20","dividend_yield":0.055}
]合成分红基本面测试数据(替换mock HTTP端点)
本站虚构测试数据,TRAP用于触发≥60风险分支,SAFE用于验证被拦下;原模板的具体打分公式未公开,需以模板内Calculate节点实际代码为准。
[
{"symbol":"TRAP","dividend_yield":0.118,"payout_ratio":0.96,"earnings_growth":-0.15,"revenue_growth":-0.08,"dividend_growth":-0.20,"dividend_cuts_last_5_years":2},
{"symbol":"SAFE","dividend_yield":0.031,"payout_ratio":0.42,"earnings_growth":0.09,"revenue_growth":0.06,"dividend_growth":0.07,"dividend_cuts_last_5_years":0}
]Supabase表dividend_risk_analysis建表参考
本站独立编写的参考建表语句,列名需与你Supabase节点里实际插入的字段一一对应;原模板未给出建表SQL,请按其插入节点字段核对。
create table dividend_risk_analysis (
id bigint generated always as identity primary key,
symbol text not null,
scan_date date not null default current_date,
dividend_yield numeric,
payout_ratio numeric,
sustainability_score numeric,
risk_score numeric,
risk_level text,
red_flags text,
caution_note text,
key_concern text,
investor_question text
);输入与输出示例
本站虚构演示,风险分值与AI文本均为示意,并非模板实际运行结果。
输入
Watchlist中启用TRAP与SAFE两只股票;日历返回TRAP除息日2026-10-05(7天内)、股息率11.8%,SAFE除息日2026-10-06、股息率3.1%;基本面返回TRAP派息率0.96、盈利增长-0.15、五年削减2次,SAFE派息率0.42、盈利增长0.09、削减0次。对应输出
TRAP经打分后风险分假设为78(本站设定的示意值,实际分值取决于模板内公式),过60阈值进入OpenAI节点,得到{"caution_note":"TRAP股息率高达11.8%但派息率96%,盈利和营收双双负增长,分红难以为继。","key_concern":"派息率接近100%且五年内已两次削减分红。","investor_question":"管理层是否有明确计划在不举债的情况下维持当前分红水平?"};SAFE风险分假设为22被拦下;Slack收到1条标的的周报,Sheets与Supabase各写入1行。做完检查这些
- Prepare Watchlist Context只输出enabled为true/yes/1的行,禁用行不出现
- 日历过滤后SKIP因除息日超出7天被剔除,TRAP与SAFE保留
- TRAP风险分≥60进入OpenAI分支,SAFE被Risk Above Threshold拦下
- Normalize AI Response输出含caution_note、key_concern、investor_question三个非空键
- Risk Results页和dividend_risk_analysis表各新增一行且symbol与分数一致
- Slack频道与Gmail收件箱都收到同一周的摘要邮件/消息
容易卡住的地方
- enabled列若写成大写TRUE以外的变体(如on、启用)会判为未启用,导致无股票被处理
- 两个HTTP端点返回的symbol集合必须一致,否则基本面合并后字段缺失、风险分异常偏低
- OpenAI若返回带解释文字的非法JSON,Normalize AI Response会得到空字段,需在提示词中强制只输出JSON
- 原模板打分公式与风险等级边界未在导读中公开,练习中的分值是本站示意,接入真实决策前必须读模板内Calculate节点代码
- 本流程输出仅为研究辅助,不构成投资建议;接入真实行情源需自行确认数据许可与费用
本站借助AI整理来源事实,独立编写中文操作指南与示例。示例不代表实际运行结果;来源效果尚未由本站独立复现。付费模板与模型、服务费用分别计算。
- 原文标题
- Detect dividend yield traps with Google Sheets, Supabase, OpenAI, Slack, and Gmail
- 原作者
- WeblineIndia
- 原始发布日期
- 2026-09-28T06:16:22.331Z
- 来源
- https://n8n.io/workflows/20010