# MOEX Neural Network Backtester

Алгоритмический движок для генерации торговых сигналов на Московской бирже с использованием **нейронной сети** (LSTM / Transformer / MLP) с multi-task обучением и Triple Barrier labeling.

## Требования

- Python 3.10+
- MySQL/MariaDB
- PyTorch 2.0+
- scikit-learn, pandas, numpy

## Установка

```bash
pip install -r requirements.txt
cp .env.example .env
```

Настройте `.env` файл:
```env
DB_HOST=localhost
DB_PORT=3306
DB_NAME=moex
DB_USER=root
DB_PASSWORD=your_password
RISK_PER_TRADE=0.01
TICKER_LIST=SBER,GAZP,PLZL,VTBR
```

## Быстрый старт

### 1. Обучить модель

```bash
python scripts/train_neural_model.py --start 2023-01-01 --end 2024-01-01
```

### 2. Бэктест одного тикера

```bash
python main.py --backtest --ticker SBER --start 2023-01-01 --end 2024-01-01
```

### 3. Пакетный бэктест

```bash
python scripts/batch_backtest.py --start 2023-01-01 --end 2024-01-01
```

### 4. Live-мониторинг (сканер)

```bash
python main.py --scan --interval 60
```

### 5. Виртуальная торговля

```bash
python main.py --scan --interval 60
```

## Архитектура

```
moex_vsa_backtester/
├── config/         # Singleton Config (dotenv → dict)
├── db/             # SQLAlchemy + PyMySQL pool
├── core/           # DataPreparator, risk_manager, virtual_trader
├── backtest/       # NeuralBacktester + metrics
├── ai/             # Neural pipeline:
│   ├── features.py         — Feature engineering
│   ├── labeling.py         — Triple Barrier Method
│   ├── dataset_v2.py       — Multi-ticker dataset
│   ├── model_v2.py         — LSTM / Transformer / MLP
│   ├── trainer_v2.py       — Multi-task training
│   └── inference_v2.py     — NeuralPredictor
├── scanner/        # NeuralScanner, scheduler, virtual_trading
├── domain/         # Dataclasses + Enums (flat re-exports)
├── tests/          # test_labeling, test_dataset_v2, test_model_v2,
│                   # test_trainer_v2, test_inference_v2, test_backtester
├── models/         # .pt (PyTorch) обученные модели
├── logs/           # Логи, сделки, отчёты
└── scripts/        # train_neural_model.py, batch_backtest.py, deep_analysis.py
```

## Нейросетевая стратегия

### Multi-Task Learning

Модель одновременно предсказывает четыре выхода:

| Выход | Тип | Описание | Диапазон |
|-------|-----|----------|----------|
| `entry_proba` | classification | Вероятность входа (BCE loss) | [0, 1] |
| `sl_distance` | regression | SL в ATR (MSE loss) | [0.3, 3.0] |
| `tp_distance` | regression | TP в ATR (MSE loss) | [0.5, 5.0] |
| `confidence` | regression | Уверенность модели | [0, 1] |

### Triple Barrier Labeling

Генерация меток по методу Marcos Lopez de Prado:
- `outcome = 1` (TP hit) — `entry_signal = 1`
- `outcome = -1` (SL hit) — `entry_signal = 0`
- `outcome = 0` (timeout) — `entry_signal = 0`

Параметры по умолчанию:
- `TP = 1.5 × ATR` (breakeven WR = 40%)
- `SL = 1.0 × ATR`
- `max_holding_bars = 48` (2 дня H1)

### Архитектуры моделей

| Модель | Файл | Рекомендация |
|--------|------|--------------|
| `LSTMMultiTaskModel` | `ai/model_v2.py` | **Рекомендуется** — учёт последовательности |
| `TransformerMultiTaskModel` | `ai/model_v2.py` | Сложные паттерны |
| `MLPMultiTaskModel` | `ai/model_v2.py` | Baseline (быстрый) |

## Аргументы командной строки

### `main.py`

| Параметр | Описание | По умолчанию |
|----------|----------|--------------|
| `--ticker` | Тикер (SBER, GAZP, PLZL...) | - |
| `--tf` | Таймфрейм | H1 |
| `--start` | Дата начала | 2023-01-01 |
| `--end` | Дата окончания | 2024-01-01 |
| `--capital` | Начальный капитал | 1,000,000 |
| `--risk` | Риск на сделку (0.01 = 1%) | 0.01 |
| `--backtest` | Запуск бэктеста | false |
| `--scan` | Запуск сканера (мониторинг) | false |
| `--interval` | Интервал сканера (сек) | 60 |
| `--max-positions` | Макс. одновременных позиций | 5 |
| `--ai-model` | Путь к модели | models/neural_trader.pt |
| `--ai-threshold` | Мин. вероятность входа | 0.6 |
| `--min-confidence` | Мин. уверенность модели | 0.3 |
| `--sides` | Стороны (LONG,SHORT) | LONG,SHORT |

### `scripts/train_neural_model.py`

| Параметр | Описание | По умолчанию |
|----------|----------|--------------|
| `--start` / `--end` | Период обучения | 2023-01-01 / 2024-01-01 |
| `--tickers` | Список тикеров (comma-separated) | все 15 |
| `--model` | Архитектура (lstm/transformer/mlp) | lstm |
| `--epochs` | Число эпох | 100 |
| `--batch-size` | Размер батча | 32 |
| `--hidden-size` | Размер скрытого слоя | 128 |
| `--num-layers` | Число слоёв | 2 |
| `--dropout` | Dropout rate | 0.3 |
| `--lr` | Learning rate | 0.001 |
| `--tp-atr-mult` | Множитель TP-барьера | 1.5 |
| `--sl-atr-mult` | Множитель SL-барьера | 1.0 |
| `--save-dataset` | Путь сохранения датасета | - |
| `--load-dataset` | Путь загрузки датасета | - |

## База данных

- **Хост:** `nlbotinterface.ru:3306` / `bitcoin_tickers`
- **Таблицы:** `{TICKER}_{TF}` (верхний регистр) — 15 тикеров × H1
- **Структура:** `timestamp` (bigint PK), `Date`, `Time`, `Open`, `High`, `Low`, `Close`, `Volume`

**Тикеры:** SBER, GAZP, PLZL, VTBR, LKOH, ROSN, NVTK, MTSS, PHOR, SNGSP, ASTR, X5, MOEX, BITCOIN, EURUSD

## Метрики бэктеста

- Total Trades
- Win Rate (%)
- Profit Factor
- Max Drawdown
- Avg RR
- Total PnL
- Sharpe Ratio

## Логи

| Файл | Описание |
|------|----------|
| `logs/neural_backtest.log` | Лог бэктеста |
| `logs/signals.log` | Лог сигналов |
| `logs/trades_TICKER_TF.csv` | Сделки |
| `models/*.pt` | Обученные PyTorch модели |
| `models/*.npz` | Сохранённые датасеты |
| `reports/*.md` | Отчёты бэктестов |

## Тесты

```bash
pytest -v
```

114 тестов (без MySQL):
- `test_labeling.py` (25)
- `test_dataset_v2.py` (18)
- `test_model_v2.py` (23)
- `test_trainer_v2.py` (18)
- `test_inference_v2.py` (17)
- `test_backtester.py` (13)

## Примеры использования

### Бэктест с высоким порогом входа

```bash
python main.py --backtest --ticker SBER --ai-threshold 0.7 --min-confidence 0.5
```

### Только LONG

```bash
python main.py --backtest --ticker SBER --sides LONG
```

### Обучение Transformer на конкретных тикерах

```bash
python scripts/train_neural_model.py --tickers SBER,GAZP,PLZL --model transformer --epochs 150
```

### Кэширование датасета

```bash
python scripts/train_neural_model.py --save-dataset models/dataset_h1
python scripts/train_neural_model.py --load-dataset models/dataset_h1
```

## Лицензия

MIT
