Индикаторы: Предсказание цены методом ближайшего соседа (с учетом взвешенных коэффициентов корреляции)

 

Предсказание цены методом ближайшего соседа (с учетом взвешенных коэффициентов корреляции):

Главным недостатком классического метода ближайших соседей (Nearest Neighbor algorithm, см. Предсказание цены методом ближайших соседей (k-NN) является то, что все цены в паттерне имеют одинаковый вес. Другими словами, предполагается, что более старые цены оказывают такое же влияние на будущие, как и новые. Для преодоления этого недостатка, в данной версии индикатора новые цены имеют большие веса при поиске наиболее близкого паттерна.

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

Индикатор рисует две кривые: синяя кривая показывает прошлые цены полученные методом ближайших соседей, а красная кривая показывает будущие цены того же паттерна. Ближайшие сосед масштабируется в коэффициентом соответствии линейной регрессией между данным паттерном и текущим паттерном.

Индикатор также выводит информацию о дате ближайшего соседа и коэффициент корреляции с настоящим паттерном.

Автор: Vladimir

Предсказание цены методом ближайшего соседа (с учетом взвешенных коэффициентов корреляции)

 

Какое счастье... собирался сам писать такую "беду"... теперь можно будет просто переделать...

Вопрос к автору... что является паттерном?  мне не понятно... потомучто в моей версии последовательности свечей будут кодироваться... именно код от нескольких свечей и будет считаться паттерном...

а что это у вас?

а то - гляжу в "книгу" вижу фигу ))

 
BaTTLeBLooM:

Какое счастье... собирался сам писать такую "беду"... теперь можно будет просто переделать...

Вопрос к автору... что является паттерном?  мне не понятно... потомучто в моей версии последовательности свечей будут кодироваться... именно код от нескольких свечей и будет считаться паттерном...

а что это у вас?

а то - гляжу в "книгу" вижу фигу ))

 

Паттерн состоит из двух частей

  1. Прошлые цены, т.е. цены слева от какой-то текущей цены (Open в моём случае) включая саму текущую цебу - их всего Npast
  2. Будущие цены, т.е. цены справа от текущей цены - их всего Nfut.

Для самого последнего бара на чарте нет будущих цен, только текущая цена и прошлые цены. То есть паттерн для текущей цены имеет только настоящую и прошлые цены (всего Npast) и индикатор предсказаывает Nfut будущих цен. Этот неполный паттерн я называю текущим или настоящим (current pattern). Остальные паттерны я называю прошлыми паттернами или по простому соседями. Эти соседи имеют как и прошлые так и "будущие" цены. Ближайщий сосед этот тот, который наиболее скоррелирован с настоящем паттерном по прошлым ценам. Можно изменить меру расстояния и вместо коэффициента корреляции использовать Евклидово расстояние, что общепринято. Нот тут нужно убирать среднюю и нормировать цены на хай-лоу.

 

 

Довольно интересная эта тема с поиском ближайших совпадений. Но использование в виде индикатора, затрудняет возможность исследования. Вот к примеру один из способов такого поиска с применением скрипта, который просто выбрасывается на график (для темного фона). Правда он на mql4 еще. Но сама идея может будет Вам полезна. Там еще используется и фильтр HP и возможность поиска для непрерывных данных и почасовой от времени суток.

 

Файлы:
 

интересно, а каков массив истории необходим для более или менее удачного предсказания? почему 300 баров по умолчанию?

и какова статистика показа  хотя бы направлений?

положительная, отрицательная или, как и все остальное 50/50? 

 
Приветствую ! gpwr, респект, очень интересная штука. Единственно у Вас там баг какой-то. Иногда непонятно с какого перепуга, на экране появляется полная ахения из вертикальных красных и синих полос, а в журнале запись, что коэффициент корреляции найденного паттерна 50 с лишним тысяч. Почему это вылезает я пока так и не понял, изучаю код. Происходит это достаточно редко, но попав в такой режим к норме оно уже не возвращается, индикатор приходится удалять и ставить снова. Единственно, у меня терминал на маке запущен под wineskin. Может баги какие-то ? Но маловероятно. Вобщем как бы то ни было, большое спасибо. Очень интересно, сам в этом направлении хочу немного покопать.
 
oltab:

интересно, а каков массив истории необходим для более или менее удачного предсказания? почему 300 баров по умолчанию?

и какова статистика показа  хотя бы направлений?

положительная, отрицательная или, как и все остальное 50/50? 

Для более удачного предсказания по-моему непригодна сама идея. Точнее идея очень и очень неплоха, но требует серьезной доработки напильником. Чем я и пытаюсь сейчас заняться.
 

Автору респект!

Написано всё грамотно и компактно. Спасибо.

Есть пожелания по доработке, если ещё занимаетесь этим.

1. На истории надо рисовать не соседа, с последнюю точку прогноза, сдвинутую назад на его длину (Nfut). Т.е. просчитать и нарисовать прогноз за некоторый интервал в прошлом. Тогда будет очевидно качество предсказания. Правда, думать индикатор при запуске будет долго...

2. Один сосед - это очень мало! Результат получается нестабильный.

Теоретически надо брать число соседей = 3 длины стартового вектора (т.е. паттерна), а потом усреднять все прогнозы (и лучше, с весами, пропорциональными коэффициентам корреляции).

 

У меня есть улучшенный алгоритм ближайшего соседа, который я использую в своих целях. Он преодолевает указанные недостатки. Идея проста. При поиске ближайшего соседа в исторических образцах сохраните все прошлые паттерны, их известные будущие паттерны и коэффициенты корреляции между этими прошлыми паттернами настоящим паттерном. Назовем эти коэффициенты корреляции r, которые являются вектором всех прошлых корреляций. Вместо того чтобы выбирать прошлый паттерн с наивысшим abs (r) в качестве ближайшего соседа, используйте ВСЕ прошлые паттерны в качестве «ближайших соседей», но с их вкладами взвешенными exp(sw*abs(r)), где sw - выбранная пользователем экспонента, которая контролирует избирательность предсказания прошлых паттернов с наивысшими коэффициентами корреляции. Очень большое значение sw приведет к тому что на прогноз будет влиять только сосед с самой сильной корреляцией (истинный «ближайший сосед»). Очень маленький sw сделает все прошлые паттерны одинаково важными. Те кто понял идею, могут переписать приведенный выше код и опубликовать новый индикатор. Ниже представлена ​​реализация в Matlab. Если вам нужно включить только прошлые паттерны с положительной корреляцией, удалите функцию abs () в r = abs (...). Тогда прошлые паттерны с отрицательной корреляцией автоматически будут иметь наименьший вес.

% Inputs
% sp is a time series to be predicted as a column vector
np=100;             	% past pattern length
nf=np;              	% future pattern length
sw=100;             	% weighting exponent in kNN

% Compute correlations to past patterns in sp
m  =numel(sp);		% number of bars in sp
x  =sp(1:m-np-nf);      % past patterns
y  =sp(m-np-nf+1:m-nf); % current past pattern
f  =sp(np+1:m-nf);      % future patterns
yf =sp(m-nf:m);         % current future pattern
Sx =movsum(x,np,'Endpoints','discard');
Sxx=movsum(x.^2,np,'Endpoints','discard');
Sy =sum(y);
Syy=sum(y.^2);
Sxy=conv(x,flip(y),'valid');
num=Sxy*np-Sx*Sy;
den=Sxx*np-Sx.*Sx;
r  =abs(real(num./sqrt(den)/sqrt(Syy*np-Sy*Sy)));

% Find nearest neighbor and extrapolate
w=exp(sw*r);
wsum=sum(w);
w=w/wsum;		% weighting coefficients of past patterns
a1=num./den;
a0=(Sxx.*Sy-Sx.*Sxy)./den;
a1=w.*a1;
a0=w.*a0;
a0_sum=sum(a0);
xp=conv(x,flip(a1),'valid')+a0_sum; % composite matched past pattern
xf=conv(f,flip(a1),'valid')+a0_sum; % predicted future pattern
xf=[xp(end);xf];

% Plot
figure
plot(1:np,y,'-k'); hold on;
plot(1:np,xp,'-b'); hold on;
plot(np:np+nf,yf,':k'); hold on;
plot(np:np+nf,xf,'-r');
 
Vladimir #:

У меня есть улучшенный алгоритм ближайшего соседа, который я использую в своих целях. Он преодолевает указанные недостатки. Идея проста. При поиске ближайшего соседа в исторических образцах сохраните все прошлые паттерны, их известные будущие паттерны и коэффициенты корреляции между этими прошлыми паттернами настоящим паттерном. Назовем эти коэффициенты корреляции r, которые являются вектором всех прошлых корреляций. Вместо того чтобы выбирать прошлый паттерн с наивысшим abs (r) в качестве ближайшего соседа, используйте ВСЕ прошлые паттерны в качестве «ближайших соседей», но с их вкладами взвешенными exp(sw*abs(r)), где sw - выбранная пользователем экспонента, которая контролирует избирательность предсказания прошлых паттернов с наивысшими коэффициентами корреляции. Очень большое значение sw приведет к тому что на прогноз будет влиять только сосед с самой сильной корреляцией (истинный «ближайший сосед»). Очень маленький sw сделает все прошлые паттерны одинаково важными. Те кто понял идею, могут переписать приведенный выше код и опубликовать новый индикатор. Ниже представлена ​​реализация в Matlab. Если вам нужно включить только прошлые паттерны с положительной корреляцией, удалите функцию abs () в r = abs (...). Тогда прошлые паттерны с отрицательной корреляцией автоматически будут иметь наименьший вес.

Владимир, идею я понял. 
Но это все равно будет рандомное прогнозирование.

Экспериментировал много с поиском патернов около 10 лет назад. С зеркальностью, инверсией, суммированием патернов. Вывод - полная рандомность в продолжении патерна на будущее. Все совпадения случайны. 

 
Nikolai Semko #:

Владимир, идею я понял. 
Но это все равно будет рандомное прогнозирование.

Экспериментировал много с поиском патернов около 10 лет назад. С зеркальностью, инверсией, суммированием патернов. Вывод - полная рандомность в продолжении патерна на будущее. Все совпадения случайны. 

Согласен

Причина обращения: