Можете ли вы превзойти принцип «купи и держи» в Ethereum?

У каждого современного человека должен быть бот. А еще лучше бот, который зарабатывает деньги. Кто бы этого не хотел? В этом посте я покажу вам, как создать торгового бота, который пытается превзойти покупку и хранение Ethereum. Начнем с тестирования нескольких стратегий и их оптимизации. Затем мы построим логику бота с помощью Coinbase API. Наконец, мы автоматизируем весь процесс, развернув его в облаке Google, и, если повезет, у нас может получиться прибыльный бот.

«Удача играет важную роль в жизни каждого». — Джим Саймонс

Создайте бэктест

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

Сначала устанавливаем все необходимые библиотеки и импортируем их.

Далее мы расширим код из краткого руководства. Вместо того, чтобы использовать акции Google для ретроспективного тестирования, я использовал Ethereum. Я выбрал Эфириум, потому что он имеет только 1/2 рыночной капитализации Биткойна, но гораздо больше полезности — большая часть крипторынка построена на нем. Мы также подключим несколько различных индикаторов из ta-lib. В дополнение к простой скользящей средней (SMA) я использовал экспоненциальную скользящую среднюю и взвешенную скользящую среднюю.

Чтобы создать новую стратегию в backtest.py, мы расширяем класс Strategy. По сути, это означает, что мы временно добавляем некоторый код в их существующую библиотеку. Он следует стандартному синтаксису создания класса в Python с методом init(self)для инициализации класса с двумя скользящими средними с разной длиной (n1, n2), за которыми следует вспомогательная функция для просмотра данных, пока не будет найдено пересечение. Стандартная логика в трейдинге заключается в том, чтобы покупать, когда короткая скользящая средняя пересекает более длинную, и продавать, когда она пересекает ее ниже.

Теперь мы получаем данные.

Эта функция принимает пару торгуемых активов (например, «ETH-USD») и возвращает кадр данных pandas, который нам нужно передать в механизм тестирования на истории.

Чтобы получить лучшую стратегию, мы тестируем и оптимизируем каждую из них.

Этот код перебирает каждую стратегию и находит наиболее оптимальные параметры скользящей средней (n1, n2). Он находит лучшие из них, которые максимизируют годовой доход. Обратите внимание, что цены были разделены на 1000, поскольку мы начинаем только со 100 долларов, а бэктестер не поддерживает дробную торговлю (однако Coinbase поддерживает). Я выбрал годовой доход, потому что это несколько более стабильный показатель, чем общий доход. Тестирование также возвращает множество других показателей, таких как SQN, Calmar и Sortino. Я отказался от них, так как этот эксперимент предназначен исключительно для получения огромной прибыли. Учитывая дикие колебания цены и отсутствие стоп-лоссов, коэффициент Шарпа на удивление подходит для этой стратегии, он близок к 1.

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

Как мы видим, стратегия SMA с краткосрочной скользящей средней 5 дней и долгосрочной скользящей средней 15 дней превзошла стратегию «купи и держи» в 2,7 раза. За последние 3 года эти 100 долларов превратились бы в более чем 5 тысяч, если бы мы использовали эту стратегию! Конечно, трагедия тестирования на исторических данных заключается в том, что во время сделки крайне сложно сказать, какие параметры привели бы к такой прибыли. С 35 сделками и процентом выигрышей 57% это чуть меньше 1 сделки в месяц, и это неплохое начало. Следовательно, это стратегия, которую мы подключим для автоматической торговли на Coinbase pro.

Создание облачных функций

Теперь, когда у нас есть приблизительное представление о том, как может выглядеть хорошая стратегия, начинается самое интересное: ее развертывание. Логика состоит из функции покупки и функции продажи, которые вызывают на веб-перехватчиках два оповещения Tradingview.

Сначала мы подключаемся к Coinbase API через CCXT.

Теперь, когда мы прошли аутентификацию в Coinbase pro API, мы можем создать логику покупки и продажи.

Функция покупки захватывает максимальный баланс долларов США на счете и покупает на него указанную пару, в нашем случае это пару ETH-USD. Функция продажи получит максимальный баланс ETH и продаст его.

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

Последняя функция в коде облачной функции будет анализировать входящий HTTP-запрос оповещения и выполнять покупки и продажи.

Когда из Tradingview срабатывает оповещение, точкой входа является функция «запустить». Он принимает оповещение и определяет, покупка это или продажа. Если это покупка, и у нас еще нет позиции в паре, мы покупаем ее. Если это предупреждение о продаже, и у нас есть возможность продать более 1 доллара, мы продаем его.

Теперь мы помещаем код 1, 2 и 3 в один файл main.py и развертываем его в Google с помощью интерфейса командной строки gcloud с помощью этой команды:

gcloud functions deploy ethereum-strategy --entry-point=run --memory=128 --allow-unauthenticated --security-level=secure-always --timeout=30 --trigger-http --runtime=python39 --max-instances=1

Эта команда развертывает облачную функцию под названием «ethereum-strategy» с минимально возможным аппаратным обеспечением: 128 МБ памяти и время жизни 30 секунд. Он также устанавливает функцию с именем run в качестве точки входа для логики покупки и продажи, разрешает только HTTPS-запросы и устанавливает масштабирование равным 1, поэтому за один раз вызывается только одна функция.

Успешное развертывание выведет URL-адрес, необходимый для запуска этой функции:

Создание оповещений Tradingview

Теперь мы создаем 2 оповещения для ETHUSD. Один для сигнала на покупку, когда краткосрочная MA пересекает длинную (5 пересечений выше 15), и сигнал на продажу, когда она делает противоположное. Оповещения через вебхуки — хороший выбор, потому что мы не выполняем очень много заказов. Стратегии, требующие быстрого исполнения ордеров с большим количеством сделок, требуют другой настройки.

В Tradingview мы создаем простую скользящую среднюю за 5 и 15 дней и устанавливаем оповещение. Обязательно проверьте параметр URL-адрес веб-перехватчика, введите свой URL-адрес из предыдущего шага и создайте его. Не забудьте создать сообщение, которое будет анализироваться функцией.

Теперь создайте еще одно оповещение для ордера на продажу, когда 5 MA пересекает вниз.

Чтобы проверить, правильно ли работает эта настройка, мы можем либо запустить фиктивное оповещение из Tradingview, либо использовать запрос curl для публикации полезной нагрузки из сообщения оповещения из командной строки.

Протестируйте облачную функцию из командной строки:

gcloud functions call ethereum-strategy --data '{"ticker":"ETH", "side":"sell"}'

На что вы должны получить следующий ответ:

result: "alert {'ticker': 'ETH', 'side': 'sell'} was received but no orders were made"

Функцию покупки можно вызвать, заменив «sell» на «buy» в команде gcloud functions call. Этот призыв разместит живую сделку, чтобы купить эфириум за максимально возможные деньги!

Примечание: в журналах будет несколько ошибок, и это просто то, что поможет вам приступить к созданию торгового бота, поэтому используйте это по своему усмотрению.

Вот что можно улучшить:

  1. Просмотрите журналы облачной функции и попытайтесь исправить ошибки.
  2. Улучшите логику заказа. Внедряйте маркет-мейкерские ордера вместо маркет-тейпинга. Вместо рыночных ордеров размещайте лимитные ордера на бид. Дайте им несколько секунд, чтобы заполнить. Убедитесь, что заказы были выполнены до времени выполнения функции 30 секунд.
  3. Найдите разные стратегии для разных торговых пар.
  4. Автоматизируйте ретроспективное тестирование. Периодически повторно запускайте бэктест и выбирайте новый набор оптимальных параметров, чтобы максимизировать прибыль.
  5. Я провел ретроспективное тестирование на данных Yahoo Finance. Было бы лучше использовать данные биржи, на которой мы торгуем.
  6. Защитите учетные данные с помощью облачных секретов Google и добавьте парольную фразу в оповещение. Белый список IP-адресов от Tradingview, блокировка запросов от других ips.

Спасибо за прочтение, следите за обновлениями в будущих постах, где я буду улучшать эту стратегию и создавать новые.

Удачи и удачной торговли. 📈

Смотрите другие истории от меня: