(十三)用SciPy模块进行概率分析和正态性检验

本文通过Python的Pandas和Scipy库,对沪深300指数的历史数据进行描述性统计分析,并运用多种方法检验收盘点位数据是否服从正态分布。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

描述性统计

使用统计分析子模块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等多种分布检验,默认为 normx为样本,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,拒绝服从正态分布的原假设
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值