У меня двое детей. И я хочу, чтобы к восемнадцатилетию у каждого из них была накоплена ощутимая сумма денег. Не наследство, не подарок от бабушки, а результат системной, дисциплинированной стратегии, которую я запустил с момента их рождения и которая работает без моего участия.
Идея простая: каждую неделю покупать паи индексного фонда на фиксированную сумму. Это называется DCA (Dollar Cost Averaging), то есть усреднение стоимости. Не пытаешься угадать дно рынка, не паникуешь на просадках, просто покупаешь. Каждый понедельник. На 1000 рублей.
Пару лет я делал это руками. Потом написал программу, которая делает это за меня. С октября 2025 года система не пропустила ни одного дня. На всю реализацию ушло не более 10 часов, примерно один рабочий день. Взамен я получил процесс, который будет работать годами без моего участия.
Зачем вообще всё это
Горизонт инвестирования до восемнадцатилетия. На таких сроках акции исторически обгоняют депозиты. Мне не нужен доступ к этим деньгам, они не должны быть ликвидными. Они должны просто быть и расти. Поэтому выбор пал на фонд TMOS (Тинькофф iMOEX), индекс на весь российский рынок.
Но дело не только в деньгах. По мере взросления детей я планирую вместе с ними разбираться в том, как работают финансы: что такое бюджет, как отслеживать расходы, куда и зачем вкладывать, какие инструменты существуют. К тому моменту у них уже будет реальный портфель с реальной историей, а не абстрактная теория из учебника. Конкретные цифры, которые они смогут изучить и понять.
Как было раньше: ручной режим
Первые пару лет я всё делал вручную. Каждый понедельник утром:
- Пополнить брокерский счёт на 1000 рублей
- Дождаться 10:00, когда откроется биржа
- Купить паи по текущей рыночной цене
- Повторить для второго ребёнка
Когда был один ребёнок, это работало. Когда появился второй, начались проблемы. Цена между двумя покупками успевала измениться, и дети оказывались в неравных условиях. Для меня принципиально, чтобы условия были одинаковые, без “этому больше, тому меньше”.
А потом начались пропуски. Устал, забыл, забегался на работе и вспомнил только когда рынок закрылся, целый день встречи и не было пяти минут. В итоге за год набралось несколько пропущенных недель, и каждый такой пропуск нарушает стратегию. DCA работает только при дисциплине, а дисциплина у человека ресурс конечный.
Решение: программа на Go
Я залез в документацию Т-Банка и обнаружил, что у них есть полноценное API для брокерских операций. Есть песочница для тестирования. И есть готовая Go-библиотека. Go мой основной язык, поэтому выбор был очевидным.
Реализовывал итеративно, каждую неделю добавляя новый слой:
- Неделя 1: программа получает текущую рыночную цену TMOS и показывает мне. Я по-прежнему покупаю сам, но хотя бы не лезу в приложение за ценой.
- Неделя 2: программа сама выставляет лимитную заявку на покупку. Я запускаю бинарник вручную на ноутбуке, но покупка уже автоматическая, для обоих счетов одновременно и по одной цене.
- Неделя 3: systemd-таймер на Proxmox-сервере. Программа запускается ежедневно в 10:10 по Москве. Почему ежедневно, а не только по понедельникам? Потому что так было проще реализовать и отработать те случаи, когда в понедельник биржа может не работать по каким-либо причинам. Автопополнение счёта настроено в банке на воскресенье, так что к понедельнику деньги уже на месте.
- Неделя 4: отчёт на почту. Каждый день я получаю письмо с полной разбивкой по портфелям.
5 месяцев без единого пропуска
С момента запуска в октябре 2025 года система не пропустила ни одного рабочего дня. Честно говоря, я даже удивлён. Думал, что сломается раньше. Но уже пятый месяц пошёл, и за всё это время я об этом процессе просто не думал.
И в этом “не думал” вся суть.
Раньше мне нужно было каждый понедельник помнить: “купить акции”. Это не пять минут времени, это когнитивное топливо. Мозг держит задачу в фоне, тратит внимание на то, чтобы не забыть. Пять минут действий, но полдня фонового напряжения. Умножьте на 52 недели и получится ощутимый объём ментальной энергии, который теперь свободен.
Вот что изменилось:
- Полная автоматизация. Банк переводит деньги, программа покупает паи, отчёт приходит на почту. Я не участвую.
- Равные условия для детей. Оба счёта обрабатываются в одном запуске, по одной цене. Вопрос “кому больше” закрыт навсегда.
- Устойчивость к жизни. Заболел, уехал в отпуск, забыл, нет интернета, целый день на встречах — процесс продолжается без меня.
- Сложный процент внимания. Высвобожденное когнитивное время я направляю на построение других автоматизаций. Каждая снятая с себя задача освобождает ресурс для следующей.
Я строю систему, которая реализует мои цели даже без моего присутствия. На горизонте в более чем 10 лет это важно: жизнь непредсказуема, но процесс не должен от этого страдать.
Архитектура
Структура проекта:
autoinvestor/
├── cmd/autoinvestcli/ # Точка входа, разбор CLI-флагов
├── domain/ # Ядро: типы, расчёты, алгоритм принятия решений
├── tinvestingclient/ # Обёртка над SDK Т-Банка (API-вызовы)
├── usecase/ # Оркестрация: связывает domain и API-клиент
├── config/ # Структура RunConfig (флаг buy, email)
├── mailnotify/ # Отправка отчётов по email (Yandex SMTP)
├── utils/envutils/ # Загрузка переменных из .env файла
├── systemd/ # Systemd unit-файлы для деплоя
└── shell.nix # Nix-окружение (Go 1.24, golangci-lint)
Классическая слоёная архитектура. В domain лежат чистые типы и расчёты, он ничего не знает про API и сеть. tinvestingclient реализует интерфейс Invester, через который usecase работает с брокером. Благодаря этому юнит-тесты для usecase не требуют реального API-ключа.
Поток данных при запуске:
- Загрузка
.envфайла с секретами (API-токен, почтовые реквизиты) - Разбор CLI-флагов:
-buy,-config,-env - Создание API-клиента через
investgoSDK - Получение текущей цены TMOS, списка счетов и исторических недельных цен
- Для каждого счёта: получить портфель, рассчитать целевые лоты, при необходимости купить
- Сформировать текстовый отчёт и отправить по email
Что умеет программа
Система принципиально только покупает. Продать через неё невозможно, и это сделано сознательно, чтобы исключить случайную продажу.
Имя каждого брокерского счёта совпадает с именем ребёнка. Программа находит счёт по имени, получает текущий портфель и рассчитывает, сколько лотов нужно докупить.
Ежедневный отчёт на почту выглядит примерно так:
===
Ребёнок 1
Рублей на счёте: XX.XX
Целевое кол-во лотов: XXXXX (XXX XXX ₽)
Выполнение: XXX.XX%
===
===
Ребёнок 2
Рублей на счёте: XX.XX
Целевое кол-во лотов: XXXXX (XX XXX ₽)
Выполнение: XXX.XX%
===
Проценты выполнения колеблются около 100%, иногда чуть больше иногда чуть меньше. Это связано с тем, что невозможно покупать идеально по цене открытия рынка, иногда получается чуть дороже, а иногда чуть дешевле.
По умолчанию программа запускается в режиме “сухого прогона”: показывает состояние, но ничего не покупает. Реальные покупки включаются только флагом -buy=true. Это защита от избыточных срабатываний, например при локальном тестировании.
Деплой
Бинарник собирается статически (CGO_ENABLED=0), копируется на LXC-контейнер в Proxmox через scp и устанавливается как systemd-сервис типа oneshot:
autoinvestor.timer (10:10 MSK ежедневно)
└─ autoinvestor.service (oneshot)
└─ /opt/autoinvestorcli/app -config=... -env=... -buy=true
Makefile покрывает сборку и деплой. Nix + Direnv обеспечивают воспроизводимое dev-окружение. Секреты (API-токен, почтовые реквизиты) живут в .env файле и не попадают в репозиторий.
Тесты
| Пакет | Что тестируется |
|---|---|
domain/ | Расчёт понедельников, арифметика Quotation, CalculateTotalLotsWithRemainder (8 кейсов), ShouldBuy (бэктест на реальных ценах), поиск ребёнка по имени |
usecase/ | Форматирование рублей, процент выполнения, формирование отчёта |
utils/envutils/ | Парсинг .env файла (комментарии, кавычки, инлайн-комментарии) + бенчмарки |
tinvestingclient/ | Интеграционные тесты (требуют реальные API-ключи, пропускаются по умолчанию) |
Что дальше
Понятно, что 1000 рублей сегодня это не 1000 рублей три года назад. Буду делать индексацию суммы.
Сама программа — поделка на коленке. Но свою задачу она отрабатывает отлично. Если будет интерес, допилю и выложу в открытый доступ, чтобы каждый мог настроить такую же систему для себя. Но на текущий момент не вижу такого спроса.
Напомню, на всю реализацию ушло примерно десять часов работы, один рабочий день. Пять месяцев стабильной работы, ноль пропусков. А впереди ещё больше десяти лет, в течение которых мне не нужно об этом думать. Для меня это один из лучших примеров того, как маленькая автоматизация даёт непропорционально большой результат на длинной дистанции.
Дети когда-нибудь спросят, как я начинал формировать их инвестиционный портфель. И я покажу им код и эту статью.
Теги: