如何解決過度擬合

數量技術宅發表於2023-05-14

更多精彩內容,歡迎關注公眾號:數量技術宅,也可新增技術宅個人微訊號:sljsz01,與我交流。

為何產生過度擬合

我們在做資料分析建模,或是量化策略回測的過程中,會模型在訓練時過度擬合了歷史資料(回測),導致在新資料上的預測(實盤)效果不佳。造成這種現象有以下幾種原因:

一是這可能是因為模型過於複雜,引數過多,使其可以輕鬆地擬合曆史資料,但在新資料上的預測能力較差。一起來看一個典型的過度擬合的例子。

import numpy as np
import matplotlib.pyplot as plt

# Generate some data
x = np.linspace(0, 10, 100)
y = np.sin(x) + np.random.normal(scale=0.1, size=100)

# Fit a polynomial of degree 20
p = np.polyfit(x, y, 20)
y_pred = np.polyval(p, x)

# Plot the data and the fitted polynomial
plt.scatter(x, y)
plt.plot(x, y_pred, color='red')
plt.show()

我們生成了一組sin函式加上隨機數的序列,同時用20階的高階函式去擬合這組樣本資料,如此高維的資料,必然會產生樣本內擬合極度優秀的效果。而模型在學習訓練資料時過度擬合了資料的細節,導致模型過於複雜,也就失去了泛化能力。

另一個可能的原因是樣本選擇偏差。如果使用的歷史資料不足以代表未來的變化,那麼模型在訓練時就會過度擬合,從而在實際應用中無法正確地預測。例如採用15年8月以前資料測試的股指期貨短週期\高頻策略,由於股指期貨手續費改變造成的市場結構劇變,除非手續費重新恢復,否則資料偏差極易產生未來績效的偏差。

如何解決過度擬合問題

為了解決資料分析、量化策略構建過程中最常見的過擬合問題,我們需要採取一些措施。

交叉驗證

資料集劃分是避免過度擬合問題的關鍵步驟之一。在構建量化策略時,我們通常將資料集劃分為訓練集和測試集。訓練集用於訓練模型,測試集用於驗證模型的泛化能力。為了避免過度擬合問題,我們可以使用交叉驗證的方法,將資料集分成10份,每次選取其中一份作為測試集,其他九份作為訓練集。這樣可以更好地驗證模型的泛化能力,避免過度擬合。

下面是一個使用sklearn庫做10折交叉驗證的例子,呼叫cross_val_score方法,生成Cross-validation scores、Mean score、Standard deviation等交叉驗證結果並展示。

 

from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LinearRegression

# Generate some data
x = np.linspace(0, 10, 100)
y = np.sin(x) + np.random.normal(scale=0.1, size=100)

# Fit a polynomial of degree 20
p = np.polyfit(x, y, 20)
y_pred = np.polyval(p, x)

# Use linear regression with cross-validation to evaluate the model
lr = LinearRegression()
scores = cross_val_score(lr, x.reshape(-1, 1), y, cv=10)

# Print the mean score and standard deviation
print("Cross-validation scores:", scores)
print("Mean score:", np.mean(scores))
print("Standard deviation:", np.std(scores))

'''
output
Cross-validation scores: [-7.06062585e+00 -4.33284120e-04 -2.57612012e+01 -2.13349644e+00
 -6.45893114e-01]
Mean score: -7.120329969404656
Standard deviation: 9.643292108330295
'''

擴充訓練資料集

下面示例,展示了不同的訓練資料集大小對於模型預測能力的影響。圖表中的橫軸表示訓練集的大小,縱軸表示模型在測試集上的預測誤差。可以看到,當訓練集較小時,模型在測試集上的預測誤差較大,而當訓練集較大時,模型的預測誤差較小。這表明,訓練資料集大小對於模型的預測能力具有重要影響。

因此,在資料執行範圍內,我們應該儘可能選擇更大的訓練(回測)資料集,例如我們如果構建中低頻策略,可以使用5年、甚至10年以上的資料集進行訓練,而構建高頻策略,也需要儘可能大的訓練集,具體以可獲取的Tick、OrderBook資料範圍為準。

特徵選擇與正則化

特徵選擇是避免過度擬合問題的另一個關鍵。在資料、策略的建模過程中,我們通常會有許多備選特徵可以用於建模預測,如果選擇所有的備選特徵進行建模,會導致模型過於複雜,容易過度擬合。因此,我們透過正則化篩選最重要的特徵,減少特徵數量,降低過度擬合的風險。

下面是一個正則化避免過度擬合的例子(省略載入資料步驟),我們建立邏輯迴歸模型,並使用L1正則化來選擇重要特徵。然後使用所選擇的特徵來擬合邏輯迴歸模型,在測試集上評估該模型。這種方法透過只選擇最重要的特徵來避免過擬合,從而降低了模型的複雜性並提高了其泛化效能。

# Import necessary libraries
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.feature_selection import SelectFromModel

# Load data ......

# Split data into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(data.drop('target', axis=1), data['target'], test_size=0.2, random_state=42)

# Create logistic regression model
lr = LogisticRegression()

# Use L1 regularization to select important features
selector = SelectFromModel(estimator=lr, threshold='1.25*median')
selector.fit(X_train, y_train)

# Transform training and testing sets to include only important features
X_train_selected = selector.transform(X_train)
X_test_selected = selector.transform(X_test)

# Fit logistic regression model on selected features
lr_selected = LogisticRegression()
lr_selected.fit(X_train_selected, y_train)

# Evaluate model performance on testing set
print('Accuracy on testing set:', lr_selected.score(X_test_selected, y_test))

控制模型複雜度

控制模型複雜度的概念相對來說更加主觀,其一,在建模(回測)中,我們通常會使用一些複雜的模型,如決策樹、神經網路等。這些模型具有很強的擬合能力,但我們的模型選擇並不是越複雜越好,最重要的是貼合資料背後的經濟、行為邏輯。

除了模型選擇,還需要控制引數的數量、以及特徵的數量,控制模型複雜度是一個整體的工作,貫穿於整個資料建模與策略回測的過程。

此外,我們還可以採用資料增強、整合學習等方法來避免過度擬合問題。這些措施可以提高模型的穩定性和可靠性,為模型的實際應用提供保障。

對量化投資:實盤不如回測是過度擬合嗎

最後一段,我們針對量化投資,再做一些展示。時常有粉絲朋友問到技術宅:我做了一個模型開始跑實盤,但是策略在實盤過程中執行的績效遠遠不如回測,是因為我過度擬合了嗎?

其實,策略在回測時的表現與實盤表現不一致,是量化投資領域一種普遍存在的現象。這種不一致不完全是因為過度擬合產生的,可能是多種因素引起的:

  1. 資料偏差:回測時使用的歷史資料可能與實際市場環境存在一定的差異,例如我們在上文中提到的股指期貨的例子,變化的市場結構會對策略的表現產生影響。

  2. 滑點和交易成本:回測時通常假設買賣價格可以立即獲得,但實際交易中存在滑點和交易成本,這些因素都可能會對策略的表現產生影響。

  3. 策略實現:在實盤交易中,策略的實現可能會受到多種因素的影響,例如交易執行的速度、交易規模的限制等,這些因素也可能會對策略的表現產生影響。

  4. 過度擬合:也是本文討論的重點,在回測中,策略的過度擬合,使得策略在回測中表現良好,但在實際交易中表現不佳。

為了減少回測和實盤表現的差異,可以採取以下措施:

  1. 儘可能使用更真實、更貼近目前市場狀況的歷史資料。

  2. 在回測時保守的考慮交易成本和滑點等因素。

  3. 在回測中儘可能遵循策略實盤交易的執行規則。

  4. 採用交叉驗證、擴充訓練資料集、正則化特徵選擇、控制模型複雜度等有效方法,避免過度擬合。

 

 

寫在最後

我們的知識星球中有更多關於量化投資、機器學習的乾貨釋出,歡迎新增技術宅進入星球。

 

 

相關文章