聊天視窗

金融數據科學:從基礎到量化交易 - 第 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)**:在資料清洗後,我們將進一步用統計圖表、相關係數矩陣等手段檢視市場結構。 - **第四章:模型建構與驗證**:資料前處理是模型成功的基礎,缺陷將直接影響模型的偏差與方差。 > **結語**:資料採集與前處理並非一次性任務,而是一個持續迭代的循環。隨著市場的變化與資料源的更新,持續追蹤資料品質、調整處理流程,是每位金融數據科學家必備的職業素養。