返回目錄
A
數據驅動的投資決策:從基礎統計到量化交易 - 第 1 章
第一章:投資決策的數據基礎
發布於 2026-02-21 21:49
# 第一章:投資決策的數據基礎
> **目標**
>
> 本章將帶領讀者瞭解投資決策所需之數據來源、資料清理流程,以及特徵工程的關鍵步驟。這些基礎是後續描述性統計、時間序列模型、機器學習以及量化策略的基石。
## 1.1 投資資料來源
| 類別 | 典型來源 | 主要特點 | 取得方式 |
|------|----------|----------|----------|
| **市場數據** | 交易所原始交易資料、Bloomberg、Reuters、Yahoo Finance、Alpha Vantage | 交易價格、成交量、行情指標 | 付費 API、免費 API、下載 CSV |
| **基本面資料** | 財報資料庫(FactSet、Morningstar)、公司官方財報 | 營收、EPS、資產負債表 | PDF 解析、API 取得 |
| **替代數據** | 社群情緒(Twitter、Reddit)、氣象資料、衛星影像 | 非傳統數據,可提供市場前瞻 | Web 抓取、API 取得 |
> **實務提示**:不同來源資料的時間頻率與格式可能差異極大。建議在資料初期即完成「原始資料備份」與「資料來源說明書」的編寫,方便日後追溯與重建。
## 1.2 資料清理
資料清理是確保分析結果可靠的第一步。以下列出常見問題與解決策略。
### 1.2.1 缺失值處理
| 方法 | 何時適用 | 典型操作 |
|------|----------|----------|
| `dropna()` | 缺失值比例極低且不影響樣本量 | `df.dropna()` |
| `fillna()` | 缺失值分布較為均衡,可預測填補 | `df.fillna(method='ffill')` |
### 1.2.2 异常值檢測
> **常用統計檢測**:
> - **Z‑score**:標準化後大於 3 或小於 -3 為潛在異常。
> - **IQR(四分位距)**:`Q3 - Q1`,超出 `Q3 + 1.5*IQR` 或 `Q1 - 1.5*IQR` 的數值可視為異常。
### 1.2.3 時間同步與格式化
| 步驟 | 操作 |
|------|------|
| 轉換時區 | `pd.to_datetime(df['date']).dt.tz_localize('UTC').dt.tz_convert('Asia/Taipei')` |
| 產生時間索引 | `df.set_index('datetime', inplace=True)` |
### 1.2.4 數值變換
- **對數轉換**:減少分布偏態。
- **差分**:消除非平穩性。
- **標準化/正規化**:`(x - mean) / std` 或 `MinMaxScaler`。
## 1.3 特徵工程
特徵工程是將原始資料轉化為機器學習模型可直接使用的數值形式。以下為常見策略。
### 1.3.1 時間特徵
| 特徵 | 產生方法 |
|------|----------|
| 日期拆分 | `df['year'] = df.index.year` |
| 週期性指標 | `df['sin_day'] = np.sin(2*np.pi*df.index.dayofyear/365)` |
### 1.3.2 技術指標
| 指標 | 公式 | 實作範例 |
|------|------|----------|
| **RSI** | `100 - 100/(1 + RS)`,其中 RS = avg_gain / avg_loss | `ta.momentum.rsi(df['close'], window=14)` |
| **MACD** | `EMA12 - EMA26` | `ta.trend.macd(df['close'])` |
| **Bollinger Bands** | `MA ± 2*std` | `ta.volatility.bollinger_hband(df['close'], window=20)` |
> **提示**:在技術指標與原始價格資料同時輸入模型時,須注意滯後效應,以避免「資訊泄漏」。
### 1.3.3 交叉特徵
> 透過不同資料來源或欄位之交叉,能挖掘出非線性關係。
>
> **範例**:將成交量(Volume)與價格變動(Return)相乘,產生「成交量衝擊」特徵。
### 1.3.4 文字特徵
若使用新聞、財報說明文字,可採用 NLP 技術。
- **TF‑IDF**:`TfidfVectorizer`。
- **詞嵌入**:`Word2Vec`、`Doc2Vec`、或 BERT embedding。
- **情感分析**:`VADER`、`TextBlob`。
python
# 範例:從新聞摘要產生 TF‑IDF 特徵
from sklearn.feature_extraction.text import TfidfVectorizer
docs = [
"公司公告將擴大海外市場",
"市場因政治風險顯著波動",
]
vectorizer = TfidfVectorizer(stop_words='english')
X = vectorizer.fit_transform(docs)
print(X.toarray())
## 1.4 案例:以日線資料構建回測資料集
以下示範如何從 Alpha Vantage 取得日線資料,經過清理與特徵工程後,產生可直接用於回測的 DataFrame。
python
import pandas as pd
import requests
import numpy as np
# 1️⃣ 取得資料
api_key = 'YOUR_API_KEY'
symbol = 'AAPL'
url = f'https://www.alphavantage.co/query?function=TIME_SERIES_DAILY_ADJUSTED&symbol={symbol}&outputsize=full&apikey={api_key}'
res = requests.get(url)
raw = res.json()['Time Series (Daily)']
# 2️⃣ 轉換為 DataFrame
df = pd.DataFrame.from_dict(raw, orient='index').astype(float)
df.index = pd.to_datetime(df.index)
df.sort_index(inplace=True)
# 3️⃣ 清理:去除除權除息
cols = ['1. open', '2. high', '3. low', '4. close', '6. volume']
df = df[cols]
df.columns = ['open', 'high', 'low', 'close', 'volume']
# 4️⃣ 產生每日報酬與技術指標
df['return'] = df['close'].pct_change()
df['rsi'] = ta.momentum.rsi(df['close'], window=14)
# 5️⃣ 去除缺失值
final_df = df.dropna()
print(final_df.head())
> **小結**:資料來源、清理流程、特徵工程是投資決策模型的基礎。缺失、噪音或誤差均可能在模型階段放大,導致決策失誤。務必在數據管線上設定自動化檢查、版本控制與資料備份,確保後續分析的可重現性。
---
> **作業**:請選擇一個您感興趣的金融資料集(如:ETF、個股、或行業指標),完成上述資料清理與特徵工程流程,並將結果以 CSV 檔形式備份。下一章將討論如何以此基礎進行描述性統計分析。