Обсуждение статьи "Градиентный бустинг (CatBoost) в задачах построения торговых систем. Наивный подход"

 

Опубликована статья Градиентный бустинг (CatBoost) в задачах построения торговых систем. Наивный подход:

Обучение классификатора CatBoost на языке Python и экспорт модели в mql5 формат, а также разбор параметров модели и кастомный тестер стратегий. Для подготовки данных и обучения модели используется язык программирования Python и библиотека MetaTrader5.

Скомпилировав бота, можно проверить его в штатном MetaTrader 5 тестере. Не забывайте правильно выбрать тайм-фрейм (должен быть таким же как при обучении модели), а также про инпуты  look_back и MA_period, которые также аналогичны параметрам из Python программы. Проверим модель на периоде обучения (тренировочная + валидационная выборки):

Производительность модели (тренировочная + валидационная выборки)

Если сравнить результат с результатом кастомного тестера, то они одинаковы, за исключением некоторых отклонений в спредах. Теперь протестируем модель на совершенно новых данных, с начала года:

Производительность модели на новых данных

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

Автор: Maxim Dmitrievsky

 

Перемешивать тут не стоит

train_X, test_X, train_y, test_y = train_test_split(X, y, train_size = 0.5, test_size = 0.5, shuffle=True)

Как пишут в справке https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html

shuffle bool, default=True

Whether or not to shuffle the data before splitting. If shuffle=False then stratify must be None.

Перемешиваются данные до разделения, т.е. в train попадут некоторые примеры из test.

В целом статья понравилась, показывает, что можно достаточно просто внедрить и использовать ИИ в торговле.

sklearn.model_selection.train_test_split — scikit-learn 0.23.2 documentation
  • scikit-learn.org
*arrays , **options ¶ Quick utility that wraps input validation and and application to input data into a single call for splitting (and optionally subsampling) data in a oneliner. Parameters *arrays Allowed inputs are lists, numpy arrays, scipy-sparse matrices or pandas dataframes. test_size If float, should be between 0.0 and 1.0 and represent...
 
Можете сделать последний график из статьи, но без перемешивания?
Полагаю, что валидация ухудшится, а тест на неизвестных данных может улучшиться.
 
elibrarius:

Перемешивать тут не стоит

Как пишут в справке https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html

Перемешиваются данные до разделения, т.е. в train попадут некоторые примеры из test.

В целом статья понравилась, показывает, что можно достаточно просто внедрить и использовать ИИ в торговле.

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

 

Вот это я не понял:

if dataset['close'][i] >= (dataset['close'][i + rand]):
            labels.append(1.0)
        elif dataset['close'][i] <= (dataset['close'][i + rand]):
            labels.append(0.0)              
        else:
            labels.append(0.0)

Красным помечены условия, которые никогда не сработают. 

 
Stanislav Korotky:

Вот это я не понял:

Красным помечены условия, которые никогда не сработают. 

здесь ничего страшного, менял условия - остались артефакты

 
Maxim thank you a thousand time for sharing such articles...
Especially for the importation of the python model on mql5.
Because I am not an ALGLIB expert but I strongly think that XGBoost CATBoost and Pytorch are by far superiors to do machine and deep learning.
 
Очень интересная работа! Спасибо автору.
 
Возник вопрос, связанный со статьей не напрямую, а опосредованно, через зависимость от CatBoost.

Может ли кто-нибудь на пальцах объяснить, каким образом внутри CatBoost (или более обобщенно - в histogram-based gradient boosting decision tree) делается разделение по характеристике (входной переменной) на основе гистограммы? Понятно, что для каждого бина (столбика гистограммы) подсчитывается статистика: общее число попаданий векторов со значением в диапазоне бина и их разбивка по принадлежности к выходным классам (в данном случае, двум). И вот имея гистограмму с этой статистикой, как дальше выбрать разделение для создания дерева следующего уровня?

 
Stanislav Korotky:
Возник вопрос, связанный со статьей не напрямую, а опосредованно, через зависимость от CatBoost.

Может ли кто-нибудь на пальцах объяснить, каким образом внутри CatBoost (или более обобщенно - в histogram-based gradient boosting decision tree) делается разделение по характеристике (входной переменной) на основе гистограммы? Понятно, что для каждого бина (столбика гистограммы) подсчитывается статистика: общее число попаданий векторов со значением в диапазоне бина и их разбивка по принадлежности к выходным классам (в данном случае, двум). И вот имея гистограмму с этой статистикой, как дальше выбрать разделение для создания дерева следующего уровня?

Деревья строятся независимо друг от друга, а потом происходит подсчет в листьях (перебор по отквантованным предикторам) таким образом, что бы уменьшалась ошибка по градиенту.

При выборе предикторов для построения дерева и сплитов  дерева используются рандомные коэффициенты, что дает возможность, в теории, увеличивать полноту (Recall) и препятствовать переобучению.

 
Stanislav Korotky:
Возник вопрос, связанный со статьей не напрямую, а опосредованно, через зависимость от CatBoost.

Может ли кто-нибудь на пальцах объяснить, каким образом внутри CatBoost (или более обобщенно - в histogram-based gradient boosting decision tree) делается разделение по характеристике (входной переменной) на основе гистограммы? Понятно, что для каждого бина (столбика гистограммы) подсчитывается статистика: общее число попаданий векторов со значением в диапазоне бина и их разбивка по принадлежности к выходным классам (в данном случае, двум). И вот имея гистограмму с этой статистикой, как дальше выбрать разделение для создания дерева следующего уровня?

Лучше у разрабов спрашивать