Машинное обучение в трейдинге: теория, модели, практика и алготорговля - страница 25
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
"объект" в R штука гораздо сложнее, чем во многих языках программирования.
Я не совсем понял почему так долго. Сколько получилось optim_var_number? Должно быть в пределах 10. Ставьте на 1200 секунд и должно быть уже что-то.
У меня очень много предикторов (9602), поэтому так долго. Они взяты за 2015 год из eurusd d1, там всякие цены, время и индикаторы. Я ещё не вылез из d1, поэтому число обучающих примеров всего 250+, по количеству торговых дней в году. Пропусков нету.
optim_var_number = 0.8662363
У меня очень много предикторов (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 то надо писать свою функцию для расчёта объяснённой изменчивости.
Всё оказалось немного плохо - этот способ работает только если работать со всеми возможными компонентами. У функции 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 то надо писать свою функцию для расчёта объяснённой изменчивости.
У меня очень много предикторов (9602), поэтому так долго. Они взяты за 2015 год из eurusd d1, там всякие цены, время и индикаторы. Я ещё не вылез из d1, поэтому число обучающих примеров всего 250+, по количеству торговых дней в году. Пропусков нету.
optim_var_number = 0.8662363
Точно, я забыл, вы уже говорили что данные нужно специально подготовить. Я брал сырые данные. Там среди индикаторов есть осциляторы тоже, попробую взять только их.
PCA модель с такими данными кстати работает, но ей нужно очень много центрирования, скалирования, и каких-то ротаций с исходными данными. Для нейронки попроще, ей нужно только нормализация данных в [0..1].
Точно, я забыл, вы уже говорили что данные нужно специально подготовить. Я брал сырые данные. Там среди индикаторов есть осциляторы тоже, попробую взять только их.
PCA модель с такими данными кстати работает, но ей нужно очень много центрирования, скалирования, и каких-то ротаций с исходными данными. Для нейронки попроще, ей нужно только нормализация данных в [0..1].
Нее, вы точно не совсем понимаете важность нестационарности. Неважно, будет ли это НС или линейная модель или моя модель, если у вас данные нестационарны, то найденные на них зависимости гарантированно не будут встречаться вне выборки. Все данные, которые у вас имеют вид: сырая цена, МА(сырой цены), открытие бара (сырая цена) и т.д. нужно удалить из модели. Нужно брать их разницы с последней известной ценой.
Тут шкалирование в интервал не моможет.
если у вас данные нестационарны, то найденные на них зависимости гарантированно не будут встречаться вне выборки.
Только есть один интересный нюанс который сеет сомнения в адекватности воспроизведения таких данных (разниц с предыд. знач.)
1) например если у нас есть цена,
2) мы генерируем ее разницу
3) берем два участка разниц которые очень близки между собой по структуре (ну пусть по евклиду даже)
4) то есть эти участки почти 100% попадут в один кластер в RF или той же нейронке и будут считаться идентичными ситуациями
5) потом берем эти два участка (разницы) и востанавливаем их снова в начальные цены, то есть кумулятивно сумируем
И видим что эти участки абсолютно разные, часто на одном участке идет тренд вверх а на другом тренд вниз, то есть сходства ниакого, а алгоритм то думает что это идентичные участки..
Что вы думаете по этому поводу Алексей? интересный ваш коментарий как человека с опытом
Только есть один интересный нюанс который сеет сомнения в адекватности воспроизведения таких данных (разниц с предыд. знач.)
1) например если у нас есть цена,
2) мы генерируем ее разницу
3) берем два участка разниц которые очень близки между собой по структуре (ну пусть по евклиду даже)
4) то есть эти участки почти 100% попадут в один кластер в RF или той же нейронке и будут считаться идентичными ситуациями
5) потом берем эти два участка (разницы) и востанавливаем их снова в начальные цены, то есть кумулятивно сумируем
И видим что эти участки абсолютно разные, часто на одном участке идет тренд вверх а на другом тренд вниз, то есть сходства ниакого, а алгоритм то думает что это идентичные участки..
Что вы думаете по этому поводу Алексей? интересный ваш коментарий как человека с опытом
Почему же будет так? Если разницы совпадают, то и интегральный ряд совпадет полностью. Если они просто похожи, будут похожи (по тренду) интегральные ряды.
Я хотел Трейдеру сказать, что нужно почитать основы подготовки данных. Никто не подает сырые цены на вход. Это уже обыграно сто тысяч раз. Нестационарные данные ведут к нестационарным зависимостям.