聊天視窗

數據驅動的投資決策:金融分析與機器學習實務 - 第 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章「機器學習風險管理」奠定實務與理論基礎。