返回目錄
A
數據驅動的投資決策:從基礎統計到量化交易 - 第 2 章
第 2 章:資料洞察—描述性統計與探索性分析
發布於 2026-02-21 21:55
# 第 2 章:資料洞察—描述性統計與探索性分析
在上一章,我們完成了資料的抓取、清理與基礎特徵工程。此時的資料集已經具備「可分析」的品質,接下來的任務是從統計角度快速掌握其整體特性,為後續建模打下堅實基礎。
## 1️⃣ 先備:導入與載入
python
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# 讀取已備份的 CSV
df = pd.read_csv('cleaned_data.csv', parse_dates=['date'], index_col='date')
> **提醒**:在任何分析前先確定 `index` 為時間序列,避免後續計算出現偏差。
## 2️⃣ 基本統計量
| 指標 | 說明 | 公式/方法 |
|------|------|------------|
| Count | 有效觀測值數量 | `df.shape[0]` |
| Mean | 平均值 | `df.mean()` |
| Std | 標準差 | `df.std()` |
| Min | 最小值 | `df.min()` |
| 25% | 第一四分位數 | `df.quantile(0.25)` |
| Median | 中位數 | `df.median()` |
| 75% | 第三四分位數 | `df.quantile(0.75)` |
| Max | 最大值 | `df.max()` |
python
print(df.describe())
> **洞察**:若 `max` 與 `min` 之間差距極大,可能存在極端值。若 `std` 大於 `mean`,資料呈現高度離散性。
## 3️⃣ 相關係數矩陣
多重特徵之間的線性關係往往是策略設計的關鍵。使用 Pearson 相關係數(適用於正態分佈的資料)或 Spearman(非參數)皆可。
python
corr = df.corr(method='pearson')
print(corr)
### 3.1 可視化
python
plt.figure(figsize=(10, 8))
sns.heatmap(corr, annot=True, cmap='coolwarm', fmt='.2f')
plt.title('特徵相關係數矩陣')
plt.show()
> **判斷**:|r|>0.8 或 <-0.8 的關係表明高度共線,可能需考慮去除或降維。
## 4️⃣ 分布檢視:直方圖與 KDE
每一個特徵的分布形態會影響機器學習演算法的收斂與預測。以下以 `close` 與 `return` 為例。
python
plt.figure(figsize=(12, 5))
plt.subplot(1, 2, 1)
sns.histplot(df['close'], bins=50, kde=True, color='steelblue')
plt.title('收盤價分布')
plt.subplot(1, 2, 2)
sns.histplot(df['return'], bins=50, kde=True, color='darkgreen')
plt.title('日報酬率分布')
plt.show()
> **觀察**:報酬率往往呈現左偏(負偏)與尖峰,這正是金融市場的典型特徵。
## 5️⃣ 時間序列檢視:趨勢與季節性
python
plt.figure(figsize=(14, 6))
df['close'].plot(label='收盤價', linewidth=1)
plt.title('收盤價時序圖')
plt.legend()
plt.show()
如果懷疑季節性,可使用 `statsmodels` 的 `seasonal_decompose`:
python
from statsmodels.tsa.seasonal import seasonal_decompose
result = seasonal_decompose(df['close'], period=252) # 252 為交易日數
result.plot()
plt.show()
> **提示**:若 `trend` 與 `seasonal` 的組合不穩定,請嘗試不同周期或使用指數平滑法。
## 6️⃣ 資料質量驗證
| 驗證項 | 方式 |
|--------|------|
| 缺失值 | `df.isnull().sum()` |
| 重複值 | `df.duplicated().sum()` |
| 超過界限值 | 以統計四分位距(IQR)檢查外溢值 |
| 交易日間隔 | 兩日之間的日期差異 |
python
# 超過界限值檢查
q1 = df['return'].quantile(0.25)
q3 = df['return'].quantile(0.75)
iqr = q3 - q1
lower = q1 - 1.5 * iqr
upper = q3 + 1.5 * iqr
outliers = df[(df['return'] < lower) | (df['return'] > upper)]
print(f'外溢值數量: {len(outliers)}')
> **結語**:資料質量的每一次檢查都可能發現影響策略表現的隱藏缺陷。務必建立自動化報表與告警機制,以便及時修正。
---
## 作業:探索性分析報告
1. **產生一份 3‑頁 PDF**,涵蓋上述所有統計量、相關係數、分布圖、時序圖與資料質量報告。
2. **撰寫 300 字心得**,說明資料的主要特徵與可能的分析挑戰。
3. **提交至雲端資料庫**(如 GitHub Repository),並在 README 標註分析流程與結論。
> **備註**:在下一章,我們將利用這些洞察,進行基於統計模型的假設檢定與參數估計,為量化交易策略奠定數學基礎。