理解三者之間的區別與聯系,要從定義入手,一步步來計算,同時也要互相比較理解,這樣才夠深刻。
方差
方差是各個數據與平均數之差的平方的平均數。在概率論和數理統計中,方差(英文Variance)用來度量隨機變量和其數學期望(即均值)之間的偏離程度。在許多實際問題中,研究隨機變量和均值之間的偏離程度有着很重要的意義。
標准差
方差開根號。
協方差
在概率論和統計學中,協方差用於衡量兩個變量的總體誤差。而方差是協方差的一種特殊情況,即當兩個變量是相同的情況。
可以通俗的理解為:兩個變量在變化過程中是否同向變化?還是反方向變化?同向或反向程度如何?
你變大,同時我也變大,說明兩個變量是同向變化的,這是協方差就是正的。
你變大,同時我變小,說明兩個變量是反向變化的,這時協方差就是負的。
如果我是自然人,而你是太陽,那么兩者沒有相關關系,這時協方差是0。
從數值來看,協方差的數值越大,兩個變量同向程度也就越大,反之亦然。
可以看出來,協方差代表了兩個變量之間的是否同時偏離均值,和偏離的方向是相同還是相反。
公式:如果有X,Y兩個變量,每個時刻的“X值與其均值之差”乘以“Y值與其均值之差”得到一個乘積,再對這每時刻的乘積求和並求出均值,即為協方差。
方差,標准差與協方差之間的聯系與區別:
1. 方差和標准差都是對一組(一維)數據進行統計的,反映的是一維數組的離散程度;而協方差是對2組數據進行統計的,反映的是2組數據之間的相關性。
2. 標准差和均值的量綱(單位)是一致的,在描述一個波動范圍時標准差比方差更方便。比如一個班男生的平均身高是170cm,標准差是10cm,那么方差就是10cm^2。可以進行的比較簡便的描述是本班男生身高分布是170±10cm,方差就無法做到這點。
3. 方差可以看成是協方差的一種特殊情況,即2組數據完全相同。
4. 協方差只表示線性相關的方向,取值正無窮到負無窮。
利用實例來計算方差、標准差和協方差
樣本數據1:滬深300指數2017年3月份的漲跌額(%), [0.16,-0.67,-0.21,0.54,0.22,-0.15,-0.63,0.03,0.88,-0.04,0.20,0.52,-1.03,0.11,0.49,-0.47,0.35,0.80,-0.33,-0.24,-0.13,-0.82,0.56]
1. 計算滬深300指數2017年3月份的漲跌額(%)的方差
# Sample Date - SH000300 Earning in 2017-03 datas = [0.16, -0.67, -0.21, 0.54, 0.22, -0.15, -0.63, 0.03, 0.88, -0.04, 0.20, 0.52, -1.03, 0.11, 0.49, -0.47, 0.35, 0.80, -0.33, -0.24, -0.13, -0.82, 0.56] mean1 = sum(datas)/len(datas) # result = 0.0060869565217391355 square_datas = [] for i in datas: square_datas.append((i-mean1)*(i-mean1)) variance = sum(square_datas)/len(square_datas) print(str(variance)) # result = 0.25349338374291114 # 當然如果你使用了numpy,那么求方差將會十分的簡單: import numpy as np datas = [0.16, -0.67, -0.21, 0.54, 0.22, -0.15, -0.63, 0.03, 0.88, -0.04, 0.20, 0.52, -1.03, 0.11, 0.49, -0.47, 0.35, 0.80, -0.33, -0.24, -0.13, -0.82, 0.56] variance = np.var(datas) print(str(variance)) # result = 0.253493383743
2. 計算滬深300指數2017年3月份的漲跌額(%)的標准差
import math # Sample Date - SH000300 Earning in 2017-03 datas = [0.16, -0.67, -0.21, 0.54, 0.22, -0.15, -0.63, 0.03, 0.88, -0.04, 0.20, 0.52, -1.03, 0.11, 0.49, -0.47, 0.35, 0.80, -0.33, -0.24, -0.13, -0.82, 0.56] mean1 = sum(datas)/len(datas) square_datas = [] for i in datas: square_datas.append((i-mean1)*(i-mean1)) variance = sum(square_datas)/len(square_datas) standard_deviation = math.sqrt(variance) print(str(standard_deviation)) # result = 0.5034812645401129 #當然如果你使用了numpy,那么求標准差將會十分的簡單: import numpy as np # Sample Date - SH000300 Earning in 2017-03 datas = [0.16, -0.67, -0.21, 0.54, 0.22, -0.15, -0.63, 0.03, 0.88, -0.04, 0.20, 0.52, -1.03, 0.11, 0.49, -0.47, 0.35, 0.80, -0.33, -0.24, -0.13, -0.82, 0.56] standard_deviation2 = np.std(datas, ddof = 0) print(str(standard_deviation2)) # result =0.50348126454
請注意 ddof = 0 這個參數,這個是很重要的,只是稍后放在文末說明,因為雖然重要,但是卻十分好理解。
3. 計算滬深300指數2017年3月份的漲跌額(%)與 格力電器(SZ:000651) 2017年3月份的漲跌額(%)之間的協方差
協方差是計算兩組數據之間的關系,所以要引入第二個樣本,即格力電器(SZ:000651) 2017年3月份的漲跌額(%)
import math # Sample Date - SH000300 Earning in 2017-03 datas_sh000300 = [0.16, -0.67, -0.21, 0.54, 0.22, -0.15, -0.63, 0.03, 0.88, -0.04, 0.20, 0.52, -1.03, 0.11, 0.49, -0.47, 0.35, 0.80, -0.33, -0.24, -0.13, -0.82, 0.56] datas_sz000651 = [0.07, -0.55, -0.04, 3.11, 0.28, -0.50, 1.10, 1.97, -0.31, -0.55, 2.06, -0.24, -1.44, 1.56, 3.69, 0.53, 2.30, 1.09, -2.63, 0.29, 1.30, -1.54, 3.19] mean_sh000300 = sum(datas_sh000300) / len(datas_sh000300) mean_sz000651 = sum(datas_sz000651) / len(datas_sz000651) temp_datas = [] for i in range(0, len(datas_sh000300)): temp_datas.append((datas_sh000300[i] - mean_sh000300) * (datas_sz000651[i] - mean_sz000651)) cov = sum(temp_datas)/len(temp_datas) print(str(cov)) # result = 0.4385294896030246 當然如果你使用了numpy,那么求協方差將會十分的簡單: import numpy as np # Sample Date - SH000300 Earning in 2017-03 datas_sh000300 = [0.16, -0.67, -0.21, 0.54, 0.22, -0.15, -0.63, 0.03, 0.88, -0.04, 0.20, 0.52, -1.03, 0.11, 0.49, -0.47, 0.35, 0.80, -0.33, -0.24, -0.13, -0.82, 0.56] datas_sz000651 = [0.07, -0.55, -0.04, 3.11, 0.28, -0.50, 1.10, 1.97, -0.31, -0.55, 2.06, -0.24, -1.44, 1.56, 3.69, 0.53, 2.30, 1.09, -2.63, 0.29, 1.30, -1.54, 3.19] cov2 = np.cov(datas_sh000300, datas_sz000651, ddof=0)[1][0] print(str(cov2)) # result = 0.438529489603
請注意 ddof = 0 這個參數,這個是很重要的,只是稍后放在文末說明,因為雖然重要,但是卻十分好理解。
從這個例子可以看出來,格力個股在2017年3月份是和滬深300指數正相關的,即指數漲,格力也大多是上漲的,只是 值偏小,兩者之間偏離各自均值的幅度也不同,即,我們知道了2者正相關,但是不知道正相關的幅度是大是小,這個需要引入下一個名詞,文章下面會介紹:相關系數。
ddof = 0 參數的說明
如果你從網上查找方差的公式,你會發現有2個公式!
和
那么哪個是正確的呢?又有什么區別呢?這里就要說下貝賽爾修正:
在上面的方差公式和標准差公式中,存在一個值為N的分母,其作用為將計算得到的累積偏差進行平均,從而消除數據集大小對計算數據離散程度所產生的影響。不過,使用N所計算得到的方差及標准差只能用來表示該數據集本身(population)的離散程度;如果數據集是某個更大的研究對象的樣本(sample),那么在計算該研究對象的離散程度時,就需要對上述方差公式和標准差公式進行貝塞爾修正,將N替換為N-1:
簡單的說,是除以 N 還是 除以 N-1,則要看樣本是否全,比如,我要統計全國20歲男性的平均身高,這時間你肯定拿不到全部20歲男性的身高,所以只能隨機抽樣 500名,這時間要除以 N-1,因為只是部分數據;但是我們算滬深300在2017年3月份的漲跌幅,我們是可以全部拿到3月份的數據的,所以我們拿到的是全部數據,這時間就要除以 N。
相關系數
在我們的例子中,求的滬深300在2017年3月份的方差為0.253493383743,標准差為0.5034812645401129。
那么我們該如何理解呢?
方差:如果 股票 B 的方差是 0.1,那么我們可以說 滬深300的離散度更大,因為滬深300 的方差>股票B的方差。
標准差:滬深300的均值是:mean1 = sum(datas)/len(datas) = 0.0060869565217391355,即平均每天上漲 0.006%,那么我們描述,滬深300指數在2017年3月份平均日波動區間為[ 0.006%-0.50%, 0.006%+0.50% ]
而協方差呢,如果我只有格力和滬深300的數據,我拿到的協方差值是0.438529489603,這個值只能表明是正相關的,但是正相關的程度呢,是滬深300上漲1%,格力也上漲1%,還是滬深300上漲1%,格力漲2%呢?我們從協方差的值中無從得知。
這時間就需要另外一個變量來描述相關度的大小了:相關系數
協方差的相關系數,不僅表示線性相關的方向,還表示線性相關的程度,取值[-1,1]。也就是說,相關系數為正值,說明一個變量變大另一個變量也變大;取負值說明一個變量變大另一個變量變小,取0說明兩個變量沒有相關關系。同時,相關系數的絕對值越接近1,線性關系越顯著。
計算公式為:就是用X、Y的協方差除以X的標准差乘以Y的標准差。
用 Python + Numpy 來實現代碼如下:
import numpy as np import math # Sample Date - SH000300 Earning in 2017-03 datas_sh000300 = [0.16, -0.67, -0.21, 0.54, 0.22, -0.15, -0.63, 0.03, 0.88, -0.04, 0.20, 0.52, -1.03, 0.11, 0.49, -0.47, 0.35, 0.80, -0.33, -0.24, -0.13, -0.82, 0.56] datas_sz000651 = [0.07, -0.55, -0.04, 3.11, 0.28, -0.50, 1.10, 1.97, -0.31, -0.55, 2.06, -0.24, -1.44, 1.56, 3.69, 0.53, 2.30, 1.09, -2.63, 0.29, 1.30, -1.54, 3.19] cov = np.cov(datas_sh000300, datas_sz000651, ddof=0)[1][0] standard_deviation_sh000300 = np.std(datas_sh000300, ddof=0) standard_deviation_sz000651 = np.std(datas_sz000651, ddof=0) ppcc = cov/(standard_deviation_sh000300*standard_deviation_sz000651) print(str(ppcc)) # result = 0.554372485367
相關系數是 0.554372485367,可以看出來兩者是正相關的,但是相關度很一般,至於一般的標准,就要看工作中的應用尺度了,如系數超過0.8,才存在配對交易的機會,否則,沒有。
本文完,下面的文章計划介紹下協同效應的實際應用。
本文首發於,博客園,請搜索:博客園 - 尋自己,查看原版文章