返回目錄
A
數據駕駛:從零開始的量化投資實戰 - 第 2 章
第 2 章 資料之源:從收集到清洗
發布於 2026-02-20 21:02
# 第 2 章 資料之源:從收集到清洗
## 2.1 量化投資的核心資產——資料
在量化投資的世界裡,資料是唯一不會被情緒侵蝕的資產。當傳統投資者依賴直覺、新聞或是分析師的報告時,量化投資者則把「海量、結構化且可重複使用」的資料視為策略的基石。資料的質量直接決定模型的可行性、風險控制的精準度以及最終的投資績效。
> **案例**:早在 2017 年,某量化基金因為使用了不完整的高頻交易資料,最終導致回測結果高估 4% 的報酬。透過對資料來源的嚴格篩選與清洗,最終該基金的實盤表現提升了近 7%。
## 2.2 資料來源大分類
| 類型 | 典型來源 | 主要特性 | 常見挑戰 |
|------|----------|----------|----------|
| **結構化資料** | Bloomberg、Reuters、Quandl | 資料表格化、欄位明確 | 欠缺非結構化訊息、頻率受限 |
| **半結構化資料** | Twitter、Reddit、企業公告 | JSON / XML、部分欄位可缺失 | 需要自訂解析器、噪音多 |
| **非結構化資料** | 影像、音訊、影片 | 無明確欄位 | 需要深度學習轉換 |
| **市場數據** | 交易所、期貨所、外匯平台 | 交易行情、成交量、時間戳 | 低延遲、分層存取 |
| **替代資料** | 社會指標、氣候數據、衛星影像 | 對傳統金融數據無法直接反映 | 數據可用性不均、驗證困難 |
> **提示**:在選擇資料來源時,先判斷「資料能否為模型提供新增價值」再考量成本與存取難易。
## 2.3 資料收集流程
1. **需求定義**:明確策略所需的時間週期、頻率與特徵。
2. **資料清單編製**:列出所有可用來源,並對每一項進行成本與可取得性評估。
3. **API 或爬蟲**:利用官方 API 或自訂爬蟲抓取資料,確保版權與使用條款合規。
4. **定時刷新**:設計資料管道,確保資料以合適的頻率(秒、分鐘、日)更新。
5. **備份與歸檔**:使用雲端或本地備份,確保資料安全與長期可查。
```python
# 範例:使用 yfinance 抓取 S&P 500 日線
import yfinance as yf
sp500 = yf.download('^GSPC', start='2010-01-01', end='2023-12-31', interval='1d')
sp500.to_csv('data/sp500_daily.csv')
```
## 2.4 資料品質的重要性
### 2.4.1 欠缺值(Missingness)
- **隨機缺失**(Missing Completely At Random, MCAR):缺失不影響統計推論。
- **條件缺失**(Missing At Random, MAR):缺失與觀測值相關,需透過插補或模型修正。
- **非隨機缺失**(Missing Not At Random, MNAR):缺失本身攜帶訊息,往往是策略失效的根源。
> **實務建議**:先畫出缺失矩陣,確認缺失機制;若缺失率 > 5%,考慮使用多重插補或刪除。
### 2.4.2 異常值(Outliers)
異常值可能是資料輸入錯誤,也可能是極端市場事件。若不加處理,會嚴重偏移模型的係數或產生過度擬合。
- **方法**:箱型圖、Z-score、IQR、Isolation Forest 等。
- **處理**:修正、剔除或轉換(log、winsorize)。
```python
# 範例:Winsorize 0.5% 兩側
from scipy.stats.mstats import winsorize
data_winsor = winsorize(data, limits=[0.005, 0.005])
```
### 2.4.3 資料一致性(Consistency)
- **欄位對齊**:確保多源資料的欄位名稱、時間格式一致。
- **時區統一**:特別是跨國市場資料,需將時間戳統一為 UTC 或本地時間。
- **資料版本控制**:利用 Git 或 DVC 管理資料變更歷程。
## 2.5 前處理技術總結
| 技術 | 目的 | 典型工具 |
|------|------|----------|
| 欠缺值插補 | 補全資料 | `sklearn.impute`, `fancyimpute` |
| 異常值檢測 | 消除極端偏差 | `IsolationForest`, `LocalOutlierFactor` |
| 正規化 | 降低尺度差異 | `StandardScaler`, `MinMaxScaler` |
| 特徵工程 | 生成有意義特徵 | `pandas`, `Featuretools` |
| 數據集成 | 合併多源資料 | `merge`, `join`, `concat` |
> **小結**:資料的質量決定策略能否從理論走向實務。只要在資料收集與清洗階段投入足夠的時間與工具,後續的模型開發、風險控管與執行才不會被「噪音」所毀。
## 2.6 小實驗:從 Yahoo! 財經抓取資料並做簡單清洗
```python
import yfinance as yf
import pandas as pd
# 下載過去 5 年的台積電資料
ticker = yf.Ticker('2330.TW')
df = ticker.history(period='5y', interval='1d')
# 基本清洗
# 1. 移除 NA
print('原始 NA 率:', df.isna().mean())
df_clean = df.dropna()
print('清洗後 NA 率:', df_clean.isna().mean())
# 2. 轉換日期索引為 UTC
df_clean.index = df_clean.index.tz_convert('UTC')
# 3. 產生簡單特徵
df_clean['Return'] = df_clean['Close'].pct_change()
df_clean['MA20'] = df_clean['Close'].rolling(window=20).mean()
# 4. 保存至 CSV
df_clean.to_csv('data/2330_clean.csv')
```
> **提示**:若資料量過大,建議使用 Parquet 或 Feather 格式,提升讀寫效率。
## 2.7 讀者實作任務
1. **選擇兩個不同類型的資料來源**(例如結構化市場數據與半結構化社群數據)。
2. **設計資料管道**,將兩者合併成一個時間序列資料集。
3. **執行缺失值、異常值檢測**,並記錄每一步的處理結果。
4. **撰寫報告**:說明資料品質問題、處理方法與對策略的潛在影響。
> **最後提醒**:在資料處理的每一步,都要寫下「為何選擇此方法」的解釋。這不僅是對未來自己的提醒,也是對合作夥伴的信任保證。
---
> **閱讀提示**:若你對資料清洗的工具不熟悉,可先閱讀「pandas 官方文件」或「Scikit-learn 官方文檔」中的相關章節。理解基本概念後,再回來完成實作任務,會更得心應手。