Основы финансового анализа и количественной торговли с Python.

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

Алгоритмическая или количественная торговля - это процесс проектирования и разработки торговых стратегий, основанный на математическом и статистическом анализе. Это чрезвычайно сложная область финансов.

Это руководство служит руководством для начинающих по количественной торговле с помощью Python. Вы найдете этот пост очень полезным, если:

  1. Студент или кто-то, кто хочет стать количественным аналитиком (количественным аналитиком) в фонде или банке.
  2. Тот, кто планирует начать свой собственный бизнес по количественной торговле.

В этом посте мы рассмотрим следующие темы:

  1. Основы биржи и трейдинга
  2. Извлечение данных из Quandl API
  3. Исследовательский анализ данных о ценах на акции
  4. Скользящие средние
  5. Формулирование торговой стратегии на Python
  6. Визуализация эффективности стратегии

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

Что такое акции? Что такое торговля акциями?

Акции

Акция представляет собой долю в собственности корпорации, которая выпущена на определенную сумму. Это вид финансового обеспечения, подтверждающий ваши претензии в отношении активов и результатов деятельности компании. Организация или компания выпускает акции, чтобы привлечь больше средств / капитала для масштабирования и участия в большем количестве проектов. Затем эти акции становятся общедоступными и продаются и покупаются.

Торговля акциями и торговая стратегия

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

Трейдеры платят деньги в обмен на владение внутри компании в надежде совершить прибыльные сделки и продать акции по более высокой цене. Другой важный метод, которым следуют трейдеры, - это короткие продажи: заимствование акций и их немедленная продажа в надежде выкупить их позже по более низкой цене, вернуть их кредитору и получить маржу. Итак, большинство трейдеров следуют плану и модели торговли. Это известно как торговая стратегия.

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

Python - один из самых популярных языков программирования среди подобных C ++, Java, R и MATLAB. Он широко применяется во всех областях, особенно в области науки о данных, благодаря простому синтаксису, огромному сообществу и поддержке третьих сторон.

Вам понадобится знакомство с Python и статистикой, чтобы извлечь максимальную пользу из этого руководства. Обязательно освежите свой Python и ознакомьтесь с основами статистики.

Извлечение данных из Quandl API

Для извлечения данных о ценах на акции мы будем использовать Quandl API. Но перед этим давайте настроим рабочую среду. Вот как:

  1. В вашем терминале создайте новый каталог для проекта (назовите его, как хотите):
mkdir <directory_name>
  1. Убедитесь, что на вашем компьютере установлены Python 3 и virtualenv.
  2. Создайте новый Python 3 virtualenv с помощью virtualenv <env_name> и активируйте его с помощью source <env_name>/bin/activate.
  3. Теперь установите jupyter-notebook с помощью pip и введите pip install jupyter-notebook в терминале.
  4. Аналогичным образом установите пакеты pandas, quandl и numpy.
  5. Запустите свой jupyter-notebook из терминала.

Теперь ваш ноутбук должен работать на локальном хосте, как показано на скриншоте ниже:

Вы можете создать свою первую записную книжку, щелкнув New раскрывающееся меню справа. Убедитесь, что вы создали учетную запись на Quandl. Выполните шаги, указанные здесь, чтобы создать свой ключ API.

Когда все будет готово, приступим к делу:

# importing required packages
import pandas as pd
import quandl as q

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

После импорта пакетов мы будем делать запросы к Quandl API с помощью пакета Quandl:

# set the API key
q.ApiConfig.api_key = "<API key>”
#send a get request to query Microsoft's end of day stock prices from 1st Jan, 2010 to 1st Jan, 2019
msft_data = q.get("EOD/MSFT", start_date="2010-01-01", end_date="2019-01-01")
# look at the first 5 rows of the dataframe
msft_data.head()

Здесь у нас есть данные о ценах на акции Microsoft EOD за последние 9 лет. Все, что вам нужно было сделать, это вызвать метод get из пакета Quandl и указать символ акции, MSFT и временные рамки для необходимых данных.

Это было действительно просто, правда? Давайте продолжим, чтобы понять и изучить эти данные дальше.

Исследовательский анализ данных о ценах на акции

Имея данные в наших руках, первое, что мы должны сделать, это понять, что они представляют и какую информацию инкапсулируют.

Распечатав информацию о DataFrame, мы сможем увидеть все, что он содержит:

Как видно на скриншоте выше, DataFrame содержит DatetimeIndex, что означает, что мы имеем дело с данными временных рядов. Индекс можно рассматривать как структуру данных, которая помогает изменять данные или ссылаться на них. Данные временного ряда - это последовательность моментальных снимков цен, сделанных через последовательные равные промежутки времени.

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

Важная терминология

Рассматривая другие столбцы, давайте попробуем понять, что представляет каждый столбец:

  • Open / Close - фиксирует цену открытия / закрытия акции.
  • Adj_Open / Adj_Close - Скорректированная цена открытия / закрытия - это цена акции в любой день торгов, которая была пересмотрена с учетом любых распределений дивидендов, дробления акций и других корпоративных действий, которые произошли в любое время до открытия следующего дня.
  • Объем - он записывает количество акций, которые торгуются в любой день торговли.
  • High / Low - отслеживает самую высокую и самую низкую цену акции в течение определенного торгового дня.

Это важные столбцы, на которых мы сосредоточимся сейчас.

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

msft_data.describe()

resample ()

Метод pandas resample () используется для облегчения контроля и гибкости преобразования частоты данных временных рядов. Мы можем указать временные интервалы для пересчета данных на ежемесячный, ежеквартальный или годовой и выполнить над ними необходимую операцию.

msft_data.resample('M').mean()

Это интересный способ проанализировать динамику акций на разных таймфреймах.



Расчет доходности

Финансовая прибыль - это просто деньги, полученные или потерянные в результате инвестиций. Прибыль может быть выражена номинально как изменение суммы инвестиций с течением времени. Доходность может быть рассчитана как процент, полученный из отношения прибыли к инвестициям.

Для этого в нашем распоряжении есть pct_change (). Вот как можно рассчитать доходность:

# Import numpy package
import numpy as np
# assign `Adj Close` to `daily_close`
daily_close = msft_data[['Adj_Close']]
# returns as fractional change
daily_return = daily_close.pct_change()
# replacing NA values with 0
daily_return.fillna(0, inplace=True)
print(daily_return)

Это напечатает доходность, которую акция генерировала на ежедневной основе. Умножение числа на 100 даст вам процентное изменение.

Формула, используемая в pct_change ():

Доходность = {(Цена в t) - (Цена в t-1)} / {Цена в t-1}

Теперь, чтобы рассчитать ежемесячную доходность, все, что вам нужно сделать, это:

mdata = msft_data.resample('M').apply(lambda x: x[-1])
monthly_return = mdata.pct_change()

После пересчета данных в месяцы (для рабочих дней) мы можем получить последний день торгов в месяце с помощью функции apply(). apply() принимает функцию и применяет ее к каждой строке серии Pandas. lambda функция - это анонимная функция в Python, которая может быть определена без имени и принимает только выражения в следующем формате:

Lambda: expression

Например, lambda x: x * 2 - это лямбда-функция. Здесь x - аргумент, а x * 2 - выражение, которое вычисляется и возвращается.

Скользящие средние в торговле

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

прокатка ()

Это волшебная функция, которая помогает нам:

# assigning adjusted closing prices to adj_prices
adj_price = msft_data['Adj_Close']
# calculate the moving average
mav = adj_price.rolling(window=50).mean()
# print the result
print(mav[-10:])

Вы увидите скользящее среднее за период в 50 дней (примерно 2 месяца). Скользящие средние помогают сгладить любые колебания или всплески данных и дают более плавную кривую для показателей компании.

Мы можем построить график и увидеть разницу:

# import the matplotlib package to see the plot
import matplotlib.pyplot as plt
adj_price.plot()

Теперь вы можете построить скользящее среднее ()

mav.plot()

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

Формулировка торговой стратегии

А вот и последняя и интересная часть, разработка и создание торговой стратегии. Это будет пошаговое руководство по разработке стратегии простого пересечения скользящих средних (SMAC) на основе импульса.

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

Стратегия SMAC - это хорошо известная схематическая стратегия импульса. Это долгосрочная стратегия. Импульс - это общий доход от акций, включая дивиденды, за последние n месяцев. Этот период в n месяцев называется периодом ретроспективного анализа.

Существует 3 основных типа периодов ретроспективного анализа: краткосрочный, среднесрочный и долгосрочный. Нам нужно определить 2 разных периода ретроспективного анализа конкретного временного ряда.

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

Теперь посмотрим, как будет выглядеть код этой стратегии:

# step1: initialize the short and long lookback periods
short_lb = 50
long_lb = 120
# step2: initialize a new DataFrame called signal_df with the signal column
signal_df = pd.DataFrame(index=msft_data.index)
signal_df['signal'] = 0.0
# step3: create a short simple moving average over the short lookback period
signal_df['short_mav'] = msft_data['Adj_Close'].rolling(window=short_lb, min_periods=1, center=False).mean()
# step4: create long simple moving average over the long lookback period
signal_df['long_mav'] = msft_data['Adj_Close'].rolling(window=long_lb, min_periods=1, center=False).mean()
# step5: generate the signals based on the conditional statement
signal_df['signal'][short_lb:] = np.where(signal_df['short_mav'][short_lb:] > signal_df['long_mav'][short_lb:], 1.0, 0.0)   
# step6: create the trading orders based on the positions column
signal_df['positions'] = signal_df['signal'].diff()
signal_df[signal_df['positions'] == -1.0]

Посмотрим, что здесь происходит. Мы создали 2 периода ретроспективного анализа: короткий период ретроспективного анализа short_lb составляет 50 дней, а более длительный период ретроспективного анализа для длинной скользящей средней определяется как long_lb, равный 120 дням.

Мы создали новый DataFrame, который предназначен для захвата сигналов, которые генерируются всякий раз, когда короткая скользящая средняя пересекает длинную скользящую среднюю, используя np.where и присваивая 1.0 для истины и 0.0, если условие оказывается ложным.

Столбцы positions в DataFrame сообщают нам, есть ли сигнал покупки или продажи, или оставаться на месте. Мы в основном вычисляем разницу в столбце сигналов от предыдущей строки с помощью diff.

И вот наша стратегия реализована всего за 6 шагов с использованием Pandas. Легко, не правда ли?

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

# initialize the plot using plt
fig = plt.figure()
# Add a subplot and label for y-axis
plt1 = fig.add_subplot(111,  ylabel='Price in $')
msft_data['Adj_Close'].plot(ax=plt1, color='r', lw=2.)
# plot the short and long lookback moving averages
signal_df[['short_mav', 'long_mav']].plot(ax=plt1, lw=2., figsize=(12,8))
# plotting the sell signals
plt1.plot(signal_df.loc[signal_df.positions == -1.0].index, 
         signal_df.short_mav[signal_df.positions == -1.0],
         'v', markersize=10, color='k')
# plotting the buy signals
plt1.plot(signal_df.loc[signal_df.positions == 1.0].index, 
         signal_df.short_mav[signal_df.positions == 1.0],
         '^', markersize=10, color='m')
         
# Show the plot
plt.show()

Запуск указанной выше ячейки в записной книжке Jupyter даст график, подобный приведенному ниже:

Теперь вы можете ясно видеть, что всякий раз, когда синяя линия (короткая скользящая средняя) выходит за пределы оранжевой линии (длинная скользящая средняя), появляется розовый восходящий маркер, указывающий на сигнал покупки. Сигнал на продажу обозначается черным нисходящим маркером в месте падения short_mav ниже long_mav.

Визуализируйте эффективность стратегии на квантопе

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

Мы написали алгоритм для тестирования нашей стратегии SMA, и вот результаты:

Вот объяснение вышеуказанных показателей:

  • Общая доходность: общая процентная доходность портфеля от начала до конца бэктеста.
  • Удельная доходность: разница между общей доходностью портфеля и обычной доходностью.
  • Общая доходность: доходность, связанная с общими факторами риска. Есть 11 факторов риска секторов и 5 типов риска, которые составляют эту прибыль. Диаграммы подверженности секторам и стилям подверженности в разделе «Риски» содержат более подробную информацию об этих факторах.
  • Шарп: 6-месячный скользящий коэффициент Шарпа. Это показатель инвестиций с поправкой на риск. Он рассчитывается путем деления превышения доходности портфеля над безрисковой ставкой на стандартное отклонение портфеля.
  • Макс. Просадка: самое большое падение за все периоды движения от пика до минимума в истории портфеля.
  • Волатильность: стандартное отклонение доходности портфеля.

Похвалите себя за то, что вы успешно реализовали свою количественную торговую стратегию!

Куда пойти отсюда?

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

Дополнительные ресурсы

Quantra - детище QuantInsti. Благодаря ряду бесплатных и платных курсов, проводимых экспертами в данной области, Quantra предлагает подробное руководство по ряду базовых и продвинутых торговых стратегий.

  • Курс по науке о данных - они развернули вводный курс по науке о данных, который поможет вам заложить прочную основу для проектов в области науки о данных.
  • Курсы трейдинга для начинающих - От импульсной торговли до машинных и основанных на глубоком обучении торговых стратегий, исследователи в мире трейдинга, такие как доктор Эрнест П. Чан, являются авторами этих нишевых курсов.

Бесплатные ресурсы

Чтобы узнать больше о торговых алгоритмах, посетите эти блоги:

  • Quantstart - они охватывают широкий спектр алгоритмов тестирования на истории, руководства для начинающих и т. Д.
  • Инвестопедия - все, что вы хотите знать об инвестициях и финансах.
  • Количественность - подробные математические объяснения алгоритмов, их плюсов и минусов.

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

Получите доступ к экспертному обзору - Подпишитесь на DDI Intel