Portfolio Briefing

SkillDev tools

Daily portfolio briefing with 3 tiers: /briefing (quick ~1min), /briefing full (~3min), /briefing deep (~5min). Replaces daily-briefing.

Available today. Use it from your connected AI after setup.

Connect ahel once, and every AI you use reads what you have installed.

Then ask your AI: use the Portfolio Briefing skill

What this skill tells your AI

The instructions your AI receives, as published by patricksudo/fadacai-portfolio in .agents/skills/briefing/SKILL.md and read by ahel’s review.

三層結構的每日投資組合簡報,取代原 /daily-briefing

Arguments

  • /briefing → Quick(~1 分鐘)
  • /briefing full → Quick + Full(~3 分鐘)
  • /briefing deep → Quick + Full + Deep(~5 分鐘)
  • /briefing telegram → Telegram Push Tier(~2-3 分鐘)— 盤中推送專用,不跑 Phase 1-3

--send 旗標

任何 tier 加上 --send 會在 tier 執行完後:

  1. 把完整 briefing markdown 寫到 briefing-out/YYYY-MM-DD-full.md(Write tool)
  2. 把 Telegram 格式純文字寫到 briefing-out/YYYY-MM-DD-telegram.txt(Write tool)
  3. 呼叫 python3 tools/send_briefing.py YYYY-MM-DD(Bash tool)推送至 Telegram + Email
    • send_briefing.py 內部自動呼叫 generate_html.py,push HTML 到 reports repo,並在 Telegram 訊息末加上網頁連結

briefing telegram 沒有 --send 時:只寫 briefing-out/ 兩個檔案,不發送。 若需手動生成 HTML(不發送):python3 tools/generate_html.py briefing YYYY-MM-DD [--push]

執行模型建議

  • /briefing(quick)→ Sonnet 4.6(純彙整;session 已長則先 /compact
  • /briefing telegram → Sonnet 4.6(每日 launchd 自動推送,成本敏感,固定 Sonnet;週五 --codex 另走 gpt-5.5)
  • /briefing full → Opus 4.8(中等綜合 + Verdict;Phase 2 subagent 已外包 Sonnet 4.6)
  • /briefing deep → Opus 4.8(深度合成 + Codex 整合 + 機率/EV)

切換方式:/model sonnet/model opus/model fable 後執行 skill。


Step 0: 配置同步 & 倉位偵測

執行 AGENTS.md 的 Step 0 統一規範(0a → 0b → 0c → 0d → 0e)。

  • plan.md + feedback/*.md(必做)
  • 呼叫 get_account_position 取即時持倉
  • 今日 journal 不存在 → 執行 gap-fill + 變動偵測 + 自動建立 journal
  • 若偵測到的變動對應 plan.md 待辦項 → 在 Phase 1 Step 1 標記
  • 0e 第一性原理紀律:在 Quick Take 之前必須完成「市場主題 thesis / 證偽條件 / 機率分布」三題(見 AGENTS.md 0e)

Step 0.5: Macro Snapshot Load(所有 Phase / Tier 共用)

讀 cache(不打 API,所有數據由 tools/fetch_macro.py 預載到 briefing-out/cache/macro-snapshot.json):

Read briefing-out/cache/macro-snapshot.json

判定:

  • status == "ok""partial" 且 cache mtime < 36h → 使用,在 Quick Take 區前顯示 1 行:
    📊 Macro: Fed {fed_funds}% | 2s10s {value} ({regime}) | HY OAS {value} ({regime}, pct {pct_1y}%) | VIX {value} ({regime}) | regime: {regime_tag}
    
  • status == "skipped"(FRED key 缺失)→ 顯示 ⚠️ Macro snapshot unavailable (FRED_API_KEY not set) 並跳過
  • mtime > 36h → 顯示 ⚠️ Macro snapshot stale ({mtime_hours}h old) 仍使用但標記

將 5 個 series + regime_tag 內容餵給 Step 0e 與後續呼叫的 probability-honesty-checker agent(其 Step 1i 必須收到此資料)。

Step 0.55: Leading Indicators Load(所有 Phase / Tier 共用)

讀 cache(不打 API,由 tools/fetch_leading.py 預載,TTL 20h;配置 research/leading-config.json):

Read briefing-out/cache/leading-indicators.json

判定(逐 block,不整檔否決):

  • 頂層 status == "ok""partial" 且 mtime < 36h → 使用partial 時只跳過 status ∉ {"ok","partial","warming_up"} 的 block,各標 ⚠️ {block} unavailable
  • block status == "carried_forward" → 使用但標 (前日值 {data_as_of})
  • 頂層 status == "skipped" / 檔案缺失 → 顯示 ⚠️ Leading indicators unavailable,跳過所有相關段落;Deep tier 強制刷新:uv run --directory tools python3 tools/fetch_leading.py --force 後重讀;Quick/Full/Telegram 標旗即續
  • blocks.revision_delta 某 archive 窗 available == false → 顯示 ⏳ archive-diff {窗} warming up({available_from} 起可用),該窗不產生 archive decel 旗標。vendor 7d 曲線法(Fundamentals Data Feed 的 vendor_* 欄位)自首日可用decel_tickers 為兩法 union,decel_tickers_archive / decel_tickers_vendor 分列(/trade-review 各驗命中率);vendor_book 給 7d vs 30d 上修寬度對比
  • blocks.tw_monthly 各檔 history_months < 2 → accel/轉負 flags 為 null 不判定,僅列數字

在 📊 Macro 行下方顯示 1 行 🚦 儀表(所有 tier 一致,欄位缺失以 填):

🚦 先行: HY {delta_5d_bps:+}bp/5d ({velocity_flag}) | VIX期限 {ratio} ({term_flag}) | 半導體寬度 {pct_above_50dma}%>50DMA ({breadth_flag}) | 記憶體報價 {memory.n_hits}則/功率 {power.n_hits}則 | 台股月營收 {data_month} {最強檔 YoY%或 —}

gauges 另帶兩個 FMP 免費層儀表(不進一行 banner,供 full/deep 段落與 Key Alerts 引用):

  • treasury(10Y/2Y/3M/30Y + 2s10s/3m10y spread)— plan「10Y <4.35 再加滿」類閘門的即時對照
  • semis_industry_pe(半導體行業 PE 日頻 + Δ5d/Δ20d + 100 日分位)— 估值溫度計:與 revision 寬度並讀可分離「估值壓縮 vs 基本面惡化」(PE 大跌 + revision 寬度不動 = 純 de-rating)

紀律(同影子訊號 A4,記錄不阻擋): 本 cache 所有旗標為 display-only + Key Alerts 標旗,不得單獨觸發任何加減碼/harvest/否決;由 /trade-review 跑滿 ≥2 期驗命中率後才可討論升級硬閘門。

質性訊號 theta(2026-08-19 起,資訊有時間衰減): 凡引用 pricing_watch excerpt 或 cross-read leader 訊號作 prior,必附訊號 age(來源日 → 今日,格式 (N 天前));age > 14 天 → 標 🕒 stale,降為背景不作 prior(同 revision >45d stale 的質性版——每組資訊過一定時間就被 fully price-in)。來源日缺失 → 標 (age unknown) 並降權。

這份 cache 用於:

  • 本步 🚦 儀表行(所有 tier)
  • Section 4.6 財報 Cross-Read 排序(leaders → followers 讀序)
  • Section 5 強訊號對稱分類 🟠 decel 標註與 Section 12.5 飛輪檢查 revision 轉折佐證
  • Section 6 Key Alerts 的 regime-break / pricing 反轉 / 台股轉負 / book_decel 旗標
  • §9.5(Deep)訊號擷取的 pricing_watch 預過濾新聞(excerpt 即 raw_quote 候選)
  • Telegram T1 ↳ read-through 子行、T5 🚦 alerts、T8a/T8b 🚦 區塊

Step 0.6: Earnings History Load(所有 Phase / Tier 共用)

讀 cache(由 tools/earnings_history.py 預載):

Read briefing-out/cache/earnings-history.json
Read briefing-out/cache/earnings-dates.json

判定:

  • status == "ok" → 使用,後續 Section 4.5 與 Telegram tier earnings 區直接引用
  • status == "skipped" / mtime stale → 標記 ⚠️ Earnings cache stale 但仍使用最後一份

這兩份資料用於:

  • Section 4.5 Earnings Calendar 表格的 Trailing 8Q beat / avg surprise 欄位
  • Telegram tier 📅 Earnings This Week 加 beat rate 標註
  • probability-honesty-checker Step 1d「Base rate」備選來源(EODHD fundamentals-snapshot 為首選)

Step 0.65: Fundamentals Snapshot Load(所有 Tier 共用,cache-only)

讀 cache(由 tools/fetch_fundamentals.py 預載,TTL 24h):

Read briefing-out/cache/fundamentals-snapshot.json

判定:

  • status == "ok" 且 mtime < 30h → 使用,供估值區塊、probability-honesty-checker 1d/1h 使用
  • status == "skipped" / mtime > 30h / 缺失 → 標記 ⚠️ Fundamentals cache stale/missing;Deep tier 強制派 subagent 刷新,Quick/Telegram 標旗但繼續

EODHD 資料缺口處理(必守):

  • highlights.pe_ratio == 0.0peg_ratio == 0.0 → 丟棄該三錨點錨,標 (anchor unavailable),不進 Fair PE 計算
  • avg_surprise_pct 對低基期股(EPS estimate ≤$0.10)可能失真 → beat 次數可信,avg% 在機率計算中標 (unreliable-low-base) 並拉寬區間

Cache-miss fallback / Deep 強制刷新:

Agent(subagent_type="data-collector",
  prompt: "對以下全部持倉(TICKER.US 格式)呼叫 mcp__eodhd-mcp__get_fundamentals_snapshot 與
           mcp__eodhd-mcp__get_earnings_history,回傳 dict {ticker: {snapshot:{...}, base_rate:{...}}},
           不分析不合成。")

Deep tier 每次必跑(強制刷新);Quick/Full 僅在 cache miss 時派。

這份 cache 用於:

  • Section 8.5(Full/Deep) 三錨點估值表(A1 pe_ratio / A2 PEG / A3 分析師隱含 PE)
  • Quick Take 下方「💰 估值快訊」(一行,最便宜/最貴持倉 vs 公允價)
  • probability-honesty-checker Step 1d(beat base-rate 首選來源)與 Step 1h(quarterly growth → fundamental intact X/Y)
  • D2 thesis-impact 推理fair_value_before/after 重算從同一 cache 取三錨點輸入

Step 0.67: News Articles Load(所有 Tier 共用,cache-only)

讀 cache(由 tools/fetch_news.py 預載,TTL 6h):

Read briefing-out/cache/news-articles.json

判定:

  • status == "ok" 且 mtime < 8h 且 "content" in fields_available使用,P3 信號擷取(Deep tier §9.5)可讀 body
  • status == "ok""content" not in fields_available有限使用(只有 headline+sentiment,P3 只能做 headline 掃描,標 ⚠️ news body 不可用
  • status == "skipped" / mtime > 8h / 缺失 → 標記 ⚠️ News cache stale/missing,Quick/Full/Telegram 略過 P3 信號擷取,Deep tier 繼續(P3 降級為僅 SEC/逐字稿)
  • Quick / Full / Telegram tier:不讀 body,不做信號擷取;news cache 僅供 Deep tier §9.5 使用

Step 0.68: 來源訊號 Load(所有 Tier 共用,cache-only)

讀 cache(由 tools/fetch_twitter.py 預載,TTL 20h;配置私有 research/source-config.json,schema 範例見 docs/source-config.example.json):

Read briefing-out/cache/twitter-signals.json

判定:

  • status == "ok""partial" 且 mtime < 24h → 使用"partial" 標 ⚠️(部分帳號讀取失敗,仍用已讀到的貼文)
  • budget_exhausted == true → 標 💸(本輪 X API 讀取額度用盡),仍用已讀到的部分
  • status == "skipped"(無 X_BEARER_TOKENx_fetch.enabled=false)/ mtime > 24h / 缺失 → 顯示 ⚠️ 來源訊號 unavailable,跳過 §9.6 與相關 Key Alerts / Telegram 段落

單則貼文 date 距今 > 14 天 → 標 🕒 stale,降為背景不作 prior(同 Step 0.55 質性訊號 theta 規則)。

紀律(display-only,同 A4 影子 / R18 / 先行指標):

  • Tier(probation/trusted/core)完全由 tools/source_credit.py tiers 機械算出,Claude 不得手動升降
  • Probation 來源只能出現在 §9.6(Deep tier 陳列),不得作 Key Alerts / Telegram 引用來源,不得作任何 prior
  • Trusted 可作 medium confidence prior、可進 Key Alerts 🐦 行、可進 Telegram T3.5/T8a/T8b
  • Core 額外可提作試單候選背景(仍須過 R14 持有期閘 / R15 回檔熔斷 / R18 財報窗禁令等既有硬閘門,不繞過)
  • 驗滿 ≥2 期 /trade-review 前,來源訊號不得單獨改變任何 Verdict / 加減碼建議,只作背景與記錄
  • 引用即 add-claim:凡在 briefing 任何段落引用某則貼文的主張支持判斷,同一次必須 python3 tools/source_credit.py add-claim ... 登錄該主張;未登錄的引用不算數(同旗標紀律「講了要記」)

這份 cache 用於:

  • Section 6 Key Alerts 🐦 行(Trusted+、48h、has_number)
  • §9.6(Deep)來源訊號陳列表 + 信用帳統計
  • Telegram T3.5 / T8a / T8b 🐦 區塊

Step 0.7: Thesis Ledger 驗收 & 逾期掃描(所有 Tier 共用)

帳本 = research/thesis-ledger.json,工具 = tools/thesis_ledger.py(去重/碰撞/到期/過期/統計全在程式層,Claude 不手改 JSON)。

1. 取得今日到期清單(同時自動 expire sweep):

python3 tools/thesis_ledger.py due
python3 tools/ev_ledger.py resolve-due   # EV 分布到期機械驗價(零判斷,自動抓價/淨值標記),輸出直接列在 briefing
python3 tools/source_credit.py resolve-due   # 來源信用帳 view claim 到期機械驗價(同上;fact claim 只列不猜,見 2b)

回傳 {due:[...], expired:[...]}expired 是工具自動把「逾期 >30 天未驗收」轉掉的,當作無結果。

2. 對每筆 due thesis 驗收:

  • 讀該筆 trigger.metric → 知道要抓什麼(財報營收/ASP/毛利率、板塊 ETF、價格…)
  • 用既有 MCP(yfinance / earnings_history.py cache / technical 等)抓實際數字
  • 對照 thesis + falsification 判定 passed / failed / partial
  • 抓不到新數(event 觸發但財報還沒出)→ 用 reschedule 把觸發日往後推、維持 pending,絕不猜 verdict
    python3 tools/thesis_ledger.py reschedule --id <id> --to YYYY-MM-DD --reason "財報未出"
    
  • 有結論 → 先做 D2 三桶股價影響分解,再呼叫 resolve 帶結構化旗標:
    • passed:用財報後新數字重算 D1 三錨點(pe_ratio × fwd_eps 各情境) → fair_value_afterprice_impact_pct = (after−before)/before
    • failed:同上但用惡化輸入(成長減速/砍 guide) → fair_value_after 下修
    • partial:拆分 thesis 成分 vs 倍數/價格成分 → impact_decomp = "thesis +X%(基本面)/multiple −Z%(re-rate)=net −W%"
    python3 tools/thesis_ledger.py resolve --id <id> --verdict passed|failed|partial \
      --actual "實際數字" --note "判讀" --next-action "由此推出的操作" \
      --fair-value-before <float> --fair-value-after <float> \
      --price-impact-pct <float> --impact-decomp "thesis +X%/multiple −Z%=net −W%"
    
    fair_value_before/after 取自 Step 0.65 fundamentals cache 的三錨點計算;全部選填,有數就帶。

2b. facts_due 驗收流程(來源信用帳,fact 型主張)

source_credit.py resolve-due 只自動驗 view 型主張(用價格算超額 α);fact 型主張只列不猜due 回傳 facts_due 供人工核對:

  • 找官方證據(財報 / 8-K / 公司公告 / 官方數據)核對該筆 claimmetric/value
  • hit:方向對且 |actual−value|/|value| ≤ 0.5;partial:方向對但超幅;miss:方向錯;找不到對照數字 → 留 pending 不猜
  • 有結論才 resolve
    python3 tools/source_credit.py resolve --id <id> --verdict hit|partial|miss --actual "<官方數字+出處>" --confirm-date <YYYY-MM-DD>
    
  • 只列一行,不改變任何建議(同 A4 影子紀律):
    🐦 來源驗收:{source_id}@{tier} {ticker} {claim 摘要} → {verdict}
    
    無到期 fact 則略過此行。

3.(已除役 2026-07-30) 舊 naked-call-watchlist 3 閘門檢查已移除 —— 該清單為 6/5 反應式閘門時代產物(方法論 6/13 已被預掛 GTC 買梯取代),檔案歸檔至 research/archive/。樂透機會由 Section 11.5 掃描 + 價格警報器承接,不再每日讀舊清單。

4. 輸出「📋 thesis 驗收」區塊(接在 Key Alerts 後 / Quick Take 前):

## 📋 thesis 驗收
| thesis | 命題 | 實際 | verdict | 公允價 before→after | 價格影響 | → actionable |
|--------|------|------|---------|---------------------|---------|-------------|
| MU:memory-cycle | DRAM 漲價毛利率>40% | ASP +8%、毛利率42% | ✅ passed | $320→$370 | +15.6% | HOLD,加碼門檻 $XXX |
(無到期項則略過此區塊;「公允價 before→after」和「價格影響」欄只在 resolve 時填,reschedule 留空)
⏳ 逾期未驗收已歸檔:[expired 清單,若有]

驗收結果直接餵 actionable:passed → 強化/HOLD/加碼(含新公允價上修幅度);failed → 汰弱/減碼(含公允價下修多少);partial → 分解 thesis vs multiple 成分後決定操作。resolve --next-action 寫的就是下一步行動,併入 Key Alerts / 行動項。

5. SA 量化榜整合(2026-07-25 用戶指定)

  • 到期提醒:ledger 有 MARKET:sa-quant-scan-* due(或 research/sa-quant-scans/ 最新快照 >35 天)→ Key Alerts 加一行 📋 SA 量化榜掃描到期:請貼最新 screener(條件凍結),與 {最新快照日期} 基準 diff;未到期不輸出。
  • 輔助訊號引用:判讀持倉/bench 名字時引用最新快照的 quant 排名/verdict(標註快照日期,如「SA quant #1 @07-24」);快照 >35 天視為 stale 不引用
  • 管線與鐵則見 plan.md「SA 量化榜掃描機制」:榜單是儀表板非方向盤——掉榜 = revision 覆查警報(最高價值),quant 高分 ≠ 買進(必過 headroom/coverage/mandate/結構四濾網)。

Step 0.75: 影子訊號 & 交易檢討到期(所有 Tier 共用)

launchd 路徑下 tools/briefing_runner.sh 已預取此兩項;手動執行 briefing 時才需自己跑(重跑安全,有去重):

python3 tools/shadow_signals.py flag          # A4 高估旗標,記錄不阻擋
python3 tools/trade_ledger.py snapshot-orders # 在掛單快照(歸因 ground truth)
python3 tools/position_guard.py --sync-alerts --render-plan   # 持倉守門(2026-09-02 P3):R14 天數/R23 arm+警報同步/R8 GTC 缺口/>10%/檔數/財報窗/桶別缺口 → 渲染 plan.md 標記區;exit 2 = 有缺口 → 缺口逐條進 Key Alerts(不得省略)
python3 tools/trade_ledger.py orders          # 讀回:死單 + 不在 plan 的在掛單
python3 tools/rule_stats.py ledger-audit --check   # 規則帳本一致性;launchd 路徑 runner 已預跑(失敗直接推 Telegram),手動 briefing 才需自己跑;exit 2 → 違規逐條進 Key Alerts

1. A4 高估旗標(🟣 影子模式)

flag 回傳 A4vsA3 ≤ −35%self_valuation.confidence == ok 的持倉。在 Key Alerts 加一行:

🟣 A4 高估旗標(影子,不阻擋):{ticker} A4vsA3 −X%|{ticker} −Y% — 記錄中,滿 30 天由 /trade-review 計分

這一行只做記錄,不得據此改變任何建議。 A4 依 AGENTS.md 0e 仍不進 median、不進 EV。跑滿 2 期檢討才決定是否升為硬閘門(見 feedback/RULES-LEDGER.md R3)。 無旗標則整段省略。

2. 在掛單快照 + 死單偵測

snapshot-orders 每個交易日都必須跑,累積訂單登記表——這是往後把成交歸因到「系統決策 vs 自主決策」的唯一可靠來源。券商 order_status 只回在掛單,成交/取消後即消失,斷一天就有一天的成交永久無法歸因

掛單 >30 天未成交 → Key Alerts 加一行:

⚠️ 死單:{order_id} {買/賣} {ticker} {N}股 @${price}(掛 D 天)→ 重新定價或撤單

python3 tools/trade_ledger.py orders 另會標出不在 plan.md 的在掛單(plan 與券商實況脫節),一併列出。

3. 未結旗標(🔴 本書最貴的漏口,優先於其他所有 alert)

python3 tools/trade_ledger.py flags

量測結論(2026-07-25):吃掉最多回撤的機制是「已標記惡化但沒有強制出場」,自警示以來 −$6,333。 成因是旗標只活在 briefing 散文裡:TSLA 與 ON 的 thesis-ledger history 都是 0 筆,沒有任何東西在數延後次數,所以每天把同一個警示當新的重述一次。

輸出規則:

  • forced_action_required 非空 → Key Alerts 第一行,格式: 🔴 強制決定:{id} 已延後 {n} 次|自警示 {days} 天累積 −$X → 減碼 1/3 或明文撤旗(附理由)
  • overdue 非空 → ⚠️ 旗標逾期:{id}(deadline {date},逾 {n} 天)
  • post_flag_fills.buys > 0⚠️ {ticker} 在警示後仍加碼 {n} 股({dates}),損益 $X

開旗紀律(強制,這是修好漏口的關鍵): 凡在 briefing / journal 寫下 ⚠️ / 降桶候選 / 勿再向下加碼 / thesis 蒙塵 / 待覆判 的部位,同一次必須開旗

python3 tools/trade_ledger.py flag --ticker <T> --slug <kebab> \
  --reason "<警示內容>" --deadline <YYYY-MM-DD 決定到期日>

延後不是免費的,必須走 defer(會計次):

python3 tools/trade_ledger.py defer --id <id> --to <新日期> --reason "<為何還不決定>"

第 3 次延後自動轉 forced → 減碼 1/3 或明文撤旗。撤旗也要走 resolve-flag --action withdrawn --note "<為何警示不成立>"

反例存證:TSLA 7/01 標降桶候選,7/08 再提、7/09「不砍改收租」(用 PMCC 取代決定)、7/13 ledger 記 on-track,最後 −52.7% / −$6,399。若當時有此機制,7/13 就會被強制處理(標的 $425 vs 現在 $313)。

4. thesis 中途證偽掃描(不等觸發日)

python3 tools/thesis_ledger.py recheck --long-drift-only --limit 5

Step 0.7 的 due 只在觸發日驗收;recheck 補的是中間那段。列出「已過天數」最長的 5 筆,各問一句:證偽條件裡有沒有現在就看得到的已經成立?

  • 成立 → 立刻 resolve --verdict failed,不等觸發日,並進 Key Alerts actionable
  • 前提完好 → 不輸出(避免每日噪音)

quick / telegram tier 只掃前 3 筆;full / deep 掃全部長飄移筆數。

5. 交易檢討到期提醒

research/last-trade-review.txt(單行日期)。距今 >14 天(或檔案不存在)→ Key Alerts 加一行:

📋 交易檢討已到期(上次 YYYY-MM-DD,D 天前)→ 執行 /trade-review

未到期不輸出。briefing 不代跑檢討——歸因需要逐筆判斷決策來源,要用戶在場。


Phase 1: Quick(永遠執行)

1. Trade Journal Auto

若 Step 0b 偵測到倉位變化,輸出差異表:

## ⚡ 倉位變動(vs 上次快照 YYYY-MM-DD)
| 類型 | 操作 | 標的 | 變化 | 計畫對應 |

無變動則顯示「倉位無變化」。

2. Daily Snapshot

日期: YYYY-MM-DD
組合市值: $XXX,XXX (日變動: +/- $X,XXX / +/- X.XX%)
總損益: +/- $X,XXX (+/- X.XX%)
持倉: XX 檔股票 + XX 個選擇權合約

3. Today's Movers

全持倉依日漲跌%排序:

| 標的 | 股數 | 現價 | 日漲跌% | 市值 | 總損益% |

+2% 或 -2% 標記。

4. Options Status

4a. 無現股標的價格確認: 比對選擇權持倉的 underlying ticker vs 現股持倉。若 underlying 沒有對應現股(如 CRWD、DDOG、GOOGL、LRCX、TSLA、TEAM), 使用 mcp__technical-mcp__get_batch_indicatorsmcp__yfinance-advanced__get_stock_info 取得該標的目前現股價格。 在 Options Status 表格中加入「標的現價」和「距 Strike %」欄位,方便判斷 ITM/OTM 狀態。

4b. Options 總覽表:

| 合約 | 方向 | 到期日 | 剩餘天數 | 標的現價 | 距Strike% | 損益% | 狀態 |

⚠️ 標記剩餘 <14 天的合約。

4.5 Earnings Calendar Check(Technical Snapshot 前必做)

為何必要: 持倉 ticker 在 ±48h 內若有財報,technical signal(trend / momentum / RSI)會被 earnings reaction 主導,不是結構性訊號。直接套「弱勢持續 → 減碼」會在 fundamental beat 後賣在低點(PLTR 5/5 案例)。

資料來源:Step 0.6 已預載 briefing-out/cache/earnings-dates.json + earnings-history.json,直接從 cache 取,不再呼叫 MCP(若 cache 缺失或 ticker 不在,才 fallback mcp__fmp-mcp__getEarningsCalendar)。

執行步驟:

  1. 從 cache 列出未來 7 天內、或過去 48h 內有財報的持倉 ticker

  2. 對 earnings window(±48h)內的 ticker,在 Step 5 Technical Snapshot 表格的「標的」欄位前綴 ⚠️

  3. 對 earnings window 內的 ticker:

    • 不執行「弱勢持續 → 減碼」等自動規則
    • actionable 改寫為「等 N+1 個交易日 settle 再判斷結構」
    • 若強行給建議,必須先 confirm fundamental 數字(revenue / EPS / guide)方向,不能只看 price action
    • 豁免(R9 修訂 2026-08-04):財報後、預登錄的基本面 gate 行動(guide/backlog/book-to-bill 印出即執行,如 PWR 7/30 型補滿)不受 +48h 限制;被停用的只有技術訊號與即興 price-action 動作
  4. 輸出格式(必須含 base rate):

    | 標的 | 日期 | 時機 | 距 earnings | Trailing 8Q beat | Avg surprise % | 狀態 |
    |------|------|------|------------|-----------------|---------------|------|
    | NVDA | 2026-05-20 | AMC | 2d | 8/8 (100%) | +6.3% | 🔴 window 內 |
    | AVGO | 2026-06-03 | AMC | 16d | 7/8 (87.5%) | +3.4% | 觀察中 |
    

    Trailing 8Q beatAvg surprise %earnings-history.jsonbeat_count/totalavg_surprise_pct 直接讀。

  5. 若 cache status"ok" 或 ticker 不在 cache → 該欄填 (unavailable),並在輸出末尾加註 ⚠️ N tickers 缺 earnings cache(請手動 python3 tools/earnings_history.py --force)

  6. 財報叢集曝險(book 級檢查,必做)

    • 計算「未來 7 個日曆日內有財報的持倉」合計佔組合 %(權重從 Step 0b 持倉算)
    • 表格後固定輸出一行:📊 財報叢集:未來 7 日窗內持倉合計 X%(N 檔)
    • > 20% → 🔴 叢集警示(進 Key Alerts):提示 ① 該窗內 Swing Risk 🔴 / 梯級到價的認列桶倉位提前 harvest(財報前落袋,不賭 binary)② 暫停對同窗 ticker 新增曝險(現股與選擇權皆是,選擇權本有 ±48h 禁令)——此即 R18(影子計分中):每次實際擋下一個想做的加碼,同一次執行 python3 tools/shadow_signals.py block --ticker XXX --price <當時價> --size <USD> --note "<理由+財報窗>"(見 feedback/earnings-reaction-window.md C 段)③ 窗內合計曝險與各檔 beat rate 一併列出供判斷
    • 10–20% → 🟡 資訊性標註,不強制動作
  7. 財報後 7 項體檢(20 秒 checkbox,2026-08-19 起,源 research/隨手筆記59-棋局思維-earnings-cycle.md: 對過去 7 日內已發財報的持倉,各輸出一行機械 scorecard(資料源:8-K/press release + guide;缺項標 ? 不猜):

    {ticker} 7-check: Rev✅ EPS✅ RevGuide⬆️ EPSGuide➡️ Margin⬆️ Pricing✅ TAM✅ → 6/7
    

    七項 = Revenue beat / EPS beat / Rev guide raised / EPS guide raised / Margin expansion / Pricing power / TAM growing-structural。

    • ≥6/7 → 「體檢過」:作 thesis resolve 與 R9 預登錄 gate 行動的快速依據
    • ≤3/7 → 「體檢弱」:進 Key Alerts、該倉列入下次 review 覆判(不自動賣,仍走根因分類)
    • Pricing power / TAM 兩項可引用最近一次 call 的既有判讀(附訊號 age);guide 兩項權重高於本季 beat 兩項(Numbers lag:本季數字是上季 guide 的兌現,會動股價的是還沒發布的數字)

詳見 feedback/earnings-reaction-window.mdfeedback/weak-signal-root-cause.md

4.6 財報 Cross-Read(先行者 → 後行者讀序)

資料:Step 0.55 earnings_crossread.chains(鏈定義 research/leading-config.json,日期由 fetcher 解析,不打 API)。

規則:

  1. 只展開 active == true 的鏈(leader 過去 10 日已發或未來 7 日將發、或 TSMC 月營收窗 8–12 日);無 active 鏈 → 一行「本期無 active cross-read 鏈」
  2. leader 已發reported_within_10d):從 news cache(Step 0.67)/ pricing_watch 摘 1 句硬數字(capex guide / bit 出貨 / book-to-bill / backlog…),須逐字 quote ≤120 字,無 quote → 標「已發,硬數字未見」(同 §9.5 反幻覺門檻);方向標 ↑/↓/→ 作為 followers 的 prior
  3. news_only leader(SK海力士/三星/Infineon):無排程日期,靠 pricing_watch 承接,有相符 item 才列,附 recurrence 提示
  4. :leader 結果不得直接轉成 follower 買賣指令 — 只更新 prior;行動仍走各自 gate(earnings window ±48h 禁令、revision 閘門不變)
Leader(日期/狀態)讀什麼Followers(財報日)Leader 訊號(quote)
hyperscaler_capexGOOGL 7/22 ✅ / META 7/29capex guideNVDA 8/26, COHR 8/12…capex ↑ "…"(來源)

5. Technical Snapshot

使用 mcp__technical-mcp__get_batch_indicators 取得全持倉技術指標。

欄位順序(依決策權重排列):

| 標的 | 現價 | 趨勢 | MACD | 量能比 | 動能分 | RSI |

  • 趨勢:strong_uptrend / mild_uptrend / consolidation / pullback / weak_downtrend / strong_downtrend
  • MACD:顯示 crossover 狀態(golden_cross 🚀 / death_cross ⚠️ / none)
  • 量能比:volume_ratio(>1.5 爆量 / <0.7 縮量)
  • 動能分:momentum_score(-100 ~ +100)
  • RSI:僅數值列示。RSI 過高不觸發任何警示/標籤/動作(2026-07-01 用戶定調:強者愈強,超買非賣出理由;反轉偵測交給 revision 閘門)。RSI < 30 可作超賣參考

複合訊號標記規則(必須多指標同時觸發 + 無 earnings window):

標記觸發條件
🔴 弱勢持續downtrend + momentum_score < -30(不是機會,是落刀)
⚠️ 動能背離uptrend + momentum_score 轉負 OR death_cross(趨勢未破但動能轉弱)
🚀 強勢確認golden_cross + strong_uptrend + volume_ratio > 1.2
⚠️ earnings window過去/未來 48h 有財報 → 以上規則一律不套用,標記 wait N+1d

舊「🔴 拋物線警示(RSI>75)」「🟡 留意(RSI>70)」已於 2026-07-01 移除 — RSI 過高類標籤是飛輪/對稱性規則之前的遺留,一律不再產生。

根因分類規則(看到弱勢/強勢訊號必做):

對任一 weak_down / strong_down / momentum < -20 訊號,先回答根因再行動:

  1. 過去 48h 有財報?→ (b) earnings reaction → HOLD wait
  2. 同板塊 ETF 也弱?→ (c) sector rotation → 評估板塊配置
  3. fundamental 數據惡化?(revenue growth 連 2 季減速 / guide 下修)→ (a) thesis 破裂 → 可執行汰弱
  4. 以上皆否 → (d) noise → 忽略

只有 (a) 才執行「汰弱留強」減碼。詳見 feedback/weak-signal-root-cause.md

強訊號對稱分類(看到貼高/大漲訊號必做 — per feedback/momentum-valuation-symmetry.md;RSI 過高不是輸入):

對任一貼 52W 高 / 單日大漲 / 已漲多訊號,先查 revision 方向再行動:

  1. estimate 上修中(revisions up ≫ down / eps_revision_30d_pct > 0)+ 成長加速?→ 加速領導者:在倉讓它 run、不 trim(強者愈強;認列桶仍按梯級停利級距走);新資金不否決,改 starter + 回檔 ladder + bull call spread 定義風險

⚠️ revision 引用必附 coverage:分析師數 N≥15 全權重;8–14 半權重(須與 trend/季成長印證);<8 不單獨觸發加減碼;上次財報後 >45 天的 revision 標 stale 降權(per feedback/momentum-valuation-symmetry.md 規則 6)

🟠 revision decel(Step 0.55 cache 旗標,影子驗證中):該股在 revision_delta.decel_tickers 中(上修仍為正但 7d/30d 動能顯著縮減)→ 在該股行尾標 🟠 decel只標記不改結論:不因此提前 harvest、不否決加碼、不進 EV;連同 book_decel 記入 Section 6 Key Alerts,由 /trade-review 驗命中率。warming_up → 本標註完全不出現。

  1. estimate 翻下修/flat + 高倍數?→ 峰值 harvest 候選:認列桶列入 harvest 清單(這才是「賣強」的正當時機)
  2. weak_downtrend 反彈 + momentum 低 + 無 revision 支撐?→ 受損 turnaround:等催化驗收,不接刀(今天綠 ≠ 領導力)

:把「超買/太貴/已漲多/RSI 高」單獨當在倉 trim 或新倉否決理由 — 只影響下手結構(分批/spread),永不影響方向。賣出仍須過 (a)/(b)/(c) trim 閘門(feedback/position-concentration.md)。

6. Key Alerts

只在觸發時顯示(無則跳過整個 section):

  • 單日跌 > 5%
  • 總虧 > 15%
  • 單一持倉 > 8% 組合(過度集中;>10% 🔴 紅線)
  • 財報 < 3 天(用已知財報日歷)
  • 選擇權 < 14 天到期
  • Swing Risk:認列桶肥利潤(>+40%)+ 高 β + revision 轉折/題材降溫,且無對應落袋掛單 → 🔴 Swing Risk 未處理(附建議可掛單)
  • 梯級停利到價/缺口:認列桶倉位觸及下一梯級(+30/+60/+100/每+50pp)而無對應 GTC 掛單,或存量累計減碼低於級距應達比例 → 🟡 梯級缺口(附補掛單,per feedback/tiered-profit-taking.md
  • 財報叢集:未來 7 日財報窗內持倉合計 >20% → 🔴 叢集曝險 X%(見 Section 4.5 step 6)
  • 現金滯留:現金 >15–20% 且無 GTC 掛單覆蓋、無 dry powder 理由 → 🔴 飛輪滲漏
  • 🚦 Regime break(Step 0.55,display-only):credit widening_fast(HY OAS Δ5d ≥ +25bp 或 Δ20d ≥ +50bp)/ VIX 期限 inverted(^VIX/^VIX3M ≥ 1.0)/ 半導體寬度 divergence_flag(SMH 距 52w 高 <5% 且寬度 <50%)→ 各 1 行附數字,不觸發自動動作
  • 記憶體/功率報價反轉:pricing_watch 出現合約價轉跌 / lead time 縮短 / 砍單類 quote → 🚦 pricing 反轉候選(附逐字 excerpt + 對應 thesis slug,如 MU:memory-supply-response-2027)
  • 台股月營收轉負:tw_monthly 任一檔 turned_negative == true🔴 需求證偽候選:{名} 月營收 YoY 轉負 → 提前檢討 ON/DIOD,不等財報
  • Revision book decelbook_decel == true🟠 revision 動能減速(寬度 {breadth_pos_pct}%,7d {momentum_7d_pp}pp)book_rollover == true → 升 🔴 revision 寬度跌破 50%
  • 🔴 回檔行為熔斷(R15):讀 briefing-out/cache/account-metrics.jsonequity.circuit_breaker_active == true(帳戶自峰回落 >10%)→ 固定顯示 🔴 回檔熔斷生效中(峰 {peak_date} −{current_drawdown_pct}%):信念桶禁淨減碼;清倉/降桶決定強制隔夜(寫理由過根因分類,次日確認);僅機械單(梯級 harvest/旗標 forced/既掛 GTC)照常(規則 feedback/holding-period-discipline.md;cache 缺失 → 跳過不猜)
  • 🐦 來源訊號:Step 0.68 cache 中 tier ∈ {trusted, core} 且 has_number == true 且貼文 48h 內 → 🐦 {ticker} {source_id}@{tier}:{claim 摘要}("{raw_quote 節錄}");每檔最多 1 行、全 Key Alerts 最多 3 行;Probation 不得出現於此(僅 §9.6);display-only,不改變任何建議

7. 計畫進度 Quick

  • 近期待辦狀態(✅🔄⏳)
  • 今日是否有計畫中的觸發條件被滿足(RSI 破 30、MACD 金叉等)
  • 即將到期的選擇權 vs 計畫中的關鍵日期

8. Quick Take

🔒 強制:機率分布必須呼叫 probability-honesty-checker agent

寫出機率分布 / EV 之前必須執行:

Agent(
  subagent_type: "probability-honesty-checker",
  description: "Briefing quick take EV check",
  prompt: """
  計算當前組合 7 日 horizon 機率分布與 EV。

Shortened here. Read the whole file on GitHub.

Signals

GitHub stars
139
Forks
12
Last commit
Sep 2026
Advanced
Catalog kind
skill
Gateway key
briefing
Source
github.com/patricksudo/fadacai-portfolio