| / | Статьи |
Cтатьи
Возможности
Рецепты нейросетей
Авторизуйтесь или зарегистрируйтесь , чтобы добавить новую статью
|
Рецепты нейросетей [ en ]ВведениеНе так давно - на заре технического анализа, когда компьютеры были далеко не у каждого биржевика - появлялись люди, которые пытались предсказывать будущие цены по ими же придуманным законам и формулам. Таких людей часто называли шарлатанами. Время шло, усложнялись методы обработки информации, и теперь очень сложно найти равнодушного к техническому анализу. Любой трейдер-новичок с легкостью может оперировать графиками, различными индикаторами, искать закономерности. С каждым днем пополняются ряды форекс-трейдеров. Одновременно с этим растут их запросы к методам анализа рынка. Одними из таких "относительно" новых методов являются использование теории нечеткой логики и нейросетей. Мы сами видим, как на любом тематическом форуме обсуждаются темы, посвященные этим вопросам. Они есть и всегда будут появляться. Человек, придя в мир биржи, навряд ли покинет ее. Ибо она есть вызов его интеллекту, его силе ума, силе воли. Поэтому трейдер всегда учится чему-то новому и применяет в своей практике самые разнообразные подходы. В этой статье мы разберем основы создания нейросетей, познакомимся с понятием нейросетей Кохонена и немного поговорим о методах оптимизации торговли. Эта статья адресована в первую очередь трейдерам, которые только начинают знакомиться с нейросетями и их принципами обработки информации. Для приготовления нейросети со слоем Кохонена нам понадобится:1) 10 000 баров истории любой валютной пары; Раздел I. Рецептура слоя КохоненаНачнем с раздела для тех, кто еще «до». В нем мы поговорим про различные подходы обучения слоя Кохонена, а точнее его, так называемой, базовой версии, ибо разнообразий очень много. Этот раздел не претендует на оригинальность материала, все авторские пояснения, которые в ней описаны, взяты из классической литературы данной тематики. Но хороший плюс, который в нем есть, – это обилие пояснительных рисунков для каждой главы. В разделе рассмотрим следующие вопросы: Итак, как гласит Википедия, нейронные сети Кохонена - это класс нейронных сетей, основным элементом которых является слой Кохонена. Слой Кохонена состоит из адаптивных линейных сумматоров («линейных формальных нейронов»). Как правило, выходные сигналы слоя Кохонена обрабатываются по правилу «победитель забирает всё»: наибольший сигнал превращается в единичный, остальные обращаются в ноль. Давайте разберем это понятие на примере. Для наглядности все выкладки будут даваться для двумерных входных векторов. На рисунке 1 цветом изображен входной вектор. Каждый нейрон слоя Кохонена (как в принципе и любого другого слоя) просто суммирует вход, умножая его на свои веса. На самом деле веса слоя Кохонена есть не что иное как координаты вектора для данного нейрона. Таким образом, выход каждого нейрона Кохонена – это скалярное произведение двух векторов. Из геометрии мы знаем, что максимальное скалярное произведение будет в том случае, если угол между векторами будет стремиться к нулю (косинус угла будет стремиться к 1). Из этого следует, что максимальное значение будет иметь тот нейрон слоя Кохонена, который ближе всех к входному вектору.
Рис.1 Победителем является тот нейрон, чей вектор наиболее близок ко входному сигналу. Как следует дальше из понятия, мы должны найти среди всех нейронов максимальное выходное значение, присвоить его выход единице, остальным нейронам присвоить ноль. Таким образом, слой Кохонена будет выдавать нам "ответ", в какой области пространства лежит входной вектор. Как происходит подстройка весовых векторов Кохонена Целью обучения слоя, как писалось выше, является четкая пространственная классификация входных векторов. А это означает, что каждый нейрон должен отвечать за свой определенный участок, в котором он является победителем. Ошибка отклонения нейрона-победителя от входного вектора должна быть меньше, чем у остальных нейронов. Чтобы достичь этого, нейрон-победитель "поворачивается" в сторону входного вектора.
Рис.2. Каждый из нейронов приближается к своему ближайшему входному сигналу. С каждой итерацией нейрон-победитель приближается к "своему" входному вектору. Его новые координаты определяются по формуле:
Но на практике такого случая практически не встречается, так как обычно требуется большой объем входных данных разделить на группы схожих, тем самым уменьшив разнообразие входных данных. Поэтому значение А=1 нежелательно. Оптимальным на практике оказываются начальные значения менее 0.3. К тому же А обратно пропорционально числу входных векторов. То есть, желательно при большой выборке делать маленькие коррекции, чтоб нейрон-победитель не "летал" по всему пространству в своих корректировках. В качестве функционала А обычно выбирается любая монотонно убывающая функция. Например, гипербола или линейное убывание, или гауссовская функция.
Рис.3. Коррекция весов нейрона под воздействием входного сигнала.
Рис.4. Колебания нейрона между двумя входными векторами.
Рис. 5. Зависимость вида классификации от числа нейронов Еще одна ситуация показана на рисунке 5. В первом случае четыре нейрона адекватно разделяют выборку на четыре области гиперсферы. Во втором случае недостаточное число нейронов приводит к увеличению ошибки и переклассификацию выборки. Таким образом, можно сделать вывод, что в слое Кохонена должно быть достаточное число свободных нейронов, которое зависит от объема классифицируемой выборки. Предварительная подготовка входных векторов
Это превращает входной вектор в единичный вектор с тем же самым направлением, т.е. в вектор единичной длины в n-мерном пространстве. Смысл данной операции очевиден – спроецировать все входные вектора на поверхности гиперсферы, тем самым, облегчить слою Кохонена задачу поиска. Другими словами, так как мы будем искать угол между входными векторами и векторами-нейронами Кохонена, то должны избавиться от такого фактора как длина вектора, уравняв шансы всех нейронов. Часто элементами векторов выборки являются неотрицательные числа (например, значения скользящих средних, РСИ, сама цена). Все они сосредоточены в положительном квадранте пространства. В результате нормализации такой "положительной" выборки получим большое скопление векторов только в одной положительной области, что не очень хорошо для классификации. Поэтому перед нормализацией можно выполнить выравнивание выборки. Если выборка довольно большая, то можно предположить, что вектора находятся примерно в одной области без «аутсайдеров», которые вылетают далеко за основную выборку. Следовательно, выборку можно просто отцентрировать относительно ее «крайних» координат.
Рис. 6. Нормализация входных векторов
Как писалось выше, нормализация векторов желательна. Она упрощает корректировку слоя Кохонена. Но все же мы должны четко представлять себе выборку и принимать решение, стоит ли ее проецировать на сферу или нет. for (N=0; N<nNeuron[0]; N++) // по всем нейронам входного слоя { min=in[N][0]; // ищем минимум на всей выборке for (pat=0; pat<nPattern; pat++) if (in[N][pat]<min) min=in[N][pat]; for (pat=0; pat<nPattern; pat++) in[N][pat]-=min; // подвигаем на величину минимального значения max=in[N][0]; // ищем максимум на всей выборке for (pat=0; pat<nPattern; pat++) if (in[N][pat]>max) max=in[N][pat]; for (pat=0; pat<nPattern; pat++) in[N][pat]=2*(in[N][pat]/max)-1; // сужаем до [-1,1] } Если мы нормализуем входные вектора, то должны соответственно нормализовать и все веса нейронов. Остановимся на первом и последнем случае подробно.
Рис. 7. Результат обучения рандомизированных нейронов Также, если в некоторой области будет большое скопление нейронов, то несколько нейронов может попасть в область одного класса и разделить его на подклассы – оранжевая область на рисунке 7. Что в принципе не так и критично, ведь дальнейшая обработка сигналов слоя может исправить ситуацию, но все же за это придется расплатиться временем обучения. Одним из вариантов решения данных проблем является метод, когда на начальных этапах корректируются веса не только одного нейрона-победителя, но и группы ближайших к нему векторов. Затем постепенно число группы уменьшается и в конце корректируется только один нейрон. Группу можно выбирать из отсортированного массива выходов нейронов. Нейроны из числа первых К максимальных выходов будут корректироваться. Еще одним подходом в групповой настройке весовых векторов является следующий метод. а) Для каждого нейрона определяется длина вектора коррекции
где n – размерность входного вектора, a(t)- неубывающая функция по времени, с каждой итерацией увеличивает свое значение от 0 до 1, вследствие чего в начале все входные векторы совпадают с векторами весов, а в конце встают на свои места. При этом весовые вектора будут как бы «тянуться» за своими классами. Вот в принципе и весь материал по базовой версии слоя Кохонена, который будет применяться в данной нейросети. II. Ложки, поварешки и скриптыПервый скрипт, который мы рассмотрим, будет собирать данные по барам, и составлять файл входных векторов. В качестве обучающего примера используем Машки. Листинг 2. Создание файла входных векторов // параметры входа #define NUM_BAR 10000 // число баров для обучения (число обучающих шаблонов) #define NUM_MA 5 // число скользящих #define DEPTH_MA 3 // число значений скользящей // создаем файл hFile = FileOpen(FileName, FILE_WRITE|FILE_CSV); FileSeek(hFile, 0, SEEK_END); // Составляем массив входов int i, ma, depth; double MaIn; for (i=NUM_BAR; i>0; i--) // проходим по барам и собираем значения веера МА { for (depth=0; depth<DEPTH_MA; depth++) //расчитываем скользящие средние for (ma=0; ma<NUM_MA; ma++) { MaIn=iMA(NULL, 0, 2+MathSqrt(ma*ma*ma)*3, 0, 1, 4, i+depth*depth)- ((High[i+depth*depth] + Low[i+depth*depth])/2); FileWriteDouble(hFile, MaIn); } } Файл данных создается как средство переноса информации между приложениями. На первых порах, когда вы только знакомитесь с алгоритмами обучения, вам обязательно нужно будет смотреть на промежуточные результаты их работы, данные некоторых переменных, или нужно быстро менять обучающие условия. Поэтому для начала мы рекомендуем использовать язык программирования высокого уровня (VB, VC++ и т.д.), так как пока средств отладки в MQL4 не хватает (надеюсь, что они появятся уже в пятой версии). В дальнейшем, когда вы уже будете знать все «подводные» камни ваших алгоритмов и функций, то можно будет перейти на MQL4. Тем более что конечную цель – индикатор или советник - в любом случае придется писать на нем.
Листинг 3. Класс нейросети class CNeuroNet : public CObject { public: int nCycle; // число циклов обучения до останова int nPattern; // число обучающих паттернов int nLayer; // число обучающих слоев double Delta; // требуемая минимальная ошибка выхода int nNeuron[iMaxLayer]; // число нейронов в слое (по слоям) int LayerType[iMaxLayer]; // типы слоев (по слоям) double W[iMaxLayer][iMaxNeuron][iMaxNeuron];// веса по слоям double dW[iMaxLayer][iMaxNeuron][iMaxNeuron];// коррекция веса double Thresh[iMaxLayer][iMaxNeuron]; // порог double dThresh[iMaxLayer][iMaxNeuron]; // коррекция порога double Out[iMaxLayer][iMaxNeuron]; // значение выхода double OutArr[iMaxNeuron]; // сортированные значения выхода слоя Кохонена int IndexWin[iMaxNeuron]; // сортированные индексы нейронов слоя Кохонена double Err[iMaxLayer][iMaxNeuron][iMaxNeuron];// ошибка double Speed; // Скорость обучения double Impuls; // Импульс обучения double in[100][iMaxPattern]; // Вектор входных значений double out[10][iMaxPattern]; // вектор выходных значяний double pout[10]; // предыдущий вектор выходных значяний double bar[4][iMaxPattern]; // бары, на которых учимся int TradePos; // направление ордера double ProfitPos; // полученная прибыль/убыток ордера public: CNeuroNet(); virtual ~CNeuroNet(); // функции void Init(int aPattern=1, int aLayer=1, int aCycle=10000, double aDelta=0.01, double aSpeed=0.1, double aImpuls=0.1); // функции обучения void CalculateLayer(); // Расчет выхода слоя void CalculateError(); // Расчет ошибки /для массива Target/ void ChangeWeight(); // Корректировка весов bool TrainNetwork(); // Обучение сети void CalculateLayer(int L); // Расчет выхода слоя Кохонена void CalculateError(int L); // Расчет ошибки слоя Кохонена void ChangeWeight(int L); // Корректировка весов для указания слоя bool TrainNetwork(int L); // Обучение слоя Кохонена bool TrainMPS(); // Обучение сети на получение наилучшего профита // переменные для обмена с внешним миром bool bInProc; // флаг входа в функцию TrainNetwork bool bStop; // флаг для принудительного прекращения функции TrainNetwork int loop; // номер текущей итерации int pat; // номер текущего обрабатываемого паттерна int iMaxErr; // паттерн с максимальной ошибкой double dMaxErr; // максимальная ошибка double sErr; // квадрат ошибки паттерна int iNeuron; // максимальное число нейронов при корректировке слоя Кохонена int iWinNeuron; // число нейронов победителей в слое Кохонена int WinNeuron[iMaxNeuron]; // массив активных нейронов (упорядоченный) int NeuroPat[iMaxPattern][iMaxNeuron]; // массив активных нейронов void LinearCovariation(); // Нормирование выборки void SaveW(); // Анализ нейронной активности };
Затем вызывается функция CNeuroNet::Init, в которой инициализируются веса, нормируется выборка и задаются параметры обучения (скорость, импульс, требуемая ошибка и число циклов обучения). И только потом вызывается «рабочая лошадка» - функция CNeuroNet::TrainNetwork (или TrainMPS, или TrainNetwork(int L), смотря что мы хотим получить). По окончанию обучения рабочий поток сохраняет веса сети в файл для воссоздания последней в индикаторе или советнике. III. Выпекаем сетьПерейдем теперь к вопросам обучения. Обычной практикой при обучении является задание пары «образец-учитель». То есть для каждого входящего образца соответствует вполне конкретная цель. И на основании отличия текущего выходного и целевого проходит корректировка весов. Например, исследователь хочет, чтоб сеть при предъявлении ей данных про цены закрытия 10 предыдущих баров предсказывала цену закрытия следующего бара. В таком случае мы должны после подачи на вход 10 значений сравнивать получаемый выход и учительское значение и затем откорректировать веса на разницу между ними. В предлагаемой нами модели выходных «учительских» векторов в обычном понимании не будет, так как мы заранее не знаем, на каких барах нам нужно входить или выходить из рынка. Это значит, что наша сеть будет корректировать свои выходные вектора на своих же предыдущих выходных показаниях. То есть сеть будет стремиться к получению максимального профита (максимизации числа верно угаданных направлений торговли). Рассмотрим пример на рисунке 8.
Рис. 8. Схема обучаемой нейросети
Допустим, что на некоторый входящий вектор Х1 сеть откликнулась выходом OUT1>0.5. Значит, на этом баре, к которому принадлежит образец, мы открываем позицию на покупку. Дальше, при хронологической подаче входных векторов на некотором Хk знак OUTk меняется на "противоположный". Следовательно, мы закрываем позицию покупки и открываем продажу. Именно в этот момент мы должны посмотреть на результат закрытого ордера. Если получили прибыль – то можем усилить этот сигнал. Или посчитать что, ошибки нет, и ничего корректировать не будем. Если же получили убыток, то корректируем веса слоев так, чтоб вход по сигналу вектора Х1 показывал OUT1<0.5.
Можно ограничить правила торговли, введя в процесс анализа сделок параметры тейкпрофита (ТП) и стоплоса (СЛ) в пунктах. Итого мы должны отслеживать 3 события: 1) смена знака OUT, 2) цена изменилась от цены открытия на величину ТП, 3) цена изменилась от цены открытия на величину -СЛ. То есть, система должна быть симметричной, чтоб при обучении не поймать отклонение в сторону более глобального тренда на покупку или продажу. Также бытует мнение делать тейкпрофит в 2-4 раза больше чем стоплос, искусственно повышая соотношение прибыльных и убыточных сделок. Но опять-таки при этом мы рискуем обучить сеть со сдвигом на тренд. Оба эти варианта, конечно, имеют право на жизнь, но вы в своих исследованиях должны проверять оба. Листинг 4. Одна итерация настройки весов сети int TradePos; int pat=0; // открываем ордер для первого шаблона for(i=0;i<nNeuron[0];i++) Out[0][i]=in[i][pat]; // взяли обучающий шаблон CalculateLayer(); // рассчитали выход сети TradePos=TradeDir(Out[nLayer-1][0]); // если выход больше 0.5, то покупка, иначе продажа ipat=pat; // запомнили шаблон for(pat=1;pat<nPattern;pat++) // проходим по шаблону и обучаем сеть { for(i=0;i<nNeuron[0];i++) Out[0][i]=in[i][pat]; // взяли обучающий шаблон CalculateLayer(); // рассчитали выход сети ProfitPos=1e4*TradePos*(bar[3][pat]-bar[3][ipat]); // считаем прибыль/убыток по ценам закрытия [3] // если поменялось направление торговли или сработал стоп-ордер if (TradeDir(Out[nLayer-1][0])!=TradePos || ProfitPos>=TP || ProfitPos<=-SL) { // корректируем веса Out[nLayer][0]=Sigmoid(0.1*TradePos*ProfitPos); // задали требуемы выход сети for(i=0;i<nNeuron[0];i++) Out[0][i]=in[i][ipat];// взяли шаблон, по которому // открывались CalculateLayer(); // рассчитали выход сети CalculateError(); // рассчитали ошибку ChangeWeight(); // подкоректировали веса for(i=0;i<nNeuron[0];i++) Out[0][i]=in[i][pat]; // переходим на новый ордер CalculateLayer(); // рассчитали новый выход сети TradePos=TradeDir(Out[nLayer-1][0]); // если выход больше 0.5, то покупка, //иначе продажа ipat=pat; // запомнили шаблон } } Такими несложными проходами сеть в результате распределит полученные классы от слоя Кохонена так, чтоб для каждого из них соответствовал сигнал входа в рынок с максимальным числом профитов. Или если смотреть с точки зрения статистики – каждый входной шаблон настраивается сетью на групповую работу. Так как один и тот же входной вектор может в процессе подстройки весов давать сигналы в разные стороны, постепенно получив максимальное число правильных угадываний, этот метод обучения можно назвать динамическим. А используемый подход – больше известный как Система Максимизации Прибыли (MPS). Вот результаты "подгонки" весов сети. Каждая точка на графике – это значение в пунктах полученной прибыль за один проход обучаемого периода. Система находится всегда в рынке, тейкпрофит=стоплос=50 пунктов, фиксация только по стоп-ордеру, корректировка весов в случае прибыли и убытка. Как видим, после отрицательного начала веса слоёв настраиваются так, что уже в районе сотой итерации прибыль становится положительной. Характерно также то, что система как бы притормаживается на некоторых уровнях. Это связано с параметрами скорости обучения.
Как вы могли заметить в листинге 2, прибыль ProfitPos считается по ценам закрытия бара, на котором вошли, и на котором сработало одно из условий (стоп-ордер или сменился сигнал). Это, конечно, немного грубоватый метод, особенно для случая со стоп-ордерами. Можно добавить некоторое усложнение, анализируя цены High и Low бара (bar[1][ipat] и bar[2][ipat] соответственно). Пусть это станет вашим домашним заданием. Переворачивать или искать входы? Делается это довольно просто. Введем переменную 0<М<0.5, которая будет критерием требуемого входа. Если Out>0.5+M, то покупка, если Out<0.5-M, то продажа. Мы отсеиваем входы и выходы от тех векторов, которые лежат между 0.5-M<Out<0.5+M. Другой способ отсеивания ненужных векторов – собрание статистической информации о прибыльности ордера от значений конкретных выходов сети, назовем его визуальный анализ. Перед этим мы должны определиться со способом закрытия позиции – срабатывания стоп-ордера, смена знака выхода сети. Далее составляем таблицу Out | ProfitPos. Значения Out и ProfitPos вычисляются для каждого входного вектора (т.е. для каждого бара). Затем делаем сводную таблицу с суммированием поля ProfitPos. В результате будем видеть зависимость значения Out и полученную прибыль. Выделяем диапазон Out=[MLo, MHi], на котором имеем наилучшую прибыль и используем его значения в торговле. Назад к MQL4 Тогда мы просто написали скрипт на MQL4, который сканирует html-страницу и выделяет из нее область, где находятся данные о предприятии, и загоняет в текстовый файл. Осталось только отредактировать файл в Excel и база данных трех крупных справочников со всеми телефонами, адресами, видами деятельностями готова. Знакомый получил самую полную базу в городе, а лично я – чувство гордости за простоту и возможности MQL4. Понятно то, что каждый человек может решать одну задачу в разных языках, но лучше выбирать тот, который будет оптимален по соотношению возможность/сложность для конкретной задачи. Итак, после тренировки сети мы должны сохранить все ее параметры в файл для передачи в MQL4.
Если мы уже определились с уровнями входа, то можно закрасить участки полученной кривой разными цветами. IV. Творческий подходЕсли делать хорошо, нужно мыслить широко. Нейросети не исключение. Не думаю, что предложенный вариант идеальный и подойдет для любой вашей задачи. Поэтому вы всегда должны искать свои решения, составлять общую картину, систематизировать и проверять идеи. Ниже содержится несколько предупреждений и советов.
Рис. 9. Результат "переобученной" сети - неправильное прогнозирование
Рис. 10. Зависимости характеристик входных векторов - обучение сети методом Больцмана. Это метод несколько похож на перебор всевозможных вариантов весов. В статье Как найти прибыльную торговую стратегию рассматривается советник ArtificialIntelligence, который в своем обучении работает по похожему принципу. При обучении своей сети он перебирает абсолютно все варианты значений весов (как взлом пароля к почтовому ящику) и выбирает самую лучшую комбинацию. Это трудоемкая задача для машины, поэтому число всех весов сети ограничено десятком. Например, если вес изменяется от 0 до 1 с шагом 0,01, то нам понадобиться 100 шагов. Для 5 весов это будет 5100 комбинаций. Согласитесь, это довольно большое число и современной машине это не под силу. Единственный способ построить таким методом сеть – это использовать очень много машин, давая каждой свой участок работы. Желающие вполне могут осуществить его с 10 машинами. Тогда на каждую придется всего по 510 комбинаций, а значит можно усложнить сеть, используя большее число весов, слоев и шагов. В отличие от такого «Brut Force Attack», метод Больцмана действует мягче и главное быстрее. На каждой итерации задается случайное смещение весу. Если с новым весом система улучшает свои выходные характеристики, то вес оставляется, и переходим на новую итерацию. Если вес увеличивает ошибку выхода, то он оставляется с вероятностью, определяемой по формуле распределения Больцмана. Таким образом, поначалу выход сети может иметь самые разные значения, постепенно «охлаждаясь» приводя сеть в искомый глобальный минимум [10, 11]. Конечно, это далеко не полный перечень направлений в ваших будущих исследованиях, есть еще генетические алгоритмы, методы ускорения сходимости, сети с памятью, радиальные сети, ассоциативные машины и много другое.
ЗаключениеХотелось бы добавить, что нейросеть - это не панацея от всех ваших проблем в трейдинге. Кто-то выбирает самостоятельную работу и создание своих алгоритмов, а для кого-то лучшим вариантом будет использование готовых нейропакетов, которых сейчас на рынке большое количество. Главное - не бойтесь экспериментировать! Удачи и больших профитов! Рынок – это интеллект, финансовый портфель - это нейронная сеть.
Рекомендуемая литература
Прикрепленные файлы:
Предупреждение:
все права на данные материалы
принадлежат MetaQuotes Software Corp. Полная или частичная перепечатка запрещена.
Owner писал(а):
Спасибо за оценку моих способностей разобраться в чужом коде. Вопрос не в этом, читайте внимательно текст поста. По поводу статьи, все намного проще, если заглянуть в код. У автора родилась идея автоматической кластеризации рыночных ситуаций на основе карт Кохонена. Логично, сначала определяем, категорию, затем отдаем результат на обученную backprop сеть, которая даст ответ, куда открываться. Однако в процессе разработки автор понял, что карты сами никаких полезных (с т.з. трейдера) кластеров не найдут, более того, на выходе карт получается вектор нулей и одна единица (некий класс) и из этих нулей и одной единицы сеть с обратным распространением ошибки вообще ничего не определит (чему обучать то, когда не понятно, что за класс?). Поэтому автор "упростил" и без того простой код, выбросив слой Кохонена, и выложил то, что осталось, сообществу, видимо, в надежде, что никто в этом копаться не будет. Статья получилась, безусловно, красивая :), но идея, к сожалению, тупиковая :(. Доброго времени суток! Люблю людей которые умеют читать! Первая статья, которую я прочитал про НС, была г-на Решетова, Combo - кстати своего рода бестселлер, почему? Простая линейная НС, несложный алгоритм, "маленькие доработки" и результат 65-75% выигрышных сделок МТС, с маленьким "но". Не более трех-четырех дней работы... далее опять настраивать НС. Именно с того момента начал изучать НС, в результате чего появилась моя первая Dll библиотека, нелинейной НС - персептрона. Особых выигрышей от этого я не получил, плюс 2-3% к выигрышу, и более 850 строк C++ кода, который надо было еще "дорабатывать лобзиком". Именно тогда понял, что строить самостоятельно свой код на С++: НС, генетический и прочие математические методы обработки временных рядов, дело скажем неблагодарное, легче взять готовое решение, тем более что продуктов математической обработки достаточно. А Вас лично не хотел обижать, и писав строки "...лет так через десять ты закочишь блуждать в чужом открытом коде..." хотел подчеркнуть, что лишь единицы легко налету читают С/С++, и обычно они тестируют Linux, на чем и зарабатывают не малые деньги. У scilab открытый код, выдергивай, но это не тот путь, которым следует идти, это трата Вашего бесценного времени на теоретическую часть модели МТС, а практической кто будет заниматься? Решать Вам. На счет статьи: красивая, хорошая и легкий язык. Чего не хватает? Для статьи достаточно, для книги мало индикаторов... любая НС требует много данных, такова её природа - великий аппроксиматор!
16.07.2009 14:51 nav_soft
Спасибо за оценку моих способностей разобраться в чужом коде. Вопрос не в этом, читайте внимательно текст поста. По поводу статьи, все намного проще, если заглянуть в код. У автора родилась идея автоматической кластеризации рыночных ситуаций на основе карт Кохонена. Логично, сначала определяем, категорию, затем отдаем результат на обученную backprop сеть, которая даст ответ, куда открываться. Однако в процессе разработки автор понял, что карты сами никаких полезных (с т.з. трейдера) кластеров не найдут, более того, на выходе карт получается вектор нулей и одна единица (некий класс) и из этих нулей и одной единицы сеть с обратным распространением ошибки вообще ничего не определит (чему обучать то, когда не понятно, что за класс?). Поэтому автор "упростил" и без того простой код, выбросив слой Кохонена, и выложил то, что осталось, сообществу, видимо, в надежде, что никто в этом копаться не будет. Статья получилась, безусловно, красивая :), но идея, к сожалению, тупиковая :(.
16.07.2009 01:07 Owner
Да уж, яйцеголовые зомби очень сильно озабочены, чтобы, не дай бог, ламеры не разбогатели на халяве. Меня после прочтения статьи заинтересовала именно реализация НС на серьезном уровне. Спасибо злобным фанам, подсказали где рыть:)) В матлабе есть все реализации. При желании, в сети можно найти открытый профессиональный плюсовый код НС (та же аннушка). Не могу найти только достойное сообщество, в котором можно пообщаться и обменяться идеями и реализациями. Может кто подскажет? :))
"профессиональный плюсовый код НС" искать не надо, как и многие другие математические функции, нужен код иди на www.scilab.org ... лет так через десять ты закочишь блуждать в чужом "открытом коде". Думаю автор статьи, просто хотел чтобы его поняли все, и упростил код для Вашего блага.
08.07.2009 23:54 nav_soft
Valio писал(а): Owner писал(а):
.... Исправил скрипт, добавил формирование файла. Далее запустил генератор весов, получил странную картинку:)) ..... Хотелось бы услышать автора, что он об этом думает. Вся эта эпопея со статьей - лишь импульс к саморазвитию, автор дал горизонт, указал правильные источники за что ему огромное спасибо - а дальше уже своим умом )) А то здешние яйцеголовые фаны и зомби от NS уже заели )) Сам си'-шый код - бутафория, муляж - вникать во все с первой строчки и переделывать, инд.прогресс обучения сети в т.ч. Если тренировку слоя BP можно довести до рабочего состояния, а слой SOM и сам диспатчер слоев - под нож.. _______________ PS: Не забывайте что иногда и уксус бывает сладким )) Да уж, яйцеголовые зомби очень сильно озабочены, чтобы, не дай бог, ламеры не разбогатели на халяве. Меня после прочтения статьи заинтересовала именно реализация НС на серьезном уровне. Спасибо злобным фанам, подсказали где рыть:)) В матлабе есть все реализации. При желании, в сети можно найти открытый профессиональный плюсовый код НС (та же аннушка). Не могу найти только достойное сообщество, в котором можно пообщаться и обменяться идеями и реализациями. Может кто подскажет? :))
01.07.2009 22:44 Owner
Valio писал(а): assol_7 писал(а): Блеф .. научить стейтменты проверять ? ))А вот форвард тест на другом инструменте, в некоторых источниках такой способ считается валидным, для оценки устойчиврсти, причем веса сети остались неизменными Вы меня конечно извините уважаемый но что собственно Вы заметили за ошибку в отчете!
22.04.2009 13:40 assol_7
assol_7 писал(а): Блеф .. научить стейтменты проверять ? ))А вот форвард тест на другом инструменте, в некоторых источниках такой способ считается валидным, для оценки устойчиврсти, причем веса сети остались неизменными
18.04.2009 02:26 Valio
А вот форвард тест на другом инструменте, в некоторых источниках такой способ считается валидным, для оценки устойчиврсти, причем веса сети остались неизменными Баров в истории 6973 Смоделировано тиков 12935 Качество моделирования n/a Ошибки рассогласования графиков 0 Начальный депозит 10000.00 Чистая прибыль 4949.59 Общая прибыль 8455.43 Общий убыток -3505.84 Прибыльность 2.41 Матожидание выигрыша 380.74 Абсолютная просадка 772.00 Максимальная просадка 2147.01 (13.23%) Относительная просадка 16.67% (2090.91) Всего сделок 13 Короткие позиции (% выигравших) 5 (60.00%) Длинные позиции (% выигравших) 8 (62.50%) Прибыльные сделки (% от всех) 8 (61.54%) Убыточные сделки (% от всех) 5 (38.46%) Самая большая прибыльная сделка 2464.62 убыточная сделка -925.76 Средняя прибыльная сделка 1056.93 убыточная сделка -701.17 Максимальное количество непрерывных выигрышей (прибыль) 4 (4627.08) непрерывных проигрышей (убыток) 2 (-1850.96) Максимальная непрерывная прибыль (число выигрышей) 4627.08 (4) непрерывный убыток (число проигрышей) -1850.96 (2) Средний непрерывный выигрыш 2 непрерывный проигрыш 2
17.04.2009 22:30 assol_7
Что интерено, не смотря на критические замечания, эта сеть может работать вот форвард тест с 2009.03.16 - 2009.04.17. Результаты: Баров в истории 7834 Смоделировано тиков 14662 Качество моделирования n/a Ошибки рассогласования графиков 0 Начальный депозит 10000.00 Чистая прибыль 3147.80 Общая прибыль 14935.40 Общий убыток -11787.60 Прибыльность 1.27 Матожидание выигрыша 95.39 Абсолютная просадка 1597.40 Максимальная просадка 4641.40 (35.58%) Относительная просадка 35.58% (4641.40) Всего сделок 33 Короткие позиции (% выигравших) 8 (50.00%) Длинные позиции (% выигравших) 25 (40.00%) Прибыльные сделки (% от всех) 14 (42.42%) Убыточные сделки (% от всех) 19 (57.58%) Самая большая прибыльная сделка 4690.20 убыточная сделка -878.30 Средняя прибыльная сделка 1066.81 убыточная сделка -620.40 Максимальное количество непрерывных выигрышей (прибыль) 2 (5310.00) непрерывных проигрышей (убыток) 5 (-2826.20) Максимальная непрерывная прибыль (число выигрышей) 5310.00 (2) непрерывный убыток (число проигрышей) -2826.20 (5) Средний непрерывный выигрыш 1 непрерывный проигрыш 2
17.04.2009 20:03 assol_7
Owner писал(а):
.... Исправил скрипт, добавил формирование файла. Далее запустил генератор весов, получил странную картинку:)) ..... Хотелось бы услышать автора, что он об этом думает. Вся эта эпопея со статьей - лишь импульс к саморазвитию, автор дал горизонт, указал правильные источники за что ему огромное спасибо - а дальше уже своим умом )) А то здешние яйцеголовые фаны и зомби от NS уже заели )) Сам си'-шый код - бутафория, муляж - вникать во все с первой строчки и переделывать, инд.прогресс обучения сети в т.ч. Если тренировку слоя BP можно довести до рабочего состояния, а слой SOM и сам диспатчер слоев - под нож.. _______________ PS: Не забывайте что иногда и уксус бывает сладким ))
04.04.2009 20:32 Valio
No_Name писал(а):
assol_7 писал(а): Это у Вас отчет тестирования на OOS (вне репрезентативной выборки) или на периоде обучения сети?Вот, по мотивам уважаемого Автора накрапал небольшой Грааль :)
Показатели модели open sell = 0.9 open buy = 0.03 sl = 85 Magic Number=999, f.(оптимальная фракция по Винсу)=0.42 G (средняя геометрическая сделка)= 1.0398 Midd =-822.97. Расчеты торговых параметров проводились методом Монте-Карло на основе моделей Пирсона. Математическая модель: General model -- F location-scale Ограничительные параметры для математического ожидания 165.4<165.8<166.2, ст. отклонения 665.7<665.9<666.3. Вычисления проводились для дополнительного знака в цене на счетах Альпари! Вероятность убытков в серии сделок: к.сделок вероятность 1.0000 0.4950 3.0000 0.3710 5.0000 0.3195 10.0000 0.2286 25.0000 0.1043 50.0000 0.0322, минимальный капитал для позиции в 0.01 лот составит 85(стоп в пунктах)*5*10(центов)*3=127.5 долл. MIDD может длиться 15 сделок с вероятностью 30%.
27.03.2009 13:16 assol_7
|