如何確定應該使用哪個已實現波動率估計器?
TSRV、MSRV、KRVTH、KRVC等這些年來已經發明了很多實現的措施……但是在實踐中如何選擇它們呢?
我知道我們找不到它們的“估計錯誤”,因為真正的標籤是未知的。但也許有一些東西可以“預測”他們的錯誤,所以我們可以知道哪個更有可能更好(一個可能不合適的例子,比如 Alphafold 中的 pLDDT)。
我發現一篇文章將許多估算器與 5 分鐘 RV 進行了比較,但該方法似乎很複雜,而且作者沒有提供程式碼。有沒有人實現了那個或類似的方法?我已經檢查了 R 包
highfrequency
,它似乎沒有包含它。上面提到的文章是有什麼能打敗 5 分鐘的 RV 嗎?Liu,Patton,Sheppard (2015)對多個資產類別的已實現衡量標准進行了比較。一個相關的問題是實際波動率的估計誤差是多少?
非常感謝您的建議。
已實現措施的實證分析
這篇論文有什麼能打敗 5 分鐘的 RV 嗎?跨多個資產類別的已實現措施的比較 $$ LPS2015 $$在為已實現的度量和模型定義可擴展的比較框架方面做得很好。許多方法背後的理論是在研究中引用的不同論文中發展起來的。我將簡要強調比較分析的應用框架,可以在
R
.我提供了一些非常簡單的
R
程式碼,可以擴展到多種實現的度量和比較方法。目的是給你一個框架,而不是一個完整的解決方案。R
程式碼可以在附錄中找到。設置:
本文的總體框架可概述如下:
- 確定清潔程序、採樣方案和數據頻率。
- 確定調查中已實現的措施。
- 找到代理並執行基於數據的排名方法。
- 資產初步分析。
- 使用成對和多重比較方法進行比較分析。
- 將波動性度量與模型聯繫起來:已實現度量的充分錶現是否意味著模型的樣本外預測更好?
您可以根據需要擴展 (4)、(5) 和 (6)。$$ LPS2015 $$在進行(4)、(5)和(6)中的分析時非常詳盡。(5)中沒有必要挑出這麼多的比較方法。如果您想使用多個已實現的度量,請選擇一種多重比較方法並繼續。在這種情況下,模型置信集非常流行,並且已經在
R
.數據和初步清理:
**我省略了 (1)、(2) 並更多地關注(Patton, 2011)**的基於數據的排名方法。此外,我還從AlphaVantage.co網站下載了 AAPL 的免費 5 分鐘股票價格。任何擁有 API 密鑰的人都可以免費獲得盤中數據(數量有限)(*您可以免費獲得一個)。在對隨機一天的盤中收盤價進行臨時初步清理*後,如下所示:
我在
R
程式碼中研究的兩個已實現的度量是已實現變異數 (RV) 和 Bipower 已實現變異數:$$ RV_t = \sum_{i=1}^n r_{i,t}^2 \qquad \quad BPRV_t = \sum_{i=1}^{n-1} |r_{i+1,t}| \cdot |r_{i,t}|, $$ 為了 $ n $ 是每天的盤中數據量 $ t $ .
3.找到代理並執行基於數據的排名方法
Patton 的基於數據的排名方法估計兩個已實現度量之間的相對準確度 $ \Sigma_{it}, : \Sigma_{jt} $ ,使用損失函式 $ L(\cdot) $ 基於潛在波動過程的代理 $ \theta $ :
$$ \begin{equation} \mathbb{E}\left[\Delta L(\theta_t, \Sigma_t)\right] = \mathbb{E}\left[L(\theta_t, \Sigma_{it}) - L(\theta_t, \Sigma_{jt})\right]. \end{equation} $$
什麼時候 $ T \rightarrow \infty $ 上述方程可以通過以下方式一致地估計, $$ \begin{equation}\label{meanloss} d_{ij}=\frac{1}{T} \sum_{t=1}^{T} \Delta \hat{L}{ij,t} \overset{\mathbb{P}}{\longrightarrow} \mathbb{E}\left[\Delta L{ij,t}\right], \end{equation} $$ 在哪裡 $ \Delta \hat{L}{ij,t} = L(\theta_t, \Sigma{it}) - L(\theta_t, \Sigma_{jt}) $ 和 $ \Delta L_{ij,t} $ 是損失差。
需要考慮的事項:
我們需要考慮損失函式和波動率代理的選擇。以下是原始論文中的一些亮點,使這一點相對簡單:
- 適當的損失函式: (Patton,2011)認為,在波動率預測排名中,“穩健”損失函式與(潛在波動率過程的)條件無偏波動率代理一起,漸近等效於使用真實潛在波動率變數的排名. 他進一步認為,穩健的損失函式將不受使用者定義代理中的雜訊的影響。QLIKE 和 MSE 是兩個穩健的損失函式: $$ L^{\text{QLIKE}}(\theta, \Sigma) = \frac{\theta}{\Sigma} - \ln\left(\frac{\theta}{\Sigma}\right) - 1 \qquad L^{\text{MSE}}(\theta, \Sigma) = (\theta - \Sigma)^2 $$ 在哪裡 $ \theta $ 表示真正的潛在波動過程的代理和 $ \Sigma $ 是您正在調查的已實現估算器。
- **確定真正的潛在波動過程的代理:**在$$ LPS2015 $$他們使用每日採樣的 RV 作為具有領先滯後命題的代理。這個代理也是(Patton, 2011)中的選擇。領先滯後命題決定了今天的實際波動率估計作為明天波動率的預測有多好。不僅如此,它還打破了代理和已實現措施之間的依賴關係。總之,這意味著他們計算了明天實現變異數的估計預測的損失 $ \mathbb{E}\left[RV^{\text{5 min}}_{t+1} \vert \mathcal{F}_t\right] = RV^{\text{5 min}}t $ 與事後(估計當天 $ t+1 $ ) 每日實現變異數, $ RV^{\text{daily}}{t+1} $ .
查看
R
程式碼,您會注意到**我使用了每日採樣的 Realized Variance ( open-to-close ) 作為我的代理和相應的 QLIKE 損失函式。**下圖顯示了在 AAPL 的 5 分鐘採樣頻率上,兩種已實現度量(已實現變異數 (RV) 和 Bipower 已實現變異數 (BPRV))在幾天內損失的絕對差異:4 & 5. 排名措施和比較分析
在LPS2015 中,他們通過查看交易和報價持續時間(以秒為單位)對資產本身進行了一項小型研究,其中包括匯總統計數據和臨時流動性分析。除此之外,他們通過採用不同的成對和多重比較方法開始他們的主要分析。我在此處的回答中描述了所有比較方法,並且我的回答還包含
Python
執行這些措施的連結。關於R
然後 Diebold-Mariano 測試在此處forecast
的包中實現,並且存在模型置信集的包(連結)。如果我們在我們的簡單範例中使用 Diebold-Mariano 測試(函式中給出了預定義的參數),我們會得到一個 $ p $ -的價值 $ p=0.8981 $ 因此我們無法拒絕預測能力相等的原假設。顯然,對於更長的期限和不同的金融產品,結果可能會有所不同。對 20 只不同的股票(從附錄程式碼中省略)進行相同的成對比較,拒絕的比例僅為 10%,這意味著 20 隻股票中有 2 只我們未能拒絕零。在這兩種情況下,BPRV 在平均損失較低方面優於 RV, $ d_{ij} $ .
- 樣本外調查 ========
在他們實證研究的最後一點中,他們利用了一個異構自回歸 (HAR) 模型,該模型線性組合了不同波動率分量,這些波動率分量由不同時期的預期實現估計形成。為清楚起見,讓我們將 HAR 模型的波動性分量定義為: $$ \begin{equation} RV_{t-1}^{(day)} = RV_{t-1}^{(n)}, \qquad RV_{t-1}^{(week)} = \frac{1}{5}\sum_{k=1}^{5}RV_{t-k}^{(n)}, \qquad RV_{t-1}^{(month)} = \frac{1}{22}\sum_{k=1}^{22}RV_{t-k}^{(n)}, \end{equation} $$ 假設一個月有 22 天,並且 $ n $ 是日內數據量。那麼,HAR 模型可以描述為$$ \begin{equation} RV_t = \phi_0 + \phi_1 RV_{t-1} +\phi_2 RV_{t-1}^{(week)} + \phi_3 RV_{t-1}^{(month)} + u_t, \end{equation} $$ 你可以在哪裡更換 $ RV_t $ 任何已實現的度量都可以為您提供 HAR 模型的替代公式。作為範例,我提供了**SHAR 模型的描述,該模型**將已實現的變異數 (RV) 分解為正半變數和負半變數。此外,插入 Bipower Realized Variance 可為您提供連續 HAR (CHAR) 模型,因為 Bipower 變化是一種跳躍強韌性測量,因此僅包括連續變化的測量。
在他們的實證研究中,他們估計了不同預測範圍的模型 $ h=1,\ldots,50 $ ,將預測與事後實際值進行比較,並輸出 5 分鐘實際變異數包含在不同資產類型的最佳度量中的比例。這是另一項廣泛的分析,相反,您可以使用自己選擇的比較方法專注於提前一步的預測分析。請注意,在初步研究中選擇的充分實現的衡量標準可能不會在樣本外調查中表現出色。由於缺乏數據和時間,我沒有編寫這部分程式碼。
附錄
######################### TOY EXAMPLE ########################### ####### packages library(xts) library(forecast) library(highfrequency) library(alphavantager) library(ggplot2) av_api_key("YOUR API KEY HERE") ############ GET DATA AND DO DATA CLEANING: # Get time-series data (Intraday) AAPL <- as.data.frame(av_get(symbol = "AAPL", av_fun = "TIME_SERIES_INTRADAY", outputsize = "full", interval = '5min')) rownames(AAPL) <- AAPL$timestamp # Preliminary data-cleaning AAPL_close <- xts(AAPL$close, order.by = AAPL$timestamp) #split into days (list object) AAPL_close <- split(AAPL_close, as.Date(index(AAPL_close))) #ad-hoc deleting pre- and after-market hours AAPL_close <- lapply(AAPL_close, function(x){ premarketdel <- grep("09:30:00", format(index(x), format = "%H:%M:%S")) aftermarketdel <- grep("16:05:00", format(index(x), format = "%H:%M:%S")) x[-c(1:(premarketdel - 1), aftermarketdel:length(x))] } ) # intraday returns AAPL_ret <- lapply(AAPL_close, function(x) diff(log(x))[-1]) ############# REALIZED MEASURES # These are just examples. # Realized variance RV <- sapply(AAPL_ret, function(x) rCov(x, makeReturns = FALSE)) # Bipower realized variance BPRV <- sapply(AAPL_ret, function(x) rBPCov(x, makeReturns = FALSE)) ############# Pattons databased ranking method. #proxy is open to close RV: RVDAILY <- sapply(AAPL_close, function(x) (log(as.numeric(x[length(x)])) - log(as.numeric(x[1])))^2) #Loss function, QLIKE: Qlike <- function(proxy, realized){ loss <- proxy / realized - log( proxy / realized ) - 1 return(loss) } #Lead the RV LeadRVDAILY <- dplyr::lead(RVDAILY, 1)[-length(RVDAILY)] ### Calculate the losses using the lead-lag proposition LossRV <- Qlike(LeadRVDAILY, RV[-length(RV)]) LossBPRV <- Qlike(LaeadRVDAILY, BPRV[-length(BPRV)]) # Now see that d_{ij} = mean(LossRV - LossBPRV). However, this was not needed in my simple analysis. ############# VERY SIMPLE COMPARISON METHOD dm.test(LossRV, LossBPRV) ############# PLOTS. # PLOT 1 ggplot() + geom_line(aes(index(AAPL_close[[6]]), AAPL_close[[6]]), col = "darkred", lwd = 1)+ xlab("Timestamps") + ylab("Prices") + theme_minimal() + ggtitle("AAPL Intraday prices at 2022-03-03") + theme(legend.position = "none", plot.title = element_text(hjust = 0.5) ) # OLD PLOT 2 p1 <- ggplot() + geom_point(aes(as.Date(names(AAPL_close[-1])), LossRV), shape=15, fill = "darkred", color="darkred", size = 3) + geom_line(aes(as.Date(names(AAPL_close[-1])), LossRV),col = "darkred", linetype = "dashed") + ggtitle("Losses for 5-minute Realized Variance (RV)") + ylab("Losses") + xlab("Days") + ylim(c(0,3)) + theme_minimal() + theme(legend.position = "none", plot.title = element_text(hjust = 0.5) ) p2 <- ggplot() + geom_point(aes(as.Date(names(AAPL_close[-1])), LossBPRV), shape=16, fill = "darkblue", color="darkblue", size = 3) + geom_line(aes(as.Date(names(AAPL_close[-1])), LossBPRV),col = "darkblue", linetype = "dashed") + ylab("Losses") + xlab("Days") + ggtitle("Losses for 5-minute Bipower Realized Variance (BPRV)") + ylim(c(0,3)) + theme_minimal() + theme(legend.position = "none", plot.title = element_text(hjust = 0.5) ) library(gridExtra) grid.arrange(p1, p2, ncol = 2) # NEW PLOT 2: Absolute Difference in losses p4 <- ggplot() +geom_line(aes(as.Date(names(AAPL_close[-1])), abs(LossBPRV-LossRV)), col = "darkgreen", linetype = "dashed") + geom_point(aes(as.Date(names(AAPL_close[-1])), abs(LossBPRV-LossRV)), col = "darkgreen", shape = 15, size = 3) + ylab("absolute difference") + xlab("Days") + ggtitle("Absolute difference in losses between Realized Variance (RV) and Bipower Realized Variance (BPRV)") + theme_minimal() + theme(legend.position = "none", plot.title = element_text(hjust = 0.5, size=15), axis.title=element_text(size=15) )