第五章:量化研究专题(第二篇:运用 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-----------------------

你可能感兴趣的:(Python量化投资,第五章:量化研究专题,运用,Scipy,模块实现统计技术,量化投资,python)