Стратегия статистического арбитража на американском рынке акций

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

В первую очередь мне хотелось бы сказать о недостатках стратегии парного трейдинга. Эта стратегия требует значительно большего капитала, чем торговля одним инструментом. Вам нужно открывать позицию в лонг по одной акции и в шорт по другой акции, причем с разным объемом по каждой из сторон. Для диверсификации риска нужно открывать позиции по нескольким парам. Далее вам нужен брокер, который предоставляет возможность торговать дробными лотами, чтобы можно было установить точное соотношение объема в паре. Еще меньше брокеров могут предоставлять большие плечи (4-е, 5-е плечо) для переноса позиций на следующий день.На практике некоторые ограничения, указанные выше, можно обойти. Например, отбирать пары из дешевых акций, их можно найти немало, особенно если это будут пары не совсем идеальные с точки зрения статистических показателей. Можно подбирать пары, соотношение акций в которых близко к целому лоту, можно пробовать торговать парами внутри дня, не перенося позиции на следующий день. Можно использовать эту стратегию на фьючерсах, опционах, они требуют меньше капитала. Решения есть, но они будут сужать возможности стратегии.

Рынок американских акций тем и интересен, что из нескольких тысяч акций можно подобрать несколько сотен идеальных пар. Можно каждый день открывать несколько новых позиций и закрывать несколько позиций, которые уже дали прибыль. Теоретически пар между акциями, ETF, индексами может существовать несколько десятков миллионов, но на практике, при правильном подходе к отбору, оказывается, что пар не так уж и много. Самое простое – это начать искать скоррелированные и коинтегрированные пары акция-акция и ETF-ETF из одной индустрии. В этом случае у вас нет риска рынка и риска сектора. Конечно, можно найти отличные с точки зрения статистики и хорошо выглядящие на графике пары из разных индустрий одного сектора, или вообще из разных секторов, но нужно понимать, что у вас увеличиваются риски. Можно найти пару акций с отличными показателями коинтегрированности, c хорошим графиком, но из разных секторов, и начать ее торговать, но не удивляетесь, если неожиданно эта пара сломается по совершенно непонятной причине. Нужно хотя бы понимать, как фундаментально связаны компании, есть ли, например, какие-то производственные цепочки между ними. Должен быть какой-то фундамент под статистикой этой пары.

От правильно отобранных пар будет зависеть 80% успеха. Я бы рекомендовал в первую очередь сконцентрироваться на поиске пар акция-акция и ETF-ETF в финансовом и технологическом секторах. Отберите самые лучшие пары, чтобы пара включала в себя акции или ETF из одной индустрии. Позже вы можете ставить эксперименты с акциями из разных индустрий, секторов, акций и ETF, акций и индексов. Я пробовал пары акция-индекс с целью снижения капиталоемкости, но такие пары мне не понравились. Не стоит торговать пары из индустрии биотехнологии, также с большой осторожностью относитесь к парам из индустрии нефти и газа.
В первую очередь я бы хотел рассказать об инструментах отбора пар, а потом перейдем к инструментам, необходимым нам для торговли. Для отбора мы будем использовать общедоступную и бесплатную платформу thinkorswim. Если после первого знакомства со стратегией вам захочется погружаться в эту тему и дальше, то вы сможете найти инструменты отбора пар, например, с помощью MATLAB и подобрать индикаторы для вашей торговой платформы. Они не сложные, главное — понять сам подход к торговле парами.

Для начала воспользуйтесь сканером finviz и выберите интересующий вас сектор и индустрию в этом секторе. Например, по ссылке выбран финансовый сектор и индустрия Acciden & Health Insurance. Копируем тикеры, вставляем в тестовый файл, далее открываем Excel, вставляем тикеры из текстового файла в ячейку Excel. Нам нужно разбить тикеры по столбцам, а Excel адекватно не работает с данными, скопированными из finviz. Нужно копировать тикеры или через текстовый файл, или в Excel вручную убирать пробелы между тикерами и заменять их, например, запятыми. После этого можно разбить тикеры по столбцам (вкладка данные, тест по столбцам). Далее нам нужно развернуть тикеры из строки в колонку. Выделяем ячейки с тикерами, кликаем правой кнопкой мыши по свободной ячейке и выбираем вкладку Специальная вставка и, далее, кнопку Транспонировать. Потом, чтобы получить из тикеров их пары, нам нужен специальный Excel файл. Он нужен нам, чтобы получить сочетания тикеров без перестановок. Т.е. если есть акции AIV и AVB, то в этом файле в списке пар будет пара AIV-AVB, а пары AVB-AIV уже не будет. Итак, копируем колонку с тикерами в первую колонку файла Excel Сочетания без перестановок. К сожалению, файл принимает только по 25 тикеров. Сходу я лучшего варианта не нашел в сети, возможно, вам повезет больше, или вы создадите свой файл, создающий комбинации пар. Нажимаем на кнопку Нажми и из 25-и тикеров получаем несколько сотен пар. Остается только сделать замену пробела между тикерами на знак минус (идете во вкладку главная, найти и выделить, заменить). Скопируйте полученные пары в текстовый файл. К сожалению, тут приходится подробно писать про работу в Excel, т.к. если вы регулярно его не используете, то вы потратите немало времени на поиск решения простых задач, никак не связанных с трейдингом.

Мы получили пары по индустрии Acciden & Health Insurance. Таким же способом нам нужно пройтись по всем интересующим нас индустриям. Хочу сразу предупредить, что работа по созданию и отбору пар долгая и монотонная. Но зато после этого вы начнете отличать хорошие графики пар от плохих. Далее данные с парами из текстового файла мы будем загружать в thinkorswim, создав новый watchlist. Придется вручную просматривать графики и статистические показатели тысяч пар. Постепенно, обрабатывая одну индустрию за другой, с этой задачей можно справиться.
Про регистрацию в thinkorswim я тут писать не буду, там все просто. Сейчас thinkorswim дает пробный период на два месяца. Если их будет недостаточно и вам нужно продлить регистрацию, то вы делаете новую регистрацию на новом компьютере и используете эти новые логин и пароль следующие два месяца.
Для отбора пар в thinkorswim нам нужно использовать дневной таймфрейм и линейный график. Также на график установите простую скользящую среднюю с периодом 20.
На первом этапе для отбора я использовал два статистических показателя пары. Первым показателем была корреляция Пирсона.

Код расчета корреляции Пирсона для thinkorswim:

def period = 250;
plot corr = correlation(close(getsymbolPart(1))-close(getsymbolPart(1))[1],close(getsymbolPart(2))-close(getsymbolPart(2))[1],period);

Для правильного отображения графика данного индикатора в настройках нужно поставить галочку в опции Left axis:

Настройка индикатора корреляции Пирсона

Я отбирал пары с корреляцией 0.7 и лучше. Но вы можете установить и более жесткие условия отбора. Например, отбирать пары с корреляцией 0,8 или 0,85. Чем больше корреляция, тем меньше пар вы найдете. Кроме этого, в парах со слишком хорошей корреляцией мало что можно заработать.

Вторым показателем, по которому я отбирал пары, была степень коинтегрированности двух акций, входящих в пару. Про коинтеграцию вы можете прочитать, например, в этой статье. Из этой статьи я взял и код для thinkorswim. В этом коде степень коинтегрированности рассчитывается через разницу между двумя скользящими средними. Чем разница меньше, тем более стационарен спред между скользящими.

Код расчета степени коинтеграции для thinkorswim:

def Data1 = close(GetSymbolPart(1));
def Data2 = close(GetSymbolPart(2));
def kf = close(GetSymbolPart(1))[500];
def kff = close(GetSymbolPart(2))[500];
def bn = BarNumber();
def hbn = HighestAll(bn);
def bn_diff = hbn-bn;
def kf1 = GetValue(kf, -bn_diff);
def kf2 = GetValue(kff, -bn_diff);
def Data11 = (Data1/kf1-1)*100;
def Data22 = (Data2/kf2-1)*100;
def av1 = average(Data11,50);
def av2 = average(Data22,50);
def minus = sum(AbsValue(av1-av2),450)/450;
addLabel (yes, minus ,color.cYAN);

Расчетный показатель коинтеграции пары мы смотрим на графике с дневным таймфреймом. Я отбирал пары с показателем 10 и ниже.
Конечно, для оценки степени коинтеграции между временными рядами существуют более правильные и более сложные тесты. С точки зрения математики и эконометрики наши инструменты достаточно примитивны, но они работают, и помогают искать хорошие пары для торговли. Для дальнейшего изучения этого вопроса я бы порекомендовал, например, посмотреть сервис pairtradinglab. Вам будет полезно изучить тесты, которые они используют для отбора пар. Кроме это, некоторую информацию по парам там можно получить бесплатно.

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

Код расчета объема пары для thinkorswim:

declare lower;
input BP = 1000;
def vola = ((high(GetSymbolPart(1))/low(GetSymbolPart(1))) – 1) * 100;
def volb = ((high(GetSymbolPart(2))/low(GetSymbolPart(2))) – 1) * 100;
def volaav = SimpleMovingAvg(vola,50);
def volbav = SimpleMovingAvg(volb,50);
plot posa = (BP/volaav)/(close(GetSymbolPart(1)));
plot posb = (BP/volbav)/(close(GetSymbolPart(2)));
#plot pair = (close (GetSymbolPart(1))*posa) – (close(GetSymbolPart(2))*posb);

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

Индикатор коинтеграции и корреляции для TOC

В левом верхнем углу выводится показатель коинтеграции пары, справа вверху данные по степени корреляции и график изменения корреляции во времени. Под графиком вы видите данные по объему пары в зависимости от установленного капитала. В примере установлен капитал на пару в размере 10000$. После отбора пар все эти индикаторы можно будет убрать и оставить только те, которые будут необходимы для торговли. Об этих индикаторах мы поговорим ниже.
Для пары, которая находится у вас в листе просмотра и статистические показатели которой вам подходят, вы можете сразу в листе проставлять объемы исходя из капитала, который вы планируете задействовать на одну пару. Например, пару AIV-AVB вы измените на AIV*122-AVB*29. Учтите, что со временем соотношения объемов меняются. Периодически лист нужно просматривать и корректировать объемы пар.

Проставляя объемы, вы увидите, что график пары будет меняться. Одновременно, с проставлением объемов вы можете проводить визуальный отбор графиков пар. Вы заметите, что несмотря на хорошие показатели корреляции и коинтеграции, многие пары торговать не представляется возможным. Пары с похожими статистическими показателями могут иметь очень разный характер графиков.

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

AIV*122-AVB*29

Пара акций AIV-AVB

CUBE*166-EXR*56

Пара акций CUBE-EXR

DRH*426-HST*238

Пара акций DRH-HST

Также мне хотелось бы привести пример графика пары, которая будет неудачным выбором для торговли. Например, BK*95-STT*53:

Пара акций BK-STT

Вы видите, что в паре BK*95-STT*53 после сильного отклонения быстрого возврата к средней не происходит. Расхождение не сходится, а останавливается или просто продолжается.

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

В итоге вы получите лист пар. Теперь нам нужно установить индикаторы, которые помогут искать хорошие точки входа. Как я уже писал выше, мы торгуем отклонение от среднего. Я использую несколько дополняющих друг друга индикаторов, которые отслеживают величину этого отклонения. Это индикаторы RSI, Distance from mean и Z-Score. Их коды будут ниже. RSI я использую в некоторых парах, где на истории часто появляются трендовые движения. Я жду, когда линия RSI зайдет за границы 70 или 30 и начнет возвращаться обратно в диапазон. RSI неплохо показывает моменты разворота. Например, посмотрите пару фьючерсов золота и серебра на часовом таймфрейме. На скриншоте ниже часовой график пары 50*/GC-2562*/SI :

Пара фьючерсов GC-SI

Обратите внимание на участки графика, где RSI подходит к верхней линии. Пара интересна тем, что ее можно торговать внутри дня с относительно небольшим капиталом. Тут хотелось бы сделать небольшое отступление и показать, как мы вообще берем позиции в паре на примере пары золото-серебро. Когда график на хае, по GC мы открываем позицию шорт, а по SI лонг. Когда график пары на лоу, мы будем покупать GC и открывать шорт по SI.

Пара GC-SI достаточно сложная для торговли, она далеко не идеальна со статистической точки зрения, но среди фьючерсов небольшой выбор инструментов. В этой паре нужно ждать хорошие ситуации с сильными отклонениями. На этой паре можно часто наблюдать трендовые движения, когда пара делает, например, несколько повышающихся вершин подряд. RSI неплохо такие моменты отфильтровывает.

Индикатор Distance from mean считает размер отклонения от средней. Например, если у вас пара состоит из акций, то вы видите, сколько в долларах составляет расстояние от цены в данный момент до средней, какой потенциал в сделке. Также на истории вы видите, насколько обычно отклоняется пара и насколько она отклонилась в данный момент.
Индикатор Z-Score показывает насколько текущая цена отклонилась от среднего в стандартных отклонениях. Период, за который считается среднее, можно устанавливать самостоятельно. Период скользящей средней, RSI, Distance from mean, Z-Score я поставил равным 20. Вы можете экспериментировать с разными периодами, подобрать что-то более подходящее для торгуемых вами пар. В Z-Score я установил границы, равные третьему отклонению. Нас интересуют стандартные отклонения цены со значениями 2.5 — 3. Вообще, есть много других индикаторов, показывающие отклонение от среднего, например, BollingerBands.

Подберите подходящий для вас. Вы же понимаете теперь, что ищите на графике.
Индикатор RSI устанавливается из списка стандартных инструментов thinkorswim. По показателю RSI можно сортировать лист ваших пар во время торговой сессии. Для индикаторов Distance from mean и Z-Score я использовал коды, найденные на просторах сети.

Код индикатора Distance from mean для thinkorswim (взят тут):

declare lower;
input Length=10;
def SMA = Average(Close, Length) ;
plot plot1 = (Open-SMA);
plot plot2 = (Close-SMA);
plot1.SetDefaultColor(getcolor(5)); plot2.SetDefaultColor(getcolor(2));
Plot zeroline = 0; ZeroLine.SetDefaultColor(GetColor(1));

Код индикатора Z-Score для thinkorswim (взят тут):

#Computes and plots the Zscore
#Provided courtesy of ThetaTrend.com
#Feel free to share the indicator, but please provide a link back to ThetaTrend.com

declare lower;

input price = close;
input length = 20;
input ZavgLength = 20;

#Initialize values
def oneSD = stdev(price,length);
def avgClose = simpleMovingAvg(price,length);
def ofoneSD = oneSD*price[1];
def Zscorevalue = ((price-avgClose)/oneSD);
def avgZv = average(Zscorevalue,20);

#Compute and plot Z-Score
plot Zscore = ((price-avgClose)/oneSD);
Zscore.setPaintingStrategy(paintingStrategy.HISTOGRAM);
Zscore.setLineWeight(2);
Zscore.assignValueColor(if Zscore > 0 then color.green else color.red);

plot avgZscore = average(Zscorevalue,ZavgLength);
avgZscore.setPaintingStrategy(paintingStrategy.LINE);

#This is an optional plot that will display the momentum of the Z-Score average
#plot momZAvg = (avgZv-avgZv[5]);

#Plot zero line and extreme bands
plot zero = 0;
plot two = 3;
plot negtwo = -3;
zero.setDefaultColor(color.black);

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

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

В заключение я хочу вам дать составленный мной список пар из акций финансового сектора. Каждая акция в паре из одной и той же индустрии. Я брал акции со средним объемом торгов от 400 тысяч в день. Отбирались пары с корреляцией Пирсона от 0,7 и коинтеграцией меньше 10. Объемы в каждой паре посчитаны, исходя из капитала 10000 долларов. Создайте в thinkorswim лист с этими парами, отберите те из них, которые вы считаете более подходящими для торговли. Я специально оставил в списке пары не только с красивыми графиками. Отберите несколько понятных вам пар, настройте индикаторы, о которых я рассказывал выше, и приступайте к торговле.

AIV*122-AVB*29
AIV*122-UDR*129
AMG*30-LM*115
AMTD*72-SCHW*87
ARE*40-LPT*118
ASB*183-HBAN*261
AVB*29-CPT*52
AVB*29-EQR*78
AVB*29-MAA*52
AVB*29-UDR*129
BAC*147-CMA*49
BBT*92-BXS*127
BDN*373-CUZ*607
BK*95-STT*53
BKU*105-UCBI*139
BLK*9-EV*103
BLK*9-NTRS*42
BPOP*62-FBP*343
BRX*241-KIM*264
BRX*241-KRG*257
BRX*241-RPT*304
BXP*41-HIW*127
BXP*41-HPP*159
BXP*41-KRC*79
BXS*127-CSFL*130
C*65-JPM*43
CB*36-HIG*103
CB*36-TRV*40
COF*50-DFS*63
CPT*52-EQR*78
CPT*52-UDR*129
CUBE*166-EXR*56
CVBF*164-UMPQ*185
DOC*245-HTA*174
DRE*194-FR*169
DRH*426-HST*238
EQR*78-MAA*52
EQR*78-UDR*129
EV*103-NTRS*42
FCF*229-WBS*58
FHN*224-PNFP*60
FITB*132-HBAN*261
FR*169-PLD*78
FULT*203-VLY*300
HBAN*261-KEY*211
HIW*127-HPP*159
HIW*127-KRC*79
HIW*127-LPT*117
HPP*159-KRC*79
HPP*159-LPT*117
HR*145-HTA*174
HR*145-MPW*274
HR*145-VTR*77
HR*145-WELL*63
HST*238-SHO*295
HTA*174-VTR*77
HTA*174-WELL*63
ISBC*303-PBCT*242
IVR*391-MFA*992
JPM*43-PNC*31
KIM*264-KRG*257
KRC*79-PDM*284
KRG*257-RPAI*381
KRG*257-RPT*304
MA*17-TSS*45
MAA*52-UDR*129
MAC*86-TCO*72
MS*84-SCHW*87
MTB*27-WBS*58
NNN*103-STOR*186
NNN*103-VER*653
NTRS*42-STT*53
PFG*75-PRU*43
REG*87-ROIC*265
REG*87-SPG*28
REG*87-WRI*175
ROIC*265-RPAI*381
SBRA*178-SNH*283
SPG*28-WRI*175
VTR*77-WELL*63
WAL*75-ZION*82

You may also like

Добавить комментарий

Ваш e-mail не будет опубликован.