← Все проекты

De Prado — finance in ML as explorable knowledge

Мой эксперимент и рисёрч: превратить плотную книгу по financial ML в инструмент, с которым можно играть и проверять идеи. Здесь — зачем это и какие решения за этим стоят.

AstroElmTypeScriptKaTeXMDXFP

Зачем

«Advances in Financial Machine Learning» Маркоса Лопеса де Прадо — плотная книга: формулы, алгоритмы, неочевидные приёмы. Читать её пассивно — значит почти ничего не унести. Мне захотелось проверить идею explorable explanations: что если превратить анемичный текст в рабочий инструмент исследования — такой, где приём из книги можно не просто прочитать, а покрутить руками и почувствовать, как он себя ведёт.

Это мой личный эксперимент и одновременно рисёрч — и про предметную область (структуры финансовых данных), и про формат подачи знания. Педагогическая планка, которую я себе поставил: хороший explorable не иллюстрирует, а позволяет создавать — доводит читателя по пути «понимание → действие → новое знание».

Как это устроено

Сайт собран на Astro: проза — это статика (формулы рендерятся через KaTeX ещё на сборке, оформление — в духе Tufte с выносками на полях), а JavaScript подгружается только там, где есть интерактив. Интерактивные «островки» написаны на Elm (InfoBars, ReturnsDist, ImbalanceClock); тонкая glue-прослойка на TypeScript регистрирует каждый Elm-модуль и связывает его со страницей через порты.

Поверх этого — несколько собственных Astro-компонентов: Explorable (карточка-островок), Drive (управление состоянием виджета из текста), RunJS (запускаемый прямо в странице код), Margin (выноски на полях), ImbalanceFig (SVG, построенный на сборке).

Островок-песочница баров на странице de Prado: слева проза с ссылками-драйверами (time bars, tick bars, volume bars, dollar bars), справа график — волатильность по барам сверху и те же бары как OHLC снизу, переключатель real time / bar space, сегменты Raw / Time / Tick / Volume / Dollar, слайдер fine↔coarse и счётчик «one bar every ≈ 18.6 s».
Островок-песочница: один тиковый поток нарезается четырьмя способами (time / tick / volume / dollar), слайдер fine↔coarse меняет порог — и график, число баров и «one bar every» пересчитываются вживую. Виджет на Elm; ссылки-драйверы в прозе слева переводят его в нужное состояние через компонент Drive.

Решения, которые я принял на этом проекте

Острова, а не SPA

По умолчанию страница — это текст и формулы, отрендеренные статически. Интерактив приезжает точечными островками там, где он нужен, а не оборачивает весь сайт в приложение.

Почему так: жанр здесь — чтение, а не «приложение». Прозе незачем платить за рантайм фреймворка; формулы должны быть видны и проиндексированы сразу, без ожидания JS. Astro-острова дают ровно это — статика быстрая, а тяжёлый интерактив изолирован в своих границах.

Виджеты — на Elm

Каждый островок — это Elm-программа по архитектуре TEA, подключённая через порты.

Почему так: островок — это маленькое stateful-приложение (слайдеры, режимы, перерисовка графиков), и именно здесь цена ошибки в состоянии высокая. Elm даёт гарантию на уровне компилятора: нет null/undefined, неверное состояние просто не собирается. Для интерактива, который должен надёжно работать без присмотра, это идеальный размен — и заодно проверка тезиса, что функциональный подход окупается на практике.

Состоянием виджета управляет проза

Через компонент Drive ссылка прямо в тексте задаёт конфигурацию островка: читатель кликает фразу — и виджет переходит в нужное состояние (подсвечивает режим, выставляет порог). Связь идёт через apply-порт в Elm.

Почему так: это и есть суть explorable — текст и инструмент не живут раздельно. Объяснение ведёт читателя по сценарию, а виджет в этот момент показывает именно то, о чём идёт речь. Получается не «текст плюс игрушка рядом», а единый ход мысли.

Один скелет для всех баров → песочница

Все типы баров из книги — это одна формула: θ += w(tick); режем бар, когда θ ≥ порога. Четыре «разных» бара отличаются только весовой функцией w (время / 1 / объём / цена·объём).

Почему так: увидев общий скелет, читатель перестаёт зубрить четыре рецепта и понимает принцип. А дальше — кульминация, к которой я веду проект: песочница, где w задаёт сам читатель. В этот момент инструмент из «четырёх пресетов» превращается в средство создания — можно изобрести свой бар (по волатильности, по спреду, по токсичности потока). Это и есть «понимание → действие → новое знание» в действии.

Что есть и что впереди

Глава 2 («Financial Data Structures») собрана содержательно: оригинальная проза с формулами и кодом, три рабочих островка, запускаемый прямо в тексте алгоритм через RunJS, табличные модалки «эти бары как таблица» — связка визуализации с числами под ней.

Что впереди: песочница с пользовательской w (главный следующий шаг), CUSUM-фильтр для §2.5, загрузка реальных тиковых данных вместо синтетики. Честно: проект молодой — это исследовательский полигон, а не готовый продукт; мобильную раскладку островков надо причесать, и пока это одна глава из многих.

Проект скоро будет выложен в открытый доступ — тогда здесь появится ссылка на живое демо.