Инвестиционные боты (почти) с нуля: базовая теория и первые шаги реализации

Инвестиционные боты (почти) с нуля. Часть 1: базовая теория и первые шаги реализации

---

О чём вообще этот цикл

Моя конечная цель предельно приземлённая: построить систему, которая зарабатывает деньги на бирже с минимальным моим участием. Понятно, что вариант «ничего не делать и получать доход» — это сильное упрощение, но именно к этому я стремлюсь: один раз вложить время и знания в разработку автоматизированного алгоритма, а дальше в основном поддерживать и дорабатывать его, а не сидеть у терминала целыми днями.

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

В нулевой части (которая здесь не повторяется полностью) я подробнее разбирал цели, ограничения и мотивацию. Здесь остановимся на практическом аспекте: базовая теория, минимально необходимая для понимания работы бота, и первые технические шаги по подключению к брокеру и API.

---

Минимум теории, без которой дальше не поедем

Перед тем как автоматизировать торговлю, важно понимать, что именно вы автоматизируете. Бот не «делает деньги», он всего лишь быстро и дисциплинированно выполняет стратегию, которую вы ему задали. Если стратегия плохая или риск-менеджмент отсутствует, робот только ускорит путь к потере капитала.

Разберёмся с базовыми понятиями.

Фондовая биржа

Фондовая биржа — это крупная электронная площадка, где сталкиваются интересы покупателей и продавцов ценных бумаг. В российской реальности основной площадкой является Московская биржа.

Биржа:

- сводит заявки на покупку и продажу;
- обеспечивает прозрачность цен и глубины рынка;
- фиксирует все сделки и их объём;
- формирует официальные котировки.

Сам по себе частный инвестор прийти на биржу напрямую не может, ему нужен посредник.

Брокер

Брокер — это организация-посредник, которая даёт доступ к биржевой инфраструктуре. Через него вы:

- открываете брокерский счёт или ИИС;
- вносите деньги;
- подаёте поручения на покупку и продажу активов;
- получаете отчёты о сделках и состоянии портфеля.

Для разработки бота я выбрал Т-Банк в качестве брокера (это не реклама, а констатация факта; мотивацию выбора я разбирал в нулевой части). Именно с его API мы будем работать, а бот — торговать на тех счетах, которые открыты у этого брокера.

---

Инвестиции и спекуляции: что именно будет делать бот

Принято разделять два подхода:

- Инвестиции — долгосрочные вложения (обычно от нескольких лет), нацеленые на рост стоимости активов и получение пассивного дохода в виде дивидендов и купонов.
- Спекуляции — относительно короткие сделки (от секунд, если это высокочастотная торговля, до нескольких дней или недель), в которых основной источник дохода — разница между ценой покупки и продажи.

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

- краткосрочные сделки по заранее определённым правилам;
- полуавтоматические подходы (бот ищет сигналы, человек подтверждает);
- гибридные стратегии, где часть капитала работает в долгосрок, а часть — в активной торговле.

То есть в итоге мы строим не «робота-инвестора», а скорее «робота-трейдера с инвестиционным блоком».

---

Риск и доходность: трезвый взгляд

Любая попытка «зарабатывать больше» автоматически приводит к росту риска. Никакой бот, сколько бы умным он ни казался, не отменит базовую финансовую закономерность: чем выше потенциальная доходность, тем больше шанс серьёзной просадки или потери капитала.

Пара ориентировочных цифр:

- банковский депозит в текущих условиях даёт порядка 14–16% годовых и считается инструментом с низким риском (если не брать во внимание общесистемные риски);
- акции теоретически могут принести 20–30% годовых и выше, но при неблагоприятном сценарии можно получить минус 50% и больше от вложенной суммы.

Из личной практики: были периоды, когда удавалось сделать около 10% к капиталу за месяц, но были и дни, когда портфель просаживался на полсчёта, плюс возникали ситуации с блокировкой активов. Это важный момент: бот не спасёт от неправильных решений, он лишь ускорит их исполнение.

---

Диверсификация и портфель: не класть всё в одну корзину

Чтобы не погибнуть от одного неудачного решения, используется диверсификация:

- деньги распределяются по разным инструментам (акции, облигации, фонды, валюта);
- подбираются эмитенты из разных отраслей;
- используются разные стратегии на разных частях капитала.

Таким образом, падение одного актива не разрушает весь портфель.

Инвестиционный портфель — это совокупность всех ваших позиций с указанием:

- количества каждого инструмента;
- текущей рыночной стоимости;
- совокупной прибыли или убытка.

Бот, работающий с реальным счётом, должен:

- уметь получать структуру портфеля по API;
- учитывать распределение активов при принятии решений;
- не превышать заданные лимиты по доле каждого инструмента и по общему риску.

---

Стакан заявок и спред: где бот берёт цену

Один из ключевых источников информации для торгового алгоритма — стакан заявок (order book). Это таблица, в которой видны лучшие (и близкие к ним) цены:

- bid — заявки на покупку (покупатели), обычно подсвечиваются зелёным;
- ask — заявки на продажу (продавцы), обычно подсвечиваются красным.

Спред — это разница между лучшей ценой покупки и лучшей ценой продажи. Чем он уже, тем ликвиднее инструмент и тем проще боту совершать операции без большого «проскальзывания» цены.

Простейший бот может принимать решения, ориентируясь на:

- текущий спред;
- объём заявок по bid и ask;
- изменения этих параметров во времени.

---

Базовые инструменты, с которыми мы работаем

Чтобы не распыляться на экзотику, в рамках первой версии бота мы сосредоточимся на стандартных инструментах, торгуемых на Московской бирже:

1. Акции
Доля в компании. Доход формируется за счёт:
- роста котировок;
- дивидендов.

2. Облигации
Долговые ценные бумаги, выпускаемые компаниями или государством. Доход — это:
- купонные выплаты;
- возможный дисконт/премия при погашении и продаже.

3. Биржевые фонды (ETF, БПИФ)
Комбинированные активы, в которые многие инвесторы вкладываются через один инструмент. Фонд покупает портфель бумаг, а вы покупаете долю в этом портфеле. Для бота это в первую очередь тикер и набор характеристик (ликвидность, волатильность, комиссия фонда и т.д.).

4. Валюта
Операции купли-продажи иностранной валюты. Может использоваться как:
- самостоятельный объект торговли;
- инструмент хеджирования рисков (например, защиту от девальвации).

---

Технический стек: на чём всё будет крутиться

Для реализации всей системы я использую:

- платформу MarsX 3 версии — как основу для быстрой сборки сервисов и интерфейсов;
- Node.js — как основной язык/рантайм для написания логики бота;
- API брокера Т-Банк — для получения рыночных данных и совершения операций.

MarsX даёт удобную инфраструктуру для сборки микросервисов, интерфейсов и интеграций, а Node.js — гибкость и большое количество доступных библиотек (в том числе для работы с HTTP, WebSocket, логированием и т.д.).

---

Что нужно, чтобы бот вообще мог торговать

Для начала вы должны быть клиентом брокера и иметь хотя бы один инвестиционный счёт. Открытие счёта и пополнение — стандартные операции, много раз описанные в разных источниках. В рамках этой статьи важен не процесс открытия, а то, что после него:

1. У вас есть действующий брокерский счёт.
2. В личном кабинете или приложении брокера доступны:
- настройки инвестиций;
- инструменты управления доступом к API.

Дальше нам нужен токен доступа к API — это ключ, с помощью которого наш бот сможет от имени владельца счета:

- запрашивать данные (котировки, портфель, историю сделок);
- отправлять торговые поручения (размещение/отмена заявок).

---

Песочница: сначала тренируемся, потом рискуем

Начинать сразу с реальных денег — плохой сценарий. Особенно если:

- вы только осваиваете API;
- бот ещё сырой и в нём много отладочного кода;
- стратегия не тестировалась на истории и в «боевых» условиях.

Поэтому первым делом имеет смысл создать токен для песочницы — тестовой среды, в которой:

- операции симулируются;
- используются «виртуальные» деньги;
- можно безболезненно проверять логику, не опасаясь потерять реальные средства.

Алгоритм в общих чертах:

1. Войти в личный кабинет брокера.
2. Открыть раздел с настройками по инвестициям и API.
3. Создать новый токен доступа, выбрав режим «песочница».
4. Сохранить полученный токен в безопасном месте (например, в переменных окружения сервера).

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

---

Как бот общается с брокером: API и авторизация

API брокера представляет собой типичные REST-интерфейсы:

- запросы отправляются по HTTPS;
- используется методология вроде GET/POST/PUT/DELETE;
- аутентификация и авторизация осуществляются через токен, передаваемый в заголовках HTTP-запроса.

Базовый сценарий:

1. В нашем коде на Node.js мы формируем HTTP-запрос.
2. В заголовок, например `Authorization`, подставляем токен.
3. Отправляем запрос к нужному endpoint’у:
- получить список активов;
- получить состояние портфеля;
- разместить или отменить заявку;
- запросить исторические свечи и др.
4. Получаем ответ в формате JSON и обрабатываем его.

На этом уровне всё довольно стандартно. Основные сложности начинаются чуть дальше — в формате представления чисел и денег.

---

Особенность API: числа в виде `units` и `nano`

В финансовых приложениях нельзя полагаться на тип `float` или `double` в лоб. Практически во всех популярных языках есть проблемы с точностью представления вещественных чисел. Если вы начнёте складывать и вычитать цены и комиссии «как есть», рано или поздно всплывут ошибки округления на копейки и даже рубли.

Чтобы избежать этих проблем, API брокера использует собственный формат для чисел:

- `units` — целая часть значения;
- `nano` — дробная часть в наносоставляющих (1 единица nano = 10⁻⁹).

Например, цена 123.45 в таком формате может выглядеть условно как:

```json
{
"units": 123,
"nano": 450000000
}
```

Для нас это означает:

1. В коде нужно иметь функцию-конвертер `units/nano → float` (или обратно).
2. Все расчёты желательно вести:
- либо в целых числах (например, в нанах/копейках),
- либо через библиотеки для работы с десятичной арифметикой, чтобы не плодить погрешности.

Простейшая функция в Node.js может:

- приводить `units` к `BigInt` или обычному `Number`;
- делить `nano` на 1e9;
- суммировать и выдавать привычное десятичное число.

В обратную сторону — разбивать дробное число на целую часть и «нанодробь», чтобы корректно передать цену или объём в запросе API.

---

Базовый сервис для работы с API

К этому моменту разумно сделать небольшой сервис-обёртку, который:

- хранит в конфигурации:
- токен для песочницы;
- базовый URL API (боевой и тестовый, если нужно);
- предоставляет функции:
- `getCandles(...)` — получить исторические данные;
- `getPortfolio(...)` — прочитать текущее состояние портфеля;
- `placeOrder(...)` — разместить заявку;
- `cancelOrder(...)` — отменить заявку;
- и т.п.;
- внутри:
- добавляет токен в заголовки запросов;
- обрабатывает сетевые ошибки и коды статуса;
- выполняет преобразование формата `units/nano` в удобный для логики вид.

Такой подход позволит:

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

---

Что уже реализовано на текущий момент

На основе описанного выше у меня к этому этапу:

1. Выбран и настроен стек:
- MarsX 3 как платформа;
- Node.js для кода;
- T-Банк в качестве брокера и его API.

2. Получен и подключён токен песочницы:
- токен хранится безопасно (не в коде, а, к примеру, в переменных окружения);
- сервис авторизуется и успешно ходит в тестовый API.

3. Написан базовый сервис интеграции:
- реализованы запросы на получение котировок и информации о доступных инструментах;
- подключены методы для получения портфеля и истории сделок в песочнице;
- есть обёртка над HTTP-клиентом, которая логирует запросы и ответы.

4. Сделаны утилиты конвертации чисел:
- функции для преобразования `units/nano` во внутреннее представление чисел;
- обратные функции для подготовки цен и объёмов к отправке в API.

Визуально это уже позволяет строить простые интерфейсы: выводить котировки, состояние виртуального счёта, первые экспериментальные сделки в песочнице. Скриншотов здесь не будет, но по сути это классический «личный кабинет» со списком инструментов, текущими ценами и историей операций.

---

Краткосрочные планы по развитию бота

Следующие шаги, которые логично выполнить после базовой интеграции:

1. Добавить модуль риск-менеджмента
- ограничение максимально допустимой просадки;
- лимиты по позиции в одном инструменте;
- дневные/недельные лимиты по количеству сделок.

2. Реализовать хранение истории и логирование
- запись всех запросов/ответов API (в обезличенном виде);
- сохранение всех совершённых сделок, сигналов и решений бота;
- возможность воспроизведения сессии для отладки.

3. Подключить реальные рыночные данные в режиме онлайн
- стрим котировок через WebSocket (если брокер это предоставляет);
- обновление стакана и последней цены в реальном времени.

4. Сделать первый прототип стратегии
- самый простой вариант — трендовая или mean-reversion логика;
- чёткие правила входа, выхода и установки стоп-лоссов;
- тестирование в песочнице с небольшими виртуальными объёмами.

5. Разработать панель управления ботом
- включение/отключение алгоритмов;
- изменение параметров стратегий (плечо, глубина истории, размеры стопов);
- просмотр текущих позиций и ключевых метрик.

---

Дополнительные важные моменты, о которых стоит подумать заранее

Чтобы бот не превратился в «чёрный ящик, который что-то слил», полезно учесть несколько вещей ещё до включения реальных денег:

1. Прозрачность логики
Каждое решение бота должно быть объяснимо:
- по каким сигналам он вошёл в сделку;
- почему выставил именно такой объём;
- по какой причине закрыл позицию.

2. Разделение окружений
- отдельная конфигурация для песочницы;
- отдельная — для реального счёта;
- технические меры, чтобы случайно не отправить «боевой» запрос при тестах.

3. Мониторинг и оповещения
- уведомления о крупных сделках и просадках;
- оповещение, если бот перестал получать данные или API недоступен;
- контроль, что бот вообще жив (health-check).

4. Юридические и налоговые аспекты
- как учитываются сделки, совершённые через бота (формально это те же сделки инвестора);
- в каких отчётах брокера и налоговых формах они отражаются;
- нет ли нарушений ограничений по стратегиям или инструментам.

---

Вектор развития цикла

Дальше в следующих частях цикла планируется:

- более подробно разобрать реальные стратегии, которые можно автоматизировать;
- показать примеры кода: от простых запросов до полноценного модуля торговли;
- пройти путь от песочницы к работе с реальным счётом;
- обсудить управление капиталом и психологические моменты при использовании робота.

Идея в том, чтобы не только написать бота «ради бота», но и прийти к системному, осознанному подходу: понимать что делает алгоритм, какие у него ограничения, где он может дать сбой и как это контролировать.

2
2
Прокрутить вверх