Прогнозирование с использованием алгоритма с открытым исходным кодом Facebook Prophet, Streamlit и развертывания веб-приложения на Heroku

В последнее время в Твиттере было много дискуссий об укреплении доллара США по сравнению с большинством африканских валют после начала пандемии Covid-19. Кенийский шиллинг также не остался в стороне, что вызывает множество спекуляций о том, как выглядит ближайшее будущее. Мы можем попытаться ответить на вопрос с помощью прогнозирования временных рядов с помощью Facebook Prophet, только что выпущенного метода прогнозирования, который следует API sklearnmodel и реализован на 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/