在這一節中,我們將探索機器學習在金融中的應用場景,例如我們可以直接想到的預測股價!並學習如何使用Scikit-Learn庫。為了為機器學習模型準備高質量的訓練數據,我們還將深入探討數據預處理和特徵工程技術,包括特徵選擇、數據標準化等。今日 Colab
機器學習(Machine Learning)是人工智能的一個分支,通過學習數據中的模式來進行預測和決策。金融領域因其大量的數據和複雜的模式,非常適合應用機器學習技術。
# 在Colab或本地環境中安裝
!pip install scikit-learn
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
model = LinearRegression()
model.fit(X_train, y_train)
from sklearn.metrics import mean_squared_error
predictions = model.predict(X_test)
mse = mean_squared_error(y_test, predictions)
# 使用Pandas填補缺失值
data.fillna(data.mean(), inplace=True)
目的:使不同特徵的數據具有相同的尺度,避免某些特徵對模型影響過大。
方法:
標準化(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)
目的:將類別型特徵轉換為數值型。
方法:
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'])
過濾式(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)
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)
技術指標:移動平均線、相對強弱指數(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增長率、利率、通貨膨脹率等。
滯後特徵:使用過去多個時點的數據作為特徵。
for lag in range(1, 6):
data[f'lag_{lag}'] = data['Returns'].shift(lag)
滾動窗口特徵:計算滾動窗口內的統計量。
data['rolling_mean'] = data['Returns'].rolling(window=5).mean()
分類問題:如預測價格上漲(1)或下跌(0)。
data['Target'] = np.where(data['Returns'].shift(-1) > 0, 1, 0)
回歸問題:預測未來的價格或收益率。
時間序列劃分:確保訓練集的時間在測試集之前,避免未來數據洩漏。
train_data = data[data.index < '2020-01-01']
test_data = data[data.index >= '2020-01-01']
交叉驗證:使用時間序列的交叉驗證方法,如滾動窗口驗證。
import yfinance as yf
data = yf.download('AAPL', start='2015-01-01', end='2021-01-01')
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)
# 選擇特徵和標籤
features = ['SMA', 'Volatility', 'RSI']
X = data[features]
y = data['Target']
# 標準化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
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']
在這一節中,我們:
在下一節中,我們將使用所準備的數據,構建監督式學習模型,如回歸和分類模型,並評估其性能。
作業:
數據預處理:選擇一個金融數據集,進行數據清洗、特徵工程和標準化處理。
特徵選擇:使用不同的方法(如相關係數、RFE)選擇對模型影響較大的特徵。
準備訓練數據:劃分訓練集、驗證集和測試集,為後續模型訓練做好準備。
透過實踐,您將更深入地理解數據預處理和特徵工程在機器學習中的重要性,為構建高性能的模型奠定基礎。
提示:
資料洩漏:在處理時間序列數據時,務必確保未來的信息不會洩漏到訓練過程中。
技術指標計算:可以使用TA-Lib
或pandas_ta
庫計算各種技術指標。
!pip install pandas_ta
import pandas_ta as ta
data.ta.macd(close='Adj Close', append=True)
可視化:使用Matplotlib
或Seaborn
對數據進行可視化,有助於理解數據特性。