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