Введение - межрыночный и статистический арбитраж
Межрыночный арбитраж - это одновременная покупка и продажа актива на разных рынках с целью извлечения прибыли из разницы цен. Соответственно, арбитражная ситуация (или возможность арбитража) возникает, когда разница цен актива на разных рынках превышает торговые и транспортные издержки. При этом, если арбитражер - спекулянт, пытающийся извлекать прибыль из разницы цен - способен заключать встречные сделки на разных рынках строго одновременно, его прибыль будет безрисковой (то есть он не несет риска потерь в результате изменения цен в ту или иную сторону).
Статистический арбитраж - это одновременная покупка и продажа на одном или разных рынках нескольких активов, цены которых взаимосвязаны (коинтегрированы), с целью извлечения прибыли из краткосрочного расхождения цен этих активов. При этом арбитражер надеется, что расхождение цен временное и в ближайшее время будет компенсировано. В отличие от межрыночного арбитража, статистический арбитраж является рискованной сделкой, поскольку арбитражер несет риск дальнейшего расхождения цен, которое может остаться не скомпенсированным в разумное время.
Если, торгуя разницу цен на один и тот же актив на разных рынках, арбитражер получает немедленную прибыль (купил и тут же продал актив), то в случае попыток извлечь прибыль из (предположительно) временного расхождения взаимосвязанных (по мнению арбитражера) цен на разные активы, получение прибыли обусловлено закрытием позиций в обоих активах, после того как цены снова сошлись.
Треугольный арбитраж на межбанковском рынке, по сути, является межрыночной формой арбитража. Например, арбитражер может купить EUR в обмен на USD в банке A, одновременно купить GBP в обмен на купленный EUR в банке B, и наконец снова купить USD в обмен на имеющиеся GBP в банке C. Может так получиться, что в результате разницы курсов в трех разных банках, сумма американских долларов, оставшихся в руках арбитражера после проведения описанной транзакции, окажется больше первоначальной суммы. Если при этом арбитражер заключит все три сделки с банками одновременно (ну или почти одновременно), он получит эту прибыль ничем не рискуя.
К сожалению, такая сделка невозможна на маржинальном счете, так как в этом случае арбитражер не может поставить проданную валюту банку взамен купленной, вся валюта должна остаться на счете дилера в качестве обеспечения по сделке. Торгуя на маржинальном счете, арбитражер может лишь, дождавшись возникновения арбитражной ситуации, и, открыв позиции в одну сторону (например buy EURUSD - sell EURGBP - sell GBPUSD), снова дожидаться переворота арбитражной ситуации в обратную сторону, чтобы закрыть все позиции.
Поэтому, ставя себе задачу реализовать треугольный арбитраж на маржинальном счете, необходимо отдавать себе отчет, что имеешь дело со статистическим, а не с межрыночным, как на межбанке, арбитражем.
Понимая это, рассмотрим, какая пара активов обладает достаточной статистической взаимозависимостью, для того, чтобы сделать возможным статистический арбитраж на маржинальном счете.
Кросс-курс и синтетическая кросс-пара
С 1943 года расчетной валютой в международной торговле служит доллар США. Поэтому обменные курсы всех остальных национальных валют принято выражать к американскому доллару, либо в прямой ("домашней") котировке, то есть сумма USD за одну национальную валюту, либо в обратной ("иностранной"), то есть сумма национальной валюты за один доллар США.
Курс национальной валюты (назовем ее базовой), выраженный в единицах другой (кроме доллара США) национальной валюты (назовем ее котируемой), называется кросс-курсом. Кросс-курс вычисляется, как частное курса базовой и котируемой валют выраженных в прямой котировке к доллару США. Если курс котируемой валюты представлен в обратной котировке, то кросс курс вычисляется как произведение курсов(валюты, представленные в обратной котировке редко бывают базовыми валютами). Например, кросс-курс EUR к GBP вычисляется как EURUSD / GBPUSD, а кросс курс EUR к JPY вычисляется как EURUSD х USDJPY. С ростом оборота международной торговли, растет объем торговых операций в национальных валютах, минуя доллар США.
В результате возрастаем объем обменных операций через кросс-курсы, кросс-пары становятся самостоятельным торговым инструментом и на рынке ФОРЕКС. В дальнейшем, кросс-парой я буду называть торговый символ, представленный в платформе МТ5 как самостоятельный торговый инструмент, выражающий кросс-курс двух национальных валют друг к другу. Синтетической кросс-парой (или просто синтетиком или кросс-курсом) я буду называть расчетный курс, вычисленный исходя из курсов этих национальных валют по отношению к доллару США. Название "синтетическая пара" выбрана потому, что я всегда могу воссоздать (синтезировать) такую кросс-пару открыв две позиции в соответствующих валютных парах к доллару США (например long EURUSD + short GBPUSD образует синтетическую кросс-пару long EURGBP).
Важно понимать, что вычисленный курс синтетической кросс-пары на свободном рынке не обязан совпадать с курсом торгуемой росс-пары, так как курс синтетика зависит от спроса и предложения на национальные валюты в отношении к доллару США, а курс торгуемой кросс-пары зависит от спроса и предложения национальных валют относительно друг-друга. Опыт показывает, что курс синтетической кросс-пары может (временно) отклоняться от курса торгуемой кросс-пары в ту или иную сторону на несколько пунктов.
А раз такие отклонения периодически возникают, значит можно попытаться извлечь из них прибыль путем проведения статистического арбитража между кросс-парой и синтетической кросс-парой.
Принцип работы советника TriArb Trader
Через равные промежутки времени, задаваемые в миллисекундах параметром "Arb. period (msec)", советник вычисляет курс синтетической кросс-пары и сравнивает его с курсом кросс-пары в терминале. Если в какой-то момент времени положительная разница между котировкой "bid" кросс-пары и котировкой "ask" синтетика окажется больше параметра "Min. deviation for IN-trade (points)", советник откроет long в синтетике и short в кросс-паре. При этом в логе советника появится сообщение подобное следующему:
TriArbTrader_v7-2 (EURUSD,M1) 2016.10.03 17:00:00 TriArbBuy666 Direction = 0 deviation = 13.10 profit = 0.00
Где название функции "TriArbBuy" указывает на направление открываемой сделки (buy синтетик), номер "666" - соответственно ID советника, в первой строке указаны котировки всех трех валют треугольника, а во второй девиация курса кросс-пары и синтетика (в пунктах). Direction = 0 означает, что на момент проверки отсутствуют открытые позиции в каком-либо направлении.
Соответственно, если положительная разница между котировкой "bid" синтетика и котировкой "ask" кросс-пары окажется больше параметра "Min. deviation for IN-trade (points)", советник откроет short в синтетике и long в кросс-паре. Сообщение в логе будет выглядеть следующим образом:
TriArbTrader_v7-2 (EURUSD,M1) 2016.10.03 00:02:42 TriArbSell666 Direction = 0 deviation = 295.77 profit = 0.00
Название функции "TriArbSell", опять же, указывает на направление открываемой позиции - sell синтетик.
После того, как советник получит сообщение от сервера о том, что все три ордера приняты дилером к исполнению, советник выдаст соответствующее сообщение в логе.
В случае открытия buy синтетик, сообщение будет выглядеть так:
TriArbTrader_v7-2 (EURUSD,M1) 2016.10.03 17:00:02 DealBuy666 EURUSD Vol = 0.1 completed at 1.12154 after 1 tries
TriArbTrader_v7-2 (EURUSD,M1) 2016.10.03 17:00:02 Slippage = 12
TriArbTrader_v7-2 (EURUSD,M1) 2016.10.03 17:00:02 DealBuy666 GBPUSD
TriArbTrader_v7-2 (EURUSD,M1) 2016.10.03 17:00:02 DealBuy666 GBPUSD Vol = 0.09 completed at 1.28354 after 1 tries
TriArbTrader_v7-2 (EURUSD,M1) 2016.10.03 17:00:02 Slippage = 5
TriArbTrader_v7-2 (EURUSD,M1) 2016.10.03 17:00:02 DealBuy666 EURGBP
TriArbTrader_v7-2 (EURUSD,M1) 2016.10.03 17:00:09 DealBuy666 EURGBP Vol = 0.1 completed at 0.87351 after 1 tries
TriArbTrader_v7-2 (EURUSD,M1) 2016.10.03 17:00:09 Slippage = 29
а в случае открытия sell синтетик немного иначе:
TriArbTrader_v7-2 (EURUSD,M1) 2016.10.03 00:02:50 DealSell666 EURUSD Vol = 0.1 completed at 1.12403 after 1 tries
TriArbTrader_v7-2 (EURUSD,M1) 2016.10.03 00:02:50 Slippage = 0
TriArbTrader_v7-2 (EURUSD,M1) 2016.10.03 00:02:50 DealSell666 GBPUSD
TriArbTrader_v7-2 (EURUSD,M1) 2016.10.03 00:02:52 DealSell666 GBPUSD Vol = 0.09 completed at 1.29265 after 1 tries
TriArbTrader_v7-2 (EURUSD,M1) 2016.10.03 00:02:52 Slippage = 7
TriArbTrader_v7-2 (EURUSD,M1) 2016.10.03 00:02:52 DealSell666 EURGBP
TriArbTrader_v7-2 (EURUSD,M1) 2016.10.03 00:02:56 DealSell666 EURGBP Vol = 0.1 completed at 0.86655 after 1 tries
TriArbTrader_v7-2 (EURUSD,M1) 2016.10.03 00:02:56 Slippage = 0
Количество попыток (tries = 1) указывает на то, что в данном случае ордер был принят торговым сервером с первой попытки (максимальное число попыток задается параметром "Max. number of trade retries"), а показатель "Slipage = X" показывает разницу в пунктах, между ценой, при которой советник обнаружил торговую ситуацию, и ценой по которой торговый сервер принял ордер к исполнению.
По-сути, показатель "Slipage" демонстрирует на сколько первоначальное расхождение успело скомпенсироваться за время с момента обнаружением арбитражной ситуации до момента открытия позиций, то есть упущенный профит (в пунктах). Высокое значение показателя говорит о наличии значительной задержки между отправлением и принятием торгового приказа.
Следующим шагом советник проверит целостность полученного треугольника. Однако прежде чем приступить к выполнению такой проверки, советник сделает паузу, длительность которой в миллисекундах задается параметром "Pause before integrity check (msc)". Эта пауза необходима для того, чтобы брокер успел исполнить все ордера и дать сообщение об открытии позиций.
Если проверка целостности треугольника показывает, что все в порядке, советник запоминает направление арбитража (Direction = 1 в случае buy синтетик, и Direction = -1 в случае sell синтетик) и приступает к отслеживанию позиций.
Если же проверка показала, что в треугольнике не хватает одной или нескольких сторон, советник попытается открыть недостающие позиции. Если открыть недостающие позиции по какой-то причине не получится, советник повторит попытку еще несколько раз (количество повторных попыток также определяется параметром "Max. number of trade retries"), и в случае неудачи, закроет все позиции.
При этом в логе советника будет выведено соответствующее сообщение.
В процессе отслеживания позиций, советник вычисляет текущий профит по суммарной позиции треугольника. Период вычисления профита соответствует периоду, заданному в миллисекундах параметром "Arb. period (msec)". Если суммарный профит треугольника превысит уровень, заданный параметром "Take Profit (USD)", советник даст приказ на закрытие всех позиций.
При этом сообщение, выводимое в логе советника в случае закрытия позиций buy-синтетик будет выглядеть следующим образом:
TriArbTrader_v7-2 (EURUSD,M1) 2016.10.12 19:58:06 ProfitBuy666 Direction = 1 profit = 5.20
Где название функции "ProfitBuy666" и значение показателя "Direction = 1" указывают на направление существующей позиции buy-синтетик, 666 - ID советника, а "profit = 5.20" - значение профита на момент отправки приказа на закрытие сделок (реальный профит может оказаться выше или ниже, в зависимости от наличия задержек исполнения и направления движения цен за это время).
В случае закрытия позиции sell-синтетик, запись в логе будет выглядеть соответственно:
TriArbTrader_v7-2 (EURUSD,M1) 2016.10.18 11:30:00 ProfitSell666 Direction = -1 profit = 5.90
ВНИМАНИЕ! Значение параметра "Take Profit (USD)" задается в единицах валюты депозита, то есть если депозит (и профит) вычисляется на счете в EUR, то советник воспринимает параметр, как заданный в EUR.
После принятия ордеров торговым сервером в логе появятся соответствующие записи (в случае закрытия позиции buy-синтетик):
TriArbTrader_v7-2 (EURUSD,M1) 2016.10.12 19:58:17 DealSell666 EURUSD Vol = 0.1 completed at 1.10297 after 1 tries
TriArbTrader_v7-2 (EURUSD,M1) 2016.10.12 19:58:17 Slippage = 0
TriArbTrader_v7-2 (EURUSD,M1) 2016.10.12 19:58:17 DealSell666 GBPUSD
TriArbTrader_v7-2 (EURUSD,M1) 2016.10.12 19:58:21 DealSell666 GBPUSD Vol = 0.09 completed at 1.22214 after 1 tries
TriArbTrader_v7-2 (EURUSD,M1) 2016.10.12 19:58:21 Slippage = 20
TriArbTrader_v7-2 (EURUSD,M1) 2016.10.12 19:58:21 DealSell666 EURGBP
TriArbTrader_v7-2 (EURUSD,M1) 2016.10.12 19:58:24 DealSell666 EURGBP Vol = 0.1 completed at 0.90265 after 1 tries
TriArbTrader_v7-2 (EURUSD,M1) 2016.10.12 19:58:24 Slippage = 85
а в случае закрытия позиции sell-синтетик:
TriArbTrader_v7-2 (EURUSD,M1) 2016.10.18 11:30:04 DealBuy666 EURUSD Vol = 0.1 completed at 1.10158 after 1 tries
TriArbTrader_v7-2 (EURUSD,M1) 2016.10.18 11:30:04 Slippage = 5
TriArbTrader_v7-2 (EURUSD,M1) 2016.10.18 11:30:04 DealBuy666 GBPUSD
TriArbTrader_v7-2 (EURUSD,M1) 2016.10.18 11:30:09 DealBuy666 GBPUSD Vol = 0.09 completed at 1.22579 after 1 tries
TriArbTrader_v7-2 (EURUSD,M1) 2016.10.18 11:30:09 Slippage = 79
TriArbTrader_v7-2 (EURUSD,M1) 2016.10.18 11:30:09 DealBuy666 EURGBP
TriArbTrader_v7-2 (EURUSD,M1) 2016.10.18 11:30:10 DealBuy666 EURGBP Vol = 0.1 completed at 0.89828 after 1 tries
TriArbTrader_v7-2 (EURUSD,M1) 2016.10.18 11:30:10 Slippage = 3
Если учет позиций на счете производится в режиме хеджинг, в лог дополнительно будут выведены соответствующие записи:
TriArbTrader_v7-2 (EURUSD,M1) 2016.10.12 19:58:36 CloseBy666 GBPUSD completed after 1 tries
TriArbTrader_v7-2 (EURUSD,M1) 2016.10.12 19:58:52 CloseBy666 EURGBP completed after 1 tries
В случаях, когда позиция долго не выходит в плюс, а суммарный убыток по ней превысил (по модулю) значение параметра "Max. Loss (USD)" (заданного в единицах валюты депозита), советник попытается выйти в момент максимально благоприятного отклонения курсов синтетика и кросс пары.
Если открыта позиция buy-синтетик, советник дождется, пока разница между курсом "bid" синтетика и курсом "ask" кросс-пары окажется больше параметра "Min. deviation for OUT-trade (points)", после чего отдаст приказ на закрытие позиций.
При этом в логе советника будет выведено следующее сообщение:
TriArbTrader_v7-2 (EURUSD,M1) 2016.10.07 02:39:29 TriArbSell666 Direction = 1 deviation = 14.37 profit = -8.50
Название функции "TriArbSell" и параметр "Direction = 1" указывает на направление закрываемой позиции buy-синтетик. Значение "profit = -8.50" указывает на то, что сделка закрылась по девиации в после того, как убыток по позиции превысил максимально допустимое значение, установленное параметром "Max. Loss (USD)".
Если открыта позиция sell-синтетик, советник дождется, пока разница между курсом "bid" кросс-пары и курсом "ask" синтетика окажется больше параметра "Min. deviation for OUT-trade (points)", после чего отдаст приказ на закрытие позиций.
При этом в логе советника будет выведено следующее сообщение:
TriArbTrader_v7-2 (EURUSD,M1) 2016.10.07 02:32:21 TriArbBuy666 Direction = -1 deviation = 15.25 profit = -12.19
Название функции "TriArbBuy" и параметр "Direction = -1" указывает на направление закрываемой позиции sell-синтетик. Значение "profit = -12.19" указывает на то, что сделка закрылась по девиации в после того, как убыток по позиции превысил максимально допустимое значение, установленное параметром "Max. Loss (USD)".
Параметры и их рекомендуемые значения
Несколько слов о том, как выбирать треугольник.
Советник может торговать любые заданные ему три валюты. Главное, чтобы при этом они были введены в правильном порядке.
Для того, чтобы правильно выбрать торговый треугольник, проще всего начать с кросс-пары. Допустим мы выбрали для торговли кросс-пару EURJPY (евройена).
Шаг 1. Вставить "EURJPY" в качестве значения параметра "Cross pair (as First major vs Second major)".
Шаг 2. В качестве первой основной валюты (First major) необходимо выбрать первую валюту в кросс-паре. Первой валютой в нашей кросс-паре является EUR, который котируется к доллару США в прямой котировке - EURUSD. Соответственно, мы можем вставить "EURUSD" в качестве значения параметра "First major pair (vs USD)".
ВНИМАНИЕ! В качестве первой основной валюты (значение параметра "First major pair (vs USD)") ВСЕГДА должна стоять валюта в прямой котировке.
Шаг 3. В качестве второй основной валюты (Second major) необходимо поставить валюту, стоящую на втором месте в кросс паре. В нашем случае это JPY. Проблема в том, что йена котируется к доллару США в обратной котировке. Поскольку в терминале существует только инструмент "USDJPY", в качестве параметра "Second major pair (vs USD)" мы должны указать именно его. При этом необходимо указать советнику, что вторая основная валюта задана в обратной котировке. Для этого переведем значение параметра "Both majors are in direct quotation" в положение false.
Все. Наш треугольник настроен.
В таблице ниже перечислены все параметры советника, а также рекомендации по их настройке.
Variable | Value | Recommendation |
---|---|---|
First major pair (vs USD) | EURUSD | Первый символ валюты в котировке кросс пары (EURjpy). |
Second major pair (vs USD) | USDJPY | Второй символ валюты в котировке кросс-пары (eurJPY). |
Cross pair (as First major vs Second major) | EURJPU | Выбрать кросс-пару, которую советник будет торговать (советник лучше ставить на график этой кросс-пары). |
Both majors are in direct quotation | false | Установить false, если вторая основная валюта задана в обратной котировке. |
Expert Advisor ID (Magic Number) | 666 | Уникальное число для каждого советника, работающего в терминале (лучше не ставить два советника на одну кросс-пару). |
Max deviation (slipage) | 30 | Лучше выбирать параметр достаточно большим, так как для советника важнее открыть сделку, нежели открыть по лучшей цене. |
Arb. period (msec) | 500 | Периодичность проверки арбитража и вычисления текущего профита. Параметр должен быть примерно равен частоте поступления тиков в самую "быструю" пару. |
Pause before integrity check (msc) | 10 | Выставит примерно равной пингу до сервера брокера. |
Max. number of trade retries | 10 | Десяти попыток вполне достаточно, если сделка не проходит с 10-й попытки, это повод сменить брокера. |
Min. deviation for IN-trade (points) | 5 | Советник указывает в логе значение девиации, при которой он выдал сигнал на открытие позиций. Имеет смысл выставлять значение параметра равным значению девиации в момент открытия, при которой сделка закрылась в плюсе, отсекая таким образом потенциально убыточные сделки. |
Min. deviation for OUT-trade (points) | 10 | Лучше ставить немного больше или равным значению девиации для входного сигнала. |
Take Profit (USD) | 10 | Подобрать опытным путем. Лучше ставить большим, так как нет смысла закрывать $10, если треугольник потенциально показывает $100. Однако, слишком большое значение параметра приведет к закрытию сделок с убытком по девиации или слишком долгому времени ожидания. В последнем случае лучше уменьшить, пока убыточные сделки не уменьшатся до 1-2%. |
Max. Loss (USD) | 15 | Значение должно быть больше параметра Take profit. |
Trading volume | 1 | Не более 1 (одного) лота на $10'000 депозита. |