計算滾動標準差rolling_std有沒有較好的演算法或估演算法?

我目前計算rolling_std都是按照標準差的公式一個個順序去算,感覺這樣效率太低,尤其是運算次數多的時候很明顯,想問下有沒有更好的演算法。


波動率序列就是用來干這個的

建議用一段時間樣本擬合一個波動率序列(可以由你自定義的東西加權),每天的小變動不會讓參數改變太多,一段時間估計一次就好

一般時間序列模型都有誤差的假設,所以可以使用誤差的似然函數做最大似然估計。

補充一下:黑貓並不是在答非所問。因為波動率這個東西一旦開始滾動了是必然要加權的,不可能對不同時間,成交量,收益率給予相同的權重。(如果有風控,這麼做必須是跟風控結下樑子了……)時間序列是一類廣義的加權方法僅此而已,完成的就是」滾動加權「目標


用一個隊列維護x,第二個隊列維護 x^2。分別用兩個變數維護隊列和。根據DX=EX^2-(EX)^2即可。平攤時間複雜度o(1)。


就像計算移動平均一樣,計算新一期的std時,要利用上一期計算的結果,而不是從頭開始算。

具體來說,就像有答案說的,利用variance=EX^2-(EX)^2的屬性,維護兩個移動求和。

如果是用matlab實現的,強烈用推薦conv函數來算任何移動加權平均的問題,速度可以再上一個數量級。

我又看了看樓主的背景,你問這種問題,這是在知乎上想招人吧?


如果已知一個數列的均值和標準差和長度,現在這個數列增加一個已知的數字形成一個新的數列,你能不能在不知道原數列元素具體數值的情況下,算出新數列的均值和標準差?如果你能算出來,你這題就解完一大半了。


一般是計算E(x)和E(x^2)。對於譬如return等序列,一般可以只計算E(x^2)。計算可以用指數移動平均,只用記住上一個歷史數據即可


1. 動態規劃,和求移動平均一個套路。但for loop無法避免,嫌慢的話瓶頸部分調用C++。

比如R裡面通過Rcpp調用自己寫的C++腳本,速度比R ttr包里rolling系列函數快不少。

2. 空間換時間,寫成矩陣相乘的形式。樣本方差可以視作原序列對向量1作正交投影(線性回歸)後的殘差序列的方差的無偏估計值。想辦法矩陣化。

PS:看到題目以為答主想問的是half life或者newey west之類的演算法。


我是數學白痴來的


不太通用的辦法 例如求ma(5) 把矩陣平移四次 除5就好了

通用的辦法 numpy有一個hack叫stride_tricks 根據ndarray里的數據類型判斷下一個 元素的地址 加上generator就好了


推薦閱讀:

Resnet對於深度學習的意義是否可比牛頓力學對於物理學的意義?
擬極大似然估計(Quasi-likelihood estimation)和極大似然估計有什麼區別?
秩和檢驗的作用和原理是什麼?
在用收入法進行GDP核算時候,勞動者報酬、生產稅凈額、固定資產折舊和營業盈餘四部分相加得到為什麼要把固定資產折舊算成增加值也就是GDP,按常理,固定資產折舊應該是損失的經濟,那為什麼要算到增加值裡面呢?

TAG:演算法 | 量化 | 統計 |