返回目錄
A
數據驅動的投資決策:金融分析與機器學習實務 - 第 4 章
第4章 機器學習在投資中的應用
發布於 2026-02-24 02:31
# 第4章 機器學習在投資中的應用
本章將機器學習的三大類型——監督式學習、非監督式學習與強化學習——與投資實務結合,說明如何以數據為基礎開發選股、ETF 配資與風險管理模型。章節將從概念說明、核心演算法、實務案例,到模型評估與部署建議,逐層解構,並提供可直接複製執行的 Python 範例。
## 4.1 監督式學習概念
監督式學習是最常見的金融機器學習方法,目標是預測「目標變量」與「特徵變量」之間的映射。金融領域的典型目標變量可分為兩大類:
| 類別 | 典型目標 | 例子 |
|------|----------|------|
| 回歸 | 價格、報酬率、波動率等連續值 | 估算未來 30 天平均報酬率 |
| 分類 | 上漲/下跌、投資風險級別 | 判斷某股票是否為買進信號 |
### 4.1.1 回歸模型
#### 線性回歸(OLS)
python
import pandas as pd
from sklearn.linear_model import LinearRegression
# 假設 df 包含特徵 X1, X2, 以及目標 y
X = df[['X1', 'X2']]
y = df['y']
model = LinearRegression()
model.fit(X, y)
print('係數:', model.coef_)
print('截距:', model.intercept_)
#### 正則化回歸(Ridge / Lasso)
python
from sklearn.linear_model import Ridge, Lasso
ridge = Ridge(alpha=1.0)
lasso = Lasso(alpha=0.1)
ridge.fit(X, y)
lasso.fit(X, y)
#### 树模型與集成(Decision Tree, Random Forest, XGBoost)
python
from sklearn.ensemble import RandomForestRegressor
import xgboost as xgb
rf = RandomForestRegressor(n_estimators=200, random_state=42)
rf.fit(X, y)
xgb_model = xgb.XGBRegressor(objective='reg:squarederror', n_estimators=200)
xgb_model.fit(X, y)
### 4.1.2 分類模型
#### 邏輯迴歸
python
from sklearn.linear_model import LogisticRegression
clf = LogisticRegression(max_iter=1000)
clf.fit(X, y)
#### 支援向量機(SVM)
python
from sklearn.svm import SVC
svm = SVC(kernel='rbf', probability=True)
svm.fit(X, y)
#### 隨機森林 & XGBoost 分類
python
from sklearn.ensemble import RandomForestClassifier
clf_rf = RandomForestClassifier(n_estimators=200)
clf_rf.fit(X, y)
#### 深度學習(簡化示例)
python
import tensorflow as tf
from tensorflow.keras import layers
model = tf.keras.Sequential([
layers.Dense(64, activation='relu', input_shape=(X.shape[1],)),
layers.Dense(32, activation='relu'),
layers.Dense(1, activation='sigmoid')
])
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
model.fit(X, y, epochs=20, batch_size=32, validation_split=0.2)
## 4.2 非監督式學習:聚類
聚類可以協助發掘市場結構、同質性股票群體,或在投資組合中找到「風險類別」。
### K‑Means
python
from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters=4, random_state=42)
clusters = kmeans.fit_predict(df[['feature1', 'feature2']])
### DBSCAN(密度聚類)
python
from sklearn.cluster import DBSCAN
dbscan = DBSCAN(eps=0.5, min_samples=5)
clusters = dbscan.fit_predict(df[['feature1', 'feature2']])
### 主成分分析(PCA)與聚類結合
PCA 可降維後再聚類,減少維度與噪音。
python
from sklearn.decomposition import PCA
pca = PCA(n_components=0.95) # 保留 95% 變異
X_reduced = pca.fit_transform(df[['feature1', 'feature2', 'feature3']])
## 4.3 強化學習基礎
強化學習(RL)透過「代理(Agent)」與「環境(Environment)」的交互,學習最優的行動策略,常見於交易時序策略。
### 基本構成
- **狀態 (State)**:當前市場指標或組合持倉情況。
- **行動 (Action)**:買進、賣出或持有。
- **獎勵 (Reward)**:交易利潤或風險調整後的報酬。
### Gym 與 FinRL 範例
python
import gym
import pandas as pd
import numpy as np
# 建立自訂環境
class StockTradingEnv(gym.Env):
def __init__(self, df):
self.df = df
self.n_steps = len(df)
self.current_step = 0
self.action_space = gym.spaces.Discrete(3) # 0: 卖, 1: 持, 2: 买
self.observation_space = gym.spaces.Box(low=0, high=np.inf, shape=(5,), dtype=np.float32)
def reset(self):
self.current_step = 0
return self._get_obs()
def _get_obs(self):
obs = self.df.iloc[self.current_step][['Close', 'MA5', 'MA20']].values
return obs
def step(self, action):
reward = 0
self.current_step += 1
done = self.current_step >= self.n_steps - 1
return self._get_obs(), reward, done, {}
# 假設 df 為收盤價與技術指標
env = StockTradingEnv(df)
### 代理訓練
python
from stable_baselines3 import DQN
model = DQN('MlpPolicy', env, verbose=1)
model.learn(total_timesteps=10000)
> **提示**:RL 需要大量歷史數據、回測與過度擬合控制,建議先在離線回測框架 (Backtrader / Zipline) 內跑一次「模擬環境」再導入 RL。
## 4.4 應用案例
| 需求 | 監督式 | 非監督式 | 強化學習 |
|------|--------|----------|----------|
| 股票選股 | 使用 XGBoost + 技術指標預測上漲概率 | K‑Means 找到同質性高股 | DQN 以價格趨勢作為狀態,買/賣決策 |
| ETF 配資 | 回歸預測個別 ETF 風險加權報酬 | 聚類得到「主題」 ETF 群 | RL 以持倉比例作為行動,追求風險調整後報酬 |
| 風險管理 | Lasso 估算報酬分布 + VaR | DBSCAN 發現高風險區塊 | RL 環境加入止損/止盈獎勵 |
### 4.4.1 股票選股範例(XGBoost)
python
import xgboost as xgb
from sklearn.metrics import roc_auc_score
X = train[['Open', 'High', 'Low', 'Close', 'Volume', 'MA5', 'RSI']]
y = train['Up'] # 1: 下個交易日收盤價上漲
xgb_clf = xgb.XGBClassifier(objective='binary:logistic', n_estimators=300)
xgb_clf.fit(X, y)
# 取得預測概率
pred_proba = xgb_clf.predict_proba(X_test)[:,1]
print('AUC:', roc_auc_score(y_test, pred_proba))
### 4.4.2 ETF 配資範例(聚類 + 投資組合)
python
# 1. 對 30 筆 ETF 進行 K‑Means 聚類
kmeans = KMeans(n_clusters=3, random_state=42)
cluster_labels = kmeans.fit_predict(etf_df[['ExpenseRatio', 'Momentum', 'Beta']])
# 2. 在每個聚類內做最小化波動率分配
from cvxpy import Variable, Minimize, Problem, sum_squares
allocations = []
for cls in set(cluster_labels):
idx = np.where(cluster_labels==cls)[0]
X_cls = etf_df.iloc[idx][['Return', 'Cov']] # 以樣本共變矩陣為例
w = Variable(len(idx))
objective = Minimize(w.T @ X_cls['Cov'] @ w)
constraints = [sum_squares(w)==1, w >= 0]
prob = Problem(objective, constraints)
prob.solve()
allocations.append(w.value)
## 4.5 模型評估與風險考量
| 評估指標 | 目的 | 範例 |
|----------|------|------|
| 回歸 | MSE / RMSE / MAE | `mean_squared_error(y_true, y_pred)` |
| 分類 | Accuracy / F1 / ROC‑AUC | `roc_auc_score(y_true, y_proba)` |
| 聚類 | Calinski‑Harabasz / Silhouette | `silhouette_score(X, labels)` |
| 強化學習 | 總報酬、夏普率、最大回撤 | `df['cum_return'].iloc[-1]`, `max_drawdown()` |
> **風險提醒**:機器學習模型在金融市場中往往面臨「資料漂移」與「過度擬合」。建議採用
> - 交叉驗證(K‑fold)+ 時序拆分(TimeSeriesSplit)
> - 正則化與模型簡化
> - 驗證集外回測(Out‑of‑Sample Backtest)
> - 連續監控模型表現,並設置「模型失效閾值」以觸發人為介入。
## 4.6 實務建議與工具
| 步驟 | 建議工具 | 重點
|------|----------|------|
| 數據蒐集 | `yfinance`, `AlphaVantage`, `Polygon.io` | 需確保資料頻率與完整性
| 數據清洗 | `pandas`, `scipy`, `statsmodels` | 缺失值處理、標準化
| 模型開發 | `scikit-learn`, `xgboost`, `tensorflow`, `stable‑baselines3` | 模型快速原型
| 回測 | `Backtrader`, `Zipline`, `FinRL` | 交易邏輯驗證
| 部署 | `Docker`, `AWS SageMaker`, `Azure ML`, `mlflow` | 版本管理與監控
| 監控 | `Prometheus`, `Grafana`, `Kibana` | 模型日常性能
> **最佳實務**:將模型抽象為「函式」或「class」,並使用 `mlflow` 追蹤參數、指標與模型檔案,確保可重現性與部署一致性。
## 4.7 小結
1. **監督式學習** 是最直接的選股與報酬預測工具,結合技術指標、基本面資料與情緒指標,可得到高信賴度的交易信號。
2. **非監督式學習** 透過聚類揭示市場同質性,幫助投資組合構建與分散風險。
3. **強化學習** 雖在實務上仍處於探索階段,但已能在回測中表現出比簡單策略更佳的風險調整報酬。
4. 成功的金融機器學習不僅僅是「預測」正確,更關鍵的是「可持續、可監控」與「風險可控」。
5. 本章所示範例均以 `scikit‑learn` / `xgboost` / `tensorflow` / `stable‑baselines3` 為基礎,讀者可直接在 Jupyter Notebook 中複製並調整參數,以快速構建自己的投資模型。
> 本章所學將為後續第5章「GARCH 模型與波動率預測」以及第6章「機器學習風險管理」奠定實務與理論基礎。