Парный трейдинг.

Введение

Некоторую сложность представляет построение систем, торгующих несколько бумаг одновременно. К таким системам относятся арбитражные системы и, так называемый, парный трейдинг. Недавно в голову пришел хороший пример для парного трейдинга, решил написать главу в учебник.

Основная идея

Есть у нас на рынке два хорошо торгующихся банка ВТБ и СБЕР. Оба банка считай государственных и вообще непонятно зачем таких два, но речь не об этом. Если посмотреть фюьючерсы на эти банки, то окажется, что цена лота на них как правило очень близкая. На момент написания SPFB.SBER стоит 10050руб. а SPFB.VTBR 9433руб. Понятно, что по ходу торгов цены этих банков меняются, но поскольку бизнес у них похож, фундаментальные факторы тоже зачастую одни и те же, можно предположить, что и цены их двигаются однообразно с некоторым различием.

Проверим это предположение.

Берем индикатор Price(foreign) и тащим на открытый график SPFB.SBER

В результате откроется окно настроек. Там в поле Symbol пишем тикер фьючерса ВТБ в точности так, как он называется у нас в базе.

После нажатия Ok видим, что действительно, бумаги ведут себя очень похоже.


Построим спред (разницу) цен этих двух инструментов.
Для этого воспользуемся стандартным индикатором Spread


Двойной клик по нему. В результате снова видим окно настроек. В поле Symbol2 пишем тикер фьючерса ВТБ, выбираем цвет графика спреда и Ok

В результате получаем такую картину.

Как видно, наше предположение в общем оказалось верным. Почти на всей доступной истории разница в ценах между фьючерсами Сбера и ВТБ колеблется около 0.

Для примера попробуем реализовать совсем простую систему торгующую этот спред.

Действуем так: если спред SPFB.SBER - SPFB.VTBR вырастает выше 500, то продаем SPFB.SBER и покупаем SPFB.VTBR. Когда опускается обратно до 0, закрываем обе позиции.
Если спред падает ниже -500, то покупаем SPFB.SBER и продаем SPFB.VTBR. когда спред отрастает обратно до 0 соответственно все закрываем.
Для начала напишем код, анализирующий спред и дающий предварительные сигналы.
SB = Foreign("SPFB.SBER", "Close");
VT = Foreign("SPFB.VTBR", "Close");

spred = SB - VT;

UpSig = Cross(spred, 500);
CloseUp = Cross(0, spred);
DwSig = Cross(-500, spred);
CloseDw = Cross(spred, 0);

// удаляем лишние сигналы
UpSig = ExRem(UpSig, CloseUp);
CloseUp = ExRem(CloseUp, UpSig);
DwSig = ExRem(DwSig, CloseDw);
CloseDw = ExRem(CloseDw, DwSig);

Теперь эти сигналы надо передать в виде сигналов покупки/продажи соответствующим бумагам.

UpSig продажа SPFB.SBER и покупка SPFB.VTBR
CloseUp закрытие шорта SPFB.SBER и закрытие лонга SPFB.VTBR
DwSig покупка SPFB.SBER и продажа SPFB.VTBR
CloseUp закрытие лонга SPFB.SBER и закрытие шорта SPFB.VTBR
if(Name() == "SPFB.SBER")
{
Buy = DwSig;
Sell = CloseDw;
Short = UpSig;
Cover = CloseUp;
}
if(Name() == "SPFB.VTBR")
{
Buy = UpSig;
Sell = CloseUp;
Short = DwSig;
Cover = CloseDw;
}

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

С учетом всего вышесказанного получаем готовый код.

SB = Foreign("SPFB.SBER", "Close");
VT = Foreign("SPFB.VTBR", "Close");

spred = SB - VT;

UpSig = Cross(spred, 500);
CloseUp = Cross(0, spred);
DwSig = Cross(-500, spred);
CloseDw = Cross(spred, 0);

// удаляем лишние сигналы
UpSig = ExRem(UpSig, CloseUp);
CloseUp = ExRem(CloseUp, UpSig);
DwSig = ExRem(DwSig, CloseDw);
CloseDw = ExRem(CloseDw, DwSig);
if(Name() == "SPFB.SBER")
{
SetPositionSize(1, spsShares);
Buy = DwSig;
Sell = CloseDw;
Short = UpSig;
Cover = CloseUp;
}
if(Name() == "SPFB.VTBR")
{
SetPositionSize(1, spsShares);
Buy = UpSig;
Sell = CloseUp;
Short = DwSig;
Cover = CloseDw;
}

Попробуем протестировать.
Можно конечно прогнать этот код на всех бумагах, находящихся в базе данных. Сделки все равно будут только на SPFB.SBER и SPFB.VTBR, но, по-моему, лучше тестировать только непосредственно бумаги, которые будут участвовать в торговле.
Помещаем SPFB.SBER и SPFB.VTBR в фавориты и в настройках тестера устанавливаем фильтр favourites:.

Прогоняем тест

По результатам теста прекрасно видно, что сделки открываются одовременно в противоположных направлениях.

Удачи.