1. 程式人生 > >第五章:量化研究專題(第二篇:運用 Scipy 模組實現統計技術 )

第五章:量化研究專題(第二篇:運用 Scipy 模組實現統計技術 )

導語:python 語言中numpy 和pandas 模組是處理資料的利器,除此之外,繼續向大家介紹 


Scipy 模組,這個模組專門運用於統計和優化技術,本文主要講述Scipy 模組在統計中的運用。 






統計學基礎知識 






    開始之前,我們先匯入 Scipy 模組 






import numpy as np 


import pandas as pd 


import scipy.stats as stats 






1.理解平均數和變異性 






    平均數也叫做集中趨勢量數,一般有三種形式:均值、中位數和眾數。 






平均數              公式 






均值(mean)         資料組中所有數值的總和除以該組數值的個數 






 中位數(median)     資料組中資料的中點。中位數對極值不敏感,均值對極值敏感。 






眾數(mode)         資料組中出現數據最多的數值 






python 實現: 






#獲取平安銀行過去20 個交易 日的收盤價資料,形成一個列表。 


x_list=list(get_price('000001.SZ', None, '20180125', '1d', ['close'], True, None, 20, is_panel=1) 


['close'].values) 






print('平安銀行過去20  日收盤價均值:{}'.format(np.mean(x_list))) 


print('平安銀行過去20  日收盤價中位數:{}'.format(np.median(x_list))) 


print('平安銀行過去20  日收盤價眾數:{}'.format(np.argmax(np.bincount(x_list)))) 






平安銀行過去20  日收盤價均值:13.8315 


平安銀行過去20  日收盤價中位數:13.625 


平安銀行過去20  日收盤價眾數:13 






    變異性反映數值之間的不同。平均數和變異性可共同描述資料分佈的特徵,並說明資料 


分佈之間的差異。變異性的三種量數:極差、標準差、方差。用於反映一組資料的變異性、 


散佈或者離散度。  




----------------------- Page 148-----------------------


python 實現 






print('平安銀行過去20  日收盤價極差:{}'.format(np.max(x_list)-np.min(x_list))) 


print('平安銀行過去20  日收盤價標準差:{}'.format(np.std(x_list))) 


print('平安銀行過去20  日收盤價方差:{}'.format(np.var((x_list)))) 






平安銀行過去20  日收盤價極差:1.8399999999999999 


平安銀行過去20  日收盤價標準差:0.602746007867327 


平安銀行過去20  日收盤價方差:0.36330274999999984 






2.檢驗資料是否服從假設的分佈。最為常見的解決方案是採用 K-S 檢驗。 






    單樣本K-S 檢驗的原假設是給定的資料來自和原假設分佈相同的分佈,在SciPy 中提供 


了kstest 函式,引數分別是資料、擬檢驗的分佈名稱和對應的引數。我們以上述平安銀行數 


據為例。 






stats.kstest(x_list, 'norm', (np.mean(x_list), np.std(x_list))) 






KstestResult(statistic=0.17976051493694484, pvalue=0.48934819583934308) 






    從 K-S 檢驗結果看,資料符合正態分佈。 






    K-S 檢驗結果檢視技巧:一般pvalue > 0.05 即為符合正態分佈 






3.在正態性的前提下,我們可進一步檢驗這組資料的均值是不是 0 。典型的方法是t 檢驗, 


其中單樣本的t 檢驗函式為 ttest_1samp 。 






stats.ttest_1samp(x_list, 0) 






Ttest_1sampResult(statistic=100.02573215027174, pvalue=2.4856090267508661e-27) 






從t 檢驗看,資料的並均值不是 0 。 






4.計算簡單相關係數 






    相關係數是反映兩個變數之間關係的量化指標。這個統計值得值域範圍是-1 到1。含義 


是某一個變數發生變化時,另一個變數如何變化。如果變數變化方向相同,相關是正相關, 


反之,相關是負相關。ps :瞭解python 實現過程即可。 




----------------------- Page 149-----------------------


    python 實現:我們獲取萬科 A 的資料與平安銀行的資料進行相關係數計算 






#我們再獲取萬科的過去 20  日的收盤價資料 


y_list=list(get_price('000002.SZ', None, '20180125', '1d', ['close'], True, None, 20, is_panel=1) 


['close'].values) 






#計算相關係數 


stats.pearsonr(x_list,y_list)[0] 






0.8276759436667197 






5.方差分析 (F 檢驗) 






    投資者總是希望通過自己明智的選股邏輯,來獲取超額收益,那麼如何證明選股對獲取 


更高收益率是顯著影響的呢?我們需要通過方差分析來檢驗。 


    假設我們有4 個策略,其中一個就是不選股,直接買指數,另外三個分別選擇一隻股票 


長期持有。 


    第一步:計算出4 個策略的每天淨值變化。 


    第二步:對4 個策略的淨值變化做方差分析。 


    第三步:得到分析結果的p 值,如果p<0.05 ,則選股對獲取更高收益率有顯著影響,反 


之,無顯著影響。 






from scipy.stats import f_oneway   


x1_list=get_price('000300.SH', None, '20180125', '1d', ['close'], False, 'pre', 252, is_panel=1) 


['close'] 


x1_list=(x1_list-x1_list.iloc[0])/x1_list 


x2_list=get_price('002601.SZ', None, '20180125', '1d', ['close'], False, 'pre', 252, is_panel=1)['close'] 


x2_list=(x2_list-x2_list.iloc[0])/x2_list 


x3_list=get_price('601006.SH', None, '20180125', '1d', ['close'], False, 'pre', 252, is_panel=1) 


['close'] 


x3_list=(x3_list-x3_list.iloc[0])/x3_list 


x4_list=get_price('600216.SH', None, '20180125', '1d', ['close'], False, 'pre', 252, is_panel=1) 


['close'] 


x4_list=(x4_list-x4_list.iloc[0])/x4_list 


args=[x1_list,x2_list,x3_list,x4_list] 


f_oneway(*args)  






F_onewayResult(statistic=390.98877592011445, pvalue=3.4512917737493422e-168) 






    通過最後的 p 值結果,我們可以看到,選股對獲取更高收益率有顯著影響。 






6.pearsonr 相關係數檢驗 






    大部分投資者都非常認可一個觀點:“A 股市場有明顯的大小盤輪動現象”,那麼我們 


是否可以通過pearsonr 相關係數來檢驗呢?以滬深300 指數和創業板指數為例。 






    第一步:獲取兩者的收盤價,並計算成淨值變化。 




----------------------- Page 150-----------------------


    第二步:進行pearsonr 相關係數檢驗,首先判斷P 值,p 值小於 0.05,則說明兩者呈線 


性關係;反之,不存線上性關係。其次如果R>0 ,則代表正相關;反之,負相關,且相關強 


度參照下表。 






 r 值                                          相關強度 






0.8-1.0                                       極強相關 






0.6-0.8                                       強相關 






0.4-0.6                                       中等相關 






0.2-0.4                                       弱相關 






0.0-0.2                                       極弱相關或者無相關 






    python 實現: 






x1_list=get_price('000300.SH', None, '20180125', '1d', ['close'], False, 'pre', 252, is_panel=1) 


['close'] 


x1_list=list((x1_list-x1_list.iloc[0])/x1_list) 


x2_list=get_price('399006.SZ', None, '20180125', '1d', ['close'], False, 'pre', 252, is_panel=1)['close'] 


x2_list=list((x2_list-x2_list.iloc[0])/x2_list) 


stats.pearsonr(x1_list,x2_list)  






(-0.29113778573749477, 2.5899115476937018e-06) 






    從結果看,滬深300 指數與創業板指數存線上性關係,呈負弱相關。 




----------------------- Page 151-----------------------