Критерий Шапиро–Уилка

Критерий Шапиро–Уилка (Shapiro–Wilk test) используется для проверки гипотезы о нормальном распределении.

Пример использования критерия Шапиро–Уилка в R

Загрузим библиотеку quantmod для скачивания котировок:

require(quantmod)

Получим котировки индекса S&P500 с сайта Yahoo Finance:

d1 = getSymbols("^GSPC", src="yahoo", from="2010-01-01", to="2014-11-10", auto.assign=FALSE)

Рассчитаем массив относительных приращений цен закрытия (Close) по формуле \(\Delta C_i = (C_{i} - C_{i-1}) / C_{i-1}\):

dr1 = dailyReturn(d1, type='arithmetic')

Для проверки выведем котировки за 4 последних дня и относительные приращения цен закрытия за последние 3 дня:

tail(d1, 4)
tail(dr1, 3)

Получим:

             GSPC.Open GSPC.High GSPC.Low  GSPC.Close GSPC.Volume  GSPC.Adjusted
2014-11-04   2015.81   2015.98   2001.01   2012.10    3956260000   2012.10
2014-11-05   2015.29   2023.77   2014.42   2023.57    3766590000   2023.57
2014-11-06   2023.33   2031.61   2015.86   2031.21    3669770000   2031.21
2014-11-07   2032.36   2034.26   2025.07   2031.92    3704280000   2031.92

             daily.returns
2014-11-05   0.0057005119
2014-11-06   0.0037755057
2014-11-07   0.0003495453

Проверим значения относительных приращений цен закрытия по нашей формуле и убедимся, что всё считается верно.

Построим график относительных приращений цен закрытия:

plot(dr1, type='l')

Результат показан на рис. 1.

../_images/retnorm-01.png

Рис. 1. График относительных приращений цен закрытия индекса S&P500

Рассчитаем плотность вероятности для относительных приращений цен закрытия:

dens1 = density(dr1)

Построим график плотности вероятности (рис. 2):

plot(dens1)
../_images/retnorm-02.png

Рис. 2. График плотности вероятности для относительных приращений цен закрытия индекса S&P500

Построим гистограмму плотности вероятности (рис. 3):

hist(dr1, plot=TRUE, breaks=25)
../_images/retnorm-03.png

Рис. 3. Гистограмма распределения относительных приращений цен закрытия индекса S&P500

Применим критерий Шапиро-Уилка для проверки нормальности распределения:

t1 = shapiro.test(as.numeric(dr1))
print(t1$p.value) # выводим p-значение
if (t1$p.value < 0.05) {
    print("Гипотеза о нормальности распределения отклонена")
}else{
    print("Нет оснований отклонить гипотезу о нормальности распределения")
}

Получим p-значение 1.5e-21 и сообщение о том, что гипотезу о нормальности распределения отклонена (поскольку p-значение меньше, чем 0.05).

Построим график КК (квантиль-квантиль) для визуальной проверки нормальности распределения:

qqnorm(dr1)
qqline(dr1)

Если распределение нормальное, то все точки сосредоточились бы на базовой прямой, проходящей под углом 45 градусов. Получим график, показанный на рис. 4. Как видим, имеют место значительные отклонения от базовой прямой.

../_images/retnorm-04.png

Рис. 4. График квантиль-квантиль для относительных приращений цен закрытия индекса S&P500

Для проверки сгенерируем 100 чисел, распределённых по нормальному закону, применим к ним тот же тест и построим график КК:

d = rnorm(100)
shapiro.test(d)
qqnorm(d)
qqline(d)

Получим p-значение = 0.8158. На графике КК (рис. 5) все точки группируются вдоль базовой прямой. Таким образом, оба способа проверки (численный и визуальный) не дают повода отклонять гипотезу о нормальности данной последовательности (что и следовало ожидать, ведь мы изначально генерировали числа, подчиняющиеся нормальному закону).

../_images/retnorm-05.png

Рис. 5. График квантиль-квантиль для случайной последовательности чисел, распределённых по нормальному закону

Для проверки сгенерируем 100 чисел, имеющих распределения хи-квадрат с 3-мя степенями свободы, применим к ним тот же тест и построим график КК:

d = rchisq(100, df=3)
shapiro.test(d)
qqnorm(d)
qqline(d)

Получим p-значение = 1.47e-07. Как видно, p-значение оказалось меньше, чем 0,05, т.е. мы должны отвергнуть гипотезу о нормальности распределения. Более того, на графике КК многие точки далеко отходят от базовой прямой (рис. 6).

../_images/retnorm-06.png

Рис. 6. График квантиль-квантиль для случайной последовательности чисел, подчиняющихся распределению хи-квадрат

Итак, можно утверждать, что относительные приращения цен закрытия индекса S&P500 не распределены по нормальному закону.

Найдём мат.ожидание и среднеквадратичное отклонение и выведем их в консоль:

m1 = mean(dayret1)
s1 = sd(dayret1)
print(c(m1, s1))

Получим 0.00053 (можно считать нулевым) и 0.01013.

Снова построим график относительных приращений цен закрытия:

plot(dr1, type='l')

Добавим на график уровни для двух стандартных отклонений (как говорят, две сигмы; зелёные толстые сплошные линии на рис. 7):

abline(h=2*s1, col='green', lwd=3)
abline(h=-2*s1, col='green', lwd=3)

Добавим уровни для трёх стандартных отклонений (три сигмы; красные тонкие штриховые линии на рис. 7):

abline(h=3*s1, col='red', lty=5, lwd=1)
abline(h=-3*s1, col='red', lty=5, lwd=1)

Можно заключить, что относительные приращения цен закрытия индекса S&P500 редко выходят за ограничивающие уровни.

../_images/retnorm-07.png

Рис. 7. Относительные приращения цен закрытия индекса S&P500 редко выходят за ограничивающие уровни

Для нормального распределения известен факт: вероятность того, что случайные числа, распределённых по нормальному закону, выйдут за пределы двух сигм, составляет 0,0455 (т.е. менее 5%); а вероятность выйти за пределы трёх сигм – всего 0,0027 (т.е. меньше 0,3%).

К сожалению, как мы доказали выше, в нашем случае распределение не является нормальным. Сравним экспериментальную плотность вероятности (рис. 8, зелёная кривая) и теоретическую (красная), имеющую те же значения мат.ожидания и среднеквадратичного отклонения:

plot(dens1, col='green', type='l')
x = seq(-7*s1, 7*s1, by=s1/100)  # равномерная сетка
y = dnorm(x, mean=m1, sd=s1)     # теоретическая плотность
lines(x, y, col='red', type='l') # реальная плотность
abline(v=m1) # вертикальная линия, соответствующая мат.ожиданию
../_images/retnorm-08.png

Рис. 8. Экспериментальная и теоретическая плотность вероятности относительных приращений цен закрытия

Оценим вероятность того, что относительное приращение цен закрытия выйдет за пределы двух или трёх сигм. В математической статистике для таких оценок используются квантили и функции распределения. Напомним, что кванти́ль – это значение, которое случайная величина не превышает с заданной вероятностью; а функция распределения для любого числового значения показывает вероятность того, что случайная величина окажется меньше заданного значения.

Рассчитаем квантили для приращений цен закрытия:

pr = c(50, 90, 95, 99, 99.9)/100
quantile(dr1,  probs = pr)

50%        90%       95%       99%        99.9%
0.0007229  0.011126  0.015348  0.0291097  0.0457758

Сравним с квантилями нормального распределения, имеющего те же мат.ожидание и среднеквадратичное отклонение:

xn = rnorm(n=100000, mean=m1, sd = s1) # числа с нормальным распределением
quantile(xn,  probs = pr)

50%       90%        95%       99%        99.9%
0.000543  0.0135210  0.017109  0.0239715  0.0314749

Как видим, на практике цены закрытия с большей вероятностью “уходят” дальше, чем это было бы в случае нормального распределения.

Оценим функцию распределения (cumulative distribution function) для относительных приращений цен закрытия:

cdf1 = ecdf(as.numeric(dr1)) # функция распределения
plot(cdf1)            # график функции распределения
ss = s1 * seq(1:5)    # массив стандартных отклонений
1-cdf1(ss)

Получим вероятности того, что относительное приращение цены закрытия S&P500 выйдет за пределы заданного количества стандартных отклонений:

0.123466   0.025347   0.00735   0.003270   0.00000

Итак, вероятность того, что относительное приращение цены закрытия выйдет вверх за диапазон двух сигм, составляет 0.025 (т.е. 2.5%); за диапазон трёх сигм – 0.007 (т.е. 0.7%). Оценку вероятности выхода за нижний предел проведите самостоятельно.

Для нормального распределения с теми же параметрами:

1-pnorm(ss, mean=m1, sd=s1)
0.17168   0.25736   0.00160   3.95e-05   3.76e-07

Остаётся применить полученные знания на практике, т.е. попытаться заработать на тех закономерностях изменения цены, которые мы здесь выяснили. Конкретные торговые стратегии можно узнать во время обучения.



Комментарии (1)

Вы просматриваете: Shapiro
Facebookdel.icio.usStumbleUponDiggGoogle+Twitter
Gravatar
Владимир говорит...
Алгоритм применения критерия Шапиро-Уилка и пример расчёта в MS Excel на http://www.arhiuch.ru/lab9.html
11th December 2016 2:22am
Страница 1 из 1

* Обязательные поля
(Не публикуется)
 
Жирный Курсив Подчеркнутый Перечеркнутый Степень Индекс Код PHP Код Кавычки Вставить линию Вставить маркированный список Вставить нумерованный список Вставить ссылку Вставить e-mail Вставить изображение Вставить видео
 
Улыбка Печаль Удивление Смех Злость Язык Возмущение Ухмылка Подмигнуть Испуг Круто Скука Смущение Несерьёзно Шокирован
 
1000
Captcha
Refresh
 
Введите код:
 
Запомнить информацию введенную в поля формы.