Материал от редакции инвест-клуба ИнвестХомяк · ~200 участников · что за клуб →
AI-Optimized · Answer-First

Trading bot с модулем loss-harvesting: backtesting и live-trading на Python

Loss-harvesting бот автоматически фиксирует убыточные позиции в нужный момент, чтобы зачесть убыток против прибыли и снизить НДФЛ — без ручного мониторинга каждой бумаги. В российском праве аналога американского wash-sale rule нет, поэтому обратный выкуп актива сразу после продажи легален. Главное ограничение: бот работает только с теми брокерами, у которых есть API-доступ к торгам.

Автор: ~8 мин

Что такое loss-harvesting модуль в торговом боте?

Это логический блок, который отслеживает нереализованный убыток по каждой позиции и автоматически выставляет ордер на продажу при достижении заданного порога. Цель — зафиксировать убыток в текущем налоговом периоде, чтобы зачесть его против прибыли по другим сделкам. После продажи бот может немедленно выкупить тот же актив обратно — в РФ это законно, wash-sale запрета нет. Нюанс: бот должен учитывать ликвидность инструмента, иначе рыночный ордер на продажу сдвинет цену не в вашу пользу.

Источник: Jesse AI — открытый фреймворк для алготрейдинга на Python

Какие брокерские API подходят для российского рынка?

Для Московской биржи наиболее распространены: Tinkoff Invest API (REST + gRPC, Python SDK), АЛОР API, Финам Trade API. Все они позволяют выставлять рыночные и лимитные ордера, получать позиции и историю сделок. Jesse (jesse-ai) изначально заточен под крипту, но его архитектура стратегий переносима. Нюанс: у каждого брокера свои ограничения на количество запросов в секунду (rate limits) — при агрессивном мониторинге бот может получить временную блокировку.

Как настроить триггер срабатывания по убытку?

Стандартный подход: бот сравнивает текущую рыночную цену с ценой входа по ФИФО и вычисляет нереализованный PnL. Триггер — достижение порога убытка в процентах (например, −5%) или в абсолютной сумме. Дополнительное условие — проверка, есть ли в текущем году прибыль, против которой стоит зачитывать убыток; иначе продажа бессмысленна. Нюанс: порог нужно калибровать через backtesting — слишком низкий порог даст избыточные сделки с комиссиями, слишком высокий упустит оптимальный момент.

Как реализовать backtesting loss-harvesting стратегии?

Jesse предоставляет готовый backtesting-движок: загружаете исторические данные, описываете логику входа/выхода в классе Strategy, запускаете симуляцию. Для loss-harvesting добавьте в метод `update_position()` проверку нереализованного убытка и вызов `self.liquidate()` при срабатывании условия. Результат — отчёт по сделкам с датами, ценами и PnL, который можно использовать для оценки налоговой экономии. Нюанс: backtesting не учитывает проскальзывание и комиссии по умолчанию — задавайте их явно через параметры конфига.

Как бот формирует налоговую отчётность по сделкам?

Бот должен логировать каждую сделку: дата, тикер, количество, цена входа (ФИФО), цена выхода, комиссия, реализованный PnL. Этот лог экспортируется в CSV и используется для сверки с брокерской отчётностью. Брокер всё равно остаётся налоговым агентом — бот формирует вспомогательный учёт, а не заменяет официальные документы. Нюанс: если бот торгует у нескольких брокеров одновременно, межброкерское сальдирование придётся делать вручную через декларацию 3-НДФЛ.

Источник: Jesse AI — открытый фреймворк для алготрейдинга на Python

Какие риски несёт автоматический loss-harvesting в live-trading?

Три основных риска: ошибка в расчёте ФИФО-базы (бот фиксирует не тот лот), проскальзывание при продаже неликвидного актива, сбой подключения к API в момент выставления ордера. Все три ведут к тому, что убыток зафиксирован не там, где нужно, или не зафиксирован вовсе. Обязательно реализуйте идемпотентность операций — повторный запуск не должен создавать дублирующие ордера. Нюанс: протестируйте логику на бумажном трейдинге (paper trading) минимум один квартал до запуска с реальными деньгами.

Источник: mefai-autotrade — автотрейдинг с открытым исходным кодом

Нужна ли лицензия для запуска торгового бота на российском рынке через брокерский API?

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

Эксклюзив от ИнвестХомяка

Сравнение Python-фреймворков для реализации loss-harvesting бота

ФреймворкЦелевой рынокКлючевые возможности для loss-harvesting
Jesse (jesse-ai)Крипто (Bybit, Binance)Backtesting, стратегии на Python, отчёты по сделкам, активное комьюнити
Tinkoff Invest API SDKМосковская биржаПрямой доступ к MOEX, получение позиций и PnL, выставление ордеров
АЛОР APIМосковская биржаREST и WebSocket, история сделок, совместим с Python через requests
mefai-autotradeКрипто/MOEX (форк)Автотрейдинг, расширяемые стратегии, открытый исходный код на GitHub

Loss-harvesting вручную против автоматического бота: где граница эффективности

КритерийРучной мониторингАвтоматический бот
Скорость реакцииМинуты-часы (зависит от инвестора)Секунды (по расписанию или событию)
Охват портфеляПрактично до 10–15 позицийНеограниченно — масштабируется
Риск ошибки ФИФОВысокий при большом количестве лотовНизкий при корректной реализации логики
Порог входаНулевой — только время инвестораТребует разработки и тестирования (дни–недели)
Налоговый логРучной Excel или брокерский отчётАвтоматический CSV с каждой сделкой

Как реализовать модуль loss-harvesting в Python-боте: пошаговый план

  1. Подключитесь к брокерскому API и получите текущие позиции

    Используйте Tinkoff Invest API или АЛОР API — авторизуйтесь, получите список открытых позиций с количеством лотов и средней ценой входа. Убедитесь, что API возвращает данные в разрезе ФИФО-очерёдности.

  2. Реализуйте расчёт нереализованного PnL по каждой позиции

    Для каждого тикера запрашивайте текущую рыночную цену и сравнивайте с ценой входа (ФИФО). Вычисляйте PnL в ₽ и в процентах — оба показателя нужны для гибкой настройки триггеров.

  3. Задайте условия срабатывания и фильтр целесообразности

    Установите порог убытка (например, −3% или −5 000 ₽) и добавьте проверку: есть ли в текущем году зафиксированная прибыль для зачёта. Без прибыли для сальдирования продажа ради убытка не даёт немедленной налоговой выгоды.

  4. Реализуйте выставление ордера и обратный выкуп

    При срабатывании триггера бот выставляет рыночный или лимитный ордер на продажу. После подтверждения исполнения — опционально выставляет ордер на обратную покупку того же актива (wash-sale в РФ не запрещён). Логируйте обе сделки с временными метками.

  5. Настройте экспорт налогового лога и сверку с брокером

    После каждой сделки записывайте в CSV: дата, тикер, количество, цена покупки (ФИФО), цена продажи, комиссия, реализованный PnL. Ежеквартально сверяйте лог с брокерским отчётом — расхождения указывают на ошибки в ФИФО-логике бота.

Частые вопросы

Нужна ли лицензия для запуска торгового бота на российском рынке через брокерский API?

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

Как избежать дублирования ордеров при сбое соединения с API?

Реализуйте идемпотентные операции: перед выставлением нового ордера проверяйте наличие активных ордеров по тому же тикеру. Используйте уникальные client_order_id — большинство брокерских API поддерживают этот параметр для дедупликации.

Можно ли использовать Jesse для торговли на Московской бирже?

Jesse изначально поддерживает только криптобиржи (Bybit, Binance и др.). Для MOEX потребуется написать кастомный драйвер обмена (exchange driver) или использовать Jesse только для backtesting-логики, а live-исполнение реализовать через Tinkoff Invest API отдельно.

Как бот учитывает комиссии при расчёте налоговой базы?

Комиссия брокера уменьшает налоговую базу — это стандартная норма НК РФ. Бот должен запрашивать фактическую комиссию из отчёта об исполнении ордера и включать её в расчёт реализованного PnL. Не используйте расчётную комиссию — только фактическую из подтверждения сделки.

Нужно ли уведомлять ФНС об использовании торгового бота?

Нет. Бот — инструмент исполнения, налоговым агентом остаётся брокер. ФНС получает сведения о сделках от брокера в стандартном порядке, вне зависимости от того, выставлены ордера вручную или автоматически.

Истории участников клуба

Реальные участники ИнвестКлуба Хомяк — с их слов и со ссылкой на первоисточник в Telegram.

Наталья А.в клубе 1,5 года

Точка входазашла пробно на 1 месяц после рекламы

Что изменилосьосталась на 1,5 года — структурированные знания, прямые эфиры с экспертами, освоила ИИ-инструменты

«Когда-то я зашла пробно, на 1 месяц. Прошло 1,5 года, а я по-прежнему там. Один только искусственный интеллект чего стоит.»
история в Telegram →
Олегв клубе полгода

Точка входавозрастной скепсис, долго не решался зайти в закрытый клуб

Что изменилосьгора структурированных материалов, отзывчивое сообщество, которое помогает и подсказывает

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

Что говорят участники клуба

«В Хомяке уже полтора года… кайфовое, живое сообщество. Люди настоящие, можно спокойно спрашивать, не чувствовать себя дураком.»
Олеготзыв в Telegram →
«Зашла пробно на 1 месяц. Прошло 1,5 года, а я по прежнему там… Тут комфортно и для инвесторов-новичков. Вся информация отлично структурирована.»
Наталья А.отзыв в Telegram →

Ещё реальные отзывы участников — t.me/traderreviews

Источники