Шесть лучших финансовых библиотек для Python

Python — востребованный язык в сфере финансов. Но сам по себе он не обладает тем количеством возможностей, которые привносят более 50 встроенных модулей. Например, если вам потребуется рассчитать кривую дисконтирования, то для этого необходимо будет привлечь экспоненциальную и логарифмическую функции, которые предоставляет встроенный математический модуль.

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

NumPy

NumPy является базовым модулем для выполнения финансовых расчетов с помощью Python. На 2018 год  NumPy входил в семерку наиболее популярных модулей, на данный же момент трудно найти финансиста, который бы с ним не работал. Библиотеки NumPy позволяют манипулировать матрицами и массивами, задействовать функции генератора случайных чисел, необходимые для определенных техник оптимизации вроде бустинга и бэггинга. Стоит отметить, что значительная часть основного кода здесь написана на C, что позволяет сгладить характерную для Python медлительность.

SciPy

SciPy собран из базовых функций NumPy, и крайне удобен в обработке финансовых данных, а также техниках обработки сигнала, линейной алгебре, статистике, интерполяции и оптимизации.

Matplotlib

Помимо обработки данных, не лишней будет возможность детально их изучить, и здесь на помощь приходит Matplotlibownload.htl, модуль визуализации, позволяющий создавать все виды таблиц и графиков в двух или трех измерениях. Не самый простой в освоении модуль, но если вы уже знакомы с Matlab, то проблем не возникнет — интерфейс Matplotlib во многом повторяет его. В любом случае, время, затраченное на освоение этого непростого модуля, всегда оправдывает себя, предоставляя пользователю самый широкий спектр возможностей по визуализации.

Pandas

Pandas, основанный на SciPy и NumPy, является достаточно распространенной библиотекой для работы с данными и их анализом. Pandas отлично показывает себя в управлении временными данными, и является незаменимым инструментов для отслеживания изменений цен с течением времени. Важно отметить, что изначально модуль pandas создавался разработчиками AQR, и лишь впоследствии перешел в открытый доступ.

В сумме NumPy, SciPy, matplotlib и pandas составляют популярный пакет, обычно именуемый просто как NumPy / SciPy. Несмотря на популярность самого пакета, его установка связана со значительными сложностями, и часто рекомендуется устанавливать его посредством Anaconda для последующего запуска в виртуальной среде. Проблема, однако, в том, что помимо NumPy / SciPy Anaconda устанавливает еще более 200 библиотек, что может поставить под вопрос эффективность этого метода.

Scikit-learn

Еще один модуль из состава Anaconda, в 2008 году признанный самым популярным модулем машинного обучения для Python. Классификация, кластеринг и другие популярные техники машинного обучения здесь подаются с визуализацией matplotlib, основной же код базируется на уже упоминавшихся NumPy и SciPy.

QuantLib 

Значительная часть квантов работает в оценке и структурировании, и для них в Python доступна QuantLib, одна из наиболее востребованных библиотек для C++ для операций оценки и расчета финансовых деривативов. Среди преимуществ QuantLib  однозначно выделяется характерная для кода в C++ быстрота, но отсутствие специализированной документации для Python делает освоение этого модуля достаточной непростой задачей. Однако и она оправдывает затраченные усилия, предоставляя быстрый и доступный инструмент для оценки в повседневной деятельности трейдера, где библиотека, написанная исключительно на Python, оказалась бы непростительно медленной.

Django formsets with attach

В Django есть отличная вещь – generic, которая содержит в себе такие конструкции как CreateView, UpdateView и т.д. Бывают ситуации, когда нам к форме модели необходимо добавить связанную сущность и записать это всё по одному сабмиту. В таком случае лучше всего прибгенуть к формсетам. Для начала необходимо описать сам формсет, который хотим использовать вместе с формой

from django.forms.models import inlineformset_factory
ImageFormSet = inlineformset_factory(Product, Image, extra=1, fields=['image'], can_delete=True)

и вот в самом UpdateView надо переопределить несколько методов:

class ProductUpdate(ProductMixin, UpdateView):
    def form_valid_formset(self, *args):
        for formset in args:
            if formset.is_valid():
                formset.save(commit=False)
                # Если нажали удалить у дочернего объекта
                for obj in formset.deleted_objects:
                    obj.delete()
                formset.save()
            else:
                return HttpResponseRedirect(self.get_success_url())

    def form_invalid_formset(self, *args):
        return self.render_to_response(self.get_context_data(**dict((a, a) for a in args)))

    def get(self, request, *args, **kwargs):
        self.object = self.get_object()
        form_class = self.form_class
        form = self.get_form(form_class)
        return self.render_to_response(self.get_context_data(form=form, image_form=ImageFormSet(instance=self.object)))

    def post(self, request, *args, **kwargs):
        self.object = self.get_object()
        form = self.get_form(self.form_class)
        image_form = ImageFormSet(self.request.POST, self.request.FILES, instance=self.object)
        if form.is_valid():
            return self.form_valid_formset(image_form)
        else:
            return self.form_invalid(form) 

Вот так быстро можно сделать вложения в момент создания и редактирования

Deploy Django, Gunicorn, NGINX, Postgresql using Docker

Введение

Этот пост в основном основан на материалах статьи: https://docs.docker.com/compose/django/.
Но помимо этого я добавлю информацию по настройке django+unicorn с использованием Nginx, также я буду использовать PostgreSQL докер-контейнер

Шаги

Давайте не будем тратить время и перейдем к следующим шагам:
1. Давайте создадим пустой каталог с именем myproject и добавим еще одну папку с именем src, которая должна содержать проект django. Для тестирования поместим простой проект django с именем mydjango.
2. Создадим подпапку внутри  myproject и назовем её config. Добавим файл requirement.pip внутри папки config и запишем в него:

Django == 1.10
gunicorn == 19.6.0
psycopg == 2.6.2

3. Теперь создадим Dockerfile внутри каталога myproject. Он должен содержать следующие строчки:

 FROM python:3.6
 ENV PYTHONUNBUFFERED 1
 RUN mkdir /config
 ADD /config/requirements.pip /config/
 RUN pip install -r /config/requirements.pip
 RUN mkdir /src;
 WORKDIR /src

Таким образом этот Dockerfile запускается на основе базового образа Python 3.6. Then the container is modified by adding the requirement.pip file in /config directory within the container and installing the packages from it.
4. Let’s create a file called docker-compose.yml in myproject directory.
The docker-compose.yml file describes the services that make your app. Here we need a web service(Django+Gunicorn), A database(Postgres), and Proxy Server(Nginx). It also describes which Docker images these services will use, how they will link together, any volumes they might need mounted inside the containers. Finally, the docker-compose.yml file describes which ports these services expose. See the docker-compose.ymlreference for more information on how this file works. Don’t forget to add docker-compose to your python environment by running pip install docker-compose.
5. Let’s add the following configuration to the docker-compose.yml file:

It says that there are three services for this project: nginx, web, db. nginx depends on web, web depends on db. db container uses postgres’s latest image from dockerhub. Default username for db is postgres and password is postgresweb container is build using project’s Dockerfile. It mounts src directory into it and exposes port 8000. version is being used for which format to use to compose the docker file.
nginx uses nginx’s latest image from dockerhub. This proxy server is accessible from port 8000. It mounts src and config directory.
6. Now let’s write a nginx configuration config file named mydjango.conf inside myproject’s config folder and put it in a subdirectory named nginx.

So what it does that, nginx acts as a reverse proxy for any connections going to django server and all connections goes through nginx to reach django server.
Project Directory should look like this:

7. To communicate from django to postgres, we need to put database configuration in django applications settings file. It should look like this:

8. All is done. Now lets run docker-compose build in terminal within the project directory. It will build/rebuild(if necessary) all the containers. For first time running the containers, run docker-compose up -d. Lets go to browser and type: localhost:8000. We should see the django application up and running.
9. For stopping the docker, run docker-compose stop. Re-running docker, use docker-compose start.
10. For shell accessing.

For logs: