Блог им. SciFi |Применение наивного байесовского классификатора на R для поиска закономерностей и прогнозирования

    • 09 мая 2016, 13:48
    • |
    • SciFi
  • Еще
В последнее время изучаю R и машинное обучение. 

Мои статьи про R, машинное обучение, количественный анализ

В этом посте я расскажу о том, как применить машинное обучение для поиска закономерностей и прогнозирования.

Использовал эту статью: Применение машинного обучения в трейдинге

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

Теорема Байеса в теории вероятностей, как теорема Пифагора в геометрии.

Байесовская вероятность — это интерпретация понятия вероятности, используемая в байесовской теории. Вероятность определяется как степень уверенности в истинности суждения. Для определения степени уверенности в истинности суждения при получении новой информации в байесовской теории используется теорема Байеса. 

( Читать дальше )

Блог им. SciFi |Расчет ожидаемого количества убыточных сделок подряд на R

    • 04 мая 2016, 21:35
    • |
    • SciFi
  • Еще
Применим R для того, чтобы быстро посчитать, каково должно быть ожидаемое количество убыточных сделок подряд при совершении 1000 сделок.

Я написал функцию runUnluck(n) которая выдает, сколько раз мы получим n убыточных сделок подряд, если совершим 10000 экспериментов по 1000 сделок в виде подбрасывания монетки, то есть с отношением риска к доходности 1 к 1.

# 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)
}

Здесь подробнее про функцию rle. Она как раз считает количество одинаковых исходов подряд. 

Результаты:
> 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


( Читать дальше )

Блог им. 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. 

Блог им. SciFi |Главный плюс системного трейдинга и алготрейдинга

    • 13 апреля 2016, 19:04
    • |
    • SciFi
  • Еще
Я уже писал о том, что при трейдинге имеет значение не только % прибыли, но и затраченное время и внимание. Внимание — это тоже сущность, которая имеется у каждого человека в ограниченном количестве. И нельзя им раскидываться. Пассивный доход не равен активному, даже если они равны по модулю. Так как при пассивном доходе тратится меньше времени и внимания.

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

На что высвобождается время. Например, на:
1. читаем новости

( Читать дальше )

Блог им. SciFi |О соотношении стопа к профиту

    • 05 апреля 2016, 19:17
    • |
    • SciFi
  • Еще
Прочитал такую интересную статью на английском о том, как ставить стопы и тейки. Вообще, в последнее время меня заботит вопрос — как взять максимум от движения. 

Еще раз убедился в том, что я правильно сомневался в мифе о том, что тейк-профит всегда должен быть больше стоп-лосса в 2-3 и более раз.

Рассматривается такой пример. Пусть есть лотерея, которая стоит 1$, а выигрыш в ней 1000 000$. Казалось бы, соотношение 1: 1000 000 риск к доходности — это фантастика для трейдера и выгодная сделка. Но это не так. Дело в том, что если 2 миллиона человек купят такую лотерею, то мат. ожидание выигрыша составит: (1 / 2000 000) * 1000 000 — 1 = 0,5 — 1 = — 0,5. То есть покупая за 1$ лотерею, нам в долгосрочной перспективе будет возвращаться только 0,5$.

То же самое и в трейдинге. Ваш тейк профит может быть далеко от стопа, но какова вероятность того, что этот тейк профит будет достигнут до того, как снимут ваш стоп? Особенно, если ваш стоп меньше волатильности на этом таймфрейме? Я думаю, вероятность будет сильно меньше 1. А вот вероятность снятия стопа, который меньше волатильности — около 1.

То есть этот немаловажный аспект тоже надо учитывать. Не все это знают, надеюсь, будет полезно.

Блог им. SciFi |Построение модели для парной торговли акциями Google и Apple на R

    • 28 марта 2016, 18:51
    • |
    • SciFi
  • Еще

Посчитал на R спред между акциями Google и Apple с учётом соотношения (hedge ratio). И нанёс среднюю линию с двумя среднеквадратичными отклонениями сверху и снизу. Красота. 

Построение модели для парной торговли акциями Google и Apple на R

Делается на 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 — временной диапазон

Хотите попросить сделать количественный анализ чего-нибудь? Пишите в личку или в комментариях.

Блог им. SciFi |Гистограммы доходностей разных активов

    • 25 марта 2016, 19:15
    • |
    • SciFi
  • Еще
Ранее выложил гистограмму для нефти. Выкладываю остальные гистограммы по просьбам читавших тот пост. Таймфрейм 5 мин. ES не нашел на Финаме и не торгую их. Сделал для S&P и NASDAQ. Ну и для остального. Использую свойство логарифмов что log(1+x) ~ x при малых x, которое позволяет считать доходность простым вычитанием логарифмов цен. 

Гистограммы доходностей разных активов

( Читать дальше )

Блог им. SciFi |Количественный анализ графика нефти с применением R (продолжение)

    • 15 марта 2016, 22:04
    • |
    • SciFi
  • Еще
Сделал на R такую красоту ) В общем, вывод такой: нефть за 5 минут чаще всего ходит на 0-20 центов. Очень редко на 40 центов. Зная это, можно стоп ставить где-то на 20 центах от лоя свечи, где зашел. Если стоп сняли, значит, лонганул рано )

И кстати видно на глаз, что доходности подчиняются нормальному распределению.. А значит, сама цена на нефть — лог-нормальному. 
Еще видно, что за 5 минут расчитывать больше чем на 20 центов не стоит. И можно с высокой вероятностью жадно пипсануть 5 центов )

Количественный анализ графика нефти с применением R (продолжение)

Напишите, что еще хотели бы узнать, чтобы я посчитал на R? 

Если хотите меня нанять количественным аналитиком (квантом), милости прошу, пишите в личку )


Блог им. SciFi |Анализ Brent с использованием языка R

    • 11 марта 2016, 21:26
    • |
    • SciFi
  • Еще
В общем, всю пятницу изучал R. Кое-чему научился. Что я сделал для анализа Brent: 

1. Взял 15-минутку нефти за последние 10 дней, преобразовал в доходности, посчитал среднее значение, ср.-кв. отклонение (это все ниже в результатах), построил график:

Анализ Brent с использованием языка R

2. Проверил получившиеся доходности по двум тестам на независимость друг от друга (типа если в предыдущие 15 мин росла нефть, будет ли расти в след. 15 минут?)

Тест ADF (Augmented Dickey–Fuller test) проверяет независимость следующей величины от предыдущей или другими словами это тест на стационарность. Этот тест, вроде как, показывает, что процесс стационарный. 

Тест BDS также проверяет что-то похожее (я не шарю, честно говоря):

The BDS test (after the initials of W. A. Brock, W. Dechert and J. Scheinkman) detects nonlinear serial dependence in time series. The BDS test was not developed as a leading indicator, but it can help to avoid false detections of critical transitions due to model misspecification. After detrending (or first-differencing) to remove linear structure from the time series by fitting any linear model (e.g. ARMA(p,q), ARCH(q) or GARCH(p,q) models), the BDS tests the null hypothesis that the remaining residuals are independent and identically distributed (i.i.d.).

( Читать дальше )

....все тэги
UPDONW
Новый дизайн