Прогнозирование с использованием алгоритма с открытым исходным кодом Facebook Prophet, Streamlit и развертывания веб-приложения на Heroku
В последнее время в Твиттере было много дискуссий об укреплении доллара США по сравнению с большинством африканских валют после начала пандемии Covid-19. Кенийский шиллинг также не остался в стороне, что вызывает множество спекуляций о том, как выглядит ближайшее будущее. Мы можем попытаться ответить на вопрос с помощью прогнозирования временных рядов с помощью Facebook Prophet, только что выпущенного метода прогнозирования, который следует API sklearn
model и реализован на Python.
Я наткнулся на Streamlit, платформу приложений с открытым исходным кодом для машинного обучения, которая легко превращает скрипты Python в общедоступные веб-приложения. Наконец, мы рассмотрим пошаговое развертывание на Heroku.
Создание веб-приложения для прогнозирования с помощью Streamlit
Эта сборка использует Python 3.8. Обратите внимание, что вам необходимо установить пакет PyStan перед установкой пакета Facebook Prophet. Если вы работаете в Windows 10, вам также необходимо установить C++ Build Tools через Visual Studio. Пакеты установлены, как показано ниже:
Данные
Чтобы получить данные об обменном курсе USD-KES, мы будем использовать Yahoo Finance API, который предоставляет данные с низкой задержкой в режиме реального времени для фондового рынка, криптовалют и обмена валюты. Ниже приведен код для загрузки и визуализации данных.
Визуализация тенденций
Из API мы можем загрузить исторические данные, передав параметр period
с самыми ранними доступными данными за 2004 год. API предоставляет Open, High, Close, Low
значений для каждого дня. Код ниже для построения ставок Close
для максимального диапазона лет, доступного с помощью Plotly.
Свечные графики
Свечной график с ползунком диапазона с использованием plotly. Графики свечей используются для технического анализа и могут помочь определить стратегию покупки, продажи или удержания.
Линейные диаграммы
Линейные графики — это обычные графики, которые используются чаще всего. Они используются большинством фундаментальных и технических аналитиков для определения стратегий.
Метод прогнозирования с использованием Facebook Prophet
Использование Prophet для общего анализа временных рядов
Facebook Prophet — это алгоритм с открытым исходным кодом для создания моделей временных рядов, который использует несколько старых идей с некоторыми новыми поворотами. Он особенно хорош при моделировании временных рядов с несколькими сезонностями и не сталкивается с некоторыми из перечисленных выше недостатков других алгоритмов. По своей сути это сумма трех функций времени плюс член ошибки: рост g(t)
, сезонность s(t)
, праздники h(t)
и ошибка e_t
:
#data_fb = data[data.index.year == pd.to_datetime("now").year] data_fb = data[data.index.year >= (pd.to_datetime("now").year-2)] #data_fb = data.copy() data_fb = data_fb.reset_index() data_fb = data_fb[['Date','Close']]
Facebook Prophet прогнозирует данные только в том случае, если они представлены в определенном формате. Кадр данных с данными должен иметь столбец, сохраненный как ds для данных временных рядов и y для прогнозируемых данных.
df = pd.DataFrame() df['ds'] = pd.to_datetime(data_fb['Date']) df['y'] = data_fb['Close'] df.head()
Инициализировать модель и подогнать к ней наш фрейм данных df
m = Prophet() m.fit(df)
Мы хотим, чтобы наша модель предсказывала на следующие 6 месяцев. Частота наших данных составляет 1 месяц и, таким образом, за 6 месяцев. Поэтому нам нужно добавить от 6 до нескольких строк ежемесячных данных в фрейм данных.
future = m.make_future_dataframe(periods=6, freq='M')
Теперь в будущем кадре данных у нас есть только значения ds, и мы должны предсказать значения y.
forecast = m.predict(future) forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper', 'trend', 'trend_lower', 'trend_upper']].tail()
В таблице ds, как известно, данные временного ряда. yhat — прогноз, yhat_lower и yhat_upper — уровни неопределенности (в основном это означает, что прогноз и фактические значения могут варьироваться в пределах уровней неопределенности). Затем у нас есть тренд, который показывает долгосрочный рост, сокращение или стагнацию данных, trend_lower и trend_upper — это уровни неопределенности.
Постройте прогнозные данные.
На изображениях ниже показаны тенденции и сезонность (за год) данных временных рядов. Мы видим тенденцию к увеличению, что означает, что обменный курс со временем увеличивался. Если мы посмотрим на график сезонности, мы увидим, что апрель и декабрь имеют самые высокие показатели в данном году.
Добавьте точки изменения, чтобы указать время быстрого роста тренда. Красные пунктирные линии показывают время, когда произошло быстрое изменение тренда обменного курса.
fig3 = m.plot(forecast) a = add_changepoints_to_plot(fig3.gca(), m, forecast)
Сноски:
Таким образом, мы увидели, как мы можем разработать модель прогнозирования с помощью Facebook Prophet всего с несколькими строками кода, что было бы очень сложно реализовать, используя только традиционные алгоритмы машинного обучения и математические и статистические концепции.
Развертывание на Heroku
Требуемые файлы
Чтобы развернуть приложение Streamlit на Heroku, необходимы указанные ниже дополнительные файлы.
Требования.txt: содержит все необходимые пакеты Python и их версии, необходимые для запуска приложения.
Setup.sh: определяет основные требования к установке для развертывания, как в файле ниже.
mkdir -p ~/.streamlit/echo “\ [server]\n\ port = $PORT\n\ enableCORS = false\n\ headless = true\n\ \n\ “ > ~/.streamlit/config.toml
Наконец, нам нужно выполнить файл установки и Python, для которого требуется Procfile, и он выглядит как команда ниже.
web: sh setup.sh && streamlit run app.py
Пожалуйста, проверьте работающее веб-приложение по этому URL-адресу: https://usd-kes-forecasting.herokuapp.com/