Народ, я алготрейдер. Пишу в последнее время в основном на 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% от депозита. Когда мой убыток за один день достигает этой отметки, мой робот кроет все открытые позиции и переходит в режим, в котором он продолжает работать, но вместо открытий и закрытий позиций он просто пишет торговые сигналы в журнал. Это нужно для более точной идентификации проблемы.
Всем профита!
Тут есть эффект такой, дело в том что оптимальное плечо по формуле у вас будет находиться для истории. Соответственно будущие сделки с плечом по формуле будут искажать результаты, зачастую в худшую стоону и чтобы их скорректировать вам снова надо будет применить формулу Келли и т.д. в итоге это замкнутый круг :)
Плюс, если вы внимательно прочитали сей топик, то у меня плечо умножается не на весь депозит, а на разницу между возможной максимальной просадкой и текущей просадкой.
При таких раскладах плечо у меня не поднимается выше 1,5 от всего депозита. (6 плечо от просадки!)
Но дело в том что на рынке это не так. на рынке бывают тренды и периоды опеделённой размерности по волатильности.
Т.е. у вас плечи расчитаются по формуле для предыдущего периода и вы с этими плечами войдёте в последующий, в итоге максимизируете убыток.
тут дело не в том какие у вас там параметры по плечам и т.д… А в том что на устройчивость системы это влияет отрицательно.
Попробуйте выложить результаты тестирований с таким м/м и без него на периодах от 5 лет. думаю там будет очевидно всё по графику
Сколько в среднем сделок по одному инструменту совершаете?
Алгоритмы основаны на известных индикаторах или на своих разработках?
Индикаторы не использую. Только ATR и тот только для определения размера стопа.
Учиться торговать определенно надо. Что вы имели ввиду под словом «жонглировать»?
Жонглировать — я имел ввиду пытаться его менять в каждой сделке в зависимости от результата или групп результатов.
Не доводит это до добра, если система начинает стабильно тупить. А кто был этот Келли, он хотя бы торговал?
Я бы действовал следующим образом. Максимальный размер плеча установил бы фиксированным и не очень большим. Исходя из риска, основанного не на каких либо критериях, а на элементарном соображении о допустимых и недопустимых потерях.
Для установления сайза в каждой конкретной сделке, можно использовать два разных соображения. Одно — оценка риска данной сделки, если это возможно. Например, если есть уровень выхода по стоп-лоссу и оценка наихудшего проскальзывания, можно попытаться оценить величину потери на каждую сделку и ограничить её некоторым процентом от текущего счета.
И еще, когда Вы пишете, что максимальное плечо было 1,5 совершенно непонятно, много это или мало. Также непонятно, как это может измениться со временем, что будет, если вы возьмете (не дай Бог) переподогнанную систему, куда там зашвырнет плечо это келли. Уж где-где а в риск-менеджменте надо применять самые топорные и грубые методы оценки риска, ибо рвется там, где тонко.
— какой profit factor вы считаете приемлемым для МТС
— какой sharpe ratio вы считаете минимально допустимым для МТС.
считаете с реинвестированием или без?
— что для вас важнее: % прибыльных сделок или соотношение средней прибыли к среднему убытку?