波動率

使用樣本數據解釋和縮放已實現變異數

  • September 17, 2018

我對已實現變異數 (RV) 有一些疑問,下面有一些範例價格可供使用。您可以執行下面的 R 程式碼來建構日誌返迴向量。三個是一個交易日(從開盤到收盤)中的 78 個 5 分鐘桶,因此對數返迴向量的長度(logreturns)= 78。

RV 的計算是對數回報的平方和。其中 X 是日誌 PRICE,n 是一天中的桶數 RV 等於:

$$ RV = \sum\limits_{i=1}^{n} (X_{t_{i+1}} - X_{t_{i}})^2 $$ 所以下面我計算RV,然後通過平方根得到波動率,然後年化它。.

RV = sum(logreturns^2)
RV
[1] 2.509554e-05
daily_volatility = sqrt(RV) 
daily_volatility 
[1] 0.005009545 # i.e. open to close volatility  = .49%
annualized_volatility = sqrt(260)*volatility
annualized_volatility
[1] 0.08033328  # on an annualized basis that is 8.03% 

問題 0:我的價格時間序列是使用每個 5 分鐘桶中的最後一個刻度建構的。在每個儲存桶中使用 VWAP 而不是每個儲存桶中的最後一個刻度會更好嗎?VWAP 將被定義為 5 分鐘桶中所有分時的價格 (P) 和所有分時的交易量 (V) 除以 5 分鐘桶中所有分時的交易量之和的乘積。即.VWAP = (P*V)/sum(V)

問題 1:那麼是否可以解釋為當天的波動率為 0.5%?還是按年計算 8.03%?

現在我正在測量 RV,以便我可以在交易後回歸中使用它來查看交易成本。我將測量從市場開盤到交易發生時的波動率。例如,如果交易發生在第 16 分鐘,則在 RV 計算中將使用 3 個 5 分鐘的桶。如果在第 76 分鐘發生另一筆交易,則將使用 15 個 5 分鐘桶。我相信我需要將 RV 擴展到每日 RV,然後才能在回歸中使用它們。這是因為,使用上面的範例,如果第 16 分鐘 RV 和第 76 分鐘 RV 相同,則會產生誤導,因為第 16 分鐘 RV 不在同一時間尺度上。所以…

問題 2:如何正確縮放從不同數量的桶計算的 RV?例如,使用 logreturns 向量假設交易發生在 21 分鐘內,所以我將使用前 4 個 5 分鐘的桶來計算 RV:

RV = sum(logreturns[1:4]^2) # HERE ONLY USE 1st 4 BUCKETS
daily_volatility = sqrt(RV) 
daily_volatility 
[1] 0.001503846  # here the volatility using the first 4 buckets is .15%

這個 0.001503846 應該如何縮放,以便它可以用於具有不同 RV 的交易後回歸。

我正在考慮通過用於獲取的儲存桶數量進行縮放:

scaled_volatility = daily_volatility * sqrt(78/4)
[1] 0.006640803  #daily volatility would be .66%
scaled_volatility_annualized = daily_volatility * sqrt(78/4)*sqrt(260)
[1] 0.1070797  # annualized volatility would be 10.7%

那會是正確的嗎?

問題 3:將年化 RV 數字與接近收盤的波動率數字進行對比是否有意義?是否應該期望它們相似或不同?

# R code to build price vector
prices= c(69.354346196)
prices= rbind(prices,69.290432)
prices= rbind(prices,69.300752759)
prices= rbind(prices,69.219979108)
prices= rbind(prices,69.208148518)
prices= rbind(prices,69.246598516)
prices= rbind(prices,69.316969994)
prices= rbind(prices,69.382236297)
prices= rbind(prices,69.439047295)
prices= rbind(prices,69.303030426)
prices= rbind(prices,69.215724903)
prices= rbind(prices,69.235499743)
prices= rbind(prices,69.228075019)
prices= rbind(prices,69.226522461)
prices= rbind(prices,69.278545753)
prices= rbind(prices,69.279946134)
prices= rbind(prices,69.294667184)
prices= rbind(prices,69.325204623)
prices= rbind(prices,69.296794394)
prices= rbind(prices,69.271009358)
prices= rbind(prices,69.258763087)
prices= rbind(prices,69.230728678)
prices= rbind(prices,69.250976948)
prices= rbind(prices,69.275912906)
prices= rbind(prices,69.266953813)
prices= rbind(prices,69.275524358)
prices= rbind(prices,69.257009203)
prices= rbind(prices,69.248320494)
prices= rbind(prices,69.239413345)
prices= rbind(prices,69.169838829)
prices= rbind(prices,69.15291089)
prices= rbind(prices,69.181671655)
prices= rbind(prices,69.171275889)
prices= rbind(prices,69.149855396)
prices= rbind(prices,69.181647188)
prices= rbind(prices,69.116412877)
prices= rbind(prices,69.169805719)
prices= rbind(prices,69.17149549)
prices= rbind(prices,69.171311493)
prices= rbind(prices,69.150704259)
prices= rbind(prices,69.168990869)
prices= rbind(prices,69.167502639)
prices= rbind(prices,69.169828509)
prices= rbind(prices,69.136281414)
prices= rbind(prices,69.137206043)
prices= rbind(prices,69.108438269)
prices= rbind(prices,69.10342004)
prices= rbind(prices,69.165636224)
prices= rbind(prices,69.193646811)
prices= rbind(prices,69.2072143)
prices= rbind(prices,69.232462739)
prices= rbind(prices,69.255101895)
prices= rbind(prices,69.278061272)
prices= rbind(prices,69.33507867)
prices= rbind(prices,69.378308505)
prices= rbind(prices,69.373578935)
prices= rbind(prices,69.42822269)
prices= rbind(prices,69.433781902)
prices= rbind(prices,69.448787913)
prices= rbind(prices,69.441731914)
prices= rbind(prices,69.444092485)
prices= rbind(prices,69.440302981)
prices= rbind(prices,69.379244744)
prices= rbind(prices,69.430264889)
prices= rbind(prices,69.441485395)
prices= rbind(prices,69.492248013)
prices= rbind(prices,69.513478661)
prices= rbind(prices,69.567990492)
prices= rbind(prices,69.580500697)
prices= rbind(prices,69.51972368)
prices= rbind(prices,69.561692927)
prices= rbind(prices,69.563459496)
prices= rbind(prices,69.538617278)
prices= rbind(prices,69.58494135)
prices= rbind(prices,69.564894664)
prices= rbind(prices,69.548091511)
prices= rbind(prices,69.604420178)
prices= rbind(prices,69.574414993)
prices= rbind(prices,69.632808692)
head(prices)
logreturns = diff(log(prices))#log returns
head(logreturns)

當我在問題中遇到它們時,我將按順序解決問題。

首先,您的 RV 公式僅在以下情況下才有意義 $ X_{t_i} $ 是對數價格,而不是對數回報。如果這只是一個錯誤輸入,最好編輯問題以更正它。如果不是打錯了,請告訴我,因為那樣你就有更大的問題……

**答案 0:**我不知道 VWAP 是什麼。但是,我可以告訴你,學術文獻中的標準是使用每個桶中的最新觀察結果。假設 VWAP 是儲存桶中所有觀測值的某種平滑函式,您可能會發現使用 VWAP 計算的 RV 平均小於使用最新觀測值計算的 RV。這是否是一件好事實際上取決於應用程序。**2018年編輯:**好的,所以 VWAP 是成交量加權平均價格。我大概應該猜到了。我從來沒有研究過VWAP。我曾經研究過加權的最佳出價/最佳要價,即不是買賣中點,而是通過各自的最佳出價量和最佳要價量來加權最佳出價和最佳要價。使用這個價格代理導致高頻變異數估計是明顯大於使用買賣中點數據交易時。我最終完全放棄了它,因為從啟發式的角度來看,這些數字看起來並不合理。

答案 1:使用您在問題中描述的符號,已實現波動率是對跨越時間段的回報的真實波動率的估計 $ [t_1, t_n] $ . 您可以按比例放大或縮小數字,但這只會更改單位。它不會改變解釋。無論您選擇縮放數字,估計器本身仍然只與區間有關 $ [t_1, t_n] $ .

換句話說,一個跨越的 RV 估計器 $ [t_1, t_n] $ 不能解釋為不同時間跨度的估計量,例如 $ [t_1, t_{n+1}] $ 除非在嚴格假設真實波動率是恆定的(並且這種假設在金融市場中幾乎永遠不會成立)。

請注意,我並不是說您不能按比例放大 RV 估算器,以便它們都以年化單位表示。隨意談論您的 RV 估算器,以年化單位計算約為 8%。沒有什麼不妥。我只是說你永遠不要忘記估計器本身僅來自數據跨越 $ [t_1, t_n] $ .

答案 2:如果不確切知道您要對回歸做什麼,這是一個很難回答的問題。例如,如果您只關心估計係數的統計顯著性,那麼縮放問題就無關緊要了,因為它不會影響估計量的統計顯著性。這是因為按常數縮放隨機變數序列對與其他隨機變數的相關性沒有影響。(注意,我在這裡假設您正在使用一種相對常見的估計方法,例如 OLS - 我可以想到一些可能會產生影響的奇異估計方法)。

另一方面,如果您想在估計係數的大小之間進行臨時比較,那麼是的,將所有已實現的變異數估計量縮放到相同的單位可能會很有用。您可以使用問題中討論的時間的平方根來執行此操作,但請記住我對答案 1解釋的警告。

**更新:**基於OP在評論中描述的回歸問題,我的分析如下:如果您想使用來自許多不同時間跨度的已實現波動率估計器來估計所描述回歸中的係數(β項),那麼它是非常重要的是您將已實現的波動率縮放到相同的單位,例如年化。這是因為您的回歸似乎試圖隔離“現貨”波動對交易成本的影響(我在這里松散地使用該術語 - 對任何純粹主義者的閱讀表示歉意)波動性。但是,如果您不將所有 RV 縮放到相同的單位,您還將測量一天中的時間對交易成本的影響,因為當天早些時候的 RV 是在更短的跨度內測量的,因此會更小。我假設目標是隔離波動對交易成本的影響,這意味著我們想要消除任何其他影響。因此,在這種情況下,縮放已實現的變異數以便它們都以相同的單位進行測量對我來說很有意義。

答案 3:我不太確定您所說的接近收盤波動率是什麼意思。我猜你的意思是使用接近接近的回報計算的樣本變異數估計量,它們一起跨越一年。如果是這種情況,那麼正如我在答案 1中所述,只有當真實波動率在整個一年中保持不變(這在金融市場中永遠不會發生)時,比較才有意義。

引用自:https://quant.stackexchange.com/questions/19161