Как собрать персональный терминал для квант-анализа на Polars и DuckDB

23 авг 2026
3,492
827
16
3 недели

Каждый разработчик, который хоть раз пробовал анализировать биржевые котировки кодом, неизбежно проходил через один и тот же сценарий. Сначала вы открываете Jupyter Notebook, подключаете Pandas и тянете исторические свечи через случайный бесплатный API. Через пару дней блокнот разрастается до сотен нечитаемых ячеек, расчёт индикаторов начинает зависать на минуты, а вместо нормального интерфейса приходится разглядывать графики Matplotlib.

Недавно на GitHub наткнулся на проект shy3130/tick-stock-panel. Автор собрал законченную open-source платформу для квант-анализа, бэктестинга и мониторинга акций, которую можно запустить локально в одном Docker-контейнере. Проект изначально заточен под китайский фондовый рынок A-shares, но его архитектурные решения и технический стек заслуживают отдельного разбора, независимо от того, какими активами вы торгуете.

Что внутри и как это устроено

Главная проблема большинства самодельных скринеров заключается в производительности. Если считать скользящие средние, MACD, RSI и полосы Боллинджера по тысячам тикеров в цикле через Pandas, машина быстро захлебнется.

В tick-stock-panel эту задачу решили современным дата-стеком:

  • Polars отвечает за параллельный расчёт индикаторов и скрининг всего рынка за доли секунды.
  • Parquet используется как формат локального хранения обогащенных таблиц.
  • DuckDB выполняет быстрые аналитические выборки поверх Parquet прямо на диске без поднятия тяжелых баз данных.
  • vectorbt задействован в изолированном модуле бэктестинга.
  • FastAPI и sse-starlette отдают данные и транслируют прогресс тяжелых вычислений через Server-Sent Events.
  • React 18 с библиотеками Lightweight Charts и ECharts формирует аккуратную панель управления.

Архитектура получилась компактной: бэкенд и собранный фронтенд упакованы в двухстадийный Dockerfile. Приложению не нужны внешние PostgreSQL или Redis, вся база держится локально.

Реклама

Основные возможности платформы

Разработчик разделил функциональность на четыре ключевых блока: фильтрация, тестирование гипотез, отслеживание рынка и анализ отдельных активов.

Рабочий стол Скринер стратегий
Панель состояния Стратегии
Бэктестинг Поиск факторов
Бэктест Факторы

Скринер и встроенные стратегии

В систему встроено 18 готовых стратегий отбора бумаг. Механизм фильтрации работает на Polars: после закрытия торгового дня пайплайн вычисляет обогащенный датасет, а пользовательский запрос проверяет условия по всей таблице тикеров. Можно комбинировать стандартные индикаторы, объемы и свечные паттерны или писать собственные сигналы.

Бэктестинг и поиск альфа-факторов

Тестирование разделено на два режима:

  1. Оценка отдельных факторов с расчетом метрик IC и IR, доходности по квантилям и лонг-шорт спредов. Это помогает отсеять шум еще до составления торговой системы.
  2. Полноценный бэктест стратегий с учетом правила расчетов T+1, проскальзывания, комиссий брокера и стоп-лоссов.

Интересно реализован модуль майнинга факторов. Система ищет комбинации рангов на обучающей выборке, фильтрует коррелирующие показатели и проверяет результат на отложенных данных (out-of-sample). При этом найденные правила не применяются вслепую: кандидат сохраняется в черновиках и требует ручного подтверждения перед добавлением в рабочий пул.

Центр мониторинга Лестница лимитов
Монитор Лимиты
Анализ секторов Списки наблюдения
Сектора Вотчлист

Мониторинг в реальном времени и аномалии

В панели доступен модуль живого контроля. Вы можете задать правила срабатывания по ценовым уровням, индикаторам или отклонениям от средних значений. При наступлении события панель отправляет вебхук, показывает всплывающее уведомление в браузере и даже озвучивает тикер голосом через Web Speech API.

Подключение языковых моделей

В проект добавили интеграцию с LLM через OpenAI-совместимый интерфейс. Вы можете подключить Ollama, DeepSeek или закрытые API. Модели выполняют две прикладные роли: генерируют код правил для скринера по текстовому описанию и составляют вечерний отчет с разбором движения секторов после закрытия торгов.

Как развернуть и запустить

Быстрее всего запустить проект через Docker Compose:

cp .env.example .env
docker compose up --build

После сборки панель открывается на http://localhost:3018.

Для локальной разработки потребуется Python 3.11+, Node.js 20, пакетный менеджер uv и pnpm:

cp .env.example .env
./dev.sh

Скрипт сам проверит окружение, установит зависимости бэкенда через uv и фронтенда через pnpm, а затем поднимет FastAPI на порту 3018 и Vite dev-сервер на 3011.

Конфигурация настраивается в файле .env:

TICKFLOW_API_KEY=              # Ключ источника данных TickFlow (можно оставить пустым для базового режима)
AI_API_KEY=                    # Ключ LLM-провайдера для генерации стратегий
PORT=3018                      # Порт приложения

Подключение собственных источников данных

Базовый проект настроен на SDK китайского сервиса TickFlow, однако разработчик сделал слой данных подключаемым. В репозитории есть плагин на Node.js stock-sdk и примеры декларативного описания источников через YAML.

Если вы хотите адаптировать панель под MOEX, криптобиржи или Yahoo Finance, достаточно реализовать интерфейс поставщика дневных баров и передать их в формате Parquet. Вся остальная механика — расчёт скользящих, движок бэктестинга, графики Lightweight Charts и система алертов — продолжит работать без изменений.

Стоит ли пробовать

Проект tick-stock-panel интересен в первую очередь своей архитектурной чистотой. Автор отказался от тяжелых реляционных СУБД в пользу связки Polars + DuckDB + Parquet, благодаря чему система летает на обычном ноутбуке.

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

🍪 Мы используем файлы cookie и сервис аналитики Яндекс.Метрика, чтобы сайт работал лучше. Продолжая пользоваться devtrends.ru, вы соглашаетесь с обработкой данных согласно Политике конфиденциальности.