Копался в статьях по алготрейдингу, решил присмотреться в сторону машинного обучения. Но это в моем случае не про какой-то искусственный интеллект с нейросетями, в нейросети пока не хочу лезть, слишком сложно. Для начала хочу использовать простые алгоритмы для классификации и оценки хороших точек входа на основе обучения модели на истории.
Я исходил из того, как сам разрабатываю обычно торговую систему: ищу хорошие точки входа на истории и классифицирую их. Но так как человеческие возможности ограничены, использую только 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.
это весь алгоритм? Вы что шутите, или издеваетесь?:)
Как обстоит дело в случае с этими измученными исследователями ирисками? Они весьма неплохо разделяются линейными границами — многомерными плоскостями, ну т.е. это шикарная задача, в которой решение имеется… грубо говоря, 80% ирисок из каждого класса достаточно компактны и не пересекаются с другими классами. Дальше вопрос — как найти эту границу? Можно написать уравнение разделяющей плоскости аля LDA и потом решить систему уравнений — получите результат. Можно сделать случайный поиск коэффициентов разделяющей плоскости — опять получится результат. Можно науськать обычный перцепртрон… он сделает то же самое… Потому что решение имеется. Иными словами, конкретные методы машинного обучения в данном случае являются не методом решения исходной задачи, а лишь средством её решения.
Что в случае с ценовыми последовательностями? Кому удавалось видеть, чтобы общий набор почти случайных баров за счет какого-то преобразования давал условное и безусловное распределения, в которых мы бы видели, чтобы разделялись плохие и хорошие или покупки и продажи хотя бы в пропорции 60 на 40%? Кстати, в HFT обычно граали начинаются от пропорции 45 на 55 — этого достаточно уже.
Поэтому, когда вы примените к некоторой смеси объектов (построенных на цене) машинное обучение, то при должной сложности средств этого обучения, вы легко найдете разделяющие границы в рамках этой смеси. Но будет ли смысл в этом разделении? Эта беда именуется переобучением, а по факту к обучению она отношения не имеет… ибо чему тут учится система? Ну она просто запоминает индивидуально ситуации, т.е. локализует каждый объект в пространстве поиска.
А как отличить на этой стадии переобучение от не-переобучения? Реальный критерий один — если по этому удается зарабатывать на реальном счете.
Иными словами, собираясь применять средства машинного обучения, вы должны уже заранее знать, какое решение вы ищите и чему обучаете свою систему. Т.е. опять же сперва вы должны поставить осмысленную задачу, в которой логически есть решение.
Применение машинного обучения снизу-вверх — удел совсем романтичных романтиков:)
Про хаос вопрос не понял. Что там за хаос. Всегда решение ищется на ограниченном объеме входных данный и форма решения тоже ограничивается. Если пространство решений будет бесконечно, то вероятность получить переобучение стремится к 1.
Грааля нету.
А мораль проста -
Нельзя просто так взять и обучить машину делать то, чего сам делать не умеешь.
Python для этой цели интереснее.
Но на деле использую нормально компилируемый язык ;)