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

 
СанСаныч Фоменко:
"объект" в R штука гораздо сложнее, чем во многих языках программирования.
Да объекты-то ничем не отличаются, просто функции str, plot, summary и им подобные много раз перегружены, для каждого типа своя реализация
 
Alexey Burnakov:
Я не совсем понял почему так долго. Сколько получилось optim_var_number? Должно быть в пределах 10. Ставьте на 1200 секунд и должно быть уже что-то.

У меня очень много предикторов (9602), поэтому так долго. Они взяты за 2015 год из eurusd d1, там всякие цены, время и индикаторы. Я ещё не вылез из d1, поэтому число обучающих примеров всего 250+, по количеству торговых дней в году. Пропусков нету.

optim_var_number = 0.8662363 

Файлы:
trainData.zip  14378 kb
 
Dr.Trader:

У меня очень много предикторов (9602), поэтому так долго. Они взяты за 2015 год из eurusd d1, там всякие цены, время и индикаторы. Я ещё не вылез из d1, поэтому число обучающих примеров всего 250+, по количеству торговых дней в году. Пропусков нету.

optim_var_number = 0.8662363 

 Я поиграю с вашим набором. Все должно летать.
 
СанСаныч Фоменко:

У последней 1-й столбец говорит, что если взять только РС1, то будет объяснено 0.9761 изменчивости (Cumulative Proportion) , если взять ДВЕ компоненты - РС1 и РС2, то будет объяснено 0.99996 и т.д.  

                                         PC1     PC2     PC3      PC4      PC5

Standard deviation             2.2092 0.34555 0.01057 0.008382 0.004236

Proportion of Variance       0.9761 0.02388 0.00002 0.000010 0.000000

Cumulative Proportion       0.9761 0.99996 0.99998 1.000000 1.000000 

Всё оказалось немного плохо - этот способ работает только если работать со всеми возможными компонентами. У функции prcomp есть параметр "tol", по дефолту он NULL. Но ему можно присвоить какие-нибудь значение от 0 до 1, для уменьшения числа найденных компонент. Работает так - при поиске новой компоненты функция берёт sdev первой компоненты, умножает на tol. Как только sdev новой компоненты упадёт ниже этого произведения, новые компоненты перестанут генерироваться. Например в вашем случае если tol = 0.1, то автоматически отбросятся все компоненты с sdev <0.22, тоесть останется только две главные компоненты. Если tol=0.003, то останутся только компоненты с sdev > 0.0066276, то-есть только четыре. При tol=NULL (дефолт) функция сгенерирует максимальное число компонент, но у меня на это уходит очень много времени, поэтому хочется сократить этот процесс. Если использовать tol то всё работает быстрее, компонент получается меньше, но в таком случае ломается cumulative proportion. Он как-то расчитывается исходя только из найденных компонент. Cumulative Proportion последней найденной компоненты всегда будет 1. Даже если благодаря tol будет найдено всего 2 компоненты вместо тысячи - то cumulativeprop второй компоненты изменится на 1 (например с 0.1 в случае если генерировать все компоненты), и соответсвенно вырастет у PC1 тоже. Возможно что и при отсеве предиктров Cumulative Proportion тоже будет как-то неправильно изменяться.

В общем Cumulative Proportion доверять нельзя, если серьёзно работать с y-aware pca то надо писать свою функцию для расчёта объяснённой изменчивости.

 
Dr.Trader:

Всё оказалось немного плохо - этот способ работает только если работать со всеми возможными компонентами. У функции prcomp есть параметр "tol", по дефолту он NULL. Но ему можно присвоить какие-нибудь значение от 0 до 1, для уменьшения числа найденных компонент. Работает так - при поиске новой компоненты функция берёт sdev первой компоненты, умножает на tol. Как только sdev новой компоненты упадёт ниже этого произведения, новые компоненты перестанут генерироваться. Например в вашем случае если tol = 0.1, то автоматически отбросятся все компоненты с sdev <0.22, тоесть останется только две главные компоненты. Если tol=0.003, то останутся только компоненты с sdev > 0.0066276, то-есть только четыре. При tol=NULL (дефолт) функция сгенерирует максимальное число компонент, но у меня на это уходит очень много времени, поэтому хочется сократить этот процесс. Если использовать tol то всё работает быстрее, компонент получается меньше, но в таком случае ломается cumulative proportion. Он как-то расчитывается исходя только из найденных компонент. Cumulative Proportion последней найденной компоненты всегда будет 1. Даже если благодаря tol будет найдено всего 2 компоненты вместо тысячи - то cumulativeprop второй компоненты изменится на 1 (например с 0.1 в случае если генерировать все компоненты), и соответсвенно вырастет у PC1 тоже. Возможно что и при отсеве предиктров Cumulative Proportion тоже будет как-то неправильно изменяться.

В общем Cumulative Proportion доверять нельзя, если серьёзно работать с y-aware pca то надо писать свою функцию для расчёта объяснённой изменчивости.

Мысль  интересная, не зря я Вас агитировал посмотреть.
 
Dr.Trader:

У меня очень много предикторов (9602), поэтому так долго. Они взяты за 2015 год из eurusd d1, там всякие цены, время и индикаторы. Я ещё не вылез из d1, поэтому число обучающих примеров всего 250+, по количеству торговых дней в году. Пропусков нету.

optim_var_number = 0.8662363 

Я посмотрел ваш набор. Или я чего-то не пойму, например, на вход идут не все переменные, или вы сильно заблуждаетесь. У вас полно сырых значений цены, на пример, 1,1354 (МА и прочие). Это никак нельзя делать, так как это совершенно нестационарные данные. Все данные должны быть РАЗНИЦАМИ или осциллирующими индикаторами, и быть всевдостационарными. Поиск зависимостей в таких данных это совсем бесмыссленная работа.
 

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

PCA модель с такими данными кстати работает, но ей нужно очень много центрирования, скалирования, и каких-то ротаций с исходными данными. Для нейронки попроще, ей нужно только нормализация данных в [0..1].

 
Dr.Trader:

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

PCA модель с такими данными кстати работает, но ей нужно очень много центрирования, скалирования, и каких-то ротаций с исходными данными. Для нейронки попроще, ей нужно только нормализация данных в [0..1].

Нее, вы точно не совсем понимаете важность нестационарности. Неважно, будет ли это НС или линейная модель или моя модель, если у вас данные нестационарны, то найденные на них зависимости гарантированно не будут встречаться вне выборки. Все данные, которые у вас имеют вид: сырая цена, МА(сырой цены), открытие бара (сырая цена) и т.д. нужно удалить из модели. Нужно брать их разницы с последней известной ценой.

 

Тут шкалирование в интервал не моможет. 

 
Alexey Burnakov:

если у вас данные нестационарны, то найденные на них зависимости гарантированно не будут встречаться вне выборки. 

Только есть один интересный нюанс который сеет сомнения в адекватности воспроизведения таких данных (разниц с предыд. знач.)

 

1) например если у нас есть цена,

2)  мы  генерируем ее разницу 

3) берем два участка разниц которые очень близки между собой по структуре (ну пусть по евклиду даже) 

4) то есть эти участки почти 100% попадут в один кластер в RF или той же нейронке  и будут считаться идентичными ситуациями

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

 И видим что эти участки абсолютно разные, часто на одном участке идет тренд вверх а на другом тренд вниз, то есть сходства ниакого, а алгоритм то думает что это идентичные участки..

 

Что вы думаете по этому поводу Алексей? интересный ваш коментарий  как  человека с опытом

 
mytarmailS:

Только есть один интересный нюанс который сеет сомнения в адекватности воспроизведения таких данных (разниц с предыд. знач.)

 

1) например если у нас есть цена,

2)  мы  генерируем ее разницу 

3) берем два участка разниц которые очень близки между собой по структуре (ну пусть по евклиду даже) 

4) то есть эти участки почти 100% попадут в один кластер в RF или той же нейронке  и будут считаться идентичными ситуациями

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

 И видим что эти участки абсолютно разные, часто на одном участке идет тренд вверх а на другом тренд вниз, то есть сходства ниакого, а алгоритм то думает что это идентичные участки..

 

Что вы думаете по этому поводу Алексей? интересный ваш коментарий  как  человека с опытом

Почему же будет так? Если разницы совпадают, то и интегральный ряд совпадет полностью. Если они просто похожи, будут похожи (по тренду) интегральные ряды.

Я хотел Трейдеру сказать, что нужно почитать основы подготовки данных. Никто не подает сырые цены на вход. Это уже обыграно сто тысяч раз. Нестационарные данные ведут к нестационарным зависимостям. 

Причина обращения: