Цель настоящей статьи — поделиться опытом разработки аналитического онлайн-сервиса для инвесторов на python. Основное внимание уделено в большей степени концептуальным моментам, а не детальному описанию какой-то отдельной технологии. Надеюсь, что любые детали читатель легко найдет, немного погуглив. Ради наглядности даю ссылку на сервис в самом начале изложения www.emarkoff.com .
Интересоваться темой инвестиций я начал еще летом 2019 года и сразу же окунулся в море разнообразных публикаций и видеоблогеров, которые в разнобой давали советы на тему того, как и куда инвестировать. Стало ясно, что в мире инвестиций существует два основных способа принятия решений, которые основываются на фундаментальном и техническом анализе. Первый способ больше подходит для долгосрочных инвестиций, а второй для спекуляций.
Через какое-то время пришло понимание несомненной пользы от проигрывания различных исторических сценариев типа «а что было бы, если бы я инвестировал средства в таком-то году и на такой-то срок». Подобного рода анализ позволяет почувствовать разницу между ценными бумагами пригодными для инвестирования и спекуляций и формирует у начинающего инвестора понимание, в какие финансовые инструменты и на какие сроки стоит инвестировать.
С течением времени возникла идея создать сервис в форме сайта, который бы позволил проигрывать исторические сценарии инвестирования в разнообразные финансовые инструменты.
И следующим шагом стало определение трех ключевых моментов:
Сразу стало ясно, что проигрывать сценарии (то есть выполнять все вычисления), желательно на стороне сервера. И причины здесь три. Первая – нежелание открывать весь код пользователю. Вторая причина – поиск решения, при котором будет отсутствовать принципиальная необходимость передавать все данные по сети, а третье – независимость от вычислительных возможностей на стороне пользователя. Выбор был сделан с расчетом на будущую перспективу, если вдруг объем данных станет настолько большим, что потребуется разворачивать серверную часть на специализированных платформах, таких как Amazon Web Services или Microsoft Azure. Как водится, при наличии достаточного количества амбиций решения изначально выбираются масштабируемыми.
Что касается языков программирования, по поводу фронтенда никаких сомнений изначально не было. Все достаточно стандартно: html + css + javascript. Бэкенд было решено писать на python, так как это на сегодняшний день один из самых популярных и поддерживаемых языков быстрой разработки и прототипирования. Все последующие решения в какой-то мере являлись следствием выбора, сделанного выше.
В качестве хоста был выбран pythonanywhere.com, отличительная особенность которого заключается в том, что он заточен на программирование на python и предлагает относительно дешевый тариф в 5 долларов в месяц. Последующая разработка веб-сайта велась с использованием фреймворка Django. Данный фреймворк хотя и не считается самым простым, но зато снабжает разработчика развернутым инструментарием в виде представлений, шаблонов и подключаемых готовых приложений, что в сумме позволяет построить полноценный сайт.
В плане выбора источника данных, почти сразу мое внимание привлек такой сервис как Yahoo Finance и, соответственно, библиотека yfinance предоставляющая удобный API для python.
Хостинг pythonanywhere позволяет работать в нескольких режимах:
При желании хостинг дает возможность установить и использовать любой веб-фреймворк на python. Это может быть не обязательно Django, а, например, тот же Flask, который считается более простым в освоении. Настройка и публикация веб-приложения выполняется буквально в несколько щелчков мыши, что позволяет полностью сосредоточиться на основной сути.
Удобный дашборд дает быстрый доступ к файлам и папкам, к консоли и любым настройкам. Встроена поддержка https, подключаемых доменных имен, а также защита контента сайта паролем. Доступен мониторинг трафика, а также логи сервера по ссылке в дашборде.
Отдельно хотел бы отметить еще одно несомненное удобство для разработчика. Помимо логов сервера при возникновении ошибок на стороне бэкенда часто прямо в текущем окне браузера выдается трассировка и локальные значения переменных в момент вызова соответствующих функций и методов. Причем трассировку можно увидеть даже в окне браузера на смартфоне.
Подобного рода режим отладки лично мне много раз сильно помогал, позволяя исправлять ошибки в коде буквально на лету.
Еще один немаловажный момент, который, несомненно, стоит внимания, — это работа с системами управления версиями. Во встроенной консоли Bash доступны git, svn и hg/mercurial.
Провайдера финансовой информации Yahoo Finance и библиотеку yfinance я выбрал по причине отсутствия абонентской платы и наличия доступа к ежедневным обновлениям биржевой информации. Через API yfinance онлайн-сервис на лету подтягивает информацию с трех американских бирж NASDAQ, NYSE и AMEX. Однако стоит сразу обратить внимание на то, что на сайте разработчика yfinance встречается предупреждение о запрете коммерческого использования.
Что касается технологии веб-серверного взаимодействия, первоначально в браузер грузится шаблон с html-разметкой. Следующим шагом запускается javascript, который методом get-запросов подтягивает всю необходимые данные с сервера. Обновление содержимого страницы выполняется по технологии Ajax через интерфейсы библиотеки jQuery.
Все данные онлайн-сервиса хранятся в двух форматах: csv и SQLite. Такой выбор позволил быстро приступить к реализации основной логики без необходимости устанавливать и настраивать сервер баз данных.
Хотел бы еще отдельно остановиться на трех программных компонентах, которые были встроены в архитектуру сайта готовыми блоками, что существенно ускорило разработку. Я имею в виду панель администратора Django admin, модуль управления сессиями django.contrib.sessions и фреймворк «excontrib»/django_comments.
Django позволяет собирать проекты из отдельных программных компонент, называемых приложениями. Один раз написанные приложения можно многократно использовать в разных проектах. Для того чтобы встроить в проект указанные выше компоненты, необходимо их в явном виде указать в файле settings.py
Помимо этого, следует соответствующим образом настроить шаблоны URL для выполнения запросов со стороны браузера:
Как видно из приведенных фрагментов кода, встроить готовые компоненты не так уж и сложно, и в итоге они добавляют проекту существенную часть функционала.
Для запуска панели администратора после разворачивания фреймворка django требуется выполнить несколько простых шагов: проверить настройки файла settings.py, выполнить миграцию встроенных моделей данных и создать суперпользователя. Администратору задается свой персональный логин, пароль и почтовый ящик. По умолчанию доступ к панели администратора осуществляется путем добавления стандартного пути /admin/ к URL домена.
Внутри панели предусмотрен удобный интерфейс для управления встроенной базой данных. Эта база данных по умолчанию хранит в себе информацию о пользователях и группах пользователей. Это очень удобно, поскольку легко реализовать авторизацию пользователей на сайте. А если принципиально важна скорость запуска сайта, можно сэкономить время и не создавать отдельную страницу для того, чтобы заводить новых пользователей и предоставлять им права. Достаточно зайти в панель администратора и через UI добавить новую запись в базу. Однако такое решение годится только для малого числа пользователей, так как не дает пользователям возможность самим регистрироваться и сбрасывать пароль.
Еще одна особенность панели администратора заключается в том, что она дает доступ не только к данным о пользователях, но и в принципе к любым данным, которые хранятся в базе под управлением Django. Например, у меня помимо данных об авторизованных пользователях в базе частично хранится контент сайта и комментарии, оставленные посетителями.
Расскажу про лайфхак, которым я воспользовался для добавления на страницу «About myself» формы обратной связи. Для того чтобы не писать отдельный код ни для браузера, ни для обработки данных на сервере, вместо формы обратной связи в соответствующий html-шаблон был встроен стандартный блок комментариев, но при этом была удалена возможность просматривать историю. При таком подходе данные формы обратной связи обрабатываются и хранятся в той же таблице, что и комментарии посетителей сайта.
Управление сессиями было реализовано с использованием встроенного модуля django.contrib.sessions. В объектах сессий хранится информация о настройках, выбранных пользователями при посещении сайта. В частности, в сессиях хранится выбранный период инвестирования, исторический период для выполнения анализа, язык сайта.
Немного остановлюсь на том, как сделал сайт мультиязычным. Для меня было важно найти простое и быстрое решение, при котором можно было бы зайти в хостинг панель и отредактировать текст любой статьи буквально в два клика. Поэтому для хранения текстов статей выбрал формат независимых текстовых файлов, а не загрузку в базу. При условии небольшого количества статей (грубо говоря, до 10) и всего двух вариантов выборка языка (русский и английский) такое решение считаю вполне приемлемым. Опять-таки все зависит от масштаба.
И последнее, на чем хотел бы остановиться, — это применение шаблонов Django. Помимо всего прочего, шаблоны позволяют импортировать в html-страницу значения переменных непосредственно из кода на питоне, а также собирать html-страницы из нескольких независимых блоков. В качестве иллюстрации приведу пример непосредственно из своего кода.
Встраивание нескольких блоков с динамическим контентом в общий скелет html-страницы:
Здесь article_file_name, online_service_file_name и comments_file_name фактически представляют собой названия переменных, через которые передаются пути к html-файлам c добавляемым контентом.
Итог моей работы над проектом вы можете увидеть, перейдя по ссылке www.emarkoff.com .
Платформа pythonanywhere является в целом удачным решением для разработки веб-приложений на основе Django. И, если у Вас есть собственные идеи, то двух-трех месяцев Вам будет вполне достаточно для того, чтобы разобраться в основах и реализовать какое-нибудь простое веб-приложение, даже если Вы не являетесь профессиональным веб-разработчиком.
Такой опыт может быть очень полезен менеджерам, аналитикам и всем, кому по долгу службы приходится иметь дело с веб-разработкой и веб-сервисами, особенно на этапе бета-тестирования. Вы сможете лучше понимать смысл сообщений об ошибках сервера, продуктивней общаться с технической поддержкой и представителями разработки.
Немного об инвестициях
Интересоваться темой инвестиций я начал еще летом 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-ноутбуке;
- запуск полноценных web-приложений.
При желании хостинг дает возможность установить и использовать любой веб-фреймворк на python. Это может быть не обязательно Django, а, например, тот же Flask, который считается более простым в освоении. Настройка и публикация веб-приложения выполняется буквально в несколько щелчков мыши, что позволяет полностью сосредоточиться на основной сути.
Удобный дашборд дает быстрый доступ к файлам и папкам, к консоли и любым настройкам. Встроена поддержка https, подключаемых доменных имен, а также защита контента сайта паролем. Доступен мониторинг трафика, а также логи сервера по ссылке в дашборде.
Отдельно хотел бы отметить еще одно несомненное удобство для разработчика. Помимо логов сервера при возникновении ошибок на стороне бэкенда часто прямо в текущем окне браузера выдается трассировка и локальные значения переменных в момент вызова соответствующих функций и методов. Причем трассировку можно увидеть даже в окне браузера на смартфоне.
Подобного рода режим отладки лично мне много раз сильно помогал, позволяя исправлять ошибки в коде буквально на лету.
Еще один немаловажный момент, который, несомненно, стоит внимания, — это работа с системами управления версиями. Во встроенной консоли Bash доступны git, svn и hg/mercurial.
Работа с данными
Провайдера финансовой информации Yahoo Finance и библиотеку yfinance я выбрал по причине отсутствия абонентской платы и наличия доступа к ежедневным обновлениям биржевой информации. Через API yfinance онлайн-сервис на лету подтягивает информацию с трех американских бирж NASDAQ, NYSE и AMEX. Однако стоит сразу обратить внимание на то, что на сайте разработчика yfinance встречается предупреждение о запрете коммерческого использования.
Что касается технологии веб-серверного взаимодействия, первоначально в браузер грузится шаблон с html-разметкой. Следующим шагом запускается javascript, который методом get-запросов подтягивает всю необходимые данные с сервера. Обновление содержимого страницы выполняется по технологии Ajax через интерфейсы библиотеки jQuery.
Все данные онлайн-сервиса хранятся в двух форматах: csv и SQLite. Такой выбор позволил быстро приступить к реализации основной логики без необходимости устанавливать и настраивать сервер баз данных.
Немного про Django
Хотел бы еще отдельно остановиться на трех программных компонентах, которые были встроены в архитектуру сайта готовыми блоками, что существенно ускорило разработку. Я имею в виду панель администратора Django admin, модуль управления сессиями django.contrib.sessions и фреймворк «excontrib»/django_comments.
Django позволяет собирать проекты из отдельных программных компонент, называемых приложениями. Один раз написанные приложения можно многократно использовать в разных проектах. Для того чтобы встроить в проект указанные выше компоненты, необходимо их в явном виде указать в файле settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.sessions',
'django_comments',
…
]
Помимо этого, следует соответствующим образом настроить шаблоны URL для выполнения запросов со стороны браузера:
urlpatterns = [
url(r'^admin/', admin.site.urls)
url(r'^comments/', include('django_comments.urls')),
…
]
Как видно из приведенных фрагментов кода, встроить готовые компоненты не так уж и сложно, и в итоге они добавляют проекту существенную часть функционала.
Для запуска панели администратора после разворачивания фреймворка django требуется выполнить несколько простых шагов: проверить настройки файла settings.py, выполнить миграцию встроенных моделей данных и создать суперпользователя. Администратору задается свой персональный логин, пароль и почтовый ящик. По умолчанию доступ к панели администратора осуществляется путем добавления стандартного пути /admin/ к URL домена.
Внутри панели предусмотрен удобный интерфейс для управления встроенной базой данных. Эта база данных по умолчанию хранит в себе информацию о пользователях и группах пользователей. Это очень удобно, поскольку легко реализовать авторизацию пользователей на сайте. А если принципиально важна скорость запуска сайта, можно сэкономить время и не создавать отдельную страницу для того, чтобы заводить новых пользователей и предоставлять им права. Достаточно зайти в панель администратора и через UI добавить новую запись в базу. Однако такое решение годится только для малого числа пользователей, так как не дает пользователям возможность самим регистрироваться и сбрасывать пароль.
Еще одна особенность панели администратора заключается в том, что она дает доступ не только к данным о пользователях, но и в принципе к любым данным, которые хранятся в базе под управлением Django. Например, у меня помимо данных об авторизованных пользователях в базе частично хранится контент сайта и комментарии, оставленные посетителями.
Расскажу про лайфхак, которым я воспользовался для добавления на страницу «About myself» формы обратной связи. Для того чтобы не писать отдельный код ни для браузера, ни для обработки данных на сервере, вместо формы обратной связи в соответствующий html-шаблон был встроен стандартный блок комментариев, но при этом была удалена возможность просматривать историю. При таком подходе данные формы обратной связи обрабатываются и хранятся в той же таблице, что и комментарии посетителей сайта.
Управление сессиями было реализовано с использованием встроенного модуля django.contrib.sessions. В объектах сессий хранится информация о настройках, выбранных пользователями при посещении сайта. В частности, в сессиях хранится выбранный период инвестирования, исторический период для выполнения анализа, язык сайта.
Немного остановлюсь на том, как сделал сайт мультиязычным. Для меня было важно найти простое и быстрое решение, при котором можно было бы зайти в хостинг панель и отредактировать текст любой статьи буквально в два клика. Поэтому для хранения текстов статей выбрал формат независимых текстовых файлов, а не загрузку в базу. При условии небольшого количества статей (грубо говоря, до 10) и всего двух вариантов выборка языка (русский и английский) такое решение считаю вполне приемлемым. Опять-таки все зависит от масштаба.
И последнее, на чем хотел бы остановиться, — это применение шаблонов Django. Помимо всего прочего, шаблоны позволяют импортировать в 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)
Здесь article_file_name, online_service_file_name и comments_file_name фактически представляют собой названия переменных, через которые передаются пути к html-файлам c добавляемым контентом.
Заключение. Полезный опыт самостоятельной разработки веб-сервиса
Итог моей работы над проектом вы можете увидеть, перейдя по ссылке www.emarkoff.com .
Платформа pythonanywhere является в целом удачным решением для разработки веб-приложений на основе Django. И, если у Вас есть собственные идеи, то двух-трех месяцев Вам будет вполне достаточно для того, чтобы разобраться в основах и реализовать какое-нибудь простое веб-приложение, даже если Вы не являетесь профессиональным веб-разработчиком.
Такой опыт может быть очень полезен менеджерам, аналитикам и всем, кому по долгу службы приходится иметь дело с веб-разработкой и веб-сервисами, особенно на этапе бета-тестирования. Вы сможете лучше понимать смысл сообщений об ошибках сервера, продуктивней общаться с технической поддержкой и представителями разработки.
artsnz
Посмотрите в сторону MetaTrader 4/5 там уже есть весь этот функционал, плюс встроенный си подобный язык программирования, горы индикаторов и советников, находите брокера с мт5 и инструментами, которые вам нужны и тестируете на истории все что хотите. Да, что не мало важно оно обладает демо версией без ограничений. Плюс есть эмулятор торгов, то есть на основе исторических данных платформа генерит движения цены в реальном времени. Только практической пользы маловато, тк ни стакана, ни объемов нет (строго говоря объемы есть суммированные за период времени, но что было в моменте, дали бы вам открыть позицию или нет....)