Блог им. serdyuk

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

Народ, я алготрейдер. Пишу в последнее время в основном на 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% от депозита. Когда мой убыток за один день достигает этой отметки, мой робот кроет все открытые позиции и переходит в режим, в котором он продолжает работать, но вместо открытий и закрытий позиций он просто пишет торговые сигналы в журнал. Это нужно для более точной идентификации проблемы.

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

★28
21 комментарий
уверяю Вас.всё гораздо проще.Нужно уметь бегло считать до 3
avatar
Смысла нет. Для формулы Келли обычно в нормальных системах будут такие большие плечи что ставить их не разумно.

Тут есть эффект такой, дело в том что оптимальное плечо по формуле у вас будет находиться для истории. Соответственно будущие сделки с плечом по формуле будут искажать результаты, зачастую в худшую стоону и чтобы их скорректировать вам снова надо будет применить формулу Келли и т.д. в итоге это замкнутый круг :)
avatar
Krechetov, Здесь полный Келли и не используется. Используется полу-Келли. За 3 месяца тестов плечо не поднималось выше 6. В среднем используется 2-4 плечо. Это разве сильно много? Плюс еще контроль максимального убытка на сделку.
avatar
Сердюк Иван, 6 плечо это много :) я просто писал к тому что возился с келли когда то. Его использование просто подрывает устойчивость системы и фактически ничего не даёт. в любой системе надо стремиться к её устойчивости ИМХО а не к «прибыльности» которая на изменившемся рынке может превратиться в убыточность. Просто с келли и 6 плечом изменившийся рынок очень быстро убьёт депозит. только и всего.
avatar
Krechetov, А почему подрывает устойчивость системы? А вы как рассчитываете размер позиции?
Плюс, если вы внимательно прочитали сей топик, то у меня плечо умножается не на весь депозит, а на разницу между возможной максимальной просадкой и текущей просадкой.
При таких раскладах плечо у меня не поднимается выше 1,5 от всего депозита. (6 плечо от просадки!)
avatar
Сердюк Иван, «А почему подрывает устойчивость системы? » тестировал много раз. Сначала просто увидел что подрывает. Математически точно объяснить сейчас не смогу — если на пальцах то формулы келли или мартингейлы разные работают в ситуациях когда вероятность последующая 50 на 50.

Но дело в том что на рынке это не так. на рынке бывают тренды и периоды опеделённой размерности по волатильности.

Т.е. у вас плечи расчитаются по формуле для предыдущего периода и вы с этими плечами войдёте в последующий, в итоге максимизируете убыток.

тут дело не в том какие у вас там параметры по плечам и т.д… А в том что на устройчивость системы это влияет отрицательно.

Попробуйте выложить результаты тестирований с таким м/м и без него на периодах от 5 лет. думаю там будет очевидно всё по графику
avatar
идриттвоюзаногу
avatar
Сердюк Иван,

Сколько в среднем сделок по одному инструменту совершаете?
Алгоритмы основаны на известных индикаторах или на своих разработках?
avatar
V.V., Сделок не очень много. От 0 до 10 сделок, в среднем 2-3 сделки в день.
Индикаторы не использую. Только ATR и тот только для определения размера стопа.
avatar
херня все это, учиться торговать, а не жонглировать лотом гораздо полезнее
avatar
PASHA, А вы как рассчитываете размер позиции от фонаря?
Учиться торговать определенно надо. Что вы имели ввиду под словом «жонглировать»?
avatar
Сердюк Иван, у меня лот постоянный, на определенный отчетный период времени — полгода, год. Рассчитываю чтобы на маржу уходило не больше 1/3 капитала.
Жонглировать — я имел ввиду пытаться его менять в каждой сделке в зависимости от результата или групп результатов.
Не доводит это до добра, если система начинает стабильно тупить. А кто был этот Келли, он хотя бы торговал?
avatar
PASHA, можно слиться, имея самую лучшую систему, если регулярно брать риск больше допустимого.
avatar
SergeyJu, если система тупит тебе ничего не поможет
avatar
И критерий кэлли и f-оптимальное завышают плечо, что грустно, но еще более грустно, что никогда не знаешь наперед, сколь сильно завышают.
Я бы действовал следующим образом. Максимальный размер плеча установил бы фиксированным и не очень большим. Исходя из риска, основанного не на каких либо критериях, а на элементарном соображении о допустимых и недопустимых потерях.
Для установления сайза в каждой конкретной сделке, можно использовать два разных соображения. Одно — оценка риска данной сделки, если это возможно. Например, если есть уровень выхода по стоп-лоссу и оценка наихудшего проскальзывания, можно попытаться оценить величину потери на каждую сделку и ограничить её некоторым процентом от текущего счета.
avatar
SergeyJu, другое — сокращение сайза в зависимости от текущего дроудауна. Больше дроудаун — меньше сайз. Вблизи нового максимума счета торгуем максимальный сайз, по мере роста ДД сайз монотонно сокращается. Например, при ДД в 25% и хуже плечо не берем вовсе, при новом максимуме плечо 2 заемных на 1 свой, а между ними — линейная функция.
avatar
SergeyJu, Если бы вы читали топик, то вы бы увидели, что в моей системе используется полу-Келли и оно умножается НЕ на весь депозит, а на разницу между возможной максимальной просадкой и текущей просадкой. И из этой суммы рассчитывается размер позиции. Лично у меня за 3 месяца плечо не поднялось выше 1,5.
avatar
Сердюк Иван, что такое возможная максимальная просадка и текущая просадка? 3 месяца это конечно срок =)
avatar
Сердюк Иван, да хоть четверть келли, зачем вообще использовать неподходящую меру?
И еще, когда Вы пишете, что максимальное плечо было 1,5 совершенно непонятно, много это или мало. Также непонятно, как это может измениться со временем, что будет, если вы возьмете (не дай Бог) переподогнанную систему, куда там зашвырнет плечо это келли. Уж где-где а в риск-менеджменте надо применять самые топорные и грубые методы оценки риска, ибо рвется там, где тонко.
avatar
Иван, можете поделится информацией по следующим вопросам:

— какой profit factor вы считаете приемлемым для МТС
— какой sharpe ratio вы считаете минимально допустимым для МТС.
считаете с реинвестированием или без?
— что для вас важнее: % прибыльных сделок или соотношение средней прибыли к среднему убытку?
avatar
Гепы убьют плечевика. Келли для просчитываемых вероятностей, поэтому полукелли для арбитража, в реале лучше брать 1/6-1/8 и набирать стату. Диверсификация решает.
avatar

теги блога Сердюк Иван

....все тэги



UPDONW
Новый дизайн