Macro-skills monitor-etf-holdings-drawdown-risk

偵測「商品價格上漲、但對應實物 ETF/信託持倉卻下滑」的背離現象,並用多指標交叉驗證,評估是否存在實物供給緊張/交割壓力風險。

install
source · Clone the upstream repo
git clone https://github.com/fatfingererr/macro-skills
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/fatfingererr/macro-skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/monitor-etf-holdings-drawdown-risk" ~/.claude/skills/fatfingererr-macro-skills-monitor-etf-holdings-drawdown-risk && rm -rf "$T"
manifest: skills/monitor-etf-holdings-drawdown-risk/SKILL.md
source content

<essential_principles>

<principle name="divergence_core"> **背離訊號核心邏輯**

背離事件定義:

  • 價格上漲
    price_return >= min_price_return_pct
    (如 +15%)
  • 庫存下滑
    inventory_change <= -min_inventory_drawdown_pct
    (如 -10%)
  • 同時發生:在相同視窗期(如 180 天)內同時滿足

當價格與庫存同向時(同漲同跌)為正常;逆向時(價漲庫跌)才需要警覺。 </principle>

<principle name="dual_hypothesis"> **雙重假設驗證**

不能直接把「庫存下降」解讀為「實物被搶」,需要交叉驗證:

假設支持條件反駁條件
實物緊張COMEX/LBMA 下降、backwardation、lease rates 上升、零售溢價擴大其他庫存穩定、contango、溢價平穩
資金流/贖回ETF 流出但交易所庫存穩定、期貨結構不緊多重庫存同步下降

輸出兩種解釋,讓用戶判斷哪個更符合當前數據。 </principle>

<principle name="data_access"> **資料取得方式**

本 skill 優先使用:

  • ETF 官網庫存:Selenium 模擬人類瀏覽器行為抓取(避免 API 限制)
  • Yahoo Finance
    yfinance
    套件取得現貨/期貨價格
  • 交叉驗證:COMEX 庫存、期貨結構等公開數據

腳本位於

scripts/
目錄,遵循
references/data-sources.md
的反偵測策略。 </principle>

<principle name="stress_scoring"> **壓力分數計算**
stress_score = 100 × min(1.0,
    0.6 × divergence_severity +      # 背離嚴重度
    0.2 × decade_low_bonus +         # 十年低點加成
    0.2 × ratio_extreme_bonus        # 比值極端加成
)
分數區間解讀
0-30正常,無明顯背離
30-60輕度背離,值得關注
60-80中度背離,建議深入驗證
80-100重度背離,高度警戒
</principle>

</essential_principles>

<objective> 監控實物型 ETF(如 SLV、PSLV、GLD)的持倉與商品價格背離現象:
  1. 偵測背離:價格上漲但 ETF 庫存下滑
  2. 評估嚴重度:計算背離程度、十年低點、比值極端
  3. 交叉驗證:使用 COMEX、期貨結構、零售溢價等指標
  4. 產出洞察:提供兩種對立假設,避免單一敘事偏誤

輸出:背離狀態、壓力分數、交叉驗證結果、下一步檢查建議。 </objective>

<quick_start>

最快的方式:檢查 SLV 背離狀態

cd skills/monitor-etf-holdings-drawdown-risk
pip install pandas numpy yfinance selenium webdriver-manager beautifulsoup4 matplotlib  # 首次使用
python scripts/divergence_detector.py --etf SLV --quick

輸出範例:

{
  "asof": "2026-01-20",
  "divergence": false,
  "price_return_window": 1.92,
  "inventory_change_window": 0.15,
  "inventory_decade_low": false,
  "stress_score_0_100": 20.0,
  "interpretations": ["Physical Tightness", "ETF Flow Hypothesis"]
}

完整分析 + 視覺化報告

# 1. 執行背離偵測
python scripts/divergence_detector.py \
  --etf SLV \
  --start 2010-01-01 \
  --end 2026-01-20 \
  --output result.json

# 2. 生成視覺化報告
python scripts/visualize_divergence.py \
  --result result.json \
  --output ../../../output/

輸出

  • JSON 分析結果:
    result.json
  • 視覺化報告:
    output/SLV_divergence_report_20260120.png
  • PDF 報告:
    output/SLV_divergence_report_20260120.pdf

</quick_start>

<intake> 需要進行什麼操作?
  1. 快速檢查 - 查看指定 ETF 目前的背離狀態與壓力分數
  2. 完整分析 - 執行完整的歷史背離分析
  3. 交叉驗證 - 使用多指標驗證背離訊號的真實性
  4. 監控模式 - 設定持續監控與背離警報
  5. 方法論學習 - 了解背離偵測與雙重假設邏輯

請選擇或直接提供分析參數(如 ETF 代碼)。 </intake>

<routing> | Response | Action | |---------------------------------|-----------------------------------------------| | 1, "快速", "quick", "check" | 執行 `scripts/divergence_detector.py --quick` | | 2, "分析", "analyze", "full" | 閱讀 `workflows/analyze.md` 並執行 | | 3, "驗證", "validate", "cross" | 閱讀 `workflows/cross-validate.md` 並執行 | | 4, "監控", "monitor", "alert" | 閱讀 `workflows/monitor.md` 並執行 | | 5, "學習", "方法論", "why" | 閱讀 `references/methodology.md` | | 提供 ETF 代碼 (如 SLV, GLD) | 閱讀 `workflows/analyze.md` 並使用參數執行 |

路由後,閱讀對應文件並執行。 </routing>

<directory_structure>

monitor-etf-holdings-drawdown-risk/
├── SKILL.md                           # 本文件(路由器)
├── skill.yaml                         # 前端展示元數據
├── manifest.json                      # 技能元數據
├── workflows/
│   ├── analyze.md                     # 完整背離分析工作流
│   ├── monitor.md                     # 持續監控工作流
│   └── cross-validate.md              # 交叉驗證工作流
├── references/
│   ├── data-sources.md                # ETF 庫存與價格資料來源
│   ├── methodology.md                 # 背離偵測方法論
│   └── input-schema.md                # 完整輸入參數定義
├── templates/
│   ├── output-json.md                 # JSON 輸出模板
│   └── output-markdown.md             # Markdown 報告模板
└── scripts/
    ├── divergence_detector.py         # 主偵測腳本
    ├── fetch_etf_holdings.py          # ETF 庫存抓取(Selenium)
    └── fetch_prices.py                # 價格數據抓取

</directory_structure>

<reference_index>

方法論: references/methodology.md

  • 背離偵測邏輯
  • 雙重假設驗證框架
  • 壓力分數計算

資料來源: references/data-sources.md

  • ETF 官網庫存抓取(Selenium)
  • Yahoo Finance 價格數據
  • 交叉驗證數據源(COMEX、LBMA)

輸入參數: references/input-schema.md

  • 完整參數定義
  • 預設值與建議範圍

</reference_index>

<workflows_index>

WorkflowPurpose使用時機
analyze.md完整背離分析需要完整歷史分析時
monitor.md持續監控狀態日常監控或警報
cross-validate.md交叉驗證背離訊號確認背離真實性時
</workflows_index>

<templates_index>

TemplatePurpose
output-json.mdJSON 輸出結構定義
output-markdown.mdMarkdown 報告模板
</templates_index>

<scripts_index>

ScriptCommandPurpose
divergence_detector.py
--etf SLV --quick
快速檢查背離狀態
divergence_detector.py
--start DATE --end DATE --output FILE
完整歷史分析
visualize_divergence.py
--result result.json --output DIR
生成視覺化報告
fetch_etf_holdings.py
--etf SLV --output holdings.csv
抓取 ETF 庫存
fetch_prices.py
--symbol SI=F --output prices.csv
抓取商品價格
</scripts_index>

<input_schema_summary>

核心參數

參數類型預設值說明
etf_tickerstring(必填)ETF/信託代碼(如 SLV)
commodity_price_symbolstring(必填)商品價格代碼(如 XAGUSD)
start_datestring10Y 前分析起始日
end_datestringtoday分析結束日

背離參數

參數類型預設值說明
divergence_window_daysint180背離計算視窗(天)
decade_low_window_daysint3650十年低點視窗(天)
min_price_return_pctfloat0.15價格上漲門檻
min_inventory_drawdown_pctfloat0.10庫存下滑門檻

完整參數定義見

references/input-schema.md

</input_schema_summary>

<output_schema_summary>

{
  "skill": "monitor-etf-holdings-drawdown-risk",
  "asof": "2026-01-16",
  "inputs": {
    "etf_ticker": "SLV",
    "commodity_price_symbol": "XAGUSD"
  },
  "result": {
    "divergence": true,
    "price_return_window": 0.32,
    "inventory_change_window": -0.18,
    "inventory_decade_low": true,
    "inventory_to_price_ratio_z": -2.4,
    "stress_score_0_100": 78.5
  },
  "interpretations": [...],
  "next_checks": [...]
}

完整輸出結構見

templates/output-json.md
。 </output_schema_summary>

<success_criteria> 執行成功時應產出:

  • 背離狀態判定(divergence: true/false)
  • 價格變化與庫存變化數值
  • 十年低點判定
  • 庫存/價格比值 Z 分數
  • 壓力分數(0-100)
  • 兩種對立假設解釋
  • 下一步驗證建議清單 </success_criteria>