基於林家洋老師的技術分析理論,自動掃描台灣股市投資機會的智能分析平台。
台股技術分析儀表板是一個全棧 Web 應用,結合了實時股票數據獲取、自動技術分析和互動式視覺化展示。系統使用 yfinance(Yahoo Finance)進行數據獲取,支援多種技術訊號識別,幫助投資者快速發現潛在投資機會。
- 自動市場掃描:一鍵掃描台灣股市,識別符合技術條件的股票
- 多種技術訊號:支援攻擊K線、多頭吞噬、黑K吞噬、內困型態等訊號識別
- 推薦指數評分:基於訊號強度、季線位置和成交量的智能評分系統(-120 到 +120 分)
- 買賣訊號視覺化:買進訊號用金色星級表示,賣出訊號用紅色炸彈警示,中立訊號用灰色表示
- 互動式 Tooltip 提示:滑鼠懸停時顯示詳細的訊號說明和投資建議
- K線圖表展示:互動式 K 線圖表,實時顯示股票價格走勢
- CSV 數據分析:支援上傳 CSV 文件進行自定義技術分析
- 自定義掃描設定:在設定頁面自定義股票清單、掃描參數和訊號篩選
- 歷史紀錄保存:自動保存最近 120 次掃描結果,方便追蹤和對比
- 高雅設計:採用金、銀、青、灰、白的高雅配色方案
- 響應式設計:完美適配桌面、平板和手機設備
- React 19 - UI 框架
- Tailwind CSS 4 - 樣式引擎
- tRPC - 類型安全的 RPC 通信
- Wouter - 輕量級路由庫
- shadcn/ui - 高質量 UI 組件庫
- Express 4 - Web 服務器框架
- cors - Express CORS middleware,解決瀏覽器跨域請求問題
- tRPC 11 - 類型安全的 API 層
- Node.js - 運行時環境
- Python 3 - 數據分析和技術指標計算
- yfinance - Yahoo Finance 數據源(全球股票數據,包含台股)
- TWSE API - 台灣證交所日線資料備援
- 本地文件存儲 - JSON 格式保存掃描結果和歷史記錄
- Manus WebDev - 全棧 Web 應用託管平台
- Cloud Run - 無伺服器容器運行環境
- 自動擴展 - 按需自動調整資源
stock_agent_web/
├── client/ # 前端應用
│ ├── src/
│ │ ├── pages/ # 頁面組件
│ │ │ ├── Dashboard.tsx # 主儀表板(掃描控制、結果展示)
│ │ │ ├── KlineChart.tsx # K線圖表頁面
│ │ │ ├── ScanHistory.tsx # 掃描歷史紀錄
│ │ │ └── Settings.tsx # 掃描設定頁面
│ │ ├── components/ # 可重用組件
│ │ ├── lib/ # 工具函數
│ │ ├── App.tsx # 路由和佈局
│ │ └── index.css # 全局樣式
│ ├── public/ # 靜態資源
│ └── index.html # HTML 入口
├── server/ # 後端應用
│ ├── python_logic/ # Python 分析引擎
│ │ └── scan_orchestrator.py # 掃描和分析邏輯
│ ├── _core/ # 核心基礎設施
│ │ ├── pythonExecutor.ts # Python 執行器
│ │ ├── context.ts # tRPC 上下文
│ │ ├── trpc.ts # tRPC 配置
│ │ └── index.ts # 服務器入口
│ ├── routers.ts # tRPC 路由定義
│ ├── fileStorage.ts # 文件存儲層
│ └── db.ts # 數據庫連接
├── data/ # 本地數據存儲
│ ├── scan_sessions.json # 掃描會話記錄
│ ├── scan_results.json # 掃描結果(最新 120 筆)
│ └── scan_logs.json # 掃描日誌
├── drizzle/ # 數據庫遷移(未使用)
├── package.json # 項目依賴
├── tsconfig.json # TypeScript 配置
├── vite.config.ts # Vite 構建配置
└── README.md # 本文件
在開始之前,請確保你的系統已安裝以下軟件:
git clone https://github.com/kaiserchang/stock-agent-web.git
cd stock_agent_web安裝 Node.js 和 pnpm:
# 使用 Homebrew 安裝 Node.js
brew install node
# 啟用 corepack(若未安裝 pnpm)
corepack enable
# 若 pnpm 尚未安裝,可使用 npm 安裝
npm install -g pnpm安裝 Node.js 依賴:
pnpm install或使用 npm:
npm install如果你剛新增 cors 或 @types/cors,也可以使用:
pnpm add cors
pnpm add -D @types/cors安裝 Python 依賴:
pip install -r requirements.txt或使用 pip3:
pip3 install -r requirements.txt若使用專案 Python 3.12 虛擬環境,請先啟用:
source .venv312/bin/activate依賴清單包括:
yfinance==0.2.32- Yahoo Finance 數據源pandas==2.3.3- 數據處理pandas-ta==0.4.71b0- 技術指標計算numpy==2.2.6- 數值計算
pnpm dev或使用 npm:
npm run dev預期輸出:
[OAuth] Initialized with baseURL: https://api.manus.im
Server running on http://localhost:3000/
在瀏覽器中打開 http://localhost:3000 即可看到應用。
打開應用後,你會看到「台股技術分析儀表板」主頁。
- 點擊藍色的「開始掃描」按鈕
- 系統會開始掃描台灣股市(預設掃描最近 1 個月的 20 支股票,需要至少 20 天的數據)
- 掃描進度會實時顯示在「掃描進度日誌」區域,包括:
- 待掃描、掃描中、已完成、失敗的股票數量統計
- 每支股票的掃描狀態和訊號類型
- 支援按股票代號、狀態和訊號類型進行篩選
- 掃描通常需要 2-3 分鐘完成
- 完成後,結果會自動顯示在「投資建議名單」表格中
掃描完成後,你會看到:
-
訊號統計摘要:四個卡片分別顯示不同技術訊號的數量
- 攻擊K線 ⚡
- 多頭吞噬 📈
- 黑K吞噬
⚠️ - 內困型態 📦
-
掃描進度日誌:實時顯示掃描進度
- 股票掃描狀態統計(待掃描/掃描中/已完成/失敗)
- 每支股票的詳細掃描日誌
- 支援搜尋和多維度篩選
- 自動刷新(掃描中時每秒更新)
-
投資建議名單:詳細表格顯示每支推薦股票
- 股票代號、名稱、產業
- 收盤價、技術訊號類型
- 是否在季線(60 日均線)之上
- 「查看K線」按鈕進入圖表分析
- 在投資建議名單中,點擊任意股票的「查看K線」按鈕
- 進入 K 線圖表頁面,查看該股票的價格走勢
- 圖表顯示開盤價、最高價、最低價、收盤價和成交量
-
準備 CSV 文件,格式如下:
Date,Open,High,Low,Close,Volume 2026-06-01,100.5,102.3,99.8,101.2,1000000 2026-06-02,101.2,103.1,100.5,102.8,1200000 -
點擊「上傳CSV」按鈕
-
選擇 CSV 文件並上傳
-
系統會分析你的數據並顯示技術訊號結果
- 點擊「歷史紀錄」按鈕
- 查看過去的掃描結果(保留最近 120 次)
- 點擊任意歷史記錄查看詳細結果
-
點擊「掃描設定」按鈕
-
調整以下參數:
- 掃描數量:要掃描的股票數量(預設 20)
- 開始日期:掃描的開始日期
- 結束日期:掃描的結束日期
- 訊號篩選:選擇要識別的技術訊號類型
-
點擊「保存設定」後,下次掃描會使用新的參數
# 啟動開發伺服器(熱重載)
pnpm dev
# 構建生產版本
pnpm build
# 運行單元測試
pnpm test
# 代碼格式化
pnpm format
# TypeScript 類型檢查
pnpm type-check-
編輯 Python 分析引擎:
# server/python_logic/scan_orchestrator.py def detect_new_signal(df): # 實現你的技術分析邏輯 return signal_results
-
更新後端路由:
// server/routers.ts stock: router({ startScan: publicProcedure .mutation(async ({ input }) => { // 調用新的訊號檢測函數 }), })
-
更新前端 UI:
// client/src/pages/Dashboard.tsx const signalStats = { newSignal: scanResults.filter((r) => r.signalType === "新訊號").length, };
- 在
client/src/pages/創建新組件 - 在
client/src/App.tsx中添加路由 - 使用 tRPC hooks 調用後端 API
- 使用 TypeScript 進行類型安全
- 遵循 ESLint 和 Prettier 配置
- 為新功能編寫單元測試(Vitest)
- 使用 shadcn/ui 組件保持 UI 一致性
| 訊號名稱 | 說明 | 應用場景 |
|---|---|---|
| 攻擊K線 ⚡ | 股價在成交量放大下漲幅 ≥ 3% | 強烈買入信號,最適合進場 |
| 多頭吞噬 📈 | 前一根黑K被紅K完全包覆 | 反轉買入信號,底部訊號 |
| 黑K吞噬 |
前一根紅K被黑K完全包覆 | 賣出警示信號,需謹慎 |
| 內困型態 📦 | 大K線內出現小K線 | 整理信號,力量衰退預兆 |
定義: 股價在成交量放大的情況下,出現明顯上漲的紅K線。代表多方力量的強勢表現。
識別條件:
- 漲幅 ≥ 3%
- 必須是紅K線(收盤價 > 開盤價)
- 成交量 > 5日平均成交量 × 1.5倍
投資意義: ✅ 強烈買入 | ✅ 適合進場 | ✅ 風險較低
實戰建議: 結合季線位置判斷,季線之上更安全。設置止損點在前一個低點下方。
定義: 當前紅K線的實體完全包覆前一根黑K線的實體。代表多方力量的轉折。
識別條件:
- 前一根是黑K線(收盤價 < 開盤價)
- 當前是紅K線(收盤價 > 開盤價)
- 紅K完全包覆黑K的實體
投資意義: ✅ 反轉買入 | ✅ 轉折點 | ✅ 中等強度
實戰建議: 常出現在下跌後的底部。結合技術面支撐位效果更佳。適合中期投資者進場。
定義: 當前黑K線的實體完全包覆前一根紅K線的實體。代表空方力量的轉折。
識別條件:
- 前一根是紅K線(收盤價 > 開盤價)
- 當前是黑K線(收盤價 < 開盤價)
- 黑K完全包覆紅K的實體
投資意義: ❌ 賣出警示 | ❌ 風險信號 | ❌ 謹慎持股
實戰建議: 出現時應考慮獲利了結。如已持股應設置止損。不適合新進場買入。
定義: 前一根大K線的實體內部出現一根小K線。代表市場力量的衰退和整理。
識別條件:
- 前一根是大K線(實體較大)
- 當前是小K線(實體較小)
- 小K線完全被包含在大K線的價格範圍內
投資意義: ⏸️ 整理信號 | ⏸️ 反轉預兆 | ⏸️ 中等強度
實戰建議: 出現後等待下一根K線確認方向。可作為加倉或減倉的參考。不應作為單獨交易信號。
- 季線(60日均線):長期趨勢指標
- 季線之上:股票處於上升趨勢,更適合買進
- 季線之下:股票處於下跌趨勢,應避免買進
A: 這是正常的。系統需要為每支股票下載 20 天以上的歷史數據並進行技術分析。如果想加速,可以:
- 減少掃描股票數量(在掃描設定中調整)
- 縮短掃描時間範圍
A: 請檢查 CSV 文件格式:
- 必須包含
Date,Open,High,Low,Close,Volume列 - 日期格式必須是
YYYY-MM-DD - 數值必須是有效的數字
A: 發布環境有網絡限制,無法訪問外部 API(yfinance、twstock 等)。解決方案:
- 使用 CSV 上傳功能:在本機下載股票數據,然後上傳到發布的應用進行分析
- 在本機開發環境中執行掃描:本機有完整的網絡訪問權限,可正常使用掃描功能
A: 編輯 server/python_logic/scan_orchestrator.py:
# 修改 STOCK_LIST 變數
STOCK_LIST = ['2317', '1101', '1216', ...] # 添加或移除股票代碼A: 刪除 data/ 目錄下的 JSON 文件:
rm data/scan_sessions.json
rm data/scan_results.json
rm data/scan_logs.json然後重啟應用。
系統使用本地 JSON 文件存儲數據,無需外部數據庫:
- scan_sessions.json:掃描會話元數據(時間、進度、參數)
- scan_results.json:掃描結果(最新 120 筆)
- scan_logs.json:掃描執行日誌
所有數據自動保存在 data/ 目錄中。
- 所有數據存儲在本地 JSON 文件,不上傳到任何遠程伺服器
- 支援 Manus OAuth 認證(可選)
- 代碼完全開源,可審計
Manus 發布環境特性:
- 網絡限制:無法訪問外部 API(yfinance、twstock 等)
- 解決方案:使用 CSV 上傳功能進行技術分析
- 建議工作流程:
- 在本機開發環境中執行掃描(或從其他源下載數據)
- 將結果上傳到發布的應用(使用 CSV 上傳功能)
- 在發布環境中查看結果和分析
本項目採用 MIT 許可證。詳見 LICENSE 文件。
歡迎提交 Issue 和 Pull Request!
- GitHub Issues:提交 Issue
- Email:kaiser.tienkang@gmail.com
感謝林家洋老師提供的技術分析理論基礎,以及 yfinance 社區提供的股票數據接口。
最後更新:2026 年 7 月 28 日
版本:1.0.0
系統採用精心設計的高雅配色,由金、銀、青、灰、白五種顏色組成:
- 金色(Amber):用於買進訊號和主要操作按鈕,代表積極的投資機會
- 銀色(Gray):用於中立訊號和次要元素,表示觀望狀態
- 青色(Cyan):用於風險提示和警告訊息,吸引用戶注意
- 灰色(Neutral):用於背景和邊框,提供視覺平衡
- 白色(White):用於文字和主要內容區域,確保可讀性
系統使用 -120 到 +120 的評分範圍,結合訊號強度、季線位置和成交量進行評分:
買進訊號(正分):
- 90-120 分:強烈買進 ⭐⭐⭐⭐⭐(金色深)
- 75-89 分:建議買進 ⭐⭐⭐⭐(金色)
- 60-74 分:中度買進 ⭐⭐⭐(金色淺)
- 45-59 分:溫和買進 ⭐⭐(金色淺)
- 1-44 分:輕度買進 ⭐(金色極淺)
賣出訊號(負分):
- -120 分:緊急脫手 💣💣💣💣💣(紅色深)
- -90 分:強烈脫手 💣💣💣💣(紅色)
- -60 分:建議脫手 💣💣💣(橙紅)
- -30 分:注意風險 💣💣(青色)
中立訊號:
- 0 分:觀望 -(灰色)
滑鼠懸停在推薦指數上時,會顯示詳細的訊號說明和投資建議,幫助用戶快速理解每個訊號的含義。
系統採用現代的深色主題設計,提供舒適的視覺體驗:
- 黑藍色底色:深色背景減少眼睛疲勞,適合長時間使用
- 金色主題:用於標題、主要按鈕和買進訊號,代表財富和機會
- 青色警告:用於風險提示和賣出訊號,確保用戶注意到重要警告
- 高對比度:所有文字和元素都經過精心設計,確保在深色背景下清晰可讀
系統採用現代的深色主題設計,提供舒適的視覺體驗:
- 黑藍色底色:深色背景減少眼睛疲勞,適合長時間使用
- 深灰色卡片:與黑藍色底色形成適當對比,視覺層次清晰
- 金色主題:用於標題、主要按鈕和買進訊號,代表財富和機會
- 青色警告:用於風險提示和賣出訊號,確保用戶注意到重要警告
- 高對比度:所有文字和元素都經過精心設計,確保在深色背景下清晰可讀
系統採用現代的深色主題設計,完全移除純白色,提供舒適高雅的視覺體驗:
- 黑藍色底色:深色背景減少眼睛疲勞,適合長時間使用
- 深灰色卡片:與黑藍色底色形成適當對比,視覺層次清晰
- 淺灰色文字:所有文字使用淺灰色或淺金色,避免純白色
- 金色主題:用於標題、主要按鈕和買進訊號,代表財富和機會
- 青色警告:用於風險提示和賣出訊號,確保用戶注意到重要警告
- 高對比度:所有文字和元素都經過精心設計,確保在深色背景下清晰可讀
- 跳色設計:使用淺金色和淺灰色文字,避免與背景色接近,提升可讀性
為了確保最佳的可讀性和視覺層次,系統採用了精心設計的文字顏色方案:
- 表格文字:使用黃色(#FCD34D)確保在深灰色背景上清晰可見
- 股票代號和價格:使用更明亮的黃色(#FDE047)突出重要信息
- 標籤文字:使用對比色(綠色/紅色背景 + 黃色文字)
- 標題文字:使用金色確保視覺層次
- 所有文字:避免使用純白色,確保與背景有適當的對比度
系統完成了全面的視覺優化,提供專業高雅的投資分析界面:
- 攻擊K線、多頭吞噬、黑K吞噬、內困型態:改為標題字大小(text-lg md:text-xl),白色文字標籤,黃色數字顯示
- 每個指標配有相應的圖標(閃電、上升趨勢、警告、圖層)
- 表格標題:全部改為白色文字,確保清晰易讀
- 表格數據:股票代號、名稱、產業、收盤價使用黃色文字
- 推薦指數:使用深橘色底色(Hue 30),白色文字,配合星級或炸彈圖案
- 黑藍色底色:深色主題,減少眼睛疲勞
- 深灰色卡片:與底色形成適當對比
- 白色文字:標題和標籤使用,確保清晰度
- 黃色文字:表格數據,突出重要信息
- 深橘色:推薦指數背景,代表財富和機會
- 紅色/青色:賣出訊號和風險提示
- 無純白色:所有底色和背景都避免使用純白色
完成了全面的顏色優化,確保所有文字都有足夠的對比度和視覺清晰度:
- 訊號說明按鈕:亮藍色(cyan-300),邊框和文字都使用亮藍色,確保清晰易讀
- 查看K線按鈕:橘色(orange-400),與推薦指數形成視覺呼應
- 推薦指數:深橘色背景(hsl(30, 100%, 35-55%)),白色文字,配合星級或炸彈圖案
- 背景色:黑藍色(slate-900),與 Dashboard 保持一致
- 頁面標題:琥珀色(amber-400),突出重要信息
- 技術訊號說明:白色文字(text-white),確保清晰易讀
- 訊號標籤:使用彩色邊框(紅、綠、橙、青)和相應的彩色文字
- 所有文字都與背景有足夠的對比度
- 藍色文字使用 cyan-300 或更亮的顏色,確保在深色背景下清晰
- 重要信息使用琥珀色或橘色,提高視覺吸引力
- 警告和風險提示使用紅色,便於快速識別