Init Repo

This commit is contained in:
ada
2025-09-06 15:08:20 +03:00
commit c514b65862
9 changed files with 1002 additions and 0 deletions
+347
View File
@@ -0,0 +1,347 @@
# DCA Bot для Tinkoff Invest
Автоматический бот для реализации стратегии Dollar Cost Averaging (DCA) через API Tinkoff Invest. Поддерживает работу с акциями, ETF, облигациями и валютами на реальном брокерском счете.
## Что это такое?
DCA (Dollar Cost Averaging) — это инвестиционная стратегия, при которой вы регулярно покупаете финансовые инструменты на фиксированную сумму, независимо от их текущей цены. Это помогает снизить влияние волатильности рынка на общую стоимость инвестиций.
## Основные возможности
- ✅ Автоматическое распределение бюджета по заданным весам между инструментами
- ✅ Поддержка акций, ETF, облигаций и валют
- ✅ Корректный расчет стоимости облигаций (номинал + НКД)
- ✅ Проверка торгового статуса инструментов
- ✅ Защита от ошибок недостатка средств с автоматическим уменьшением размера ордера
- ✅ Детальное логирование всех операций в CSV
- ✅ Режим симуляции (dry-run) для тестирования
- ✅ Буферы для комиссий и проскальзывания
- ✅ Работа только с реальными счетами (без песочницы)
## Требования
- Python 3.8+
- Реальный брокерский счет в Tinkoff
- API токен с правами на торговлю
## Установка
1. Клонируйте репозиторий:
```bash
git clone <url>
cd dca_bot
```
2. Установите зависимости:
> Рекомендуется использование виртуального окружения Python.
```bash
pip install -r requirements.txt
```
3. Скопируйте файл с переменными окружения:
```bash
cp .env.example .env
```
4. Заполните `.env` файл:
```env
TINKOFF_TOKEN="ваш_токен"
TINKOFF_ACCOUNT_ID="ваш_id_счета" # опционально
```
## Настройка
Создайте файл конфигурации `config.yml` со списком инструментов и их весами:
```yaml
assets:
- figi: "BBG004730N88" # Сбербанк
weight: 0.3 # 30%
- figi: "BBG00475KKY8" # Яндекс
weight: 0.2 # 20%
- figi: "BBG333333333" # ОФЗ
weight: 0.3 # 30%
- figi: "BBG444444444" # Доллар США
weight: 0.2 # 20%
```
**Важно:** Сумма весов должна равняться 1.0!
## Использование
### Основная команда
```bash
python main.py --config config.yml --rub-budget 10000
```
### Режим симуляции (тестирование)
```bash
python main.py --config config.yml --rub-budget 10000 --dry-run
```
### Дополнительные параметры
```bash
python main.py \
--config config.yml \
--rub-budget 10000 \
--dry-run \
--fee-buf-bps 300 \
--safe-rub-pct 0.97 \
--wait-tradable-sec 60 \
--poll-sec 10
```
**Параметры:**
- `--config` — путь к YAML файлу конфигурации (обязательно)
- `--rub-budget` — общий бюджет в рублях для данного запуска (обязательно)
- `--dry-run` — режим симуляции, реальные ордера не размещаются
- `--fee-buf-bps` — буфер для комиссий в базисных пунктах (по умолчанию 300 = 3%)
- `--safe-rub-pct` — использовать только N% от доступных средств (по умолчанию 0.97 = 97%)
- `--wait-tradable-sec` — ждать до N секунд пока инструмент станет торгуемым (по умолчанию 0)
- `--poll-sec` — интервал проверки торгового статуса в секундах (по умолчанию 10)
## Вспомогательные инструменты
В папке `tools/` находятся полезные утилиты для работы с API Tinkoff Invest:
### 1. Проверка баланса (`check_balance.py`)
```bash
python tools/check_balance.py
```
**Назначение:** Показывает текущее состояние вашего брокерского счета.
**Что показывает:**
- ID активного счета
- Свободные рубли (RUB free)
- Заблокированные рубли (RUB blocked)
- Доступные для торговли рубли (RUB available)
- Общая оценка портфеля в валютах (если доступно)
**Пример вывода:**
```
ACCOUNT_ID: 2235046505
RUB free: 25000.00
RUB blocked: 1500.00
RUB available: 23500.00
Portfolio total_amount_currencies: 150000.50
```
**Когда использовать:**
- Перед запуском DCA бота для проверки достаточности средств
- Для мониторинга состояния счета
- При отладке проблем с размещением ордеров
### 2. Проверка инструментов (`check_figi.py`)
```bash
python tools/check_figi.py
```
**Назначение:** Проверяет корректность FIGI из вашей конфигурации и получает актуальные рыночные данные.
**Настройка:** Отредактируйте список `FIGI` в начале файла, добавив ваши FIGI из `config.yml`:
```python
FIGI = [
"BBG004730N88", # Сбербанк
"BBG00475KKY8", # Яндекс
"BBG0013HGFT4", # USD000UTSTOM
# добавьте ваши FIGI здесь
]
```
**Что показывает:**
- Информацию об инструменте (тикер, название, размер лота, валюта)
- Текущие рыночные цены
- Список инструментов без доступных цен
**Пример вывода:**
```
BBG004730N88: SBER | ПАО Сбербанк | lot=10 | curr=rub
BBG00475KKY8: YNDX | Яндекс Н.В. | lot=1 | curr=rub
PRICE BBG004730N88: 285.50
PRICE BBG00475KKY8: 2850.00
Нет last price для: []
```
**Когда использовать:**
- При настройке нового `config.yml`
- Для проверки актуальности FIGI перед запуском
- При отладке проблем с получением цен
### 3. Поиск инструментов (`search.py`)
```bash
python tools/search.py
```
**Назначение:** Помогает найти FIGI для нужных финансовых инструментов по тикеру или названию.
**Текущие поисковые запросы в скрипте:**
- Поиск золота по тикеру "TGLD@"
- Поиск ОФЗ 26212 по названию
- Поиск ETF "TPAY"
- Поиск основных валют (USD, EUR, GBP, JPY)
**Как настроить под свои нужды:**
1. **Поиск по тикеру акции:**
```python
shares = client.instruments.shares()
for s in shares.instruments:
if s.ticker == "SBER": # замените на нужный тикер
print(s.ticker, s.figi, s.name)
```
2. **Поиск облигаций по названию:**
```python
bonds = client.instruments.bonds()
for b in bonds.instruments:
if "Сбербанк" in b.name: # замените на нужное название
print(b.name, b.figi)
```
3. **Поиск ETF:**
```python
etfs = client.instruments.etfs()
for e in etfs.instruments:
if "TECH" in e.ticker: # замените на нужный тикер
print(e.ticker, e.figi, e.name)
```
4. **Поиск валют:**
```python
currencies = client.instruments.currencies()
for cur in currencies.instruments:
if "USD" in (cur.ticker or ""):
print(cur.ticker, cur.figi, cur.name)
```
**Пример вывода:**
```
TGLD@ BBG222222222 Золото
ОФЗ 26212 BBG00Y91R9T3 ОФЗ 26212
TPAY BBG111111111 TCS Payments
USD000UTSTOM BBG0013HGFT4 Доллар США
```
**Когда использовать:**
- При составлении нового портфеля
- Для поиска альтернативных инструментов
- При обновлении FIGI (например, для новых выпусков ОФЗ)
### Полезные советы по работе с инструментами
1. **Всегда проверяйте FIGI** перед добавлением в конфигурацию с помощью `check_figi.py`
2. **Для облигаций** FIGI может изменяться при новых выпусках, регулярно обновляйте
3. **Валютные пары** имеют разные FIGI для разных сроков поставки (TOM, TOD, SPOT)
4. **ETF и фонды** могут иметь ограничения по времени торговли
5. **Используйте поиск** для нахождения похожих инструментов в той же отрасли
### Автоматизация проверок
Можно создать скрипт для автоматической проверки перед запуском DCA:
```bash
#!/bin/bash
echo "=== Проверка баланса ==="
python tools/check_balance.py
echo -e "\n=== Проверка инструментов ==="
python tools/check_figi.py
echo -e "\n=== Запуск DCA (dry-run) ==="
python main.py --config config.yml --rub-budget 10000 --dry-run
```
## Логирование
Все операции записываются в файл `orders_log.csv` со следующими полями:
- `ts` — временная метка
- `period_key` — ключ периода (YYYY-MM)
- `figi` — FIGI инструмента
- `ticker` — тикер
- `name` — название инструмента
- `instrument_type` — тип (share, bond, etf, currency)
- `lots` — количество лотов
- `lot_size` — размер лота
- `filled_price_per_share` — цена исполнения за бумагу
- `cost_rub` — общая стоимость в рублях
- `status` — статус операции
- `order_request_id` — ID запроса (если не dry-run)
## Особенности работы
### Облигации
Для облигаций автоматически рассчитывается полная стоимость с учетом номинала и накопленного купонного дохода (НКД).
### Защита от ошибок
- Автоматическое уменьшение размера ордера при ошибке 30042 (недостаток средств)
- Проверка торгового статуса инструментов
- Пропуск неторгуемых инструментов
- Буферы для комиссий и проскальзывания
### Валюты
Поддерживаются только инструменты в рублях. Валютные инструменты пропускаются.
## Безопасность
1. **Никогда не коммитьте `.env` файл** — он содержит секретные токены
2. **Используйте токены только с необходимыми правами**
3. **Тестируйте конфигурацию в режиме `--dry-run`**
4. **Проверяйте баланс перед запуском**
## Получение токена
1. Перейдите в [личный кабинет Tinkoff Invest](https://www.tinkoff.ru/invest/)
2. Настройки → API → Создать токен
3. Выберите права: "Торговля" и "Чтение счетов"
4. Скопируйте токен в `.env` файл
## Автоматизация
Для регулярного запуска можно использовать cron:
```bash
# Каждый понедельник в 10:00
0 10 * * 1 cd /path/to/dca_bot && python main.py --config config.yml --rub-budget 10000
# Каждое 1 число месяца в 15:30
30 15 1 * * cd /path/to/dca_bot && python main.py --config config.yml --rub-budget 50000
```
## Структура проекта
```
dca_bot/
├── main.py # Основной скрипт
├── config.yml # Конфигурация портфеля (создать самостоятельно)
├── requirements.txt # Зависимости Python
├── .env # Переменные окружения (создать из .env.example)
├── .env.example # Шаблон переменных окружения
├── orders_log.csv # Лог операций (создается автоматически)
├── tools/
│ ├── check_balance.py # Проверка баланса
│ ├── check_figi.py # Проверка инструментов
│ └── search.py # Поиск инструментов
└── README.md # Этот файл
```
## Лицензия
MIT License
## Отказ от ответственности
Этот бот предоставляется "как есть" без каких-либо гарантий. Автор не несет ответственности за возможные финансовые потери. Используйте на свой страх и риск. Всегда тестируйте в режиме `--dry-run` перед реальной торговлей.