聊天視窗

金融數據科學實戰:從原始數據到智能投資 - 第 3 章

第3章 描述性統計與探索性分析

發布於 2026-03-06 11:56

# 第3章 描述性統計與探索性分析 本章將帶領讀者透過**視覺化圖表**、**統計指標**以及**相關性矩陣**,快速掌握金融資料的分布、波動與內在關係。這些探索性分析(EDA)不僅能協助我們了解市場情緒,也能揭示潛在的套利機會與風險點。 ## 3.1 直方圖(Histogram) - **目的**:觀察單一變數的分布形態(正態、偏態、離散等)。 - **應用**:檢測日報酬率、波動率、債券利差等的非對稱性,進一步決定是否需要對數轉換或分組。 ### 3.1.1 典型範例:日報酬率分布 python import pandas as pd import matplotlib.pyplot as plt # 讀取日報酬率資料 returns = pd.read_csv('sp500_returns.csv', parse_dates=['date'], index_col='date') plt.figure(figsize=(10, 4)) plt.hist(returns['daily_return'], bins=50, color='steelblue', edgecolor='k') plt.title('S&P 500 日報酬率直方圖') plt.xlabel('日報酬率') plt.ylabel('頻率') plt.grid(True, linestyle='--', alpha=0.4) plt.show() ### 3.1.2 直方圖的進階技巧 | 技巧 | 說明 | |------|------| | **Log 轉換** | 對右偏或極值資料使用 `np.log1p`,降低長尾影響。 | | **核密度估計**(KDE) | 在直方圖上疊加 KDE 曲線,呈現連續密度。 | | **分箱寬度** | 使用 `np.histogram_bin_edges` 或 `freedman_diaconis_bin_width` 自動決定。 | ## 3.2 箱形圖(Boxplot) - **目的**:快速呈現數據的四分位數、極端值與離群點。對於多個時間序列的比較尤為有用。 - **應用**:比較不同資產日報酬率的分散程度,檢測交易時段的高低波動。 ### 3.2.1 範例:多個指數報酬率箱形圖 python # 以 pd.concat 形成多列資料 indices = pd.concat([ pd.read_csv('sp500_returns.csv', usecols=['daily_return'], parse_dates=['date'], index_col='date'), pd.read_csv('nasdaq_returns.csv', usecols=['daily_return'], parse_dates=['date'], index_col='date'), pd.read_csv('dow_returns.csv', usecols=['daily_return'], parse_dates=['date'], index_col='date') ], axis=1, keys=['S&P 500', 'NASDAQ', 'DJIA']) indices.boxplot(figsize=(12, 6), grid=False, fontsize=12) plt.title('三大指數日報酬率箱形圖') plt.ylabel('日報酬率') plt.show() ### 3.2.2 補充說明 - **離群點**:箱形圖以 1.5 * IQR 為臨界值;若數據極度分散,離群點可能代表高頻交易或極端市場事件。 - **對稱性檢測**:若上四分位數與下四分位數距離不等,說明分布偏態;可結合直方圖進一步確認。 ## 3.3 相關係數矩陣(Correlation Matrix) - **目的**:量化多變量之間的線性依賴,找出同向/相反向關係。對於套利、風險分散、資產組合非常關鍵。 - **方法**:常用 Pearson、Spearman 或 Kendall 相關係數;對於非正態資料建議使用 Spearman。 ### 3.3.1 範例:多資產報酬率相關矩陣 python # 讀取多資產日報酬率 rets = pd.read_csv('multi_asset_returns.csv', parse_dates=['date'], index_col='date') # 計算 Pearson 相關係數 corr = rets.corr(method='pearson') # 以 seaborn 熱力圖展示 import seaborn as sns plt.figure(figsize=(8, 6)) sns.heatmap(corr, annot=True, fmt='.2f', cmap='coolwarm', vmin=-1, vmax=1) plt.title('多資產日報酬率 Pearson 相關矩陣') plt.show() ### 3.3.2 進階技巧 | 技巧 | 目的 | |------|------| | **相關係數篩選** | 只保留絕對值大於 0.7 或小於 -0.7 的項目,快速定位強相關對。 | | **時間滯後相關** | 使用 `pd.concat([rets.shift(i) for i in range(1, 6)], axis=1)` 計算多個時延,探討延遲效應。 | | **多重共線性檢測** | 利用 VIF (Variance Inflation Factor) 量化共線性程度,避免回歸模型不穩定。 | ## 3.4 市場情緒與套利機會的 EDA ### 3.4.1 市場情緒指標 - **RSI、布林帶、MACD** 等技術指標本身即為高頻訊號,可透過直方圖檢視其分布。 - **情緒文字雲**:利用 NLP 對財經新聞、推特等文本生成情緒分佈。 ### 3.4.2 套利機會篩選 1. **配對交易(Pairs Trading)**:計算兩資產日報酬率差值,觀察其分布與自相關;若差值呈現長期均值回歸,則構成套利機會。 2. **統計套利(Statistical Arbitrage)**:利用多因子模型(如 Fama‑French)提取異常回報,進行動量或逆向交易。 3. **高頻信號**:對秒級資料進行滑動窗口分析,快速識別極短期價差或價格異常。 ## 3.5 實作範例:結合直方圖、箱形圖與相關矩陣的完整工作流程 python import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns # 1. 讀取資料 returns = pd.read_csv('returns.csv', parse_dates=['date'], index_col='date') # 2. 直方圖 plt.figure(figsize=(8, 4)) sns.histplot(returns['daily_return'], bins=60, kde=True, color='teal') plt.title('日報酬率分布') plt.xlabel('日報酬率') plt.ylabel('頻率') plt.show() # 3. 箱形圖 plt.figure(figsize=(8, 4)) sns.boxplot(data=returns[['daily_return']], width=0.5) plt.title('日報酬率箱形圖') plt.ylabel('日報酬率') plt.show() # 4. 相關矩陣 corr = returns.corr() plt.figure(figsize=(6, 5)) sns.heatmap(corr, annot=True, cmap='viridis', vmin=-1, vmax=1) plt.title('相關矩陣') plt.show() ## 3.6 小結 - **視覺化**:直方圖揭示分布形態,箱形圖說明分散與離群;相關矩陣快速顯示多變量關係。 - **實務應用**:利用 EDA 迅速判斷是否需要資料轉換、是否存在套利機會、或是進一步建模的依據。 - **持續迭代**:EDA 是一個迴圈:初步分析 → 生成假說 → 調整資料 → 重新分析。 > **提示**:在金融數據的 EDA 階段,務必留意「交易時段」與「交易日曆」的影響,因為不同市場可能在同一時間內存在不同的交易頻率與開盤時間。