VectorBT-стек: три команды в одной — Блог
$ cat vectorbt-stek-tri-komandy-v-odnoi.md

VectorBT-стек: три команды в одной

VectorBT-стек: три команды в одной

Три slash-команды в коллекции — backtest, optimize, quick-stats — выглядят как разные скиллы, но читают одни и те же шаблоны, нагружают один стек и отличаются только финальной стадией. Это классический случай, когда три скилла должны быть одним.


Контекст: индийский VectorBT-конвейер

В коллекции из 210 скиллов оказался плотный кластер из 9 бэктестинг-инструментов. При ближайшем рассмотрении выяснилось, что семь из них — это одна экосистема под индийский рынок (NIFTY, BANKNIFTY, фьючерсные контракты), построенная вокруг связки OpenAlgo → TA-Lib → VectorBT. Оставшиеся два — другие парадигмы (event-driven Backtrader, ziplime), и их мы не трогаем.

Внутри индийской экосистемы есть чёткая иерархия:

setup (Stage 0: venv + TA-Lib C-lib + .env)
  ↓ installs
vectorbt-expert (Stage 1: knowledge hub, user-invocable: false, 22 rules + 12 templates)
  ↓ supplies templates to:
backtest    ─┐
optimize     ─┼─ (Stage 2: slash-команды, все три читают vectorbt-expert/rules/assets/)
quick-stats ─┘

vectorbt-expert — это invoke-only база знаний с 22 rule-файлами и 12 шаблонами стратегий для индийского рынка. Его нельзя вызвать напрямую, но три «публичные» команды подтягивают оттуда готовые snippets.

Состав трёх slash-команд

backtest

Полноценный бэктест одной параметризации стратегии. Создаёт .py файл в backtesting/{strategy}/. Аргументы: [strategy] [symbol] [exchange] [interval]. Делает всё: загрузка через client.history(), расчёт индикаторов через TA-Lib, фильтрация сигналов через ta.exrem() (исключение избыточных сигналов), vbt.Portfolio.from_signals(), сравнение с NIFTY-бенчмарком, QuantStats tearsheet, экспорт в CSV. ~76 строк SKILL.md, ~8K папка.

optimize

То же самое, но с grid-search loop по параметрам стратегии. Аргументы: [strategy] [parameter1] [parameter2]. Использует tqdm для прогресс-бара, генерирует два heatmap’а (по return и по Sharpe), выводит top-10 по каждому критерию. 63 строки SKILL.md, та же папка-размер.

quick-stats

Инлайн-режим, не создаёт файл — пишет код прямо в чат. Захардкожен на EMA 10/20 (без параметров), выдаёт компактный summary одной строкой: сигнал, Sharpe, drawdown. 51 строка SKILL.md, самый маленький.

Задачи, которые они покрывают

Когда трейдер работает с индийским рынком через OpenAlgo, у него три ежедневных вопроса:

  1. «Сделай мне полный бэктест этой стратегии на TCS»backtest TCS nse_eq 5m
  2. «Какие параметры EMA лучше на RELIANCE?»optimize ema_crossover RELIANCE nse_eq fast_window slow_window
  3. «Что там с EMA-крестом на INFY прямо сейчас, не пиши файл, просто скажи»quick-stats INFY

Все три вопроса опираются на один и тот же pipeline: load history → TA-Lib индикаторы → exrem-фильтр → VectorBT portfolio → comparison. Различается только финальная стадия.

Метод: что общего и что уникально

Общий стек (100% совпадение)

Все три SKILL.md содержат идентичные блоки:

  • Загрузка данных: client.history() через OpenAlgo, find_dotenv() для .env
  • Fees: 0.00111, fixed_fees=20 — кастомизировано под индийские брокеры
  • Futures lot-sizing: NIFTY=65, BANKNIFTY=30
  • DuckDB fallback: если история не доступна через API
  • Order sizing: min_size=1, size_granularity=1 для lot-based фьючерсов
  • Бенчмарк: NIFTY 50 по умолчанию, comparison table
  • Plain-language explain: после графиков идёт текстовое объяснение «что произошло и почему»
  • Plotly dark theme: единая визуальная схема для всех отчётов

Уникальные части (5-10% различий)

  • backtest добавляет QuantStats tearsheet (отдельный HTML-отчёт) + CSV-экспорт
  • optimize добавляет grid loop + два heatmap’а + top-10 ranking
  • quick-stats добавляет inline-режим (код в чат, не файл) + фиксированный EMA 10/20

Почему это не разные скиллы, а режимы

Если посмотреть на код backtest и optimize в их rules/assets/, видно, что это одна функция с разной обвязкой: backtest — single param tuple, optimize — cartesian product + iteration, quick-stats — вырожденный случай с hardcoded params и print() вместо write().

Сейчас дублируется ~150 строк идентичного boilerplate (загрузка, fees, exrem, benchmark) в трёх SKILL.md.

Польза от прочтения содержимого

Если вы работаете с индийским рынком через OpenAlgo, содержимое этих трёх скиллов даёт вам:

  1. Готовый production-конвейер для бэктеста фьючерсов с правильным lot-sizing (это самая частая ошибка новичков — забыть, что NIFTY торгуется лотами по 65)
  2. TA-Lib как обязательный слойvectorbt-expert жёстко запрещает vbt.MA.run() в пользу TA-Lib, потому что TA-Lib быстрее в 10-100x и совместим с production-системами
  3. DuckDB fallback pattern — если API возвращает пустоту, не падаем, а достаём из локальной базы
  4. NIFTY-бенчмарк по умолчанию — без сравнения с рынком backtest-метрики врут (стратегия +20% на падающем рынке — это плохо, а не хорошо)
  5. Plain-language explain как обязательная стадия — графики без интерпретации бесполезны для принятия решений

Что НЕ пересекается (и почему)

В этом же кластере лежат vectorbt (общий tutorial на крипту) и vectorbt-expert (индийский хаб). Их нельзя объединять, потому что у них прямо противоречащие правила:

  • vectorbt (крипто): поощряет vbt.MA.run() (быстро, удобно), fees 0.001–0.005, freq "1h", Birdeye/DEX данные
  • vectorbt-expert (Индия): запрещает vbt.MA.run() (Rule #1), TA-Lib обязателен, fees 0.00111, freq "1m"–”1d”`, OpenAlgo обязателен

Слить = сломать оба. Крипто-аудитория потеряет быстрые встроенные индикаторы, индийская потеряет жёсткие правила и темплейты.

Также backtest-expert — это ортогональный методолог: он не запускает бэктесты, а оценивает результаты по 5 измерениям (Sample Size, Expectancy, Risk Mgmt, Robustness, Exec Realism). Принимает user-provided метрики, выдаёт Deploy/Refine/Abandon вердикт. Может быть downstream-потребителем выхлопа из backtest, но не дублирует его.

Рекомендация по объединению

MERGE в один invocable-skill vbt-backtest с маршрутизацией по позиционному аргументу:

/vbt-backtest single STRATEGY SYMBOL [exchange] [interval]
/vbt-backtest sweep  STRATEGY SYMBOL PARAM1 PARAM2
/vbt-backtest stats  SYMBOL

Общий pipeline (load → TA-Lib → exrem → vbt → benchmark) описывается один раз в корневой SKILL.md. Режим-специфичные шаги — в трёх секциях под заголовками. Шаблоны кода остаются в vectorbt-expert/rules/assets/ (без изменений).

Что выиграем: −150 строк дублирования, единая точка входа, проще поддерживать правила (поменял fees в одном месте — работает везде).

Что потеряем: отдельные slash-команды. Но /vbt-backtest sweep ema_crossover TCS короче и читаемее, чем /optimize ema_crossover TCS, плюс явная связь со single и stats режимами.


Итоги

Семь скиллов в индийской VectorBT-экосистеме делятся на:

  • 3 кандидата на merge (backtest, optimize, quick-stats → 1)
  • 4 stay-separate (setup как bootstrap, vectorbt-expert как хаб, backtest-expert как методолог, vectorbt/backtrader/backtesting-skill как альтернативные фреймворки)

Из 9 скиллов кластера 3 могут быть объединены без потери функциональности, с уменьшением шума и упрощением поддержки. Это редкий случай, когда три «разных» инструмента — это одна машина с разными режимами вывода.


Ссылки