Машинное обучение в трейдинге: теория, модели, практика и алготорговля - страница 36

 
Dr.Trader:

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


Здравствуйте! Вы не ту функцию использовали,  нужно  было использовать "nlPca"  как было указано на сайте  что я дал, в прочем это моя вина, нужно более детально подавать инфу...

Здесь вместо predict  - fitted , попробуйте, может у вас получиться 

source("https://bioconductor.org/biocLite.R")
biocLite("pcaMethods")        

#создание pca объекта
library(pcaMethods)

## Data set with three variables where data points constitute a helix
data(helix)
helixNA <- helix
## not a single complete observation
helixNA <- t(apply(helix, 1, function(x) { x[sample(1:3, 1)] <- NA; x}))
## 50 steps is not enough, for good estimation use 1000
helixNlPca <- pca(helixNA, nPcs=1, method="nlpca", maxSteps=50)
fittedData <- fitted(helixNlPca, helixNA)
plot(fittedData[which(is.na(helixNA))], helix[which(is.na(helixNA))])
		
 
Dr.Trader:

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

Это создаст объект resNipals (Nonlinear Estimation by Iterative Partial Least Squares) с 5 главными компонентами для анализа таблицы metaboliteDataComplete. Вместо metaboliteDataComplete можно подставить свою таблицу с предикторами. Важно не подавать сюда целевую переменную, она будет использована позже.

 

Но этого хватит только для анализа взаимосвязей между переменными, путём изучения разных графиков. Для создания предсказательной модели после этого строится модель линейной регрессии, которая использует главные компоненты PC1, PC2,PC3,PC4,PC5 как входные переменные (x1,x2,x3,...). И в линейную модель уже подаётся целевая переменная Y как требуемый результат. Проблема в том что resNipals это какой-то объект класса "pcaRes" из пакета pcaMethods. Как с ним всё это сделать я в хелпе не нашёл.

Если бы это была PCA модель из пакета caret, то дальше было бы так:

 Но с resNipals это не работает, по идее в пакете pcaMethods должны быть какие-то свои функции для работы с этим объектом, но я ничего не нашёл.

Изначально РСА предназначался для решения двух проблем:

1. Имеется очень большое число предикторов с небольшим число наблюдений.  Это характерно для органической химии, генетике.. У нас это использование макроэкономических данных на больших ТФ, например, годовых.

2. Существуют корреляционные связи между предикторам.

 

Поэтому алгоритмы РСА решают эти две основные задачи:

1. Уменьшают число исходный предикторов новыми новым, зачастую радикально меньшим, числом предикторов. При этом алгоритм гарантирует, что это небольшое число может объяснить некоторый процент изменчивости исходного набора предикторов, например, 95%. Эта величина выбирается исследователем.  

2. Новый набор предикторов имеет НУЛЕВУЮ корреляцию между собой.

 

Из этого следует, что для нас РСА является одним из алгоритмов предварительной подготовки исходных данных для моделирования, но заменить моделирование с целью предсказания целевой переменной не может.

 

Как мне кажется среди обсуждения разных деталей РСА утерялся смысл моих высказываний по этому поводу. Поэтому напомню: я дал ссылку на такое использование РСА, при котором не просто уменьшалось число исходных предикторов, но и отсеивались предикторы, которые являлись шумом для целевой переменной. Что и обсуждается на этой ветке. 

Поэтому я предлагаю вернуться к проблеме шума среди предикторов, и возможного использования совершенно конкретной идеи применения РСА для решения этой проблемы. 

 
Dr.Trader:

Это создаст объект resNipals (Nonlinear Estimation by Iterative Partial Least Squares) с 5 главными компонентами для анализа таблицы metaboliteDataComplete. Вместо metaboliteDataComplete можно подставить свою таблицу ..........

Тот что вы пробовали это Nipals , он показан второй картинкой на сайте, он тоже не очень разделяет, нужно брать тот что  на третьей картинке нейросетевой PCA

 =========================

 немного не по теме но нужна помощь с кодом....

есть у меня предикторы в колонках, я хочу посчитать разницу всех предикторов со всеми те перебрать все комбинации, это я реализовал печаль в том что нужно теперь каждую комбинацию адекватно назвать чтоб потом понять что к чему

допустим есть у нас колонки с предикт.ми "А" , "Б" , "С"

делаю комбинации разниц 

1) А - Б

2) А - С

3) С - Б 

 вопрос : как мне дать новым полученным колонкам имена типа "a_minus_b" , "a_minus_c" 

я только осваиваю "R" и програмирование в целом потому с такими выкрутасами совсем не знаком 

что мне нужно добавить в этот код?

a <- 1:5
b <- 6:10
c <- 11:15
d <- 16:20
dt <- data.frame(a,b,c,d) 
dt

# все комбинации индексов между двумя переменными
# еще транспонирую(переворачиваю матрицу) мне так удобней воспринимать
combi <- t(  combn(1:ncol(dt),2)  )  
combi  

# пустая фрейм куда буду записывать результат вычислений с комбинацыями
res.dt <- as.data.frame(  matrix(nrow = nrow(dt) , ncol = nrow(combi))   )
res.dt

for(i in 1:ncol(res.dt)){
  # буду проводить вычитание одной перем из другой во всех комбинацыях
  # и записывать в res.dt
  ii <- combi[i,1]
  jj <- combi[i,2]
  
  res.dt[,i] <- dt[,ii] - dt[,jj]
}
res.dt
 
mytarmailS:

Тот что вы пробовали это Nipals , он показан второй картинкой на сайте, он тоже не очень разделяет, нужно брать тот что  на третьей картинке нейросетевой PCA

 =========================

 немного не по теме но нужна помощь с кодом....

есть у меня предикторы в колонках, я хочу посчитать разницу всех предикторов со всеми те перебрать все комбинации, это я реализовал печаль в том что нужно теперь каждую комбинацию адекватно назвать чтоб потом понять что к чему

допустим есть у нас колонки с предикт.ми "А" , "Б" , "С"

делаю комбинации разниц 

1) А - Б

2) А - С

3) С - Б 

 вопрос : как мне дать новым полученным колонкам имена типа "a_minus_b" , "a_minus_c" 

я только осваиваю "R" и програмирование в целом потому с такими выкрутасами совсем не знаком 

что мне нужно добавить в этот код?

 Примерно так. 

colnames() <- c("..", "..")

Еще есть names 

См справку.  

 
СанСаныч Фоменко:

Изначально РСА предназначался для решения двух проблем:

PCA изначально предназначался для уменьшения размерности исходного ряда. Это все. Использовать его для отбора предикторов, это бредовейший бред.
 
СанСаныч Фоменко:

 Примерно так. 

colnames() <- c("..", "..")

Еще есть names 

См справку.  

)) да это ежу понятно, а если переменных 1000, так что каждую вручную писать?
 

Dr.Trader:

...

Данные взяты с eurusd d1, класс 0 или 1 - падение или рост цены за следующий бар. Если модель правильно предскажет результат для test.csv хотябы в 6 случаев из 10, то уже можно пробовать торговать ей на Форексе, в принципе сливать не будет, но и большого профита ждать тоже не стоит. Если правильно предскажет уже в 7 случаев из 10 (и выше) - это верный путь к граалю, останется опробовать обучение и тест модели на других годах и месяцах, и если везде будет также - то очень отлично.

...


Более конкретно в файле отчёта:

/**
 * The quality of modeling in out of sample:
 *
 * TruePositives: 182
 * TrueNegatives: 181
 * FalsePositives: 1
 * FalseNegatives: 1
 * Total patterns in out of samples with statistics: 365
 * Total errors in out of sample: 2
 * Sensitivity of generalization abiliy: 99.4535519125683%
 * Specificity of generalization ability: 99.45054945054946%
 * Generalization ability: 98.90410136311776%
 * Indicator by Reshetov: 8.852456238401455
*/


Пора собирать команду и делать Open Source проект - автоматизированный комплекс под это дело на mql5 и на Java. Чуть позже напишу инструкцию, как обучать модели и как ими пользоваться, а также выложу исходники бинарного классификатора на Java и скрипта MQL5, создающего выборку для обучения моделей.

Примерный план, как будет работать комплекс:

  1. Для каждого фин. инструмента на чартах стоят отдельные роботы, которые срабатывают по ценам открытия баров и скидывают паттерны в файлы.
  2. Приблуда на Java (бинарный классификатор) загружает модели для каждого из инструментов и с интервалом в 1 сек. ждёт появления файлов от роботов из п. 1. Из файла считывается тикер инструмента и паттерн для него. После чего считанный файл с паттерном удаляется с диска. По паттерну приблуда соответствующей для инструмента моделью классифицирует торговый сигнал и записывает его в файл.
  3. Один робот потиково ждёт файлы от приблуды из п. 2. Как только такой файл обнаруживается, то робот считывает из него инструмент, а также сигнал и открывает, либо разворачивает по двойной встречной сделку по инструменту согласно сигналу. Считанный файл удаляется.

Если есть желающие присоединиться к проекту и умеющие программировать на Java или MQL5, то отписывайтесь в этой ветке.

 
mytarmailS:

Здравствуйте! Вы не ту функцию использовали,  нужно  было использовать "nlPca"  как было указано на сайте  что я дал, в прочем это моя вина, нужно более детально подавать инфу...

Здесь вместо predict  - fitted , попробуйте, может у вас получиться 

Этот пример к сожалению из другой темы. На Форексе мы например всегда можем извлечь 100% данных, а в других сферах где данные получают экспериментально - всегда будут пропуски, недостающие значения. В этом примере PCA используется для реконструкции недостающих значений в самих предикторах. В примере рандомно очищают значение в одной из трёх колонок, создают pca модель, и с её помощью воссоздают недостающие значения.

Я никогда так не пробовал, но технически можно целевую переменную тоже рассматривать как предиктор, включив её в pca модель. Затем, в новых данных её значение будет неизвестно, соответсвенно pca может дополнить эти недостающие значение. 

source("https://bioconductor.org/biocLite.R")
biocLite("pcaMethods")        

#создание pca объекта
library(pcaMethods)

## Data set with three variables where data points constitute a helix
#trainData - таблица с обучающими примерами. Целевая переменная тоже должна быть в этойже таблице. Пример колонок: Close,Hour,MA30,target. (target - целевая переменная, со значениями например 0 или 1 обозначающими падение/рост цены)
## 50 steps is not enough, for good estimation use 1000
NlPca <- pca(trainData, nPcs=1, method="nlpca", maxSteps=50)
#newData - таблица с новыми данными, для проверки модели. Колонки должны быть теже Close,Hour,MA30,target
newData[,"target"] <- NA  #целевая переменная на новых данных не должны быть известна модели, и в случае NA - функция fitted должна подставить туда подходящие значения
fittedNewData <- fitted(NlPca, newData)
fittedNewData[,"target"] # ваш результат предсказания
Я не могу начать новую нормальную строку :/ В общем можно сделать как я написал выше, но это не предсказание а реконструкция. PCA модель может просто найти некие значения которые "подойдут". Гарантий никаких нет, я предполагаю что ошибка будет 50%
 
Комбинатор:
PCA изначально предназначался для уменьшения размерности исходного ряда. Это все. Использовать его для отбора предикторов, это бредовейший бред.

Нет, всё норм. Поскольку для каждой из главных компонент известны используемые предикторы, то можно смело отсеивать те предикторы которые не используются в главных компонентах. Вот почитайте, мне понравилось: http://www.win-vector.com/blog/2016/05/pcr_part2_yaware/ Там данные содержат 5 годных предикторов, и десятки шумовых. С помощью анализа отсеивают шум. Я этот-же код использовал для других примеров попадающихся в этой теме, в целом работает. Но именно форекс сложнее, я таких красивых картинок на нём не получал на индикаторах, нужно придумать что-то умнее. 

 
Dr.Trader:

Этот пример к сожалению из другой темы. На Форексе мы например всегда можем извлечь 100% данных, а в других сферах где данные получают экспериментально - всегда будут пропуски, недостающие значения. В этом примере PCA используется для реконструкции недостающих значений в самих предикторах. В примере рандомно очищают значение в одной из трёх колонок, создают pca модель, и с её помощью воссоздают недостающие значения.

Я никогда так не пробовал, но технически можно целевую переменную тоже рассматривать как предиктор, включив её в pca модель. Затем, в новых данных её значение будет неизвестно, соответсвенно pca может дополнить эти недостающие значение. 

Блин, я подозревал что не случайно там эти "NA"-шки вбрасываються в дату , но прочитал мануал , там четко написано PCA с нейросетью, но тогда все равно не понятно как этот чел с сайта эту красивую картинку получил с хорошим разделением по классам
Причина обращения: