OceanX | Дата: Среда, 23.02.2011, 12:04 | Сообщение # 1 |
Подполковник
Группа: Администраторы
Сообщений: 108
Статус: Offline
| Часто пишут и задают вопросы по нейронным сетям на почту - буду выкладывать здесь.
http://www.shumisport.ru - сайт спортивной статистики http://finstat.bozo.ru - сайт макроэкономики
|
|
| |
OceanX | Дата: Четверг, 24.02.2011, 08:22 | Сообщение # 2 |
Подполковник
Группа: Администраторы
Сообщений: 108
Статус: Offline
| Для фондового рынка действительно необходимо использовать разные индексы типа РТС, SnP и т.д. А вот сглаживание техническими индикаторами - здесь надо думать и крутить. С одной стороны часто считается, что временной ряд содержит всю необходимую информацию и шума на нем нет, то есть сглаживать не надо. С другой стороны - а как же без шума?:) И еще одна задача наклевывается - если использовать индикаторы на входе, то на выходе должны быть сигналы на покупку и продажу, согласно этим индикаторам. Что-то в этом духе... 1. только лишь изменений ценового бара недостаточно для прогноза. Необходимо учитывать ценовой тренд, динамику волатильности, динамику объемов и открытого интереса, плотность и эффективность ликвидности, близость локальных максимумов и минимумов. 2. имхо правильнее строить две отдельных сети. Одна для прогнозирования знака цены, другая для прогнозирования ценового диапазона. И еще одна для прогнозирования "теней", для постановки стоп-лоссов в реальной торговле.
http://www.shumisport.ru - сайт спортивной статистики http://finstat.bozo.ru - сайт макроэкономики
|
|
| |
OceanX | Дата: Четверг, 24.02.2011, 08:25 | Сообщение # 3 |
Подполковник
Группа: Администраторы
Сообщений: 108
Статус: Offline
| Обучение сети в Экселе: Здесь необходимо заходить в макросы Экселя и смотреть Module1. А. Обучение: в функции Backpropogation() зашит алгоритм обратного распространения ошибки - не самый быстрый, но самый надежный способ обучения нейросети. Обучение происходит следующим образом: 1. Большой цикл "For I = 0 To MaxStep Step 1" и далее, - это итерации обучения, MaxStep - ограничитель количества итераций обучения - нейросеть ведь может не обучиться и гонять процесс до бесконечности 2. Подсчет ошибки "If CountError() < Error Then" - если ошибка обучения нейросети меньше заданной, то прекращаем обучение и выходим, при этом выводим результаты в лист "0" функцией "PlotSuccessResult()" 3. Если ошибка больше заданной, то идет процесс обучения "For j = 0 To GNeuro(num_layers) - 1 Step 1" - цикл по нейронам последнего слоя - считаем GError и GDelta, то есть ошибку и дельту на которую надо изменить "For j = 0 To GNeuro(num_layers) - 1 Step 1 For Z = 0 To GNeuro(num_layers - 1) - 1 Step 1" - изменение весов последнего слоя и далее по всем слоям - от последнего к первому. По сути - подсчет разницы и перемножение векторов на матрицы Б. Посчет ошибки к функции CountError() Здесь по сути два варианта подсчета ошибки - если есть валидационная выборка, то подсчет ошибки ведем по ней. Если нет валидационной выборки, то подсчет по всем примерам на которых обучаемся. Валидационная выборка - это те примеры, которые нейросеть не видит во время обучения. То есть по ней мы проверяем - уловила ли нейросеть задачу или нет. Валидационная выборка задается в функции SetParams() - переменные start_valid_pos и end_valid_pos, learning_number_example - это количество примеров для обучения (эти переменные - номера строчек в листе "0"). В данный момент сделано следующим образом - т к нейросеть затачивалась под котировки, то есть под столбцы с ценами Open[], Low[], High[], Close[] - в вверху листа самые последние котировки, то есть время убывает сверху вниз, но в принципе этими переменными можно рулить и остальные варианты. В. Сам процесс прогнозирования Процесс прогнозирования реализован следующим образом - в функции SetIO(num) устанавливаются значения входов нейросети в массив (точнее в вектор) GInputs и выходов в GOutputs . При этом используется относительное изменение между моментами времени num и (num-1) - так меньше ошибка выходит. Разберем строку установки входов: "(Cells(num - 1, GOutputs(I)).Value - Cells(num - 2, GOutputs(I)).Value)/MaxValue" Из значения ячейки с координатами строка/столбец (num-q)/номер_входного_столбца_листа_0 отнимается значение из того же столбца, но на строчку ниже. В терминах финансовых временных рядов, допустим High[i] - High[i-1], то есть относительное приращение - еще же делим на MaxValue - то есть масштабируем в единичный интервал, т к рабочая область тангенсоиды - функции активации нейрона от -1 до 1. MaxValue - это максимальное значение в столбце. Выходы - аналогично. Здесь главный момент - мы подаем на входы нейросети изменение за одну временную итерацию, то есть только значения изменения между num - (num-1). Но этих данных нейросети может не хватить, и нужно будет подавать "скользящее окно" - см. http://apsheronsk.bozo.ru/Neural/Lec9.htm Это в принципе не трудно переделать. Далее, нейросети, после того как обучилась, необходимо подать пример, пусть под номером К, посчитать функцией Calc(K), выход будет в векторе GOutputs(), его необходимо умножить на MaxValue, так как мы масштабировали и к этому числу прибавить значение в ячейке Cells(К, номер_столбца_выхода).Value. То есть нейросеть считает приращение от примера К и к нему добавлем откуда считается приращение.
http://www.shumisport.ru - сайт спортивной статистики http://finstat.bozo.ru - сайт макроэкономики
|
|
| |
OceanX | Дата: Четверг, 12.05.2011, 08:10 | Сообщение # 4 |
Подполковник
Группа: Администраторы
Сообщений: 108
Статус: Offline
| Собственно комментарии к коду на странице: http://apsheronsk.bozo.ru/Neural/NN.htm
http://www.shumisport.ru - сайт спортивной статистики http://finstat.bozo.ru - сайт макроэкономики
|
|
| |