Многие слышали о том, что есть некие загадочные нейросети, которые могут успешно торговать на бирже. В этой статье я пролью немого света на этот вопрос. Мы создадим простейшего робота, который будет торговать на основе нейросетей.
Сначала расскажу о том, что же это такое нейронные сети и с чем их едят. Для этого немного отвлечемся от темы биржи и глянем в сторону искусственного интеллекта. Согласно википедии, «
Искусственный интеллект (ИИ, англ. 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). Искусственный интеллект. Севастопаль: СевНТУ.)
В общем, простыми словами можно сказать, что искусственный интеллект – это попытка создать компьютеры (компьютерные программы), которые бы мыслили как человек. Для чего это надо? Дело в том, что человеческий мозг многие задачи выполняет гораздо лучше компьютеров. Хотя уже сейчас созданы программы, которые с успехом выполняют некоторые из этих задач, например, распознавание звуков, графических образов, обработка абстрактных знаний.
Теперь вернемся к бирже. Прочитав об искусственном интеллекте, вы наверняка подумали, что хорошо бы иметь такого робота, который бы торговал как профессиональный трейдер, постоянно подстраиваясь под быстро меняющийся рынок. Не секрет, что многие механические торговые системы могут прибыльно торговать только на каком-то одном временном периоде, а потом от них уже мало пользы. Иными словами, нам нужен механизм, который мог бы сам выдумывать торговые стратегии, находить закономерности и способный самообучаться. Такие системы сейчас разрабатываются, правда, не для биржи, а для других целей, и этим занимаются целые институты с бюджетом в миллионы долларов. Но пусть вас это не пугает. В былые времена тоже только очень умные ученые добывали знания, которыми сейчас может воспользоваться любой школьник. Так что нам никто не мешает, используя известные методики создания искусственного интеллекта, написать что-то свое, простое.
Итак, возвращаемся к нейронным сетям. Пришло самое время приоткрыть завесу тайны и сказать, что же это такое. Нейрон – это нервная клетка, из которых состоит наш мозг, а так же другие органы нервной системы – спинной мозг, ганглии (нервные узлы) и так далее. Каждый
нейронсостоит из дендритов, сомы и аксонов:
Дендриты — это ветвеобразные отростки, обеспечивающие сбор информации от других нейронов или рецепторов. Тело нервной клетки называется
сома. В ней происходят сложные биохимические процессы, благодаря которым идут различные нелинейные преобразования сигналов.
Аксон — это отросток нейрона, по которому выходной сигнал поступает на дендриты. Он разделяется на множество волокон. Место соединения аксонов с дендритом называется
синапс.
В настоящее время созданы различные математические модели нейронов. Одна из них – это суммирование входных сигналов, помноженных на весовые коэффициенты. Выходной сигнал – это результат такого вычисления. Часто выходной сигнал преобразуется путем передаточной функции, самая простая из них – пороговая. Если результат превысил некий порог срабатывания, то на выходе 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,1 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,1 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,1 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>=0 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
За счет ММ — эти типа всякие усреднялки — сеточники и мартингейлы?
Можно я тебя добавлю в свой список мяса? )
круто. я у него учился в универе :)