如何在Python中对特定的数据列应用ShapiroWilk测试

2024-04-16 14:31:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我想把这个测试应用到间谍的日回报率上。在从Yahoo获得这个符号的历史数据之后,我计算每日回报的百分比(如下面的代码所示)。但是当我应用这个测试时,P值总是“1.00”,而stats的返回值总是“nan”。无论我是否更改数据日期或更改符号(例如,QQQ代替SPY)

下面您可以看到我正在使用的代码:

from datetime import date
import pandas_datareader as dr
from scipy.stats import shapiro

df = dr.data.get_data_yahoo('spy',start='2010-01-01',end='2015-01-01')
df['PCT'] = df['Close'].pct_change()

stat, p = shapiro(df['PCT'])
print('Statistics=%.3f, p=%.3f' % (stat, p))

不幸的是,我试过不同的方法,但我找不到解决办法。我被它困住了。你知道如何在PCT列数据中正确地应用它吗?任何帮助都是非常受欢迎的!谢谢!在


Tags: 数据代码fromimportdfdatastats符号
1条回答
网友
1楼 · 发布于 2024-04-16 14:31:33

Step 1: "when I apply the test the P value is always “1.00” and the return of the stats is always “nan

不,先生,不是。在

print( 'Statistics\n(W)= %e,\n p = %e' % ( stat, p ) ) # will produce:
...    
(W)= 9.438160e-01
 p = 1.909053e-21

核心问题是,尊重事物的运作方式:

^{pr2}$

显然,在这里,由于period == 1,细胞df['PCT'][0]是并且必须是NaN

因此,请调用W_stat, p_value = shapiro( df['PCT'][1:] )不要包含一个没有意义的值

print( shapiro.__doc__ ) # for more details

将数值与参考样本进行比较-正态分布检验,其中,不存在NaN-s直接导致必须在p == 1时拒绝空假设,这是绝对肯定的拒绝(从两个“由于-NaN(s)”集比较来看,这显然是正确的)。在


类似地{ SPY | QQQ | AAPL | AMZN | ... }

>>> shapiro( dr.data.get_data_yahoo( 'SPY',
                                      start = '2010-01-01',
                                      end   = '2015-01-01'
                                      )['Close'].pct_change()[1:]
             )
(0.943816065788269, 1.9090532861060437e-21)

>>> shapiro( dr.data.get_data_yahoo( 'QQQ',
                                      start = '2010-01-01',
                                      end   = '2015-01-01'
                                      )['Close'].pct_change()[1:]
             )
(0.9631340503692627, 2.548133516564297e-17)

>>> shapiro( dr.data.get_data_yahoo( 'AAPL',
                                      start = '2010-01-01',
                                      end   = '2015-01-01'
                                      )['Close'].pct_change()[1:]
             )
(0.9560988545417786, 5.674560331738808e-19)

>>> shapiro( dr.data.get_data_yahoo( 'AMZN',
                                      start = '2010-01-01',
                                      end   = '2015-01-01'
                                      )['Close'].pct_change()[1:]
             )
(0.9394155740737915, 3.106424182886848e-22)

相关问题 更多 >