Сердюк Иван
Сердюк Иван личный блог
10 декабря 2014, 13:10

Реализация мани - риск менеджмента при помощи коэффициента Келли, готовая функциональная блок-схема

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

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

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

Думаю, начнем с описания входящих переменных, которые нам понадобятся.

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

direction – Направление сделки (либо long, либо short)

use_semi_kelly = true — Использовать полу-Келли. Давайте подробнее рассмотрим, что это такое и с чем его едят.

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

Не буду сильно вдаваться в теорию, кого заинтересует данный метод, смогут его с легкостью найти в инете. Главное это то, что существует предел, после которого увеличения плеча приведет к увеличению убытков.  Найти этот предел помогает коэффициент Келли (по своей сути размер плеча). Рассчитывается он по формуле:

K = 100 ·Pср / (P2)ср + m, где Pср – средний результат всех сделок в процентах, m = 0.5 для лонга, m = -0.5 для шорта.

Лучше использовать полу-Келли, т.к. переоценка плеча увеличивает риски больше, чем его недооценка.

k_kelly_long   — Коэффициент Келли для лонг

k_kelly_short — Коэффициент Келли для шорт

drawdown — Максимальная просадка в процентах. Теоретически можно получить абсолютно любую просадку (хоть 90%). И не важно, что на исторических данных она была 5%. Есть очень интересный метод ограничения просадки, при котором нужно:

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

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

Вариант 2: Размер позиции рассчитывается из всего депозита. Просадка никак не ограничивается и теоретически может достигать 100%. Я думаю, никого не радует возможность слить весь свой депозит. Конечно, можно просто останавливать торговлю и менять стратегию по достижению определенного уровня просадки, но где гарантии, что другая стратегия будет более удачная? Да и увеличиваться просадка будет гораздо быстрее, если не сокращать позицию.

Рассмотри такой пример. Предположим, нужно рассчитать количество контрактов для лонга по si. Депозит в настоящее время 300000р и он равен нашему максимальному депозиту, k_kelly_long = 12, direction = long,  drawdown = 50%, use_semi_kelly = true, Инструмент si.

Количество максимально возможных контрактов будет равняться = 16. Как посчитали?

300000р*50/100 (максимальная просадка) – 0(текущая просадка) = 150000р (от этой суммы будем рассчитывать размер позиции)

Кполу = 12/2 = 6, т.е. максимально используемое нами плечо.

150000р*6 = 900000р. (объем средств с учетом плеча и максимальной просадки для открытия длинной позиции).

Стоимость контракта = 55000р. (ГО не в счет, т.к. это по своей сути и есть плечо). Количество максимально возможных контрактов = 900000р/55000р = 16.

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

Представим, что после какого-либо времени мы получили убыток размером в 100000, а стоить наш контракт стал 50000. Тогда расчет позиции будет следующий:

(150000 (максимальная просадка) – 100000 (текущая просадка))*6 (плечо)/50000 (текущая цена инструмента) = 6 контрактов.

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

Рассмотри еще один пример, только уже с акциями: Нужно рассчитать количество акций для лонга Сбербанка. Депозит в настоящее время 1000000р и он равен нашему максимальному депозиту. direction = long,  drawdown = 25%, use_semi_kelly = true, k_kelly_long = 12.

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

Максимальная просадка = 1000000 * 25/100 = 250000р. Доступное нам плечо будет составлять 1000000/250000 = 4. В данном случае используем это плечо, т.к. полу-Келли больше. Таким образом, используем весь доступные капитал, но при увеличении просадки сокращаем размер позиции в 4 раза быстрее.

Пускай стоимость одной акции Сбербанка = 70р.

 Тогда Размер позиции = (250000 (максимально возможная просадка) – 0 (текущая просадка)) * 4 (плечо)/70 (стоимость акции) = 14285 акций или 1428 лот.

Предположим, что после какого-то времени получаем убыток в 200000р. На счету остается 800000р. Рассчитаем размер открываемой позиции при стоимости акций 70р.:

(250000 (максимальная просадка) – 200000(уже полученная просадка))*4 (плечо)/70(стоимость акции) = 2857 акций или 285 лот.

Вот такая математика. Есть, конечно, и минусы данного метода. Так как размер позиции рассчитывается не из всего депозита, то из глубоких просадок будем выбираться дольше. Но и падать в глубокие просадки будем дольше. Следует отметить, что расчеты были показаны для примера, без учета комиссии и проскальзывания, так же не стоит использовать те данные, которые использовал я. В каждом отдельном случае они будут разные.

Контролировать размер позиции можно по достижению каких-либо уровней просадки. Тут вариантов может быть много. Я делаю проще:

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

Продолжим описание переменных:

max_risk_proc — Максимальный риск на сделку в %

lot_long — Размер лота для лонга (не работает, если use_mm = true)

lot_short — Размер лота для шорта (не работает, если use_mm = true)

comission – Комиссия биржи и брокера за полный оборот в рублях

slippage – Проскальзывание в рублях

stoploss_long – Размер стопа для лонга в рублях. Философия расчета стопов у каждого своя. Лично я люблю привязывать размер стопа к ATR. Здесь я не буду показывать расчет своего стопа, т.к. цель  у меня сейчас другая, да и не поместишь весь объем программы в один топик. Просто представим, что стоп мы уже рассчитали и подаем его на вход.

stoploss_short — Размер стопа для шорта в рублях

last_tick – Текущая цена инструмента.

Также в нашем алгоритме будут использоваться промежуточные переменные:

depo_limit — Текущий размер депозита

max_risk_trade — Максимальный допустимый риск на одну сделку

max_depo_limit — Максимальный депозит, который у нас был.

max_drawdown — Максимальный размер просадки от максимального депозита.

max_money – Разница между максимально возможной просадкой и текущей просадкой.

max_money_long — --Сумма доступных средств с учетом плеча и максимальной просадки для лонга

max_money_short — --Сумма доступных средств с учетом плеча и максимальной просадки для шорта

risk_long – текущий риск для лонга

risk_short – текущий риск для шорта

На выходе получаем переменную lot – размер позиции.

В итоге получилась такая блок схема:

 Реализация мани - риск менеджмента при помощи коэффициента Келли, готовая функциональная блок-схема
Реализация мани - риск менеджмента при помощи коэффициента Келли, готовая функциональная блок-схема

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

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

Всем профита!

21 Комментарий
  • zica
    10 декабря 2014, 13:14
    уверяю Вас.всё гораздо проще.Нужно уметь бегло считать до 3
  • Krechetov
    10 декабря 2014, 13:16
    Смысла нет. Для формулы Келли обычно в нормальных системах будут такие большие плечи что ставить их не разумно.

    Тут есть эффект такой, дело в том что оптимальное плечо по формуле у вас будет находиться для истории. Соответственно будущие сделки с плечом по формуле будут искажать результаты, зачастую в худшую стоону и чтобы их скорректировать вам снова надо будет применить формулу Келли и т.д. в итоге это замкнутый круг :)
  • Tуземец
    10 декабря 2014, 13:17
    идриттвоюзаногу
  • V.V.
    10 декабря 2014, 14:52
    Сердюк Иван,

    Сколько в среднем сделок по одному инструменту совершаете?
    Алгоритмы основаны на известных индикаторах или на своих разработках?

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн