Ссылка на Github (блокнот + данные).

Примечание. Этот пост является частью более широкой работы по прогнозированию цен на акции. Результат (выявленная аномалия) - это функция (вход) в модели LSTM (в архитектуре GAN) - ссылка на сообщение.

1. Мотивация

Оценка опционов - очень сложная задача. Для начала, это влечет за собой использование большого количества точек данных (некоторые из них перечислены ниже), а некоторые из них довольно субъективны (например, подразумеваемая волатильность - см. Ниже) и их трудно точно рассчитать. В качестве примера давайте проверим расчет для вызова Theta - θ:

где (среди прочего) N (d1) и N (d2) - кумулятивные функции распределения для стандартного нормального распределения, соответственно:

Еще один пример сложности ценообразования опционов - это формула Блэка-Шоулза, которая используется для расчета самих цен опционов. Формула для расчета цены европейского опциона колл со сроком погашения в t и текущей ценой S0:

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

  • модель предполагает, что базовая волатильность (σ) постоянна в течение срока действия опциона и не зависит от изменений в ценах базовых акций. Часто волатильность изменяется с изменением цены Strike - чем выше разница между Strike и базовой ценой, тем выше волатильность. Это явление называется улыбкой волатильности (см. Диаграмму ниже),
  • предположение о постоянной безрисковой норме прибыли (чего трудно предвидеть, поскольку мировая экономика меняется каждый день),
  • модель не учитывает риск ликвидности и дополнительные комиссии / сборы,
  • он предполагает, что доходность акций следует логнормальному распределению (это означает, что модель игнорирует возможность больших отклонений, скачков или падений цен, что легко можно наблюдать в реальной торговле),
  • он не предполагает выплаты дивидендов. Выплаты дивидендов изменяют текущую оценку акций, что, в свою очередь, должно изменять цену опционов,
  • модель применима только для европейских вариантов.

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

Примечание. Знание параметров настройки важно для того, чтобы мы могли полностью понять, работает ли обнаружение аномалий (и как). Итак, кратко рассмотрим их:

  • Подразумеваемая волатильность -σ: подразумеваемая волатильность - это мера оценки того, насколько цена может измениться. Более высокое значение означает, что трейдеры считают, что опцион может привести к большим изменениям. По сути, это просто индекс волатильности.
  • Дельта: δ измеряет, насколько цена опциона изменится в зависимости от изменений цены базовой акции. Дельта 0,5 означает, что опцион будет меняться на 50 центов на каждый доллар движения акции (δ - первая производная от цены).
  • Гамма: γ измеряет, насколько быстро изменится δ при изменении цены акции. Большое число означает, что это очень «активный» вариант, и он может быстро увеличить или уменьшить стоимость (это вторая производная от цены).
  • Тета: θ измеряет, насколько быстро опцион теряет ценность за день из-за временного спада. По мере того, как наступает день истечения срока, тета увеличивается.
  • Vega: vega измеряет, насколько чувствительна цена опциона к изменению подразумеваемой волатильности. Опционы, которые не в деньгах или у которых есть много времени до истечения, более чувствительны к изменению подразумеваемой волатильности,
  • Rho: rho - это скорость, с которой цена производного инструмента изменяется относительно изменения безрисковой процентной ставки. (у нас нет данных по Ро, хотя).

Итак, вернемся к обнаружению аномалий.

2. Данные

Данные по опционам можно найти на сайте historyoptiondata.com. Это обойдется вам в 1-2 тысячи долларов, но объем данных также хорошо упорядочен.

# Filtered options data for Goldman Sachs
options_df = pd.read_csv('option_GS_df.csv', parse_dates=["Expiration", ' DataDate'])
# Let's create Maturity and Spread features
options_df['date_diff'] = (options_df['Expiration'] - options_df[' DataDate']).dt.days
options_df['Spread'] = options_df['Ask'] - options_df['Bid']

Данные, которые мы будем использовать в этом посте, - это ежедневные котировки опционов Goldman Sachs на 5 января 2016 года. Они содержат цены (плюс волатильность и греки) для различных сроков погашения и цены исполнения, созданные на эту дату. Текущая цена (GS) на этот день - 174,09 доллара. Есть 22 функции и 858 строк (каждая строка - это цены и приветствия для разных упражнений и зрелости по состоянию на 5 января 2016 г.). Проверьте репозиторий Github для получения дополнительной информации - ссылка вверху.

options_df.shape
output >>> (858, 22)

Какие функции у нас есть?

print(', '.join(x for x in options_df.columns))
output >> UnderlyingPrice, OptionSymbol, Type, Expiration,  DataDate, Strike, Last, Bid, Ask, Volume, OpenInterest, T1OpenInterest, IVMean, IVBid, IVAsk, Delta, Gamma, Theta, Vega, AKA, date_diff, Spread

Практически все необходимые функции доступны. Давайте визуализируем данные в виде парного графика, где:

  • функции, которые мы сопоставляем друг с другом: Strike, Bid, Delta, Gamma, Vega и Spread (мы не будем отображать каждую функцию),
  • оттенок - это тип опциона (колл или пут),
  • диагональ - это, конечно, распределение каждой функции.

3. Обучение без учителя для обнаружения выбросов (аномалия)

Что было бы аномалией? Аномалией в нашем случае (и в целом) будет любое несоответствие в логике вариантов. Например, цены Bid (или Ask) двух опционов колл, которые имеют одинаковую цену исполнения, но, скажем, с разницей в 1-2 дня в день исполнения, должны быть почти идентичными (если нет чего-то необычного , что, наверное, надо как-то учитывать у греков). Таким образом, большая разница в ценах ставок для этих двух вариантов не будет «нормальным». Или, например, высокая Тета или маленькая Вега по опциону (OTM) с длительным сроком до истечения. И так далее.

Примечание. Мы снова пропустим технические и математические аспекты ценообразования опционов (такие как стохастические процессы, броуновское движение и уравнения диффузии). Скорее, мы пытаемся понять, можем ли мы использовать машинное обучение для аппроксимации всех этих математических формул с использованием данных (подход, основанный на данных, в отличие от подхода, основанного на модели). Вероятно, результаты будут не такими точными, как исходные формулы, но потребуют меньше вычислительных ресурсов. Или, может быть, с другой стороны, машинное обучение может `` научиться '' выполнять финансовое моделирование (например, ценообразование опционов) даже лучше, чем финансовая математика, поскольку мы можем включать в модели множество новых подходов и данных, позволяя моделям выявить скрытые для человека закономерности и корреляции.

Для обнаружения аномалий мы будем использовать Isolation Forest.

Давайте визуализируем данные опционов за один торговый день (2016/01/05) и попробуем увидеть, можем ли мы визуально идентифицировать аномалии. Некоторые вещи выглядят подозрительно - это могут быть (или нет) аномалии:

  • на Графике 2 - странно иметь контракт пут с гораздо меньшей дельтой, чем контракты рядом с ним, учитывая те же характеристики контракта - среднее значение спроса / предложения, разница между текущей ценой и ценой исполнения, очень близкая дата истечения срока действия - это опция внизу с синим цветом, окруженная путями серого цвета (она немного скрыта). С другой стороны есть вызов с такой же аномалией - фиолетовый кружок в окружении серых.
  • на диаграмме 3 - (справа) есть несколько опционов колл (мы знаем, что они колл, потому что опционы колл имеют положительную дельту - от 0 до 1) со значительно более низкими диапазонами теты - кружки имеют тэта меньше (-4,5), учитывая, что другие варианты с такими же характеристиками (рядом) имеют тэта выше, чем (-1,5).

Основными интересующими нас характеристиками будут цена Bid / Ask (или созданная нами функция - среднее из них) и спред (= Ask-Bid). Опционы одного типа, цены закрытия и даты истечения теоретически не должны иметь существенно разные цены и спред.

Следующие четыре диаграммы сделаны в Tableau.

Хорошо, давайте перейдем к обнаружению аномалии. Мы делаем ставку на то, что посредством распределения данных алгоритм изучит эти правила оптоинов и сможет определить точки данных, которые не соответствуют «среднему» распределению.

it_X_train = options_df[['Strike', 'Delta', 'Gamma', 'date_diff']]
it_X_train['s_k'] = options_df['UnderlyingPrice'] - options_df['Strike']
it_X_train['b_a_mean'] = (options_df['Bid'] + options_df['Ask']) / 2
it_X_train['b_a_mean'] = it_X_train['b_a_mean'].apply(lambda x: int(round(x, 0)))
it_X_train['s_k'] = it_X_train['s_k'].apply(lambda x: int(round(x, 0)))

Мы не будем использовать все функции для обнаружения аномалий. Мы используем следующие функции:

print(', '.join(col_names[x] for x in it_X_train.columns))
output >>> Strike, Delta, Gamma, Difference between Date of valuation and Exercise date, Difference between Current and Strike prices, Average of Bid and Ask.

Почему мы используем эти функции? Мы хотим использовать функции, которые (вместе) должны следовать логике опций, описанной выше. Нарушение логики среди этих шести выбранных функций должно рассматриваться как «странный» контракт.

Логика изолированного леса чрезвычайно проста:

clf = IsolationForest(max_samples='auto', contamination=.025,\
                      n_estimators=10, \
                      random_state=19117,  max_features=it_X_train.shape[1])
clf.fit(it_X_train)
y_pred_train = clf.predict(it_X_train)

4. Результаты

Давайте визуализируем результат работы модели. По оси абсцисс отложена разница между текущей ценой и ценой исполнения, а по оси ординат - среднее значение спроса и предложения (как показано на графиках 1 и 2 выше). Синие x и фиолетовые кружки обозначают опционы пут и колл соответственно без аномалий в распределении характеристик. Остальные - аномалии.

Это аномалии, выявленные изолированным лесом. Было забавно узнать (несмотря на то, что они не были видны на последней диаграмме, поскольку я не мог исправить шкалы оси Y между Python и Tableau), что идентифицированные аномалии (красного и оранжевого цветов) - это те, которые мы наблюдали в 4 диаграммы выше (Я привел индексы каждого контракта).

Из этого парного графика можно сделать несколько наблюдений об аномальных образцах ценообразования опционов:

  • у них средняя цена (средняя Bid и Ask) выше, чем у других вариантов,
  • они равномерно распределены по разным срокам погашения (несмотря на то, что исходные данные распределяются в основном по более близким срокам погашения),
  • Текущая минусовая цена исполнения обычно не распространяется в качестве исходных данных.

Как упоминалось выше, мы создаем обнаружение аномалий в ценообразовании опционов на акции, чтобы использовать его в качестве функции для прогнозирования движения цен на акции Goldman Sachs. Насколько важны аномалии в ценообразовании опционов для прогнозирования движения цен на акции? Проверьте это здесь. (все еще работаю над этим)

Спасибо за прочтение.

С уважением, Борис