Event Vol Scan — 事件前買方機會掃描
定位:把 portfolio-review I.5 樂透掃描升級為事件驅動買方掃描 — 在財報 / CPI / FOMC 前找兩類機會: ① 末日 buy call(方向凸性:base rate + revision 一面倒,且隱含移動不貴) ② 雙買 straddle(純波動:隱含移動 < 歷史實際移動,不賭方向賭幅度)
與既有規則的關係(必讀)
- 「財報 ±48h 不新開期權倉」(options-leaps-playbook)的例外聲明:那條禁的是「方向性建倉被事件 IV 扭曲定價而不自知」。本 skill 是有意識的事件波動買方(吃 gamma / vol),屬明確 opt-in 例外。賣方策略(BPS/BCS/CC)仍完全遵守 ±48h 禁令,本 skill 絕不輸出事件窗內的賣方單。
- 沿用樂透鐵則(playbook + I.5):總成本 ≤ 2% 帳戶(Quarter-Kelly)、OI > 500、已漲 >30%(5日)排除、不用 OTM LEAPS 當樂透(vega 干擾凸性)。
- 機率語言紀律:不寫「應該會大漲」— 引擎輸出 VRP(隱含/歷史)與 base rate,判讀 conditional 在這兩個數字。
Step 0
執行 AGENTS.md Step 0 統一規範(0a 讀 plan.md + feedback、0b get_account_position、0c/0d journal 檢查)。本 skill 需要:持倉 ticker 清單、帳戶總值(算 2% 預算)、plan.md L1 On-Deck / 觀察清單。
Workflow
1. Universe 組建
- 預設:持倉全部 ticker + plan.md「L1 On-Deck」+「觀察清單」標的
- 用戶 args 指定 ticker → 只掃指定的
- 宏觀事件:
mcp__eodhd-mcp__get_economic_calendar(from, to, country="US", high_impact_only=True)抓窗內 CPI / FOMC / NFP 日期 → 以SPY:<date>:<label>,QQQ:<date>:<label>注入(半導體集中事件可加 SMH)
2. 跑掃描引擎(機械層 — 不手算 chain)
bashpython3 tools/event_vol_scan.py \ --tickers <逗號清單> \ --days <N,預設 14> \ --extra-events "SPY:YYYY-MM-DD:CPI,QQQ:YYYY-MM-DD:FOMC" \ --account-value <live 帳戶總值> \ --json briefing-out/cache/event-vol-scan.json
引擎輸出(每 ticker×事件):事件後首個到期、ATM straddle 隱含移動、過去 8Q 財報實際移動中位(earnings-history cache 日期 × 日線)、VRP = 隱含/歷史、beat rate + 30d revisions、5 日 run-up、OI/spread 流動性、1×IM 末日 call 候選報價,以及機械裁決:
| 裁決 | 條件 | 意義 |
|---|---|---|
BUY_CALL | beat ≥ 7/8 且 rev up ≥ 5×dn 且 avg surprise ≥ +5%(非 unreliable)且 VRP ≤ 1.2 | 方向凸性候選 |
STRADDLE | VRP < 0.85 且歷史中位移動 ≥ 4% | 雙買候選(隱含 < 歷史) |
STRADDLE_RV | 無財報基準(ETF/新股),隱含 < 20d 實現波動×√T | 雙買候選(次級基準) |
SKIP_RICH | VRP > 1.2 | 隱含太貴,IV crush 風險 |
EXCLUDE | 5日漲幅 >30% 或 OI/spread 不及格 | 淘汰 |
WATCH | 無明確 edge | 列示不建議 |
3. 判斷層(Claude — 引擎裁決之上,逐條檢核)
STRADDLE_RV的 rv 灌水檢查:近 5 日若有 >3% 單日(崩盤週),rv20 被灌高 → VRP_rv 失真偏便宜。此時降級為 WATCH,除非隱含移動絕對值也低於長期常態。BUY_CALL的 thesis 一致性:對照 plan.md 桶別 / 候補層 — 與現有持倉同題材 binary 不重複開(已有同板塊事件樂透 → 優先補強既有)。- 末日進場時點(重要 — 掃描日 ≠ 進場日):
- 雙買:事件前 2–5 個交易日進場(IV ramp 前段,theta 尚可控)
- 純末日 call:事件前 1 日或當日(最大 gamma,premium = max loss 心態)
- 今天距事件 >5 日 → 輸出「價格警報 + 預定結構」,不是現在就買(複式單無法 GTC)
- 口數與預算:總樂透預算 ≤2% 帳戶(引擎已算出金額);單筆 1-2 口;每筆必寫「上行 +XXX% / max loss = premium $X」。
- 出場紀律(開倉時就寫死):
- 雙買:事件後首個交易日內了結(IV crush 前),不留倉「等第二波」
- 末日 call:+100% 賣半回本(house-money runner),事件後歸零風險自負
- 入選 0 筆 → 誠實輸出「⏳ 本次無符合凸性條件的事件買方機會」+ 最接近門檻的 1-2 筆與差多少。
4. 輸出格式
## 🎯 事件前買方掃描(YYYY-MM-DD,窗 N 天) [引擎 markdown 表原樣] ### 入選(≤3 筆) | # | 標的 | 事件 | 結構 | 成本/口 | max loss | 上行情境 | 進場窗 | 出場紀律 | 每筆附:價格警報價位 + 預定結構(觸發後 2 分鐘執行);或當下可掛的單。 ### 判斷層淘汰說明 [哪些引擎候選被判斷層砍掉、為什麼 — 1 行/筆]
5. 落地(executed only)
- 用戶決定執行 →
thesis_ledger.py add(slug 格式<ticker>:event-vol-<label>-<YYYYMM>,trigger = 事件日,證偽 = 移動 < 隱含成本) - 本 skill 預設不存 HTML 報告;用戶要求時走
generate_html.py(type: options-strategy)
常數(調整處 = tools/event_vol_scan.py 頂部)
RUNUP_EXCLUDE 30% / VRP_CHEAP 0.85 / VRP_RICH 1.20 / MIN_OI 500 / MAX_SPREAD 15% / 預算 2% / BUY_CALL 門檻 beat 87.5% + surprise ≥5%(unreliable 不算)+ rev 5:1。
Performance
引擎 ~5-8 秒/ticker(yfinance 鏈 + 2y 歷史)。10 檔 Universe 約 1 分鐘。盤中執行前記得引擎報價是快照 — 下單前用 get_single_quote 補即時價。


