返回目錄
A
金融數據科學:從基礎到量化交易 - 第 2 章
第二章:資料採集與前處理實務技巧
發布於 2026-03-04 07:06
# 第二章:資料採集與前處理實務技巧
在金融數據科學的道路上,資料本身就是最珍貴的資產。若資料來源不清晰、品質欠佳,後續任何模型建構與驗證都會被無形地扭曲。本章將以實務導向,從資料採集的原始流程到前處理的精細化操作,為讀者鋪陳一條可複製、可擴充的資料管道。
## 1. 資料來源:選擇與確認
| 資料類型 | 典型來源 | 優勢 | 限制 |
|---|---|---|---|
| 市場行情 | Bloomberg、Reuters、Yahoo Finance、Alpha Vantage | 實時、覆蓋面廣 | 需授權、API 呼叫次數有限 |
| 基本面 | EDGAR、FactSet、Compustat | 深度、結構化 | 取得成本高、更新周期長 |
| 社群情緒 | Twitter、Reddit、金融論壇 | 反映市場情緒即時 | 噪聲多、需要 NLP 解析 |
| 內部交易 | 交易所內部系統、券商 API | 精準、完整 | 存取權限受限、數據量巨大 |
> **實務小提醒**:先列出你要解決的問題,再回過頭去確認哪些資料能直接回答問題。不要因為「資料好看」就被動追逐。
## 2. 資料採集方法
### 2.1 API 接取
- **RESTful**:適合日間行情、基本面資料。使用 `requests` 或 `httpx` 進行 GET/POST,並將回傳的 JSON 存成 `pandas.DataFrame`。
- **WebSocket**:適合實時交易資料。Python 例子:
python
import asyncio
import websockets
async def stream():
async with websockets.connect("wss://example.com/stream") as ws:
async for msg in ws:
data = json.loads(msg)
# 轉成 DataFrame 或直接存檔
asyncio.run(stream())
- **爬蟲**:對於沒有 API 的網站,使用 `BeautifulSoup` + `requests` 或 `Scrapy`,並遵循 `robots.txt` 與版權。
### 2.2 資料倉庫
- **關聯式資料庫**:PostgreSQL、MySQL。適合結構化資料,支援 SQL 的 ACID 交易。
- **NoSQL**:MongoDB、Cassandra。適合非結構化或半結構化資料,擴展性好。
- **時序資料庫**:InfluxDB、TimescaleDB。對於高頻交易資料,提供時間索引優化。
> **小技巧**:若資料量超過 10TB,請考慮使用分區表或分區集群,避免單一節點負荷過大。
## 3. 資料前處理:品質與一致性的關鍵
### 3.1 缺失值處理
| 方法 | 適用情境 |
|---|---|
| 刪除 | 缺失率 < 5% 且資料量足夠 |
| 插補(均值/中位數) | 數值型資料、缺失率 < 20% |
| 時間序列插值(線性、樣條) | 連續交易日缺失 |
| 迴歸插補 / MICE | 多變量缺失、複雜關係 |
> **注意**:插補後請檢查是否引入偏差,尤其在金融預測中,少數缺失值可能承載重要訊息。
### 3.2 异常值處理
- **統計法**:Z-score > 3 或 IQR 超出 1.5×IQR。
- **機器學習**:Isolation Forest、One-Class SVM。
- **業務法**:若交易量超過 5 倍日均值,先確認是否為系統錯誤再決定是否剔除。
### 3.3 時間對齊與補齊
- **非交易日**:使用 `pandas.tseries.offsets.BDay` 設定商業日曆,對缺失的交易日做 Forward/Backward 填補或使用季節性插值。
- **多頻率資料**:如日內 5 分鐘與日結束的收盤價,先對 5 分鐘資料做聚合,確保同一時間尺度。
### 3.4 變數標準化與編碼
- **標準化**:`(x - μ)/σ`,適合線性模型。
- **MinMax**:將值縮放至 [0,1],適合神經網路。
- **類別編碼**:One-Hot、Target Encoding、Ordinal Encoding。金融中常見的類別變數有「產業類別」、「交易所」等。
> **實務提醒**:所有預處理步驟都應在 `train` 與 `test` 兩個資料集分開執行,以避免資訊洩漏。
## 4. 資料品質評估
| 角度 | 指標 |
|---|---|
| 連續性 | 交易日缺失比例、缺失日距離 |
| 一致性 | 同一資產在不同資料源的價格差異 |
| 完整性 | 需要的欄位是否全部存在 |
| 時間同步 | 交易時間與行情時間的時差 |
> **工具**:使用 `pandas_profiling` 或 `sweetviz` 快速生成報表;若需深度檢測,可搭配 `Great Expectations` 建立自動化測試。
## 5. 典型案例:從 Alpha Vantage 下載 S&P 500 成分股
1. **API 呼叫**:
python
import requests, pandas as pd
url = "https://www.alphavantage.co/query"
params = {
"function": "TIME_SERIES_DAILY_ADJUSTED",
"symbol": "AAPL",
"apikey": "YOUR_KEY",
"outputsize": "full"
}
res = requests.get(url, params=params)
data = res.json()["Time Series (Daily)"]
df = pd.DataFrame.from_dict(data, orient='index').astype(float)
df.index = pd.to_datetime(df.index)
df.sort_index(inplace=True)
2. **資料清洗**:刪除 `Dividends` 與 `Stock Splits` 欄位,將 `Close` 當作收盤價。
3. **缺失值處理**:由於 Alpha Vantage 無週末與假日資料,直接進行 forward fill。
4. **儲存**:存成 Parquet,方便下游分析。
## 6. 後續章節連結
- **第三章:探索性資料分析(EDA)**:在資料清洗後,我們將進一步用統計圖表、相關係數矩陣等手段檢視市場結構。
- **第四章:模型建構與驗證**:資料前處理是模型成功的基礎,缺陷將直接影響模型的偏差與方差。
> **結語**:資料採集與前處理並非一次性任務,而是一個持續迭代的循環。隨著市場的變化與資料源的更新,持續追蹤資料品質、調整處理流程,是每位金融數據科學家必備的職業素養。