Одного кирпичика для грааля не хватает (вопрос к квантам)
Как мне посчитать не корреляцию или ковариацию двух числовых рядов, а является ли один ряд опережающим индикатором для другого?
Вроде как логика подсказывает, что надо просто один из рядов сдвинуть во времени, но может есть нормальный аппарат для расчетов? Поскольку хочу запустить на довольно большом наборе инструментов — и узнаю правду, тщательно скрываемую.
нашелся код для матлаба (хоть смысл могу понять):
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
%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));
но смысл примерно такой же, сдвигаем один ряд приращений в прошлое, и смотрим может ли он предсказать будущие значения другого. если выборка большая то можно просто корреляция посчитать, результат будет практически такой же.
Берешь 2 ряда, разбиваешь на блоки (можно с частичным перекрытием). Для каждого блока откидываешь немного с конца и с начала. Получается интервал. Считаешь корреляцию. Если она адекватной величины, сдвигаешь один ряд влево/вправо, откидываешь концы чтобы получился такой же интервал. Считаешь корреляцию. Если она увеличилась, есть опережение/отставание. Уменьшилась — нет.
Так для всех блоков. Отсюда получится вывод, как предсказательный характер одного из рядов для другого менялся во времени и есть ли устойчивость.
Продвинутое дополнение:
Берешь те же блоки. Раскладываешь в Фурье. Если есть близкие частоты — хорошо. вычитаешь из рядов все кроме нужных частот, смотришь опережение/отставание по предыдущей схеме.
Исходя из частот и величины корреляции делаешь вывод о периодической составляющей, чувствительности и ее устойчивости.
Формулы есть в той же википедии, FFT-модули весьма распространены. Задача сводится в оформлении скрипта и рисование картинок.
Текущий тренд на ослабление рубля может оказаться устойчивым, мы видим достижимыми уровни 15,2 для CNY/RUB, 112 для USD/RUB и 119,8 для EUR/RUB в 2025 г. - Росбанк Новые санкции и смягчение режима вал...
Текущий тренд на ослабление рубля может оказаться устойчивым, мы видим достижимыми уровни 15,2 для CNY/RUB, 112 для USD/RUB и 119,8 для EUR/RUB в 2025 г. - Росбанк Новые санкции и смягчение режима вал...
То что Софтлайн повернулся опой к инвесторам которым раздавал по 140, так как ну вот слова словами а реальность такова что проще было Софтлайн не слушать а деньги в банк по 15% и выше. и что в итоги и...
Сергей Соколов, соглашусь с товарищами.ниже 29 рублей нет интереса. Может и поднырнем под 29. Но пару дней и до 28… не более. 12 это простите уже даже инфляцию не отыграют. Это нереально. Посмотрим
В excel не знаю, вроде нет. В R есть (granger.test).
sam063rus ниже правильно пишет. По науке нужно приращения тестировать.
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++ или хоть на Бейсик.
Вопрос в пустоту автору топика.
В этом контексте считать ее не нужно, т.к. наличие видно по графику, а необходимости знать конкретные цифры нет.
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)));
но смысл примерно такой же, сдвигаем один ряд приращений в прошлое, и смотрим может ли он предсказать будущие значения другого. если выборка большая то можно просто корреляция посчитать, результат будет практически такой же.
Берешь 2 ряда, разбиваешь на блоки (можно с частичным перекрытием). Для каждого блока откидываешь немного с конца и с начала. Получается интервал. Считаешь корреляцию. Если она адекватной величины, сдвигаешь один ряд влево/вправо, откидываешь концы чтобы получился такой же интервал. Считаешь корреляцию. Если она увеличилась, есть опережение/отставание. Уменьшилась — нет.
Так для всех блоков. Отсюда получится вывод, как предсказательный характер одного из рядов для другого менялся во времени и есть ли устойчивость.
Продвинутое дополнение:
Берешь те же блоки. Раскладываешь в Фурье. Если есть близкие частоты — хорошо. вычитаешь из рядов все кроме нужных частот, смотришь опережение/отставание по предыдущей схеме.
Исходя из частот и величины корреляции делаешь вывод о периодической составляющей, чувствительности и ее устойчивости.
Формулы есть в той же википедии, FFT-модули весьма распространены. Задача сводится в оформлении скрипта и рисование картинок.