返回目錄
A
量化交易策略設計與實踐:從數據到執行的完整流程 - 第 2 章
第二章:數據驅動的基礎建設
發布於 2026-02-22 09:12
# 第二章:數據驅動的基礎建設
> **核心概念**:\n量化交易的每一步都以資料為核心,從獲取、儲存、清理,到轉化為可用特徵。\n本章將為讀者搭建一套可擴充、可維護、可追蹤的數據基礎建設,並闡述常見的資料清洗與時間對齊技巧,為後續模型訓練與回測奠定堅實基礎。
## 2.1 交易數據來源、存儲與管理
| 資料類型 | 主要來源 | 優缺點 | 典型工具 |
|-----------|----------|--------|----------|
| **交易指令與成交** | 交易所原始訂單流(e.g., NASDAQ TAQ, CME Tick Data) | 高頻、低延遲;資料量巨大 | Kdb+, TimescaleDB, InfluxDB |
| **行情行情(行情點)** | 交易所行情 API(e.g., BATS、Eurex)| 速率較高,結構化 | Redis Streams, Kafka |
| **歷史行情** | 第三方數據供應商(Bloomberg, Refinitiv, Quandl) | 方便下載、篩選 | Pandas, SQL |
| **基本面資料** | Bloomberg、FactSet、Morningstar | 資料更新周期慢,需爬蟲或 API | CSV, Parquet, MongoDB |
| **替代資料** | 社群媒體、衛星影像、天氣、ESG 指標 | 具創造性、可提升訊號 | Twitter API, Google Cloud Vision, ESG API |
| **衍生資料** | 行情衍生指標(MA、RSI)、統計因子 | 需自行計算 | TA-Lib, Pandas‑ta |
### 2.1.1 資料存儲選型
| 存儲類型 | 適用場景 | 優勢 | 缺點 |
|-----------|----------|------|------|
| **關聯式資料庫(RDBMS)** | 交易日歷、指令履歷、合約資訊 | ACID、易查詢 | 不適合高頻 tick、伸縮性差 |
| **時序資料庫(TSDB)** | Tick、OHLCV | 高寫入吞吐、壓縮 | 查詢彈性有限 |
| **列式儲存(Columnar)** | 大批量行情、歷史檔 | 高壓縮、查詢速度 | 寫入成本高 |
| **檔案湖(Data Lake)** | 原始資料備份、非結構化 | 靈活、成本低 | 需要 ETL |
| **雲端儲存(S3, GCS, Azure Blob)** | 共享、跨團隊 | 可擴充、耐久 | 延遲較高 |
> **實務建議**:對於高頻交易(>1k tick/s)通常採用 TSDB + Redis 做即時 cache;對於日常策略開發,TimescaleDB 或 kdb+ 是常見選擇。若資料量巨大且多來源,可先將原始資料寫入 S3,再用 Spark/Polars 做批處理。
### 2.1.2 資料管理與治理
| 需求 | 具體做法 |
|------|----------|
| **資料版本化** | 使用 Delta Lake / Iceberg 或 git‑LFS 追蹤 Parquet 版本 |
| **資料質量檢查** | 事前校驗(完整性、時間戳一致性)+ 事後監控(缺失率、異常點) |
| **安全與合規** | 加密傳輸、存取控制、審計日誌 |
| **資料血統(Lineage)** | Airflow DAG + lineage API(e.g., Marquez) |
| **可擴充性** | 分區策略(時間、合約) + 讀寫分離 |
> **提示**:在大型交易團隊中,資料治理往往是瓶頸,建議從最小可行性(MVP)開始,逐步加入資料校驗、版本控制等功能。
## 2.2 資料清洗、時間對齊與特徵標準化
### 2.2.1 資料清洗
| 步驟 | 說明 | 常見工具 |
|------|------|-----------|
| **缺失值處理** | 1. 刪除 2. 前向/後向填補 3. 插值 | Pandas `fillna`, `interpolate` |
| **異常值檢測** | Z‑score, IQR, 4σ 法則 | NumPy, SciPy |
| **重複資料** | 根據主鍵(時間+合約)去重 | SQL `DISTINCT`, Pandas `drop_duplicates` |
| **時間戳校正** | 轉換時區、同步夏令時間 | `pytz`, `dateutil` |
| **合併資料源** | 對齊欄位、合併欄位 | Pandas `merge` |
> **實務範例**:以 Python pandas 處理 Nasdaq TAQ tick 資料,填補缺失並剔除極端價格跳躍。
python
import pandas as pd
# 讀取 CSV (示例)
raw = pd.read_csv('nasdaq_taq.csv')
# 轉為 datetime
raw['timestamp'] = pd.to_datetime(raw['timestamp'])
# 先按時間排序
raw.sort_values('timestamp', inplace=True)
# 缺失價格填補
raw['price'].fillna(method='ffill', inplace=True)
# 剔除 4σ 以上跳躍
mean = raw['price'].mean()
std = raw['price'].std()
raw = raw[(raw['price'] >= mean - 4*std) & (raw['price'] <= mean + 4*std)]
# 針對每個合約去重
raw.drop_duplicates(subset=['timestamp', 'symbol'], inplace=True)
### 2.2.2 時間對齊(Resampling & Synchronization)
| 概念 | 實作細節 | 典型場景 |
|------|-----------|-----------|
| **頻率轉換** | tick → 1‑min bar;1‑min bar → 5‑min bar | `resample('1T')`, `ohlc()` |
| **同步日曆** | 交易日、非交易日、周末、節假日 | `pandas.tseries.offsets` |
| **對齊多資產** | 所有合約在同一頻率、同一時間點 | `pd.concat(..., axis=1)` |
| **時間窗格化** | 例如 30‑s rolling windows | `rolling(30)` |
> **注意**:對於高頻策略,往往保留 **tick** 資料;對於中長線策略,則轉換為 **OHLCV**。時間對齊的關鍵是確保「同一時刻」的資料來自相同的市場時鐘。
### 2.2.3 特徵標準化
| 技術 | 目的 | 實作方式 |
|-------|-------|----------|
| **Z‑score 標準化** | 去除尺度差異、促進模型收斂 | `(x - x.mean()) / x.std()` |
| **Min‑Max Scaling** | 將特徵壓縮至 [0,1] | `sklearn.preprocessing.MinMaxScaler` |
| **Log‑轉換** | 變數非對稱分布 | `np.log1p(x)` |
| **差分(Diff)** | 消除趨勢、提升平穩性 | `x.diff()` |
| **對數回報** | 針對價格序列 | `np.log(close/close.shift(1))` |
| **技術指標計算** | 移動平均、RSI、布林帶 | TA‑Lib, Pandas‑ta |
> **實務範例**:使用 `sklearn` 的 `StandardScaler` 對 1‑min OHLCV 進行標準化,並計算 RSI。
python
from sklearn.preprocessing import StandardScaler
import ta
# 假設 df 已經有 open, high, low, close, volume
scaler = StandardScaler()
scaled = scaler.fit_transform(df[['open', 'high', 'low', 'close', 'volume']])
scaled_df = pd.DataFrame(scaled, columns=['open_s', 'high_s', 'low_s', 'close_s', 'volume_s'], index=df.index)
# 加入 RSI
rsi = ta.momentum.RSIIndicator(close=df['close'], window=14)
scaled_df['rsi'] = rsi.rsi()
### 2.2.4 資料品質評估
| 指標 | 計算方式 | 可接受閾值 |
|------|-----------|-------------|
| **缺失率** | `missing / total` | < 0.01 (1%) |
| **重複率** | `duplicated / total` | < 0.001 |
| **時間戳連續性** | `max(diff) < threshold` | 取決於頻率 |
| **價格跳躍比例** | `abs(diff) / price` | < 0.05 |
> **實務結語**:資料品質直接影響訊號的可複製性。建議在 ETL 流程中嵌入品質檢查,並透過監控平台(Grafana + Prometheus)實時報告。\n
---
### 實務練習
1. **資料來源**:從 [Quandl](https://www.quandl.com/) 下載 S&P 500 日線。\n2. **清洗**:使用 Pandas 對缺失值進行前向填補,剔除 3σ 以上異常。\n3. **時間對齊**:將日線轉為 1‑min bar(`resample('1T')`),並確保所有合約使用同一時間區域。\n4. **特徵標準化**:使用 `StandardScaler` 對收盤價、成交量進行 z‑score 標準化。\n
完成後,將資料輸出為 Parquet,並使用 Delta Lake 進行版本控制。
---
> **關鍵收穫**:\n1. **可擴充的存儲**:選擇符合資料類型與寫入需求的資料庫。\n2. **嚴謹的清洗流程**:缺失、異常、重複必須在任何模型或回測前處理。\n3. **時間一致性**:多頻資料、跨市場資料必須以統一時間戳對齊。\n4. **特徵統一尺度**:標準化能顯著提升模型收斂速度並降低訊號噪聲。\n
---
> **下一步**:在第三章中,我們將以本章整理好的資料為基礎,開始實作特徵工程與訊號擴充,進一步探索因子模型與深度學習的資料前處理策略。