聊天視窗

數據驅動的投資決策:從基礎統計到量化交易 - 第 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 檔形式備份。下一章將討論如何以此基礎進行描述性統計分析。