Фондовые рынки представляют собой пул неопределенности, они резко падают в один момент и взрываются в другой. Последние разработки продемонстрировали, что трейдеры выбирают методы и инструменты для прогнозирования динамики акций, и все они основаны на концепциях искусственного интеллекта и машинного обучения. В этом блоге мы создадим модель машинного обучения, которая обучается на данных в реальном времени из текущих рыночных тенденций и прогнозирует стоимость акций в любой момент времени.

Эта статья также является частью инициативы MSP Developer Stories в рамках программы Microsoft Student Partners (Индия).

Репозиторий проекта на Github: Нажмите здесь

Обзор проекта

Цель: мы создадим веб-приложение, которое прогнозирует максимальную стоимость акций MSFT в любой заданный DateTime в зависимости от данных о запасах в реальном времени.

Модель будет создана с использованием линейной регрессии в конструкторе машинного обучения Azure и обучена на данных из yfinance API. Данные будут загружены локально, а затем отправлены в хранилище BLOB-объектов Azure. Предварительно мы напишем триггер с помощью пакета SDK для Azure ML Python, который запускает конвейер обучения при каждой загрузке данных в хранилище BLOB-объектов. Таким образом, модель всегда будет обучаться на последних данных о запасах MSFT. Конвейер будет развернут посредством логического вывода в реальном времени, который предоставляет конечную точку для получения прогнозов в реальном времени от модели. Весь процесс будет автоматизирован с помощью веб-приложения во флаконе.

Давайте начнем. 🚀

Предварительные условия

  1. Знание Python, вызовов REST API и машинного обучения.
  2. Активная подписка Azure. Вы можете использовать Azure для студентов, чтобы получить бесплатную подписку, или же вы можете использовать бесплатную учетную запись Azure.

Краткий обзор нашего маршрута

  1. Загрузка базы данных акций MSFT с помощью финансового API Yahoo.
  2. Отправка базы данных в хранилище BLOB-объектов Azure.
  3. Обучение модели на данных с использованием линейной регрессии и создание конечной точки вывода в реальном времени посредством развертывания в кластере AKS.
  4. Запуск конвейера машинного обучения для повторного обучения модели при изменении БД в хранилище больших двоичных объектов.
  5. Создание веб-приложения, которое автоматизирует все вышеперечисленные процессы и добавляет функциональность пользователю.

Шаг 1. Загрузка базы данных акций MSFT с помощью финансового API Yahoo

Yahoo Finance предоставляет финансовые новости, данные и комментарии, включая котировки акций, пресс-релизы, финансовые отчеты и оригинальный контент о фондовых рынках. Yahoo Finance API помогает запрашивать всю информацию о финансах, акциях, котировках, движущих силах и т. Д. Он устарел, и многие программы, использующие его, перестали работать. Однако yfinance стремится решить эту проблему, предлагая надежный, многопоточный и питонический способ загрузки исторических рыночных данных с Yahoo! финансы. Его исходный код открыт на Github, и его можно найти здесь.

  • Создайте рабочий каталог / папку на вашем компьютере.
  • Перед тем, как начать, давайте создадим виртуальную среду в нашем каталоге, чтобы избежать конфликта с сайтами-пакетами.
  • Откройте свой терминал и выполните следующие действия в том же порядке.
dir> pip install virtualenv 
dir> virtualenv venv
  • Это устанавливает и создает виртуальную среду для всех зависимостей. Активируйте виртуальную среду, перейдя к файлу activate.bat.
dir> venv\Scripts\activate
  • Теперь клонируйте репозиторий yfinance в свой локальный каталог и выполните следующее в своем терминале.
pip install --r requiremnets.txt
  • После успешной установки всех зависимостей создайте в корне новый файл с именем fetchdb.py и вставьте в него следующий код.
import yfinance as yf
from datetime import datetime, timedelta
x=datetime.now()
date_N_days_ago = datetime.now() - timedelta(days=7)
msft = yf.Ticker("MSFT")
data_df = yf.download("MSFT",
start=date_N_days_ago.strftime("%Y"+"-"+"%m"+"-"+"%d"), interval="1m", end=x.strftime("%Y"+"-"+"%m"+"-"+"%d"))

data_df.to_csv('ds.csv')
  • Следующий код загружает значения акций MSFT с интервалом в 1 минуту за последние 7 дней в файл с именем ds.csv.
  • Выполните приведенный выше код, запустив python fetchdb.py в своем терминале. При успешном выполнении вы найдете ds.csv в корневом каталоге.

Шаг 2. Загрузка базы данных в хранилище BLOB-объектов Azure

Хранилище BLOB-объектов Azure - это решение Microsoft для хранения объектов в облаке. Хранилище BLOB-объектов оптимизировано для хранения больших объемов неструктурированных данных. Мы загрузим наш набор данных ds.csv в большой двоичный объект, а оттуда загрузим его как набор данных в наш конвейер машинного обучения.

Чтобы получить доступ к хранилищу BLOB-объектов, нам нужна учетная запись хранения. Когда мы создаем рабочее пространство Azure ML, оно создается по умолчанию. Итак, давайте сначала создадим рабочее пространство.

  • Войдите на портал Azure и найдите Машинное обучение.
  • Перейдите на страницу Azure ML и нажмите «Добавить».
  • Создайте свое рабочее пространство, заполнив детали. Создайте новую группу ресурсов для всех ваших ресурсов Azure, связанных с этим проектом. Базовая версия также должна хорошо работать для этого проекта, но выберите версию Enterprise на случай, если вы хотите запустить auto-ml.

  • После развертывания рабочей области найдите «учетные записи хранения» и перейдите на страницу учетных записей хранения. Щелкните учетную запись хранения, созданную в группе ресурсов рабочей области машинного обучения, и перейдите на главную страницу.
  • На главной странице перейдите в обозреватель хранилища и добавьте папку (контейнер) в «КОНТЕЙНЕРЫ BLOB». Эта папка будет контейнером для вашего набора данных.

  • Затем перейдите к клавишам доступа и скопируйте строку подключения под ключ1.

  • Откройте CMD и настройте переменную среды, выполнив следующие действия. Не забудьте вставить строку подключения.
setx AZURE_STORAGE_CONNECTION_STRING "<your-conntn-string>"
  • Затем вернитесь в свой локальный каталог и установите следующие
pip install azure.storage.blob
  • Создайте в корневом каталоге проекта новый файл с именем upload_to_blob.py и вставьте в него следующий код.
import os, uuid
from azure.storage.blob import BlobServiceClient, BlobClient, ContainerClient
try:
    connect_str = os.getenv('AZURE_STORAGE_CONNECTION_STRING')
    # print(connect_str)
    # Create the BlobServiceClient object which will be used to create a container client
    blob_service_client = BlobServiceClient.from_connection_string(connect_str)
    # Create a unique name for the container
    container_name = "<your-containername-from-blob-storage>"
    # Create a file in local data directory to upload and download
    local_path = "./"
    local_file_name = "ds.csv"
    upload_file_path = os.path.join(local_path, local_file_name)
# Create a blob client using the local file name as the name for the blob
    blob_client = blob_service_client.get_blob_client(container=container_name, blob=local_file_name)
     # Instantiate a ContainerClient
    container_client = blob_service_client.get_container_client("datasetcontainer")
# Upload the created /file
    with open(upload_file_path, "rb") as data:
        blob_client.upload_blob(data)
  
except Exception as ex:
    print('Exception:')
    print(ex)

Следующий код загружает файл ds.csv в виде большого двоичного объекта в контейнер, который мы создали ранее.

  • Выполните приведенный выше код и перейдите в свою учетную запись хранения, чтобы проверить, успешно ли загружен большой двоичный объект.
  • После того, как большой двоичный объект загружен, для каждого изменения сейчас этот большой двоичный объект должен быть удален, а затем снова загружен с последними данными. Следовательно, мы добавляем в файл container_client.delete_blob(“ds.csv”) before
with open(upload_file_path, "rb") as data:
        blob_client.upload_blob(data)

Шаг 3. Обучение модели на данных с использованием линейной регрессии и создание конечной точки вывода в реальном времени посредством развертывания в кластере AKS.

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

  • Перейдите на портал Azure и перейдите на страницу машинного обучения. Нажмите на свой проект и запустите студию. Выберите свое рабочее место и займите его.
  • Теперь перейдите в хранилища данных.

  • Создайте новое хранилище данных, введя желаемое имя хранилища данных, выберите тип хранилища BLOB-объектов Azure и выберите идентификатор подписки. Тщательно выберите свою учетную запись хранения и выберите контейнер больших двоичных объектов, который вы создали ранее. Выберите тип аутентификации в качестве ключа учетной записи и введите ключ учетной записи из раздела Ключ доступа в разделе Ключ1 своей учетной записи хранения из шага 2. Нажмите "Создать".

В случае успеха вы должны увидеть свое хранилище данных на странице хранилища данных.

  • Затем нажмите «Наборы данных» на левой панели и создайте новый набор данных из своего хранилища данных. Введите имя набора данных и выберите тип как табличный. Выберите хранилище данных, которое вы создали выше, и найдите свой файл ds.csv. В настройках установите «Заголовки столбцов» на «Использовать заголовки из первого файла». Для схемы исключите последние два столбца, как показано ниже. Нажмите "Создать".

  • Перейдите к конвейерам и создайте новый конвейер. В запросе настроек на правой панели нажмите «Выбрать цель вычислений» и создайте новую цель вычислений.

  • Создайте следующий поток конвейера и настройте разделение данных, линейную регрессию и обучение блоков модели, как описано ниже:

Разделить данные: установите для параметра «Доля строк в первом выходном наборе данных» значение 0,7.

Линейная регрессия: установите для параметра "Количество тренировочных эпох" значение 1000.

Обучение модели. Этот конвейер фактически обучает две модели, хотя мы не могли развернуть их обе вместе через конечную точку в реальном времени. Причина в том, что у них всего две модели, каждая из которых обучена на High и Low соответственно. Нажмите на модель поезда и выберите «Обозначить столбец» как «Высокий» для одного и «Низкий» для другого.

Нажмите «Отправить», чтобы запустить конвейер и обучить модель.

  • После обучения модели щелкните блок Evaluate model и просмотрите результаты оценки.

  • Теперь создайте конвейер вывода в реальном времени, сначала выбрав один блок модели обучения и нажав «Создать вывод в реальном времени». После этого конвейер реального времени готов к развертыванию для этой модели.
  • Разверните конвейер вывода в реальном времени в кластере вывода, то есть кластере AKS. Для этого следуйте инструкциям на экране.
  • При успешном развертывании перейдите к конечным точкам ›конечным точкам в реальном времени и протестируйте свою модель. Скопируйте код Python из вкладки потребления и попробуйте запустить его из локального каталога.

Шаг 4. Запуск конвейера машинного обучения для повторного обучения модели при изменении БД в хранилище больших двоичных объектов.

После того, как модель обучена и готова, ее необходимо своевременно переобучить и развернуть, чтобы обеспечить прогнозы в реальном времени. Следовательно, нам нужно запустить конвейер извне из веб-приложения.

  • Щелкните Блокноты в строке меню, создайте новый пустой блокнот и введите следующий код в ячейки.
import azureml.core
from azureml.core import Workspace
from azureml.pipeline.core import Pipeline, PublishedPipeline
from azureml.core.experiment import Experiment
from azureml.core.datastore import Datastore

ws = Workspace.from_config()

experiments = Experiment.list(ws)
for experiment in experiments:
    print(experiment.name)
    

published_pipelines = PublishedPipeline.list(ws)
for published_pipeline in  published_pipelines:
    print(f"{published_pipeline.name},'{published_pipeline.id}'")

#experiment_name = "<Your-pipelin-name>" 
#pipeline_id = "<your-pipeline-id>"
  • После выполнения приведенного выше кода выберите имя эксперимента и конвейер из выходных данных, обновите последние две строки, раскомментируйте и снова запустите ячейку. Следуйте этому, запустив приведенный ниже код в другую ячейку.
from azureml.pipeline.core.schedule import ScheduleRecurrence, Schedule

datastore = Datastore(workspace=ws, name="mydatastore")

reactive_schedule = Schedule.create(ws, name="MyReactiveSchedule", description="Based on input file change.",
        pipeline_id=pipeline_id, experiment_name=experiment_name, datastore=datastore, data_path_parameter_name="input_data")
  • В случае успеха у вас есть триггер.

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

  • Я создал веб-приложение с использованием flask и соответствующим образом интегрировал весь приведенный выше код в маршрут приложения до дома. Загляните в мой репозиторий здесь.
  • Вы можете создать новый каталог и клонировать все репо. Создайте виртуальную среду и активируйте ее.
  • Запустите pip install --r requirements.txt, чтобы установить все зависимости.
  • Обязательно отредактируйте конечную точку вывода в реальном времени в файле views.py перед развертыванием.
  • Выполните run flask в своем терминале, чтобы обслуживать приложение локально.

Полученные результаты

Приложение предсказывает максимальное значение или High для акций MSFT, поскольку мы развернули вывод в реальном времени, выбирая модель, обученную в столбце «High». Пользователь может либо использовать параметры акций, например, Open, High, Close и Low из текущего обзора рынка, чтобы предсказать будущую максимальную стоимость акций MSFT, либо выбрать для них исходные данные, чтобы игнорировать текущую тенденцию. Веб-сайт также показывает текущее состояние рынка, то есть открыт или закрыт, и показывает текущую стоимость, когда рынок открыт. Когда рынок закрыт, отображаются значения Open, High, Low и Close, и все прогнозы основаны на недельной базе данных до закрытия рынка.

Сделаем прогноз для максимальных предельных значений акций на 20.30 по местному времени.

Результаты представлены ниже.

Модель предсказывает, что максимальная стоимость акций не превысит 183,51 в 20:30, и вот что происходит :)

Каждый раз, когда пользователь нажимает кнопку отправки, обучающий конвейер запускается в студии ML из-за обновления набора данных в Blob. Однако для получения последних результатов необходимо вручную развернуть конечную точку. Я поднял вопрос на Github с просьбой о поддержке SDK для этого же.

Любой, кто хочет предоставить параметры своих запасов для прогнозирования будущих тенденций, может просто щелкнуть «Нет» в поле с переключателем и ввести 4 соответствующих значения.

ЖИВАЯ ДЕМО

Веб-приложение размещено в реальном времени, нажмите здесь, чтобы просмотреть живую демонстрацию. Однако, если моих ежемесячных кредитов недостаточно, считайте это неудачей.

Заключение

Машинное обучение очень просто с помощью студии машинного обучения Azure. Это революция для всех, кто занимается обучением моделей и целыми днями оптимизирует их. Конечно, это позволяет любому, у кого практически нет опыта в ML, обучать и использовать модели.

И для этого проекта точность всегда вызывает сомнения на фондовых рынках, но здесь у нас все получилось очень хорошо, MSE была очень низкой. Я забыл обрезать график оценки, и теперь мои кредиты истекли. Конечно, точность оставляет желать лучшего.

Надеюсь, вам понравился этот простой проект.

Ура :)

Только сегодня команда Microsoft Azure ML ответила на мою проблему на GitHub, касающуюся развертывания конечной точки в реальном времени с помощью SDK. У нас было обсуждение на встрече, и обновление уже готово. 😉 🔥

Дальнейшее чтение