Закончилась эпопея с защитой очередной диссертации, в связи с чем появилось время на развитие проекта T-Engine. Plaza2-вариант привода хоть и завершен, однако ввиду отсутствия возможности протестировать его в боевых условиях в массы он не пошел, и видимо не пойдет, так как платить свои деньги за возможность тестирования у меня желания нет ввиду весьма сомнительных коммерческих перспектив приводов как таковых.
Давно был озадачен вопросом создания торгового робота для FORTS, работающего через QUIK, и собственно привод был только первым этапом реализации робота. Вообще, ручная торговля меня не прельщает ввиду ряда факторов, поэтому я поставил себе задачу сделать собственного торгового робота.
Алгоритмическая торговля понимает под собой использование инструментов технического анализа – MA различных типов, индикаторов, осцилляторов и прочих прелестей, широко описанных в общедоступной литературе по данной тематике. У меня же возникла идея воспользоваться искусственным интеллектом – нейронными сетями для построения собственной оригинальной торговой системы. В чем преимущества торговых алгоритмов на нейронных сетях? На мой взгляд, это:
- недоступность широким массам;
- способность обобщать и классифицировать некие паттерны с достаточной устойчивостью к изменениям рынка;
- не HFT, возможность торговать на среднее депо.
Основное требование к алгоритму – низкий риск. Пытаться предсказать направленное движение, открыть позицию, установить короткий стоп, профит, стоп трейлить при нужном движении рынка.
Таймфрейм я выбрал 5 минут. Для разработки робота использовал платформу привода T-Engine, библиотеку NeuronDotNet (сети с обратным распространением ошибки “backpropagation”) с доработанным алгоритмом обучения нейросетей.
Идея при обучении – подавать на вход данные N свечей и анализировать движения цены на свече N+1. Естественно, используется куча алгоритмов предобработки данных. Например, для понижения размерности входов использую вейвлет преобразование – это позволяет сократить число входов нейросети в 2 раза без потери качества входных данных. Нейросеть использую с 1 скрытым слоем, функция активации скрытого и выходного слоев – сигмоидальная (sigmoid), входного – линейная (linear).
Данные для обучения скачивал с сайта finam. Далее данные разбивались на две выборки – на обучающую и верификационную. Первая выборка используется непосредственно для обучения, вторая используется для отбраковки обученных нейросетей.
Что получилось для неизвестных нейросети дней (показан фрагмент ~ 2.5 дня):
Показано на графике: синим – как двигался рынок на самом деле (зона 0.9-1.0 – хорошее движение вверх, зона 0.1-0.0 – зона хорошего движения вниз, остальное не сильно интересует), красным – прогнозы нейросети. Если интерпретировать сигналы >0.6 как открытие в лонг, а меньше 0.4 как открытие в шорт, то чисто теоретически ситуация весьма привлекательная.
По наблюдениям, сигналы близки к “пробойной” тактике торговли. С другой стороны, данный эксперимент подтверждает, что между прошлыми ценами и будущими есть взаимосвязь, а наличие неверных сигналов – свидетельство недостаточной фильтрации входных данных.
Реализован следующий механизм:
- При наличии сигнала на открытие позиции в стакан выставляется соответствующая лимитная заявка. Запускается таймер на отслеживание исполнения. Если заявка не исполняется в течение минуты – она снимается.
- При открытии позиции ставится стоповый ордер и виртуальный тейк-профит, исполняемый по рынку при достижении заданного значения прибыли.
- Стоповый ордер трейлится.
- Через вечерний клиринг и овернайт позиция не переносится, а закрывается по рынку независимо от результата.
Язык разработки – C#. Платформа – NET 2.0.
03 мая 2012 года робот ставится на боевые торги 1 контрактом с депо около 14тр, в случае положительных результатов депо будет пополнятся, а сайз увеличиваться.
Постараюсь периодически публиковать результаты торговли робота, а также мысли по его доработке.
Первая сделка:
закрылась по трейлингу, результат +90п.
с этой бедой как боролся?
а как быть с отставанием системы от «характерности» рынка «сейчас»? или она работает на типичных, характерных для любого участка образах?
мне тема интересна, поэтому столько вопросов задаю
с весами и генетикой — у всех проблемы, насколько мне известно.
а есть ли такая функция вообще? Если нет — деятельность обессмыслена в той постановке о которой идет речь.
Вейвлеты это семейство ортогональных функций, по сути линейное преобразование, то есть хитрый стационарный фильтр. То что над ними навесили «нейронку», вряд ли поможет, уйти хотя бы от стационарности. Ставлю на то что робот в нуле будет барахтаться, или работать не лучше чем простейшая система из пары скользящих средних, как это не печально.
А вы не пробовали прогнать уже робота самого на всей истории, где сеть обучалась+проверялась+осаток. Мне кажется именно это будет реальным критерием качества сети в данном случае. Может быть зависимости какие интересные всплывут.
А так круто! Пишите исчо!
А есть ли результаты работы стратегии на исторических данных? Года три-четыре?