聊天視窗

數據駕駛:從零開始的量化投資實戰 - 第 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 官方文檔」中的相關章節。理解基本概念後,再回來完成實作任務,會更得心應手。