第五章:量化研究專題(第二篇:運用 Scipy 模組實現統計技術 )
阿新 • • 發佈:2019-02-20
導語: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-----------------------
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-----------------------