Индикаторы: Предсказание цены методом ближайшего соседа (с учетом взвешенных коэффициентов корреляции)
Какое счастье... собирался сам писать такую "беду"... теперь можно будет просто переделать...
Вопрос к автору... что является паттерном? мне не понятно... потомучто в моей версии последовательности свечей будут кодироваться... именно код от нескольких свечей и будет считаться паттерном...
а что это у вас?
а то - гляжу в "книгу" вижу фигу ))
Какое счастье... собирался сам писать такую "беду"... теперь можно будет просто переделать...
Вопрос к автору... что является паттерном? мне не понятно... потомучто в моей версии последовательности свечей будут кодироваться... именно код от нескольких свечей и будет считаться паттерном...
а что это у вас?
а то - гляжу в "книгу" вижу фигу ))
Паттерн состоит из двух частей
- Прошлые цены, т.е. цены слева от какой-то текущей цены (Open в моём случае) включая саму текущую цебу - их всего Npast
- Будущие цены, т.е. цены справа от текущей цены - их всего Nfut.
Для самого последнего бара на чарте нет будущих цен, только текущая цена и прошлые цены. То есть паттерн для текущей цены имеет только настоящую и прошлые цены (всего Npast) и индикатор предсказаывает Nfut будущих цен. Этот неполный паттерн я называю текущим или настоящим (current pattern). Остальные паттерны я называю прошлыми паттернами или по простому соседями. Эти соседи имеют как и прошлые так и "будущие" цены. Ближайщий сосед этот тот, который наиболее скоррелирован с настоящем паттерном по прошлым ценам. Можно изменить меру расстояния и вместо коэффициента корреляции использовать Евклидово расстояние, что общепринято. Нот тут нужно убирать среднюю и нормировать цены на хай-лоу.
Довольно интересная эта тема с поиском ближайших совпадений. Но использование в виде индикатора, затрудняет возможность исследования. Вот к примеру один из способов такого поиска с применением скрипта, который просто выбрасывается на график (для темного фона). Правда он на mql4 еще. Но сама идея может будет Вам полезна. Там еще используется и фильтр HP и возможность поиска для непрерывных данных и почасовой от времени суток.
Предсказание цены методом ближайшего соседа (с учетом взвешенных коэффициентов корреляции):
Автор: Vladimir
интересно, а каков массив истории необходим для более или менее удачного предсказания? почему 300 баров по умолчанию?
и какова статистика показа хотя бы направлений?
положительная, отрицательная или, как и все остальное 50/50?
интересно, а каков массив истории необходим для более или менее удачного предсказания? почему 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');
У меня есть улучшенный алгоритм ближайшего соседа, который я использую в своих целях. Он преодолевает указанные недостатки. Идея проста. При поиске ближайшего соседа в исторических образцах сохраните все прошлые паттерны, их известные будущие паттерны и коэффициенты корреляции между этими прошлыми паттернами настоящим паттерном. Назовем эти коэффициенты корреляции r, которые являются вектором всех прошлых корреляций. Вместо того чтобы выбирать прошлый паттерн с наивысшим abs (r) в качестве ближайшего соседа, используйте ВСЕ прошлые паттерны в качестве «ближайших соседей», но с их вкладами взвешенными exp(sw*abs(r)), где sw - выбранная пользователем экспонента, которая контролирует избирательность предсказания прошлых паттернов с наивысшими коэффициентами корреляции. Очень большое значение sw приведет к тому что на прогноз будет влиять только сосед с самой сильной корреляцией (истинный «ближайший сосед»). Очень маленький sw сделает все прошлые паттерны одинаково важными. Те кто понял идею, могут переписать приведенный выше код и опубликовать новый индикатор. Ниже представлена реализация в Matlab. Если вам нужно включить только прошлые паттерны с положительной корреляцией, удалите функцию abs () в r = abs (...). Тогда прошлые паттерны с отрицательной корреляцией автоматически будут иметь наименьший вес.
Владимир, идею я понял.
Но это все равно будет рандомное прогнозирование.
Экспериментировал много с поиском патернов около 10 лет назад. С зеркальностью, инверсией, суммированием патернов. Вывод - полная рандомность в продолжении патерна на будущее. Все совпадения случайны.
Владимир, идею я понял.
Но это все равно будет рандомное прогнозирование.
Экспериментировал много с поиском патернов около 10 лет назад. С зеркальностью, инверсией, суммированием патернов. Вывод - полная рандомность в продолжении патерна на будущее. Все совпадения случайны.
Согласен
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Предсказание цены методом ближайшего соседа (с учетом взвешенных коэффициентов корреляции):
Главным недостатком классического метода ближайших соседей (Nearest Neighbor algorithm, см. Предсказание цены методом ближайших соседей (k-NN) является то, что все цены в паттерне имеют одинаковый вес. Другими словами, предполагается, что более старые цены оказывают такое же влияние на будущие, как и новые. Для преодоления этого недостатка, в данной версии индикатора новые цены имеют большие веса при поиске наиболее близкого паттерна.
Этот индикатор находит ближайшего соседа с помощью взвешенного коэффициента корреляции, в котором последние цены обладают большими весами. Весовой коэффициент линейно уменьшается от новых цен к старым в пределах ценового паттерна.
Индикатор рисует две кривые: синяя кривая показывает прошлые цены полученные методом ближайших соседей, а красная кривая показывает будущие цены того же паттерна. Ближайшие сосед масштабируется в коэффициентом соответствии линейной регрессией между данным паттерном и текущим паттерном.
Индикатор также выводит информацию о дате ближайшего соседа и коэффициент корреляции с настоящим паттерном.
Автор: Vladimir