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

 
tolga gogebakan:

Есть предупреждение. Не могли бы вы мне помочь? Заранее спасибо.

Оно доброкачественное - продолжайте использовать его как есть, поскольку оно не влияет на работу индикатора
 
Здравствуйте, Владимир, спасибо большое за то, что поделились своими прекрасными, удивительными, потрясающими и невероятными футуристическими и передовыми мыслями и идеями. Я ваш поклонник кодирования этого либо mql4 или 5. Давайте продолжать в том же духе. Также благодарен за помощь McLaden, хотя объяснение короткое, но очень полезное. Да благословит вас всех Господь.
 

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

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

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

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

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

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

 

Привет, Владимир,

Я хотел бы поговорить с вами об этом индикаторе для работы по настройке.

Свяжитесь со мной, если сможете: najnudel@gmail.com.

tks

 
Я думаю, что правильная ставка несколько 50:50, но прогнозируемые результаты полезны для ручной торговли.
 

У меня есть улучшенный алгоритм ближайшего соседа, который я использую в своих целях. Он преодолевает указанные недостатки. Идея проста. При поиске ближайшего соседа в исторических образцах сохраните все прошлые паттерны, их известные будущие паттерны и коэффициенты корреляции между этими прошлыми паттернами настоящим паттерном. Назовем эти коэффициенты корреляции 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 лет назад. С зеркальностью, инверсией, суммированием патернов. Вывод - полная рандомность в продолжении патерна на будущее. Все совпадения случайны. 

Согласен

 
Nikolai Semko #:

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

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

если учитывать реальное время, то отнюдь.. схожие движения в одинаковые моменты. Из системы выбросили фактор времени и получили рандом

 
okayjustask ручной торговли.

Этот код нуждается в незначительных улучшениях, но в целом ваша идея имеет смысл