Оптимизированный метод потери денег
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)
Давайте посмотрим на параметры, переданные оптимизатору:
- seasonal_period: Это просто, это просто сезонный период! Вы можете передать его в виде списка для обработки нескольких сезонных факторов. Это число также используется при тестировании лагов ar. Максимальное число в списке будет максимальной проверкой задержки. Если максимальное число велико, это значительно увеличит время вычислений.
- n_folds: количество сгибов, которое необходимо создать для тестирования. LazyProphet ожидает число больше 1, если вы передадите 1, произойдет ошибка. Чем больше складок вы используете, тем дольше будет длиться один раунд.
- test_size: это целое число представляет собой длину данных, удерживаемых для целей тестирования.
- 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% на РАСПРОДАЖУ в Черную пятницу.