R語言代寫使用LASSO回歸預測股票收益


原文鏈接:http://tecdat.cn/?p=4228

 

使用LASSO預測收益

1.示例

只要有金融經濟學家,金融經濟學家一直在尋找能夠預測股票收益的變量。對於最近的一些例子,想想Jegadeesh和Titman(1993),它表明股票的當前收益是由前幾個月的股票收益預測的,侯(2007),這表明一個行業中最小股票的當前回報是通過行業中最大股票的滯后回報預測,以及Cohen和Frazzini(2008),這表明股票的當前回報是由其主要客戶的滯后回報預測的。

兩步流程。當你考慮它時,找到這些變量實際上包括兩個獨立的問題,識別和估計。首先,你必須使用你的直覺來識別一個新的預測器,然后你必須使用統計來估計這個新的預測器的質量:


但是,現代金融市場龐大。可預測性並不總是發生在易於人們察覺的尺度上,使得解決第一個問題的標准方法成為問題。例如,聯邦信號公司的滯后收益率是2010 年10月一小時內所有紐約證券交易所上市電信股票的重要預測指標。你真的可以從虛假的預測指標中捕獲這個特定的變量嗎?

2.使用LASSO

LASSO定義。LASSO是一種懲罰回歸技術,在Tibshirani(1996)中引入。它通過投注稀疏性來同時識別和估計最重要的系數,使用更短的采樣周期 - 也就是說,假設在任何時間點只有少數變量實際上很重要。正式使用LASSO意味着解決下面的問題,如果你忽略了懲罰函數,那么這個優化問題就只是一個OLS回歸。


懲罰函數。


但是,這個懲罰函數是LASSO成功的秘訣,允許估算器對最大系數給予優先處理,完全忽略較小系數。為了更好地理解LASSO如何做到這一點,當右側變量不相關且具有單位方差時 。一方面,這個解決方案意味着,如果OLS估計一個大系數,那么LASSO將提供類似的估計。另一方面,解決方案意味着,如果OLS估計了足夠小的系數,那么LASSO將會選擇。因為LASSO可以將除少數系數之外的所有系數設置為零,即使樣本長度比可能的預測變量的數量短得多,它也可用於識別最重要的預測變量。如果只有預測變量非零,那么你應該只需要幾個 觀察選擇然后估計這幾個重要系數的大小。

3.模擬分析

我運行模擬來展示如何使用LASSO來預測未來的回報。您可以在原文找到所有相關代碼。

數據模擬。每次模擬都涉及為期間的股票產生回報。每個時期,所有股票的回報都受到一部分股票的回報,以及特殊沖擊的影響

使模型適合數據。這意味着使用時間段來估計具有潛在變量的模型。我估計了一個OLS回歸真正的預測因子是右側變量。顯然,在現實世界中,你不知道真正的預測變量是什么,但是這個規范給出了你可以達到的最佳擬合的估計。在將每個模型擬合到先前的數據之后,然后我在st期間進行樣本外預測。

 

預測回歸。然后,我通過分析一系列預測回歸分析調整后的統計數據,檢查這些預測與第一個資產的實現回報的緊密程度。例如,我將LASSO的回報預測用於估算下面的回歸


 

4.調整參數

懲罰參數選擇。使LASSO擬合數據涉及選擇懲罰參數。我這樣做是通過選擇在數據的第一個時段期間具有最高樣本外預測的懲罰參數。這就是為什么上面的預測回歸僅使用從而不是使用數據開始的原因。下圖顯示了模擬中懲罰參數選擇的分布。

預測數量。最后,如果你看一下調整后數字中標有“Oracle”的面板,你會發現LASSO的樣本外預測能力大約是真實模型預測能力的三分之一。這是因為LASSO沒有完美地選擇稀疏信號。下圖的右側面板顯示LASSO通常只選出這些信號中最重要的信號。更重要的是,左側面板顯示LASSO還鎖定了大量的虛假信號。這一結果表明,您可以通過選擇更高的懲罰參數來提高LASSO的預測能力。

5.什么時候失敗?

測試。我通過研究兩個替代模擬來結束這篇文章,其中LASSO不應該增加任何預測能力。也就是說,使用下面的模型模擬股票的收益,

下圖顯示,在這兩種情況下,LASSO都不會增加任何預測能力。因此,運行這些模擬提供了一對不錯的測試,顯示LASSO確實在返回的橫截面中拾取稀疏信號。

obj.gg2.PLOT <- obj.gg2.PLOT + scale_y_continuous(limits = c(0, 0.40),
                                                  breaks = c(0, 0.10, 0.20, 0.30, 0.40),
                                                  labels = c("$0.00$","$0.10$", "$0.20$", "$0.30$", "$0.40$")
                                                  )
obj.gg2.PLOT <- obj.gg2.PLOT + theme(plot.margin      = unit(c(1,0.15,-0.85,0.15), "lines"),
                                     axis.text        = element_text(size = 10),
                                     axis.title       = element_text(size = 10),
                                     plot.title       = element_text(vjust = 1.75),
                                     panel.grid.minor = element_blank(),
                                     legend.position  = "none"
                                     )

obj.gg2.PLOT <- obj.gg2.PLOT + ggtitle("Adjusted $R^2$ Distribution: Dense Shocks")

print(obj.gg2.PLOT)
dev.off()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM