Инвестиционные боты (почти) с нуля. Часть 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. Юридические и налоговые аспекты
- как учитываются сделки, совершённые через бота (формально это те же сделки инвестора);
- в каких отчётах брокера и налоговых формах они отражаются;
- нет ли нарушений ограничений по стратегиям или инструментам.
---
Вектор развития цикла
Дальше в следующих частях цикла планируется:
- более подробно разобрать реальные стратегии, которые можно автоматизировать;
- показать примеры кода: от простых запросов до полноценного модуля торговли;
- пройти путь от песочницы к работе с реальным счётом;
- обсудить управление капиталом и психологические моменты при использовании робота.
Идея в том, чтобы не только написать бота «ради бота», но и прийти к системному, осознанному подходу: понимать что делает алгоритм, какие у него ограничения, где он может дать сбой и как это контролировать.



