Building an AI-Assisted Stock Prediction System
「我要的是能賺錢的預測,不然做系統幹嘛?」
從過度相信 AI,到理解資料、濾網
與模型比「會講話」更重要
內容目錄
做這套系統時,想法其實很直接。
既然要做股票預測系統,當然希望它能提供有用的判斷,而不是只產生一堆看起來很專業、實際上無法行動的分析文字。
最常對協作 AI 說的一句話是:
「如果不能幫助判斷,做這個系統到底要做什麼?」
但開發過程很快就發現,真正困難的從來不是叫 AI 寫出一個看似完整的分析頁面,也不是讓模型生成買進、賣出或觀望的建議。
困難的是,系統裡的資料到底是不是真實的、是不是即時的、是不是完整的,以及每一個判斷背後是否有合理的條件。
早期版本曾經過度相信 AI。
以為只要模型夠強、提示詞寫得夠詳細、系統裡加入更多指標,預測自然就會變準。但幾次失敗後才慢慢理解,AI 最危險的地方,不一定是它不知道答案,而是它可能在資料不足、資料錯誤或條件不完整時,仍然給出一段聽起來很有道理的答案。
這也是許多 AI 工具常見的現實。
系統通常會提醒「AI 可能出錯」,但真正的問題是:如果資料來源、資料時間、篩選邏輯與模型條件沒有設計好,再流暢的介面、再漂亮的結論,都只是把不可靠的資訊包裝得更像答案。
因此,這套系統的方向開始改變。
它不再追求讓 AI 看起來像一位無所不知的投資專家,而是嘗試建立一個能整合真實市場資料、過濾明顯風險、整理訊號並協助判斷的分析系統。
目前這個版本暫時稱為「準準準 7.0」本來是想用散戶AI股票預測…但不夠呼口號感 哈。
它不是保證獲利的工具,也不應被視為投資建議。市場本來就充滿不確定性,再完整的模型也可能失準。
但這個系統希望做到一件更實際的事:
把雜訊減少,把資訊整理清楚,讓判斷不只建立在感覺上。
AI預測個股漲跌的實際準確率約在 52% ~ 57% 之間(接近隨機猜測)
散戶AI股票預測真正要準,不能只靠 AI,必須串聯真實資料
早期系統雖然可以生成分析,但資料來源常常不夠完整。
有些數據是暫存資料,有些是測試資料,有些指標甚至被寫死在程式中。這種做法可以用來驗證介面和流程,但無法用來做真正的市場分析。
因為股票市場的變化不是固定的。
成交量、法人動向、融資融券、借券變化、營收、獲利、新聞情緒與題材熱度,都會隨時間改變。只要其中一個關鍵資料失真,後面的模型與結論就可能一起偏掉。
因此,這版系統開始整合較完整的分析維度,包括:
- 爆量倍數
- 成交量與流動性
- 外資買賣超
- 投信買賣超
- 自營商買賣超
- 法人連續買賣天數
- 融資融券變化
- 借券賣出異常
- EPS
- 本益比
- 營收成長
- 新聞情緒分數
- 市場題材與關鍵字
- 單日漲跌幅與乖離風險
這些資料不會直接保證預測正確,但至少能讓系統避免只根據單一訊號做判斷。
例如,成交量突然放大不一定代表行情啟動;法人買超也不一定代表股價一定上漲;新聞情緒正面,更不代表市場已經反映或未來一定會持續上漲。
真正重要的不是找到一個「神奇指標」,而是理解不同資料之間的關係,以及哪些條件需要被排除。
開發過程踩過的幾個大坑
這套系統從初期版本走到現在,過程中遇到的問題其實很典型。
有些是資料工程問題,有些是金融資料本身的時間差,有些則是程式邏輯與系統效能問題。
也正是這些錯誤,讓系統從一個看起來很會分析的 Demo,慢慢變成比較接近可用工具的樣子。
API 時間差造成的「消失籌碼」
系統初期最困擾的問題,是盤中掃描時,外資、投信、自營商與融資券等資料會突然全部變成 0。
第一時間很容易以為 API 壞掉、程式抓錯欄位,或資料來源中斷。
後來才發現,問題不在程式,而在資料更新時間。
台灣證交所不同資料的更新時間並不一致。例如,三大法人買賣超資料通常需要等盤後一段時間才會完整更新,融資融券相關資料也可能更晚才公布。
如果系統在資料尚未更新時直接抓取當日數字,就會把空白資料誤判為 0。
這會造成很嚴重的問題。
原本外資連續買超的股票,可能突然被系統判定為法人完全沒有動作;原本融資異常增加的標的,也可能因資料尚未公布而被錯誤排除。
後來加入了資料時間判斷機制。
當日資料尚未到達合理更新時間時,系統不直接使用空值,而是自動回溯前一個已完成結算的交易日資料,同時保留資料日期,避免使用者誤以為那是即時資訊。
這個改動看起來很小,但它讓整個資料層更可靠。
資料沒有更新,不代表數值為零。
這是金融資料系統中非常重要的基本原則。
冷門股的假爆量陷阱
爆量通常被視為市場關注度提升的訊號。
但系統一開始只看「今天成交量是過去平均成交量的幾倍」,很快就遇到一個問題。
一檔平常只成交 5 張的股票,今天成交 15 張,系統會判定它出現 3 倍爆量。
從數學上來看沒有錯。
但從市場流動性來看,這種訊號幾乎沒有意義。
成交量太低的標的,容易出現買賣價差大、成交不連續、價格容易被少量交易影響等問題。即使系統找到看似高倍數爆量,也不代表一般交易者能在合理價格下進出。
因此,系統後來加入流動性底線。
單日成交量未達一定門檻的股票,不再進入主要爆量排行與高優先分析清單。以目前設定來說,低於 500 張成交量,也就是約 500,000 股的標的,會被排除或標示為低流動性風險。
這並不代表低成交量股票一定沒有機會。
而是代表它們不適合被當成一般化的交易訊號,更不適合因為「爆量倍數漂亮」就直接被推到排行榜前面。
系統需要的不只是找到異常數字,而是判斷這個異常是否有市場意義。
全市場掃描帶來的效能問題
一開始的想法很理想。
既然系統可以抓資料,那就把市場上所有股票都掃過一次,找出最值得注意的標的。
但實際執行後才發現,當系統同時處理大量股票的歷史成交量、法人資料、基本面資料、新聞內容與情緒分析時,運算時間會迅速拉長。
如果再把每一檔股票都送進大型語言模型進行新聞摘要與情緒判讀,系統不只會變慢,也可能遇到 API 額度、成本與回應不穩定等問題。
因此,後來改成分層篩選。
第一層先用較快、成本較低的規則處理,例如:
- 成交量是否達到最低門檻
- 是否出現異常爆量
- 是否有法人明顯買賣超
- 是否有融資、借券或價格異常
- 基本面是否存在明顯風險
通過第一層篩選後,再針對排名較前面的標的做更深入分析,例如新聞情緒、題材整理與模型預測。
目前主要將深度分析範圍控制在 Top 20 或 Top 30 左右。
這樣做不是因為市場只有 20 或 30 檔股票值得看,而是因為系統需要先把有限的運算資源用在相對有訊號、也相對有流動性的標的上。
準準準 7.0 的四大核心引擎
目前的系統不再只是抓籌碼資料、排序後顯示結果的工具。
整體架構逐漸朝向「資料採集、訊號分析、風險過濾、模型預測」四個層次發展。
全自動資料採集引擎
系統首先需要一個能穩定處理不同來源資料的基礎層。
目前整合的來源包括:
- 台灣證券交易所盤後資料
- Yahoo Finance 與 yfinance 市場資料
- Google News RSS 新聞來源
- 個股財務與估值資料
- 法人買賣超與籌碼變化資料
- 融資融券與借券相關資料
這一層的工作不只是把 API 串起來。
還需要處理資料格式差異、交易日判斷、更新時間、空值、重複資料、股票代碼對應與來源錯誤。
資料層沒有處理好,後面的模型再複雜也沒有意義。
AI 情緒與市場共識分析引擎
市場新聞與題材很難完全用傳統數字描述。
同一家公司可能因為獲利成長、接到新訂單、法說會內容、產業政策、供應鏈事件或市場傳言而受到關注。這些資訊通常散落在大量新聞、公告與討論內容中。
系統目前使用大型語言模型協助進行新聞摘要與初步情緒判讀。
透過 Llama 3.3 70B 等模型,將新聞內容整理成較短的重點,並嘗試給出 -3 到 +3 的市場情緒分數。
- -3 代表明顯負面或高風險訊號
- 0 代表資訊中性、影響不明或市場反應有限
- +3 代表較明顯的正面訊號或市場關注度提升
這個分數不是預測股價的答案。
它比較像是把原本難以量化的新聞面資訊,轉成可以與成交量、籌碼、基本面和技術指標一起比較的特徵。
大型語言模型在這裡的角色,不是當投資顧問。
它更像是一個快速整理大量文字資訊的研究助手。
新聞內容仍可能有偏誤、延遲、重複或誤導性,因此情緒分數不應單獨使用,而必須搭配其他資料一起判斷。
防雷濾網與風險排除機制
系統發展過程中,一個很重要的理解是:
高勝率訊號不一定等於可交易訊號。
有些標的可能因為資料條件看起來很漂亮而被模型挑中,但實際上流動性太低、基本面風險過高、短期漲幅過大,或籌碼結構不穩定。
因此,系統加入了一系列防雷條件。
流動性過濾
成交量不足的股票,即使出現高倍數爆量,也可能只是少量成交造成的統計現象。
系統會排除或降低低流動性標的的優先度,避免排行榜被冷門股票占據。
基本面風險檢查
系統會參考 EPS 與本益比等基本面資訊。
當公司處於虧損狀態,或估值明顯偏高時,系統不會直接判定不能交易,但會降低預測分數,並顯示風險提醒。
- EPS 小於 0
- 本益比高於設定門檻
- 營收或獲利趨勢明顯惡化
- 基本面資料缺失或過期
這些條件不代表股價一定下跌。
市場上也存在高成長、高估值或短期轉機型公司。但若系統要提供較保守的分析,這些風險不應被忽略。
過熱與乖離保護
單日急漲的股票常常吸引注意力,但也可能伴隨短線獲利了結、波動放大與追高風險。
系統因此加入價格乖離與單日漲跌幅的冷卻機制。
當股價在短時間內出現過大漲幅,系統會降低追價型訊號的分數,提醒市場可能已經提前反映部分利多。
這不是判定股票不能再漲。
而是避免系統只因為看到大量正面訊號,就忽略短期風險。
動態量化預測模型
系統目前以 XGBoost Pipeline 作為其中一個主要預測架構。
XGBoost 適合處理多種結構化特徵,例如成交量變化、法人買賣超、價格波動、基本面數據、新聞情緒與市場狀態。
輸入特徵可能包括:
- 爆量倍數
- 成交量與流動性
- 法人連續買賣天數
- 外資、投信、自營商買賣超
- 融資融券變化
- 借券賣出異常
- 單日漲跌幅
- 技術乖離
- EPS 與本益比
- 營收成長
- 新聞情緒分數
- 題材與產業關聯性
模型的目的,不是宣稱能預知市場,比較合理的定位是:根據過去資料與目前條件,估計某些市場情境下出現特定結果的相對機率,並協助將標的排序。
不同市場的結構不完全相同,因此系統也嘗試採用不同權重,台股較容易受到法人籌碼、投信作帳、產業題材與本地市場結構影響;美股則可能更受到財報、產業趨勢、政策、宏觀數據與國際新聞情緒影響。
因此,不適合用完全相同的固定公式處理所有市場,目前系統會依市場特性調整資料權重,但這些權重仍需要持續回測、觀察與修正。
系統目前提供的幾種分析視角
除了預測分數外,系統也提供幾種不同用途的資訊整理方式。
高優先觀察清單
系統會根據流動性、基本面、籌碼、價格狀態與模型訊號,整理出相對值得進一步研究的標的。
台股與美股採用不同的評分與篩選門檻,避免因市場特性不同而使用不適合的單一標準。
這份清單的意義不是「保證會上漲」。
比較合理的使用方式,是將它視為研究起點,進一步檢查公司基本面、新聞內容、技術位置、財報、產業狀況與個人風險承受能力。
爆量排行
爆量排行用來找出成交量明顯高於平常水準的股票。
但系統不只看爆量倍數,也會搭配成交量絕對值、法人動向與價格波動,避免低流動性股票因為少量交易而產生假訊號。
三大法人排行
透過外資、投信與自營商的買賣超資料,可以觀察資金是否集中在特定股票、產業或題材。
但法人買賣超不是單純的買進訊號。
不同法人有不同交易目的,有些可能是避險、套利、指數調整或短期部位調整。因此,系統將法人資料視為重要參考,而不是單一結論。
融資與借券風險提醒
當融資快速增加、法人沒有同步支持,或借券賣出異常升高時,市場波動風險可能提高。
系統會將這些條件標示為風險提醒,協助使用者在市場情緒高漲時,仍保留對槓桿與籌碼結構的注意。
曾經嘗試過 AI 模擬股市專家開會,但最後砍掉了
系統開發過程中,曾經做過一個很有趣的實驗。
當時設定了不同角色的 AI 專家,模擬分析師、技術派、基本面研究員、籌碼研究員與風險控管角色,讓它們針對市場方向與個股訊號進行討論。
一開始看起來很有意思,每個角色都有不同觀點,也會互相提出質疑。整個畫面很像一場小型投資會議。
但幾次模擬後,發現它沒有真正帶來更好的結果,原因很簡單…AI 角色雖然可以生成不同立場的論點,但它們仍然依賴相近的資料、相似的語言模式與既有規則。表面上是在辯論,實際上常常只是把同一批資訊用不同語氣重複說一次。
而且,模擬出來的「專家會議」容易變得過度保守,當市場條件稍微不明確,結論往往落在「降低曝險、等待確認、停損、保留現金」這一類標準建議。
這些建議並不一定錯,但它們沒有解決最重要的問題
- 哪些資料真的值得關注?
- 哪些條件讓風險提高?
- 哪些訊號只是雜訊?
- 什麼時候應該重新檢查原本的假設?
比起讓一群 AI 專家進行看似專業的辯論,更重要的是把資料、規則、濾網與模型做好。因此,這個功能最後被拿掉,系統重新回到比較單純的核心…
- 真實資料
- 合理清洗
- 市場濾網
- 風險提醒
- 模型排序
- 人工判斷
簡單,不代表粗糙,有時候,拿掉看起來很厲害、實際上沒有增加判斷品質的功能,反而才是系統開始成熟的時候。
讓數據說話,讓 AI 協助整理,而不是替人承諾結果
開發這套系統的初衷,不是做出一個永遠正確的預測工具。
市場沒有任何系統能保證獲利,也不應相信任何宣稱能穩定預知漲跌的模型。
這套系統真正想處理的,是資訊過載與判斷混亂。
當市場上同時存在大量新聞、技術線圖、法人資料、基本面數字、社群討論與不同說法時,最需要的不是更多意見,而是更清楚的資料結構與風險條件。
「準準準 7.0」這散戶AI股票預測目前仍在持續調整。
模型權重、資料來源、篩選門檻、新聞情緒判讀與市場規則,都還需要不斷回測與修正。系統不是終點,而是一個讓資料更容易被整理、讓假設更容易被驗證的工具。
AI 可以協助處理大量資料、整理資訊與發現可能被忽略的訊號,但最後的投資決策,仍必須考慮個人的資金配置、風險承受能力、投資週期與停損紀律。
真正值得持續優化的,不是讓 AI 講得更像專家。
而是讓系統在面對真實資料、時間差、雜訊與市場風險時,仍然能提供更清楚、更誠實、更有邏輯的分析。
本文僅分享系統開發與資料分析經驗,不構成任何投資建議、買賣推薦或獲利保證。金融市場具有風險,任何投資決策應自行評估並承擔風險。

更多文章…
AI 股票預測實驗 Day 1|AI 多模型融合預測
AI 股票預測實驗 Day 2|AI 多模型融合預測
預測實驗室

發佈留言