聊天視窗

量化交易策略設計與實踐:從數據到執行的完整流程 - 第 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 --- > **下一步**:在第三章中,我們將以本章整理好的資料為基礎,開始實作特徵工程與訊號擴充,進一步探索因子模型與深度學習的資料前處理策略。