Цель этой статьи — поделиться опытом разработки онлайн-аналитического сервиса для инвесторов на Python. Основное внимание уделяется концептуальным вопросам, а не подробному описанию какой-либо конкретной технологии.
Я надеюсь, что читатель сможет легко найти любую информацию, немного погуглив.
Для наглядности привожу ссылку на сервис в самом начале презентации.
Немного об инвестициях
Я начал интересоваться темой инвестиций еще летом 2019 года и сразу окунулся в море различных публикаций и видеоблогеров, которые рандомно давали советы, как и куда инвестировать.Стало понятно, что в инвестиционном мире существует два основных способа принятия решений, основанных на фундаментальном и техническом анализе.
Первый метод больше подходит для долгосрочных инвестиций, а второй – для спекуляций.
Через некоторое время пришло понимание несомненной пользы от отыгрыша различных исторических сценариев типа «что было бы, если бы я вложил деньги в такой-то год и на такой-то период».
Такого рода анализ позволяет почувствовать разницу между ценными бумагами, пригодными для инвестирования и спекуляций, и формирует у начинающего инвестора понимание того, в какие финансовые инструменты стоит вкладывать деньги и на какой период времени.
Созревание идеи, выбор хостинга и архитектуры веб-сервиса
Со временем возникла идея создать сервис в виде сайта, который позволял бы проигрывать исторические сценарии инвестирования в различные финансовые инструменты.Следующим шагом было определение трех ключевых моментов:
- выбор хоста;
- выбор технологического стека и сервисной архитектуры;
- поиск открытого источника данных, из которого можно было бы подтянуть информацию о рыночных котировках.
И есть три причины.
Первая — нежелание открывать пользователю весь код. Вторая причина – поиск решения, при котором не будет принципиальной необходимости передавать все данные по сети, и третья – независимость от вычислительных возможностей на стороне пользователя.
Выбор был сделан с расчетом на будущее, если вдруг объем данных станет настолько большим, что придется развертывать серверную часть на специализированных платформах, таких как Amazon Web Services или Microsoft Azure. Как обычно, при наличии достаточного количества амбиций решения изначально выбираются масштабируемыми.
Что касается языков программирования, то по поводу фронтенда сомнений изначально не было.
Все вполне стандартно: html+css+javascript. Бэкенд было решено писать на Python, так как на сегодняшний день это один из самых популярных и поддерживаемых языков для быстрой разработки и прототипирования.
Все последующие решения были в той или иной степени следствием сделанного выше выбора.
В качестве хоста выбран сайт pythonanywhere.com, отличительной особенностью которого является то, что он ориентирован на программирование на Python и предлагает относительно дешевый тариф — 5 долларов в месяц.
Последующая разработка сайта осуществлялась с использованием фреймворка Django. Хоть этот фреймворк и не считается самым простым, он предоставляет разработчику обширные инструменты в виде представлений, шаблонов и подключаемых готовых приложений, что в совокупности позволяет построить полноценный сайт.
В плане выбора источника данных практически сразу мое внимание привлек такой сервис, как Yahoo Finance и соответственно библиотека yfinance, предоставляющая удобный API для Python.
О некоторых возможностях pythonanywhere.com
Хостинг Pythonanywhere позволяет работать в нескольких режимах:- запуск интерпретатора Python в консоли;
- работа на ноутбуке Jupyter;
- запуск полноценных веб-приложений.
Настройка и публикация веб-приложения выполняется всего за несколько кликов, что позволяет вам сосредоточиться на основной работе.
Удобная панель управления дает быстрый доступ к файлам и папкам, консоли и любым настройкам.
Встроенная поддержка https, подключаемых доменных имен и защита паролем содержимого сайта.
Доступен мониторинг трафика, а также логи сервера по ссылке в личном кабинете.
Отдельно хотелось бы отметить еще одно несомненное удобство для разработчика.
Помимо логов сервера, при возникновении ошибок на бэкенд-стороне, трассировка и значения локальных переменных часто отображаются непосредственно в текущем окне браузера в момент вызова соответствующих функций и методов.
Причем след можно увидеть даже в окне браузера на смартфоне.
Лично мне такой режим отладки неоднократно выручал, позволяя исправлять ошибки в коде буквально на лету.
Еще один важный момент, на который, несомненно, стоит обратить внимание, — работа с системами контроля версий.
git, svn и hg/mercurial доступны во встроенной консоли Bash.
Работа с данными
Я выбрал поставщика финансовой информации Yahoo Finance и библиотеку yfinance из-за отсутствия абонентской платы и доступа к ежедневным обновлениям биржевой информации.Через API yfinance онлайн-сервис оперативно получает информацию с трех американских бирж: NASDAQ, NYSE и AMEX. Однако сразу стоит обратить внимание на то, что на сайте разработчика yfinance есть предупреждение о запрете коммерческого использования.
Что касается технологии взаимодействия с веб-сервером, то в браузер изначально загружается шаблон с html-разметкой.
Следующим шагом будет запуск javascript, который использует запросы get для получения всех необходимых данных с сервера.
Содержимое страницы обновляется с помощью технологии Ajax через интерфейсы библиотеки jQuery. Все данные онлайн-сервиса хранятся в двух форматах: csv и SQLite. Такой выбор позволил нам быстро приступить к реализации основной логики без необходимости установки и настройки сервера базы данных.
Немного о Джанго
Отдельно хотелось бы остановиться на трех программных компонентах, которые были встроены в архитектуру сайта в виде готовых блоков, что значительно ускорило разработку.Я говорю о панели администратора Django, модуле управления сеансами django.contrib.sessions и фреймворке excontrib/django_comments. Django позволяет собирать проекты из отдельных программных компонентов, называемых приложениями.
Приложения, написанные однажды, можно повторно использовать в разных проектах.
Для того, чтобы интегрировать вышеперечисленные компоненты в проект, вам необходимо явно указать их в файле settings.py.
Кроме того, вам следует соответствующим образом настроить шаблоны URL-адресов для выполнения запросов из браузера:INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.sessions', 'django_comments', … ]
urlpatterns = [
url(r'^admin/', admin.site.urls)
url(r'^comments/', include('django_comments.urls')),
…
]
Как видно из приведенных фрагментов кода, встроить готовые компоненты не так уж и сложно, и в результате они добавляют в проект значительную часть функционала.
Чтобы запустить панель администратора после развертывания фреймворка django, вам необходимо выполнить несколько простых шагов: проверить настройки в файле settings.py, перенести встроенные модели данных и создать суперпользователя.
Администратору предоставляется его личный логин, пароль и почтовый ящик.
По умолчанию доступ к панели администратора осуществляется путем добавления стандартного пути /admin/ к URL-адресу домена.
Панель предоставляет удобный интерфейс для управления встроенной базой данных.
В этой базе данных по умолчанию хранится информация о пользователях и группах пользователей.
Это очень удобно, поскольку на сайте легко реализовать авторизацию пользователя.
А если принципиально важна скорость запуска сайта, то можно сэкономить время и не создавать отдельную страницу для того, чтобы создавать новых пользователей и предоставлять им права.
Просто зайдите в панель администратора и добавьте новую запись в базу данных через интерфейс.
Однако это решение подходит лишь небольшому количеству пользователей, поскольку оно не позволяет пользователям самостоятельно регистрироваться и сбрасывать пароль.
Еще одна особенность админ-панели заключается в том, что она дает доступ не только к пользовательским данным, но и практически к любым данным, которые хранятся в базе данных под управлением Django. Например, помимо данных об авторизованных пользователях, в моей базе данных частично хранится содержимое сайта и комментарии, оставленные посетителями.
Расскажу о лайфхаке, который я использовал для добавления формы обратной связи на страницу «О себе».
Чтобы не писать отдельный код ни для браузера, ни для обработки данных на сервере, вместо формы обратной связи в соответствующий html-шаблон был встроен стандартный блок комментариев, но удалена возможность просмотра истории.
При таком подходе данные формы обратной связи обрабатываются и сохраняются в одной таблице с комментариями посетителей сайта.
Управление сессиями реализовано с помощью встроенного модуля django.contrib.sessions. Объекты сеанса хранят информацию о настройках, выбранных пользователями при посещении сайта.
В частности, в сессиях сохраняется выбранный инвестиционный период, исторический период проведения анализа и язык сайта.
Немного остановлюсь на том, как я сделал сайт мультиязычным.
Мне было важно найти простое и быстрое решение, при котором я мог бы зайти в панель хостинга и редактировать текст любой статьи всего в два клика.
Поэтому для хранения текстов статей я выбрал формат независимых текстовых файлов, а не загрузку их в базу данных.
Учитывая небольшое количество статей (грубо говоря, до 10) и всего два варианта выбора языка (русский и английский), я считаю такое решение вполне приемлемым.
Опять же, все зависит от масштаба.
Последнее, чего хотелось бы коснуться, — это использование шаблонов Django. Помимо прочего, шаблоны позволяют импортировать значения переменных прямо из кода Python в HTML-страницу, а также собирать HTML-страницы из нескольких независимых блоков.
В качестве иллюстрации приведу пример прямо из моего кода.
Встраивание нескольких блоков с динамическим содержимым в общий скелет html-страницы: html:
{% include article_file_name %}
{% include online_service_file_name %}
{% include comments_file_name %}
Pyhton/backend:
def view_article(request, selected_url_path = 'expected_return'):
…
context = {
…
'article_file_name':article_file_name,
'online_service_file_name':online_service_file_name,
'comments_file_name':comments_file_name,
…
}
return render(request, 'articles/base_blog_page.html', context=context)
Здесь имя_файла_статьи, имя_файла_онлайн_сервиса и имя_файла_комментариев — это фактически имена переменных, через которые передаются пути к HTML-файлам с добавленным контентом.
Заключение.
Полезный опыт самостоятельной разработки веб-сервиса Результат моей работы над проектом вы можете увидеть перейдя по ссылке www.emarkoff.com .
Платформа pythonanywhere в целом является хорошим решением для разработки веб-приложений на основе Django. И, если у вас есть свои идеи, то двух-трех месяцев вам будет достаточно, чтобы понять основы и реализовать какое-нибудь простое веб-приложение, даже если вы не профессиональный веб-разработчик.
Подобный опыт может быть очень полезен менеджерам, аналитикам и всем, кто имеет дело с веб-разработкой и веб-сервисами, особенно на этапе бета-тестирования.
Вы сможете лучше понимать смысл сообщений об ошибках сервера и более продуктивно общаться с представителями службы технической поддержки и разработчиков.
Теги: #python #разработка сайтов #инвестиции #Открытые данные #инвестор #онлайн-сервис #Yahoo Finance #pythonanywhere.com
-
Грейнджер, Клайв
19 Oct, 24 -
Запуск Visual Studio 2010 В Санкт-Петербурге
19 Oct, 24 -
Основы Шаблонов C++: Шаблоны Функций
19 Oct, 24 -
Краш-Тест Запуска 3.0, Бета-Версия. Киев
19 Oct, 24 -
Сглаживание Шрифтов
19 Oct, 24