Одного кирпичика для грааля не хватает (вопрос к квантам)
Как мне посчитать не корреляцию или ковариацию двух числовых рядов, а является ли один ряд опережающим индикатором для другого?
Вроде как логика подсказывает, что надо просто один из рядов сдвинуть во времени, но может есть нормальный аппарат для расчетов? Поскольку хочу запустить на довольно большом наборе инструментов — и узнаю правду, тщательно скрываемую.
нашелся код для матлаба (хоть смысл могу понять):
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-модули весьма распространены. Задача сводится в оформлении скрипта и рисование картинок.
Уже завтра, 18 февраля , подведём финансовые итоги 2025 года и поделимся планами на будущее.
Будем вести трансляцию в VK , Rutube и на нашем сайте .
❗️ Стартуем в 16:00 – не...
За первые полтора месяца года передали покупателям более 2700 ключей
Друзья, привет! Пока наши котировки волатильны на информационном шуме, операционно Группа продолжает достигать поставленные цели — за первые полтора месяца года передали покупателям более 2700...
Рейтинговое агентство «Эксперт РА» подтвердило кредитный рейтинг Займера на уровне ruBBB- со стабильным прогнозом. «Эксперт РА» отмечает: 🔸 Сильные конкурентные позиции Займера в сегменте,...
Просто, коротко и понятно: о чем шептались сегодня наши лучшие в мире аналитики в офисе?
Доброго дня, дорогие товарищи!
Сегодня в офисе прошел традиционный еженедельный мозговой штурм.
Пишу для вас короткий конспект, чтобы вы понимали вообще контекст того, что происходит....
Самый обширный за последние 15 лет морской ледяной покров в районе портов Балтики может сократить российский экспорт товаров из-за нехватки судов, способных работать в таких условиях — Bloomberg
Са...
Самый обширный за последние 15 лет морской ледяной покров в районе портов Балтики может сократить российский экспорт товаров из-за нехватки судов, способных работать в таких условиях — Bloomberg
Са...
OlgaB, любая ситуация не является угрожающей, если она в рамках анализа и рисков. Я стою в шорте Si с осени прошлого года, переходя на экспирациях и добавляясь на коррекциях.
ПРОСТО МЫ, Да он там сам с собой торгует!)) хочет наверх гонит, деньги вваливает, хочет обкэщивается патом, пока не обналичится не отпустит бумаги, хочет вниз давит!)) этого робота который сам себе...
История повторяется... Тактически блокировки конкурентов выгодны российским сервисам. Даже если это не нравится пользователям.
А вот стратегически — скорее вредны. Отсутствие сильных конкурентов ...
История повторяется... Тактически блокировки конкурентов выгодны российским сервисам. Даже если это не нравится пользователям.
А вот стратегически — скорее вредны. Отсутствие сильных конкурентов ...
VadimBorokhov, что за брокер?
Фифо соблюдаете?
Для Лдв должно быть 2 условия (помимо 3 лет):
1. сделка (продажа) прибыльная
2. финрез по всем бумагам прибыльный. По каждой отдельной бум...
Американские фьючерсы на природный газ упали до четырехмесячного минимума после того, как Среднеатлантический регион покинула суровая зима Фьючерсы на природный газ в США в понедельник утром упали до ...
В 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-модули весьма распространены. Задача сводится в оформлении скрипта и рисование картинок.