Создание стратегии для S & P500 с использованием соотношения пут-колл в Python.

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

Представьте, что вы планируете пойти в кино и хотите предугадать, будет ли этот фильм хорошим или нет, поэтому вы спрашиваете многих своих друзей, которые уже видели этот фильм, их мнения. Предполагая, что 75% сказали, что фильм хороший, у вас будет определенный уровень уверенности, что он вам понравится, потому что настроение вокруг этого фильма в основном хорошее (игнорируя вкусы и предпочтения). Та же аналогия может быть применена к финансовым рынкам многими способами, как количественными, так и качественными.

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

В этой статье будет обсуждаться знаменитый коэффициент пут-колл и его использование для прогнозирования направления движения индекса S & P500. Для этого исследования мы будем использовать качество сигнала в качестве оценки.

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



Введение в анализ настроений

Анализ настроений - это тип прогнозной аналитики, который работает с альтернативными данными, отличными от базовой ценовой структуры OHLC. Обычно он основан на субъективных опросах и оценках, но может также основываться на более количественных показателях, таких как ожидаемое хеджирование через силу или слабость рынка. Одним из известных индикаторов объективного анализа настроений является отчет «Обязательства трейдеров».

В этой статье речь пойдет об индикаторе Put-Call Ratio, временном ряду, предоставляемом CBOE на ежедневной основе. Сами по себе данные содержат чрезвычайно ценную информацию, когда дело касается фондовых индексов и торговли. Мы увидим, как загрузить исторические данные по S & P500, а также коэффициент пут-колл, затем разработаем торговую стратегию и оценим ее с помощью показателя качества сигнала.

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



Опционы и соотношение пут-колл

Опцион колл - это право купить определенный актив в будущем по заранее определенной цене, а опцион пут - это право продать определенный актив в будущем по заранее определенной цене.

Следовательно, когда вы покупаете колл, вы можете купить что-то позже, а когда вы покупаете пут, вы можете что-то продать позже. Каждая транзакция имеет две стороны, поэтому, когда вы покупаете колл или пут, кто-то другой продает их вам. Это дает две другие позиции, которые могут быть открыты по опционам: продажа колл и продажа пут. Индикатор пут-колл работает с покупателями опционов и измеряет количество покупателей пут-опционов, разделенное на количество покупателей опционов. Это дает нам представление о настроениях участников рынка в отношении указанного капитала (в нашем случае это будет фондовый рынок США).

более высокое соотношение пут / колл означает, что есть больше покупателей пут (трейдеры делают ставку на снижение актива), а более низкое соотношение пут / колл означает больше колл. покупатели (трейдеры делают ставку на рост актива). Известный способ использования этого коэффициента при анализе настроений рынка - оценка следующих сценариев:

  • Рост коэффициента означает медвежье настроение. Профессионалы «чувствуют», что рынок пойдет ниже.
  • Падение коэффициента означает бычье настроение. Профессионалы «чувствуют», что рынок пойдет вверх.

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

Загрузка данных и разработка стратегии

К сожалению, актуальные данные соотношения пут-колл по какой-то причине больше не публикуются бесплатно на сайте CBOE. Поэтому нам нужно найти другие способы загрузки данных из нескольких источников и создания бесплатных пробных версий, чтобы иметь возможность получать данные. Мне удалось получить последние 1000 данных параллельно со значениями S & P500 по состоянию на август 2021 года. Если вы хотите получить дополнительную информацию, вам, возможно, придется заплатить сторонним поставщикам данных. В любом случае, по этой ссылке на GitHub вы можете получить некоторые исторические данные, которые я получил законным путем.



Первая часть - загрузить данные EQPCR.xlsx на ваш компьютер, а затем перейти в интерпретатор Python и переключить источник на то, где находится файл Excel. Теперь нам нужно импортировать его и структурировать.

import pandas                    as pd
import matplotlib.pyplot         as plt
import numpy                     as np
# Defining Primordial Functions
def adder(Data, times):
    
    for i in range(1, times + 1):
    
        new = np.zeros((len(Data), 1), dtype = float)
        Data = np.append(Data, new, axis = 1)
    return Data
def deleter(Data, index, times):
    
    for i in range(1, times + 1):
    
        Data = np.delete(Data, index, axis = 1)
    return Data
   
def jump(Data, jump):
    
    Data = Data[jump:, ]
    
    return Data
def indicator_plot_double(Data, first_panel, second_panel, window = 250):
fig, ax = plt.subplots(2, figsize = (10, 5))
    
    ax[0].plot(Data[-window:, first_panel], color = 'black', linewidth = 1)
    ax[0].grid() 
     
    ax[1].plot(Data[-window:, second_panel], color = 'brown', linewidth = 1)
    ax[1].grid()
    ax[1].legend()
my_data = pd.read_excel('EQPCR.xlsx')
my_data = np.array(my_data)

Теперь у нас должен быть массив под названием my_data с историческими данными S & P500 и коэффициентом пут-колл.

Субъективно мы можем установить барьеры на уровне 0,80 и 0,35, поскольку они выглядят как ограничивающие соотношение. Это будут наши торговые триггеры. Конечно, здесь присутствует некоторая предвзятость, но идея состоит не в том, чтобы сформулировать прошлую торговую стратегию, а в том, чтобы посмотреть, будут ли препятствия работать в будущем.

Следуя интуиции, мы можем иметь следующие торговые правила:

  • Покупайте (покупайте), когда коэффициент достигает 0,80 или превышает его.
  • Продавать (продавать), когда коэффициент достигает 0,35 или превышает его.
def signal(Data, pcr, buy, sell):
    
    Data = adder(Data, 2)
    
    for i in range(len(Data)):
        
        if Data[i, pcr] >= 0.85 and Data[i - 1, buy] == 0 and Data[i - 2, buy] == 0 and Data[i - 3, buy] == 0:
            
            Data[i, buy] = 1
        elif Data[i, pcr] <= 0.35 and Data[i - 1, sell] == 0 and Data[i - 2, sell] == 0 and Data[i - 3, sell] == 0:
            
            Data[i, sell] = -1
            
    return Data
my_data = signal(my_data, 0, 2, 3)

def signal_chart_ohlc_color(Data, what_bull, window = 1000):   
     
    Plottable = Data[-window:, ]
    
    fig, ax = plt.subplots(figsize = (10, 5))
    
    plt.plot(Data[-window:, 1], color = 'black', linewidth = 1)
    for i in range(len(Plottable)):
        
        if Plottable[i, 2] == 1:
            
            x = i
            y = Plottable[i, 1]
        
            ax.annotate(' ', xy = (x, y), 
                        arrowprops = dict(width = 9, headlength = 11, headwidth = 11, facecolor = 'green', color = 'green'))
    elif Plottable[i, 3] == -1:
            
            x = i
            y = Plottable[i, 1]
        
            ax.annotate(' ', xy = (x, y), 
                        arrowprops = dict(width = 9, headlength = -11, headwidth = -11, facecolor = 'red', color = 'red'))
    
    ax.set_facecolor((0.95, 0.95, 0.95)) 
    plt.legend() 
    plt.grid()
signal_chart_ohlc_color(my_data, 1, window = 1000)

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

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

# Choosing an example of 21 periods
period = 21
def signal_quality(Data, closing, buy, sell, period, where):
    
    Data = adder(Data, 1)
    
    for i in range(len(Data)):
        
        try:   
            
            if Data[i, buy] == 1:
                
                Data[i + period, where] = Data[i + period, closing] - Data[i, closing]
            
            if Data[i, sell] == -1:
                
                Data[i + period, where] = Data[i, closing] - Data[i + period, closing]
                
        except IndexError:
            
             pass
         
    return Data
# Using 21 Periods as a Window of signal Quality Check
my_data = signal_quality(my_data, 1, 2, 3, period, 4)
positives = my_data[my_data[:, 4] > 0]
negatives = my_data[my_data[:, 4] < 0]
# Calculating Signal Quality
signal_quality = len(positives) / (len(negatives) + len(positives))
print('Signal Quality = ', round(signal_quality * 100, 2), '%')

Качество сигнала 52,94% означает, что на 100 сделках мы склонны видеть в 53 случаях прибыльный результат, если мы будем действовать в соответствии с ним, без учета транзакционных издержек. Конечно, совершенство - самое редкое слово в финансах, и этот метод иногда может давать ложные сигналы, как и любая стратегия. Если вы хотите увидеть больше технических индикаторов и тестов на истории, ознакомьтесь со статьей ниже:



Заключение

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

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

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