我記得十幾年前同一個資深 quant trader 係中環鏞記食燒鵝,佢同我講:「你諗下,日內股價走勢受咁多因素影響,你用咩複雜的模型都好難capture晒所有野。不如用個簡單的的模型,focus係最重要果幾個因素度去做預測,效果會更好。」
今次想同大家探討下點樣用線性回歸 (linear regression) 去預測日內股價走勢的一些理論 (下篇文同大家睇例子)。呢個話題背後其實涉及好多數學同統計概念,我會試下用淺白的方式去解釋,希望可以幫到大家更容易去理解同應用linear regression係量化交易方面。如果你係一個新手,或者本身唔太鐘意數學的朋友,您其實更加應該去睇而篇文,因為咁先可能令您明白點解要識以下的概念,同埋佢地點解真係幫到大家做trades。
首先,點解要用linear regression去預測日內股價? 好多人可能會問,股價走勢咁複雜,每一刻都講緊可能有極多個影響因子去影響緊隻股票的價格,用咁簡單的模型去預測係咪真係work?
答案: 係
但要真係識用 (而個唔係靜係我的意見,就算係RenTech的員工都係咁講。有個長故係關於 RenTech 點「用好」linear regression 而唔係用極度複雜的數學模型去做交易,遲下再寫。)
而上面果位 Quant trader 就提醒左幾件重要的事:
模型的複雜程度要配合數據的質量同數量
如果你唔係大fund / prop firm 做,以我經驗,除非你本身有能力access到不同類型的有效數據,否則用太複雜的模型(ML/DL)其實個預測能力係非常有限,因為通常都係overfit的結果。點解會overfit係好多同事都經常問的問題,好簡單,如果我要你估誠哥下一步的部署但你只係得長實的股價time series,就算你點用再複雜的模型都係估唔到,因為你無access to the real information for analysis
日內交易講求速度,太複雜的模型可能會好慢,識用 online ML algorithm的朋友除外
簡單的模型往往更容易解釋﹑debug以及 monitor日後模型失效發展
在高頻交易環境下,linear model的表現可能會出奇地好。而個結果係我從一位係work for Optiver的朋友身上得知,簡單來說,模型不複雜,速度是關鍵。
慢慢諗落去,我總結出左以下5個用linear regression去預測日內股價要注意的重點:
1. 最重要當然係了解Linear Regression的數學基礎
Linear Regression的基本形式係:
y = β₀ + β₁x₁ + β₂x₂ + ... + βₙxₙ + ε
y係我地要預測的目標變量(例如未來的股價回報),x₁到xₙ係自變量(例如之前的價格回報、成交量因子等),β₀到βₙ係模型參數,ε係誤差項。
我地的目標係要搵出一組β值,令到預測值同實際值之間的差距最小。呢個過程通常會用最小二乘法(Ordinary Least Squares, OLS)去做。OLS的目標函數係:
min Σ(yᵢ - ŷᵢ)²
呢度yᵢ係實際值,ŷᵢ係預測值。我地要搵一組β值,令到呢個和最小。長氣少少,點解要而個和最小? 因為越小代表實際值同預測值越近。
另外,由於你應用linear regression時好多時都係由當日開市咁一直expanding window / rolling window咁去做下一個/下幾個steps的prediction,所以不論係backtest定real time trading 時記得要set好以上dynamic window instead of static regression。
2. 揀啱自變量
揀自變量的時候,我地可以用到一的統計方法去幫手:
Correlation Analysis:計算各個自變量同目標變量之間的相關係數
Variance Inflation Factor (VIF):檢查自變量之間有冇multicollinearity的問題
具體可以考慮的自變量包括:
之前幾個time step的價格回報變動
成交量變化﹑分鐘level clusters成交量的分佈變化
大市﹑Sectors指數的走勢變化
同類股票的relative表現
Order book資訊,例如bid-ask spread或order imbalance
相關的期貨或者期權OI變動
即時新聞sentiment
其他一般人少access的資訊 (marginal benefits)
3. 要做好數據預處理
數據預處理係好重要的一步,可以大大影響模型的表現。以下係一啲重要的步驟:
處理缺失值:可以用前值填充、均值填充,或者更複雜的的方法,例如KNN imputation。但留意一點是,要預測日內股價回報,要留意隻股本身流動性是否足夠。如果不足夠,係某些分鐘可能會完全無交易,變相你的數據源可能會直接omit左個一分鐘。如果你人手加返個一分鐘的話,你要根據你的策略性質去諗下應該用邊個方法更反映到真正的交易實況,有時未必應該用前值填充,可能用均值或直接填0更好,要視乎情況。
處理異常值:可以用Z-score方法,一般將絕對值大過3的數據視為異常值。更好方法係睇 rolling Z 值,分兩個mode,其中一個係optimized得出的絕對值,另一個係用standard deviation計出來的band,如超過左就代表係極端值。而度考考大家,知唔知道點解要咁set兩個modes? 大家可以係comment到留個言
正規化 (而個方法係令到你的features / predictors 可以apple-to-apple 做 comparison):可以用Min-Max scaling或者Standard scaling。公式如下:
Min-Max: x' = (x - min(x)) / (max(x) - min(x))
Standard: x' = (x - mean(x)) / std(x)
去趨勢:對於非平穩的時間序列,可以用差分法 (如果你的策略要求time series 係相對 stationary)。一階差分的公式係:
Δx[t] = x[t] - x[t-1],但留意,好多時會將成段time series的memory都去除左,要留意自己做feature engineering時想extract的information有無being contained in the differentiated time series,如果無,考慮用fractional differntiation。
4. 要了解模型假設同診斷
Linear regression有幾個重要的假設,我地要檢查假設係咪成立:
線性:可以用residual plot去檢查
獨立性:可以用Durbin-Watson test
同方差性:可以用Breusch-Pagan test
正態性:可以用Q-Q plot或者Shapiro-Wilk test
如果發現有假設唔成立,可以考慮用以下方法:
對數轉換:可以處理非線性同異方差性問題
Weighted Least Squares:處理異方差性問題
Robust Regression:減少異常值的影響
而part其實係好多interviewers (包括我自己在內) 都好中意問interviewees 的問題,例如我問如果某個例子由本身附合獨立性到加左新的因子數據後變成不附合獨立性,咁對之前的估算結果會有多大分別,同埋個variance of the estimate 又會大左幾多。而d係好測得出個candidate對統計係咪有深入了解,而且係真實交易環境都有用,因為你可以反推出當個sample size / time 超過某個時侯但個realized returns 仲係未到 expected returns時,個策略本身係咪有咩問題 e.g. overfitting。
5. 要做好模型評估同優化
係日內交易環境,模型評估同優化會變得更加複雜同更為重要。以下係我用開一啲用黎評估日內交易的metrics。
a) 模型評估指標:
Directional Accuracy (DA):
DA = (正確預測方向的次數 / 總預測次數) * 100%
呢個指標可以話俾我知模型預測股價走勢方向的準確度。因為係日內交易入面,正確預測方向通常比準確預測具體價格回報更為重要。
Profit Factor (PF):
PF = 總盈利 / 總虧損
反映策略的風險回報比,呢個比率越高越好,通常大於1.5就已經算不錯。
Sharpe Ratio:
Sharpe Ratio = (策略收益率 - 無風險利率) / 策略收益率的標準差
但係要注意,for 日內交易,我地可能要用intraday Sharpe ratio:
Intraday Sharpe = (日均收益 / 日內收益的標準差) * √(交易日數)
Maximum Drawdown (MDD):
MDD = (策略最高點 - 最低點) / 最高點
Slippage&Spread -Adjusted Returns:
實際收益 = 理論收益 - 滑點成本 - 價差成本
滑點及價差對日內交易策略表現造成好大影響,所以一定要考慮埋。
Information Coefficient (IC):
IC = correlation(預測收益, 實際收益)
呢個指標可以話俾我地知預測值同實際值有幾相關,可用每小時或者每分鐘的數據來計算IC。
b) 模型優化方法:
Time-Series Cross Validation:
普通的k-fold cross validation 可能唔適合用係時間序列數據度,因為你用n+1 fold 去預測n fold 會有look ahead bias。我地可以用rolling window 或者 expanding window 的方法來做cross validation。例如:
-用前3個月的數據訓練,然後用下一個月的數據測試
-逐步將訓練窗口向前移動,重複呢個過程
Ensemble Methods 結合日內預測:
-Bagging:可以係唔同的時間段訓練多個模型,然後將佢地的預測結果平均
-Boosting:可以用AdaBoost或者GradientBoostingRegressor,特別注重改善係某啲時段表現差的預測
Online Learning:
由於日內市場情況變化快,我地可以考慮用online learning的方法,例如:
-Online Gradient Descent
-Follow The Regularized Leader (FTRL)
以上方法可以實時更新模型參數,做到快速適應市場的變化。
動態特徵選擇:
可以係日內唔同時段動態選擇最相關的特徵。例如:
-開市初期可能更加注重overnight news的影響
-收市前可能更加注重當日累積的成交量同價格變動
日內季節性:
-日內交易經常會出現一啲固定的模式,例如早晨效應、午餐時間的流動性下降等。我地可以將呢啲因素納入模型。
執行時間:
日內交易要求模型的執行時間夠短。可用profiling tool去分析模型的執行時間,然後針 對性咁優化:
-用feature hashing / regularization 減少特徵的數量
-將一啲計算密集型的操作用C++重寫,然後用Cython係Python度調用
總結黎講,用Linear Regression去預測日內股價走勢係一個好複雜的課題,需要結合統計學、金融學、計算機科學等多個領域的知識。希望呢篇文章可以俾到大家一個全面的概覽,等大家可以更好地應用Linear Regression係量化交易度。緊記模型只係工具,最重要的係要理解背後的原理同市場的運作機制。
下期會bring up 一啲日內交易的真實例子。如果大家有咩心得,都歡迎同我分享。下期再見!
Cheers,
阿程
2024年9月 - 第2篇 (操盤心得)
SY
2024-10-07 14:46:18 +0000 UTCPanak
2024-10-07 00:11:32 +0000 UTC