Введите биржевые котировки в приложение и позвольте ему выполнить свою работу, а также разверните веб-приложение в Интернете.

В предыдущей статье я подробно объяснил, как легко получить биржевые данные, проанализировать их и использовать библиотеку PyPortfolioOpt для оптимизации портфеля для достижения максимального коэффициента Шарпа. Сегодня мы расширим эту статью и объединим все в веб-приложение. Я рекомендую вам прочитать эту статью для более подробной информации о том, как все работает.



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

Весь необходимый код находится в этом репозитории GitHub. Внутри вы найдете блокнот Jupyter Notebook (необязательно), в котором подробно описаны шаги по оптимизации портфеля и анализ акций, которые я объяснял в предыдущей статье. Не стесняйтесь играть с ним, если хотите. Полный код веб-приложения Streamlit находится в папке portfolio_optimization_streamlit. Давайте погрузимся прямо в!

1. Импорт

Сначала вам нужно создать файл app.py и добавить импорт. Прежде чем сделать это, выполните установку pip для библиотеки PyPortfolioOpt: pip install PyPortfolioOpt

Библиотеки используются либо для обработки данных о запасах, либо для представления данных в веб-приложении. Например, библиотека pandas_datareader позволяет нам получать данные о ценах на акции. Библиотека PyPortfolioOpt (импортированная как pypfopt) позволяет нам легко оптимизировать портфель акций и выполнять визуализацию данных. Plotly позволяет нам создавать интерактивные диаграммы для размещения в нашем приложении.

Далее мы добавляем 2 функции ниже:

  • Первая функция позволяет нам взять DataFrame цен на акции и построить график их кумулятивной доходности.
  • Вторая функция позволяет нам визуализировать риск и доходность нашего портфеля вдоль эффективной границы по сравнению с другими случайно сгенерированными портфелями. Этот код взят из документации PyPortfolioOpt. Не стесняйтесь просматривать блокнот Jupyter в моем репозитории GitHub или предыдущую статью, чтобы увидеть их результаты.

2. Пользовательский ввод

Следующая часть кода настраивает поля ввода пользователя. Мы позволяем пользователю вводить список биржевых котировок для включения в портфель, а также даты начала и окончания, в течение которых анализируется портфель.

Поля ввода для даты начала и окончания разделены на 2 столбца, с датой начала по умолчанию 01.01.2013 (не стесняйтесь изменить ее), а датой окончания по умолчанию является текущая дата. Они хранятся в переменных start_date и end_date соответственно. Мы также просим пользователей ввести строку биржевых котировок, разделенную запятыми, прежде чем сохранить ее в tickers_stringи разбить на tickers список.

3. Обработка ошибок

Следующая часть кода — это try, except циклов для обработки ошибок. Если пользователь введет неправильный тикер или введет символы в неправильном формате (не разделенные запятыми и т. д.), код внутри цикла try не будет выполняться. Последнее, что нам нужно, — это отобразить на странице фрагмент вывода ошибок Python.

Вместо этого мы показываем пользователю небольшую подсказку, чтобы он ввел правильные символы тикера в правильном формате. Это делается в приведенном ниже цикле except, который запускается, если в какой-либо части цикла try возникает ошибка.

4. Получите цены на акции и создайте графики

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

  • Строка 2 кода использует библиотеку pandas_datareader для удобного получения соответствующих курсов акций из Интернета.
  • Строка 4 отвечает за график зависимости цены каждой акции от времени.
  • В строке 6 представлена ​​суммарная кумулятивная доходность каждой акции, что дает более объективное сравнение акций во времени.
  • Строки 8 и 9 затем вычисляют и строят корреляционную матрицу между всеми акциями.

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

5. Оптимизируйте портфель

Вот тут и проявляется магия библиотеки PyPortfolioOpt. Следующий сегмент кода позволяет нам оптимизировать портфель, получить веса ​​каждой составляющей акции и визуализировать их риск и доходность на графике. Если вы столкнетесь с какими-либо терминами ниже, которые вы хотите подробно изучить, не стесняйтесь ссылаться на мою предыдущую статью в любой момент. В противном случае достаточно знать, что оптимизированный портфель — это тот, который максимизирует ожидаемую доходность к соотношению риска.

  • Строка 2 кода вычисляет средний годовой доход каждой акции, а строка 3 вычисляет ковариационную матрицу акций. Не беспокойтесь слишком о математике, эти 2 переменные просто потребуются в качестве входных данных для функции оптимизатора портфеля позже.
  • В строке 6 используется функция, полученная нами ранее из документации, для графического построения и визуализации рисков и доходности нашего портфеля вдоль кривой эффективной границы по сравнению с другими случайно сгенерированными портфелями.
  • Строки 7 и 8 сохраняют приведенный выше график в изображение png для последующего отображения в веб-приложении.
  • В строках 11 и 12 показано, как легко найти оптимизированный портфель с помощью APIPyPortfolioOpt. Просто создайте объект EfficientFrontier и примените метод max_sharpe, чтобы найти портфель с лучшим соотношением доходности к риску. Мы также передаем безрисковую ставку, которая соответствует норме прибыли, которую мы можем получить без какого-либо риска. Мы обычно используем для этого доходность казначейских облигаций США, которая в настоящее время составляет около 2%. Ознакомьтесь с другими методами оптимизации в документации PyPortfolioOpt.
  • Строки с 13 по 16 позволяют нам извлечь веса ​​отдельных акций и сохранить их в DataFrame, а также показатели эффективности портфеля, такие как среднегодовая доходность, волатильность и коэффициент Шарпа.

6. Создайте оптимизированный портфель

Теперь, когда у нас есть веса портфеля, мы умножаем каждый вес на соответствующую цену акции и сохраняем оптимизированный портфель в качестве дополнительного столбца в DataFrame цен акций, который мы создали ранее. Это дает нам историческую производительность портфеля за определенный период времени. Это делается в строках со 2 по 4 приведенного ниже кода.

В строке 7 показана динамика доходности оптимизированного портфеля с течением времени, если мы вложили 100 долларов в начале.

7. Показать все на Streamlit

Здесь мы отображаем все графики и информацию в веб-приложении. Код ниже в значительной степени говорит сам за себя. Однако мы делаем это в обратном порядке, потому что пользователь, вероятно, захочет сначала увидеть конечный результат (т. эффективность каждой акции).

Протестируйте приложение Streamlit

С помощью всего лишь файла app.py вы можете запустить приложение Streamlit локально в своем браузере, выполнив эту команду в терминале (в соответствующей папке).

streamlit run app.py

Если все работает, вы увидите следующий вывод. Теперь вы можете ввести локальный URL-адрес в свой браузер, чтобы поиграть с вашим приложением!

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

Разверните свое приложение в облаке Herokuapp

Обновление: это приложение ранее было развернуто в Herokuapp, однако с ноября 2022 года Herokuapp прекратит предоставление бесплатных услуг. Однако вы все равно можете заплатить за его развертывание на Heroku или следовать этой статье, чтобы развернуть приложение Streamlit на других облачных платформах. В качестве примера я развернул это приложение на streamlit.io, посмотрите его здесь.

Мы будем использовать несколько команд в терминале для развертывания вашего приложения в облаке Herokuapp. Перед этим вам нужно добавить 3 файла в ту же папку, что и файл app.py. Они также находятся в репозитории GitHub.

Создайте файл setup.sh

Это файл оболочки, и вам нужно добавить следующую команду оболочки внутрь файла. По сути, он сообщает Herokuapp, что нужно настраивать и настраивать во время работы приложения.

mkdir -p ~/.streamlit/
echo “\
[server]\n\
headless = true\n\
port = $PORT\n\
enableCORS = false\n\
\n\
“ > ~/.streamlit/config.toml

Создайте файл «requirements.txt»

Этот файл сообщает Herokuapp, какие библиотеки нужно установить перед запуском нашего приложения. Это библиотечный импорт, который мы использовали ранее, и, конечно же, необходим потоковый свет!

streamlit
pandas
pandas-datareader
PyPortfolioOpt
plotly
matplotlib
seaborn
gunicorn

Создайте файл «Procfile»

Для этого файла нет расширения файла. В этом файле указаны команды для запуска Heroku при развертывании приложения. Мы указываем, что это веб-приложение с файлом оболочки в качестве конфигурации, и вызываем Streamlit для запуска app.py.

web: sh setup.sh && streamlit run app.py

Далее необходимо выполнить следующее.

  1. Установите git по этой ссылке.
  2. Создайте аккаунт Herokuapp здесь.
  3. Установите Интерфейс командной строки Heroku (CLI) по этой ссылке.

Теперь введите следующие команды, чтобы инициализировать репозиторий git и сделать первый коммит.

git init
git add .
git commit -m “first commit”

Затем выполните следующие команды, чтобы войти в свою учетную запись Heroku (ваш браузер откроется, чтобы вы могли выполнить вход), затем создайте приложение Heroku с любым именем. вы хотите. Обратите внимание, что URL вашего веб-приложения будет name_of_your_app.herokuapp.com. Затем вы отправляете репозиторий в Heroku.

heroku login
heroku create name_of_your_app(change this)
git push heroku master

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

Развертывание на других платформах

Если вы хотите прочитать о двух других методах развертывания вашего приложения Streamlit в Интернете, ознакомьтесь с этой статьей!



Если вам понравилась эта статья, не стесняйтесь проверить мои другие статьи и не стесняйтесь следовать за мной. :)







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



Запланируйте сеанс DDIChat в Data Science / AI / ML / DL:



Подайте заявку на участие в программе DDIChat Expert здесь.
Работайте с DDI: https://datadriveninvestor.com/collaborate
Подпишитесь на DDIntel здесь.