返回目錄
A
從數據到利潤:量化投資策略設計與實踐 - 第 2 章
第二章:數據來源與獲取:從行情到訊息
發布於 2026-03-07 08:18
# 第二章:數據來源與獲取:從行情到訊息
量化投資的核心在於**資料**,而資料的品質與完整性直接決定策略能否成功。這一章將帶領你從零開始,了解如何挑選、取得、以及管理各種資料來源。
## 2.1 市場數據的分類
| 類型 | 典型指標 | 取得方式 | 典型應用 |
|------|----------|----------|----------|
| **行情數據** | 價格、成交量、委託量 | 交易所API、付費數據服務 | 技術指標、短期波動捕捉 |
| **財務數據** | EPS、ROE、負債比 | 財報下載、第三方財務平台 | 估值模型、基本面篩選 |
| **新聞/社交數據** | 標題、情緒、關鍵字 | RSS、Twitter API、爬蟲 | 情緒分析、事件驅動 |
| **宏觀經濟數據** | CPI、GDP、失業率 | 政府統計網站、Bloomberg | 風險控制、長期投資 |
> **實務提醒**:行情數據雖然看似「最簡單」,但其頻率、延遲與資料完整度差異極大,選擇時必須兼顧「即時性」與「價格正確性」。
## 2.2 非結構化資料的魅力
量化投資不只是數字遊戲,新聞標題、公司公告、甚至推特短文,都能提供市場情緒的微觀訊號。把握這類資料的關鍵是:
1. **資料清洗**:去除HTML標籤、標點、停用詞。<br>2. **特徵抽取**:TF‑IDF、Word2Vec、BERT嵌入。<br>3. **情緒打分**:Lexicon法、深度學習情緒分類模型。
以下是一個簡易的Python範例,示範如何使用`tweepy`抓取推文並計算情緒分數:
```python
import tweepy
from textblob import TextBlob
# 取得API
auth = tweepy.OAuth1UserHandler('consumer_key', 'consumer_secret', 'access_token', 'access_token_secret')
api = tweepy.API(auth)
# 抓取關鍵字
tweets = api.search(q='AAPL', lang='zh-tw', count=100)
# 情緒分析
scores = [TextBlob(t.text).sentiment.polarity for t in tweets]
print('平均情緒分數:', sum(scores)/len(scores))
```
> **風險提示**:非結構化資料容易受語境影響,過度依賴單一情緒模型可能產生偏差,建議多模型交叉驗證。
## 2.3 資料收集工具與平台
| 工具 | 特色 | 優點 | 缺點 |
|------|------|------|------|
| **Python + pandas** | 低門檻、易上手 | 快速處理小規模數據 | 大數據處理不佳 |
| **Apache Kafka** | 分佈式訊息隊列 | 高吞吐量、實時數據流 | 部署複雜 |
| **AWS S3 + Glue** | 雲端儲存與ETL | 大規模、彈性 | 成本不可忽視 |
| **Google BigQuery** | 大數據查詢 | 低延遲、即時SQL | 需SQL知識 |
> **實務提示**:選擇工具時,請先評估「數據量、更新頻率」與「開發成本」兩大因素。
## 2.4 資料庫設計與存取策略
量化策略常涉及**時間序列資料**,因此資料庫的設計至關重要。常見的架構包括:
1. **關係型資料庫(PostgreSQL)**:結構化數據、ACID交易,適合報表與歷史查詢。
2. **時序資料庫(InfluxDB、TimescaleDB)**:寫入快、查詢聚合高效,適合行情實時存儲。
3. **NoSQL(MongoDB、Redis)**:靈活結構、快速讀寫,適合非結構化資料。
### 範例:TimescaleDB 時序資料表
```sql
CREATE TABLE prices (
time TIMESTAMPTZ NOT NULL,
symbol TEXT NOT NULL,
open NUMERIC,
high NUMERIC,
low NUMERIC,
close NUMERIC,
volume BIGINT,
PRIMARY KEY (time, symbol)
);
SELECT * FROM prices WHERE symbol = 'AAPL' AND time >= now() - interval '1 week';
```
> **最佳實踐**:將「交易日歷」存於獨立表格,方便排除停盤日;使用索引與分區減少查詢延遲。
## 2.5 資料版本控制與備份
即使是最乾淨的資料,也可能因**API更新、資料遺失**等原因產生差異。使用版本控制可以追蹤每一次更新。
1. **Git + DVC**:將資料元資料(如檔名、哈希)存入Git,實際數據放在外部儲存。
2. **S3 + Glacier**:對長期保留的歷史數據做冷儲存,節省成本。
3. **備份策略**:每週全備份 + 每日增量備份,確保重建能力。
> **實務提示**:在高頻交易環境,**每日數據檢查**(檢查缺失值、異常跳點)是必須的。
## 2.6 數據品質檢測流程
| 步驟 | 目的 | 工具 | 範例 |
|------|------|------|------|
| 1. 缺失值檢測 | 確認數據完整性 | pandas.isnull() | `df.isnull().sum()` |
| 2. 异常值檢測 | 过滤噪声 | z-score、IQR | `np.abs(zscore(df['close'])) > 3` |
| 3. 時間對齊 | 保證多源同步 | pandas.resample() | `df.resample('1D').last()` |
| 4. 交易日校正 | 排除非交易日 | pandas.tseries.offsets.BusinessDay | `pd.date_range(start, end, freq='B')` |
| 5. 版本比對 | 防止資料重複 | MD5 | `hashlib.md5(df.to_csv(index=False).encode()).hexdigest()` |
> **風險提示**:過度修正缺失值可能掩蓋市場真實波動,建議保留「NaN」做為警示。
## 2.7 小結
本章闡述了從市場行情到社交媒體,從結構化到非結構化,乃至資料庫設計、版本控制與品質檢測的完整流程。掌握這些基礎,才能在後續章節中順利構建模型、進行回測,最終落地獲利。
> **練習題**:請挑選一種非結構化資料(如財報公告),設計一個資料抓取到存儲的工作流,並在Git中紀錄每一次版本。