Имеется торговая система (реализованная на языке Java — алгоритм реализовывал по заказу фрилансер).
Эта система протестирована на исторических данных, которые берутся из моей внутренней БД PostgreSQL.
Вся эта кухня развернута на Линуксовом сервере.
Сейчас, необходимо оттестировать мою систему на реальных котировках по протоколу FIX, предоставляемому брокером Exante.
Каким то образом, система должна подхватывать поток котировок и тестировать правильность моих алгоритмов.
Насколько я понимаю, необходимо складировать поступаемые котировки во внутреннюю БД PostgreSQL и в дальнейшем, полученные данные подвергать анализу моей системой, которая реализована на Java.
В итоге, необходимо:
Развернуть движок типа quickfix engine, который потом позволит настроить протокол FIX для соединения с сервером брокера (в моем случае с Exante).
by Team_Spring.Finacier
Первый алгоритм вынашивался долго. Размышления на тему начались еще до того, как была собрана команда, которая может его реализовать.
Простой принцип: решили торговать спред между ближним фьючерсом на доллар и следующим фьючерсом на доллар.
Я бы сказал торговать DV01, или 3-х месячный FRA, или как кому еще угодно. Но эти термины я знаю только в связи со спецификой своей основной профессиональной деятельности. Обыватель и трейдер, торгующий на PA, назовет это просто «спред» и будет прав.
Графики mid’ов ближайшего и следующего фьючерсов на руб./долл., а также спреда между этими фьючерсами за 15.04.2016. Графики построены по принтам стаканов, сделанным ~5 раз в секунду.
Сам являюсь алготрейдером и регулярно задумываюсь о природе прибыли — рыночных неэффективностях. Для упрощения понимания явления и для упрощения передачи идеи другим людям, естественно, хочется найти какое ни будь похожее по сути явление из обычной жизни, чтобы можно было объяснять/анализировать на его примере.
Для себя нашел сходство модели лесного грибника с моделью алготрейдера, рыскающего по пространству рыночного шума в поисках на чем бы нажиться. Можно сказать, что неэффективность с точки зрения алготрейдера это некий прибыльный торговый алгоритм. Для грибника — это знание мест в лесу где обычно растут грибы. Грибник рыщет по лесу в поисках таких мест также как и алготрейдер рыщет по пространству алгоритмов.
Если грибник в поисках новых полян будет ходить по хоженым тропам (использовать широко разрекламированные подходы), то шансов найти хорошую поляну практически нет.
Если грибник нашел хорошее место и про него мало кто знает, то есть шанс длительное время с успехом ходить туда за грибами (предполагаем что вместо срезанных грибов постоянно растут новые). Если про поляну узнали многие и стали туда ходить, то шансов найти там грибы становится мало и затраты на посещение поляны начинают перевешивать результат посещения.
Копался в статьях по алготрейдингу, решил присмотреться в сторону машинного обучения. Но это в моем случае не про какой-то искусственный интеллект с нейросетями, в нейросети пока не хочу лезть, слишком сложно. Для начала хочу использовать простые алгоритмы для классификации и оценки хороших точек входа на основе обучения модели на истории.
Я исходил из того, как сам разрабатываю обычно торговую систему: ищу хорошие точки входа на истории и классифицирую их. Но так как человеческие возможности ограничены, использую только 3 таймфрейма и около 10 индикаторов в сумме. Кроме этого, история в точности никогда не повторяется и нужна какая-то более умная модель, которая не просто сравнивает индикаторы, как делают сейчас мои роботы, а дает оценку данной рыночной ситуации на основе всей совокупности индикаторов.
С помощью машинного обучения можно создать и обучить много моделей по разным алгоритмам, эта область уже хорошо развита (Logistic regression, Linear discriminate analysis, Stochastic gradient boosting, Decision trees, Support Vector Machine, KNN и другие). Можно быстро попробовать разные модели (Spot-checking algorithms). Модели могут работать вместе и делать предсказания. Можно улучшать точность моделей (Algorithm parameter tuning, Ensemble methods). Можно посчитать точность предсказаний по модели, обучив сначала модель на части выборки, а затем протестировав ее на другой части выборки (resampling).
Как я понял, R для машинного обучения идеально подходит. Сделал первые шаги сегодня: cоздал модель по туториалу, которая определяет по размеру чашелистиков и лепестков растения ирис точный вид (всего 4 вида) какого-то одного растения(особи) на основе обучения по выборке из 500 других растений(особей).
Код:
# Скачивание и инициализация библиотек mlbench(используется для machine learning), caret (используется для нормализации данных) install.packages("mlbench") library(mlbench) install.packages("caret") library(caret) # Краткая информация про базу данных iris data(iris) summary(iris) # Определение тренировочной выборки trainControl <- trainControl(method="cv", number=10) # Оценка точности алгоритма Naive Bayes на данном dataset fit <- train(Species~., data=iris, trControl=trainControl, method="nb") # Вывод оценки точности print(fit)
Сейчас я точно так же хочу сделать модель, которая на основе 30-300 хороших точек входа на истории определяет, насколько хороша данная пятиминутка для входа в лонг или шорт.
Что скажете? Есть ли там грааль? Есть ли у кого-то опыт использования машинного обучения для торговли? Что посоветуете?
Также представляю вашему вниманию грубую оценку того, на сколько в среднем ходят нефть Brent и Si за час и 1 день. Посчитал с использованием библиотеки rusquant на R. Также делюсь элементарным кодом.# Инициализация библиотеки rusquant (русская версия от quantmod, поддерживает все функции quantmod) library(rusquant) # Получение исторических данных с Финама getSymbols("SiM6", from=Sys.Date()-30, src="Finam", period="day") # Рисуем график, чтобы увидеть данные candleChart(SIM6) # Расчет доходностей встроенной функцией библиотеки rusquant (унаследована от quantmod) rr <- OpCl(SIM6) # Цены закрытия p <- Cl(SIM6) # Получение абсолютного значения среднеквадратичного отклонения доходности sd(rr)*mean(p) [1] 757.7013 # Аналогично для часовика getSymbols("SiM6", from=Sys.Date()-30, src="Finam", period="hour") candleChart(SIM6) rr <- OpCl(SIM6) p <- Cl(SIM6) sd(rr)*mean(p) [1] 234.9929 #Аналогично для BRK6.