Проверка гипотезы о независимости логарифмической доходности за различные интервалы времени при большом, среднем и малом объеме торгов
Заключение
В результате проведенной работы получилось, что гипотеза о независимости логарифмических доходностей для различных интервалов времени при большом, среднем и малом объеме торгов принимается при 0,01 и 0,05 уровнях значимости практически всегда, однако гистограмма Р-значений не равномерна на отрезке [0,1] , что не дает мне с полной уверенностью сказать, что они независимы и гипотеза принимается в отличие от результатов прошлого года.
Новизна состоит в том, что в работе были использованы новые программы и две альтернативные гипотезы
Литература
1) Браилов А.В. Лекции по математической статистике.-М.: Финакадемия, 2007
2) Гмурман В.Е. - Руководство к решению задач по теории вероятностей и математической статистике: Учеб. Пособие - 12-е изд.,перераб.-М.:Высшее образование, 2006-476 с. (Основы наук)
3) Горяинов Б.В., Павлов И.В., Цветкова Г.М. и др. Математическая статистика: под ред. ЗарубинаВ.С., Крищенко А.П. - М.:Изд-во МГТУ им. Н.Э.Баумана, 2001. - 424 с.(Сер. Математика в техническом университете; Вып. XVII).
4) Ниворожкина Л.И., Морозова З.А. Теория вероятностей и математическая статистика - М.:Эксмо, 2008. - 432 с. - (Техническое образование).
5) Письменный Д. Конспект лекций по теории вероятностей и математической статистике и случайным процессам. - М.: Айрис-пресс, 2008. - 256 с. - (Высшее образование).
6) http://finance.yahoo.com.
7) Аюпов Д. (2013). Проверка гипотезы о независимости логарифмической доходности за различные интервалы времени при большом, среднем и малом объеме торгов Москва: ФГОУ ВПО "Финансовый университет при Правительстве РФ".
8) Безделина Е. (2013). Проверка следствий гипотезы о независимости логарифмической доходности за различные интервалы времени Москва: ФГОУ ВПО "Финансовый университет при Правительстве РФ".
9) Петухова С. (2013). Проверка гипотезы о нормальном распределении дневной логарифмической доходности по модифицированному критерию Пирсона. Москва: ФГОУ ВПО "Финансовый университет при Правительстве РФ".
Приложение 1
Таблица 19. Характеристики компьютера
Тип процессора |
Intel Core i5 2450M |
|
Тактовая частота |
2.50 GHz |
|
Частота системной шины |
99.76 MHz |
|
Объем кэш-памяти второго уровня |
512KB |
Таблица 20. Список программ, работающих более 10 секунд
Гистограмма Р-значений.mtc |
15 c. |
|
Квантили распределения статистики критерия.mtc |
2 м. 35 с. |
|
Мощность критерия.mtc |
29 с. |
Приложение 2
1.Число торговых дней
//источник [7]
//время работы 656 мс
Y=2010:2013;
T=loadtextcol("Tickers.txt","Tickers");
NT=0(#T,#Y);
for (y in Y)
{
d1=date(y,1,1);
d2=date(y,12,31);
for (t in T)
{
X=loaddaily(d1,d2,t+".csv","CLOSE");
NT(t.num,y.num)=sum(X>0);
}
}
F=["год/тикер","2010","2011","2012","2013"];
tiker=[F;T,NT];
savetable(tiker,"Число торговых дней.csv");
3,4.Скачки цен
//источник [7]
//Радостева 2014 г.
//717 мс
Y=2010:2013;
T=loadtextcol("Tickers.txt","Tickers");
NT=0(#T,#Y);
NT1=0(#T,#Y);
for (y in Y)
{
d1=date(y,1,1);
d2=date(y,12,31);
for (t in T)
{
X=loaddaily(d1,d2,t+".csv","CLOSE");
I=select(X,X>0);
I1=I(2:#I);
I=I(1:(#I-1));
NT(t.num,y.num)=max(I1/I);
NT1(t.num,y.num)=min(I1/I);
}
}
F=["год/тикер","2010","2011","2012","2013"];
U=[F;T,NT-1];
savetable(U,"Скачки цен вверх.csv");
U=[F;T,NT1-1];
savetable(U,"Скачки цен вниз.csv");
1,2.Графики со скачками
//источник [7]
//2.8 c
Tickers=loadtextcol("Tickers.txt","Tickers");
Max = 0; MaxTic = super(1);
Min = 1; MinTic = super(1);
d1 = date(2010,1,1);
d2 = date(2013,12,31);
for(i in Tickers)
{
Close = loaddaily (d1,d2,i + ".csv","CLOSE");
I=select(Close,Close>0);
C1=I(2:#I);
C= I(1:(#I-1));
if(max(C1/C) > Max)
{
Max = max(C1/C); MaxTic = i;
}
if(min(C1/C) < Min)
{
Min = min(C1/C); MinTic = i;
}
}
//Построение графиков цен акций с мин. и макс. скачками
for(i in [MaxTic;MinTic])
{
Close = loadnumcol(i + ".csv","CLOSE");
C = select(Close,Close>0);
X = 1:#C;
XX = select(X,Close>0);
wintitle(i);
line(XX,C,blue);
axes();
show();
erase();
}
7. Квантили распределения статистики критерия
//Источник [7] и [8]
//Радостева 2014г.
//2м 35с
timer(0);
//число дней для года, полугодия, квартала,
//которые соответствуют большому, среднему и малому объемам торгов
k=[240;120;60];
//временной лаг
lag=1:8;
m=10000;
St=0(m,#k);
PV=0(m,#k);
//закон геометрического броуновского движения
law L()=exp(sum(nlaw(0,1)(1)));
for(j in 1:#k)
{
for (i in 1:m)
{
//содаем два независимых вектора,показывающих лог доходность
Log=dif(ln(L(k(j))));
for (lg in 1:8)
{
X=Log(1:#Log-lg);
Y=Log(lg+1:#Log);
p=#Y;
maxX=max(X)+1;
maxY=max(Y)+1;
minX=min(X)-1;
minY=min(Y)-1;
rY=elaw(Y).invpg(1/3);
rX=elaw(X).invpg(1/3);
//интервалы для вычисления частот торгов
DX=[minX;-rX;rX;maxX];
DY=[minY;-rY;rY;maxY];
r1=#DX-1;//количество интервалов для X
r2=#DY-1;//то же самое для Y
n=0(r1,r2);
//создаем таблицу частот
for (c in 1:r1)
for (d in 1:r2)
n(c,d)=sum(X>=DX(c)& X<DX(c+1) &
Y>=DY(d) & Y<DY(d+1));
l=(r1-1)*(r2-1);//степень свободы
n1=sum(rows(n));
n2=sum(cols(n));
//создаем таблицу произведения частот
t=n1&*n2;
//проверка условия использования критерия
if (min(t/k(j))>5)
x2=sum((n-t/p)^2/t)*p;//статистика критерия
St(i,j)=x2;
}
}
}
Lew=0.001:0.999:0.001;
qi=[Lew];
for(i in 1:#k)
{
El=elaw(St.c(i));
qi=[qi,El.q(Lew)];
}
savetable(["Квантиль","Год","Полугодие","Квартал";qi],
"Квантили распределния статистики.csv");
3,4,5. Гистограммы Р-значений
//источники [7] и [8]
//Радостева 2014г.
//15 c
timer(0);
q=loadnumcol("Квантили распределения статистики.csv","Квантиль");
y=loadnumcol("Квантили распределния статистики.csv","Год");
hy=loadnumcol("Квантили распределения статистики.csv","Полугодие");
quarter=loadnumcol("Квантили распределения статистики.csv","Квартал");
//эмпирические законы распределения
Qy=elaw(y);
Qhy=elaw(hy);
Qquarter=elaw(quarter);
m=1000;
//объем выборок для года, полугодия, квартала
k=[240;120;60];
//временной лаг
lag=1:8;
PV=0(m,#k);
//закон геометрического броуновского движения
law L()=exp(sum(nlaw(0,1)(1)));
for(j in 1:#k)
{
for (i in 1:m)
{
Log=dif(ln(L(k(j))));
for (lg in lag)
{
//создаём два независимых вектора,
//показывающих лог доходность
X=Log(1:#Log-lg);
Y=Log(1+lg:#Log);
p=#Y;
maxX=max(X)+1;
maxY=max(Y)+1;
minX=min(X)-1;
minY=min(Y)-1;
rY=elaw(Y).invpg(1/3);
rX=elaw(X).invpg(1/3);
//интервалы для вычисления частот
DX=[minX;-rX;rX;maxX];
DY=[minY;-rY;rY;maxY];
r1=#DX-1;//количество интервалов для X
r2=#DY-1;//то же самое для Y
n=0(r1,r2);
//создаем таблицу частот
for (c in 1:r1)
for (d in 1:r2)
n(c,d)=sum(X>=DX(c)& X<DX(c+1) &
Y>=DY(d) & Y<DY(d+1));
n1=sum(rows(n));
n2=sum(cols(n));
//создаем таблицу произведения частот
t=n1&*n2;
if (min(t/k(j))>5)
x2=sum((n-t/p)^2/t)*p;
s=x2;
//находим Р-значение для года, полугодия, квартала
if (j==1) PV(i,j)=Qy.pg(s);
if (j==2) PV(i,j)=Qhy.pg(s);
if (j==3) PV(i,j)=Qquarter.pg(s);
}
}
}
h=0.001;
Pt=0:1:h;
TOF1=PV.c(1).intfrgel(Pt);
TOF2=PV.c(2).intfrgel(Pt);
TOF3=PV.c(3).intfrgel(Pt);
savetable(["PV","Год","Полугодие","Квартал";
[Pt(2:#Pt),PV.c(1),PV.c(2),PV.c(3)]],"Таблица Р-значений.csv");
hist(TOF1,blue);
wintitle("При объеме выборки соответствующему году");
axes();
show();
erase();
hist(TOF2,blue);
wintitle("При объеме выборки соответствующему полугодию");
axes();
show();
erase();
hist(TOF3,blue);
wintitle("При объеме выборки соответствующему кварталу");
axes();
Проверка равномерности распределения по Колмогорову
//Радостева 2014г
//32мс
Yh=loadnumcol("Таблица Р-значений.csv","Год");
Ym=loadnumcol("Таблица Р-значений.csv","Полугодие");
Yl=loadnumcol("Таблица Р-значений.csv","Квартал");
Lteor=ulaw(0,1);
Lnab1=elaw(Yh);Lnab2=elaw(Ym);Lnab3=elaw(Yl);
XX=0:1:0.1;
//Критерий Колмогорова
DD1=max(abs(Lnab1.pl(XX)-Lteor.pl(XX)))*(#Yh)^0.5;
DD2=max(abs(Lnab2.pl(XX)-Lteor.pl(XX)))*(#Ym)^0.5;
DD3=max(abs(Lnab3.pl(XX)-Lteor.pl(XX)))*(#Yl)^0.5;
Z1=pvKolm(DD1);
Z2=pvKolm(DD2);
Z3=pvKolm(DD3);
k1="Не принимается при объеме выборки соответствующему году";
k2="Не принимается при объеме выборки соответствующему полугодию";
k3="Не принимается при объеме выборки соответствующему кварталу";
if (Z1>0.05)
k1="При объеме выборки соответствующему году принимается";
if (Z2>0.05)
k2="При объеме выборки соответствующему полугодию принимается";
if (Z3>0.05)
k3="При объеме выборки соответствующему кварталу принимается";
[k1;k2;k3];
9,10,11. Мощность критерия
//источник [7]
//Радостева 2014г.
//29c
timer(0);
q=loadnumcol("Квантили распределения статистики.csv","Квантиль");
y=loadnumcol("Квантили распределения статистики.csv","Год");
hy=loadnumcol("Квантили распределения статистики.csv","Полугодие");
quarter=loadnumcol("Квантили распределения статистики.csv","Квартал");
S=[240;120;60];
//временной лаг
lag=1:8;
g=0(2,3);
//критические точки для года, полугодия, квартала
Tkr=[elaw(y).q(1-0.05/2);elaw(hy).q(1-0.05/2);elaw(quarter).q(1-0.05/2)];
Count=0(2,3);
m=1000;
//коэффициент корреляции
po=0.7;//0.1,0.45
K=0(2,3);
C=[po;-po];
law L()=exp(sum(nlaw(0,1)(1)));
for(a in 1:#C)
{
for(j in 1:#S)
{
for (i in 1:m)
{
Log=dif(ln(L(S(j))));
for(lg in lag)
{
//создаем зависимые лог доходности
LnX=Log(1:#Log-lg);
LnY=LnX*C(a)+(1-C(a)^2)^0.5*Log(1+lg:#Log);
maxX=max(LnX)+1; maxY=max(LnY)+1;
minX=min(LnX)-1; minY=min(LnY)-1;
rX=elaw(LnX).invpg(1/3); rY=elaw(LnY).invpg(1/3);
D1=[minX;-rX;rX;maxX];
D2=[minY;-rY;rY;maxY];
//количество интервалов
r1=#D1-1;
r2=#D2-1;
k=#LnX;
//создаем таблицу частот частоты
n=0(r1,r2);
for (c in 1:r1)
for (d in 1:r2)
n(c,d)=sum(LnX>=D1(c)&LnX<D2(c+1)&
LnY>=D2(d)&LnY<D2(d+1));
n2=sum(cols(n));
n1=sum(rows(n));
//таблица произведения частот
t=n1&*n2;
if(min(t/k)>5)
{
//сколько раз проверялась гипотеза
g(a,j)=g(a,j)+1;
z=sum((n-t/k)^2/t)*k;
//количество раз, когда гипотеза не выполнялась
if (Tkr(j)<abs(z)) Count(a,j)=Count(a,j)+1;
}
}
}
}
}
Count=Count/g;
savetable([" ","Год","Полугодие","Квартал";["cor="+po;"cor="+(-po)],Count],
"Мощность критерия.csv");
12,13,14,15.Таблица Р-значений для реальных данных
//источник [7] и [8]
//Радостева 2014г.
//2.8с
d1 = date(2010,1,1);
d2 = date(2010,12,31);
Tickers = loadtextcol("Tickers2.txt","Tickers");
Vars = ["LoVol","MidVol","HiVol"];
//временной лаг
lag=[1:5;10:25:5;30:50:10];
//суперматрица, размер которой определяется количеством элементов
//матрицы Tickers и количеством элементов матрицы Vars,
//все элементы которой являются "пустыми" строками символов
TabPV = super(#Tickers,#Vars);
Y=2010:2013;
for (y in Y)
{
d1 = date(2010,1,1);
d2 = date(y,12,31);
for(ticker in Tickers)
{
V0 = loaddaily(d1,d2,ticker + ".csv","Volume");
V = select(V0,V0>0);//отбираются акции только по рабочим дням
LV = elaw(V);//эмпирическое распределение
//эмпирические квантили(определяется объем торгов уровня квантили 1/3)
v1 = LV.invpl(1/3);
//эмпирические квантили(определяется объем торгов уровня квантили 2/3)
v2 = LV.invpl(2/3);
P0 = loaddaily(d1,d2,ticker + ".csv","Adj Close");
P = select(P0,V0>0);
assert(min(P)>0);
for(nv in 1:#Vars)
{
TabPV(ticker.num,nv) ="*";//-1 для построения диаграммы
if(nv==1) C = (V<=v1)(1:#V-1);
if(nv==2) C = (V>v1 & V<v2)(1:#V-1);
if(nv==3) C = (V>=v2)(1:#V-1);
//определяется дневная логдоходность для C
lnR = select(dif(ln(P)), C);
m = #lnR;//число наблюдений
//если число наблюдений меньше 50,
//то прерывается выполнение тела оператора for
// и начинается переход к следующему элементу матрицы
if(m<50) continue;
minR = min(lnR)-1;//нижняя граница
maxR = max(lnR)+1;//верхняя граница
r = elaw(lnR).invpg(1/3);
Q = [-r;r];
D1 = [minR; Q; maxR]; //разбиваем на интервалы
D2 = [minR; Q; maxR]; //разбиваем на интервалы
r1 = #D1-1; //количество интервалов, на которые разбили
r2 = #D2-1;//количество интервалов, на которые разбили
pv=0(#lag);
for (lg in 1:#lag)
{
//случайные величины с учетом временных лагов
lnR1 = lnR(1:m-lag(lg));
lnR2 = lnR(1+lag(lg):m);
n = #lnR1;
//условие использования критерия
if(n<50) continue;
p = 0(r1,r2);
// p - матрица вероятностей попадания доходностей
//в получившиеся интервалы
for (i in 1:r1)
{
for(j in 1:r2)
{
p(i,j) = sum(lnR1>=D1(i)&lnR1<D1(i+1) &
lnR2>=D2(j)&lnR2<D2(j+1))/n;
}
}
//проверка того, что логдоходность попадает вся
//в общий интервал
assert(abs(sum(p)-1) < 0.000001);
k = (r1-1)*(r2-1);// степень свободы критерия
p2 = sum(cols(p));//сумма столбцов матрицы p
p1 = sum(rows(p));//сумма строк матрицы р
t = p1&*p2;
if(min(t*n) > 5)
{
//если выполняется условие, при котором можно
//использовать критерий Пирсона:
//теоритические частоты >=5
z=n*sum((p-t)^2/t);
//сколько раз считался критерий для одного года //и тикера
Count=Count+1;
pv(lg) = x2law(k).pg(z); // P-значение
}
}
//среднее значение
if (Count) TabPV(ticker.num,nv) =sum(pv)/Count;
}
}
H = ["Тикер",Vars];
Out = [H; [Tickers,TabPV]];
savetable(Out,"tab"+y+".csv");
}
6,7,8.Гистограмма Р-значений для реальных данных
//Радостева 2014г.
//1.8с
Y=2011:2013;
//загружаем данные по каждому объему торгов
X1=loadnumcol("tab2010.csv","LoVol");
X2=loadnumcol("tab2010.csv","MidVol");
X3=loadnumcol("tab2010.csv","HiVol");
//убираем данные, где статистика не посчиталась
LoVol=select(X1,X1>0&X2>0&X3>0);
MidVol=select(X2,X1>0&X2>0&X3>0);
HiVol=select(X3,X1>0&X2>0&X3>0);
//строим векторы Р-начений для каждого объема торгов
for (y in Y)
{
LoVol=[LoVol;loadnumcol("tab"+y+".csv","LoVol")];
MidVol=[MidVol;loadnumcol("tab"+y+".csv","MidVol")];
HiVol=[HiVol;loadnumcol("tab"+y+".csv","HiVol")];
}
//выбираем шаг
h=0.01;
Pt=0:1:h;
//разбиваем на интервалы
TOF1=LoVol.intfrgel(Pt);
TOF2=MidVol.intfrgel(Pt);
TOF3=HiVol.intfrgel(Pt);
//рисуем
hist(TOF1,blue);
wintitle("При малом объеме торгов");
axes();
show();
erase();
hist(TOF2,blue);
wintitle("При большом среднем торгов");
axes();
show();
erase();
hist(TOF3,blue);
wintitle("При большом объеме торгов");
axes();
16.Доля проверок, в которых гипотеза проверялась
//источник [7]
//Радостева 2014г.
//5.8c
d1 = date(2010,1,1);
d2 = date(2010,12,31);
Tickers = loadtextcol("Tickers2.txt","Tickers");
Vars = ["LoVol","MidVol","HiVol"];
//временной лаг
lag=[1:5;10:25:5;30:50:10];
TabPV = super(#Tickers,#Vars);
Y=2010:2013;
Res=0(2,3);
Cou=0(2,3);
for (y in Y)
{
d1 = date(2010,1,1);
d2 = date(y,12,31);
for(ticker in Tickers)
{
V0 = loaddaily(d1,d2,ticker + ".csv","Volume");
V = select(V0,V0>0);//отбирабтся акции только по рабочим дням
LV = elaw(V);//эмпирическое распределение
//эмпирические квантили(определяется объем торгов
//уровня квантили 1/3)
v1 = LV.invpl(1/3);
//эмпирические квантили(определяется объем торгов
//уровня квантили 2/3)
v2 = LV.invpl(2/3);
P0 = loaddaily(d1,d2,ticker + ".csv","Adj Close");
P = select(P0,V0>0);
assert(min(P)>0);
for(nv in 1:#Vars)
{
TabPV(ticker.num,nv) ="*";//-1 для построения диаграммы
if(nv==1) C = (V<=v1)(1:#V-1);
if(nv==2) C = (V>v1 & V<v2)(1:#V-1);
if(nv==3) C = (V>=v2)(1:#V-1);
//определяется дневная логдоходность для C
lnR = select(dif(ln(P)), C);
m = #lnR;//число наблюдений
if(m<50) continue;
minR = min(lnR)-1;//нижняя граница
maxR = max(lnR)+1;//верхняя граница
r = elaw(lnR).invpg(1/3);
Q = [-r;r];
D1 = [minR; Q; maxR]; //разбиваем на интервалы
D2 = [minR; Q; maxR]; //разбиваем на интервалы
r1 = #D1-1; //количество интервалов, на которые разбили
r2 = #D2-1;//количество интервалов, на которые разбили
pv=0(#lag);
for (lg in 1:#lag)
{
//случайные величины с учетом временных лагов
lnR1 = lnR(1:m-lag(lg));
lnR2 = lnR(1+lag(lg):m);
n = #lnR1;
if(n<50) continue;
p = 0(r1,r2);
//p - матрица вероятностей попадания доходностей
//в получившиеся интервалы
for (i in 1:r1)
{
for(j in 1:r2)
{
p(i,j) = sum(lnR1>=D1(i)&lnR1<D1(i+1) &
lnR2>=D2(j)&lnR2<D2(j+1))/n;
}
}
//проверка того, что логдоходность попадает вся
//в общий интервал
assert(abs(sum(p)-1) < 0.000001);
k = (r1-1)*(r2-1);// степень свободы критерия
p2 = sum(cols(p));//сумма столбцов матрицы p
p1 = sum(rows(p));//сумма строк матрицы р
t = p1&*p2;
L=x2law(k);
Tkr=[L.q(1-0.01/2);L.q(1-0.05/2)];
if(min(t*n) > 5)
{
//если выполняется условие, при котором
//можно использовать критерий Пирсона:
// теоритические частоты >=5
z=n*sum((p-t)^2/t);
for (kr in 1:#Tkr)
{
Cou(kr,nv)=Cou(kr,nv)+1;
//сколько раз гипотеза выполнялась
if(Tkr(kr)>abs(z))
Res(kr,nv)=Res(kr,nv)+1;
}
}
}
}
}
}
savetable(["Уровень значимости","LoVol","MidVol","HiVol";
[["1%";"5%"],Res/Cou]],
"Доля проверок, в которых гипотеза принималась.csv");
17,18.Медиана Р-значений
//Радостева 2014г
//16мс
Y=2011:2013;
//загружаем таблицу Р-значений при разных объемов торгов
LoVol=loadnumcol("tab2010.csv","LoVol");
MidVol=loadnumcol("tab2010.csv","MidVol");
HiVol=loadnumcol("tab2010.csv","HiVol");
for (y in Y)
{
LoVol=[LoVol,loadnumcol("tab"+y+".csv","LoVol")];
MidVol=[MidVol,loadnumcol("tab"+y+".csv","MidVol")];
HiVol=[HiVol,loadnumcol("tab"+y+".csv","HiVol")];
}
Tickers=loadtextcol("Tickers2.txt","Tickers");
Y=2010:2013;
MedYear=0(#Y,3);
MedTic=0(#Tickers,3);
//медианы по годам
for (y in 1:#Y)
{
X1=LoVol.c(y);X2=MidVol.c(y);X3=HiVol.c(y);
X1=select(X1,X1>0);X2=select(X2,X2>0);X3=select(X3,X3>0);
MedYear(y,1)=median(X1);
MedYear(y,2)=median(X2);
MedYear(y,3)=median(X3);
}
//медианы по тикерам
for (tic in 1:#Tickers)
{
X1=LoVol.r(tic);X2=MidVol.r(tic);X3=HiVol.r(tic);
X1=select(X1,X1>0);X2=select(X2,X2>0);X3=select(X3,X3>0);
MedTic(tic,1)=median(X1);
MedTic(tic,2)=median(X2);
MedTic(tic,3)=median(X3);
}
savetable(["Год","LoVol","MidVol","HiVol";Y,MedYear],
"Медианы Р-значений по годам.csv");
savetable(["Тикер","LoVol","MidVol","HiVol";Tickers,MedTic],
"Медианы Р-значений по тикерам.csv");