Основы финансового анализа и количественной торговли с помощью Python

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

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

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

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

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

Ссылки на внешние сайты

Ссылка на код, реализованный ниже :- https://github.com/RSM009

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

Запасы

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

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

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

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

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

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

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

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

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

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

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

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

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

# importing required packagesimport pandas as pd
import quandl as q

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

После того, как пакеты будут импортированы, мы будем делать запросы к API Quandl с помощью пакета 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 фиксируют движение определенных параметров акции, таких как цена акции, за определенный период времени с точками данных, записанными через равные промежутки времени.

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

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

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

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

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

msft_data.describe()

resample()

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

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():

Return = {(Цена при 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

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

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

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

rolling()

Это волшебная функция, которая делает трюки для нас:

# 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 для true и 0.0 если условие оказывается ложным1.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

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

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

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

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

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

Куда двигаться дальше?

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

Источник