- PVSM.RU - https://www.pvsm.ru -

Написание торгового робота для bitcoin-биржи

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

Сразу признаюсь, что никаких секретов этим постом не открою.

Идея

Для начала, почему bitcoin?

С bitcoin просто работать. Регистрация на бирже, генерация ключей, пополнение счета разными способами и все, можно торговать. Даже не нужен договор с брокером. Все взаимодействие происходит поверх http, посредствам rest или чего-то подобного. Это первая причина.

Традиционно методы прогнозирования рыночной стоимости делят на две группы: фундаментальный анализ и технический.

Фундаментальный анализ подразумевает поиск «справедливой цены». Если эта цена ниже текущей, значит финансовый инструмент переоценен, если ниже — недооценен. Переоцененный продают, недооцененный — покупают. Самый простой пример фундаментального анализа — это использование мультипликатора P/E (price/earnings ratio) [1], равного отношению рыночной стоимости акции к годовой прибыли, полученной на акцию. Берем стоимость акции и делим ее на доход компании на эту акцию. Полученное число сравниваем со средним по отрасли. Коэффициент очень популярный, приводится на всех финансовых сайтах типа finance.yahoo.com [2]. Да, yahoo еще немного жив. Прибыль публикуется раз в квартал, поэтому фундаментальный анализ хорошо работает на больших временных интервалах, месяцах и годах.

Этот пример для акций. Для bitcoin можно использовать спорные соображения о сложности майнинга, динамике роста hashrate и прочее. Честно, в работоспособность этого я не верю.
А вот технический анализ исходит из идеи, что графики содержат всю необходимую информацию для прогноза. И именно графики первыми показывают изменения рынка. А уже за ними появляются новости и меняются отсчеты. А еще при использовании технического анализа, не имеет значения природа товара. Можно выработать принципы при техническом анализе стоимости картошки и использовать их при торговле золотом. Мы же будем на примере bitcoin проверять идеи для торговли на NYSE или NASDAQ. Это вторая причина выбора bitcoin. Она же является причиной использования именно технического анализа.

Третья причина — bitcoin это круто. Можно считать его чем угодно, но это что-то определенно крутое.

Затем, о какой «идее» я говорю?

Могу привести несколько примеров, реалистичных и не очень:

  • Искать новости в twitter по ключевым словам и определять их эмоциональную окраску. В зависимости от этого, принимать решения. Это не тех. анализ, но идея хорошая.
  • Пытаться по внезапно появившимся крупным ордерам отгадать действия инсайдеров и повторять за ними.
  • Определять «качели», движения курса в рамках некоего коридора. ССЫЛКА
  • Если третий ордер на продажу четный — покупать на все :)

Терминология

Для начала, хотелось бы определить несколько терминов. Говорить будем о bitcoin и, так как bitcoin-биржи отличаются свей работой от «взрослых» бирж, я буду стараться использовать общие понятия, характерные для первых и для вторых.

Ордер (order) — он же биржевая заявка. Ордер говорит бирже о вашем намерении купить или продать какое-то количество bitcoin по какой-то цене. При достижении этой цены ордер исполняется, сделка проходит. Штука очень важная и не такая простая, как кажется. Применительно к bitcoin в общем и к бирже WEX [3] в частности, ордера бывают только лимитные отложенные (limit pending order). Рыночные ордера на продажу на wex — это лимитные, но с минимальной ценой. Рыночные на покупку — с максимальной ценой. Подробнее можно начать читать с wiki [4].

Стакан (depth of market, order book) — совокупность всех лимитных ордеров. На русском [5].

Bid — цена спроса, наивысшая цена, по которой покупатель согласен покупать. Далее [6].

Ask — цена предложения, наменьшая цена, по которой продавец согласен продавать. Далее [7].

На некоторых биржах ask и bid могут быть перепутаны, поэтому всегда надо обращать внимание на их величины. Bid всегда меньше, чем ask.

Спред (spread) — промежуток между самой низкой ценой покупки и самой высокой ценой продажи. Далее [8].

Сбор

У нас есть два варианта:

  1. Использовать исторические данные.
  2. Собрать данные самому.

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

Опять два варианта:

  1. Сырые данные.
  2. Готовые коэффициенты.

Лучше сочетать и то и то. Нам, скорей всего, понадобятся три вещи с биржи: цены (покупки, продажи, последней сделки), обороты (когда по какой цене сколько купили или продали) и состояние стакана. Цены и обороты можно писать сырыми. А вот стакан характеризуется сложно. «Сырой» стакан можно хранить массивом, как есть. Или же сразу вычислять и сохранять только нужные коэффициенты.

Research

Это самый интересный и самый творческий этап. Поэтому говорить много я о нем не буду. Покажу лишь один график.

Написание торгового робота для bitcoin-биржи - 1

График за 24 часа. Шаг — 2 секунды. Это связано с тем, что биржа кеширует на 2 секунды часть данных. Красной линией здесь изображен курс, по последней цене. Зеленой — коэффициент, сигнализирующий о покупке. Черной — о продаже.

Если покупать на зеленых максимумах и продавать на черных, то большинство сделок будут прибыльными.

Написание робота

Предположим, что мы нашли прямую зависимость между четностью третьего ордера на продажу и последующим ростом. Теперь мы уверены, если если третий ордер четный, то следует покупать. Сразу попрошу прощения у любителей go и python, но писать мы будем на java.

У WEX (wex.com [9] или wex.nz [3]) есть API. Он состоит из трех частей: public, позволяет получать общую информацию без аутентификации; trade, предназначенный для операций с ордерами; push — появился недавно, присылает оповещения в реалтайм. Этот API целиком покрывается библиотекой wexapi.

Исходники на github.com [10]

Документация на русском [11]

Wexapi есть в maven central, поэтому библиотеку можно подключить как зависимость в gradle:

compile 'com.github.artfultom:wexapi:2.0.0-RELEASE'

или в maven:

<dependency>
    <groupId>com.github.artfultom</groupId>
    <artifactId>wexapi</artifactId>
    <version>2.0.0-RELEASE</version>
</dependency>

Для начала необходимо создать клиент:

WexClient client = new WexClient("https://wex.nz", key, secret);

Key и secret используются для trade API, генерируются в личном кабинете биржи. Конечно же их надо держать в секрете и не коммитить на github.

Затем с помощью этого клиента можно получать публичные данные. Информацию о торгах по паре btc-usd за последние 24 часа:

Map<String, Ticker> tickerMap = client.publicApi().getTicker("btc_usd").execute();
Ticker ticker = tickerMap.get("btc_usd");

Стакан с ограничением в 1000 ордеров:

Map<String, Depth> depthMap = client.publicApi().getDepth("btc_usd").setLimit(1000).execute();
Depth depth = depthMap.get("btc_usd");

Публичный API кешируется биржей. В документации заявлено 2 секунды, это почти так.

В trade API есть один неприятный момент — минимальное размер сделки. Для btc-usd он равняется 0.001 BTC. Учитывая, что операции по этой паре имеют точность 3 знака после запятой, то, если у вас на счету 0.0009 BTC, сделать с ними через API ничего не удасться. А вот через сайт можно. Самая частая операция из trade API скорей всего будет:

client.tradeApi().trade(
    "btc_usd", 
    OrderType.SELL, 
    price.setScale(3, RoundingMode.DOWN), 
    amount.setScale(decimalPlaces, RoundingMode.DOWN)
);

Как можно догадаться, это продажа. И необходимый тут BigDecimal сильно усложняет простые арифметические операции. Но кому сейчас легко?

Также есть пара методов, работающая через сервис пуш-нотификаций:

client.pushApi().subscribeToTrade("btc_usd", trades -> {
    // видим сделки
});

client.pushApi().subscribeToDepth("btc_usd", depth -> {
    // видим ордера
});

Важно!

  1. Стоп Лосс и Тейк Профит.
    Стоп лосс (stop loss) — закрытие сделки при достижении определенного уровня потери цены.
    Тейк профит (take profit) — закрытие сделки при достижении определенного уровня прибыли.
    При открытии каждой позиции вы должны быть уверены в том, на какую прибыль рассчитываете и к какому убытку готовы.
  2. Сегодня оно работает, но завтра рынок обязательно изменится.
    Одни алгоритмы хороши при боковом тренде, флэте (флэт (flat) — период, когда цена на длительное время застревает в каком-то ценовом диапазоне), другие только при росте или только при падении. В любом случае, при изменении тренда, прибыльный до этого алгоритм может начать терять деньги.
  3. Bitcoin-биржи отличаются.
    Первое, что бросается в глаза — bitcoin-биржи работают круглосуточно. У ММВБ, NYSE и прочих есть торговая сессия. Поэтому для bitcoin не имеют смысла методы, использующие гэпы (гэп (gap) — разрыв графика, разница между ценой закрытия предыдущей сессии и ценой открытия текущей). Нужно быть внимательным к таким вещам, если читать литературу по техническому анализу, применяя его к bitcoin. И наоборот.

Далее

Из литературы по техническому анализу обычно советуют литературу типа «Technical Analysis by Jack D. Schwager», но для начала лучше воспользоваться бесплатными курсами компаний-брокеров. Они позволять сориентироваться в материале, все бросить и пойти заняться чем-то по-настоящему полезным. Удачной торговли!

Автор: GorkyUkrop

Источник [12]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/bitcoin/278047

Ссылки в тексте:

[1] P/E (price/earnings ratio): https://en.wikipedia.org/wiki/Price%E2%80%93earnings_ratio

[2] finance.yahoo.com: https://finance.yahoo.com

[3] WEX: http://wex.nz

[4] wiki: https://en.wikipedia.org/wiki/Order_(exchange)

[5] На русском: https://ru.wikipedia.org/wiki/%D0%91%D0%B8%D1%80%D0%B6%D0%B5%D0%B2%D0%BE%D0%B9_%D1%81%D1%82%D0%B0%D0%BA%D0%B0%D0%BD

[6] Далее: https://en.wikipedia.org/wiki/Bid_price

[7] Далее: https://en.wikipedia.org/wiki/Ask_price

[8] Далее: https://en.wikipedia.org/wiki/Bid%E2%80%93ask_spread

[9] wex.com: http://wex.com

[10] github.com: https://github.com/artfultom/wex-api-lib

[11] на русском: https://github.com/artfultom/wex-api-lib/wiki/%D0%94%D0%BE%D0%BA%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%D1%86%D0%B8%D1%8F

[12] Источник: https://habrahabr.ru/post/353222/?utm_campaign=353222