导语: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-----------------------