美國公債利差(Yield Spread)作為領先指標:
spread_t = short_yield_t - long_yield_t
= US02Y_t - US10Y_t
spread 越高:短端相對更高(曲線更倒掛/更緊)
spread 越低(或從負回到 0、轉正):曲線「回正/變陡」
此 spread 被認為領先反映:
- 經濟週期預期(倒掛 → 衰退預期)
- 風險偏好轉換(曲線變陡 → 風險偏好回升)
相對強弱比率(Ratio):
ratio_t = risk_asset_t / defensive_asset_t
= QQQ_t / XLV_t
ratio 上升:成長股(Nasdaq)相對更強
ratio 下降:防禦股(Healthcare)相對更強(XLV 跑贏)
預測目標為「未來 H 個月的對數相對報酬」:
future_rel_return = log(ratio(t+H) / ratio(t))
正值 → Nasdaq 跑贏,負值 → XLV 跑贏
圖表的時間對齊邏輯:
- 把 spread 往前平移 lead_months 個月
- 目標是檢查:spread(t) 是否能解釋 ratio(t + H)
工程化寫法:
X = spread(t)
Y = future_rel_return(t, H) = log(ratio(t+H) / ratio(t))
然後做相關性/迴歸/交叉相關掃描來找「最佳領先期」。
避免直接用 ratio 水平做迴歸(有趨勢/非平穩問題),改用對數報酬。
需回答三件事:
是否真的存在穩定領先關係?
- 掃描多個 lead(6, 12, 18, 24, 30 個月)
- 看哪個 lead 下 corr(spread, future_rel_return) 最穩、顯著
- 跨子樣本驗證(前半段 vs 後半段)
目前情境對應的預測方向
- 最近 spread 水準、變化率
- 模型預測 E[future_rel_return]
- 分位數區間(如 80% 信心區間)
把預測翻譯成直覺語句
- 由 future_rel_return 轉回百分比:
exp(future_rel_return) - 1
- 「未來 24 個月 XLV 相對 QQQ 勝率 X%、中位數報酬 Y%」
- 頻率選擇:週頻(weekly)降低雜訊,建議 1wk
- 平滑視窗:可選 13 週或 26 週移動平均
- 回測長度:至少涵蓋 1-2 次完整景氣循環(如 2007-present)
殖利率來源:FRED(DGS2, DGS10)
資產價格來源:Yahoo Finance(QQQ, XLV)
- 數據整合:取得殖利率(FRED)與資產價格(yfinance)
- 利差計算:計算 spread = short_yield - long_yield
- 相對報酬計算:計算 future_rel_return = log(ratio(t+H) / ratio(t))
- 領先關係驗證:掃描多個 lead 找最佳相關性與穩定性
- 情境預測:基於當前 spread 產出未來相對報酬預測區間
- 輸出報告:驗證結論、預測方向、風險提示
輸出:領先關係驗證、當前預測、區間估計、歷史類比、風險提示。
最快的方式:執行預設情境分析
cd skills/forecast-sector-relative-return-from-yield-spread
pip install pandas numpy yfinance matplotlib statsmodels requests # 首次使用
python scripts/spread_forecaster.py --quick
完整分析(含領先掃描與穩定性驗證)
python scripts/spread_forecaster.py \
--risk-ticker QQQ \
--defensive-ticker XLV \
--lead-months 24 \
--lookback-years 12 \
--output result.json
生成 Bloomberg 風格視覺化圖表
python scripts/plot_bloomberg_style.py --quick --output output/yield_spread_forecast_$(date +%Y-%m-%d).png
完整版圖表(自訂參數)
python scripts/plot_bloomberg_style.py \
--lookback-years 18 \
--lead-months 24 \
--risk-ticker QQQ \
--defensive-ticker XLV \
--output output/yield_spread_analysis.png
輸出範例:
{
"skill": "forecast_sector_relative_return_from_yield_spread",
"signal_name": "US02Y_minus_US10Y_leads_QQQ_over_XLV",
"lead_months": 24,
"current_spread": -0.35,
"model": {
"type": "lagged_regression",
"alpha": 0.02,
"beta": -0.45,
"corr_x_y": -0.32
},
"forecast": {
"future_24m_relative_return_pct": -0.077,
"interval_pct_80": [-0.22, 0.04],
"interpretation": "若此關係維持,未來24個月QQQ相對XLV期望報酬為-7.7%,XLV較可能跑贏。"
}
}
- 快速分析 - 使用預設參數(QQQ/XLV, 24 個月領先)計算當前預測
- 完整分析 - 自訂參數進行領先關係驗證與情境預測
- 領先掃描 - 掃描多個領先期(6-30 個月)找最佳相關性
- 視覺化圖表 - 生成利差與相對報酬對齊圖
- 穩定性驗證 - 檢查領先關係在不同子樣本的一致性
- 方法論學習 - 了解領先關係邏輯與計算方式
請選擇或直接提供分析參數。
路由後,閱讀對應文件並執行。
方法論: references/methodology.md
- 領先落後關係定義
- 相對報酬計算
- 迴歸模型設定
- 區間估計方法
- 穩定性驗證
資料來源: references/data-sources.md
- 殖利率代理(FRED DGS2/DGS10)
- 資產價格代理(QQQ/XLV)
- 數據對齊原則
輸入參數: references/input-schema.md
| Script |
Command |
Purpose |
| spread_forecaster.py |
--quick |
快速分析 QQQ/XLV, 24m lead |
| spread_forecaster.py |
--lead-months 12 --lookback-years 15 |
自訂領先期與回測長度 |
| spread_forecaster.py |
--lead-scan --scan-range 6,12,18,24,30,36 |
領先期掃描 |
| plot_bloomberg_style.py |
--quick --output output/chart.png |
Bloomberg 風格快速圖表 |
| plot_bloomberg_style.py |
--lookback-years 18 --lead-months 24 |
完整版圖表(含領先掃描+穩定性) |
| spread_plotter.py |
--quick --output-dir output/ |
基本版圖表(備用) |
|
|
|
核心參數
| 參數 |
類型 |
預設值 |
說明 |
| risk_ticker |
string |
QQQ |
代表成長股的標的 |
| defensive_ticker |
string |
XLV |
代表防禦股的標的 |
| short_tenor |
string |
2Y |
短端殖利率期限 |
| long_tenor |
string |
10Y |
長端殖利率期限 |
| lead_months |
int |
24 |
領先期(月) |
| lookback_years |
int |
12 |
回測/估計歷史年數 |
進階參數
| 參數 |
類型 |
預設值 |
說明 |
| freq |
string |
weekly |
資料頻率(daily/weekly/monthly) |
| smoothing_window |
int |
13 |
平滑視窗(週數) |
| return_horizon_months |
int |
24 |
預測的相對報酬視窗 |
| model_type |
string |
lagged_regression |
模型類型 |
| confidence_level |
float |
0.80 |
區間估計信心水準 |
完整參數定義見 references/input-schema.md。
完整輸出結構見 templates/output-json.md。
重要發現(2026-01-27 驗證結果):
- 領先關係存在,但 子樣本一致性低(前半段負相關 vs 後半段正相關)
- 最佳領先期為 30-36 個月(非 24 個月),但 24 個月也有 0.484 的相關性
- R² = 23.4%,spread 僅解釋約四分之一的相對報酬變異
1---2name: forecast-sector-relative-return-from-yield-spread3description: 用美債殖利率曲線利差(如 2Y-10Y)建立「領先關係」,推估未來一段時間內成長股(Nasdaq 100)相對防禦股(Healthcare/XLV)的相對績效方向與幅度。4---5
6<essential_principles>
7
8<principle name="lead_lag_definition">
9**領先落後關係定義**
10
11美國公債利差(Yield Spread)作為領先指標:
12
13```
14spread_t = short_yield_t - long_yield_t
15 = US02Y_t - US10Y_t
16```
17
18**spread 越高**:短端相對更高(曲線更倒掛/更緊)
19**spread 越低**(或從負回到 0、轉正):曲線「回正/變陡」
20
21此 spread 被認為領先反映:
22- 經濟週期預期(倒掛 → 衰退預期)
23- 風險偏好轉換(曲線變陡 → 風險偏好回升)
24</principle>
25
26<principle name="relative_return_definition">
27**相對報酬定義**
28
29相對強弱比率(Ratio):
30
31```
32ratio_t = risk_asset_t / defensive_asset_t
33 = QQQ_t / XLV_t
34```
35
36**ratio 上升**:成長股(Nasdaq)相對更強
37**ratio 下降**:防禦股(Healthcare)相對更強(XLV 跑贏)
38
39預測目標為「未來 H 個月的對數相對報酬」:
40
41```
42future_rel_return = log(ratio(t+H) / ratio(t))
43```
44
45正值 → Nasdaq 跑贏,負值 → XLV 跑贏
46</principle>
47
48<principle name="advance_alignment">
49**「2 Years in Advance」的真正含義**
50
51圖表的時間對齊邏輯:
52- 把 spread 往前平移 lead_months 個月
53- 目標是檢查:**spread(t) 是否能解釋 ratio(t + H)**
54
55工程化寫法:
56```
57X = spread(t)
58Y = future_rel_return(t, H) = log(ratio(t+H) / ratio(t))
59```
60
61然後做相關性/迴歸/交叉相關掃描來找「最佳領先期」。
62
63**避免直接用 ratio 水平做迴歸**(有趨勢/非平穩問題),改用對數報酬。
64</principle>
65
66<principle name="validation_framework">
67**領先關係驗證框架**
68
69需回答三件事:
70
711. **是否真的存在穩定領先關係?**
72 - 掃描多個 lead(6, 12, 18, 24, 30 個月)
73 - 看哪個 lead 下 corr(spread, future_rel_return) 最穩、顯著
74 - 跨子樣本驗證(前半段 vs 後半段)
75
762. **目前情境對應的預測方向**
77 - 最近 spread 水準、變化率
78 - 模型預測 E[future_rel_return]
79 - 分位數區間(如 80% 信心區間)
80
813. **把預測翻譯成直覺語句**
82 - 由 future_rel_return 轉回百分比:`exp(future_rel_return) - 1`
83 - 「未來 24 個月 XLV 相對 QQQ 勝率 X%、中位數報酬 Y%」
84</principle>
85
86<principle name="data_alignment">
87**數據對齊原則**
88
89- **頻率選擇**:週頻(weekly)降低雜訊,建議 1wk
90- **平滑視窗**:可選 13 週或 26 週移動平均
91- **回測長度**:至少涵蓋 1-2 次完整景氣循環(如 2007-present)
92
93殖利率來源:FRED(DGS2, DGS10)
94資產價格來源:Yahoo Finance(QQQ, XLV)
95</principle>
96
97</essential_principles>
98
99<objective>
100實作「美國公債利差 → 板塊相對報酬」領先關係分析:
101
1021. **數據整合**:取得殖利率(FRED)與資產價格(yfinance)
1032. **利差計算**:計算 spread = short_yield - long_yield
1043. **相對報酬計算**:計算 future_rel_return = log(ratio(t+H) / ratio(t))
1054. **領先關係驗證**:掃描多個 lead 找最佳相關性與穩定性
1065. **情境預測**:基於當前 spread 產出未來相對報酬預測區間
1076. **輸出報告**:驗證結論、預測方向、風險提示
108
109輸出:領先關係驗證、當前預測、區間估計、歷史類比、風險提示。
110</objective>
111
112<quick_start>
113
114**最快的方式:執行預設情境分析**
115
116```bash
117cd skills/forecast-sector-relative-return-from-yield-spread
118pip install pandas numpy yfinance matplotlib statsmodels requests # 首次使用
119python scripts/spread_forecaster.py --quick
120```
121
122**完整分析(含領先掃描與穩定性驗證)**
123
124```bash
125python scripts/spread_forecaster.py \
126 --risk-ticker QQQ \
127 --defensive-ticker XLV \
128 --lead-months 24 \
129 --lookback-years 12 \
130 --output result.json
131```
132
133**生成 Bloomberg 風格視覺化圖表**
134
135```bash
136python scripts/plot_bloomberg_style.py --quick --output output/yield_spread_forecast_$(date +%Y-%m-%d).png
137```
138
139**完整版圖表(自訂參數)**
140
141```bash
142python scripts/plot_bloomberg_style.py \
143 --lookback-years 18 \
144 --lead-months 24 \
145 --risk-ticker QQQ \
146 --defensive-ticker XLV \
147 --output output/yield_spread_analysis.png
148```
149
150輸出範例:
151```json
152{
153 "skill": "forecast_sector_relative_return_from_yield_spread",
154 "signal_name": "US02Y_minus_US10Y_leads_QQQ_over_XLV",
155 "lead_months": 24,
156 "current_spread": -0.35,
157 "model": {
158 "type": "lagged_regression",
159 "alpha": 0.02,
160 "beta": -0.45,
161 "corr_x_y": -0.32
162 },
163 "forecast": {
164 "future_24m_relative_return_pct": -0.077,
165 "interval_pct_80": [-0.22, 0.04],
166 "interpretation": "若此關係維持,未來24個月QQQ相對XLV期望報酬為-7.7%,XLV較可能跑贏。"
167 }
168}
169```
170
171</quick_start>
172
173<intake>
174需要進行什麼操作?
175
1761. **快速分析** - 使用預設參數(QQQ/XLV, 24 個月領先)計算當前預測
1772. **完整分析** - 自訂參數進行領先關係驗證與情境預測
1783. **領先掃描** - 掃描多個領先期(6-30 個月)找最佳相關性
1794. **視覺化圖表** - 生成利差與相對報酬對齊圖
1805. **穩定性驗證** - 檢查領先關係在不同子樣本的一致性
1816. **方法論學習** - 了解領先關係邏輯與計算方式
182
183**請選擇或直接提供分析參數。**
184</intake>
185
186<routing>
187| Response | Action |
188|--------------------------------|------------------------------------------------------------------------|
189| 1, "快速", "quick", "分析" | 執行 `python scripts/spread_forecaster.py --quick` |
190| 2, "完整", "full", "自訂" | 閱讀 `workflows/analyze.md` 並執行 |
191| 3, "掃描", "scan", "領先" | 閱讀 `workflows/analyze.md` 並聚焦 lead_scan |
192| 4, "圖表", "chart", "視覺化" | 執行 `python scripts/plot_bloomberg_style.py --quick --output output/` |
193| 5, "驗證", "穩定", "stability" | 閱讀 `workflows/analyze.md` 並聚焦穩定性驗證 |
194| 6, "學習", "方法論", "why" | 閱讀 `references/methodology.md` |
195| 提供參數 (如 ticker, lead) | 閱讀 `workflows/analyze.md` 並使用參數執行 |
196
197**路由後,閱讀對應文件並執行。**
198</routing>
199
200<directory_structure>
201```
202forecast-sector-relative-return-from-yield-spread/
203├── SKILL.md # 本文件(路由器)
204├── skill.yaml # 前端展示元數據
205├── manifest.json # 技能元數據
206├── workflows/
207│ ├── analyze.md # 完整分析工作流
208│ └── data-research.md # 數據源研究與替代方案
209├── references/
210│ ├── methodology.md # 方法論與計算邏輯
211│ ├── input-schema.md # 完整輸入參數定義
212│ └── data-sources.md # 數據來源與獲取方式
213├── templates/
214│ ├── output-json.md # JSON 輸出模板
215│ └── output-markdown.md # Markdown 報告模板
216├── scripts/
217│ ├── spread_forecaster.py # 主計算腳本
218│ ├── plot_bloomberg_style.py # Bloomberg 風格視覺化(推薦)
219│ └── spread_plotter.py # 基本版圖表腳本(備用)
220└── examples/
221 └── sample-output.json # 範例輸出
222```
223</directory_structure>
224
225<reference_index>
226
227**方法論**: references/methodology.md
228- 領先落後關係定義
229- 相對報酬計算
230- 迴歸模型設定
231- 區間估計方法
232- 穩定性驗證
233
234**資料來源**: references/data-sources.md
235- 殖利率代理(FRED DGS2/DGS10)
236- 資產價格代理(QQQ/XLV)
237- 數據對齊原則
238
239**輸入參數**: references/input-schema.md
240- 完整參數定義
241- 預設值與建議範圍
242
243</reference_index>
244
245<workflows_index>
246| Workflow | Purpose | 使用時機 |
247|------------------|--------------|-----------------------------------|
248| analyze.md | 完整情境分析 | 需要自訂參數驗證領先關係與預測 |
249| data-research.md | 數據源研究 | 了解如何獲取或替代殖利率/資產數據 |
250</workflows_index>
251
252<templates_index>
253| Template | Purpose |
254|--------------------|-------------------|
255| output-json.md | JSON 輸出結構定義 |
256| output-markdown.md | Markdown 報告模板 |
257</templates_index>
258
259<scripts_index>
260| Script | Command | Purpose |
261|-------------------------|---------------------------------------------|---------------------------------|
262| spread_forecaster.py | `--quick` | 快速分析 QQQ/XLV, 24m lead |
263| spread_forecaster.py | `--lead-months 12 --lookback-years 15` | 自訂領先期與回測長度 |
264| spread_forecaster.py | `--lead-scan --scan-range 6,12,18,24,30,36` | 領先期掃描 |
265| plot_bloomberg_style.py | `--quick --output output/chart.png` | Bloomberg 風格快速圖表 |
266| plot_bloomberg_style.py | `--lookback-years 18 --lead-months 24` | 完整版圖表(含領先掃描+穩定性) |
267| spread_plotter.py | `--quick --output-dir output/` | 基本版圖表(備用) |
268</scripts_index>
269
270<input_schema_summary>
271
272**核心參數**
273
274| 參數 | 類型 | 預設值 | 說明 |
275|------------------|--------|--------|-------------------|
276| risk_ticker | string | QQQ | 代表成長股的標的 |
277| defensive_ticker | string | XLV | 代表防禦股的標的 |
278| short_tenor | string | 2Y | 短端殖利率期限 |
279| long_tenor | string | 10Y | 長端殖利率期限 |
280| lead_months | int | 24 | 領先期(月) |
281| lookback_years | int | 12 | 回測/估計歷史年數 |
282
283**進階參數**
284
285| 參數 | 類型 | 預設值 | 說明 |
286|-----------------------|--------|-------------------|----------------------------------|
287| freq | string | weekly | 資料頻率(daily/weekly/monthly) |
288| smoothing_window | int | 13 | 平滑視窗(週數) |
289| return_horizon_months | int | 24 | 預測的相對報酬視窗 |
290| model_type | string | lagged_regression | 模型類型 |
291| confidence_level | float | 0.80 | 區間估計信心水準 |
292
293完整參數定義見 `references/input-schema.md`。
294
295</input_schema_summary>
296
297<output_schema_summary>
298```json
299{
300 "skill": "forecast_sector_relative_return_from_yield_spread",
301 "inputs": {
302 "risk_ticker": "QQQ",
303 "defensive_ticker": "XLV",
304 "lead_months": 24,
305 "lookback_years": 18
306 },
307 "signal_name": "DGS2_minus_DGS10_leads_QQQ_over_XLV",
308 "current_state": {
309 "spread": -0.61,
310 "spread_percentile": 61.1,
311 "spread_trend": "steepening"
312 },
313 "model": {
314 "type": "lagged_regression",
315 "coefficients": { "alpha": 0.19, "beta": 0.087 },
316 "fit_quality": {
317 "corr_x_y": 0.484,
318 "r_squared": 0.234,
319 "notes": "正 beta 意味 spread 越低(曲線正常)→ 未來 QQQ 相對 XLV 越強"
320 }
321 },
322 "forecast": {
323 "horizon_months": 24,
324 "future_relative_return_pct": 0.148,
325 "interval_pct_80": [-0.05, 0.36],
326 "expected_winner": "QQQ"
327 },
328 "diagnostics": {
329 "lead_scan": {
330 "best_lead_months": 36,
331 "correlation_by_lead": {"6": 0.233, "12": 0.360, "18": 0.405, "24": 0.484, "30": 0.502, "36": 0.509}
332 },
333 "stability_checks": {
334 "first_half_corr": -0.087,
335 "second_half_corr": 0.663,
336 "consistency": "low"
337 }
338 },
339 "notes": [
340 "領先關係反映的是『歷史統計規律』,不保證未來成立。",
341 "子樣本一致性低:前半段(2007-2015)為負相關,後半段(2015-2024)為正相關。",
342 "這意味著此領先關係可能只是 2015 後 QE 時代的特有現象。",
343 "建議搭配:景氣指標、估值分位、資金流向做交叉驗證。"
344 ]
345}
346```
347
348完整輸出結構見 `templates/output-json.md`。
349
350**重要發現(2026-01-27 驗證結果)**:
351- 領先關係存在,但 **子樣本一致性低**(前半段負相關 vs 後半段正相關)
352- 最佳領先期為 30-36 個月(非 24 個月),但 24 個月也有 0.484 的相關性
353- R² = 23.4%,spread 僅解釋約四分之一的相對報酬變異
354</output_schema_summary>
355
356<success_criteria>
357執行成功時應產出:
358
359- [ ] 當前美國公債利差水準
360- [ ] 領先關係相關性與迴歸係數
361- [ ] 未來相對報酬預測(點估計與區間)
362- [ ] 領先期掃描結果(若執行)
363- [ ] 穩定性驗證(子樣本一致性)
364- [ ] 結果輸出為指定格式(JSON 或 Markdown)
365- [ ] 視覺化圖表輸出(若需要)
366- [ ] 風險提示與後續研究建議
367</success_criteria>