分享程式代碼相關筆記
目前文章總數:229 篇
最後更新:2026年 04月 25日
| 1. 痛點 | : | 每天新聞幾千則,手動過濾太慢;空有利多新聞,卻不知道主力是否在「出貨」 |
| 2. 解決方案 | : | 利用 n8n 串接 Groq AI 的高速推理能力,搭配自己的 Azure SQL 籌碼庫,建立「新聞過濾 + 籌碼驗證」的雙重機制。 |
※Azure SQL 籌碼庫,是自行蒐集的籌碼資料,目前 台灣集保結算所-集保戶股權分散表查詢網站只會保留一年的資料
n8n 是一款「節點導向(Node-based)」的低程式碼自動化工作流工具。它允許你透過視覺化介面
將不同的 App(如 Google Sheets, Slack, Line, SQL, AI 模型)串接在一起。
與其他競爭對手(如 Zapier, Make.com)最大的不同在於,n8n 是 「公平碼(Fair-code)」 授權,
這意味著可以在 n8n 實現以下:
| n8n 特色 | ||
| 1. n8n Cloud | : | 官方代管,開箱即用(本篇範例的主要操作說明)。 |
| 2. Self-Hosted | : | 部署在自己的伺服器(Docker/VPS),完全掌控數據隱私。 |
除了自動化具備視覺化的操作外,優點整理如下:
| 優點 (Pros) | : | 內容說明 |
|---|---|---|
| 1. 高度靈活性 | : | 支援 JavaScript/Python Node,能滿足所有客製化邏輯,是「低程式碼」與「全程式碼」的完美平衡。 |
| 2. AI 原生整合 | : | 內建 LangChain 節點,串接 Groq 或 OpenAI 的速度極快,能輕鬆打造 AI Agent 工作流。 |
| 3. 強大資料處理 | : | 處理 JSON 數據非常直觀,非常適合處理像 RSS 抓取後需要過濾、轉換格式的複雜任務。 |
| 4. 部署選擇多樣 | : | 提供官方 Cloud 版開箱即用,也支援 Docker 自架,能完全掌控數據隱私並節省長期成本。 |
| 5. 視覺化除錯 | : | 畫布式介面能即時點開查看每個步驟的「輸入」與「輸出」,大幅縮短開發與維修時間。 |
相對地缺點整理如下,最致命的傷應屬 學習成本高,太多功能不斷迭代更新:
| 缺點 (Cons) | : | 內容說明 |
|---|---|---|
| 1. 學習曲線較陡 | : | 使用者需要對 API 呼叫、JSON 結構有基本概念,對完全沒有技術背景的新手來說門檻較高。 |
| 2. 中文資源稀缺 | : | 官方文件與討論區均為英文,中文教學文章相對較少,遇到深層問題時搜尋較花時間。 |
| 3. 資源消耗問題 | : | 若選擇自架版,當複雜的工作流同時運行時會較佔記憶體,需注意伺服器效能分配。 |
| 4. 介面反應速度 | : | 當單一工作流中的節點數量極大時,畫布編輯器的操作可能會出現輕微的延遲感。 |
但這些缺點在具備 CICD & 開發經驗的軟體工程師上,屬於 瑕不掩瑜
第一次使用建議從 n8n 雲端版本,註冊完畢後,可以得到 14 天免費的試用期
建立一個 Workflow 後,起點為 When Clicking Execute Workflow (手動執行按鈕)
本篇範例是作者自行蒐集 集保戶股權分散表 的籌碼資料,有蒐集 8 年來所有 台灣股市 資料
若是有自己的資料庫餵給 AI Agent 可以跳過這段權限配置操作,目的:
避免 n8n 取得 Insert, Update, Delete, Truncate 等較高的權限
提供給 n8n 的帳號只會有 Query (SELECT) 權限
登入 Azure SQL Server 資料庫,執行以下 SQL 語法,目的是 建立 n8n 伺服器層級的登入帳號 ,並且只能 查詢
※密碼的地方自行替換
USE master;
GO
CREATE LOGIN [n8n_reader] WITH PASSWORD ='密碼'
GO
我們的籌碼資料庫在 StockCounter 庫中,因此准許 n8n_reader 登入
USE [StockCounter]];
GO
CREATE USER [n8n_reader] FOR LOGIN [n8n_reader]
GO
腳色權限賦予 讀取
ALTER ROLE db_datareader ADD MEMBER [n8n_reader]
GO
驗證 n8n_reader 權限是否只有讀取,因此先登入
嘗試使用 Insert 語法可以看到插入失敗,並且下 SELECT 語法確保可以讀取
在成本考量上可考慮使用 Groq AI(免費額度)即使每天執行幾百次自動化,也不必擔心像 OpenAI 那樣產生昂貴的帳單。
Groq 是一家專注於人工智慧硬體的半導體公司,他們研發了專為推論(Inference)設計的處理器 LPU (Language Processing Unit)。
與傳統依賴 GPU(如 NVIDIA)的 AI 服務不同,Groq 的技術能讓大型語言模型(如 Llama 3、Mixtral)以驚人的速度運行,每秒可生成數百個字(Tokens)。
特色如下:
| 核心特性 | : | 詳細說明 |
|---|---|---|
| 1. 極致推論速度 | : | 每秒可達 300~500 Tokens,比傳統雲端 GPU 快上 10 倍,實現真正的「秒回」。 |
| 2. LPU 專屬架構 | : | 捨棄了 GPU 的複雜併行運算,採用確定性時序架構,讓 AI 推理過程不再有延遲波動。 |
| 3. OpenAI 相容性 | : | 提供與 OpenAI API 格式高度相容的 SDK,開發者可以無縫從 GPT 切換至 Groq。 |
| 4. 高性價比 | : | 提供極具競爭力的按量計費模型,甚至針對小型開發者提供相當大方的免費額度。 |
| 5. 開源模型支援 | : | 專注於優化開源生態,目前完美支援 Meta 的 Llama 3 系列與 Mistral 等主流模型。 |
Groq 官網註冊並登入後,依序選擇 API Keys -> Create API Key
生成 API Key 後,將其複製,會在 n8n 的 Credential 中添加
最終推送到用戶端我們採取 LineBot 推播的方式,可以參考0107. 2026 實戰教學:從零打造 C# Line Bot 並免費部署至 Azure App Service
如何實現 LineBot,當然用 Whatsapp、Slack、Email 方式皆可,以個人實用性為主
本篇範例主要使用的技術棧如下,透過 n8n 整合 RSS + AI Agent + 資料庫 + Line Bot 完成自動化篩選股票流程
從數據輸入、AI 篩選到資料庫比對,最後輸出到 Line 的自動化閉環
其中 AI Agent 處理 2 次,解決了 1. 新聞過濾資料 。其次解決 2. 決策結論
| 步驟順序 | : | n8n 節點名稱與功能說明 |
|---|---|---|
| 1. 觸發與設定 | : | When clicking ‘Execute workflow’ & 台股利多關鍵字:手動或定時觸發流程,並預設好要抓取的台股利多核心關鍵字。 |
| 2. 獲取新聞 | : | RSS Read (新聞):連接 Yahoo 新聞 RSS 來源,即時抓取最新大量的股票相關新聞標題與內容。 |
| 3. 資料預處理 | : | 去除重複新聞 & Edit Fields & Aggregate:過濾掉內容重複的新聞,並整理欄位資訊後匯集成單一資料包,準備給 AI 處理。 |
| 4. AI 初步選股 | : | AI Agent (Groq Chat Model 1):利用 Groq AI 的快速推理能力,從數十則新聞中篩選出具備利多潛力的股票標題。 |
| 5. 數據精煉 | : | 整理出推薦 5 檔股票:將 AI 初步分析的結果進行結構化處理,鎖定最有潛力的 5 檔標的。 |
| 6. 籌碼驗證 | : | Microsoft SQL (Execute Query):根據這 5 檔股票,自動到 Azure SQL 籌碼庫撈取相關的法人買超或主力動向數據。 |
| 7. 數據再加工 | : | SQL 結果整理:將資料庫回傳的原始數據進行清洗,確保格式能與先前的推薦理由完美對齊。 |
| 8. AI 綜合決策 | : | AI Agent (Groq Chat Model):第二次呼叫 Groq AI,結合「新聞利多」與「籌碼數據」進行交叉驗證,產出最終深度分析。 |
| 9. 格式轉換 | : | 正規化 Json 資料:將 AI 生成的建議文字與數據,轉換為符合 Line Flex Message 所需的 JSON 代碼格式。 |
| 10. 推播通知 | : | HTTP Request (推播給 LineBot):透過 Messaging API 將精美的選股報告推送到使用者的 Line 手機端。 |
建立 Code 節點,參數如下 :
| Mode | Run Once for All Items |
| Language | Javascript |
Js 代碼如下,目的是提供股票 利多關鍵字 ,n8n 只看得懂 URL Encode ,因此需要先將中文轉換
return [
{keyword:"%E5%89%B5%E9%AB%98"},//創高
{keyword:"%E8%B2%B7%E8%B6%85"},// 買超
{keyword:"%E8%BD%89%E7%9B%88"},// 轉盈
{keyword:"%E5%84%AA%E6%96%BC%E9%A0%90%E6%9C%9F"},// 優於預期
{keyword:"%E5%8A%A0%E7%A2%BC"},// 加碼
{keyword:"%E6%8E%A5%E5%96%AE"},// 接單
{keyword:"%E5%88%A9%E5%A4%9A"} // 利多
];
建立 RSS Read 節點,參數如下:
目的是把關鍵詞依序傳入找出相關的新聞
| URL | https://tw.stock.yahoo.com/rss?q={{json.keyword}} |
建立 Remove Duplicates 節點,參數如下:
目的是把新聞相同的資料移除,減輕資料量
| Operation | Remove Items Repeated Within Current Input |
| Compare | Selected Fields |
| Fields To Compate | link |
其中 link 是判別是否重複來源的新聞依據
建立 Edit Fields 節點,參數如下:
目的是移除不需要的資料,只保留 標題 與 內容
| Mode | Remove Items Repeated Within Current Input | |
| Fields to Set | 標題 | {{ $json.title }} |
| 內容 | {{ $json.content }} |
建立 Aggregate 節點,參數如下:
目的是整併成 1 筆資料,如果保留原本的多筆資料,會讓 AI Agent 處理太多次 (50筆等於 AI 做 50 次),避免浪費太多 AI API Token
| Aggregate | Individual Fields | |
| Fields to Aggregate | Input Field | 內容 |
建立 AI Agent 然後建立 Groq Chat Model ,並且讓此 AI Agent 的 Model 使用 Groq
AI Agent 參數如下:
| Source for Prompt (User Message) | Define below |
| Prompt (User Message ) | 以下內容 |
Prompt 有以下內容,讓 AI 輸出指定的格式,並且要代入身分: 資深的台股分析師,最終輸出 5 檔股票
你是一位資深的台股分析師,擅長從產業利多新聞中挖掘受惠股。
### 任務說明:
請分析以下新聞內容,並列出 5 個最直接受惠的「台股上市櫃公司」+ 股票代號。
### 新聞來源:
所有內容:{{ $json['內容'] }}
### 限制與規則:
1. 僅限台灣上市櫃企業。
2. 若內容不足 5 家,請僅列出最相關者。
3. 嚴禁提供投資建議。
### 輸出格式 (請嚴格遵守以下 Line 訊息編排):
📊 **【台股利多情報分析】**
--------------------------
(請針對每一家公司輸出以下結構,並使用指定 Emoji)
🚀 **[代號 名稱]**
🔹 **受惠理由**:[30字內,精簡扼要]
⚠️ **風險提示**:[20字內關鍵風險]
### 輸出格式:
請嚴格分為兩個部分輸出:
PART 1: [Line 訊息內容]
(這裡放您原本的 Line 訊息編排,包含 Emoji 等)
PART 2: [JSON 資料]
請將分析出的 5 檔股票僅以 JSON Array 格式輸出,方便程式解析。
格式範例:
[{"code": "2330", "name": "台積電"}, {"code": "8210", "name": "勤誠"}]
Groq 參數如下:
將自己的 API Key 代入,並且注意 Model 必須要選可以容納大量輸入文本的模式
| Credential to connect with | 您的 Groq API Key |
| Model | llama-3.3-70b-versatile |
建立 Code 節點,參數如下 :
| Mode | Run Once for All Items |
| Language | Javascript |
Js 代碼如下,目的是得到我們要的 Json 格式,保留 5 檔 AI 推薦的股票代號
// 1. 取得 Gemini 輸出的原始文字
const fullText = $input.first().json.output
// 2. 切割字串
const parts = fullText.split('PART 2:');
if (parts.length < 2) {
throw new Error("找不到 'PART 2:' 關鍵字");
}
const afterPart2 = parts[1];
// 3. 關鍵修正:改用搜尋 '[{"' 來精確定位 JSON 陣列的開頭
// 這樣就能跳過前面的 "[JSON 資料]" 文字
const jsonStart = afterPart2.indexOf('[{"');
if (jsonStart === -1) {
throw new Error("在 PART 2 之後找不到正確的 JSON 數據格式。");
}
const jsonPart = afterPart2.substring(jsonStart).trim();
try {
// 4. 解析 JSON
const stocks = JSON.parse(jsonPart);
// 5. 回傳成 n8n 標準格式
return stocks.map(stock => ({
json: {
stock_code: stock.code.trim(),
stock_name: stock.name.trim(),
full_line_message: parts[0].trim()
}
}));
} catch (error) {
throw new Error("JSON 解析依舊失敗,擷取內容為:" + jsonPart + " | 錯誤:" + error.message);
}
建立 Microsoft SQL 節點,參數如下 :
| Credential to connect with | 您的 Azure 資料庫登入帳號密碼 |
| Operation | Execute Query |
SQL 語法如下,目的是將 AI 推薦的 5 檔利多股票 + 12 週 (3個月) 的籌碼變化查詢出結果
WITH WeeklyData AS (
-- 步驟 1: 先將 15 級(大戶)與 17 級(總計)的資料轉為同一列
SELECT
T15.stock_no,
T15.belong_date,
T15.inventory_ratio AS BigHolderRatio, -- 大戶持股比
T17.inventory_people AS TotalHolderCount -- 總人數
FROM dbo.TDCC_{ { $json.stock_code } } T15
JOIN dbo.TDCC_{ { $json.stock_code } } T17 ON T15.belong_date = T17.belong_date
WHERE T15.level = 15 AND T17.level = 17
),
TrendAnalysis AS (
-- 步驟 2: 使用 LAG 函數取得「前一週」的數值並計算差異
SELECT
stock_no,
belong_date,
BigHolderRatio,
-- 計算大戶持股比例變化 (本週 - 前一週)
BigHolderRatio - LAG(BigHolderRatio) OVER (ORDER BY belong_date) AS BigHolderChange,
TotalHolderCount,
-- 計算人數變化 (本週 - 前一週)
TotalHolderCount - LAG(TotalHolderCount) OVER (ORDER BY belong_date) AS HolderCountChange
FROM WeeklyData
)
-- 步驟 3: 輸出最近 12 週資料
SELECT TOP 12 * FROM TrendAnalysis
ORDER BY belong_date DESC;
建立 Code 節點,參數如下 :
| Mode | Run Once for All Items |
| Language | Javascript |
Js 代碼如下,目的是將每個股票代碼資料歸類為 1 個組別,便於 AI 後續分析
const allData = items; // 取得 SQL 輸出的 60 筆資料
const grouped = {};
// 1. 開始分組
allData.forEach(item => {
// 處理 stock_no,移除空白並確保它是字串
const sn = String(item.json.stock_no).trim();
if (!grouped[sn]) {
grouped[sn] = {
stock_no: sn,
history: []
};
}
// 將該筆週資料推入對應股票的 history 陣列
grouped[sn].history.push({
date: item.json.belong_date.split('T')[0], // 簡化日期格式
ratio: item.json.BigHolderRatio,
change: item.json.BigHolderChange,
total_count: item.json.TotalHolderCount,
count_change: item.json.HolderCountChange
});
});
// 2. 轉換成 n8n 格式,並只取出前 5 檔股票 (如果你只需要 5 檔)
const result = Object.values(grouped).slice(0, 5).map(stock => {
return {
json: stock
};
});
return result;
建立 AI Agent 然後建立 Groq Chat Model ,並且讓此 AI Agent 的 Model 使用 Groq
AI Agent 參數如下:
| Source for Prompt (User Message) | Define below |
| Prompt (User Message ) | 以下內容 |
Prompt 有以下內容,讓 AI 輸出指定的格式,並且要代入身分: 台股籌碼分析師
這次是對每 1 個股票作籌碼分析
Role: 你是一位資深的台股籌碼分析師,專長是從集保戶股權變化中找出主力吸籌或出貨的訊號。
Task: 請分析股票({{ $json.stock_no }})近 5 週數據,並依據邏輯給出結論。
Data (JSON):
{{ $json.history.toJsonString() }}
分析邏輯參考:
大戶動向:觀察 BigHolderRatio 持續性。
籌碼集中度:BigHolderChange > 0 且 HolderCountChange < 0 代表強勢集中。
⚠️ 重要回傳格式規範:
請直接回傳以下 JSON 格式,不要包含任何 Markdown 區塊(不要有 ```json)、不要有額外開場白。
{
"stock_no": "{{ $json.stock_no }}",
"rating": "強力看多/偏多/中立/偏空",
"observation": [
"第一點關鍵觀察",
"第二點關鍵觀察"
],
"conclusion": "一句話的操作建議"
}
Groq 參數如下:
將自己的 API Key 代入,並且注意 Model 必須要選可以容納大量輸入文本的模式(同之前設定)
| Credential to connect with | 您的 Groq API Key |
| Model | llama-3.3-70b-versatile |
建立 Code 節點,參數如下 :
| Mode | Run Once for All Items |
| Language | Javascript |
Js 代碼如下,目的是轉換為符合 Line Flex Message 所需的 JSON 代碼格式
// 定義評價顏色對應表
const ratingColors = {
"強力看多": "#FF0000",
"偏多": "#E63946",
"中立": "#457B9D",
"偏空": "#1D3557",
"強力看空": "#008000"
};
// 處理所有輸入的 items
return items.map((item) => {
const rawOutput = item.json.output;
// 1. 提取 JSON 部分(過濾掉可能的 think 標籤或雜訊)
const jsonMatch = rawOutput.match(/\{[\s\S]*\}/);
if (!jsonMatch) {
return { json: { error: "無法解析 JSON", raw: rawOutput } };
}
const aiData = JSON.parse(jsonMatch[0]);
const textColor = ratingColors[aiData.rating] || "#333333";
// 2. 自動生成觀察清單內容 (1️⃣, 2️⃣...)
const observationContents = aiData.observation.map((text, index) => {
const icons = ["1️⃣", "2️⃣", "3️⃣", "4️⃣", "5️⃣"];
return {
"type": "box",
"layout": "baseline",
"spacing": "sm",
"contents": [
{ "type": "text", "text": icons[index] || "🔹", "color": "#aaaaaa", "size": "sm", "flex": 1 },
{ "type": "text", "text": text, "wrap": true, "color": "#666666", "size": "sm", "flex": 9 }
]
};
});
// 3. 回傳 Line Flex Message 結構
return {
json: {
"type": "flex",
"altText": `${aiData.stock_no} 籌碼研究報告`,
"contents": {
"type": "bubble",
"header": {
"type": "box",
"layout": "vertical",
"contents": [
{ "type": "text", "text": "股票籌碼研究報告", "weight": "bold", "color": "#aaaaaa", "size": "sm" },
{ "type": "text", "text": `${aiData.stock_no} 籌碼健檢`, "weight": "bold", "size": "xl", "margin": "md" }
]
},
"body": {
"type": "box",
"layout": "vertical",
"contents": [
{
"type": "box",
"layout": "horizontal",
"contents": [
{ "type": "text", "text": "籌碼評價", "size": "sm", "color": "#555555", "flex": 0 },
{ "type": "text", "text": aiData.rating, "size": "sm", "color": textColor, "align": "end", "weight": "bold" }
]
},
{ "type": "separator", "margin": "md" },
{
"type": "box",
"layout": "vertical",
"margin": "lg",
"spacing": "sm",
"contents": observationContents
},
{
"type": "box",
"layout": "vertical",
"margin": "lg",
"backgroundColor": "#F0F0F0",
"paddingAll": "10px",
"contents": [
{ "type": "text", "text": `結論:${aiData.conclusion}`, "wrap": true, "size": "xs", "color": "#333333", "style": "italic" }
]
}
]
},
"footer": {
"type": "box",
"layout": "vertical",
"contents": [
{
"type": "button",
"action": {
"type": "uri",
"label": "查看詳細數據",
"uri": `https://tw.stock.yahoo.com/quote/${aiData.stock_no}`
},
"style": "primary",
"color": "#1DB446"
}
]
}
}
}
};
});
| : | HTTP Request (推播給 LineBot):透過 Messaging API 將精美的選股報告推送到使用者的 Line 手機端。 |
建立 Http Request 節點,參數如下 :
| Method | Post |
| URL | 您 Server LineBot 的 API 接口(包含域名) |
| Authentication | None |
| Body Content Type | JSON |
| Specify Body | Using Fields Below |
| Body Parameters 第 1 組 | Name => Message |
| Value => {{ JSON.stringify($json) }} | |
| Body Parameters 第 2 組 | Name => GroupId |
| Value => 您的 LineBot UserId / RoomId / GroupId |
這是最後一步驟,就可以將結果推給 LineBot 輸出 Line Flex Message 到指定的訊息對話窗中
若推播成功,會依照股票數依序顯示
我們可以看到 LineBot 的聊天室群組,推播了 2458 籌碼健檢 ,並且提供評價、建議如何操作
查看詳細數據的按鈕,可以直接到 Yahoo 奇摩股市該股票的股價頁面
目前實現了上述 n8n 功能,有以下特點:
| 核心優勢 | : | 詳細說明 |
|---|---|---|
| 1. n8n Cloud 穩定性 | : | 免去自建伺服器的維護成本與斷網風險,確保 24 小時監控 RSS 新聞,不漏掉任何關鍵訊號。 |
| 2. 異質系統整合 | : | 證明了 n8n 能完美串接 SQL 數據、AI 推理與 Line 通訊,是打造個人化金融戰情室的核心。 |
| 3. 低成本高效能 | : | 結合 Groq 的 LPU 加速技術,實現了以往需要昂貴硬體才能達成的秒級選股分析。 |
當自動化流程穩定運行後,後續還能在擴展以下升級,也是邁向量化交易的步驟:
| 擴展方向 | : | 實作構想 |
|---|---|---|
| 1. 加入回測機制 | : | 在 SQL 中記錄 AI 推薦時的股價,並於 5 天後自動比對漲跌幅,計算 AI 選股的「勝率」與「投報率」。 |
| 2. 串接下單 API | : | 當 AI 綜合評分與籌碼指標達到「極高信心」門檻時,自動觸發券商 API 進行小額掛單買進。 |
| 3. 多模態情緒分析 | : | 除了文字 RSS,未來可串接 YouTube 或 Podcast 逐字稿,利用 AI 分析財經名嘴的口氣與情緒指標。 |