Бодрого дня, уважаемые коллеги и примкнувшие к ним товарищи. Ветка это есть продолжения краткой дискуссии про тематические парки и куртизанок, что была в скайпе. Предлагаю обсудить тему арбитража. Но прежде чем начать, хотел бы сразу попросить «выступить» всех у кого есть, что сказать по делу и они готовы это сказать. Утверждения типа «на этом можно хорошо зарабатывать имея и пару лямов» и прочие утверждения в стиле Капитана Очевидности лучше пока оставить для скайпа. Если готовы обсуждать открыто (благо форум закрытый – значит можно палить граали), то давайте попробуем. Так же хочу отметить, что я в этой теме пока как свин в апельсинах. Это связано в первую очередь с возможно не самыми глубокими познаниями в статистике и рядом других причин. Но для затравки попробую выступить первым. Хочу сразу поставить все точки над «и» в вопросах терминологии. Есть много разных обзывательств, касательно арбитража. Я предлагаю утвердить слудующее:
- математический арбитраж – арбитраж при котором вероятность благоприятного исхода (гарантированного схождения)близка к 100% - это например игрища со спрэдами между ближним и дальним фьючом. Конечно говорить о 100% удаче не совсем корректно – черных леблядей никто не отменял.
- риск-арбитраж – арбитраж между акциями компаний, затеявших сделку по слиянию (поглощению). В рамках данной темы предлагаю это не трогать ибо на нашем рынке это не актуально, а для буржуйского имеет смысл при наличии больших денег, кучи времени и хорошего понимания фундаментальных факторов.
- межрыночный арбитраж – купили на ММВБ, продали на LSE. Трогать не будем ибо это дорого. -статистический арбитраж (парный трейдинг) – это именно то, что нам нужно. Назовем это арбитражем при котором ожидается, что спрэд (у нас вроде как это раздвижкой зовется) вернется к своему среднему значению в случае отклонения. При этом «среднее» может быть как и реально mean-reversing, так и 0-reversing (написал с ошибками наверно). Что брать за среднюю обсудим чуть позднее. «Участниками» парной торговли могут быть – акция+акция (для РФ работает), акция + индустриальный ETF (для РФ не работает), фьючерс-фьючерс (корзина фьючерсов – на РФ возможна, хотя и не всегда приятна), фьючерс-акция (возможна в РФ), ряд других вещей, которые на скудном рынке РФ никак не реализуются. Нас будет интересовать только два варианта: акция-акция (в том числе и американский рынок) и фьюч-фьючи (в том числе и американский рынок) Теперь посмотрим из каких «частей» складывается правильная «парная» торговля:
- определение торгуемых инструментов
- определение веса каждого инструмента в паре
- определение точки (причины) входа в позицию
- определение причины выхода из позиции -ведение позиции в течении сделки
Предлагаю обсудить по очереди каждый из пунктов ибо в подходах существует много разных мнений.
1.Определение торгуемых инструментов. Для буржуев пары подбираются с учетом следующих факторов: акции должны находиться в одном секторе\индустрии, их корреляция должна быть как можно ближе к 1(-1). Первое требование обусловлено тем, что акции одного сектора будут одинаков реагировать на рыночные риски, имеют схожие операционные модели, ну и «слабые» всегда будут стремиться за «сильными». При работе с фьючерсами обычно также ищут фундаментальные взаимосвязи (например Нефть разных марок, индексы разных стран и т.д.) Что касается корреляции – тот тут я не встретил в литературе единого мнения – как правило указывается, что акции должны коррелировать и значения в 0.5 типа как уже достаточно. «Пацаны» на буржуйских форумах все-таки склоняются к тому, что это значение не должно быть ниже 0.7-0.8. Для нашего рынка это не актуально ибо акции которыми можно торговать у нас имеют 0.9 и называются Газпромосбербанк. Некоторые продвинутые участники упоминают еще и необходимость коинтеграции, но мой скудный статистических багаж подсказывает, что добиться коинтеграции у высоко коррелированных инструментов гораздо проще. Но тут я могу быть не прав.
2.Определение веса инструмента. Тут опять же есть несколько подходов. Самый простой и самый неправильный – поделить один инструмент на другой и полученное значение будет множителем для определения веса инструмента в паре. Более продвинутые предлагают использовать формулу (цена А/бета А)/(цена Б/ бета Б). Даная фишка применима исключительно для акций, торгуемых в штатах (и условно применима для наших). Такой формулой мы учитываем волатильность инструментов относительно «эталона» которым в данном случае выступает индекс. Не могу сказать какие тут минусы ибо «глубоко» протестить это дело трудно так как самому бету считать заманаешься, а исторических данных найти в свободном доступе трудно. Еще одним способом является простое ATR A/ATR B. Работает для акций и фьючей но не совсем подходит для торговле фьюч-корзина фьючей (использует товарищь Кауфман). Попадались и иные способы (например с учетом исторической волатильности), но так или иначе все они учитывают волатильность инструментов и гораздо точнее работают нежели простая «дележка» инструментов. Для корзинки фьючей наибольший интерес предлагает метод предложенный (но не до конца раскрытый) Тарасом в его публикациях на русском трейдере.
3.Определение точки входа. Тут так же есть туча вариантов. Одни строят график спрэда и при отклонении на величину более 1.5-2-2.5(кто как) стандартного отклонения за некий промежуток времени открывают позу в надежде на возврат цены к своему среднему (стоит отметить что ст-откл. также можно посчитать по разному), кто-то в качестве фильтра еще считает Density curve. Однако у данного метода есть один неприятный момент – спрэд может не возвращаться к своему среднему значению достаточно продолжительное время. Нам же интересен короткий горизонт – не далече 3дней (ну или интрадейные колебания). Другие товарищи считают спрэд не по цене, а через формулу стохастика (без усреднения) и спрэдом для них являются разница двух стохастиков (это предлагает делать Кауфман) или же стохастик построенный по этой разнице взятый за несколько дней (автор он же). Тут у нас решается проблема возврата к «0». Есть и более изощренный вариант «от Тараса», где цена нормируется с целью избавления от «трендовой» составляющей и предполагается торговля при отходе от среднего.
4.Выход из позиции и управление позицией. Выход прямо зависит от причины входа – это или возвращение к «0» или к средней. Так же используется стоп при достижение порогового значения риска или стоп по времени удержания позы. Управление позой предполагает добавление к позиции с целью смещения точки безубыточности в случае неверного движения. Однако этот метод весьма требователен к депозиту и устойчивости задницы трейдера.
Ну вот собственно у меня все. Предлагаю высказаться по пунктам у кого есть что сказать.
Kommentare (41)
Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen
Для простого варианта статарба (парный трейдинг, расширенный до корзин) нужно найти "коинтегрированные ряды". Грубо говоря, коинтегрированность означает, что два ряда не обязательно все время ходят вместе, но имеют тенденцию время от времени сходиться (за точность не ручаюсь).
Есть много статистических метод, для понимания которых нужно знание многих других статистических метод. Например, давай просто построим спред между фьючом и базисом сбера:
Корреляция: OpCl.SBER OpCl.SRZ1 OpCl.SBER 1.000000 0.906915 OpCl.SRZ1 0.906915 1.000000
Разумеется, это не совсем корректный способ, зато простой и интуитивно понятный. Статистически более корректная процедура: http://quanttrader.info/public/testForCoint.html
А зачем такое условие? Почему не взять корреляцию и только? Пары будут ходить вместе. Ну да, разойдутся когда-то и не сойдутся. Но можно же поставить "парный стоп лосс" (херасе я придумал😎). Тоесть на определенному участке времени они у нас будут работать. Даже в реале. Ну протухнет их парность через пол года, так и что с того? Может через год они опять вернутся по стечению обстоятельств.
Да, а ты чем рисует спред?
library(rusquant)
getSymbols("SBER", from=Sys.Date()-30, src="Finam", period="15min") getSymbols("SRZ1", from=Sys.Date()-30, src="Finam", period="15min")
spread <- OpCl(SBER) - OpCl(SRZ1)*100 plot(spread)
a = cbind(OpCl(SBER), OpCl(SRZ1)) cor(a, use="complete.obs")
Комнтеграция тоже не страхует от того что модель рассыплется. В 2008 за пару месяцев статарб хеджфонды просели На 30-40% ак раз потому что конъюнктурные изменения разорвали коинтеграцию по некоторым инструментам.
График строился встроенными средствами R plot(spread)
library(rusquant)
getSymbols("SBER", from=Sys.Date()-30, src="Finam", period="15min") getSymbols("SRZ1", from=Sys.Date()-30, src="Finam", period="15min")
spread <- OpCl(SBER) - OpCl(SRZ1)*100 plot(spread)
a = cbind(OpCl(SBER), OpCl(SRZ1)) cor(a, use="complete.obs")
Кстати, высокая коинтеграция при низкой корреляции означает что спреды больше, а значит и профит mean reversion стратегий выше.
И нужно добавить, что время расхождения пар будет много больше, чем при высокой корреляции. А следовательно растут и риски.
Без R ты без проблем можешь строить спреды и изучать графики в экселе. Регрессию фитить вроде тоже можно, с помощью дополнительных пакетов, и весь процесс довольно извращенный. Не думаю, правда, что это будет эффективно. Переводить все в C#, мне кажется, имеет смысл уже только для продакшна (разумеется если продакшн в C#).
Правильная картинка:
А можно ли пример результата по такому арбитражу - чтобы бэнчмарк какой-то иметь. Я тут поупрожнялся немного Пока посчитаем спрэд «по колхозному» - берем формулу =(Закрытие-МИН(закрытий за предыдущие 8 баров))/(МАКС(Хай за 8 баров)-МИН(Лоу за 8 баров)) и вычисляем для Сбера и его Фьюча. После этого берем эти два значения и вычисляем разницу (спрэд) между ними. Берем этот спрэд и через формулу=100*(спрэд на текущем баре-МИН(спрэд за 8 баров))/(МАКС(спрэд за 8 баров)-МИН(спрэд за 8 баров)) получаем значение спрэда который колбасится в виде стохастика. Далее пишем, что если этот стохастико_спрэд меньше 5 баим сбер и селим фьюче_сбер и если он больше 95 то наоборот. Выход при пересечении спрэдом 50 в ту или иную сторону. Далее достаем из широких штанин бабло в размере достаточном для торговли 100 лотами акций (100*100=10000 акций) и примерно 100 штук фьюча. Соотношение ног ходит в диапазоне от 90 до 130 контрактов фьюча к 100лотам живых акций. Имеем просто граальную картинку Задерг в самом конец вызван скорее всего какими то кривостями в котировках. Грааль нарисован на промежутке в 3 месяца на 5 минутках. В итоге вот что имеем: профит 252 000рублей. Комиссии и проскальзывание не учитываем (для чистоты эксперимента) При этом около 154000 принес «живой сбер» и 94000 его фьюч. Если прикинуть в рублях сколько денег вливается в сделки то доходность этого грааля около 20% за 3 месяца или что-то коло 80% без реинвестирования в год А теперь печалько. Было совершено 1292 входа в позу. Учитывая что мы оперируем 100 лотов на акции 100 контрактов фьюча – мы имеем то, что спрэд + комиссия +прочая хрень делает этот вариант арбитража на 5 минутках не самым благодарным занятием. Ну вот поэтому хотелось бы понять какой на какой резалт стоит обратить внимание
Не понял логику таких вычислений. Да и зачем так. Главный игрок у нас тут - спред, т.к. именно от него образовывается Финансовый результат. Думаю для классического арбитража нужно что-то такое: Построить временной ряд спреда за последние дни, убедиться (визуально) что он стационарный Вычислить средний спред и сатандартное отклонение Выбрать порог входа и порог выхода. Например, входим когда спред уходит в +1 станд.откл. от средней, выходим когда он уходит в -0.5 - и наоборот. Так же выбрать стоп, например, 5 стд. откл. Все что нужно для бэктеста есть (лучше на тиках).
Я так тестил в стокшарповском реалтайме - результат сбер фьюч против сбера получается в целом в минус, даже без учета проскальзываний, на таком вот сыром алгоритме.
ну так расчет и строится на спрэде. Ты в своем примере делишь опен на клоуз, я делю приращение закрытия на диапазон. Другое дело что у тебя спрэд в последствии должен усредняться (как ты и говоришь в последнем посте) я же его перевожу в вариант стохастика. У нас фьючи тяготеют не к направленному движению а к "расколбасу" (хотя не так ярко выраженно как тот же Рассел или Сиплый), поэтому логично вполне делать его вокруг "0". Хотя я не настаиваю что вариант едиснтвенно верный и правильный.
А если у вас результат отрицательный...значит надо искать еще :-)
В моем изначальном примере была неправильная формула. Правильная: spread <- OpCl(SBER) - OpCl(SRZ1)*100 В случае когда арбитраж детерминированный и спред обречен на mean reversion.
В данном случае "OpCl(SRZ1)*100" - неправильно, автор также ведь потом исправился))) Правильно будет: spread <- OpCl(SBER)100 - OpCl(SRU2) plot(spread) Ведь иначе, смысл арбитража теряется. Мы должны получить "справедливую цену" спота, чтобы отлавливать спред. Умножая спот100, мы тем самым, приводим цены спота, к общему знаменателю, в последствии удобным для торговли фьючерсом... Использование OpCl(SRZ1) - думаю (если я не прав, поправьте!) попытка усреднить спред за определенный интервал времени...
Хм, как я понял сообщения выше: OpCl - это доход инструмента за период. Тогда логика его использования следующая: если спот двинулся на 1% вверх, а фьюч двинулся на 3%, то велика вероятность, что в следующий момент времени бумага будет двигаться быстрей фьюча. В конце концов на экспирации они должны быть в одной точке. Только вот зачем там коэффициент 100, если это доходность? (Sber(t)*100)/(Sber(t-1)*100) == Sber(t)/Sber(t-1)
p.s. ну да, gambler max до меня уже этим интересовался, но ему так и не ответили.
Кстати, вопрос в тему, как Вы тестируете арбитражные стратегии? С помощью каких инструментов? Для себя лишь выделил следующее: -Matlab; -R; Честно, разрываюсь между Matlab и R. Поделитесь, если не затруднит, на чем из 2-х выше перечисленных, стоит остановиться и если возможно, простенький примитивный пример...
По тестированию можно сюда обратиться http://robinzonmoney.livejournal.com/ Там же и готовая платформа для торговли любого количества пар. Правда только для ФОРТСа
По своему опыту:
если знания равны то лучше матлаб в силу наличия удобоваримого дебага и большей скорости работы. R всеже погибче будет
MatLab лучше R по множеству парамертров. Исчерпывающее сравнение на английском http://stackoverflow.com/a/1738309
Другое дело, что вопрос стоит наверняка в плоскости, что лучше, МатЛаб, приобретенный через торрент, против Р. Ведь МатЛаб стоит денег, а R бесплатен. И Матлаб стоит для компании куда дороже, чем для частного использования.
Однако, старовата ссылочка... Вот поновее: http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html
Ссылочка рассказывает о языках вообще. На Сях не видел ни одной платформы по трейдингу. Вот более менее предметная статистика (фильтр по финансовой группе):
Во-первых, видно, что R был всегда популярнее остальных решений (мое мнение - за счет бесплатности). Во-вторых, разрушается миф о Питоне, набирающем силу среди трейдеров. Видно, что бесплатный Питон, который должен иметь перформанс хотя бы половину от R, еле-еле ходит вокрут платного и дорогого МатЛаб-а.
Неправильное использование Google Trends детектед. Почему неправильно и как правильно см. тут Поэтому должно получится что-то вроде этого. Или как-то так.
Ну и отдельно по группам языков можно посмотреть тут: http://lang-index.sourceforge.net/
Откуда следует, что каждого своя правда... Но Python пока рулит.
А вот и Грааль 😀 Statistical arbitrage with Python
PS. По поводу бесплатности R. Местами да, местами нет. Слышал краем уха, что десктоп версия "Revolution R Enterprise" стоит $4500.
Михаил, можно попросить вас сделать в следующей версии S#.API тестовый пример парного трейдинга!!! Иначе все эти разговоры про парный трейдинг на основе платформы StockSharp для рядовых пользователей так и остаются только разговорами - разобраться как спрограммировать такую стратегию самостоятельно практически не представляется возможным. Так я потратил массу времени и сил в попытке запустить парный трейдинг через WeightedIndexSecurity, но выяснил что продать/купить в нужном направлении сразу несколько инструментов продавая/покупая в стратегии WeightedIndexSecurity невозможно.
Что мешает запустить несколько отдельных стратегий на покупку/продажу разных инструментов?
4 раза пересекать bid/ask spread убивает львиную долю прибыли
😳 Есть другие варианты?
Доходность того варианта парного трейдинга, который я хочу закодить (http://robotcraft.ru/vstroeniestrategii/arbitrag/89-arbitrag-difference) не зависит от пересечений стакана, а только от частоты колебания спреда за период в достаточно узком канале. Вариант с 2-мя одновременно работающими стратегиями совсем не лучшее решение, так как аналитика там единая.
А... Это стратегия, которую Давид Серебренников "многоуровневым маркетмейкингом" называет. Уже как 7 лет о ней говорит, даже хедж-фонд под нее создал... Особо не обольщайтесь.. В принципе эта стратегия рабочая, но требует использования множества пар для диверсификации..
Запускайте котирование на вход/выход по инструментам из Вашей единой аналитики, там же и следите за позициями и ценами входа, в чем сложность-то? S# по барабану сколько котирований запущено и по каким направлениям...
Понятно что все можно реализовать написав кучу кода. Но это концептуально неверно - если в StockSharp имеется инструмент типа WeightedIndexSecurity, то стратегия (объект типа Strategy) должна с ним нормально работать:
Тем более что создатели уже поместили упоминание парного трейдинга как элемента StockSharp на первую страницу сайта. Но по факту оказывается что пока рано об этом говорить.
Изначально так и задумывалось. Но по мере переделок в S# пришло понимание, что алгоритмы нельзя затягивать внутрь библиотеки (если это не стандартные алго или формулы в 1 строчку). Потому что каждый по разному вкладывает понимание Индекс. Вы например повесили на вес соотношение. Кто-то другой предпочитает вес в процентах. Кто-то - вес, определяющий доли в портфеле.
Комбинаций - море. Плюс ко всему не понятно зачем это делать внутри библиотеки, если это можно сделать как стратегию-пример. О чем и было предложено в плане самостоятельно реализации. Стандартная реализация - это как автомат для стрижки волос. Изначально у всех головы разных размеров.
С т.з. разработки - это неправильно. Мы предоставляем возможность и для pair trading и для арбитража. Инструменты есть. Работают они на низком уровне. Делать надстройки нет ни причины ни возможностей. Это все равно что создавать разработчикам платформы еще и стратегии. Этим занимаются сами пользователи.
Михаил, вполне возможно что отсутствие таких функций дает дополнительный простор для творчества пользователей... Но все же было бы очень здорово если в S.API Samples появился бы хоты бы один простой пример.
Повторюсь.
Сделать примеры для всех-всех-всех случае не возможно в принципе. Задача наполнения контента по идее должна быть возложена на пользователей. К сожалению, от пользователей на данный день можно ждать только бесплатного негатива, и нулевого конструктива.