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

 

Кто-нибудь подскажите как сделать кастомную метрику для catboost, нужен Шарп. 

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

preds и target - это return (a[i]-a[i+1])

class Sharpe(object):
    def get_final_error(self, error, weight):
        return error

    def is_max_optimal(self):
        return True

    def evaluate(self, approxes, target, weight):
        assert len(approxes) == 1
        assert len(target) == len(approxes[0])
        preds = np.array(approxes[0])
        target = np.array(target)
        data = [i if i > 0 else -1*i for i in preds]
        sharpe = np.mean(data)/np.std(preds)
        return sharpe, 0

model = CatBoostRegressor(learning_rate=0.1, n_estimators=2000, eval_metric=Sharpe()) 
 
СанСаныч Фоменко #:

Зачем вообще обсуждать корректность оптимизации? Локальный, глобальный - плевать.


Вопрос Дика имеет чисто теоретическое значение и не имеет НИКАКОГО практического значения, так как даже очень правильно найденные экстремумы относятся к ПРОШЛОМУ и с приходом нового бара практически всегда будут новые, неизвестные нам экстремумы.  Давайте вспомним тестер. Находит оптимумы. И что? Грош цена оптимуму из тестера, если нет соображений, что он будут жить в будущем. Но время жизни оптимума НЕ имеет никакого отношения к правильности и корректности поиска этого оптимума, о которых пишет Дик.


моя фамилия не склоняется
вопрос не в том что глобальный изменится или нет (изменится обязательно), а в том, что может ли вообще находить глобальный экстремум. если вам всё равно, то можете просто инициальзировать веса сети случайными числами и всё на этом, ведь какая вообще разница, глобальный... локальный.))
 
Evgeni Gavrilovi #:

Кто-нибудь подскажите как сделать кастомную метрику для catboost, нужен Шарп. 

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

preds и target - это return (a[i]-a[i+1])

Не особо разбираюсь ни в питоне, ни в катбусте, но глупые вопросы задам)

1) Что такое data, почему среднее не от preds?

2) Вроде для градиентного бустинга нужно указать ещё формулы для градиента и гессиана?

 
Aleksey Nikolayev #:

Не особо разбираюсь ни в питоне, ни в катбусте, но глупые вопросы задам)

1) Что такое data, почему среднее не от preds?

2) Вроде для градиентного бустинга нужно указать ещё формулы для градиента и гессиана?

По всей видимости да, что-то пропустил. Использовал шаблон с официального сайта https://catboost.ai/en/docs/concepts/python-usages-examples

data - формируемый список из предсказаний модели, отрицательные значения перевел в положительные, чтобы потом вычислить их среднее арифметическое для Шарпа

 
Evgeni Gavrilovi #:

data - формируемый список из предсказаний модели, отрицательные значения перевел в положительные, чтобы потом вычислить их среднее арифметическое для Шарпа

А зачем? Для Шарпа считается среднее с исходными знаками. 

 
Aleksey Nikolayev #:

А зачем? Для Шарпа считается среднее с исходными знаками. 

Чтобы учитывались также ордера на продажу, допустим есть 2 точных прогноза -0,002 (20 пунктов) и +0,003 (минус - шорт, плюс - лонг)

Прибыль +0,005, среднее 0,0025, а без изменения знака будет 0,0005.


Оказывается для кастомной метрики необходима еще своя лосс-функция, по аналогии class RmseObjective(object)
 
Evgeni Gavrilovi #:

По всей видимости да, что-то пропустил. Использовал шаблон с официального сайта https://catboost.ai/en/docs/concepts/python-usages-examples

Есть два типа метрик loss_function и eval_metric. Вам скорее нужна первая, посмотрите здесь https://catboost.ai/en/docs/concepts/python-usages-examples#user-defined-loss-function

Но может я и ошибаюсь. Здесь есть более лучшие чем я спецы по питону и его восхвалители) Возможно, они вам помогут больше.

 
Evgeni Gavrilovi #:

Чтобы учитывались также ордера на продажу, допустим есть 2 точных прогноза -0,002 (20 пунктов) и +0,003 (минус - шорт, плюс - лонг)

Прибыль +0,005, среднее 0,0025, а без изменения знака будет 0,0005.

Ну это будет не Шарп тогда. Ещё, наверно, нужно не просто брать модуль, а умножать на знак прогноза (на минус один, если продажа и на один, если покупка)

 
Evgeni Gavrilovi #:

Кто-нибудь подскажите как сделать кастомную метрику для catboost, нужен Шарп. 

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

preds и target - это return (a[i]-a[i+1])

Значения запринтуйте какие получаете и сравните с другой метрикой. Запринтуйте сразу для обеих, для каждой итерации. В катбусте ранний останов не забудьте включить по максимуму пользовательского критерия  и “use best model=True” Можете просто Verbose включить, он сам запринтует значения метрик на каждой итерации.
 
Maxim Dmitrievsky #:
Значения запринтуйте какие получаете и сравните с другой метрикой. Запринтуйте сразу для обеих, для каждой итерации. В катбусте ранний останов не забудьте включить по максимуму пользовательского критерия  и “use best model=True” Можете просто Verbose включить, он сам запринтует значения метрик на каждой итерации.

Было бы интересно в исследовательских целях (хоть это и весьма сложно) сделать через кастомную функцию потерь. Возможность для этого есть (если кинуло в начало страницы, то нужно найти в самом низу раздел User-defined loss function).

Usage examples
Usage examples
  • catboost.ai
Regression CatBoostRegressor class with array-like data.
Причина обращения: