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

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



Прежде чем двигаться дальше, необходимо выделить две основные категории:

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

Причина, по которой мы использовали здесь слово «большой», заключается в том, что мы заинтересованы в тех, кто может существенно повлиять на цены, если они решат начать операции по купле-продаже. Большой также может означать, что они вкладывают значительные средства в исследования и понимание продукта, и поэтому они, как правило, находятся на правильной стороне рынка (или наоборот, имея дело с хеджерами). Каждый отчет COT содержит информацию о многих активах, и эта информация поступает в виде длинных / коротких позиций для обоих участников (спекулянтов и хеджеров), поэтому у нас есть 4 набора данных для каждого актива, и для упрощения мы чистим длинные позиции с помощью короткие позиции и получите чистую стоимость, то есть чистые спекулятивные позиции по сравнению с чистыми позициями хеджирования.

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

  • Пример 1: спекулятивные чистые позиции по EURUSD будут иметь положительную корреляцию с валютной парой.
  • Пример 2: чистые позиции хеджеров по золоту будут иметь отрицательную корреляцию с активом.

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

Мы будем использовать следующие шаги, чтобы выполнить простое валютное исследование предсказуемости NZDUSD на основе его значений COT:

  1. Выполните несколько тестов на стационарность и статистику значений NZD COT, чтобы получить общее представление о его свойствах.
  2. Рассчитайте корреляцию между значением COT для NZD и NZDUSD, чтобы увидеть, является ли оно значительным или нет.
  3. Запустите стратегию №1, чтобы определить взлеты и падения значений COT, используя полосы волатильности (также известные как полосы Боллинджера в техническом анализе).
  4. Запустите стратегию № 2, чтобы определить динамические изменения значений COT, используя знаменитый RSI для значений COT. Поскольку значения COT не являются производными от цены, мы проверяем, получаем ли мы лучшие результаты RSI, чем при их прямом использовании для цен (все мы знаем, что это не работает).
  5. Постройте график результатов тестирования и проверьте оптимизацию и другие показатели производительности.

Рисунок: NZDUSD по сравнению со спекулятивным COT по NZD и COT хеджеров по NZD

Основные статистические тесты: значения COT

Описательная статистика показанных различий COT:

Если мы применим тест нормальности Шапиро-Уилка к обоим значениям COT, мы получим следующие результаты:

Статистика = 0,963, значение p = 0,000
Выборка (хеджеры) не выглядит по Гауссу (отклонить H0)

Статистика = 0,927, значение p = 0,000
Выборка (спекулянты) не выглядит по Гауссу (отклонить H0)

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

Расчет корреляции: NZDUSD и NZD COT

Если мы рассчитаем матрицу корреляции между спекулятивными значениями NZDUSD, NZD и значениями хеджеров NZD, мы получим следующую тепловую карту:

Обратите внимание, что значения COT доступны бесплатно на веб-сайте CFTC. Как и ожидалось, у нас есть корреляция более 0,45 с NZDUSD и спекулянтами COT, а также корреляция менее -0,45 с хеджерами COT.

Стратегия # 1

Основная идея: вычисляя полосы Боллинджера на значениях спекулянтов и хеджеров COT NZD, мы собираемся увидеть, действительно ли экстремальные значения волатильности +2 и -2 представляют развороты на значениях COT, которые будут используется для открытия позиций по NZDUSD. Сроки, естественно, еженедельные.

Для OHLC + структура данных двух чистых значений COT, как показано ниже:

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

def adder(Data, times): # You should put 10 in the place of times.
 
 for i in range(1, times + 1):
 
 z = np.zeros((len(Data), 1), dtype = float)
 Data = np.append(Data, z, axis = 1)

Теперь, чтобы применить функцию основной идеи:

def BollingerBandsCOT(Data, boll_lookback, volatility):
            
    # Calculating means
    for i in range(len(Data)):
        try:
            Data[i, 6] = (Data[i - boll_lookback:i + 1, 4].mean())
    
        except IndexError:
            pass
        
    for i in range(len(Data)):
        try:
            Data[i, 7] = (Data[i - boll_lookback:i + 1, 5].mean())
    
        except IndexError:
            pass
    # Calculating barriers
    for i in range(len(Data)):
        Data[i, 8] = ((Data[i - boll_lookback:i, 4].std()) *  volatility) + Data[i, 6]
        
    for i in range(len(Data)):
        Data[i, 9] = Data[i, 6] - ((Data[i - boll_lookback:i, 4].std()) * volatility)
    for i in range(len(Data)):
        Data[i, 10] = ((Data[i - boll_lookback:i, 5].std()) * volatility) + Data[i, 7]
        
    for i in range(len(Data)):
        Data[i, 11] = Data[i, 7] - ((Data[i - boll_lookback:i, 5].std()) * volatility) 
               
    return Data

Если мы построим график значений NZDUSD в сравнении со значениями спекулянтов с их полосами Боллинджера, мы получим график ниже:

Торговые параметры следующие:

  • Полосы Боллинджера означают: 20
  • Верхняя полоса волатильности: +2
  • Нижняя полоса волатильности: -2
  • Срок выдержки: 5 недель.

- - - - - -Производительность - - - - - -
Коэффициент успешности = 59,13%
Чистая прибыль = 2222,0 доллара
Реализованный RR = 0,96
Ожидаемая цена = 19,32 доллара на сделку < br /> Коэффициент прибыли = 1,39
Коэффициент Шарпа = 0,13

Минимум = 490,5 доллара
Максимум = 3250,2 доллара
Сделки = 115
Погружение = 0,11

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



----- br /> Коэффициент прибыли = 1,11
Коэффициент Шарпа = 0,04

Минимум = -1132,6 доллара
Максимум = 1788,3 доллара
Сделки = 98
Погружение = 0,56

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

Стратегия # 2

Основная идея: вычисляя RSI для значений спекулянтов и хеджеров COT NZD, мы собираемся увидеть, действительно ли экстремальные значения 70 и 30 представляют развороты на значениях COT, которые будут использоваться для открытия позиций. на NZDUSD. Сроки, естественно, еженедельные.

Вы можете узнать больше о стратегиях RSI здесь: Бэк-тестирование стратегии расхождения RSI на FX в Python. Следует ли использовать его как отдельную стратегию?

def rsi(Data, rsi_lookback, what):
    
    rsi_lookback = (rsi_lookback * 2) - 1 # From exponential to smoothed
          
    # Get the difference in price from previous step
    Data = pd.DataFrame(Data)
    delta = Data.iloc[:, what].diff()
    delta = delta[1:] 
    
    # Make the positive gains (up) and negative gains (down) Series
    up, down = delta.copy(), delta.copy()
    up[up < 0] = 0
    down[down > 0] = 0
    
    up = np.array(up)
    down = np.array(down)
    
    roll_up = ema(up, rsi_lookback)
    roll_down = ema(abs(down), rsi_lookback)
    
    # Calculate the SMA
    roll_up = roll_up[rsi_lookback:]
    roll_down = roll_down[rsi_lookback:]
    Data = Data.iloc[rsi_lookback + 1:,].values
    
    # Calculate the RSI based on SMA
    RS = roll_up / roll_down
    RSI = (100.0 - (100.0 / (1.0 + RS)))
    RSI = np.array(RSI)
    RSI = np.reshape(RSI, (-1, 1))
    
    Data = np.concatenate((Data, RSI), axis = 1)
return Data

Торговые параметры следующие (важное примечание: мы модифицируем экспоненциальную скользящую среднюю в функции RSI, чтобы сделать ее сглаженной, как в исходной версии Уайлдера):

  • Период RSI: 2
  • Верхний крайний: 65
  • Нижний крайний: 35
  • Срок выдержки: 4 недели

Заключение. Хотя никакой оптимизации не проводилось (кроме выбора RSI с периодом 2 для увеличения частоты сигнала), эта стратегия, похоже, дает некоторые качественные сигналы на основе диаграммы сигналов. Сигналы хеджеров кажутся лучше, что понятно, поскольку именно они имеют наибольший контроль над своим основным бизнесом. Еще одна вещь, о которой стоит упомянуть, - это проблемы с последовательными сигналами, которые можно решить, заставив алгоритм размещать только отдельные сделки, а не торговать по каждому сигналу.

Заключительные слова

Конечно, совершенство - самое редкое слово в финансах, и этот метод иногда может давать ложные сигналы, как и любая стратегия. И хотя умный пользователь может использовать эти ложные сигналы, чтобы подтвердить преобладающий тренд и оседлать его (в конце концов, тренд - ваш друг), трудно определить, потерпел неудачу сигнал или нет, особенно на недельном таймфрейме. потребуется время, чтобы правильно проанализировать ситуацию. Тем не менее, это остается одним из многих способов отслеживать умные деньги (подробнее об этом: https://www.udemy.com/course/applied-sentiment-analysis-commitments- of-traders-report /? referralCode = DACC7E9116D2626E2796 )