<div align="center"><b><!--sizeo:2--><span style="font-size:10pt;line-height:100%"><!--/sizeo-->Самоликбез по нейросетям - Урок 1<!--sizec--></span><!--/sizec--></b></div> Попробуем научить нейросеть вычислять значения какой-нибудь нетривиальной функции, например, y(x)=x+cos(x/30)*200 На рисунке ниже диаграмма y=f(x), построенная Excel'ом <div align="center"> </div> 1)Создаем .xls файл с расчетами значений функции (в столбцах Х и У - то, что мы предъявим нейросети): X Y 1 201 2 202 ....... 658 458 659 459 660 460 Всего 660 строк - вполне достаточно для обучения и тестирования 2) В NeuroShell 2 (профессиональный режим) Импортируем данные В Предобработке выбираем <i>Графики зависимостей</i> Смотрим график зависимости Y от номера примера <div align="center"> </div> похожа на диаграмму выше - значит, исходные данные распознали верно 3) Настраиваем входы-выходы (Х-вход,У-выход) и устанавливаем мин-макс по стандартному отклонению <div align="center"> </div> 4) Делим исходные данные на 3 части = файла (.trn-тренировочный, .tst-тестовый, .pro-экзаменационный) <div align="center"> </div> получим три файла - .trn, .tst, .pro первые два используются для обучения нейросети, третий - совершенно неизвестный для сети (его мы будем использовать для проверки работоспособности) 5) Настраиваем архитектуру сети и параметры обучения Нейрошелл предлагает сеть Ворда - оставим как есть, ибо мало что могу сейчас сказать о принципах выбора архитектуры Параметры обучения выставим такими (уберем любые причины остановки обучения - будем тренировать долго))) <div align="center"> </div> 6) Запускаем процесс обучения Через несколько секунд останавливаем его, чтобы посмотреть, что получилось Для этого применяем нейросеть к .pat-файлу (содержит полный набор данных) - создается .out-файл Просматриваем, что получилось <div align="center"> </div> черным - график, построенный по оригинальным данных синим - ответ сети прямо скажем - не очень хороший результат ))) надо дать сети возможность поучиться 7) Тренируем сеть еще 2 минуты и снова применяем ее к .pat-файлу … уже неплохо, очень неплохо <div align="center"> </div> 8) Еще через 15 минут обучения … Применяем сеть к полному набору данных Получаем результаты применения (учимся работать по приборам, т.к. в дальнейшем таких простых входов-выходов не будет) <blockquote>Имя файла: C:NeuroShell 2MYПарабола.pat Обработано примеров: 660 Выход: C1 R квадрат: 0.9992 r квадрат: 0.9992 Средний квадрат ошибки: 46.699 Ср. квадратичная ошибка (СКО): 6.834 Относительная СКО, %: 0.727 Средняя абсолютная ошибка: 5.800 Мин. абсолютная ошибка: 0.010 Макс. абсолютная ошибка: 15.153 Коэффициент корреляции r: 0.9996 Доля с ошибкой менее 5%: 79.697 Доля с ошибкой от 5% до 10%: 7.121 Доля с ошибкой от 10% до 20%: 9.091 Доля с ошибкой от 20% до 30%: 1.061 Доля с ошибкой свыше 30%: 3.030 </blockquote> <div align="center"> </div> <div align="center"> </div> 9) Дальше нет особого смысла обучать - результат более чем хороший Пробуем применить эту сеть к экзаменационной части набора (.pro - эта часть никак не участвовала в обучении) - сравнимо с проверкой в реале Имя файла: C:NeuroShell 2MYПарабола.pro Обработано примеров: 66 Выход: C1 R квадрат: 0.9991 r квадрат: 0.9991 Средний квадрат ошибки: 42.929 Ср. квадратичная ошибка (СКО): 6.552 Относительная СКО, %: 0.697 Средняя абсолютная ошибка: 5.410 Мин. абсолютная ошибка: 0.018 Макс. абсолютная ошибка: 14.666 Коэффициент корреляции r: 0.9996 Доля с ошибкой менее 5%: 83.333 Доля с ошибкой от 5% до 10%: 13.636 Доля с ошибкой от 10% до 20%: 1.515 Доля с ошибкой от 20% до 30%: 0 Доля с ошибкой свыше 30%: 1.515 <div align="center"> </div> Отлично!!! ИТОГО: - получен первый опыт создания нейросети в нейрошелл 2)) ВЫВОДЫ: - 23-нейронная сеть справилась с непростой задачей - ошибка на выходе реального применения <10% - похоже, что еще пару часов обучения снизят ошибку до 5% - что дальше? P.S. Открываю случайную книгу (подвернулась "NLP: используйте свой мозг для изменения. Р.Бэндлер) на случайной странице. Читаю: "Замешательство всегда есть указание на то, что вы находитесь на пути к пониманию. Замешательство предполагает, что у вас есть множество данных, но они еще не организованы способом, который позволяет вам понять их" )) P.S.2 Обучение нейросети остановил, т.к. в течение нескольких минут ошибка перестала снижаться Подправил архитектуру - вместо 2х блоков по 7 нейронов скрытого слоя выставил 2 блока по 20 нейронов Через 10 минут обучения ошибка этой сети уже меньше, чем наилучшая ошибка прошлой сети Вывод: старой сети просто-напросто не хватало нейронов, чтобы выучить урок ближе к оригиналу За 40 минут новая сеть выдала вот такой результат <div align="center"> </div>
Отличный пример. ^good^ К вопросу, что дальше. Сначала преамбула. Пример на самом деле простой (показательность и результат примера это нисколько не умаляет). Это синусоида с постоянной длинной волны (периодом, частотой) и амплитудой. От обычной синусоиды отличается осью абсцисс, которая идет не горизонтально, а под наклоном 30 градусов. А теперь, что дальше. Если по максимуму... То период синусоиды делаем переменным (частотная модуляция), амплитуду делаем переменной (+/- 25%, например) и ось абсцис заменяем прямую на синусоиду с длинным периодом. Не знаю, понятна ли картинка, которую "нарисовал". Если нет, скажите, нарисую в фотошопе. :unsure: Можно весь этот максимум разбить на части и попробовать окучить частями. Но очень интересен результат решения "по максимуму".
Подозреваю, что с этой задачей сеть тоже справится без труда, весь вопрос в количестве нейронов и времени обучения Сейчас вектор интереса смещаю в сторону поиска закономерности как таковой Применительно к Форексу это может звучать так: 1) Имеет ли значение цвет галстука Бернанке при выступлении 2) Связаны ли между собой экономические показатели, связаны ли экономические показатели США, Еврозоны, ... 3) Зависит ли разворот тренда от дня недели, часа, месяца .... А также: Как влияет время обучения сети и количество требуемых нейронов при количестве входов 2,3,... 50 ?
Ставлю более практичную задачу: зависит ли направление свечи D1 от : - направления N предыдущих свечей - фин.инструмента - дня недели ? возможно, будут изменения о результатах сообщу
Не факт, что справится. А если и справится, не известно, на сколько хорошо. Вообще-то, я описал идеальную, но довольно близкую к реальной, картину рынка с точки зрения преобразований Фурье. На счет Ваших пунктов, я понимаю, что Вы имеете ввиду, но тут таки есть что сказать... 1. Цвет галстука не имеет значения. Имеет значения час назначенной пресс-конференц после чего-либо. 2. Не связаны. В большей степени имеет значение в вечернее время строительство новых домов в штатах, а в ночное время уровень безработицы в Австралии. При этом Еврозона реагирует по разному. Евра, как правило соответсвует в противоположном направлении, а фунт, как правило, чихать хотел на всю эту ерунду 3. Не зависит. Один из моих экспериментов в НШ2 это показал однозначно. На часовке введение номера часа существенно ухудшило результаты обучения и работы нейро сети. Выше перечисленное - мои личные наблюдения, т.е. ИМХО. На истину в последней инстанции не претендую.
Вот новая функция - менее гладкая)) После 1,6млн эпох обучения (19 часов на ноутбуке) имеем <div align="center"> </div> видно, что на пилообразном участке шансов приблизиться к оригиналу практически нет на гладких участках все более-менее терпимо P.S. Кстати говоря NeuroShell 2 (Версия 4.0) работает в WoW подсистеме Windows Другими словами - это DOS архитектура (Windows 3.1) программа 15-тилетней давности Ни о какой многопотоковости речи быть не может Т.е. разницы в скорости обучения на одноядерном Celeron'e и 4-хядерном Xeon'e не будет Есть что-либо посовременнее? Задача обучения нейросети должна прекрасно параллелиться
Касаясь вопроса о процессорном времени и распараллеливании процесса обучения... Не вижу особой сложности в том, чтобы сделать процесс обучения сети распределенным: есть NeuroServer и NeuroClient'ы - сервер хранит последнюю версию наиболее удачных весов, а клиенты каждый сам по себе пытаются улучшить ошибку. Двадцать человек держат у себя на компьютере клиента, который настроен на Low приоритет использования процессора, чтобы не мешать выполнению таких ресурсоемких задач, как просмотр web-страничек и набора текста в Word))), а в сумме получаем неслабый кластер - дешево и сердито Подозреваю, что кто-то уже это сделал ))) Что слышно на этом фронте?
Я уверен, что если на пилу натравить отдельну сеть, она так же хорошо обучится. По-моему, из этого примера видно, что для разных участков надо делать разные сети. Применительно к рынку, в трендах работает одна сеть, на флетах другая. Дело за малым, выбор критерия определения однотипных участков на исторических данных. Результат работы критерия - количество однотипных участков и их "адреса". Задача аналогичная проблеме создания алгоритмического принципа определения тренда и флета. Я видел множество попыток решения такого автоопределения (возможности отличия) тренда и флета. Ни одна не увенчалась успехом. Точнее, какие-то результаты всегда были, лучше или хуже. Но задачу можно считать до сих пор не решенной. Хотя, может быть у кого-то и получилось решить эту проблему с приемлемой точностью, и просто я не видел такого решения.
Для Форекса нет необходимости получать решение с точность в 95% Простые размышления позволяют сделать вывод о том, что достаточно 60-65% успешности предсказания отдельных событий (в отличие от 50% успешности при подбрасывании монетки), чтобы вычислить необходимый размер депозита и подобрать ММ (стратегию управления капиталом), для достижения прибыльности На уровне ощущений чувствую, что при работе с нейросетями не следует пользоваться устоявшимися терминами - тренд, флет, волатильность, ... Таким образом мы "навязываем" новорожденной нейросети все наши обусловленности - надо дать ей возможность взглянуть на мир по новому. Как это сделать и тем более объяснить - я пока не знаю Надо экспериментировать, термины придут сами. Моя нейросеть головного мозга что-нибудь заметит ))
Я не слышал. Хотя у самого с полгода назад возникала почти такая же идея. Готового решения не нашел, хотя, собссно, глубоко и не рыл. Была мысль о собственной реализации. Но решил не тратить время. Тем более, что нейро жрет ресурсы только на этапе обучения. Готовая сеть работает очень быстро.
Увы, ya-sha, Вы ошибаетесь. Моя практика нейро-предсказаний показывает однозначно, что процент предсказания менее 80, это все равно, что подбрасывать монетку.
Здесь много "но" и "если" Пока воздержусь от развития этой темы, если Вы не против Хотя мой следующий вопрос частично затрагивает эту тему Имею вопрос по нейрошелл 2 Подаю нейросети данные в виде 21 58 -16 3 101 -63 12 117 -48 64 53 -2 113 45 30 -0.5 3 76 -56 21 58 -16 3 101 -63 12 117 -48 64 53 -2 -0.5 179 7 166 3 76 -56 21 58 -16 3 101 -63 12 117 -48 0.5 50 36 19 179 7 166 3 76 -56 21 58 -16 3 101 -63 0.5 44 71 -40 50 36 19 179 7 166 3 76 -56 21 58 -16 -0.5 54 61 -12 44 71 -40 50 36 19 179 7 166 3 76 -56 -0.5 47 30 27 54 61 -12 44 71 -40 50 36 19 179 7 166 0.5 181 3 124 47 30 27 54 61 -12 44 71 -40 50 36 19 0.5 Последний столбец - это желаемый ответ: "плюс 0.5 - следующий бар вверх, минус 0.5 - вниз" нормировал выход в диапазоне [-0.5,+0.5], чтобы проще было анализировать ошибку ожидал, что если средняя ошибка будет около 0.5, то сеть не нашла закономерности другими словами "средняя ошибка"*100% - это процент неугадывания сетью направления следующего бара Вот график выходов в Предобработке <div align="center"> </div> Применяю натренированную сеть к .pro файлу и получаю ср.абсолютную ошибку 0.037 если следовать моей логике, то вероятность ошибиться у этой сети 3.5%, соответственно вероятность угадывания 96.5% Вот результаты применения: <blockquote><i>Имя файла: C:\NeuroShell 2\MY\EURUSD1440.pro Обработано примеров: 205 Выход: C1 R квадрат: 0.9672 r квадрат: 0.9691 Средний квадрат ошибки: 0.008 Ср. квадратичная ошибка (СКО): 0.090 Относительная СКО, %: 8.986 Средняя абсолютная ошибка: 0.037 Мин. абсолютная ошибка: 0 Макс. абсолютная ошибка: 0.725 Коэффициент корреляции r: 0.9844 Доля с ошибкой менее 5%: 64.390 Доля с ошибкой от 5% до 10%: 15.610 Доля с ошибкой от 10% до 20%: 9.268 Доля с ошибкой от 20% до 30%: 3.415 Доля с ошибкой свыше 30%: 5.854 </i></blockquote> Находясь в здравом рассудке, задался вопросом "Где я ошибаюсь?" ))) Собственно, прошу помочь мне найти ошибку в логике --------------------------------------------------------------------- Ответ найден: в исходные данные попала информация о баре, для которого производилось прогнозирование ^acute^ А как все красиво начиналось :tatice_06:
Точно. В таких случаях всегда получаются результаты, близкие к идеальным. И, кстати, это самые распространенные грабли, на которые хотя бы раз, наступают практически все. Обязательно надо для сетки оставлять кучку неизвестных ей данных, которые не попали ни в тренировочный, ни в тестовый набор.
Совсем забыл... :unsure: В соседней ветке <b>Прогаммы для нейросетей</b> выложил НШ2 с русским хелпом. Если кому-то надо...
Экзаменационный и тестовые наборы я выделил, так что проблема была не в "переобученности" сети Возможно, я нечетко выразился в следующей фразе Поясню В исходных данных 21 58 -16 3 101 -63 12 117 -48 64 53 -2 113 45 30 -0.5 3 76 -56 21 58 -16 3 101 -63 12 117 -48 64 53 -2 -0.5 179 7 166 3 76 -56 21 58 -16 3 101 -63 12 117 -48 0.5 третий столбец содержал информацию об искомом направлении закрытия бара т.е. вопрос к нейросети звучал так "Каково будет направление закрытия 0-го бара, если известны high, low и close 0-го,1-го,2-го,3-го и 4-го?" Вот что показала гистограмма важности входов <div align="center"> </div> третий вход во многом определял итоговый результат Как говорится - нет худа без добра Такая ошибка позволила мне сделать вывод, что нейросеть найдет закономерность, если она есть (по крайней мере, если она настолько явная) Что уже хорошо, на этапе знакомства После того, как эта информация была удалена из входного набора, ошибка сети после 20 часов обучения не смогла опуститься ниже 49.5% Что, впрочем, ожидаемо После такого эксперимента можно усомниться в теории свечного анализа применительно к EURUSD D1
Вы выразились, как раз-таки, вполне четко и понятно. Я ведь в самом начале тоже наступал на эти грабли. У меня сетка выдавала изумительные результаты при проверке. И я так же, как Вы, задавал себе вопрос - в чем ошибка (слишком всё красиво). Потом до меня дошло, что я проверяю сеть на тех же данных, на которых она училась - бэк тест. Тогда я и перешел на форвард тест. И результаты стали настолько плохими, что я снова задал себе вопрос - в чем ошибка. И в результате я пришел к тому, что "катастрофа" содержится в принципе выбора входных данных. Что на вход подадим, то и получим. В 90% случаев - ничего хорошего. То, что я имел ввиду в своем посте написано и в хелпе в НШ2 <i>Выделение тестового набора Воспользуйтесь этим модулем для выделения тестового набора и/или экзаменационного набора данных из числа тренировочных примеров. ... Экзаменационный набор может использоваться для проверки результатов работы сети на данных, которые сеть <b>никогда не "видела" раньше</b></i>.
лёксус, ок! этот урок я уже усвоил Кстати, в матлабе я не нашел такого инструмента\технологии как "калибровка" и, как следствие, не было возможности автоматически контролировать переобученность сети Поэтому считаю, что Нейрошелл 2 больше подходит для работы с Форекс
Сделал простенький скрипт. Основа - генератор случайных чисел. Используется для определения - добавить или отнять некоторое значение. Фактически, получилась имитация прилетающих тиков, которые собираются в "минутные" бары. И таких баров сделал 1000 штук. Скрипт пишет сгенерированные бары в файл csv, в котором можно потом построить биржевую диаграмму (тоже самое, что мы видим на графике цен в МТ4). Вот, что получилось. Зачем сделал? И сам точно не знаю. Возможно, к вопросу о поисках закономерностей. Интересно, а в таких котировках есть какая-то закономерность? И можно ли предсказать дальнейшее развитие событий? Это сам скрипт. Посмотреть вложение s_Random.mq4
После ряда тестов получил следующие цифры, может быть будут интересны кому-то. Торговля на 4Н в направлении D. (% изменения по сравнению с тестом по 4H) Колличество сделок : -45,24% Winners: +7.99% Profit: -25.10% Max DD(общий): -29,92% ФВ(Recovery Factor): +6.84% Вывод: При уменьшении колличества сделок почти в два раза, имеем небольшой прирост в RF и небольшое улучшение ситуации с общей просадкой. п.с. Тестируемая выборка с начала этого года по текущий момент. Какие мысли по поводу улучшения показателей?