Блог им. Spekyl

Одного кирпичика для грааля не хватает (вопрос к квантам)

    • 20 июля 2012, 20:28
    • |
    • Spekyl
  • Еще
Как мне посчитать не корреляцию или ковариацию двух числовых рядов, а является ли один ряд опережающим индикатором для другого?

Вроде как логика подсказывает, что надо просто один из рядов сдвинуть во времени, но может есть нормальный аппарат для расчетов? Поскольку хочу запустить на довольно большом наборе инструментов — и узнаю правду, тщательно скрываемую.
★7
22 комментария
Dale_DMT, класс, спасибо. Буду искать дальше. А нет ли для excel функций или dll какой готовой?
avatar
Spekyl, и еще чтобы в реальном времени пересчитывала и выдавала теоретическую цену? ;)
В excel не знаю, вроде нет. В R есть (granger.test).

sam063rus ниже правильно пишет. По науке нужно приращения тестировать.
avatar
sam063rus, dll на то и dll, что к ней из грааля обратиться можно.
avatar
vlad1024 наверно знает…
avatar
Нашел текст теста на собачьем языке R:

Granger causality test

Model 1: fii ~ Lags(fii, 1:5) + Lags(rM, 1:5)
Model 2: fii ~ Lags(fii, 1:5)
Res.Df Df F Pr(>F)
1 629
2 634 5 2.5115 0.02896 *
— Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Granger causality test

Model 1: rM ~ Lags(rM, 1:5) + Lags(fii, 1:5)
Model 2: rM ~ Lags(rM, 1:5)
Res.Df Df F Pr(>F)
1 629
2 634 5 1.1804 0.3172

Надо либо с этим R разбираться, есть так компилятор и ли че… Или на нормальный переписать. C# или C++ или хоть на Бейсик.
avatar
А степень корреляции какая?
avatar
sofist, ясно.
Вопрос в пустоту автору топика.
avatar
agat50, вопрос был не про а/к.
В этом контексте считать ее не нужно, т.к. наличие видно по графику, а необходимости знать конкретные цифры нет.
avatar
инжектить Выбирать процесс .exe и за инжектить dll, возможно так можно)
avatar
нашелся код для матлаба (хоть смысл могу понять):
function [F,c_v] = granger_cause(x,y,alpha,max_lag)
% [F,c_v] = granger_cause(x,y,alpha,max_lag)
% Granger Causality test
% Does Y Granger Cause X?
%
% User-Specified Inputs:
% x — A column vector of data
% y — A column vector of data
% alpha — the significance level specified by the user
% max_lag — the maximum number of lags to be considered
% User-requested Output:
% F — The value of the F-statistic
% c_v — The critical value from the F-distribution
%
% The lag length selection is chosen using the Bayesian information
% Criterion
% Note that if F > c_v we reject the null hypothesis that y does not
% Granger Cause x

% Chandler Lutz, UCR 2009
% Questions/Comments: chandler.lutz@email.ucr.edu
% $Revision: 1.0.0 $ $Date: 09/30/2009 $
% $Revision: 1.0.1 $ $Date: 10/20/2009 $

% References:
% [1] Granger, C.W.J., 1969. «Investigating causal relations by econometric
% models and cross-spectral methods». Econometrica 37 (3), 424?438.

%Make sure x & y are the same length
if (length(x) ~= length(y))
error('x and y must be the same length');
end

%Make sure x is a column vector
[a,b] = size(x);
if (b>a)
%x is a row vector — fix this
x = x';
end

%Make sure y is a column vector
[a,b] = size(y);
if (b>a)
%y is a row vector — fix this
y = y';
end

%Make sure max_lag is >= 1
if max_lag < 1
error('max_lag must be greater than or equal to one');
end

%First find the proper model specification using the Bayesian Information
%Criterion for the number of lags of x

T = length(x);

BIC = zeros(max_lag,1);

%Specify a matrix for the restricted RSS
RSS_R = zeros(max_lag,1);

i = 1;
while i <= max_lag
ystar = x(i+1:T,:);
xstar = [ones(T-i,1) zeros(T-i,i)];
%Populate the xstar matrix with the corresponding vectors of lags
j = 1;
while j <= i
xstar(:,j+1) = x(i+1-j:T-j);
j = j+1;
end
%Apply the regress function. b = betahat, bint corresponds to the 95%
%confidence intervals for the regression coefficients and r = residuals
[b,bint,r] = regress(ystar,xstar);
%Find the bayesian information criterion
BIC(i,:) = T*log(r'*r/T) + (i+1)*log(T);
%Put the restricted residual sum of squares in the RSS_R vector
RSS_R(i,:) = r'*r;
i = i+1;
end

x_lag = find(min(BIC));

%First find the proper model specification using the Bayesian Information
%Criterion for the number of lags of y

BIC = zeros(max_lag,1);

%Specify a matrix for the unrestricted RSS
RSS_U = zeros(max_lag,1);

i = 1;
while i <= max_lag
ystar = x(i+x_lag+1:T,:);
xstar = [ones(T-(i+x_lag),1) zeros(T-(i+x_lag),x_lag+i)];
%Populate the xstar matrix with the corresponding vectors of lags of x
j = 1;
while j <= x_lag
xstar(:,j+1) = x(i+x_lag+1-j:T-j,:);
j = j+1;
end
%Populate the xstar matrix with the corresponding vectors of lags of y
j = 1;
while j <= i
xstar(:,x_lag+j+1) = y(i+x_lag+1-j:T-j,:);
j = j+1;
end
%Apply the regress function. b = betahat, bint corresponds to the 95%
%confidence intervals for the regression coefficients and r = residuals
[b,bint,r] = regress(ystar,xstar);
%Find the bayesian information criterion
BIC(i,:) = T*log(r'*r/T) + (i+1)*log(T);
RSS_U(i,:) = r'*r;
i = i+1;
end

y_lag = find(min(BIC));

%The numerator of the F-statistic
F_num = ((RSS_R(x_lag,:) — RSS_U(y_lag,:))/y_lag);

%The denominator of the F-statistic
F_den = RSS_U(y_lag,:)/(T-(x_lag+y_lag+1));

%The F-Statistic
F = F_num/F_den;

c_v = finv(1-alpha,y_lag,(T-(x_lag+y_lag+1)));
avatar
Я не понял, так кто всё же появился раньше — курица или яйцо?
avatar
en.wikipedia.org/wiki/Granger_causality

но смысл примерно такой же, сдвигаем один ряд приращений в прошлое, и смотрим может ли он предсказать будущие значения другого. если выборка большая то можно просто корреляция посчитать, результат будет практически такой же.
avatar
vlad1024, зачем так сложно, если изначално есть статистические методы определения качества корреляции 2х динамических рядов?
avatar
А в чем сложность???

Берешь 2 ряда, разбиваешь на блоки (можно с частичным перекрытием). Для каждого блока откидываешь немного с конца и с начала. Получается интервал. Считаешь корреляцию. Если она адекватной величины, сдвигаешь один ряд влево/вправо, откидываешь концы чтобы получился такой же интервал. Считаешь корреляцию. Если она увеличилась, есть опережение/отставание. Уменьшилась — нет.
Так для всех блоков. Отсюда получится вывод, как предсказательный характер одного из рядов для другого менялся во времени и есть ли устойчивость.

Продвинутое дополнение:
Берешь те же блоки. Раскладываешь в Фурье. Если есть близкие частоты — хорошо. вычитаешь из рядов все кроме нужных частот, смотришь опережение/отставание по предыдущей схеме.
Исходя из частот и величины корреляции делаешь вывод о периодической составляющей, чувствительности и ее устойчивости.

Формулы есть в той же википедии, FFT-модули весьма распространены. Задача сводится в оформлении скрипта и рисование картинок.
avatar
sam063rus, хм…
Ну… на самом деле, я не очень согласен с концепцией в вашем топике.
Фурье, вейвлеты, свертки, SVD и т.п. дают хорошие результаты для установившихся автоколебательных процессов — это да.
Но я не считаю, что этот подход применим для движения цен, и я склонен рассматривать все это как набор переходных процессов. Т.е. с декомпозицией согласен, но с выбором базисных функций — нет.
avatar

теги блога Spekyl

....все тэги



UPDONW
Новый дизайн