sasha
sasha личный блог
09 августа 2014, 00:43

Робот с нейронной сетью на QLua

Многие слышали о том, что есть некие загадочные нейросети, которые могут успешно торговать на бирже. В этой статье я пролью немого света на этот вопрос. Мы создадим простейшего робота, который будет торговать на основе нейросетей.
Сначала расскажу о том, что же это такое нейронные сети и с чем их едят.  Для этого немного отвлечемся от темы биржи и глянем в сторону искусственного интеллекта.  Согласно википедии, «Искусственный интеллект (ИИ, англ. Artificial intelligence, AI) — наука и технология создания интеллектуальных машин, особенно интеллектуальных компьютерных программ. ИИ связан со сходной задачей использования компьютеров для понимания человеческого интеллекта, но не обязательно ограничивается биологически правдоподобными методами» (цитата:http://ru.wikipedia.org/wiki/%C8%F1%EA%F3%F1%F1%F2%E2%E5%ED%ED%FB%E9_%E8%ED%F2%E5%EB%EB%E5%EA%F2)
Другое ИИ определение звучит так: «это область исследований, направленная на создание компьютеров, которые будут выполнять такие функции, которые, в настоящее время, человек выполняет лучше» (Цитата: В. Н. Бондарев, Ф. Г. (2002). Искусственный интеллект. Севастопаль: СевНТУ.)

В общем, простыми словами можно сказать, что искусственный интеллект – это попытка создать компьютеры (компьютерные программы), которые бы мыслили как человек. Для чего это надо? Дело в том, что человеческий мозг многие задачи выполняет гораздо лучше компьютеров. Хотя уже сейчас созданы программы, которые с успехом выполняют некоторые из этих задач, например, распознавание звуков, графических образов, обработка абстрактных знаний. 
Теперь вернемся к бирже. Прочитав об искусственном интеллекте, вы наверняка подумали, что хорошо бы иметь такого робота, который бы торговал как профессиональный трейдер, постоянно подстраиваясь под быстро меняющийся рынок. Не секрет, что многие механические торговые системы могут прибыльно торговать только на каком-то одном временном периоде, а потом от них уже мало пользы. Иными словами, нам нужен механизм, который мог бы сам выдумывать торговые стратегии, находить закономерности и способный самообучаться. Такие системы сейчас разрабатываются, правда, не для биржи, а для других целей, и этим занимаются целые институты  с бюджетом в миллионы долларов. Но пусть вас это не пугает. В былые времена тоже только очень умные ученые добывали знания, которыми сейчас может воспользоваться любой школьник. Так что нам никто не мешает, используя известные методики создания искусственного интеллекта, написать что-то свое, простое.
Итак, возвращаемся к нейронным сетям. Пришло самое время приоткрыть завесу тайны и сказать, что же это такое. Нейрон – это нервная клетка, из которых состоит наш мозг, а так же другие органы нервной системы – спинной мозг, ганглии  (нервные узлы) и так далее. Каждый нейронсостоит из дендритов, сомы и аксонов:
 Робот с нейронной сетью на QLua
Дендриты — это ветвеобразные отростки, обеспечивающие сбор информации от других нейронов или рецепторов. Тело нервной клетки называется сома. В ней происходят сложные биохимические процессы, благодаря которым идут различные нелинейные преобразования сигналов. Аксон — это отросток нейрона, по которому выходной сигнал поступает на дендриты. Он разделяется на множество волокон. Место соединения аксонов с дендритом называется синапс.
В настоящее время созданы различные математические модели нейронов. Одна из них – это суммирование входных сигналов, помноженных на весовые коэффициенты. Выходной сигнал – это результат такого вычисления. Часто выходной сигнал преобразуется путем передаточной функции, самая простая из них – пороговая. Если результат превысил некий порог срабатывания, то на выходе 1, иначе 0. Совокупность таки моделей нейронов, называемых искусственными нейронами – это искусственная нейронная сеть (ИНС), или, иначе, нейросеть.
В настоящее время ИНС могут выполнять следующие задачи:
  • Компьютерное зрение (распознавание образов, в том числе и человеческих лиц, а так же дактилоскопия; распознавание текста).
  • Распознавание звуков.
  • Анализ числовых последовательностей, прогнозы.
  • Ассоциативная память.
  • Анализ данных, кластеризация (автоматическая классификация объектов по признакам).
Замечательная способность нейронных сетей состоит в том, что они способны обучаться. Суть обучения состоит в том, что весовые коэффициенты, на которые умножаются входные сигналы в процесса расчета, изменяются по определенному в процессе подачи на вход нейросети сигнала. Обучение бывает с учителем и без учителя. В первом случае после подачи входного сигнала значение на выходе сравнивается с желаемым и при необходимости корректируются весовые коэффициенты. При обучении без учителя нейросеть сама определяет закономерности во входных данных.
У нас будет нейросеть обучаться с учителем. Роль «учителя» будет выполнять изменения цены после совершения сделки. Если цена меняется в нашем направлении – все нормально. Если в противоположном – нейросеть надо учить. Входные данные – это котировки трех последних свечей (open, close, high, low). Таким образом, у нейросети всего 12 входов. Состоит наша нейросеть для простоты всего из одного нейрона (как правило, многослойные нейросети гораздо хуже обрабатывают биржевые котировки, проверил на собственном опыте).
Вот процедура обучения, написанная на qlua:

--обучение нейрона
--t — желаемая реакция нейрона, y — текущая реакция нейрона
function study(y)
      t=-y --желаемая реакция, она полностью противоположна текущей (вместо покупки надо продавать, вместо продажи покупать)
    dty=t-y;
      local N=getNumCandles(«Price»)
      local t,n,i=getCandlesByIndex(«Price», 0, N-4, 4)
      base_price=t[0].close
    for v=0,2,do
            neuron[v*4+1]=neuron[v*4+1]+mu*dty*t[v+1].open / base_price
            neuron[v*4+2]=neuron[v*4+2]+mu*dty*t[v+1].low / base_price
            neuron[v*4+3]=neuron[v*4+3]+mu*dty*t[v+1].high / base_price
            neuron[v*4+4]=neuron[v*4+4]+mu*dty*t[v+1].close / base_price    
      end
end
Наш нейрон – это просто массив коэффициентов. В начале работы программы он инициируется случайными числами:

function main()
      for v=1,12,do neuron[v]=math.random()-0.5 end --инициализируем веса нейрона
      while is_run do
            sleep(2000)
            robot()
      end
end
Выходные данные нашего нейрона 1 (если надо покупать) или -1, если надо продавать. Рассчитывает нейрон функция get_signal:

--Функция определяет сигнал путем расчета нейрона
--возвращает 1 если надо покупать и -1 если продавать
function get_signal()
      local N=getNumCandles(«Price»)
      t,n,i=getCandlesByIndex(«Price», 0, N-4, 4)
      res=0
      base_price=t[0].close
      for v=0,2,do
            res=res+neuron[v*4+1]*t[v+1].open / base_price
            res=res+neuron[v*4+2]*t[v+1].low / base_price
            res=res+neuron[v*4+3]*t[v+1].high / base_price
            res=res+neuron[v*4+4]*t[v+1].close / base_price
      end
      if res>=then
            return 1
      else
            return -1
      end
end
Все остальные блоки робота примерно такие же, как и в моих предыдущих статьях, описывать их не буду, полный текст робота см. приложение 1. Остановлюсь лишь подробно на параметрах:

--Параметры:
p_classcode=«TQBR» --Код класса
p_seccode=«LKOH» --Код инструмента
p_account=«L01-00000F00» --Код счета
p_clientcode=«52134» --Клиенткий код
p_firmid=«MC0058900000»  --код фирмы
p_count=2 --Размер позиции
p_spread=3 --Проскальзывание
mu=0.1 --коэффициент обучения
p_study_level=1; --Уровень изменения цен, при котором происходит обучение нейрона
p_file = io.open(«D:\\1\\userlog.txt», «w»)  — тут надо указать путь к файлу лога
Параметры p_classcode, p_seccode, p_account, p_clientcode, p_firmid – это настройик выбранного финансового инструмента и брокерского счета. p_count – количество лот, которыми торгуем. p_spread – размер проскальзывания, mu – коэффициент обучения,  им мы регулируем скорость обучения. Сделаем коэффициенты больше – робот будет обучаться быстрее, но тогда мы рискуем «перелететь» момент максимального обучения и переучить нейросеть. p_study_level – уровень изменения (в валюте инструмента) цен, при котором вызывается процедура обучения, если цена пошла не в ту сторону. p_file – имя файла лога, в который будет писаться протокол работы робота, в том числе и изменение коэффициентов.
На этом все, удачной торговли.  robostroy.ru/community/article.aspx?id=769
24 Комментария
  • Lika
    09 августа 2014, 01:14
    Саша, ты сам то хоть шаришь в нейросетях?
      • Lika
        09 августа 2014, 01:38
        sasha, молодец) А программирование изучаешь?
    • Lika
      09 августа 2014, 02:45
      sasha, да ни как. Я еще не торгую на фортсе, но скоро буду. А единственный депозит на форексе — 100 баксов я слила))
      За счет ММ — эти типа всякие усреднялки — сеточники и мартингейлы?
  • Lika
    09 августа 2014, 03:09
    Ясно, но ты не ответил про мартингейл и усреднялки.
    Можно я тебя добавлю в свой список мяса? )
    • Lika
      09 августа 2014, 05:11
      sasha, да это шутка)))
  • ves2010
    09 августа 2014, 06:56
    эх… еслиб так все просто было…
    • Чеширский кот
      09 августа 2014, 08:20
      ves2010, дык интереснож человеку, а больше для движения вперёд ничего не нужно. главное — интерес :)
  • Andrey Khvatov
    09 августа 2014, 08:56
    дней пять назад я эту статью видел в инете.
  • HPotter
    09 августа 2014, 15:06
    Интересная тема, что то подобное уже реализованно для RI и SI, пока в тестовом режиме доступно на www.managerhf.com/beta
  • ELab
    17 августа 2014, 14:55
    Нейронные сети давно себя показали — к чему по 1000 раз возвращаться к этому? Я эту тему более 10 лет назад закрыл…
  • $OFF
    15 ноября 2014, 20:02
    «Цитата: В. Н. Бондарев, Ф. Г. (2002). Искусственный интеллект. Севастопаль: СевНТУ.»

    круто. я у него учился в универе :)

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн