股票觀測站台指期 · 題材 · 美股 · 論文

MARKET RESEARCH

資料來源

每一個數字從哪裡來,以及哪些來源現在是壞的

新聞來源1 個Google News RSS(唯一的新聞來源)。「36 處引用」抄自2026-08-25 的 DATA_SOURCES.md,口徑照原文是全專案(同一句印在下方的存檔原文裡)——那一天的快照;這一格是寫死的,本站不會重新數
價量來源3 個證交所 + 櫃買 + yfinance
LLMGLM現役(2026-08-25 起);MiniMax/OpenRouter 只存在下方存檔原文裡
已知壞掉⚪ 算不出來沒有來源級的自動偵測——這一格不是「今天沒事」。2026-08-25 盤點時法人籌碼與 LLM 兩項已修復,之後沒有再盤點過;今天唯一活著的訊號是下方的 LLM 抽取哨兵,而它只看抽取這一件事。

⚠️ 這一格的題材數與題材漏斗上的不是同一個口徑,不可互比。這裡數的是當天實際送評的題材;漏斗頁的「THEME_MAP」數的是個股對照表裡有幾個題材;「情境」數的是唯一能變成建議的那一層。三者的關係見題材漏斗。

完整清單(題材獵人 repo 的 DATA_SOURCES.md 存檔原文)

展開歷史來源文件(含修復前描述)

資料來源 — 題材獵人的每一個數字從哪裡來

建立:2026-08-25。 之前沒有這份文件,「消息面從哪來」要翻 10 支程式才知道。

⚠️ 2026-09-23 稽核:這份文件有兩節已經過期(§一「只有一個來源」、 §三「目前是壞的」),而那一天的 FinMind 稽核有好幾條候選就是照著過期的 段落寫錯的。原文保留(那是當時的診斷),更正直接標在各節開頭。 當天新增的來源見 §九。

一、消息面:只有一個來源

🔴 2026-09-23 更正:這一節過期了。 scripts/theme_engine/borrowed_corpus.py (2026-09-04)已經接上第二組來源:讀 tx_forecast 輿情脈搏每小時封存的 data/raw/news_stream/(6 個來源、實測 12,141 則),並已在 premarket_brief 產線上。⚠️ 它讀的是另一個 repo 的原始封存,跨 repo 的方向要看總覽的分工。
來源端點用途金鑰
Google News RSSnews.google.com/rss/search?q=…唯一的新聞來源不需要

全專案 36 處引用,沒有第二個新聞來源。沒有接鉅亨、MoneyDJ、工商時報, 也沒有接公開資訊觀測站的重大訊息。

兩種用法,差別是整套系統的分水嶺

確認型(catalyst_monitor.py,26 條)        發現型(theme_discovery.py,6 條)
q=ABF+載板+欣興+when:1d                    q=台股 盤後 類股 when:2d
q=記憶體+DRAM+HBM+when:1d                  q=台股 漲停 爆量 when:2d
  ↑ 關鍵字就是題材自己的名字                  ↑ 只有市場結構詞,沒有題材名
  → 只可能查回它已經相信的東西                → 題材從結果裡浮出來

確認型查不到清單外的題材,這是結構決定的,不是調參數能解決的。 theme_discovery.py 有一條 _assert_queries_are_theme_free(),任何人往 廣掃查詢裡加題材名就會拋錯——因為那一行字就足以讓發現引擎悄悄退化回確認引擎。


二、價量:三個來源,涵蓋範圍差很多

來源端點涵蓋用在哪
證交所 STOCK_DAY_ALLtwse.com.tw/rwd/zh/afterTrading/STOCK_DAY_ALL上市 1,092 檔普通股theme_discovery
櫃買 OpenAPItpex.org.tw/openapi/v1/tpex_mainboard_daily_close_quotes上櫃 855 檔theme_discovery
yfinance套件手填的 20–23 檔其餘 16 支程式

⚠️ 這裡有一個會讓整個題材消失的陷阱

上櫃不可省。 2026-08-25 實測:「矽晶圓」的兩大主角 環球晶(6488)、中美晶(5483) 都在櫃買。只抓上市的話,這個題材永遠 只湊得到台勝科一檔,而共動檢定要求 ≥2 檔——整個題材會被判定不成立, 而且沒有任何錯誤訊息。

而現有的 16 支程式用的是 yfinance 加手填的 20–23 檔清單, 連上市都沒抓全,更不用說上櫃。那份清單就是題材永遠只有那幾個的 另一個原因。


三、法人籌碼:目前是壞的

🔴 2026-09-23 更正:這一節過期了。 market_data.py 的欄位名已改成 證券代號,data/institutional.db 存在而且每天更新。當天另外修了三件事: * 交易所會事後修正個別股票:「列數夠了」不等於「是最終版」。 institutional 與 chip_flow 在 09-07→09-21 每天有 14–59 檔對不上, 兩張表各自存了不同時間抓到的版本。現在每天複查最近 5 個交易日 (backfill_institutional(recheck=5)、chip_flow_backfill --recheck 5)。 * 上櫃融資融券原本一列都沒有(918 檔),改用櫃買 margin/balance?date= 補上(免費、吃日期參數),chip_flow_backfill.fetch_margin 同一支腳本產生。 * 板塊看板的歷史從 42 天延伸到 230 天:sector_flow_build.flow_rows() 有 institutional 的日子用它,舊日子取 chip_flow(同源,逐列驗過)。
來源端點狀態
證交所 T86twse.com.tw/rwd/zh/fund/T86❌ 爬蟲欄位名寫錯

market_data.py:77 用 股票代號,但 T86 的實際欄位是 證券代號 → KeyError → 被 except Exception 吞成空 DataFrame → 上層當成 「今天沒資料」→ data/institutional.db 檔案根本不存在 → 查詢一律回 0 → check_beta_tech 的 total_buy > 0 永遠是 False。

使用者看到的訊息是「法人淨買超=0」,讀起來像「查到了,只是法人賣超」, 實際上是爬蟲從來沒成功過。

專案其他地方(vault_manager.py、citation_verifier_plus.py)用的都是 證券代號,只有 market_data.py 用錯。


四、LLM:三家,都要金鑰

來源端點用途
MiniMaxapi.minimax.io / api.minimaxi.chat新聞情緒、催化劑抽取、深度研究
OpenRouteropenrouter.ai/api/v1備援

⚠️ LLM 抽取的成功率很低,但 log 標 ✅

2026-08-24 的 daily_bot.log 實際內容:

✅ 有效:9/10   α均:0.0  β均:0.0 | ⚠️解析失敗5則
✅ 有效:5/16   α均:0.0  β均:0.0 | ⚠️解析失敗11則   ← 69% 失敗
✅ 有效:5/12   α均:0.0  β均:0.0 | ⚠️解析失敗7則
✅ 有效:5/13   α均:0.0  β均:0.0 | ⚠️解析失敗8則

合計 31 則解析失敗,而且每個主題的 α均 與 β均 都是 0.0 (代表 alpha/beta 抽取整組沒有產出可用值)。但動態分照樣移動 (↑+1.00、↑+0.50)並直接決定最終排名。

這份 log 從頭到尾沒有一個 ❌ 或 Error,結尾是「✅ bot 全鏈路完成」。 ✅ 在這個系統裡不代表成功。


五、每個數字的血統一覽

數字真正來自哪裡可信嗎
prob_boom「暴漲機率 95%」min(題材催化劑 × 10, 95),而催化劑上游 clamp 在 10.0❌ 不是機率。同題材下每檔股票拿到一樣的值,與個股無關
題材熱度catalyst_snapshot 經 theme_bridge 子字串比對❌ 12 個題材只有 1 個對得上,其餘 11 個拿寫死的預設 5.0
catalyst_strengththeme_simulator_v3.SCENARIOS 的寫死常數❌ 9.0 / 9.5 / 8.5…與今天的消息無關
RSI / KD / ATRyfinance 近 90 日 K 線⚠️ 抓不到時曾填 50(2026-08-25 已修成排除)
進場價yfinance 當日收盤⚠️ 資訊上合法,但 bot 15:40 才跑,這個價格買不到
目標價entry × 1.12,6 個情境同一組常數⚠️ 「按題材持有期計算」實際上是常數
停損價entry − ATR × 2.0✅ ATR 來自預測日前 14 根,無洩漏
結算報酬yfinance 第 5 個日曆日最近的交易日收盤⚠️ 不是交易日,4 個批次落在週末
watchlist 題材廣掃新聞 ∩ 全市場價量異常 ∩ 共動✅ 每筆都附證據標題與個股

六、發現引擎的判準(寫死在程式裡,不是可調參數)

價量異常     成交值前 300 名  且  當日漲跌 ≥3%
共動檢定     ≥2 檔同向異常個股      ← 這是靈魂
詞頻證據     全語料出現 ≥2 次       ← 過濾跨界碎片
大盤總覽文   排除(不用來連結個股)  ← 內容標記,非「點名幾檔」的任意門檻

為什麼共動檢定是靈魂:只有詞頻異常會變成詞雲—— 「可以加碼這些類股」「富達點名2大抗震族群」這種句子也會被抽出來。 題材的定義就是「一群股票一起動」,所以候選必須落地到個股、而且不只一檔。 單一檔股票的新聞是個股消息,不是題材。

實測 2026-08-25:候選 9 個 → 通過 3 個,其中「矽晶圓」是現有 12 個 THEME_MAP 完全沒有的,而它當天有 2 檔同向 +8.63%。


七、發現引擎刻意不做的事

× 不寫入 THEME_MAP / SCENARIOS / catalyst_snapshot——只產出觀察名單
× 沒有基準期時不硬報「異常升溫」,誠實說「基準建立中」
× 抓不到資料不填預設值(這個專案已因此出過兩次事:結算寫 0.0、推薦填 RSI=50)
× 廣掃查詢不得含任何題材名(有結構性檢查擋著,不是靠自律)
× 上櫃失敗時不靜默降級成「只有上市」,會明說涵蓋率不完整

八、題材分類參考:Yahoo 財經(2026-09-01 新增)

來源端點內容金鑰
Yahoo 股市分類頁tw.stock.yahoo.com/class/ 及各 class-quote 頁概念股 101、電子產業 35、上市/上櫃/集團股共 304 個分類;概念股與電子產業含成分股不需要

抓取:yahoo_theme_catalog.py,快取 7 天(data/theme_discovery/yahoo_theme_catalog.json), 由晉升檢核(daily_bot 第 10/11 步)在過期時自動重抓,約 1.5 分鐘。

定位:參考資料,不是裁判。 它的分類對新題材是落後的(2026-09-01 實測: CCL、CPO、散熱、視力保健都查無對照,卻有 HomePod、Apple iTV 這種過時條目)。 用途只有兩個: 1. 晉升報告的同義正名註記(「低軌衛星」→「衛星/低軌衛星」); 2. 人工晉升時的成分股參考(每分類前 30 檔代表股——SSR 截斷,offset 無效,實測見 yahoo_theme_catalog.py 模組說明)。

不參與 R1~R5 / P1~P3 任何門檻判定,也不餵進發現引擎的查詢(那會違反 「廣掃查詢不得含題材名」的結構性檢查)。


九、2026-09-23 新增的來源(FinMind 稽核之後)

原則:能用免費官方來源就不用 FinMind。Sponsor 訂閱 2026-10-22 到期, 日更的東西到期後還要能跑;而且同一張表有兩個產生腳本是漂移的溫床。

用途來源端點10/22 之後
除權息還原證交所exRight/TWT49U?startDate=&endDate=照跑
除權息還原(上櫃)櫃買bulletin/exDailyQ?startDate=&endDate=照跑
處置期間證交所announcement/punish?startDate=&endDate=照跑
處置期間(上櫃)櫃買bulletin/disposal?startDate=&endDate=照跑
上櫃融資融券櫃買margin/balance?date=照跑
官方漲停價FinMind TaiwanStockPriceLimitSponsor凍結
市值FinMind TaiwanStockMarketValueSponsor凍結

FinMind 的取數在 scripts/theme_engine/finmind_client.py,規矩照抄 tx_forecast: 金鑰由使用者自己放、程式只讀不印(這份文件會被公開頁面顯示,所以不寫位置); 429/402/IP 封鎖就停手不重試 (額度是整台機器共用的,2026-09-22 平行探針把 IP 打進封鎖過 30 分鐘)。 到期後 tradability.py 不會失敗,只會記 frozen_since, 讀取端遇到沒有資料的日子一律說 unknown,不說「沒有漲停」。

新增的衍生帳(原帳一律不動)

檔產生內容
data/theme_discovery/discovery_outcomes_resettled.jsonlresettle_discovery.py(第 16b 步)修掉 10 天上櫃錯位(7,617 格)+除權息還原,每日全量重算
data/theme_discovery/resettle_report.json同上三種口徑並列(原帳/只修錯位/錯位+除權息)
scripts/theme_engine/path_outcomes.jsonlpath_outcomes.py(第 6b 步)停損/達標改看路徑,跳空出場用開盤價
data/tradability.db、data/tradability_run.jsontradability.py(第 16a 步)處置期間、官方漲停價、市值

⚠️ price_history.json 的單日快照會被同日重跑覆蓋(cache[trade_date] = …), 所以它不完全是 point-in-time:2026-09-09 那天被重寫過,原帳 6 筆出場日是 09-09 的結算因此與現在的快取對不上。這一條記下,這次沒有改。

休市日曆(2026-10-01)

證交所公開資料 holidaySchedule(免費、官方)→ scripts/theme_engine/trading_calendar.py,封存在 data/raw/twse_holidays/(內容有變才另存新檔)。清單裡「開始交易日」「最後交易日」是開市日, 名稱帶「無交易」與其餘假日才是休市。三態:開市/休市/不明(抓不到或沒涵蓋那一年)。 寫帳的腳本(預測記錄、題材發現、降級檢核、動能報告)休市日不寫;已在帳上的假日列讀取時過濾。 颱風假等臨時休市不在清單內。

版本 5f92ccf(第 163 次提交,2026-10-14) | 資料建置於 2026-10-14 10:30 UTC | 行情與研究結果供查看;會員可管理觀察清單並要求更新個股分析