Skip to content

Repository files navigation

台股技術分析儀表板 (Stock Agent Web)

基於林家洋老師的技術分析理論,自動掃描台灣股市投資機會的智能分析平台。

📋 專案概述

台股技術分析儀表板是一個全棧 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                       # 本文件

🚀 快速開始

前置需求

在開始之前,請確保你的系統已安裝以下軟件:

  • Node.js >= 18.0.0(下載
  • Python >= 3.9(下載
  • pnpm 包管理器(推薦,安裝指南
    • 或使用 npm:npm install -g pnpm

安裝步驟

1. 克隆倉庫

git clone https://github.com/kaiserchang/stock-agent-web.git
cd stock_agent_web

2. 安裝依賴

安裝 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 - 數值計算

3. 啟動開發伺服器

pnpm dev

或使用 npm:

npm run dev

預期輸出

[OAuth] Initialized with baseURL: https://api.manus.im
Server running on http://localhost:3000/

在瀏覽器中打開 http://localhost:3000 即可看到應用。

首次使用指南

步驟 1:訪問儀表板

打開應用後,你會看到「台股技術分析儀表板」主頁。

步驟 2:執行掃描

  1. 點擊藍色的「開始掃描」按鈕
  2. 系統會開始掃描台灣股市(預設掃描最近 1 個月的 20 支股票,需要至少 20 天的數據)
  3. 掃描進度會實時顯示在「掃描進度日誌」區域,包括:
    • 待掃描、掃描中、已完成、失敗的股票數量統計
    • 每支股票的掃描狀態和訊號類型
    • 支援按股票代號、狀態和訊號類型進行篩選
  4. 掃描通常需要 2-3 分鐘完成
  5. 完成後,結果會自動顯示在「投資建議名單」表格中

步驟 3:查看掃描結果

掃描完成後,你會看到:

  • 訊號統計摘要:四個卡片分別顯示不同技術訊號的數量

    • 攻擊K線 ⚡
    • 多頭吞噬 📈
    • 黑K吞噬 ⚠️
    • 內困型態 📦
  • 掃描進度日誌:實時顯示掃描進度

    • 股票掃描狀態統計(待掃描/掃描中/已完成/失敗)
    • 每支股票的詳細掃描日誌
    • 支援搜尋和多維度篩選
    • 自動刷新(掃描中時每秒更新)
  • 投資建議名單:詳細表格顯示每支推薦股票

    • 股票代號、名稱、產業
    • 收盤價、技術訊號類型
    • 是否在季線(60 日均線)之上
    • 「查看K線」按鈕進入圖表分析

步驟 4:查看 K 線圖表

  1. 在投資建議名單中,點擊任意股票的「查看K線」按鈕
  2. 進入 K 線圖表頁面,查看該股票的價格走勢
  3. 圖表顯示開盤價、最高價、最低價、收盤價和成交量

步驟 5:上傳 CSV 進行自定義分析

  1. 準備 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
    
  2. 點擊「上傳CSV」按鈕

  3. 選擇 CSV 文件並上傳

  4. 系統會分析你的數據並顯示技術訊號結果

步驟 6:查看掃描歷史

  1. 點擊「歷史紀錄」按鈕
  2. 查看過去的掃描結果(保留最近 120 次)
  3. 點擊任意歷史記錄查看詳細結果

步驟 7:調整掃描設定

  1. 點擊「掃描設定」按鈕

  2. 調整以下參數:

    • 掃描數量:要掃描的股票數量(預設 20)
    • 開始日期:掃描的開始日期
    • 結束日期:掃描的結束日期
    • 訊號篩選:選擇要識別的技術訊號類型
  3. 點擊「保存設定」後,下次掃描會使用新的參數

🔧 開發指南

常用命令

# 啟動開發伺服器(熱重載)
pnpm dev

# 構建生產版本
pnpm build

# 運行單元測試
pnpm test

# 代碼格式化
pnpm format

# TypeScript 類型檢查
pnpm type-check

添加新功能

添加新的技術訊號

  1. 編輯 Python 分析引擎

    # server/python_logic/scan_orchestrator.py
    def detect_new_signal(df):
        # 實現你的技術分析邏輯
        return signal_results
  2. 更新後端路由

    // server/routers.ts
    stock: router({
      startScan: publicProcedure
        .mutation(async ({ input }) => {
          // 調用新的訊號檢測函數
        }),
    })
  3. 更新前端 UI

    // client/src/pages/Dashboard.tsx
    const signalStats = {
      newSignal: scanResults.filter((r) => r.signalType === "新訊號").length,
    };

添加新頁面

  1. client/src/pages/ 創建新組件
  2. client/src/App.tsx 中添加路由
  3. 使用 tRPC hooks 調用後端 API

代碼風格

  • 使用 TypeScript 進行類型安全
  • 遵循 ESLint 和 Prettier 配置
  • 為新功能編寫單元測試(Vitest)
  • 使用 shadcn/ui 組件保持 UI 一致性

📊 技術指標說明

支援的技術訊號

訊號名稱 說明 應用場景
攻擊K線 股價在成交量放大下漲幅 ≥ 3% 強烈買入信號,最適合進場
多頭吞噬 📈 前一根黑K被紅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線的價格範圍內

投資意義: ⏸️ 整理信號 | ⏸️ 反轉預兆 | ⏸️ 中等強度

實戰建議: 出現後等待下一根K線確認方向。可作為加倉或減倉的參考。不應作為單獨交易信號。

季線判斷

  • 季線(60日均線):長期趨勢指標
  • 季線之上:股票處於上升趨勢,更適合買進
  • 季線之下:股票處於下跌趨勢,應避免買進

🐛 常見問題

Q1: 掃描速度很慢,需要 2-3 分鐘?

A: 這是正常的。系統需要為每支股票下載 20 天以上的歷史數據並進行技術分析。如果想加速,可以:

  • 減少掃描股票數量(在掃描設定中調整)
  • 縮短掃描時間範圍

Q2: 上傳 CSV 後沒有結果?

A: 請檢查 CSV 文件格式:

  • 必須包含 Date, Open, High, Low, Close, Volume
  • 日期格式必須是 YYYY-MM-DD
  • 數值必須是有效的數字

Q3: 發布後掃描功能無法使用?

A: 發布環境有網絡限制,無法訪問外部 API(yfinance、twstock 等)。解決方案:

  • 使用 CSV 上傳功能:在本機下載股票數據,然後上傳到發布的應用進行分析
  • 在本機開發環境中執行掃描:本機有完整的網絡訪問權限,可正常使用掃描功能

Q4: 如何修改掃描的股票清單?

A: 編輯 server/python_logic/scan_orchestrator.py

# 修改 STOCK_LIST 變數
STOCK_LIST = ['2317', '1101', '1216', ...]  # 添加或移除股票代碼

Q5: 歷史記錄如何清空?

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 上傳功能進行技術分析
  • 建議工作流程:
    1. 在本機開發環境中執行掃描(或從其他源下載數據)
    2. 將結果上傳到發布的應用(使用 CSV 上傳功能)
    3. 在發布環境中查看結果和分析

📄 許可證

本項目採用 MIT 許可證。詳見 LICENSE 文件。

🤝 貢獻

歡迎提交 Issue 和 Pull Request!

📞 聯絡方式

🙏 致謝

感謝林家洋老師提供的技術分析理論基礎,以及 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 分:觀望 -(灰色)

互動式 Tooltip 提示

滑鼠懸停在推薦指數上時,會顯示詳細的訊號說明和投資建議,幫助用戶快速理解每個訊號的含義。

🎨 深色主題設計

系統採用現代的深色主題設計,提供舒適的視覺體驗:

  • 黑藍色底色:深色背景減少眼睛疲勞,適合長時間使用
  • 金色主題:用於標題、主要按鈕和買進訊號,代表財富和機會
  • 青色警告:用於風險提示和賣出訊號,確保用戶注意到重要警告
  • 高對比度:所有文字和元素都經過精心設計,確保在深色背景下清晰可讀

🎨 深色主題設計更新

系統採用現代的深色主題設計,提供舒適的視覺體驗:

  • 黑藍色底色:深色背景減少眼睛疲勞,適合長時間使用
  • 深灰色卡片:與黑藍色底色形成適當對比,視覺層次清晰
  • 金色主題:用於標題、主要按鈕和買進訊號,代表財富和機會
  • 青色警告:用於風險提示和賣出訊號,確保用戶注意到重要警告
  • 高對比度:所有文字和元素都經過精心設計,確保在深色背景下清晰可讀

🎨 配色方案最終版本

系統採用現代的深色主題設計,完全移除純白色,提供舒適高雅的視覺體驗:

  • 黑藍色底色:深色背景減少眼睛疲勞,適合長時間使用
  • 深灰色卡片:與黑藍色底色形成適當對比,視覺層次清晰
  • 淺灰色文字:所有文字使用淺灰色或淺金色,避免純白色
  • 金色主題:用於標題、主要按鈕和買進訊號,代表財富和機會
  • 青色警告:用於風險提示和賣出訊號,確保用戶注意到重要警告
  • 高對比度:所有文字和元素都經過精心設計,確保在深色背景下清晰可讀
  • 跳色設計:使用淺金色和淺灰色文字,避免與背景色接近,提升可讀性

🎨 文字顏色優化

為了確保最佳的可讀性和視覺層次,系統採用了精心設計的文字顏色方案:

  • 表格文字:使用黃色(#FCD34D)確保在深灰色背景上清晰可見
  • 股票代號和價格:使用更明亮的黃色(#FDE047)突出重要信息
  • 標籤文字:使用對比色(綠色/紅色背景 + 黃色文字)
  • 標題文字:使用金色確保視覺層次
  • 所有文字:避免使用純白色,確保與背景有適當的對比度

🎨 視覺優化最終版本

系統完成了全面的視覺優化,提供專業高雅的投資分析界面:

四大技術指標展示

  • 攻擊K線、多頭吞噬、黑K吞噬、內困型態:改為標題字大小(text-lg md:text-xl),白色文字標籤,黃色數字顯示
  • 每個指標配有相應的圖標(閃電、上升趨勢、警告、圖層)

投資建議表格

  • 表格標題:全部改為白色文字,確保清晰易讀
  • 表格數據:股票代號、名稱、產業、收盤價使用黃色文字
  • 推薦指數:使用深橘色底色(Hue 30),白色文字,配合星級或炸彈圖案

顏色方案總結

  • 黑藍色底色:深色主題,減少眼睛疲勞
  • 深灰色卡片:與底色形成適當對比
  • 白色文字:標題和標籤使用,確保清晰度
  • 黃色文字:表格數據,突出重要信息
  • 深橘色:推薦指數背景,代表財富和機會
  • 紅色/青色:賣出訊號和風險提示
  • 無純白色:所有底色和背景都避免使用純白色

🎨 顏色優化最終版本

完成了全面的顏色優化,確保所有文字都有足夠的對比度和視覺清晰度:

Dashboard 頁面

  • 訊號說明按鈕:亮藍色(cyan-300),邊框和文字都使用亮藍色,確保清晰易讀
  • 查看K線按鈕:橘色(orange-400),與推薦指數形成視覺呼應
  • 推薦指數:深橘色背景(hsl(30, 100%, 35-55%)),白色文字,配合星級或炸彈圖案

K線頁面

  • 背景色:黑藍色(slate-900),與 Dashboard 保持一致
  • 頁面標題:琥珀色(amber-400),突出重要信息
  • 技術訊號說明:白色文字(text-white),確保清晰易讀
  • 訊號標籤:使用彩色邊框(紅、綠、橙、青)和相應的彩色文字

顏色對比度標準

  • 所有文字都與背景有足夠的對比度
  • 藍色文字使用 cyan-300 或更亮的顏色,確保在深色背景下清晰
  • 重要信息使用琥珀色或橘色,提高視覺吸引力
  • 警告和風險提示使用紅色,便於快速識別

About

一個基於 React 和 FastAPI 的網頁應用,用於視覺化林家洋技術分析掃描結果,並允許用戶設定掃描參數。

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages