# Created by SciFi, 2016 runUnluck <- function(n) { runArray <- numeric(10000) for(i in 1:10000) { runArray[i] <- sum(rle(sample(c(-1, 1), 1000, TRUE))$lengths == n) } hist(runArray, main="Гистограмма") mean(runArray) }
> source("D:\\Dropbox\\R\\RunUnluck.r") > runUnluck(6) [1] 7.8161 > runUnluck(2) [1] 125.2208 > runUnluck(3) [1] 62.4047 > runUnluck(4) [1] 31.179 > runUnluck(5) [1] 15.6559 > runUnluck(6) [1] 7.7635 > runUnluck(7) [1] 3.8831 > runUnluck(8) [1] 1.9382 > runUnluck(9) [1] 0.9738 > runUnluck(10) [1] 0.4922
Копался в статьях по алготрейдингу, решил присмотреться в сторону машинного обучения. Но это в моем случае не про какой-то искусственный интеллект с нейросетями, в нейросети пока не хочу лезть, слишком сложно. Для начала хочу использовать простые алгоритмы для классификации и оценки хороших точек входа на основе обучения модели на истории.
Я исходил из того, как сам разрабатываю обычно торговую систему: ищу хорошие точки входа на истории и классифицирую их. Но так как человеческие возможности ограничены, использую только 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.
Посчитал на R спред между акциями Google и Apple с учётом соотношения (hedge ratio). И нанёс среднюю линию с двумя среднеквадратичными отклонениями сверху и снизу. Красота.
Делается на R это очень просто, код ниже.
require(quantmod)
> startT <- «2015-01-01»
> endT <- «2016-01-01»
> rangeT <- paste(startT, "::", endT, sep="")
> symbols <- c(«AAPL», «GOOG»)
> getSymbols(symbols)
[1] «AAPL» «GOOG»
> tGOOG <- GOOG[,6][rangeT]
> pdtGOOG <- diff(tGOOG)[-1]
> tAAPL <- AAPL[,6][rangeT]
> pdtAAPL <- diff(tAAPL)[-1]
> model <- lm(pdtAAPL ~ pdtGOOG)
> hr <- as.numeric(model$coefficients[1])
> spreadT <- tAAPL — hr * tGOOG
> meanT <- as.numeric(mean(spreadT, na.rm=TRUE))
> sdT <- as.numeric(sd(spreadT, na.rm=TRUE))
> par(mfrow = c(2,1))
> hist(spreadT, col=«blue», breaks = 100, main = «Spread Histogram (AAPL vs GOOG)»)
> plot(spreadT, main=«AAPL vs GOOG spread (in-sample period)»)
> abline(h = meanT, col = «red», lwd = 2)
> abline(h = meanT + 1 * sdT, col = «blue», lwd = 2)
> abline(h = meanT — 1 * sdT, col = «blue», lwd = 2)
Здесь:
meanT — среднее
sdT — среднекв. отклонение
spreadT — спред
par — график с двумя секциями
plot — график
hist — гистограмма
abline — линия поверх графика
model — линейная зависимость модель, МНК
quantmod — библиотека для получения исторических данных
rangeT — временной диапазон
И кстати видно на глаз, что доходности подчиняются нормальному распределению.. А значит, сама цена на нефть — лог-нормальному.
Еще видно, что за 5 минут расчитывать больше чем на 20 центов не стоит. И можно с высокой вероятностью жадно пипсануть 5 центов )
Напишите, что еще хотели бы узнать, чтобы я посчитал на R?
Если хотите меня нанять количественным аналитиком (квантом), милости прошу, пишите в личку )