"Новый нейронный" - проект Open Source движка нейронной сети для платформы MetaTrader 5. - страница 46

 
maxfade:

сразу вспомнился бородатый анекдот

сомневаюсь насчет "нулей" в момент рождения, кроме того считаю что ошибки-отклонения присутсвуют постоянно
Кстати да, ребёнок рождается как минимум с хватательным и глотательным рефлексом, а это тоже работа мозга. Так что у него не нулевой мозг, тем более что его обучение начинается задолго до его рождения. Дургое дело что загрузка весов новорожденного скорее дело эволюции чем обучения.
 

Переделал так что при создании объекта через конструктор с параметрами, в конце последовательности будет инициализироваться новая.

работать будет чуть медленее, зато постоянно уникальная последовательность.

При создании через через стандартный конструктор, нужно ещё вызвать Srand() и последовательность будет таже, крутиться по кругу.

  uint st=GetTickCount();
  CRandm *rnd=new CRandm((uint)TimeLocal(),10000);// длинна последовательности
  for(int i=0;i<1000000;i++)// количество вызовов
    {
     rnd.Rand();
    } 
  delete rnd;   
  Print("time=",GetTickCount()-st);
Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
  • www.mql5.com
Основы языка / Операторы / Оператор создания объекта new - Документация по MQL5
Файлы:
Randm.mqh  5 kb
 

Предлагаю рассмотреть библу виртуальных ордеров (эмулируется открытие/закрытие по рынку. команды почти такие же, как при реальной работе с ордерами).

Она пригодится, когда потребуется прогонять модель по историческим данным (вне тестера стратегий).

Чего забыл? Чего можно улучшить, добавить, изменить, доработать? - библа очень сырая.

Пока реализованы только операции типов buy-0 и sell-1.

Файлы:
C_Orders.mqh  15 kb
 

Лекция 1 здесь https://www.mql5.com/ru/forum/4956/page23

Лекция 2 здесь https://www.mql5.com/ru/forum/4956/page34

Лекция 3 здесь https://www.mql5.com/ru/forum/4956/page36

Лекция 4. Применение организации зрительной коры мозга для преобразования временных рядов

Итак, наша задача это построить классифицирующую нейронную сеть для ценовых паттернов по принципу работы мозга. Эту сеть можно разделить на два модуля: модуль преобразования входной информации (цен) и классифицирующий модуль, который может быть построен по любому известному принципу (например, Support Vector Machine):

В предыдущей лекции я описал модель HMAX зрительной коры мозга как пример биологического преобразования информации. Большим недостатком этой модели является то что значения весов (рецептивыные поля) в ней не обучаются а просто взяты из биологических измерений нейронов мозга. Например, измерение рецептивных полей простых нейронов в V1 (S1) производится как показано на видео здесь https://www.youtube.com/watch?v=Cw5PKV9Rj3o (щелчки которые вы слышите это импульсы нейрона). В нашем случае временного ряда котировок, "рецептивные поля" нейронов преобразующих информацию заранее неизвестны. Поэтому нам нужно их самим найти. Например, первый слой преобразования цен (S1 слой) можно построить следующим образом, по аналогии с S1 слоем зрительной коры:

В данном примере, в нашем S1 слое 6 подслоёв, пронумерованных 0-5. Нейроны (кружки) одного и того же подслоя имеют одинаковые входные веса (рецептивные поля), условно показанные в прямоугольниках слева. Каждый подслой нейронов имеет своё собственное рецептивное поле. Мы заранее знаем что если существует подслой с рецептивым полем w_0,k где k=0..5 (направление "вверх"), то должен существовать подслой с рецептивным полем -w_0,k (направление "вниз"). Пусть слоя с положительным полем пронумерованы чёткими числами (0, 2, 4) и их отрицательные аналоги пронумерованы нечёткими цифрами (1, 3, 5). Кроме того, мы знаем что S1 подслоя должны иметь рецептивные поля разных размеров. Пусть размер поля увеличивается от подслоя 0 (и его отрицательного аналога 1) к подслою 4 (и его отрицательного аналога 5). На входы всех нейронов одной и той же колонки подяются одни и теже цены (например, на входы нейронов первой колонки подяются цены x_0...x_5). На входы нейронов следующей колонки подяются цены сдвинутые на 1 бар (x_1...x_6), и т.д. Итак, наш S1 слой состоит из нейронов с рецептивными полями разных направлений (вверх, вниз), размеров, и положений по времени.

Обучение входных весов нейронов слоя S1 производится только для одной колонки нейронов из разных подслоёв, причём не важно какой. Потом все веса копираются для оставшихся нейронов в каждом подлсою. Обучение происходит без учителя путём подачи разных ценовых паттернов на входы S1 слоя и изменения весов по какому-то правилу. Существует множество правил правил само-обучения весов нейронов, хорошо описанных здесь:

Miller, K. D., and MacKay, D. J. C. (1994). The role of constraints in Hebbian learning. Neural Computat., 6, 100-126.

Первое правило само-обучения нейронов было постулировано Хеббом в 1949 году (https://en.wikipedia.org/wiki/Hebbian_theory). Это правило гласит: "Если нейрон получает входной сигнал от другого нейрона и оба являются высоко активными, то вес между нейронами должен быть усилен". Математически, оно записывается так

dw_i = mu*x_i*y,

где dw_i - приращение веса w_i, x_i - значение на i-м входе, y - выход нейрона, mu - скорость обучения. Мы будем использовать правило Оджи (Oja rule, https://en.wikipedia.org/wiki/Oja's_rule), которое относится к классу competitive learning rules:

dw_i = mu*y*(x_i - y*w_i/a),

где dw_i - приращение веса w_i,  x_i - цена на i-м входе, y - выход нейрона расчитываемый как y = SUM(w_i*x_i, i=0..m-1), mu - скорость обучения, а - параметер (сумма квадратов весов SUM(w_i^2,i=0..m-1) стремится к a). Преимуществом этого правила является то что оно автоматически находит веса как принципиальные собственные вектора ценовых котировок. То есть, правило Оджи воспроизводит Метод Главных Компонент (PCA). Это совпадает с биологическими предпосылками, согласно которым рецептивые поля S1 слоя зрительной коры представляют собой принципиальные собственные вектора  зрительной информации. Прикреплённый C++ код автоматически обучает веса 32-х S1 подслоёв с EURUSD M5 котировками на входе, mu=1, a=1. Эти веса как функции входа показаны внизу

 

Веса первых двух подслоёв (0 и 1) показаны красным цветом. У них только два ненулевых значения: -0.707 и +0.707. Веса подслоёв 2 и 3 показаны оранжевым цветом. У них 4 ненулевых значения. И т.д.

Для пользования прикреплённым кодом, нужно установить библиотеки Boost и CImg http://cimg.sourceforge.net/. До более высоких слоёв (C1, S2, C2) я пока не дашёл и скорей всего долго не дойду. Те кто читал мои предыдущие лекции должен понять принцип работы всех слоёв HMAX и закончить модуль преобразования ценовых котировок. В следующей (последней) лекции я поговорю о SparseNets.

Файлы:
BrainPower.zip  907 kb
 
joo:

Предлагаю рассмотреть библу виртуальных ордеров (эмулируется открытие/закрытие по рынку. команды почти такие же, как при реальной работе с ордерами).

Она пригодится, когда потребуется прогонять модель по историческим данным (вне тестера стратегий).

Чего забыл? Чего можно улучшить, добавить, изменить, доработать? - библа очень сырая.

Пока реализованы только операции типов buy-0 и sell-1.

Спасибо за библиотеку. Можно краткую инструкцию как ней пользоваться?
 
Graff:
Спасибо за библиотеку. Можно краткую инструкцию как ней пользоваться?

Собственно, и нечего особо рассказывать.

Перед каждым прогоном по истории, что бы очистилась история ордеров, нужно вызвать:

void Initialise(int MaxPossibleCountOrd, double Spread, double Point_);

а далее, в соответствии с торговой стратегией, вызывать нужные команды:

int    OrderOpen        (int Type, double Volume, int Time,double Price,double SL, double TP);
void   Possible_SL_or_TP(int Time, double PriceHigh,double PriceLow);
void   OrderClose       (int Ticket, int Time,double Price);
void   OrderCloseAll    (int Time, double   Price);
int    ProfitTradeCount ();
int    TotalPipsProfit  ();
int    LossSeriesCount  ();
int    ProfitSeriesCount();

Спред фиксированный, задается при инициализации. Для плавающего спреда придётся добавлять соответствующий функционал. По мне, так он нафиг не нужен - просто задавать максимально возможный спред по инструменту и все дела.

 
joo:

Собственно, и нечего особо рассказывать.

Перед каждым прогоном по истории, что бы очистилась история ордеров, нужно вызвать:

а далее, в соответствии с торговой стратегией, вызывать нужные команды:

Спред фиксированный, задается при инициализации. Для плавающего спреда придётся добавлять соответствующий функционал. По мне, так он нафиг не нужен - просто задавать максимально возможный спред по инструменту и все дела.

Спасибо, вечером попробую. Аналог для МТ4 https://www.mql5.com/ru/forum/124013 может чем-то поможет.
Простая идея мультивалютного тестера с примером реализации - MQL4 форум
  • www.mql5.com
Простая идея мультивалютного тестера с примером реализации - MQL4 форум
 

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

И хотя желание поучаствовать огромное, у меня тупо не хватает времени и сил, что очень жаль.

Смогу присоединиться после сдачи экзаменов (середина декабря). Кстати один из курсов напрямую связан с нейросетями.

 

Кстати. А целевых функций то две. Для логистической регрессии и простой регрессии.

Классификация один из случаев логистической регрессии.

Целевая функция для логистической регрессии:

И для обычной:

правда производные у них похожи. Может поэтому про разграничение обычно умалчивают.

Первая используется при выходном сигмоидном слое в задачах классификации.

Вторая при выходном линейном в задачах прогнозирования.

 
TheXpert:

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

И хотя желание поучаствовать огромное, у меня тупо не хватает времени и сил, что очень жаль.

Смогу присоединиться после сдачи экзаменов (середина декабря). Кстати один из курсов напрямую связан с нейросетями.

Расползаетесь по углам товарищи. Никарашо. 
Причина обращения: