AI-powered self-learning trading signal system
Многофакторный анализ • LLM sentiment • Самообучение на outcomes • Telegram бот • REST API
Stock Signal Analyzer — система анализа торговых сигналов с самообучением. Анализирует акции по 7+ факторам, генерирует готовые торговые планы с entry/stop/targets, автоматически отслеживает результаты и учится на своих ошибках через AI-модель.
В отличие от обычных скринеров:
- 🧠 Самообучение — каждые 6 часов анализирует прошлые сигналы через IC (Information Coefficient) + LLM, корректирует веса компонентов
- 🤖 AI анализ новостей — Ollama Cloud API или локальный Ollama (qwen2.5:1.5b) понимает финансовый контекст
- 📊 8 факторов — техника, импульс, новости, объём, макро-данные, квант-модели, real-time price
- 🧠 Kronos Foundation Model — PyTorch-трансформер для прогноза цены по свечам (только
/signal, не скринер) - 🏛️ Режим рынка — автоопределение bull/bear/sideways для адаптивных порогов и риск-менеджмента
- 🎯 Торговые планы — entry, stop, два targets, R:R ≥ 1.5, ATR-based position size
- 📉 Chandelier trailing stop — динамический стоп на основе ATR (Chuck LeBeau)
- 📊 Бэктест с графиками — equity curve, drawdown, monthly returns, PnL distribution, tier stats
- 📡 TradingView webhook — принимайте алерты из TradingView и усиливайте SSA-анализом
- 📱 Telegram + REST API — получайте сигналы куда удобно
- ✅ Три режима фильтрации — Conservative (только A, conf≥0.55, ADX>25), Balanced (A/B, conf≥0.50), Aggressive (A/B, conf≥0.45, без недельного тренда). Фильтр применяется к уведомлениям и dashboard
- 🔔 Календарная дедупликация — 1 уведомление на тикер за сутки UTC, независимо от часового пояса
Бот анализирует акцию по 8 факторам, объединяет их в итоговый score и выдает готовый торговый план.
Команда /signal AAPL (или /signal SBER.ME) делает полный анализ одного тикера:
- Загружает историю — котировки за 12+ месяцев.
- Считает 8 факторов — каждый дает оценку от −1 (медвежий) до +1 (бычий).
- Объединяет — итоговый score (−1…+1).
- Строит торговый план — entry, stop, target 1, target 2, размер позиции.
- Проверяет макро — ближайшие важные события (Fed, CPI, и т.д.).
| Фактор | Что оценивает | Пример значения |
|---|---|---|
| Техника | RSI, MACD, скользящие средние, BB, паттерны | +0.35 — бычий MACD, цена выше SMA50 |
| Импульс | Доходность за 5/10/20 дней, ускорение | −0.15 — за 20 дней −2%, но ускорение +1% |
| Новости | Финансовый сентимент через LLM (FinBERT) | +0.20 — заголовки позитивные, compound +0.12 |
| Объём | CMF (денежный поток), отношение к среднему | −0.30 — объём низкий, деньги уходят |
| Макро | Ближайшие релизы (Fed, CPI, GDP) | ×0.95 — через 24ч CPI, повышенная осторожность |
| Квант-модели | MTF momentum, z-score, тренд, режим волатильности | −0.10 — 3M momentum −12%, MA stack медвежий |
| Real-time | Текущая цена MOEX/Т-Банк, VWAP, POC | +0.05 — last ≈ VWAP, нет отклонения |
| Kronos FM | PyTorch-трансформер прогнозирует цену по свечам | +0.80 — модель видит +3.5% за 5 дней |
После анализа ты получаешь сообщение в Telegram:
Итог: +0.250 (−1…+1), до макро: +0.263
- Итог — суммарная сила сигнала. Чем выше по модулю, тем сильнее.
- До макро — score до применения макро-коэффициента.
Класс качества: B
- A — сильный, чистый сигнал (|score| ≥ 0.30, согласованность ≥ 0.60, ADX > 25).
- B — средний, можно входить, но с осторожностью.
- C — слабый или противоречивый. Лучше не входить, только наблюдать.
Согласованность: 0.72
- 1.0 = все 8 факторов в одну сторону.
- 0.5 = половина за, половина против.
- Чем ниже, тем больше противоречий.
Торговый план
- Entry — цена входа (текущая или лучшая).
- Stop — стоп-лосс, рассчитан по ATR (1.5×ATR от цены).
- Target 1 — первая цель, закрыть 50% позиции.
- Target 2 — вторая цель, закрыть остаток.
- R:R — соотношение риск/прибыль (всегда ≥ 1.5).
- Позиция — рекомендуемый % от капитала (например, 5%).
Компоненты подробно Каждый фактор расписан отдельно:
- Техника: RSI=32, MACD медвежий, паттерн "треугольник нисходящий"
- Импульс: 5д −0.6%, 10д −3.6%, ускорение +2.3%
- Новости: 55 заголовков, сентимент нейтральный
- Объём: CMF −0.20, объём 0.02× от среднего
Квант-модели
- MTF momentum — доходность за 1М/3М/6М/12М.
- Trend — MA stack (−1 = цена ниже всех MA).
- Z-score — отклонение от среднего (Z < −1 = недооценка).
- Vol regime — текущая волатильность vs медиана.
- Cross-asset — VIX, DXY, US10Y (влияние макро).
🧠 Kronos FM
- Показывается только в
/signal(не в/screen). - 5d pred: +3.46% — модель предсказывает рост на 3.46% за 5 дней.
- Score клипается в [−1, +1]. Вклад в итог: вес × score (вес 0.05–0.25, адаптивный).
Макро
- Список ближайших релизов (Fed, CPI, GDP, и т.д.) за 48 часов.
- Если есть критичные события — макро-коэффициент < 1.0 (снижает score).
Вывод простым языком
- Поддержка / сопротивление — ближайшие уровни.
- Рекомендация: "Продавать" или "Покупать".
- Объяснение: почему такая оценка.
/screen сканирует список акций (голубые фишки или твой watchlist) и показывает только те, у которых score выше порога. Kronos FM не работает в /screen — только для скорости.
Каждые 6 часов:
- Система смотрит на прошлые сигналы — какие сработали (win_t1, win_t2), какие нет (loss).
- Считает IC (Information Coefficient) для каждого фактора — насколько он предсказывает результат.
- LLM (Ollama/gemma3:4b) анализирует топ-5 wins и losses, ищет паттерны.
- Корректирует веса: факторы с положительным IC получают больше веса, с отрицательным — меньше.
Пример из отчета:
↑ Импульс: ×1.13 (доверять больше)
↓ Объём: ×0.86 (доверять меньше)
Система автоматически определяет режим по индексу (IMOEX.ME / SPY):
- Bull — бычий рынок, агрессивные targets, стопы шире.
- Bear — медвежий рынок, только short, стопы уже, позиция меньше.
- Sideways — флэт, осторожность, position size −15%.
| Компонент | Минимум | Рекомендуется |
|---|---|---|
| Python | 3.11+ | 3.12 |
| RAM | 2 GB | 4 GB |
| Диск | 5 GB | 10 GB |
| CPU | 2 cores | 4 cores |
| OS | Ubuntu 22.04 / Debian 12 | Ubuntu 24.04 |
| Docker | 24+ | latest |
Зависимости:
- PostgreSQL — основная БД (в Docker-режиме поднимается автоматически; для systemd — нужен локальный сервер)
- SQLite — альтернатива PostgreSQL для минимальной установки
- Redis (опционально) — очередь задач Celery для параллельного анализа
- Ollama Cloud API (по умолчанию) — AI анализ новостей без нагрузки на сервер
- Ollama локальный (опционально) — если хотите локальный LLM; требует +4 GB RAM
git clone <repository-url>
cd stock_signal_analyzer
./scripts/deploy.shИнтерактивное меню проведёт через всю установку — запросит API ключи (с инструкциями), установит зависимости, запустит сервисы.
| Режим | Команда | Когда использовать |
|---|---|---|
| Docker (рекомендуется) | ./scripts/deploy.sh install → выбрать Docker |
Продакшн, полный стек |
| systemd | ./scripts/deploy.sh install → выбрать systemd |
VPS без Docker |
| Тесты | ./scripts/deploy.sh tests |
CI/CD, разработка |
./scripts/deploy.sh install # Полная установка (с нуля)
./scripts/deploy.sh configure # Перенастроить API ключи
./scripts/deploy.sh start # Запустить сервисы
./scripts/deploy.sh stop # Остановить
./scripts/deploy.sh restart # Перезапустить
./scripts/deploy.sh status # Статус и health check
./scripts/deploy.sh logs # Логи (выбор сервиса)
./scripts/deploy.sh update-deps # Обновить Python зависимости
./scripts/deploy.sh update # git pull + пересборка + fix_old_signals
./scripts/deploy.sh fix-signals # Исправить старые сигналы (trade plans)
./scripts/deploy.sh learning # Управление самообучением
./scripts/deploy.sh backtest # Бэктестирование
./scripts/deploy.sh tests # Запустить pytest
./scripts/deploy.sh uninstall # Удалить всёВсе параметры в .env. Создаётся автоматически при первом запуске ./scripts/deploy.sh или скопируйте вручную:
cp .env.example .env
nano .env| Переменная | Описание | Где получить |
|---|---|---|
TELEGRAM_BOT_TOKEN |
Токен Telegram бота | @BotFather |
ADMIN_CHAT_ID |
Ваш Telegram ID (для управления доступом) | @userinfobot |
| Переменная | Что даёт | Где получить |
|---|---|---|
POLYGON_API_KEY |
US котировки, исторические свечи, новости | massive.com |
FINNHUB_API_KEY |
US real-time котировки, макро-календарь | finnhub.io |
TINKOFF_INVEST_TOKEN |
Мосбиржа real-time, VWAP/POC | tbank.ru/invest |
| Переменная | По умолчанию | Описание |
|---|---|---|
DATABASE_URL |
postgresql://ssa:pass@localhost:5432/stock_signals |
URL подключения к PostgreSQL |
POSTGRES_PASSWORD |
генерируется | Пароль PostgreSQL |
| Переменная | По умолчанию | Описание |
|---|---|---|
REDIS_URL |
redis://localhost:6379/0 |
Redis для cache + rate limiter (при отсутствии — in-memory fallback) |
CELERY_BROKER_URL |
redis://localhost:6379/0 |
Redis для очереди |
CELERY_RESULT_BACKEND |
redis://localhost:6379/1 |
Redis для результатов |
| Переменная | По умолчанию | Описание |
|---|---|---|
OLLAMA_HOST |
http://localhost:11434 |
URL Ollama |
OLLAMA_MODEL |
qwen2.5:1.5b |
Модель для sentiment + обучения |
LLM_SENTIMENT |
1 |
Включить LLM sentiment (0 = только VADER) |
LLM_LEARNING |
1 |
Включить LLM обучение (0 = только числовой IC) |
LLM_CACHE_TTL |
3600 |
TTL кэша LLM ответов (сек) |
| Переменная | По умолчанию | Описание |
|---|---|---|
COLLECT_INTERVAL_SEC |
14400 (4ч) |
Автосбор сигналов (0 = выкл) |
NOTIFY_INTERVAL_SEC |
3600 (1ч) |
Проверка сильных сигналов |
LEARN_INTERVAL_SEC |
21600 (6ч) |
Цикл самообучения (IC + LLM) |
NOTIFY_MIN_TIER |
A |
Минимальный класс для уведомлений |
| Переменная | По умолчанию | Описание |
|---|---|---|
STOCK_SIGNAL_DATA |
/var/lib/stock_signal_analyzer |
Директория данных |
SSA_SIGNAL_LOG |
<data>/signals.jsonl |
Лог сигналов |
| Переменная | Описание |
|---|---|
MAX_BOT_TOKEN |
Токен бота MAX (получить у @MasterBot в MAX) |
MAX_CHAT_ID |
ID чата для уведомлений |
MAX_NOTIFY |
1 = включить дублирование сигналов в MAX |
┌─────────────────────────────────────────────────────────────┐
│ ПОЛЬЗОВАТЕЛИ │
│ Telegram Bot REST API CLI │
└──────────┬──────────────┬───────────┬───────────────────────┘
│ │ │
▼ ▼ ▼
┌─────────────────────────────────────────────────────────────┐
│ Redis Queue (Celery) │
└──────────────────────────┬──────────────────────────────────┘
│
┌────────────┼────────────┐
▼ ▼ ▼
Worker 1 Worker 2 Worker N
└────────────┼────────────┘
▼
┌─────────────────────────────────────────────────────────────┐
│ engine.build_report() │
│ Technical + Momentum + Sentiment(VADER+LLM) + Volume │
│ + Quant Models + Macro + Intraday + MarketRegime │
│ → Score → Tier → Plan │
└──────────┬──────────────┬─────────────┬────────────────────┘
│ │ │
PostgreSQL LLM Client Data APIs
(users, (Ollama Cloud (Yahoo, Polygon,
signals, или local) Finnhub, MOEX,
outcomes) T-Bank)
| Модуль | Описание |
|---|---|
engine.py |
Главный пайплайн — собирает все компоненты, считает score, формирует SignalReport |
technical.py |
Технический анализ: RSI, MACD, Bollinger Bands, ADX, свечные паттерны |
momentum.py |
Импульс: ROC за 5/20/60 дней, ускорение тренда |
sentiment.py + llm_sentiment.py |
VADER + LLM — анализ новостей и заголовков |
volume_pressure.py |
Объём: CMF, OBV, VWAP tape |
quant_models.py |
Квант-модели: MTF momentum, z-score, vol regime |
market_regime.py |
Определение режима рынка: bull / bear / sideways / transition |
signal_filter.py |
Фильтрация: win rate >65%, ADX > 20 (жёсткий блок), score ≥ 0.30 |
trade_plan.py |
Торговые планы: entry/stop/targets, R:R ≥ 1.5, ATR-based position size |
backtest_charts.py |
Генерация графиков бэктеста (matplotlib) |
llm_client.py |
Унифицированный клиент LLM (Ollama Cloud / local) |
outcome_tracker.py |
Отслеживание исходов открытых сигналов (win/loss/timeout) |
adaptive_weights.py |
IC-адаптация весов: ранговая корреляция Спирмена компонент с реальным PnL |
llm_learning.py |
Самообучение: числовой IC-анализ + LLM паттерн-анализ побед/поражений |
scheduler.py |
Фоновые задачи: автосбор, outcome check, learning cycle |
cache.py |
Redis-backed cache с TTL для expensive вычислений (analyze, и др.) |
circuit_breaker.py |
Circuit breaker для внешних API (Polygon, Finnhub, Yahoo, T-Bank) |
rate_limiter.py |
Redis-backed sliding-window rate limiter per client |
db.py |
PostgreSQL через SQLAlchemy: пользователи, сигналы, outcomes, alerts |
subscriptions.py |
Тарифы Free/Pro/Premium и лимиты |
risk_manager.py |
Sizing: Kelly criterion, vol targeting, drawdown control |
polygon_data.py |
Интеграция с Polygon API (котировки, новости) |
admin_alerts.py |
Уведомления админу в Telegram при сбоях (circuit breaker, quant failures) |
config_validator.py |
Валидация символов: regex ^[A-Z0-9.\-]{1,20}$ |
universe.py |
Списки тикеров + автоопределение рынка (RU → .ME) |
screener.py |
Параллельный скрининг 89 тикеров (ThreadPoolExecutor, cache) |
volume_clusters.py |
Объёмный анализ: POC, Value Area, HVN, LVN |
ml_scoring.py |
RankEnsemble (LightGBM + ExtraTrees + HistGradientBoosting) |
moex_iss.py |
MOEX ISS REST API: котировки TQBR, объёмы |
tbank_invest.py |
T-Bank Invest API (gRPC): real-time котировки РФ |
fix_old_signals.py |
Ретроактивное добавление trade plans к старым сигналам |
Бот генерирует сигналы
↓
outcome_tracker.py — каждый час проверяет достижение TP/стопов
↓
adaptive_weights.py — IC (ранговая корреляция компонентов с PnL)
↓
llm_learning.py — числовой анализ + LLM паттерны (каждые 6ч)
↓
engine.py — применяет скорректированные веса (blend 30%)
Три уровня обучения:
| Уровень | Метод | Порог |
|---|---|---|
| IC числовой | Weighted Spearman correlation | ≥ 50 закрытых outcomes |
| Паттерн-анализ | Статистика wins vs losses по компонентам | ≥ 30 outcomes |
| LLM анализ | Ollama анализирует топ-5 wins/losses, находит паттерны | ≥ 30 outcomes + Ollama |
Диапазон корректировок весов:
- Компоненты с положительным IC → вес увеличивается (boost до ×1.6)
- Компоненты с отрицательным IC → вес уменьшается (penalty до ×0.3)
- Компоненты с IC ≈ 0 → остаются на базовом весе
💡 Отрицательный IC означает, что компонент предсказывает наоборот (например, высокий technical_score перед падением). Система штрафует такие компоненты, а не усиливает их.
| 🆓 Free | ⭐ Pro | 💎 Premium | |
|---|---|---|---|
| Анализов/день | 5 | 50 | ∞ |
| Рынки | US | US + RU | Все |
| LLM sentiment | ❌ | ✅ | ✅ |
| Автосбор | ❌ | ✅ | ✅ |
| Уведомления | ❌ | ✅ | ✅ |
| Per-user learning | ❌ | ❌ | ✅ |
| Watchlist | 5 | 30 | 100 |
/clusters |
❌ | ✅ | ✅ |
/portfolio |
❌ | ✅ | ✅ |
/alerts |
❌ | ❌ | ✅ |
/mlscore |
❌ | ❌ | ✅ |
Включить: SUBSCRIPTION_ENABLED=1 в .env.
# Через меню
./scripts/deploy.sh tests
# Или напрямую (local/venv)
cd stock_signal_analyzer
python3 -m pytest tests/ -v
# Docker
docker compose exec api python3 -m pytest tests/ -v| Команда | Описание | Тариф |
|---|---|---|
/signal AAPL |
Полный анализ с торговым планом (10-30 сек) | Free+ |
/signal SBER |
Анализ российской акции (авто .ME) |
Free+ |
/signal SBER.ME |
Анализ российской акции (явный суффикс) | Free+ |
/price AAPL |
Быстрая котировка | Free+ |
/dashboard |
Свод по watchlist | Free+ |
/screen |
Скринер топ сигналов по рынку (US/RU/все) | Free+ |
/clusters AAPL |
Объёмный профиль (POC, Value Area, HVN/LVN) | Pro+ |
/mlscore |
ML RankEnsemble — важность фич и статус обучения | Premium |
| Команда | Описание | Тариф |
|---|---|---|
/settings |
Интерактивные настройки (inline-кнопки) | Free+ |
/watchlist add AAPL MSFT |
Добавить в watchlist | Free+ |
/collect |
Запустить массовый сбор сигналов | Free+ |
/status |
Статус системы | Free+ |
/export |
Выгрузить лог сигналов | Free+ |
/portfolio |
Открытые позиции (от outcome_tracker) | Pro+ |
/alerts |
Список активных алертов | Premium |
/alerts_add score > 0.30 |
Добавить алерт по score/tier/direction | Premium |
/alerts_remove 3 |
Удалить алерт по ID | Premium |
Команда /settings открывает интерактивное меню с inline-кнопками:
| Настройка | Описание |
|---|---|
| Фильтр сигналов | Conservative (A, conf≥0.55, ADX>25) / Balanced (A/B, conf≥0.50) / Aggressive (A/B, conf≥0.45) — строгость отбора сигналов и уведомлений |
| Уведомления вне списка | Вкл/выкл уведомления о сильных сигналах не из watchlist |
| Язык | Русский / English |
| Learning report | Получать отчёты о самообучении |
| Автосбор | Автоматический сбор сигналов |
| Просадки | Уведомления о circuit breaker |
| Дайджест | Ежедневная сводка сигналов |
| Команда | Описание |
|---|---|
/approve 123456789 pro |
Одобрить пользователя с тарифом |
/deny 123456789 |
Заблокировать |
/users |
Список пользователей |
curl http://localhost:8000/health # Health check
curl http://localhost:8000/analyze/AAPL # Полный анализ
curl "http://localhost:8000/analyze/AAPL?fast=true" # Быстрый анализ
curl http://localhost:8000/stats # Статистика
curl http://localhost:8000/learning/report # Отчёт об обученииПринимайте алерты из TradingView и усиливайте SSA-анализом:
Настройка в TradingView:
URL: https://your-host/webhook/tradingview
Message: {"symbol":"{{ticker}}","price":{{close}},"side":"{{strategy.order.action}}","interval":"{{interval}}","time":"{{time}}"}
Опциональная защита: установите TV_WEBHOOK_SECRET в .env.
Пример запроса:
curl -X POST http://localhost:8000/webhook/tradingview \
-H "Content-Type: application/json" \
-d '{"symbol":"AAPL","price":150.25,"side":"buy","interval":"1h"}'Ответ: SSA score, tier, direction, trade plan, и сообщение о совпадении/несовпадении с внешним сигналом.
├── scripts/
│ └── deploy.sh # 🎯 Единая точка входа
│
├── stock_signal_analyzer/ # Основной пакет
│ ├── engine.py # Главный пайплайн
│ ├── technical.py # RSI, MACD, Bollinger, ADX, паттерны
│ ├── momentum.py # ROC, acceleration
│ ├── sentiment.py + llm_sentiment.py # VADER + LLM анализ
│ ├── volume_pressure.py # CMF, OBV, VWAP
│ ├── market_regime.py # Режим рынка (bull/bear/sideways)
│ ├── signal_filter.py # Фильтрация (win rate >65%)
│ ├── trade_plan.py # Торговые планы (R:R ≥ 1.5)
│ ├── backtest_charts.py # Графики бэктеста (matplotlib)
│ ├── llm_client.py # Унифицированный LLM клиент
│ ├── outcome_tracker.py # Отслеживание исходов
│ ├── adaptive_weights.py # IC-адаптация весов
│ ├── llm_learning.py # Самообучение
│ ├── scheduler.py # Фоновые задачи
│ ├── db.py # PostgreSQL (SQLAlchemy)
│ ├── cache.py # Redis-backed cache с TTL
│ ├── circuit_breaker.py # Circuit breaker для внешних API
│ ├── rate_limiter.py # Redis-backed sliding-window rate limiter
│ ├── polygon_data.py # Интеграция с Polygon API
│ └── ... # 30+ модулей
│
├── api/main.py # REST API (FastAPI)
├── telegram_bot.py # Telegram бот
├── alembic/ # Alembic миграции БД
│ ├── env.py
│ └── versions/
├── tools/backtest.py # Бэктест v1
├── tools/backtest_v2.py # Бэктест v2 (candle replay)
├── .github/workflows/ # GitHub Actions CI/CD
│ ├── ci.yml
│ └── deploy.yml
├── docker-compose.yml
├── Dockerfile
├── pyproject.toml # Ruff, mypy конфиг
└── requirements*.txt
- Tier-based Telegram команды (
telegram_bot.py+subscriptions.py) —/screen,/clusters(Pro+),/mlscore(Premium),/portfolio(Pro+),/alerts,/alerts_add,/alerts_remove(Premium). Каждая команда проверяет тариф и rate limit - Алерты (
telegram_bot.py+db.py) — добавление/удаление алертов по score, tier, direction. Отображение с ID для удобного удаления. МодельUserAlertв PostgreSQL - ML Score (
ml_scoring.py) — исправленNameError(datetimeне импортирован).RankEnsemble.fit()теперь сохраняетlast_fit_atкорректно - Screener timeout fix (
screener.py) —concurrent.futures.as_completedв Python 3.9 выбрасываетconcurrent.futures.TimeoutError, а не встроенный. Теперь таймаут корректно ловится и pending futures отменяются - Verdict синхронизирован с tier (
engine.py) —_verdict_from_scoreтеперь учитывает tier: A=«сильная уверенность», B=«умеренная», C=threshold-based. Исправлено несоответствие «tier=A, verdict=нейтрально» - B-tier threshold для уведомлений (
telegram_bot.py) — снижен с|score| < 0.35до|score| < 0.20, соответствует реальному порогу B-tier - Self-learning thresholds (
engine.py+risk_context.py) — ML optimal thresholds подгружаются передclassify_signal_tier(). A-tier: 0.40→0.28, B-tier: 0.26→0.16. Пороги ML применяются как floor (не ниже базового) - Alignment amplification (
engine.py) — при 3+ согласованных компонентах +0.12–0.20 к score. Sentiment dampening: сильный тех. сигнал противостоит противоположным новостям - Directional regime adjustment (
trade_plan.py) — корректировка bull/bear теперь учитывает direction сигнала: aligned with trend = tighter stop / wider target; against-trend = conservative. Исправлено отклонение плана для MGNT.ME short-in-bear (R:R 1.41→1.83) - Quant model weights (
engine.py) — MTF 0.22, z-score 0.12, trend 0.14 - Deduplication 1 день (
signal_log.py) — с промоушном tier (C→B→A). Централизованная загрузка JSONL - fix_old_signals.py (
scripts/) — ретроактивно добавляет trade plans к старым C-сигналам. Интегрирован вdeploy.sh update - Docker ignore (
.dockerignore) —scripts/fix_old_signals.pyтеперь включается в образ, исправлена ошибка «No such file or directory» приdo_fix_signals() - _online_hint (
engine.py) — для.MEтикеров вfast_modeчестно сообщает «пропущено в быстром режиме» вместо обвинения MOEX ISS - Tests: 192 passed
- Настройка рынка вне списка (
user_store.py+telegram_bot.py) — пользователь может выбрать: 🌍 Все рынки / 🇺🇸 Только US / 🇷🇺 Только РФ. Фильтр применяется к периодическим уведомлениям вне watchlist - Кнопки выбора рынка в
/settings— inline-кнопки рядом с переключателем уведомлений - Тесты: 132 passed
- Три режима фильтрации сигналов (
signal_filter.py) — Conservative (только A, conf≥0.55, ADX>25), Balanced (A/B, conf≥0.50, ADX>20), Aggressive (A/B, conf≥0.45, без проверки недельного тренда). Фильтр применяется к уведомлениям watchlist/outside и/dashboard - Календарная дедупликация уведомлений (
user_store.py) — 1 уведомление на тикер за календарные сутки UTC (вместо 24-часового cooldown) - timeout исключён из win_rate (
outcome_tracker.py) — win_rate считается только по целевым выходам (win_t1/win_t2/loss), timeout не влияет на статистику - Дедупликация outcomes (
outcome_tracker.py) — записи уникальны по паре (signal_id, outcome), предотвращает дублирование при перезапуске - HTML-escape в learning report (
llm_learning.py) —html.escape()для LLM-паттернов и рекомендаций, фиксCan't parse entitiesв Telegram - max_hold_days 5→15 (
trade_plan.py) — базовое удержание 15 дней (A: 15→30 при сильном тренде, B: 15→21, C: 15) - scan_all_signals (
tasks.py+outside_signals.py) — периодическое сканирование всех тикеров каждые 30 мин, кэширование результатов - Фильтр вне списка (
telegram_bot.py) — класс C полностью исключён из уведомлений «вне списка», только A и B (B при |score|≥0.35) - Тесты: 132 passed
- llm_learning.py — сохраняет
learning_state.jsonдаже при 0 outcomes, устраняя бесконечный цикл сообщения «нет данных» - outcome_tracker.py — больше не перезаписывает открытые сигналы в
outcomes.jsonlпри каждом запуске (файл перестаёт раздуваться);max_workersснижен с 8 до 2 - price_fetcher.py — новый unified data source с fallback chain:
.ME(российские): Т-Банк (приоритет) → yfinanceUS: Polygon → Finnhub → yfinance- outcome_tracker.py теперь использует price_fetcher вместо прямых yfinance вызовов
- backtest_v2.py — добавлен retry с exponential backoff при «Too Many Requests» от yfinance
- deploy.sh —
do_learning()работает корректно черезdocker compose exec; добавлена проверка T-Bank SDK после сборки образов - T-Bank SDK — проверка импорта во всех Docker-контейнерах (
api,worker,bot)
- CI/CD pipeline (GitHub Actions) —
ci.yml(ruff, mypy, pytest, Docker build) +deploy.yml(auto-deploy на сервер по SSH с health check) - Redis-backed cache (
cache.py) — TTL-кэш для expensive вычислений (analyze, и др.); fallback на in-memory при отсутствии Redis - Circuit breaker (
circuit_breaker.py) — CLOSED/OPEN/HALF_OPEN state machine для всех внешних API (Polygon, Finnhub, Yahoo, T-Bank); threshold=15, recovery=180с; отдельная обработка data errors (delisted, no data) — не триггерит breaker - Redis-backed rate limiter (
rate_limiter.py) — sliding-window rate limiter per client на sorted sets Redis; fallback на in-memory - Alembic миграции — production-ready schema management; startup пробует
alembic upgrade head, fallback наinit_db() - Input validation (
api/main.py+config_validator.py) — Pydantic validators: regex^[A-Z0-9.\-]{1,20}$, защита от path traversal (..,/,\) - Cache layer для
/analyze— проверяет Redis передbuild_report, сохраняет результат на 300с; ключ включает fast_mode и use_finnhub_ws - Celery batch scan (
tasks.py) — массовый сбор черезcelery.groupв параллельных задачах; scheduler не блокируется - Auto market detection (
universe.py) — российские тикеры (SBER, GAZP, etc.) автоматически получают суффикс.MEво всех entry points - Admin alerts (
admin_alerts.py) — Telegram уведомления админу при circuit breaker OPEN, quant model failures, LLM learning failures; rate limit 5 минут на тип - Global error handler (
telegram_bot.py) — перехват всех необработанных исключений в боте с ответом пользователю - .env security —
.envв.dockerignore; токены не попадают в Docker-образ - pyproject.toml — конфиг ruff с per-file-ignores для E402 (stenv import pattern)
- Тесты: 106 → 132 passed
- Интерактивные настройки (
/settings) — inline-кнопки для фильтра сигналов, уведомлений, языка, learning report, автосбора, просадок, дайджеста - Единый Settings dataclass (
config.py) — централизованная загрузка всех env vars через@lru_cache - Kelly caching (
risk_manager.py) — кэширование Kelly criterion на 1 час, устранение I/O bottleneck - Tier cache (
subscriptions.py) — кэш тарифов на 5 минут, защита от сброса при кратковременных ошибках БД - Gap-aware outcome tracking (
outcome_tracker.py) — учёт gap down/up при определении исхода сигнала - Dead code удалён —
_daily_usagein-memory counter (заменён на БД + LRU cache) - Code quality — документированы magic numbers, добавлены length checks, исправлено дублирование
@staticmethod - Тесты: 106 passed
- Chandelier trailing stop (
technical.py) — динамический стоп на основе highest high/lowest low ± 3×ATR (Chuck LeBeau) - Интегрирован в
TradePlan, отображается в плане, экспортируется в signal log - Тесты: 106 passed
- TradingView webhook (
POST /webhook/tradingview) — принимает алерты из TradingView, нормализует символы (крипто, US, RU), усиливает SSA-анализом - Валидация направления из нескольких полей (
direction/side/action) - Опциональная защита
TV_WEBHOOK_SECRET - Автоматическое логирование внешних сигналов + SSA результата для walk-forward валидации
- Тесты: 103 passed
- Исправлена критическая ошибка: rebase потерял интеграцию
MarketRegimeвtrade_plan.pyиrisk_context.py - Восстановлены динамические пороги Tier A/B с консервативными значениями по умолчанию (neutral: score≥0.46, conf≥0.60, ADX≥20.0)
- Восстановлен
llm_client.pyвllm_learning.pyиllm_sentiment.py - Восстановлена ATR-based position sizing с regime adjustments
- MarketRegime detection — автоопределение bull/bear/sideways/transition через reuse существующих анализаторов
- Динамические пороги классов сигналов: bull → лонг легче, шорт сложнее; bear — наоборот; sideways — строже ADX/confidence
- Режим рынка влияет на trade plan (stop/target множители, max hold days) и position size (-15% в sideways)
- Backtest charts — 5 типов графиков (equity curve, drawdown, monthly returns, PnL distribution, tier stats) через matplotlib
- Унифицированный LLM клиент (
llm_client.py) — Ollama Cloud API по умолчанию, локальный Ollama как fallback - Удалён OpenRouter и Docker-контейнер Ollama для снижения нагрузки на сервер
- Обновлён
deploy.sh— подменю LLM конфигурации, установка локального Ollama через меню - Тесты: 87 → 97 passed (добавлены тесты regime detection)
- trade_plan.py — R:R всегда ≥ 1.5;
_DIR_THRESHOLDподнят до 0.30; защита от ZeroDivisionError - signal_filter.py — ADX < 20 жёсткий блок; score < 0.30 принудительный блок
- risk_context.py — Tier B требует confidence ≥ 0.50 и ADX ≥ 20.0
- outcome_tracker.py — timeout 5→15 дней; защита от None ; дедупликация по (signal_id, outcome); timeout исключён из win_rate
pnl_pct - volume_pressure.py — защита от ZeroDivisionError и
log(0) - llm_learning.py — минимум outcomes 30; TTL кэша весов 1 час
- Тесты: добавлены 15 тестов (R:R, ADX, score, volume, tier B)
.envв.dockerignore— токены не попадают в Docker-образ.envхранится с правами600(только владелец)- PostgreSQL пароль генерируется автоматически
- API rate limiting per IP + опциональный
X-API-Key(Redis-backed sliding window) - Input validation на всех endpoints (Pydantic regex
^[A-Z0-9.\-]{1,20}$, max_length, path traversal защита) - Circuit breaker на внешних API (Polygon, Finnhub, Yahoo, T-Bank) — быстрый fail при долгих ответах; data errors (delisted, no data) не триггерят breaker
- Redis cache для
/analyzeс TTL 300с — снижает нагрузку на повторные запросы - Admin alerts — Telegram уведомления админу при circuit breaker OPEN, quant model failures, LLM learning failures
- Ollama Cloud API или локальный Ollama — данные не передаются третьим лицам
- Токены не попадают в логи
Только для информационных целей. Не является финансовой рекомендацией. Торговля на финансовых рынках сопряжена с риском потери капитала. Всегда проводите собственный анализ.
Version 2.5.4 • Updated 2026-05-28