描述性统计
使用统计分析子模块stats:
import scipy.stats as st
import pandas as pd
HS300.head()
Out[1]:
日期 开盘点位 最高点位 最低点位 收盘点位
0 2018-01-02 4045.2086 4087.7789 4045.2086 4087.4012
1 2018-01-03 4091.4607 4140.0543 4088.7302 4111.3925
2 2018-01-04 4114.1213 4137.6420 4105.8858 4128.8119
3 2018-01-05 4133.3439 4151.2818 4123.2817 4138.7505
4 2018-01-08 4140.8545 4166.3182 4127.3081 4160.1595
HS300.describe()#Pandas的describe函数
Out[6]:
开盘点位 最高点位 最低点位 收盘点位
count 243.000000 243.000000 243.000000 243.000000
mean 3605.910629 3633.511737 3576.081525 3605.809573
std 379.357328 378.562382 380.805563 380.883948
min 2994.795000 3024.352500 2964.875000 2990.505700
25% 3259.739050 3281.134050 3227.896000 3265.065300
50% 3521.587600 3541.782000 3478.213400 3517.656800
75% 3897.636750 3921.321600 3875.582550 3898.566550
max 4389.454700 4403.337500 4351.487100 4389.885300
st.describe(HS300.iloc[:,1:])#stats的describe函数,输出结果多了偏度和峰度
Out[8]: DescribeResult(nobs=243,
minmax=(array([2994.795 , 3024.3525, 2964.875 , 2990.5057]), array([4389.4547, 4403.3375, 4351.4871, 4389.8853])),
mean=array([3605.91062922, 3633.51173704, 3576.0815251 , 3605.80957284]),
variance=array([143911.98215054, 143309.47671231, 145012.87703134, 145072.58191246]),
skewness=array([0.26348013, 0.27043605, 0.27412658, 0.27292221]),
kurtosis=array([-1.22824183, -1.21239389, -1.23121282, -1.21125415]))
#st.函数名()可以单独查看
概率分析
与numpy一样也可生成指定分布的分布函数,但是功能更多。一些主要分布对应的函数为:贝塔分布——beta,卡方分布——chi2,指数分布——expon,F分布——f,对数正态分布——lognorm,正态分布——norm,泊松分布——poisson,学生t分布——t,均匀分布——uniform。其中norm函数中loc=μ与scale=sigma参数不填则默认为标准正态分布。
norm=st.norm.rvs(loc=0,scale=1,size=10000)#rvs表示生成指定分布的分布函数
import matplotlib.pyplot as plt
plt.hist(norm,bins=40,edgecolor='k')
#标准正态分布中x≤0.5的概率
st.norm.cdf(x=0.5)
Out[20]: 0.6914624612740131
#标准正态分布中x=0.5对应的概率密度值
st.norm.pdf(x=0.5)
Out[21]: 0.3520653267642995
#标准正态分布中0.95的概率对应的分位点,是cdf的逆函数
st.norm.ppf(0.95)
Out[22]: 1.6448536269514722
st.norm.cdf(x=1.64485)
Out[23]: 0.9499996259309215
正态性检验
验证HS300中的收盘点位是否服从正态分布,主要有以下四种方法:
函数 | 简介 | 参数 |
---|---|---|
scipy.stats.shapiro(x) | Shapiro-Wilk test,仅适用于检验正态分布 | x表示待检验的样本 |
scipy.stats.normaltest(a, axis) | 仅适用于检验正态分布 | a为样本,axis=0/1表示逐行或者逐列检验,可置空 |
scipy.stats.anderson(x,dist=‘norm’) | Anderson-Darling test,可以做正态、指数、Logistic、Gumbel等多种分布检验,默认为 norm | x为样本,dist设置需要检验的分布类型 |
scipy.stats.kstest(rvs,cdf,args=(),alternative) | Kolmogorov-Smirnov检验,简称KS检验 | rvs为样本,cdf是分布类型,args是分布参数,alternative设置单双尾检验 |
HS=HS300.iloc[:,4]
st.shapiro(HS)
Out[33]: (0.9342723488807678, 5.994702512168715e-09)
#第一个值是统计量,第二个是p值,显然p<0.01,拒绝服从正态分布的原假设
st.normaltest(HS)
Out[34]: NormaltestResult(statistic=132.93435363620097, pvalue=1.360416467164767e-29)
#第一个值是统计量,第二个是p值,显然p<0.01,拒绝服从正态分布的原假设
st.anderson(HS,dist='norm')
Out[35]: AndersonResult(statistic=5.913612774087426,
critical_values=array([0.567, 0.646, 0.775, 0.904, 1.075]),
significance_level=array([15. , 10. , 5. , 2.5, 1. ]))
#statistic表示统计量,critical_values是临界值统计量,significance_level表示对应的显著性水平;
#统计量大于1%显著性水平下的临界值1.075,在1%的水平上拒绝服从正态分布的原假设
st.kstest(rvs=HS,cdf='norm',args=(0,0.1))
Out[36]: KstestResult(statistic=1.0, pvalue=0.0)
#第一个值是统计量,第二个是p值,显然p<0.01,拒绝服从正态分布的原假设