Оптимизированный метод потери денег

TLDR: в последнем выпуске LazyProphet версии 0.3.8 появился новый метод оптимизации. В этой статье мы рассмотрим, как полностью оптимизировать ваши прогнозы в случае использования предсказания цены биткойна и, в конечном итоге, создать надежный метод потери денег.

Ленивый Профет Гитхаб 🏠

Ленивый Пророк Дискорд 🛎

Введение

Во-первых, если вы никогда не слышали о LazyProphet, вам следует ознакомиться со вступительной статьей здесь.

Но, как краткий обзор…

LazyProphet — это просто какая-то причудливая разработка функций для обработки данных временных рядов с помощью LightGBM под капотом. Единственным «интересным» (то есть не найденным ни в одном другом пакете) аспектом является использование специальных взвешенных базисных функций, которые могут повысить производительность. Кроме того, он будет выполнять стандартную процедуру рекурсивного прогнозирования вместе с базисными функциями Фурье для сезонности.

Чтобы получить самую последнюю версию, включающую оптимизацию, выполните установку или обновление pip с помощью:

pip install LazyProphet --upgrade

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

Данные

Теперь, когда у нас есть самая последняя реализация LazyProphet, давайте получим биткойн-данные, которые мы будем использовать:

import yfinance as yf
btc = yf.Ticker("BTC-USD", )
hist = btc.history(start="2022-6-01")
current_df = hist.iloc[:-24]
future_df = hist.iloc[-24:]
y_train = current_df['High'].values
y_test = future_df['High'].values

Мы оставим последние 24 точки для тестирования.

Модель

Метод «Оптимизировать» — это всего лишь метод класса, и его можно легко сконструировать. На выходе получается стандартный объект LazyProphet, но с «оптимальными» гиперпараметрами. Затем вы можете вызвать подгонку и предсказать, как обычно.

from LazyProphet import LazyProphet as lp
lp_model = lp.LazyProphet.Optimize(y_train, seasonal_period=[7], n_folds=2, test_size=12, n_trials=200)
fitted = lp_model.fit(y_train)

Давайте посмотрим на параметры, переданные оптимизатору:

  1. seasonal_period: Это просто, это просто сезонный период! Вы можете передать его в виде списка для обработки нескольких сезонных факторов. Это число также используется при тестировании лагов ar. Максимальное число в списке будет максимальной проверкой задержки. Если максимальное число велико, это значительно увеличит время вычислений.
  2. n_folds: количество сгибов, которое необходимо создать для тестирования. LazyProphet ожидает число больше 1, если вы передадите 1, произойдет ошибка. Чем больше складок вы используете, тем дольше будет длиться один раунд.
  3. test_size: это целое число представляет собой длину данных, удерживаемых для целей тестирования.
  4. n_trials: количество попыток оптимизации с помощью Optuna. Чем выше число — тем дольше длится процесс.

И, наконец, стандартный прогноз:

predicted = lp_model.predict(24)

Если вам интересно или вы хотите сохранить гиперпараметры, вы можете легко получить доступ к атрибутам:

print(lp_model.ar)
print(lp_model.seasonal_period)
print(lp_model.n_basis)
print(lp_model.boosting_params)

Взглянем на результат:

[1, 2, 3, 4, 5] 
None 
5 
{'objective': 'regression', 'metric': 'rmse', 'verbosity': -1, 'boosting_type': 'gbdt', 'seed': 42, 'linear_tree': False, 'learning_rate': 0.1, 'colsample_bytree': 1, 'min_child_samples': 5, 'num_leaves': 72, 'num_iterations': 78}

Оптимизатор решил использовать последние 5 периодов и 5 линейных базисных функций для создания прогноза. Сезонность была исключена — что логично, учитывая проблему.

Далее давайте посмотрим, как этот прогноз выглядит по сравнению с фактическими данными:

import matplotlib.pyplot as plt
import numpy as np
plt.plot(np.append(y_train, y_test))
plt.plot(np.append(fitted, predicted))
plt.vlines(ymax=y_train.max(),
ymin=y_train.min(),
x=len(y_train) + len(y_test) - 24,
color='r',
linestyle='dashed')
plt.show()

Как видите, вывод очень плоский. Это напоминает наивный прогноз. Прогноз действительно пропустил этот всплеск, но я уверен, что каждый прогноз, использующий только исторические данные, также пропустит его. Учитывая, что мы смотрим на цену BTC — наивный прогноз — довольно разумный шаг — но вы, вероятно, потеряете свои деньги, если будете инвестировать по этой стратегии.

Заключение

Как я уже говорил ранее в статье, основная цель состояла в том, чтобы показать реализацию оптимизатора, а НЕ показать полезный пример прогнозирования цены BTC. Учитывая это, кажется, что оптимизатор выбрал разумный образ действий.

Одно важное предостережение — здесь задействованы случайные процессы, поэтому вы можете получить совершенно разные результаты в зависимости от случайного начального числа. Так что будьте осторожны!

Если вам понравилась эта статья, не забудьте подписаться на мою рассылку, и вот несколько других статей, которые могут вам понравиться:





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

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

Нейросетевой апокалипсис приближается к области временных рядов, но его еще нет!

Вы можете купить мне кофе ☕️, став участником Medium по моей ссылке:



Подпишитесь на DDIntel Здесь.

Посетите наш сайт здесь: https://www.datadriveninvestor.com

Примените код: DDI2022, чтобы получить СКИДКУ 30% на РАСПРОДАЖУ в Черную пятницу.