返回目錄
A
金融數據科學實戰:從原始數據到智能投資 - 第 3 章
第3章 描述性統計與探索性分析
發布於 2026-03-06 11:56
# 第3章 描述性統計與探索性分析
本章將帶領讀者透過**視覺化圖表**、**統計指標**以及**相關性矩陣**,快速掌握金融資料的分布、波動與內在關係。這些探索性分析(EDA)不僅能協助我們了解市場情緒,也能揭示潛在的套利機會與風險點。
## 3.1 直方圖(Histogram)
- **目的**:觀察單一變數的分布形態(正態、偏態、離散等)。
- **應用**:檢測日報酬率、波動率、債券利差等的非對稱性,進一步決定是否需要對數轉換或分組。
### 3.1.1 典型範例:日報酬率分布
python
import pandas as pd
import matplotlib.pyplot as plt
# 讀取日報酬率資料
returns = pd.read_csv('sp500_returns.csv', parse_dates=['date'], index_col='date')
plt.figure(figsize=(10, 4))
plt.hist(returns['daily_return'], bins=50, color='steelblue', edgecolor='k')
plt.title('S&P 500 日報酬率直方圖')
plt.xlabel('日報酬率')
plt.ylabel('頻率')
plt.grid(True, linestyle='--', alpha=0.4)
plt.show()
### 3.1.2 直方圖的進階技巧
| 技巧 | 說明 |
|------|------|
| **Log 轉換** | 對右偏或極值資料使用 `np.log1p`,降低長尾影響。 |
| **核密度估計**(KDE) | 在直方圖上疊加 KDE 曲線,呈現連續密度。 |
| **分箱寬度** | 使用 `np.histogram_bin_edges` 或 `freedman_diaconis_bin_width` 自動決定。 |
## 3.2 箱形圖(Boxplot)
- **目的**:快速呈現數據的四分位數、極端值與離群點。對於多個時間序列的比較尤為有用。
- **應用**:比較不同資產日報酬率的分散程度,檢測交易時段的高低波動。
### 3.2.1 範例:多個指數報酬率箱形圖
python
# 以 pd.concat 形成多列資料
indices = pd.concat([
pd.read_csv('sp500_returns.csv', usecols=['daily_return'], parse_dates=['date'], index_col='date'),
pd.read_csv('nasdaq_returns.csv', usecols=['daily_return'], parse_dates=['date'], index_col='date'),
pd.read_csv('dow_returns.csv', usecols=['daily_return'], parse_dates=['date'], index_col='date')
], axis=1, keys=['S&P 500', 'NASDAQ', 'DJIA'])
indices.boxplot(figsize=(12, 6), grid=False, fontsize=12)
plt.title('三大指數日報酬率箱形圖')
plt.ylabel('日報酬率')
plt.show()
### 3.2.2 補充說明
- **離群點**:箱形圖以 1.5 * IQR 為臨界值;若數據極度分散,離群點可能代表高頻交易或極端市場事件。
- **對稱性檢測**:若上四分位數與下四分位數距離不等,說明分布偏態;可結合直方圖進一步確認。
## 3.3 相關係數矩陣(Correlation Matrix)
- **目的**:量化多變量之間的線性依賴,找出同向/相反向關係。對於套利、風險分散、資產組合非常關鍵。
- **方法**:常用 Pearson、Spearman 或 Kendall 相關係數;對於非正態資料建議使用 Spearman。
### 3.3.1 範例:多資產報酬率相關矩陣
python
# 讀取多資產日報酬率
rets = pd.read_csv('multi_asset_returns.csv', parse_dates=['date'], index_col='date')
# 計算 Pearson 相關係數
corr = rets.corr(method='pearson')
# 以 seaborn 熱力圖展示
import seaborn as sns
plt.figure(figsize=(8, 6))
sns.heatmap(corr, annot=True, fmt='.2f', cmap='coolwarm', vmin=-1, vmax=1)
plt.title('多資產日報酬率 Pearson 相關矩陣')
plt.show()
### 3.3.2 進階技巧
| 技巧 | 目的 |
|------|------|
| **相關係數篩選** | 只保留絕對值大於 0.7 或小於 -0.7 的項目,快速定位強相關對。 |
| **時間滯後相關** | 使用 `pd.concat([rets.shift(i) for i in range(1, 6)], axis=1)` 計算多個時延,探討延遲效應。 |
| **多重共線性檢測** | 利用 VIF (Variance Inflation Factor) 量化共線性程度,避免回歸模型不穩定。 |
## 3.4 市場情緒與套利機會的 EDA
### 3.4.1 市場情緒指標
- **RSI、布林帶、MACD** 等技術指標本身即為高頻訊號,可透過直方圖檢視其分布。
- **情緒文字雲**:利用 NLP 對財經新聞、推特等文本生成情緒分佈。
### 3.4.2 套利機會篩選
1. **配對交易(Pairs Trading)**:計算兩資產日報酬率差值,觀察其分布與自相關;若差值呈現長期均值回歸,則構成套利機會。
2. **統計套利(Statistical Arbitrage)**:利用多因子模型(如 Fama‑French)提取異常回報,進行動量或逆向交易。
3. **高頻信號**:對秒級資料進行滑動窗口分析,快速識別極短期價差或價格異常。
## 3.5 實作範例:結合直方圖、箱形圖與相關矩陣的完整工作流程
python
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# 1. 讀取資料
returns = pd.read_csv('returns.csv', parse_dates=['date'], index_col='date')
# 2. 直方圖
plt.figure(figsize=(8, 4))
sns.histplot(returns['daily_return'], bins=60, kde=True, color='teal')
plt.title('日報酬率分布')
plt.xlabel('日報酬率')
plt.ylabel('頻率')
plt.show()
# 3. 箱形圖
plt.figure(figsize=(8, 4))
sns.boxplot(data=returns[['daily_return']], width=0.5)
plt.title('日報酬率箱形圖')
plt.ylabel('日報酬率')
plt.show()
# 4. 相關矩陣
corr = returns.corr()
plt.figure(figsize=(6, 5))
sns.heatmap(corr, annot=True, cmap='viridis', vmin=-1, vmax=1)
plt.title('相關矩陣')
plt.show()
## 3.6 小結
- **視覺化**:直方圖揭示分布形態,箱形圖說明分散與離群;相關矩陣快速顯示多變量關係。
- **實務應用**:利用 EDA 迅速判斷是否需要資料轉換、是否存在套利機會、或是進一步建模的依據。
- **持續迭代**:EDA 是一個迴圈:初步分析 → 生成假說 → 調整資料 → 重新分析。
> **提示**:在金融數據的 EDA 階段,務必留意「交易時段」與「交易日曆」的影響,因為不同市場可能在同一時間內存在不同的交易頻率與開盤時間。