1. 程式人生 > 程式設計 >基於python計算滾動方差(標準差)talib和pd.rolling函式差異詳解

基於python計算滾動方差(標準差)talib和pd.rolling函式差異詳解

我就廢話不多說了,大家還是直接看程式碼吧!

# -*- coding: utf-8 -*-
"""
Created on Thu Apr 12 11:23:46 2018
@author: henbile
"""
 
#計算滾動波動率可以使用專門做技術分析的talib包裡面的函式,也可以使用pandas包裡面的滾動函式。
#但是兩個函式對於分母的選擇,就是使用N還是N-1作為分母這件事情上是有分歧的。
#另一個差異在於:talib包計算基於numpy,而pd.rolling是基於Series或者DataFrame的。
 
import pandas as pd
import numpy as np
import talib as tb
 
a = tb.VAR(closeFull[:,0],timeperiod = 12,nbdev =1)
b = tb.VAR(closeFull[:,nbdev =0)
 
#我以為nbdev是涉及分母的數量,發現其實不是。nbdev = -1也沒有改變。
 
c = pd.Series(closeFull[:,0]).rolling(window = 12,center = False).var()
#tb基於np資料,pd基於pd包的兩個型別的資料。
 
d = pd.rolling_var(pd.Series(closeFull[:,0]),window= 12,min_periods=None,freq=None,center=False,how=None)
#__main__:1: FutureWarning: pd.rolling_var is deprecated for Series and will be removed in a future version,replace with 
#    Series.rolling(window=12,center=False).var()
 
#以前的公式是d,現在執行d會報錯,所以改正成c的形式。
 
closeFull[0:12,0].var(ddof =1)
#Out[28]: 0.30576590909090895
 
#ddof引數的意義:分母是N-ddof
 
closeFull[0:12,0].var(ddof =0)
#Out[29]: 0.28028541666666656
 
#因為window是12,所以選第11個print
print(a[11],b[11],c[11],d[11])
#0.28028541666667195 0.28028541666667195 0.3057659090909086 0.3057659090909086
 
#計算都是var的計算,大膽的推測std的計算也是適用的。
#talib包的std運算的公式是tb.STDDEV
#pd.rolling就是var換成std
#謹慎起見,還是計算一下,看一看。
#最後發現大膽的推測是正確的。
 
e = tb.STDDEV(closeFull[:,timeperiod = fastPeriod,nbdev = 1)
f = pd.Series(closeFull[:,0]).rolling(window = fastPeriod,center = False).std()
 
closeFull[0:12,0].std(ddof =1)
#Out[45]: 0.5529610375884624
 
closeFull[0:12,0].std(ddof =0)
#Out[46]: 0.5294198869202653
 
print(e[11],f[11])
#0.5294198869202704 0.5529610375884622

補充知識:python —— .rolling(20).std()

#在這裡我們取20天內的標準差

基於python計算滾動方差(標準差)talib和pd.rolling函式差異詳解

以上這篇基於python計算滾動方差(標準差)talib和pd.rolling函式差異詳解就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。