Максимизация прибыли

  • Критерий Келли в трейдинге
  • Критерий Келли: максимизация прибыли за счет оптимальных ставок
  • Максимизация прибыли торговой стратегии пересечения скользящих средних

Критерий Келли в трейдинге

Как использовать Келли для определения размера позиции

Риск-менеджмент: концепция, чуждая многим трейдерам. В эпоху, когда такие стили торговли, как «дегенерация» и «левая кривая», ежедневно продвигаются в крипто-Твиттере, наряду с 6- или 7-значными флексами PnL, нелегко оставаться рациональным в отношении размера позиции. Однако управление рисками является, пожалуй, самым важным принципом в трейдинге: одна ошибка может привести к разорению, после чего ваше торговое путешествие будет закончено.

При выражении риска, связанного со сделкой, трейдеры часто ссылаются на «R/R», соотношение риска и прибыли. Однако они не учитывают, что эти два исхода имеют разную вероятность. Здесь на помощь приходит критерий Келли. Келли предлагает формулу для выбора оптимального размера ставки, основанную как на R/R, так и на вероятности каждого исхода, чтобы долгосрочный PnL был максимальным.

В этой статье мы познакомимся с критерием Келли и рассмотрим, как его можно использовать в трейдинге. Для начала мы рассмотрим простейшую версию Келли, которую можно использовать в азартных играх. Затем мы рассмотрим немного расширенную модель, которую можно применить к сделкам и инвестициям. Наконец, мы рассмотрим пример и посмотрим, как Kelly может помочь определить размер позиции для вашей торговой идеи.

Критерий Келли для азартных игр

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

где:

  • f* — это доля вашего портфеля для ставки
  • p — вероятность выигрыша
  • q – вероятность убытка (q=1-p)
  • b — доля поставленной суммы, полученной в случае выигрыша. Например, если вы ставите $10 и коэффициент ставки 2 к 1, что означает, что вы выиграете $20 в случае выигрыша, то b = $20/$10 = 2,0

Критерий Келли для инвестиций

Теперь рассмотрим критерий Келли в том случае, когда вы не обязательно теряете весь размер своей ставки, а скорее дробь .

где:

  • f*, p, q то же, что и выше
  • a — это доля, проигранная при отрицательном исходе (если монета падает на 10%, вы теряете 10%, поэтому a=0.1)
  • b — это доля, полученная в положительном результате (если монета пампит 10%, вы получаете 10%, поэтому b=0.1)

На приведенном ниже графике показан пример, показывающий оптимальную ставку Келли: это поставленная дробь f, такая, что скорость роста r максимальна при данных переменных ab и p.

График, показывающий оптимальную ставку Келли

Матрицы Келли

Чтобы получить некоторую интуицию при использовании Келли, я создал несколько матриц для разных значений вероятности p (50%, 75%, 90%). Значения в матрицах показывают оптимальный размер ставки для разных значений a и b (25%, 50%, 75%, 100%).

Значения Келли для p=0.50

Так как p=0.50, то эта матрица является ‘кососимметричной’. Когда a=0.5 и b=1, ставка Келли равна f*=0.5, что означает, что нужно открывать длинную позицию с 50% размером портфеля. С другой стороны, когда a=1 и b=0,5, значение f*=-0,5, то есть нужно шортить с 50% от размера портфеля. Это имеет смысл, потому что, если мы переворачиваем медвежьи/бычьи исходы (a/b), мы должны переключаться с длинной позиции на короткую и наоборот.

Также обратите внимание, что значения по диагонали равны нулю. Очевидно, что когда вероятность выигрыша равна 50% (как при подбрасывании монеты) и вы можете выиграть столько же, сколько и потерять, нет смысла делать ставку: EV равно нулю.

Значения Келли для p=0,75

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

Обратите внимание, как быстро мы видим, что размер увеличивается с кредитным плечом: если вы выиграли и проиграли 25% при p=75%, то Келли предлагает использовать в 2 раза больше размера вашего портфеля. Здесь мы можем начать понимать, почему многие предлагают использовать Келли в качестве предложения для «максимального размера», а не использовать его как строгое правило. В этом случае, если вы проиграете, половина вашего портфеля будет уничтожена. Даже если это может быть оптимальным выбором с математической точки зрения, это, скорее всего, ударит по вам эмоционально и повлияет на вашу торговлю впоследствии.

Значения Келли для p=0,90

По мере того, как мы увеличиваем вероятность выигрыша до 90%, мы видим, что кредитное плечо также быстро увеличивается. Еще одна причина, по которой Келли рассматривается как максимальный размер, заключается в том, что мы никогда не можем быть уверены в вероятности p: на практике мы всегда должны оценивать значение p. Независимо от того, оцениваете ли вы p как 75% или 90%, это может оказать большое влияние на значение f*, как видно выше.

Пример: APT/BTC

До сих пор мы обсуждали теорию, лежащую в основе Келли. Теперь давайте рассмотрим, как мы можем применить Келли на практике.

Основная диссертация по специальности

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

3D-график APT/BTC, показывающий горизонтальную поддержку/сопротивление

Вы можете видеть, что APT/BTC находится в диапазоне от 17 до 30. В то время, когда я рассматривал сделку, соотношение было на уровне 18. Я полагал, что есть неплохие шансы на то, что APT/BTC может подняться на вершину диапазона. Исходя из этого диапазона, можно определить цели SL и TP. Допустим, наш стоп-лосс находится на уровне 16 (неспособность удержать поддержку), а наш тейк-профит находится на уровне 30 (верхняя граница диапазона). Это даст нам следующие значения для a и b:

Оценка p

На данный момент единственной переменной остается p. Это самая важная переменная, которую также трудно оценить. Его значение не только субъективно, но и меняется со временем. Значение 60% или 80% может существенно изменить значение Келли: это еще одна причина оставаться значительно ниже критерия Келли.

В то время я бы сказал, что моя оценка p составляла около 50%, что указывает на то, что оба исхода примерно одинаково вероятны. Однако важно понимать, что эта переменная является динамической и может изменяться в результате многих факторов, в том числе:

  • Цена биткоина: BTC неустанно качается с 38 тыс. до 70 тыс. Если он продолжит расти, это, вероятно, высосет ликвидность из альтов, и, таким образом, соотношение APT/BTC может пострадать. Однако, если BTC остынет, мы можем увидеть некоторую ротацию в сторону альтов (как мы всегда видим после пампа BTC с последующим охлаждением), и это будет стимулировать соотношение APT/BTC.
  • Цена Solana: как ведущая ‘alt-L1’, более высокая цена SOL хороша для других alt-L1, потому что деньги, скорее всего, в какой-то момент перейдут из SOL в другие alt-L1.
  • События и переменные, связанные с Aptos: подумайте о графике APT/USDT, разблокировке токенов, TVL, количестве пользователей и т. д.

Если вы хотите улучшить оценку вероятности p и улучшить свои навыки прогнозирования в целом, я настоятельно рекомендую прочитать книгу Тетлока и Гарднера «Суперпрогнозирование: искусство и наука предсказания».

Собираем все воедино

Подставив наши переменные в формулу Келли, получим следующее:

В этом случае Келли предложил бы размер в 3,79 раза больше размера вашего портфеля. Опять же, обратите внимание, что лучше всего оставаться значительно ниже этого значения. И вопреки тому, что предлагал SBF, также не рекомендуется превышать критерий Келли. Переменные a (стоп-лосс) и b (тейк-профит) предопределены, но вы никогда не можете быть уверены, что ваша оценка p близка к истинному значению. В зависимости от того, насколько вы уверены в своей оценке p, вы можете выбрать значение от 1x до 2x размера портфеля.

Заключение

Управление рисками должно быть тем, о чем вы думаете сознательно с каждой сделкой, в которую вы входите. Цель этой статьи состояла в том, чтобы помочь трейдерам управлять своими рисками и более осознанно выбирать размер позиции, чтобы максимизировать долгосрочный PnL. Критерий Келли должен давать полезные рекомендации по максимальному размеру для использования. И помните: никогда не ставьте больше, чем Келли, иначе вы можете закончить то же самое, что и SBF.

Критерий Келли: максимизация прибыли за счет оптимальных ставок

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

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

Дисклеймер: Эта статья была разработана только в информационных целях, она не является инвестиционной рекомендацией.

Простой пример

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

Коэффициент успеха в 52% довольно интересен, но критический вопрос заключается в следующем: какой частью вашего капитала вы должны рискнуть при следующей ставке?

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

Давайте проведем эмпирическую проверку, предположив последовательность ставок одинакового размера с вероятностью выигрыша 52% за 1000 ставок. В первом сценарии мы ставим на кон 1% от нашего собственного капитала в каждой ставке:

Результат был неплохим, около 40% возврата. Давайте вложим в него больше денег, протестировав 2% и 4% в этот раз.

Это здорово, мы хорошо зарабатываем. Конечно, волатильность была и выше. Теперь давайте пойдем дальше и ставим более высокие проценты.

Вот тут-то все и начинается. В то время как наша конечная доходность увеличилась на 1-4%, после этого она резко упала и привела к полному убытку во многих случаях. Это разрушительный эффект неправильного кредитного плеча в беттинге. Но почему так происходит?

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

Как мы видим, при самом же сценарии, чем выше кредитное плечо, тем больше полученный общий убыток. Назовем это общим проигрышем Leverage Drag, так как влияние пропорционально кредитному плечу ставки. Что, если мы смоделируем ставку со значительным преимуществом в 5%, где за выигрышем в 10% следует проигрыш в 5%? Мы можем рассчитать влияние края и сопротивления по отдельности, чтобы понять их вклад в общие результаты.

Графически мы можем наблюдать результаты:

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

Критерий Келли

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

Формула выглядит следующим образом:

Где:

  • f∗ — это доля капитала, которая должна быть поставлена на одно событие.
  • b — коэффициент, полученный по ставке (потенциальная прибыль в случае успеха ставки).
  • p – вероятность выигрыша.
  • q=1−p — вероятность проигрыша.

Интерпретация критерия Келли

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

Применив критерий Келли к нашему первому примеру, мы получили:

  • Вероятность выигрыша 52% (p)
  • Вероятность проигрыша 48% (Q)
  • Аналогичная доходность при выигрыше или проигрыше (b=1)

Вы получите максимальный темп роста, поставив 4% от общей суммы в каждой ставке на спорт.

А что во втором примере?

  • Вероятность выигрыша 50% (p)
  • 50% вероятность проигрыша (клавиша Q)
  • Прибыль в 2 раза превысила убыток (b=2)

В этой ситуации критерий Келли предлагал размер ставки в 25% от общей суммы. Вы, наверное, думаете, не слишком ли много 25%, поэтому давайте поговорим о практическом применении критерия Келли.

Применение критерия Келли

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

Кроме того, в большинстве ситуаций не существует такой вещи, как известные вероятности и выигрыши, и лучшее, что у нас есть, — это оценки, основанные на исторических данных. Если эти оценки будут слишком оптимистичными, фактический максимальный леверидж роста будет ниже расчетного. Вот тут-то и приходит на помощь стратегия «Дробный Келли». Ставка в часть размера, рассчитанного по критерию Келли, снизит риск оптимистичных оценок и обеспечит более высокое соотношение прибыли к риску, чем фактический рассчитанный размер. Значения дробного Келли находятся в сине-зеленой области графика выше, где дополнительная единица риска вознаграждается высоким предельным темпом роста.

Исходя из этого, разумной практической основой для применения критерия Келли является:

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

Критерий Келли на финансовом рынке

Критерий Келли изначально был разработан с учетом дискретных ставок «выигрыш-проигрыш» в процессе принятия решений. Беда в том, что финансовый рынок представляет собой непрерывный поток и не следует этой модели. Помня об этом, Эдвард О. Торп расширил логику критерия Келли и разработал адаптированную модель для применения в своем собственном хедж-фонде. Адаптированная формула:

Где:

  • f∗ – это доля капитала, которая должна быть распределена в сделке.
  • μ — средняя доходность актива или стратегии.
  • r — безрисковая ставка.
  • σ² — дисперсия актива или стратегии.

Давайте проведем форвард-тест, используя S&P500 в качестве актива в стандартной стратегии «купи и держи» с кредитным плечом. Для каждого года кредитное плечо для инвестирования перебалансируется с использованием формулы, приведенной выше, и данных предыдущего года. Как видно на графике, оценочные значения по критерию Келли могут быть экстремальными, поэтому мы ограничим наше кредитное плечо значениями от 0,5 до 3 раз больше капитала.

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

Довольно заметен эффект, который оказывает высокое кредитное плечо на портфель. Рыночные кризисы 2018 и 2020 годов оказали значительное влияние на наш тест и привели к совокупной доходности ниже бенчмарка. Более того, просадки и волатильность были намного больше, что также выражается в меньших коэффициентах Шарпа и Кальмара. Как и в случае с другими хорошими рыночными теориями, применение критерия Келли на практике требует времени и усилий. В этом конкретном примере мы ребалансируем кредитное плечо с ежегодной периодичностью, используя период ретроспективного анализа в один год. Эти два параметра могут оказать существенное влияние на эффективность внедрения и нуждаются в дальнейшем анализе. Более того, для портфелей, которые включают в себя множество активов, которые более или менее коррелируют, приложения могут быть гораздо более сложными. Несмотря на это, существующая литература показывает, что адекватное внедрение действительно оказывает положительное влияние на долгосрочные результаты.

Заключение

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

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

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

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

Технический подход к этой стратегии предполагает, что когда краткосрочная скользящая средняя (STMA) пересекает долгосрочную скользящую среднюю (LTMA), это сигнал к покупке или открытию длинной позиции. И наоборот, когда STMA пересекается ниже LTMA, это сигнал к продаже или открытию короткой позиции. Этот подход основан на принципе импульса, который гласит, что цена, движущаяся вверх или вниз в период t, вероятно, продолжит движение в том же направлении в период t + 1.

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

Базовая стратегия

Сначала мы импортируем библиотеки, которые собираемся использовать для анализа:

import numpy as np
import pandas as pd
import yfinance as yf

import matplotlib.pyplot as plt
import plotly.graph_objs as go
import seaborn as sns

Мы используемyfinance (импортировано как yf), библиотеку, обеспечивающую легкий доступ к финансовым данным Yahoo Finance. С помощью yfinance вы можете загружать исторические рыночные данные по акциям, опционам и валютам.

#Download ticker price data from yfinance
tick = 'ARKK'
ticker = yf.Ticker(tick)
ticker_history = ticker.history(period='10y')

В этом примере мы анализируем 10-летнюю ежедневную историю цен на ARKK, тикер ARK Innovation ETF, но не стесняйтесь использовать другие ценные бумаги.

#Calculate 10 and 20 days moving averages
ticker_history['ma10'] = ticker_history['Close'].rolling(window=10).mean()
ticker_history['ma20'] = ticker_history['Close'].rolling(window=20).mean()

#Create a column with buy and sell signals
ticker_history['signal'] = 0.0
ticker_history['signal'] = np.where(ticker_history['ma10'] > ticker_history['ma20'], 1.0, 0.0)

#Calculate daily returns for the ticker
ticker_history['returns'] = ticker_history['Close'].pct_change()

#Calculate strategy returns
ticker_history['strategy_returns'] = ticker_history['signal'].shift(1) * ticker_history['returns']

#Calculate cumulative returns for the ticker and the strategy
ticker_history['cumulative_returns'] = (1 + ticker_history['returns']).cumprod()
ticker_history['cumulative_strategy_returns'] = (1 + ticker_history['strategy_returns']).cumprod()

#Print the cumulative strategy returns at the last date
ticker_history['cumulative_strategy_returns'][-1]

2.690754730303438

Это указывает на то, что результат стратегии за анализируемый период составляет 269,075%. За тот же период стратегия покупки и удержания принесла бы доходность в размере 203,12%

Мы можем создать график с совокупной доходностью для тикера и стратегии, применяемой с помощью Plotly.

fig = go.Figure()
fig.add_trace(go.Scatter(x=ticker_history.index, y=ticker_history['cumulative_returns'], name=tick,
 line=dict(color='white', width=2)))
fig.add_trace(go.Scatter(x=ticker_history.index, y=ticker_history['cumulative_strategy_returns'], name='Estrategy',
 line=dict(color='#22a7f0', width=2)))
fig.update_layout(title=('Moving average crossover strategy backtest in ' + tick),
 xaxis_title='Date',
 yaxis_title='Cumulative performance',
 font=dict(color='white'),
 paper_bgcolor='black',
 plot_bgcolor='black',
 legend=dict(x=0, y=1.2, bgcolor='rgba(0,0,0,0)'),
 yaxis=dict(gridcolor='rgba(255,255,255,0.2)'),
 xaxis=dict(gridcolor='rgba(255,255,255,0.2)'))
fig.update_xaxes(showgrid=True, ticklabelmode="period")
fig.update_yaxes(showgrid=True)
fig.show()

Но производительность — это не единственная важная вещь, мы также можем проанализировать просадку стратегии.

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

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

Мы можем изучить просадку стратегии с помощью следующего кода:

#Calculate the maximum cumulative returns of the strategy so far
ticker_history['cumulative_strategy_max'] = ticker_history['cumulative_strategy_returns'].cummax()

#Calculate the current drawdown of the strategy returns in relation to the maximum cumulative returns
ticker_history['cumulative_strategy_drawdown'] = (ticker_history['cumulative_strategy_returns'] / ticker_history['cumulative_strategy_max']) - 1

#Print the current drawdown
print('The current drawdown of the strategy is:', ticker_history['cumulative_strategy_drawdown'][-1])

Текущая просадка стратегии составляет: -0.5364383150776705

Но что, если мы изменим STMA на 20 и STMA на 40? Или STMA до 9 и STMA до 21? Принимая во внимание, что наиболее распространенными средними являются 5, 7, 9, 10, 20, 21, 30, 40, 50, 100, и 200 мы можем анализировать доходность и просадку различных комбинационных скользящих средних.

Возвращает матрицу с различными скользящими средними

Чтобы создать матрицу, сначала мы разрабатываем аналогичную модель пересечения МА

#Define base slow and fast moving averages
fast_ma = 10
slow_ma = 20

#Calculate the moving averages for the strategy
ticker_history['fast_ma'] = ticker_history['Close'].rolling(window=fast_ma).mean()
ticker_history['slow_ma'] = ticker_history['Close'].rolling(window=slow_ma).mean()

#Create a column with buy and sell signals
ticker_history['signal'] = np.where(ticker_history['fast_ma'] > ticker_history['slow_ma'], 1.0, 0.0)

# Calculate daily ticker and strategy returns
ticker_history['returns'] = ticker_history['Close'].pct_change()
ticker_history['strategy_returns'] = ticker_history['signal'].shift(1) * ticker_history['returns']

Затем мы создаем нулевую матрицу с различными комбинациями скользящих средних, используя фрейм данных Pandas:

# Define two lists of fast and slow moving average values to be used as index and columns for a returns matrix
fast_ma_range = [5, 7, 9, 10, 20, 21, 30, 40, 50, 100]
slow_ma_range = [7, 9, 10, 20, 21, 30, 40, 50, 100, 200]

# Create a DataFrame with the index and columns as the fast and slow moving average values, respectively
# The DataFrame will be used to store returns data for different combinations of the moving averages
returns_matrix = pd.DataFrame(index=fast_ma_range, columns=slow_ma_range)

В результате мы получаем нулевую матрицу 10×10. Чтобы дополнить ее гипотетической доходностью стратегий с различными комбинациями скользящих средних, мы используем 2 цикла for:

# Iterate through all combinations of fast and slow moving average values
for fast_ma in fast_ma_range:
    for slow_ma in slow_ma_range:
        
        # Calculate the fast and slow moving averages of the stock's closing price
 ticker_history['fast_ma'] = ticker_history['Close'].rolling(window=fast_ma).mean()
 ticker_history['slow_ma'] = ticker_history['Close'].rolling(window=slow_ma).mean()
        
        # Generate a signal to buy (1.0) or sell (0.0) based on the relative positions of the two moving averages
 ticker_history['signal'] = np.where(ticker_history['fast_ma'] > ticker_history['slow_ma'], 1.0, 0.0)
        
        # Calculate the daily returns of the stock and the strategy
 ticker_history['strategy_returns'] = ticker_history['signal'].shift(1) * ticker_history['returns']
        
        # Calculate the cumulative returns of the strategy
 cumulative_strategy_returns = (1 + ticker_history['strategy_returns']).cumprod()
        
        # Add the cumulative returns of the strategy to the returns matrix
 returns_matrix.loc[fast_ma, slow_ma] = cumulative_strategy_returns[-1]

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

# Make a copy of the returns_matrix and convert index and columns to string type
values = returns_matrix.copy()
values.index = values.index.astype(str)
values.columns = values.columns.astype(str)

# Convert values to float type
values = values.astype(float)

# Change the style of the plot and set the default color scheme
plt.style.use('dark_background')
sns.set_palette("bright")

# Create a heatmap with the provided values, including annotations, using the RdYlGn color map
sns.heatmap(values, annot=True, cmap='RdYlGn')

# Add labels to the axes
plt.xlabel('Slow Moving Average', fontsize=12, color='white')
plt.ylabel('Fast Moving Average', fontsize=12, color='white')

# Add a title to the plot
plt.title('Heatmap of Returns', fontsize=16, color='white')

# Increase the font size to 0.8 and change the color to white for all text elements
sns.set(font_scale=0.8, rc={'text.color':'white', 'axes.labelcolor':'white', 'xtick.color':'white', 'ytick.color':'white'})

# Change the background color of the plot to black
fig = plt.gcf()
fig.set_facecolor('#000000')

# Display the plot
plt.show()

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

  1. STMA: 50, LTMA: 200 с совокупной доходностью 4,5 (451,48%)
  2. STMA: 7, LTMA: 50 с совокупной доходностью 4,2 (421,29%)

200, 50 и 40 кажутся хорошими вариантами для выбора в качестве LTMA для этой ценной бумаги, но не слишком ясно, чтобы выбрать хорошего кандидата для STMA.

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

Матрица просадок с различными скользящими средними

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

# Define two lists of fast and slow moving average values to be used as index and columns for a returns matrix
fast_ma_range = [5, 7, 9, 10, 20, 21, 30, 40, 50, 100]
slow_ma_range = [7, 9, 10, 20, 21, 30, 40, 50, 100, 200]

# Create a DataFrame with the index and columns as the fast and slow moving average values, respectively
# The DataFrame will be used to store returns data for different combinations of the moving averages
dd_matrix = pd.DataFrame(index=fast_ma_range, columns=slow_ma_range)

В результате мы получаем нулевую матрицу 10×10. Чтобы заполнить ее гипотетическими просадками стратегий с различными комбинациями MA, мы используем 2 цикла for:

# Loop through different values for fast and slow moving averages
for fast_ma in fast_ma_range:
    for slow_ma in slow_ma_range:
        
        # Calculate the moving averages for the strategy
 ticker_history['fast_ma'] = ticker_history['Close'].rolling(window=fast_ma).mean()
 ticker_history['slow_ma'] = ticker_history['Close'].rolling(window=slow_ma).mean()

        # Create a binary signal column for buy/sell signals
 ticker_history['signal'] = np.where(ticker_history['fast_ma'] > ticker_history['slow_ma'], 1.0, 0.0)

        # Calculate daily returns for the ticker and the strategy
 ticker_history['strategy_returns'] = ticker_history['signal'].shift(1) * ticker_history['returns']

        # Calculate cumulative returns for the strategy
 ticker_history['cumulative_strategy_returns'] = (1 + ticker_history['strategy_returns']).cumprod()

        # Calculate maximum cumulative returns for the strategy
 ticker_history['cumulative_strategy_max'] = ticker_history['cumulative_strategy_returns'].cummax()

        # Calculate the drawdown for the strategy
 ticker_history['cumulative_strategy_drawdown'] = (ticker_history['cumulative_strategy_returns'] / ticker_history['cumulative_strategy_max']) - 1

        # Add drawdown to the matrix of drawdowns
 dd_matrix.loc[fast_ma, slow_ma] = ticker_history['cumulative_strategy_drawdown'][-1]

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

# Make a copy of the drawdown matrix and convert the index and columns to string type
values_dd = dd_matrix.copy()
values_dd.index = values_dd.index.astype(str)
values_dd.columns = values_dd.columns.astype(str)

# Convert values to float type
values_dd = values_dd.astype(float)

# Change the style of the plot and set the default color scheme
plt.style.use('dark_background')
sns.set_palette("bright")

# Create a heatmap with the provided values, including annotations, using the RdYlGn color map
sns.heatmap(values_dd, annot=True, cmap='RdYlGn')

# Add labels to the axes
plt.xlabel('Slow Moving Average', fontsize=12, color='white')
plt.ylabel('Fast Moving Average', fontsize=12, color='white')

# Add a title to the plot
plt.title('Heatmap of Drawdowns', fontsize=16, color='white')

# Increase the font size to 0.8 and change the color to white for all text elements
sns.set(font_scale=0.8, rc={'text.color':'white', 'axes.labelcolor':'white', 'xtick.color':'white', 'ytick.color':'white'})

# Change the background color of the plot to black
fig = plt.gcf()
fig.set_facecolor('#000000')

# Display the plot
plt.show()

Опять же, мы видим положительные показатели в стратегиях, которые работают с 40 и 200 LTMA для этого актива. С другой стороны, матрица показывает высокие просадки для быстрых чисел, таких как STMA: 5 / / LTMA: 10 или STMA: 7 / / LTMA: 9.

Заключительные соображения

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

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

Смотрите полный код на GitHub (версия на испанском языке)

Источник

Источник

Источник