ELI5 · PPA 每晚分析

小哥的截圖
變成今晚的觀察名單

PPA 截圖 × 籌碼湖 × 規則卡 → 推播、記帳、追蹤

寫給 PM 與未來的維護者:先講比喻,再講精確機制。本頁所有股票範例都是虛構的(例如「9001 測試甲」),不含任何 PPA 真實清單、選股或付費內文。

1一句話

小哥每晚在付費專欄貼一疊軟體截圖;這套程式每晚自動把截圖讀成表格、拿籌碼湖核對、用小哥自己的規則卡打分,把「符合規則卡的股票」推到 Telegram,再全部記帳,之後持續追蹤。

小哥每晚丟一疊「今日菜單」照片到信箱。
抄寫員(Gemini)把照片抄成表格,查帳員(籌碼湖)逐行核對有沒有抄錯, 裁判(打分程式)拿小哥寫過的規則卡一條條比,分數夠高的才寫進今晚推薦單(Telegram)。 所有菜不管有沒有入選都抄進帳本(資料庫),之後每天回頭看它們後來好不好吃。

2為什麼要做

以前現在
每晚手動四步(抓文章→辨識→校驗→挑股),約 5 分鐘、要開電腦每晚排程自動跑,手機收推播
地板股 22:15 跑,但籌碼湖 22:40 後才有當日資料,一直推前一天的清單總控等湖就緒才跑,地板股改成當天
挑股只印在終端機,沒有紀錄所有候選(含沒入選的)全部入庫,可以事後驗證分數有沒有用
「沒收到推播」分不出是 0 檔還是壞掉每條終止路徑都推一句話

候選股從哪來

只來自當晚圖上列出、且通過校驗的股票。籌碼湖只用來打分排序,不會從全市場另外加股票。

分數能信嗎

權重還沒經過記帳驗證(要累積約 3 個月)。在那之前請把推播當「觀察順序」,不是買賣建議。

3大地圖:系統架構

總控 scripts/xiaoge/run_nightly.py 把所有步驟串起來。紅框是來源與輸出,金框用到 AI,綠框是籌碼湖。

PressPlay PPA 專欄 小哥每晚 21~22 點貼截圖 ① 抓文章 fetch_ppa_articles(cookie) ② 看圖(Gemini) ppa_list_ocr → 清單 JSON ③ 校驗 ppa_lists 逐列對湖 ④ 九家族打分 ppa_pick 純規則・不用 AI 籌碼湖 (唯讀) 價量 法人 融資 分點 集保 處置 規則卡 主手冊 +待審 A001… 先推播、後入庫 Telegram 精簡推播 DuckDB 記帳・週報 Excel 每晚一檔 雲端 D1 ppa_cloud_sync 隨身讀 ppa.html 要驗證碼才讀得到 地板股線 湖就緒 → 四步 → 先送一則 先送
圖一 系統架構:PPA 主線(中間)與地板股線(下方)共用籌碼湖與 Telegram

4每晚時間表

總控像一個守門人,22:40 起每 5 分鐘探頭看一次:「湖的貨到了嗎?小哥的文章貼完了嗎?」到了就做事,等不到就在截止時間推一句「今晚沒等到」,絕不默默消失。
每 5 分鐘輪詢一次(22:40~23:55) 21:00–22:00 小哥發文、貼截圖(時間不固定) 21:30 籌碼湖開始日更 22:32 湖:股票分點追平 22:38 湖:價格到齊 22:40 總控啟動(排程,週一~五) 同一時刻湖的法人到齊 湖就緒時 跑地板股四步 → 先送地板股 就緒=當日普通股檔數 ≥ 前一日 95% 文章完整時 抓 → 辨識 → 校驗 → 掃描 → 打分 必要三段齊全才算發完 接著 推 PPA(做多/做空/隔日放空) 推播後 入庫・記帳・Excel・上傳雲端 23:00 湖重建語意層 約 35 秒寫鎖,查詢遇鎖重試 23:30 文章截止 → 推「今晚 PPA 未發文」 23:50 湖截止 → 推「湖未更新」 23:55 全域截止,不再開新的一輪 隔天 08:00 補掃漲停價買進分點、補抓影片 週六 10:00 記帳評估+週報(存檔,不推播)
我們的程式籌碼湖截止時間
圖二 資料處理流程:湖的時間是 10-21 實測

「湖就緒」怎麼判斷

chip_lake.ready_for:價量、法人、融資三張表,當日普通股檔數 ≥ 前一交易日的 95%。不看「最大日期」——湖是分批寫的,日期出現不代表寫完;也不數全表列數——權證、ETF 每天浮動 5~12%,會誤判。股票分點另有 chip_lake.branch_ready,分點到齊才做漲停價買進掃描。

防呆

python scripts/xiaoge/run_nightly.py --as-of 2026-10-22 --force   # 手動補跑
                                     --no-notify                   # 影子模式:只算不推、不上傳
                                     --once                        # 只跑一輪

5第一步:從 PPA 抓文章

fetch_ppa_articles.py 比喻:拿會員卡(cookie)去報攤,只拿今晚新到的那份報紙。

會員身分Netscape 格式的 cookie 檔,路徑寫在 .env 的 PPA_COOKIES_FILE。程式與 Claude 都不讀它的內容,只拿來發請求。
清單 API向 PressPlay 網頁 API 逐頁要文章清單,再抓單篇的標題、發布時間、內文、圖片清單(每張圖標了屬於哪個段落)。
只抓新文每晚用 --since <當天>;已抓過且內容完整(圖片非 0 byte)的直接跳過。
--no-media晚上只抓文字和圖片,影片音訊留給隔天 08:00 的排程。
沒發完不算文章一旦出現清單段落,就必須有「關鍵分點買超股、關鍵分點賣超股、主力權證認購表」三段才算完整,否則繼續等到 23:30。
cookie 失效PressPlay 照樣回 200 但 is_login=false;程式丟 NotLoggedIn 整批停下,總控推「換 cookie」。
連續失敗連續 3 篇失敗整批停(多半是環境壞了,不要空轉)。

產出在 data/xiaoge/ppa訂閱線/articles/<日期>_<key8>/:article.json 進版控;content.html、images/、media/ 不進版控。

6第二步:看圖(Gemini 辨識)

ppa_list_ocr.py 比喻:抄寫員把每張截圖逐格抄成表格,規定是「看不清楚就留白,不准猜」。

只辨識清單類段落(開頭大盤、近期申購股不送):

段落抄出來的欄位(JSON)
主力權證認購表(1 日)
波段權證(30 日)
buy/sell:排名、代號、名稱、買賣超金額(萬)、漲跌天數、1/5 日漲幅、自營比。detail:外資/投信/自營、權證買超與賣超最多的券商、trace(所選券商、進出場柱狀圖最後 20 根、型態、信心)、庫存張數、推估損益。
四張篩選表:投信買超+籌碼偏多、投信賣超+籌碼偏空、籌碼好沿上軌、籌碼差沿下軌columns 表頭照抄;rows:代號、名稱、成交、漲幅,cells 放每一格(主1/主5/主10、位階、帶寬、維持率…)。
關鍵分點買超股、關鍵分點賣超股rows:代號、名稱、關鍵分點、買/賣方向、股價、漲跌;cells 放其他每一格。
小於地板股rows:代號、名稱、收盤、地板價、天花板價(只有畫面正在顯示的那檔有價位)。

7第三步:校驗

ppa_lists.py 比喻:查帳員拿官方帳本(籌碼湖)逐行對——代號和名稱配得起來嗎?收盤和漲幅跟官方一樣嗎?

8AI 用在哪、不用在哪

地方AI?說明
看圖辨識Gemini模型正本 llm_config.py 的 GEMINI_MODEL_ID,現行 gemini-3.8-flash;溫度 0.1;每篇約 5 次呼叫,與其他管線共用每日 100 次上限;被 429 擋會退額度重試。
校驗不用純比對籌碼湖。
打分不用純規則:可回測、可記帳、同樣輸入永遠同樣結果。
推播、記帳、追蹤不用純程式。

另一條相關但獨立的線:文章規則萃取

extract_ppa_rules.py 把 PPA 影片逐字稿萃成規則卡(每篇約 14 次呼叫),新卡先放 ppa訂閱線/rule_cards_pending/(待審),PM 並排審閱 --apply 後才併入主手冊。打分用到待審區的卡時,推播標〔未審〕。

9第四步:打分

裁判手上有一疊小哥的規則卡。每檔股票對每張卡:符合就加分、犯規就扣分或直接出局。分數夠高的前幾名才進推薦單,寧缺勿濫。

九個家族(=推播上的交易條件標題)

#家族方向
1關鍵分點買超 → 波段做多做多
2關鍵分點賣超 → 波段做空做空
3籌碼好沿上軌 → 波段做多做多
4籌碼差沿下軌 → 波段做空做空
5投信買超+籌碼偏多 → 波段做多做多
6投信賣超+籌碼偏空 → 波段做空做空
7主力權證認購 → 隔日權證賣壓放空隔日放空(附隔日劇本)
8波段權證 → 波段做多做多
9波段權證 → 波段做空做空

怎麼算分

三種標籤

〔A041〕依據的規則卡在主手冊;卡號=隨身讀題目編號,可用 #r=A041 直接打開對照。卡號來自 reader手機隨身讀/card_codes.json(只增不減;A 籌碼判讀、B 進出場、C 風控、D 權證工具、E 選股流程)。
〔未審〕依據的卡還在 PPA 待審區;審過併入主手冊後自動消失。
〔SOP〕依 SOP 欄位定義或輔助判斷給分,不是規則卡。

推播長什麼樣(虛構範例)

PPA 觀察 2026-10-xx(1/3)
▸ 關鍵分點買超→波段做多:2 檔
9001 測試甲 6 分|主5 22%(大買)〔A0xx〕;低檔+關鍵分點大買〔B0xx〕 +3 條
9002 測試乙 4 分|投信佔量連兩天 >10%+低檔〔A0xx〕;站上上彎月線〔B0xx〕〔未審〕 +1 條
▸ 籌碼好沿上軌→波段做多:0 檔
詳情:(隨身讀 ppa.html 的連結)

10籌碼湖怎麼用

chip_lake.py 比喻:籌碼湖是隔壁鄰居(另一個專案)每天整理好的官方帳本倉庫,我們只有唯讀鑰匙。

用途表(全部唯讀)
價量(原始價、漲跌停判斷)fact_price_raw
還原價(月線、布林、位置、報酬)fact_price_adj+除權息補套(load_price_adjusted)
三大法人(投信、外資、自營避險)fact_institutional_daily
融資融券fact_margin
集保戶數變化fact_shareholding
處置股fact_disposition
股票分點逐檔(連買天數、漲停價買進掃描、就緒判斷)fact_branch_daily_fallback
主力買賣超比(已算好的欄位)ml.duckdb 的 feat_chip_branch(目前缺資料)
代號名稱、交易日曆dim_universe、湖的交易日曆檔

幾個公式

月線斜率

= 月線(今) ÷ 月線(昨) − 1
全套教材 p7 與 PPA 教學圖的定義(欄位 ma20_slope1_pct)。布林上/下軌斜率同樣用 1 日比率。

主1/主5/主10/主20

=(近 N 日前 15 名分點買超 − 前 15 名分點賣超)× 100 ÷ 近 N 日成交量
PPA 教學圖定義。

投信佔量

= 投信淨買超張數 ÷ 當日成交張數。

不偷看當天

120 日區間位置、20 日均量都不含當日;布林用母體標準差(與小哥軟體帶寬相差 ±0.5 內)。

已知資料缺口
  • 股票分點 09-16~10-13 整段沒有資料;逐檔分點表 10-14 才開始每天有。連買涵蓋不到 5 個交易日就當「不知道」,不加分。
  • feat_chip_branch 的主力比自 08-26 起全空,要等湖專案決定回補路線。所以目前主力數字用圖上的;自算版本開發中(第 13 節)。
  • 湖裡沒資料的股票不當 0 分,是排除並寫原因;法人或融資當日沒更新,打分整批 [ABORT]。

11記帳與週報

ppa_store.py、ppa_ledger_eval.py 比喻:帳本只准往後寫、不准塗改;每一筆都蓋上「當時用哪一版規則」的章。

表內容
runs一晚一次執行一列(重跑是新的 run_id,不覆蓋歷史)
rows圖上每一列辨識結果(含校驗沒過的)
scored每一列 × 每個家族的打分,全量——含排除、沒達門檻、被衝突拿掉的(只記入選會有存活者偏誤)
ledger方向、進出劇本、發布/抓取時間、打分版本;評估欄位由週報回填

12隨身讀「PPA 選股追蹤」頁

比喻:推播是「今晚的便條紙」,ppa.html 是「整本相簿」——可以翻回前幾天、看某一檔後來怎樣。

13後續追蹤:三份追蹤清單 開發中

PM 2026-10-25 核准的計畫,分支 feat/ppa-watchlists 正在實作,尚未上線。以下是計畫內容,細節以合併後的程式為準。
今晚上榜的股票不一定今晚就適合做。我們幫它們各開一個觀察本,留 60 個交易日,每晚翻一次,等「時機到了」的條件出現才響鈴一次。
關鍵分點買超股 每晚全部列 關鍵分點賣超股 每晚全部列 申報轉讓 取自當晚文章 追蹤清單 watch 留到最後出現日起算 60 個交易日 每晚判斷(PPA 推播之後) 關鍵買 列入後漲 ≥5% +布林打開 量化或文章任一 關鍵賣 列入時主5 ≥0 之後主5 <0 跌幅仍 <5% 申報轉讓 主5 大賣 +月線下彎 斜率 <0 提醒加碼做多 波段空單訊號 波段做空訊號 PPA 追蹤提醒(另一則推播) 每筆只提醒一次・只送指定聊天室 Excel 「追蹤清單」工作表 ppa.html 追蹤清單視圖 虛線:清單與提醒也能在 Excel 與 ppa.html 查看
圖三 後續追蹤流程(開發中)

五個階段

階段內容
0修正「連續」欄誤讀(第 14 節);連買天數改用湖自算、遇資料缺口算中斷;記帳帶入辨識 prompt 版本。
1自算主力比:從分點逐檔表算主1/5/10/20,窗口內缺任何一天就回「不知道」;校準閘門拿圖上數字比對命中率,不夠準就停發依賴它的提醒並推一句警告。
2追蹤清單入庫:新表 watch 與只增不改的 watch_events;兩張關鍵分點表的全部列都入清單,申報轉讓取自文章;已在清單上只更新最後出現日。
3每晚判斷,另起一則「PPA 追蹤提醒」推播,每筆只提醒一次。
4Excel 加「追蹤清單」工作表;雲端多一張 ppa_watch 表,ppa.html 加「追蹤清單」視圖。

提醒條件與對照卡

清單觸發條件對照卡
關鍵買從列入日收盤算起報酬 ≥5%,且布林打開(量化:上軌斜率 ≥1% 且 5 日前帶寬 <6%;或當晚文章把它列在「籌碼好沿上軌」,任一即可)→ 提醒加碼做多A041、B001、B129、A211
關鍵賣列入時主5 ≥0(主力還在買),之後主5 轉負,且從列入日算起跌幅仍 <5% →「關鍵賣+主力跟著賣」波段空單B093、B115、A008
申報轉讓主5 達到「大賣」門檻,且月線斜率 <0 → 波段做空B142、A022、A140

主5 優先用當晚清單圖上的值,沒有才用湖自算值。提醒與主推播用同一個收件規則,失敗只記警告、不影響主推播;影子模式只存檔不送。

14錯誤修正:「連續」欄不是連買天數

我們把菜單上的「老店 12 年」看成「連續 12 天都有人點」,然後告訴你「這道菜連續熱賣 12 天」。其實它只是老店。
  • 錯在哪:關鍵分點表有一欄「連續」,程式原本當成「關鍵分點連續買超天數」,推播寫出「某分點 連買 12 天」之類的理由。
  • 真相:PPA 教學圖寫「連續年=連續配發現金股利年數」,表上這欄也和殖利率、除息日排在一起。
  • 證據:10-22 影子推播的「連買 12 天」,用籌碼湖分點資料實查:前一天淨賣、當天淨買,實際只連買 1 天;同晚另外兩檔也一樣。
  • 連帶 bug:湖自算的連買天數原本只看「有資料的日子」,會跨過 09-16~10-13 的缺口把兩段接起來多算。
  • 修正(進行中):「連續」欄不再計分(只顯示為配息年數);連買一律用湖自算、照交易日曆數、缺資料的日子算中斷;用影子模式重跑 10-22,舊的訊息存檔會被取代。記帳庫只增不改,新版本號自動和舊結果分開。

15隱私邊界

東西放哪能公開嗎
截圖(帶會員 uid 浮水印)、付費內文、逐字稿本機 ppa訂閱線/articles/…否:不進版控、不上雲、不進備份
辨識清單、關鍵分點清單、隔日沖分點本機 lists*/、key_branches/、day_trader_branches/否
記帳庫、Excel、訊息存檔、週報本機 ppa訂閱線/ppa_watch/否
每晚入選與理由雲端 D1只有登入才讀得到;不進靜態頁、不進版控
推播Telegram 指定聊天室只有文字(代號、名稱、分數、理由、卡號),不附圖、不引內文

16常見問題

為什麼不 22:15 就推?

籌碼湖 22:40~23:00 才有當日資料。太早跑只會拿到前一天的資料(以前的地板股就是這樣一直晚一天)。

推播上的分數可以直接照著買嗎?

不行。權重還沒經過記帳驗證,現在只是「觀察順序」。記帳累積約 3 個月後看週報才知道哪些家族、哪些卡有效。

〔未審〕是什麼?

依據的規則卡還在 PPA 待審區,PM 審過併入主手冊後標籤會自動消失。

為什麼有的家族寫「0 檔」?

當晚那段沒有股票達到門檻。這是「有算、結果是 0」,跟「沒算」不同(沒算會推原因)。

同一檔同時出現在做多和做空?

會被兩邊都拿掉,推播第一則會寫「同日多空衝突」。

AI 會不會亂挑股?

挑股完全不用 AI。AI 只負責把截圖抄成表格,而且每一列都要對上籌碼湖才算數。

辨識讀錯怎麼辦?

對不上湖的列不會進打分;整篇錯太多(>10%)整篇擋下;通過率 <90% 推播只列清單、不打分。

17沒收到推播時怎麼查

每條終止路徑都會推一句話,所以「完全沒收到」只剩幾種可能。照順序查:

  1. 今天是交易日嗎?非交易日不跑、不推。
  2. 電腦有開、排程有跑嗎?看 ppa訂閱線/ppa_watch/nightly/_run.log 和 runs.jsonl 有沒有今天的紀錄。整晚沒開機,隔天也不會有「昨晚未送達」橫幅。
  3. 狀態檔說了什麼?看 nightly/state_<日期>.json:每一步的結果、已送集合、錯誤訊息。
  4. 排好了但沒送出?nightly/<日期>/msg_*.txt 在=是 Telegram 送失敗;下一晚第一則會補「昨晚未送達」。手動補推:run_nightly.py --as-of <日期>(接續、只補送沒送的)。
  5. 收件聊天室對嗎?.env 有 TELEGRAM_ALERT_CHAT_ID 就送那裡;沒設則送白名單 TELEGRAM_ALLOWED_CHAT_IDS 的第一個;兩個都沒設才不送。
  6. 只收到地板股、沒有 PPA?正常會另外收到「未發文」「換 cookie」「額度用完」「辨識失敗」「校驗失敗」之類的一句話,照那句話處理;cookie 失效就換 PPA_COOKIES_FILE 指的檔案。
  7. 收到「湖未更新到 <日期>」?籌碼湖當晚漏跑或很晚才完成,是湖專案的事;之後用 --as-of <日期> --force 補跑。
  8. 還是不知道?影子模式重跑看完整輸出:python scripts/xiaoge/run_nightly.py --as-of <日期> --force --no-notify --once。

18檔案地圖(給維護者)

檔案做什麼
scripts/xiaoge/run_nightly.py每晚總控(純函式狀態機 next_action+薄迴圈)
start-nightly.bat排程進入點(工作排程器 xiaoge-nightly,週一~五 22:40;2026-10-26 建立,目前是影子模式 --no-notify,只存檔不推播,確認兩晚後才拿掉)
fetch_ppa_articles.py、ppa_client.py抓文章、PressPlay API、NotLoggedIn
ppa_list_ocr.py截圖 → 清單 JSON(Gemini;備援 Claude)
ppa_lists.py對湖逐列校驗
ppa_pick.py九家族純規則打分、衝突移除
day_trader_branches.py漲停價買進分點掃描(隔日沖分點)
ppa_key_branches.py小哥關鍵分點清單辨識與校驗
chip_lake.py籌碼湖唯讀轉接層(就緒判斷、還原價)
ppa_notify.py、notify_telegram.py推播排版、存檔補推、scrub
ppa_store.pyDuckDB 入庫、記帳、Excel
ppa_ledger_eval.py記帳評估+週報
ppa_cloud_sync.py上傳 D1
scripts/ops/reader_auth/lib/ppa_api.js、schema.sql雲端 API 與 D1 表
reader_assets/ppa.*、build_ppa_page.pyppa.html 頁面外殼
extract_ppa_rules.py文章影片逐字稿 → 待審規則卡(獨立的萃取線)
ppa_watch.py 開發中三份追蹤清單與提醒

延伸閱讀(本機文件):使用 SOP docs/PPA每日分析-使用SOP.md、計畫 docs/plans/2026-10-22-PPA每晚流程與推播-plan.md、記帳規格 docs/plans/2026-10-22-PPA記帳規格v1.md、追蹤頁設計 docs/plans/2026-10-24-PPA選股追蹤頁-design.md。Markdown 版:docs/PPA每晚分析-ELI5.md。