Блог им. SciFi

Мои шаги в сторону машинного обучения на R и немного про Si, Brent

    • 15 апреля 2016, 21:14
    • |
    • SciFi
  • Еще

Копался в статьях по алготрейдингу, решил присмотреться в сторону машинного обучения. Но это в моем случае не про какой-то искусственный интеллект с нейросетями, в нейросети пока не хочу лезть, слишком сложно. Для начала хочу использовать простые алгоритмы для классификации и оценки хороших точек входа на основе обучения модели на истории.

Я исходил из того, как сам разрабатываю обычно торговую систему: ищу хорошие точки входа на истории и классифицирую их. Но так как человеческие возможности ограничены, использую только 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. Также делюсь элементарным кодом. 

Я взял данные за последние 15 дней для BRK6 и 30 дней для SiM6. Затем посчитал доходности и их среднеквадратичное отклонение. Затем отклонение умножил на среднюю цену. 

Получилось:

Brent
за час: 0.25$
за день: 1.15$

Si
за час: 235 руб.
за день: 757 руб. 

Код на 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. 
★15
34 комментария
Поменьше уродов, побольше таких, как Вы. СПАСИБО!!!
«Сейчас я точно так же хочу сделать модель, которая на основе 30-300 хороших точек входа на истории определяет, насколько хороша данная пятиминутка для входа в лонг или шорт. » — удачи. Даже на очень длинной истории такой как S&P500 например вы получите сравнительно маленькие выборки для конкретной формации, т. к. они на самом деле сравнительно редко повторяются… И точность предсказаний такой модели будет невысока (60 на 40 например получите), в общем грааль тут если и есть, то только для долгожителя торгующего лет 50…
avatar
Удачи Вам, буду следить. Это лишь начало пути, как много прекрасного у Вас впереди :)
avatar
на техностриме mail.ru неплохие лекции по дата майнингу
avatar
Mr_X, спасибо! 
avatar
Код:

это весь алгоритм? Вы что шутите, или издеваетесь?:)
avatar
sortarray sortarray, при использовании готовых библиотек любой код становится простым ) Вся сложность скрыта. 
avatar
Это да. Можно все посчитать. Но как из R транслировать заявки в QUIK?
avatar
IliaM, почему именно в квик?
avatar
Андрей, Как-то так сложилось
avatar
IliaM, пока хочу просто проверить, работает ли это. Можно написать функцию на R, которая будет использовать готовую модель и сразу давать ответ в виде отчета для последней рыночной ситуации, например, в виде текстового файла. Также можно на R все это проверить, найти рабочую систему. А запрограммировать уже отдельно алгоритм под терминал. 
avatar
Машинное обучение это интересная и полезная штука, когда обучение строится сверху-вниз, если логически заранее известно, что точно имеется то, чему возможно обучиться. По-простому говоря, машинное обучение, это не подход, а инструментарий поиска решения. Если заранее известно, что это решение существует, то машинное обучение справится.

Как обстоит дело в случае с этими измученными исследователями ирисками? Они весьма неплохо разделяются линейными границами — многомерными плоскостями, ну т.е. это шикарная задача, в которой решение имеется… грубо говоря, 80% ирисок из каждого класса достаточно компактны и не пересекаются с другими классами. Дальше вопрос — как найти эту границу? Можно написать уравнение разделяющей плоскости аля LDA и потом решить систему уравнений — получите результат. Можно сделать случайный поиск коэффициентов разделяющей плоскости — опять получится результат. Можно науськать обычный перцепртрон… он сделает то же самое… Потому что решение имеется. Иными словами, конкретные методы машинного обучения в данном случае являются не методом решения исходной задачи, а лишь средством её решения.

Что в случае с ценовыми последовательностями? Кому удавалось видеть, чтобы общий набор почти случайных баров за счет какого-то преобразования давал условное и безусловное распределения, в которых мы бы видели, чтобы разделялись плохие и хорошие или покупки и продажи хотя бы в пропорции 60 на 40%? Кстати, в HFT обычно граали начинаются от пропорции 45 на 55 — этого достаточно уже.

Поэтому, когда вы примените к некоторой смеси объектов (построенных на цене) машинное обучение, то при должной сложности средств этого обучения, вы легко найдете разделяющие границы в рамках этой смеси. Но будет ли смысл в этом разделении? Эта беда именуется переобучением, а по факту к обучению она отношения не имеет… ибо чему тут учится система? Ну она просто запоминает индивидуально ситуации, т.е. локализует каждый объект в пространстве поиска.

А как отличить на этой стадии переобучение от не-переобучения? Реальный критерий один — если по этому удается зарабатывать на реальном счете.

Иными словами, собираясь применять средства машинного обучения, вы должны уже заранее знать, какое решение вы ищите и чему обучаете свою систему. Т.е. опять же сперва вы должны поставить осмысленную задачу, в которой логически есть решение.

Применение машинного обучения снизу-вверх — удел совсем романтичных романтиков:)
avatar
Sergey Pavlov, +, а еще классические алгоритмы хорошо приспособлены для поиска оптимальной модели по всем данным сразу т.е. каждая точка данных весит примерно одинаково. Это годится для торговых моделей которые все время в рынке. А значит в основном торгует шум. Торговые алгоритмы которые выжидают момента, а потом входят не на долго в рынок, требуют чтобы мы сильно по разному относились в областям где позиция открыта и где нет. Т.е. алгоритм учить надо с учетом этого, а в классике это сложно, включая нейросети.
avatar
ivanovr, на мой скромный взгляд, обучаемые системы в трейдинге полезны для одного — поиска закономерности в исходных данных. Логически такая постановка обоснована, поскольку человеческий глаз многое не увидит сразу, а многое вообще не сможет увидеть. Плюс к этому машина проведет намного больше экспериментов нежели человек. Но потом все равно перед человеком встанет вопрос о принятии или отклонении гипотезы о том, можно ли считать найденное нечто закономерностью.
avatar
Sergey Pavlov, это да, но я про то, что классические алгоритмы ищут не совсем то. Не рост эквити а какой-то там свой показатель качества да еще в предположении что все данные одинаково важны. Потому куда правильнее искать алгоритм, а качество оценивать по эквити. Тут лучше всего подходит какая ни будь эволюционная оптимизация.
avatar
ivanovr, подозреваю, что всё это — игра слов. Любое из средств машинного обучения вполне можно назвать эволюционной оптимизацией:) Вообще было бы интересно посмотреть… необязательно применительно к ценовым последовательностям… в любой области… где машинное обучение из исходного хаоса само чему-нибудь таки взяло да научилось:) Может у кого есть информация о таких примерах?
avatar
Sergey Pavlov, можно назвать оптимизацией, но не эволюционной (так называется вполне определенный класс алгоритмов). Но важно какую функцию оптимизируем. В случае большинства алгоритмов максимизируется некий показатель качества, который напрямую с качеством эквити не связан. 
Про хаос вопрос не понял. Что там за хаос. Всегда решение ищется на ограниченном объеме входных данный и форма решения тоже ограничивается. Если пространство решений будет бесконечно, то вероятность получить переобучение стремится к 1.
avatar
ivanovr, либо минимизируется функция потерь, например, сумма квадратов ошибок. Либо максимизируется информация или разница в энтропии. 
avatar
Sergey Pavlov, возможно, вот такой пример имеется в виду? http://smart-lab.ru/blog/307172.php
avatar
ivanovr, интересный пример, спасибо!
avatar
Sergey Pavlov, сверточные сети и фильтры габора например
avatar
Mr_X, названий много, а есть ли успешные внедрения?
avatar
Sergey Pavlov, да, поиск по картинке
avatar
Sergey Pavlov, именно для этого я и начал все это изучать. Когда я смотрю глазами и торгую руками, я склонен переоценивать какой-то один фактор или вообще вступать в ступор. Например, пусть тренд по нефти на часовике вверх, а последний отчет по запасам при этом показал, что запасы выросли. Вот что делать? Надеюсь, машинное обучение поможет принимать решения в таких ситуациях. 
avatar
SciFi, если у вас это получится, это будет очень здорово:) не забудьте похвастаться потом!
avatar
Что скажете? Есть ли там грааль? Есть ли у кого-то опыт использования машинного обучения для торговли? Что посоветуете? 

Грааля нету.  
А мораль проста -
Нельзя просто так взять и  обучить машину делать то, чего сам делать не умеешь.
avatar
машинное обучение полностью зависит от того, какие данные ты ему будешь скармливать. если ты найдешь такую альфу — то да, возможно это и есть твой грааль. но обучение — это метод, не более того. ну и оверфиттинг, конечно, возможен, особенно, если входных классификаторов очень много
avatar
Alex Hurko, Алекс не криви душой) это же полный бред, сам то ты не работаешь с упакованными данными.
Попробовал R и сделал вывод что для выборок большого объема он не приспособлен. А это, пожалуй, противоречит задаче.
Python для этой цели интереснее.
Но на деле использую нормально компилируемый язык ;)
avatar
Это не обучение, это запоминание.  Запомнит цены и будет выдавать прогнозы, когда они будут совпадать. Если у вас есть опровержение — готов выслушать.
MyKey, не запоминание, а поиск скрытых закономерностей. Для меня главное, чтобы обучение позволило распознавать с повышенной вероятностью хорошие точки входа. При использовании какого-нибудь TSLab, который позволяет проверять алгоритмы на истории, мы задаем зависимости (например, гипотезу о том, что скользящие средние влияют на цену в будущем) и проверяем их статистически. При использовании же машинного обучения мы пытаемся найти эти зависимости. В этом отношении машинное обучение, на мой взгляд, круче. Правда, логически объяснить, почему Газпром именно так влияет на Сбербанк будет сложно. Но если влияет, почему бы это не торговать? )
avatar
SciFi, вот это правильный подход, но есть же спец ПО для этого, зачем что-то писать…

теги блога SciFi

....все тэги



UPDONW
Новый дизайн