В этом посте я представлю свой алгоритм бессерверного инвестирования с использованием AWS Lambda, Facebook Prophet в качестве модели машинного обучения и собственного слоя Lambda.

Я разделил этот пост на «Почему я это сделал» и «Технические инструкции». Если вы хотите пропустить часть «Почему», смело переходите сразу к технической части.

Зачем мне развертывать модель машинного обучения в AWS Lambda?

1. Надежность: алгоритм будет выполняться независимо от других систем, обновлений и т. д.

2. Эффективность производительности: я могу запускать несколько алгоритмов на одной (небольшой) системе, независимо друг от друга.

3. Экономия средств: AWS позволяет использовать 3,2 миллиона вычислительных секунд в месяц, что позволяет мне запускать все мои алгоритмы бесплатно.

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

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

Прямо сейчас я могу запустить несколько вариантов алгоритма, чтобы проверить изменения алгоритма и быть уверенным, что он будет работать. Еще одна приятная вещь? AWS предлагает около 1 миллиона бесплатных вызовов Lambda, что позволяет мне запускать всю архитектуру на ее бесплатном уровне.

Алгоритм инвестирования

Я собираюсь объяснить алгоритм более подробно в другом посте на моем веб-сайте www.datafortress.cloud, но моя типичная настройка алгоритма инвестирования состоит из:

  1. Тестирование алгоритма с использованием Backtrader, фреймворка для тестирования с открытым исходным кодом, написанного на python.
  2. Преобразование успешного алгоритма в один файл Python, содержащий метод run(), который возвращает сделанные инвестиции.
  3. Передача файла python в AWS Lambda, где я вызываю функцию run() с функцией lambda_handler AWS Lambda.

В этом примерном алгоритме я принимаю инвестиционные решения в зависимости от того, находится ли текущая цена выше или ниже линии тренда, предсказанной моделью пророка Facebook. Я взял идеи у Шона Келли, который написал настройку Backtrader о том, как использовать пророка с Backtrader.

Моя вселенная акций в этой настройке рассчитывается путем выбора 20 лучших акций из индекса SPY500, которые добились наибольшей доходности за последние X временных шагов.

Источником данных является Yahoo Finance с использованием бесплатной библиотеки yfinance, а в качестве алгоритмического брокера я выбрал Alpaca.markets.

В моей настройке алгоритм будет выполняться один раз в день в 15:00. или каждые 15 минут в течение торговых часов.

Проблемы с развертыванием Facebook Prophet на AWS Lambda

AWS Lambda поставляется с некоторыми предустановленными библиотеками Python, но, как многие из вас, возможно, знают, по умолчанию они довольно ограничены (что разумно для обещаний Lambda). Тем не менее, Lambda позволяет устанавливать приватные пакеты, что довольно просто для небольших пакетов (см. официальную документацию), но становится немного сложнее, если речь идет о пакетах размером более 250 Мб. К сожалению, модель пророка Facebook выходит за эти границы, но, к счастью, Александр Маценов решил эту проблему, уменьшив размер пакета, а Марк Мец решил проблемы с компиляцией, чтобы заставить ее работать на AWS Lambda.

Библиотеки не по умолчанию можно добавить в AWS Lambda с помощью слоев, которые содержат все необходимые пакеты. Если слой импортирован, вы можете просто импортировать пакеты в свою функцию python, как если бы вы делали это в своей локальной настройке.

Как (техническое)

Наконец, позвольте мне объяснить, как именно вы можете этого добиться. См. этот TLDR для нетерпеливых или более подробную версию ниже.

TLDR;

  1. Вам понадобится Lambda Layer, загрузите мой (скачать), содержащий Prophet, yfinance, … в корзину S3 (приватный доступ)
  2. Выберите AWS Lambda, создайте функцию, добавьте слой и вставьте URL-адрес объекта S3.
  3. Вставьте свой lambda_function.py в редактор Lambda (или используйте мой)
  4. Настройте переменные среды (необязательно)
  5. Либо запустите его вручную, нажав «тест», либо перейдите в CloudWatch -> Правила -> Создать правило и настройте «Расписание выполнения» для его запуска в указанный интервал времени.

Подробное объяснение:

1. Создание пользовательского слоя для AWS Lambda

Вы можете использовать мой слой Lambda, содержащий Facebook Prophet, NumPy, pandas, alpaca-trading-API, yfinance (GitHub), или скомпилировать свой собственный, используя объяснение, данное Marc.

Использование моего лямбда-слоя

  1. Загрузите zip-файл из моего репозитория Github, содержащий все пакеты (Ссылка).
  2. Поскольку вы можете напрямую загружать слои в Lambda только до размера 50 МБ, нам сначала нужно загрузить файл в AWS S3.
  3. Создайте ведро и поместите в него загруженный zip-файл. Доступ может оставаться закрытым и НЕ обязательно должен быть общедоступным! Скопируйте URL-адрес в свой файл (например, https://BUCKETNAME.s3.REGION.amazonaws.com/python.zip).
  4. Войдите в AWS и перейдите в Lambda -> Layers (EU Central Link).
  5. Нажмите «Создать слой», дайте ему соответствующее имя и выберите «Загрузить файл с Amazon S3» и скопируйте в него код шага 3. В качестве среды выполнения выберите Python 3.7. Нажмите создать.

Создание собственного лямбда-слоя

Пожалуйста, следуйте инструкциям Марка.

2. Настройка функции AWS Lambda

  1. Откройте панель функций Lambda (Центральная ссылка ЕС) и нажмите Создать функцию.
  2. Оставьте флажок «Автор с нуля» как есть и дайте ему подходящее имя.
  3. В «Время выполнения» выберите Python 3.7, оставьте все остальное как есть и нажмите «Создать функцию».
  4. В обзоре вкладки «конструктор» вы увидите графическое представление вашей лямбда-функции. Нажмите на поле «Слои» под ним и нажмите «Добавить слой». Если вы правильно настроили слой, вы сможете выбрать его в следующем диалоге. Наконец, нажмите «Добавить».
  5. На вкладке Дизайнер выберите свою лямбда-функцию. Если вы прокрутите вниз, вы увидите фрагмент кода Python по умолчанию в файле с именем lambda_function.py. Если вы структурировали свой код так же, как мой (Ссылка), вы можете выполнить свою функцию с помощью функции run(). Если вызывается функция Lambda, она выполнит функцию lambda_handler(event, context), из которой вы могли бы, например. вызвать функцию run(). Конечно, вы можете переименовать все файлы и функции, но для простоты этого проекта я оставил все как есть.
  6. Не стесняйтесь просто вставить моя функция и протестировать ее.
  7. Нажатие «Тест» должно привести к успешному выполнению, в противном случае в диалоговом окне будут указаны ошибки.

3. Использование переменных среды в AWS Lambda

Вы никогда не должны оставлять имя пользователя и пароль открытым текстом в своем коде, поэтому вы всегда должны использовать переменные среды! К счастью, Lambda их тоже использует, и их можно легко вызвать с помощью пакета python os. Например. в моем скрипте я вызываю пользовательскую переменную с помощью os.environ[‘ALPACAUSER’]. Переменные среды можно настроить на главном экране функций Lambda при прокрутке вниз под редактором кода.

4. Запуск функций AWS Lambda через заданный интервал времени

Концепция бессерверных вычислений и AWS Lambda основана на идее, что функция выполняется, когда происходит событие триггера. В моей настройке я хотел, чтобы функция вызывалась, например. каждые 15 минут в рабочее время с понедельника по пятницу. К счастью, AWS предлагает способ инициировать событие без необходимости запуска сервера, используя сервис CloudWatch.

  1. Зайдите в CloudWatch (Центральная ссылка ЕС).
  2. В левой панели выберите «События» и «Правила».
  3. Нажмите Создать правило и выберите Расписание вместо Шаблон события. Здесь вы можете использовать простой диалог Фиксированная скорость или создать выражение cron. Я использую https://crontab.guru/ (бесплатно) для создания выражений cron. Мое выражение cron для вышеупомянутого варианта использования: 0/15 13–21 ? *ПН-ПТ*.
  4. На правой панели выберите «Добавить цель» и выберите свою лямбда-функцию. Он будет автоматически добавлен в Lambda.
  5. Наконец, нажмите «Настроить детали», дайте ему имя и нажмите «Создать правило».

5. (опционально) Анализ журнала, поиск ошибок

Если вы добрались до этой части, вы должны сделать это! Но если вы хотите проверить, все ли работает, вы можете использовать CloudWatch, чтобы посмотреть на выходные данные функций Lambda. Перейдите в CloudWatch -> Журналы -> Группы журналов (Центральная ссылка ЕС) и выберите свою функцию Lambda. В этом обзоре вы сможете увидеть вывод ваших функций.

Если вам понравился этот пост, оставьте комментарий или зайдите в мой блог www.datafortress.cloud, чтобы мотивировать меня 😊.