iT邦幫忙

2024 iThome 鐵人賽

DAY 12
0
AI/ ML & Data

打開就會 AI 與數據分析的投資理財術系列 第 12

Day11:引入AI—機器學習概述與數據預處理

  • 分享至 

  • xImage
  •  

在這一節中,我們將探索機器學習在金融中的應用場景,例如我們可以直接想到的預測股價!並學習如何使用Scikit-Learn庫。為了為機器學習模型準備高質量的訓練數據,我們還將深入探討數據預處理和特徵工程技術,包括特徵選擇、數據標準化等。今日 Colab


一、機器學習在金融中的應用場景

1. 概述

機器學習(Machine Learning)是人工智能的一個分支,通過學習數據中的模式來進行預測和決策。金融領域因其大量的數據和複雜的模式,非常適合應用機器學習技術。

2. 金融中的機器學習應用

  • 市場預測:預測股票價格、指數走勢、外匯匯率等。
  • 風險管理:評估信用風險、操作風險、市場風險等。
  • 投資組合優化:根據預期收益和風險,優化資產配置。
  • 高頻交易:在毫秒級別內做出交易決策。
  • 欺詐檢測:識別異常交易行為,防止金融詐騙。

3. 機器學習的類型

  • 監督式學習:有標籤的數據,用於分類和回歸任務。
  • 無監督學習:無標籤的數據,用於聚類和降維。
  • 強化學習:通過與環境的交互,不斷學習最佳策略。

二、Scikit-Learn庫簡介

1. Scikit-Learn的特點

  • 簡單易用:提供一致的API接口,便於快速上手。
  • 豐富的算法:涵蓋分類、回歸、聚類、降維等常用算法。
  • 與NumPy和Pandas緊密結合:方便進行數據處理和分析。

2. 安裝Scikit-Learn

# 在Colab或本地環境中安裝
!pip install scikit-learn

3. Scikit-Learn的基本使用流程

  1. 導入庫和算法
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression
  1. 數據準備
  • 加載數據,處理缺失值,進行特徵工程。
  1. 劃分訓練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
  1. 數據預處理
  • 標準化、正則化等。
  1. 選擇和訓練模型
model = LinearRegression()
model.fit(X_train, y_train)
  1. 模型評估
from sklearn.metrics import mean_squared_error
predictions = model.predict(X_test)
mse = mean_squared_error(y_test, predictions)

三、數據預處理與特徵工程

1. 為什麼需要數據預處理

  • 提高模型性能:數據質量直接影響模型的表現。
  • 處理數據問題:如缺失值、異常值、不同的數據尺度等。

2. 常用的數據預處理技術

(1) 處理缺失值
  • 刪除缺失值:如果缺失值較少,可以直接刪除含有缺失值的樣本。
  • 填補缺失值:使用平均值、中位數、眾數或插值方法填補。
# 使用Pandas填補缺失值
data.fillna(data.mean(), inplace=True)
(2) 處理異常值
  • 檢測異常值:使用箱線圖、3σ原則等方法。
  • 處理異常值:刪除或用合理的值替代。
(3) 特徵標準化
  • 目的:使不同特徵的數據具有相同的尺度,避免某些特徵對模型影響過大。

  • 方法

    • 標準化(Standardization):將特徵縮放為均值為0,方差為1。

      from sklearn.preprocessing import StandardScaler
      scaler = StandardScaler()
      X_scaled = scaler.fit_transform(X)
      
    • 歸一化(Normalization):將特徵縮放到指定範圍(如0到1)。

      from sklearn.preprocessing import MinMaxScaler
      scaler = MinMaxScaler()
      X_scaled = scaler.fit_transform(X)
      
(4) 類別編碼
  • 目的:將類別型特徵轉換為數值型。

  • 方法

    • Label Encoding:將類別值轉換為數字編碼。

      from sklearn.preprocessing import LabelEncoder
      le = LabelEncoder()
      y_encoded = le.fit_transform(y)
      
    • One-Hot Encoding:使用獨熱編碼將類別特徵轉換為二進制特徵。

      X = pd.get_dummies(X, columns=['category_feature'])
      

3. 特徵選擇

(1) 為什麼需要特徵選擇
  • 提高模型性能:減少冗餘和無關特徵。
  • 降低過擬合風險:簡化模型,提升泛化能力。
  • 提高運算效率:減少計算量。
(2) 特徵選擇的方法
  • 過濾式(Filter):根據統計特性選擇特徵,如相關係數、卡方檢驗等。

    from sklearn.feature_selection import SelectKBest, f_regression
    selector = SelectKBest(score_func=f_regression, k=10)
    X_new = selector.fit_transform(X, y)
    
  • 包裹式(Wrapper):使用機器學習模型評估特徵組合的效果。

    from sklearn.feature_selection import RFE
    from sklearn.linear_model import LinearRegression
    model = LinearRegression()
    selector = RFE(model, n_features_to_select=10)
    X_new = selector.fit_transform(X, y)
    
  • 嵌入式(Embedded):在模型訓練過程中自動進行特徵選擇,如Lasso回歸。

    from sklearn.linear_model import Lasso
    model = Lasso(alpha=0.1)
    model.fit(X, y)
    

4. 數據集劃分

  • 訓練集:用於訓練模型。
  • 驗證集:用於調整模型參數。
  • 測試集:用於最終評估模型性能。
from sklearn.model_selection import train_test_split
X_train, X_temp, y_train, y_temp = train_test_split(X, y, test_size=0.3)
X_val, X_test, y_val, y_test = train_test_split(X_temp, y_temp, test_size=0.5)

四、為機器學習模型準備訓練數據

1. 金融數據的特點

  • 時間序列性:數據具有時間順序,前後相關性強。
  • 非平穩性:數據的統計特性可能隨時間變化。
  • 噪聲較大:市場受多種因素影響,數據波動較大。

2. 特徵構建

  • 技術指標:移動平均線、相對強弱指數(RSI)、MACD等。

    # 使用TA-Lib計算技術指標
    !pip install TA-Lib
    import talib as ta
    data['SMA'] = ta.SMA(data['Close'], timeperiod=20)
    data['RSI'] = ta.RSI(data['Close'], timeperiod=14)
    
  • 統計特徵:收益率、波動率、偏度、峰度等。

    data['Returns'] = data['Close'].pct_change()
    data['Volatility'] = data['Returns'].rolling(window=20).std()
    
  • 基本面特徵:市盈率(P/E)、市淨率(P/B)、股息率等。

  • 宏觀經濟指標:GDP增長率、利率、通貨膨脹率等。

3. 處理時間序列數據

  • 滯後特徵:使用過去多個時點的數據作為特徵。

    for lag in range(1, 6):
        data[f'lag_{lag}'] = data['Returns'].shift(lag)
    
  • 滾動窗口特徵:計算滾動窗口內的統計量。

    data['rolling_mean'] = data['Returns'].rolling(window=5).mean()
    

4. 標籤構建

  • 分類問題:如預測價格上漲(1)或下跌(0)。

    data['Target'] = np.where(data['Returns'].shift(-1) > 0, 1, 0)
    
  • 回歸問題:預測未來的價格或收益率。

5. 防止資料洩漏

  • 時間序列劃分:確保訓練集的時間在測試集之前,避免未來數據洩漏。

    train_data = data[data.index < '2020-01-01']
    test_data = data[data.index >= '2020-01-01']
    
  • 交叉驗證:使用時間序列的交叉驗證方法,如滾動窗口驗證。


五、實際案例:預測股票價格走勢

1. 數據獲取

import yfinance as yf
data = yf.download('AAPL', start='2015-01-01', end='2021-01-01')

2. 特徵工程

import pandas as pd
import numpy as np

data['Returns'] = data['Adj Close'].pct_change()
data['SMA'] = data['Adj Close'].rolling(window=20).mean()
data['Volatility'] = data['Returns'].rolling(window=20).std()
data['RSI'] = ta.RSI(data['Adj Close'], timeperiod=14)

# 移除缺失值
data.dropna(inplace=True)

# 構建標籤
data['Target'] = np.where(data['Returns'].shift(-1) > 0, 1, 0)

3. 數據預處理

# 選擇特徵和標籤
features = ['SMA', 'Volatility', 'RSI']
X = data[features]
y = data['Target']

# 標準化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

4. 劃分訓練集和測試集

X_train = X_scaled[data.index < '2020-01-01']
X_test = X_scaled[data.index >= '2020-01-01']
y_train = y[data.index < '2020-01-01']
y_test = y[data.index >= '2020-01-01']

六、總結

在這一節中,我們:

  • 了解了機器學習在金融中的應用場景,為後續的模型構建奠定基礎。
  • 學習了Scikit-Learn庫的基本使用方法,為實現機器學習算法做好準備。
  • 深入探討了數據預處理和特徵工程技術,包括處理缺失值、標準化、特徵選擇等。
  • 為機器學習模型準備了高質量的訓練數據,包括特徵構建和標籤設置。

在下一節中,我們將使用所準備的數據,構建監督式學習模型,如回歸和分類模型,並評估其性能。


作業:

  1. 數據預處理:選擇一個金融數據集,進行數據清洗、特徵工程和標準化處理。

  2. 特徵選擇:使用不同的方法(如相關係數、RFE)選擇對模型影響較大的特徵。

  3. 準備訓練數據:劃分訓練集、驗證集和測試集,為後續模型訓練做好準備。

透過實踐,您將更深入地理解數據預處理和特徵工程在機器學習中的重要性,為構建高性能的模型奠定基礎。


提示:

  • 資料洩漏:在處理時間序列數據時,務必確保未來的信息不會洩漏到訓練過程中。

  • 技術指標計算:可以使用TA-Libpandas_ta庫計算各種技術指標。

    !pip install pandas_ta
    import pandas_ta as ta
    data.ta.macd(close='Adj Close', append=True)
    
  • 可視化:使用MatplotlibSeaborn對數據進行可視化,有助於理解數據特性。



上一篇
Day10:因子投資
下一篇
Day12:監督式學習——回歸模型 & 分類模型在股價上預測上的運用
系列文
打開就會 AI 與數據分析的投資理財術30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言