最後更新: 2026-10-26 (UTC+8)
需求來源:docs/plans/2026-10-17-PPA專欄分析SOP.md(PM 原文+拍板對照)。
狀態:程式已完成(九家族打分、每晚總控、推播、入庫、記帳、週報);上線只差你建排程並影子試跑兩晚(見「上線步驟」)。
計畫與審查:docs/plans/2026-10-22-PPA每晚流程與推播-plan.md;記帳規格:docs/plans/2026-10-22-PPA記帳規格v1.md。
這套工具做什麼
小哥每晚在 PPA 專欄貼出一批軟體截圖。這套工具每晚自動做六件事:
- 等籌碼湖當日資料就緒(22:38~23:00 才到齊),湖就緒就先跑並推地板股清單。
- 抓小哥當晚 PPA 文章,把截圖上列出的股票辨識成清單(Gemini)。
- 逐列對籌碼湖校驗,確認辨識沒讀錯。
- 以規則卡純規則打分,九個家族各最多挑 5 檔(總分 ≥3 才列,不足就少推)。
- 推播:只有符合規則卡的股票清單、交易條件(家族標題)、分數、規則卡號碼,讓你對照小哥隨身讀規則卡。
- 入庫與記帳:所有候選列(含沒入選的)存進本機資料庫,每晚匯出 Excel,供日後自己分析;不推播。
候選股只來自當晚圖上列出、且通過校驗的股票。 籌碼湖只用來打分排序,不會從全市場另外加股票。
| 段落(圖) | 辨識 | 挑股 |
|---|---|---|
| 投信買超+籌碼偏多 | 整張表逐格 | 波段做多(#5,最多 5 檔) |
| 投信賣超+籌碼偏空 | 整張表逐格 | 波段做空(#6,最多 5 檔) |
| 關鍵分點買超股 | 整張表+關鍵分點 | 波段做多 最多 5 檔 |
| 關鍵分點賣超股 | 整張表+關鍵分點 | 波段做空/提前賣出 最多 5 檔 |
| 籌碼好沿上軌 | 整張表 | 波段做多 最多 5 檔 |
| 籌碼差沿下軌 | 整張表 | 波段做空 最多 5 檔 |
| 主力權證認購表(1 日) | 左側買賣超前 15+右側每檔的券商與分點進出痕跡(最後 20 根柱) | 隔日權證賣壓放空(#8) |
| 波段權證(30 日) | 同上 | 波段做多/做空(#9) |
| 小於地板股 | 左側清單 | 只存不挑;地板股清單另由 Bot 自己的篩選推播(先送,獨立一則) |
| 開頭、近期申購股 | 不辨識 | — |
前置條件
- 分支
feat/ppa-watch尚未 merge。merge 前要在 worktreeD:\xiaoge_distill\.claude\worktrees\ppa-watch執行,並加--data-root D:/xiaoge_distill/data/xiaoge;merge 後在主目錄執行,不用加。 .env要有GOOGLE_API_KEY(Gemini 付費層)。辨識一篇約 5 次呼叫,和其他管線共用每日 100 次上限。- 籌碼湖當天的資料要更新完。實測 10-21:21:30 開始、22:32 股票分點追平、22:38 價格、22:40 法人、23:00 重建語意層。所以每晚總控 22:40 起輪詢,不是固定 22:45 一次。
- 小哥發文時間不固定,保守估計 21:00–22:00。
每晚自動流程(run_nightly.py)
22:40 排程啟動(週一~五,勾「喚醒電腦」),每 5 分鐘一輪,全域截止 23:55
├─ 湖就緒(價量/法人/融資當日普通股檔數 ≥ 前一日 95%)→ 地板股四步 → 推「地板股」一則
├─ 湖到 23:50 仍未就緒 → 推「湖未更新到 <日期>」
├─ 抓當晚 PPA 文章(必要段落齊全才算發完;等到 23:30)
│ 沒發文 → 推「今晚 PPA 未發文」;cookie 失效 → 推「換 cookie」
├─ 辨識(失敗最多再試 2 輪;額度用完不重試)→ 校驗 → 漲停價買進掃描(分點到齊才掃)→ 九家族打分
├─ 推 PPA(做多/做空/隔日放空,依家族群拆多則並編號「(i/n)」)
└─ 之後才入庫、記帳、匯出 Excel(失敗只記警告,不影響已送出的推播)
08:00 既有排程 xiaoge-ppa-daily 另補掃前一交易日的漲停價買進、確認前前日
- 每條終止路徑都會推一句話(湖未更新、未發文、cookie 失效、額度用完、辨識失敗、校驗失敗、打分中止),所以「沒收到」只剩 Telegram 本身失敗;下一晚的第一則會補「昨晚未送達/中斷」橫幅。
- PPA 訊息與地板股同一個目的地(2026-10-26 PM 改):
TELEGRAM_ALERT_CHAT_ID優先,沒設退回TELEGRAM_ALLOWED_CHAT_IDS的第一個(第二個之後絕不送);什麼都沒設才不推。bot 與聊天室設定與籌碼湖專案共用。前提:白名單第一個是你自己的私人聊天室,否則請設 ALERT。 - 同時只會有一個行程在跑(鎖在
ppa訂閱線/ppa_watch/nightly/.lock)。手動補跑:python scripts/xiaoge/run_nightly.py --as-of 2026-10-22 --force;--no-notify只算不推(影子模式);--once只跑一輪。 - 狀態與紀錄:
ppa訂閱線/ppa_watch/nightly/state_<日期>.json、runs.jsonl、_run.log;排好的訊息存nightly/<日期>/msg_*.txt,補推只送存檔原文。 - 資料庫:
ppa訂閱線/ppa_watch/ppa_watch.duckdb(runs/rows/scored/ledger;只增不改,每筆帶打分版本);Excel:ppa_watch/excel/<日期>.xlsx。以上全部 gitignore、不上雲、不進備份。
上線步驟(你做,我沒建任何排程)
- 確認收件聊天室:
.env有TELEGRAM_ALERT_CHAT_ID,或白名單TELEGRAM_ALLOWED_CHAT_IDS的第一個就是你自己的私人聊天室(沒設 ALERT 時 PPA 會送到這個)。 - 補官方休市日:
data/twse_holidays_2026.json目前只收到 10-22 為止已確認的休市日,10-23 起到年底要補,補完把covered_until往後推;沒補時程式退回「週一~五皆交易日」並在推播加註。 - 建工作排程器
xiaoge-nightly:週一~五 22:40、勾「喚醒電腦」,執行start-nightly.bat。 - 影子兩晚:先用
start-nightly.bat --no-notify跑兩晚,核對地板股清單與手動結果;沒問題再切換。 - 切換:停用
xiaoge-floor-daily(22:15,舊流程自己推播且晚一天)。 - 週報:每週六 10:00 建
xiaoge-ppa-weekly(指令見ppa_ledger_eval.py檔頭)。週報不推播,只存成ppa_watch/reports/weekly_<日期>.txt,供日後自己看。
推播與隨身讀追蹤頁(2026-10-24)
- Telegram 精簡版:每檔一行
代號 名稱 分數|最強 2 條理由〔卡號〕 +N 條,依做多/做空/隔日放空分則,每則末尾附詳情連結。 - **詳細版在隨身讀
ppa.html**(設定頁有入口):第一次要輸入編輯權限驗證碼(與隨身讀編輯模式同一組)。清單可依日期/分數/入選後走勢/連續入選排序, 依多空/家族/標記篩選;點一檔展開全部理由與規則卡(卡號可點開對照);「個股」看同一檔在各晚的出現與走勢;每檔可標「觀察中/已進場/放棄」加備註,跨裝置同步。 - 資料只在雲端資料庫,不在公開的靜態頁;每晚推播+入庫之後自動上傳,補傳用
python scripts/xiaoge/ppa_cloud_sync.py --backfill-all。 - 上線前要你做:① 套 D1 新表
npx wrangler@4.138.0 d1 execute xiaoge-card-edits --remote --file scripts/ops/reader_auth/schema.sql; ②python scripts/ops/deploy_reader.py部署;③python scripts/xiaoge/ppa_cloud_sync.py --backfill-all補傳既有各晚;④ 手機開ppa.html確認:沒登入看不到資料、登入後看得到。
三份追蹤清單與追蹤提醒(2026-10-25)
每晚 PPA 推播後,把三種標的放進追蹤清單、追 60 個交易日(最後一次出現起算);條件成立另推一則「PPA 追蹤提醒」(每筆只提醒一次):
| 清單 | 誰會進來 | 提醒條件 | 對照卡 |
|---|---|---|---|
| 關鍵分點買超 | 「關鍵分點買超股」表全部列 | 列入日收盤起 ≥5%,且布林打開(上軌斜率 ≥1% 且 5 日前帶寬 <6%,或當晚列在「籌碼好沿上軌」)→ 加碼做多 | A041、B129、B001 |
| 關鍵分點賣超 | 「關鍵分點賣超股」表全部列 | 列入時主5 ≥0、之後主5 <0、列入起跌不到 5% → 關鍵賣+主力跟著賣 | B093、B115 |
| 申報轉讓 | 文章「申報轉讓」清單 | 主5 ≤ −20 且月線斜率 <0(月(今)/月(昨)−1)→ 波段做空 | B142、A140 |
- 主5:當晚圖上有就用圖上的;沒有才用籌碼湖分點自算(湖的現成主力比 08-26 起空,湖專案處理中),自算值每晚拿圖上數字校準(±1 點命中 80% 才採用),當晚對照值不足 3 個(含沒發文的夜晚)時沿用近 10 個交易日內最近一次合格校準;沿用的那一晚不算合格,不能再被下一晚沿用。
- 看清單:
ppa_watch/excel/追蹤清單.xlsx(一份清單一頁,每晚覆寫),或隨身讀ppa.html的「追蹤」頁(可一鍵複製代號貼到自選股 APP)。 - 手動回放:
python scripts/xiaoge/ppa_watch.py <lists JSON> --db <另一個檔>(預設只算不寫;--commit才寫)。
記帳與日後分析
- 每晚所有辨識列、所有家族的所有候選(含排除原因、命中規則)都入庫;
ledger另記方向、進出劇本、發布與抓取時間、打分版本。 ppa_ledger_eval.py週六評估:T+1 開盤進、5/10 日收盤出(隔日放空用當日開收近似);漲停買不到、跌停空不到、處置股放空、持有期未滿都不算成交;用還原價、扣成本。報告只列累積值,附統計檢定。- 規格 v1 已預先登記(
docs/plans/2026-10-22-PPA記帳規格v1.md);要改規則開 v2 並保留 v1 結果。
手動步驟(除錯時用)
1. 抓當晚文章
python scripts/xiaoge/fetch_ppa_articles.py --since 2026-10-17
- 文章存在
data/xiaoge/ppa訂閱線/articles/<日期>_<key8>/。 - 輸出若出現
[ABORT],代表 cookie 失效,要換 cookie 檔(.env的PPA_COOKIES_FILE)。 - 這支會連影片一起下載,晚上只看清單可以先略過影片,等 08:00 排程再補。
2. 辨識清單圖(Gemini)
python scripts/xiaoge/ppa_list_ocr.py --engine gemini --dir 20261015_82C72B5F
- 辨識柱狀圖改讀最後 20 根(10-22 起;舊結果只有 10 根)。約 5 次呼叫、1–2 分鐘。結果存在
data/xiaoge/ppa訂閱線/lists/<篇>.json,這個目錄不進版控。 - 已經有非空結果就跳過;要重做加
--force。 - 某一批失敗時,原始輸出會留在
lists/_debug/。 - 預設引擎已是 Gemini;備援:
--engine claude --model claude-haiku-5-5,用 Claude 訂閱額度,約 1.7 美元等值/篇。 - 額度用完會印
[ABORT]並整批停下(不燒掉其餘篇的額度);某一批缺段落時整篇不存檔,下次自動重做。
3. 校驗(對籌碼湖)
python scripts/xiaoge/ppa_lists.py
- 每篇印一行
通過列/總列。對不上的列會逐條列出原因,例如名稱讀錯、漲幅不符。 - 出現
[ABORT]時整篇不可用,原因有三種:0 列、沒有一張圖的日期是交易日、失敗超過 10%。 - 目前實測通過率 99.8%。剩下的不通過大多是冷僻字名稱讀錯,代號本身是對的。
4. 九家族挑股
python scripts/xiaoge/ppa_pick.py data/xiaoge/ppa訂閱線/lists/20261015_82C72B5F.json
約 40 秒。輸出依家族分段(共九段),每檔一行:
★ 5469 瀚宇博(元大-館前)6 分:主5 20%(大買)〔未審〕(+2);…
2023 燁輝(第一金-新興)排除:高檔(120 日區間位置 100%)…
- ★=入選:總分 ≥3 的前 5 名。不足 3 檔就少推,寧缺勿濫。
- 〔未審〕:依據的規則卡還在 PPA 待審區。卡審過併入主手冊後,標註會自動消失。
- 〔SOP〕:依 SOP 欄位定義或輔助判斷給分,不是規則卡。
- 排除:寫明原因,例如高檔、主力只是小賣、假突破、地板股、湖裡沒資料。
九家族的打分摘要(PM 2026-10-17 草案、2026-10-20 改分群計分)
逐條門檻、分數與卡號的完整版在
docs/PPA選股規格書.md;兩邊不一致以程式為準。
完整條件見 scripts/xiaoge/ppa_pick.py 的常數與 docs/plans/2026-10-17-PPA專欄分析SOP.md。
分群計分(九家族共用)
- 證據分三群:籌碼群(主力、投信、關鍵分點連續買賣、融資)不設上限;價格趨勢群(月線、上下軌斜率、位階)與位置群(120 日區間高低檔)各最多 2 分。
- 至少要有一項籌碼證據才能入選;只靠價格型態的列會標「沒有籌碼證據」排除。
- 卡片要求「條件同時成立」的,只在全部成立時給分(例如月線下彎+主力持續大賣才 +2;只有申報轉讓改成附註、不加分)。
- 月線斜率用 1 日比率(今天月線 ÷ 昨天月線 − 1),與小哥軟體一致。
- 輸出的〔SOP〕代表依 SOP 欄位定義或輔助判斷給分,不是規則卡;〔未審〕代表依據的卡還沒併入主手冊。
關鍵分點買超 → 波段做多
- 排除:高檔(120 日區間 ≥80%)、20 日均量 <50 張。
- 加分:低檔+關鍵分點大買、主5 大買/買超、主10 偏多、投信佔量連兩天 >10%+低檔、關鍵分點連買 ≥2 天+低檔、低檔+殖利率 ≥5% 且連續配息 ≥3 年(保護項,不算籌碼證據)、站上上彎的月線。
- 扣分:同日也在賣超清單、融資維持率 <120。
關鍵分點賣超 → 波段做空
- 排除:低檔(≤20%)或同日列在地板股、主力只是小賣(主5 與主10 都 > −10%)、讀不到主5/主10、均量不足。
- 加分:中高檔、高檔+主力大賣、主5 賣超、主1/主5/主10 皆負、月線下彎+主力持續大賣、投信賣超佔量連兩天 >10%、關鍵分點連賣 ≥2 天、主力賣+融資近 5 日增 ≥5%、主力大賣(主5 ≤−20%)+申報轉讓+月線下彎。
- 扣分:同日也在買超清單。
籌碼好沿上軌 → 波段做多
- 排除:主1 與主5 皆負(假突破)、均量不足。
- 加分:上軌斜率 ≥3%/≥1%、波段開布林三條件(斜率 ≥3%+位階 >8+主5 ≥10%)、主5 大買/買超、上軌上翹+主力連買 ≥3 天、月線上升、剛開布林(5 日前帶寬 <6%)、量能 ≥1.5 倍、券資比 >30%+主力買。
- 扣分:帶寬 >20%(別追價)。
籌碼差沿下軌 → 波段做空
- 排除:主1 與主5 皆正(假跌破)、地板股、均量不足。
- 加分:下軌斜率 ≤−3%/≤−1%、位階 <−8、主5 大賣/賣超、月線下彎+主力持續大賣、投信賣超佔量連兩天 >10%、主力賣+融資近 5 日增 ≥5%。
- 扣分:券資比 >30%(軋空風險)。
投信買超+籌碼偏多 → 波段做多(第 5 家族,2026-10-20 依入門指南加入)
- 排除:主1 與主5 皆負(主力沒跟)、120 日區間 ≥80%(高點)、均量不足。
- 加分:投信佔量 ≥20%/≥10%、投信佔量連兩天 >10%+低檔、主力+投信同步買、股價不在高點、月線上升。
投信賣超+籌碼偏空 → 波段做空(第 6 家族)
- 排除:主1 與主5 皆正、地板股、低檔(≤20%)、均量不足。
- 加分:投信賣超佔量 ≥20%/≥10%、主力外資投信全面賣超、投信賣超佔量連兩天 >10%、中高檔、月線下彎。
主力權證認購 → 隔日權證賣壓放空(#8,PM 2026-10-22)
- 候選:認購表「投資人買超」前 15 名。排除:所選分點是波段型或持續買入。
- 分點型態由程式依柱狀圖最後 20 根自己判斷(隔日沖/波段/剛買入/連 2 日賣出/第 1 日大賣),AI 的標籤只拿來核對。
- 隔日沖證據:柱狀圖隔日沖型且今天又買、買超券商含已知隔日沖分點(你的手動清單
ppa訂閱線/day_trader_branches/manual.csv;近 20 日漲停價買進且隔天賣出 ≥2 次)、這檔今天漲停且有分點在漲停價附近大買。總公司名不比對。 - 加分:隔日沖+自營商避險買超 +2(只有隔日沖證據 +1;只有避險買超也 +1,但標〔SOP〕)、day0 漲 ≥3% +1、買超前 5 名 +1。附隔日劇本(9:00~9:30 找空點、10 點前結束、創高停損)。
波段權證 → 波段做多/做空(#9)
- 做多:持續或剛買入的波段分點 +2、庫存推估獲利 +1、站上上彎月線 +1;隔日沖型不做多。
- 做空:連 2 日賣出或第 1 日大賣 +2、高檔(≥60%)+1、庫存獲利大且減碼 +1。
高檔出貨股(加在全部做空家族):高檔(120 日區間 ≥80% 或乖離年線 ≥30%)+主5 ≤−10%+集保戶數週增 ≥3%,三者都成立 +2。
資料來源分工:主力(主1/主5/主10、主力連買)用圖上數字;投信、外資、位置、月線、集保用籌碼湖,圖上的投信%/投信連買只拿來核對,對不上會印 ⚠。
同一檔同時入選做多與做空家族時,兩邊都拿掉(訊號衝突,寧缺勿濫)。
小哥關鍵分點清單(標準版)
python scripts/xiaoge/ppa_key_branches.py "docs/教材/權證小哥-PPA訂閱/籌碼小哥_PPA_學員QA與關鍵分點更新/關鍵分點清單_20260228"
python scripts/xiaoge/ppa_key_branches.py x --reverify # 不重新辨識,只對湖重跑校驗
- 20260228 版 448 列,424 列通過校驗(券商代號對上湖的分點資料、名稱相符);結果存
ppa訂閱線/key_branches/(付費內容,不進版控)。 - 沒通過的多為公司改名、分點更名或併入(例:券商代號 9813 湖裡叫「元大八德」)、TDR 代號。
使用時要知道的限制(2026-10-20 更新)
- 分數尚未經過記帳驗證(記帳從上線那晚開始累積)。 分群計分修掉了「光靠價格型態就入選」的問題,但權重是否有效要靠記帳累積約 3 個月才知道;在那之前請把入選名單當「觀察順序」。
- 沿下軌清單本身就是籌碼差的股票,多數列都會符合「月線下彎+主力持續大賣」,入選差異主要來自主5 大小。
- 關鍵分點連買天數只用籌碼湖自算(2026-10-25 更正):小哥表上的「連續」欄是連續配發現金股利年數(PPA 教學圖「連續年」),不是分點連買;先前誤用,10-22 影子推播的「連買 12 天」湖實查只連買 1 天。現在依交易日曆往回數,缺資料的交易日一律中斷(湖 09-16~10-13 分點有缺口);備援表涵蓋不到 5 個交易日一律當「不知道」、不加分。辨識提示詞 v2 起「連續」照抄在 cells,版本記在
runs.ocr_version。 - 圖上欄位只做值域檢查(例如主5 超出 ±100 當辨識錯、印警告);沒有跟籌碼湖逐值比對。
- 籌碼湖的價格、法人、融資任一項還沒更新到當日,挑股整批
[ABORT],等湖更新完再跑。
暫停中/尚未完成
- 歷史回補 20 個交易日(約 4 美元的 Gemini 額度):PM 2026-10-23 先暫停,排程與推播上線後再議。
- 08:00 補發前一晚未完成的 PPA 推播:沒做;手動用
run_nightly.py --as-of D --force。 - 電腦整晚沒開時,隔天不會有「昨晚未送達」橫幅(沒有前一晚的狀態檔)。
- 交接籌碼湖:另立「PPA 每日交易標的池」、權證分點當晚可用、B-168 權證日價量(稿在
docs/plans/2026-10-20-籌碼湖交接-PPA與分點.md,待你貼給對方)。
隱私
- 圖片帶會員 uid 浮水印,內文是付費內容。
images/、content.html、lists*/一律不進版控、不上雲;推播不附圖、不引內文。 - 辨識會把圖片送到 Gemini 付費層,用 Claude 引擎時則送到 Anthropic。Claude 引擎已加
--no-session-persistence,不會在~/.claude/projects留下截圖紀錄。