Перейти к содержимому

Grad-CAM для финансовых рынков: визуальные объяснения решений глубоких сетей

Grad-CAM (Gradient-weighted Class Activation Mapping) — это мощный метод интерпретируемости, который создаёт визуальные объяснения для решений, принимаемых свёрточными нейронными сетями (CNN). Применительно к финансовым рынкам Grad-CAM помогает трейдерам и количественным аналитикам понять, какие части ценовых графиков, свечных паттернов или технических индикаторов наиболее влияют на торговые решения модели.

Модели глубокого обучения часто критикуют как «чёрные ящики» в финансах, где регуляторные требования и управление рисками требуют прозрачности. Grad-CAM решает эту проблему, выделяя области входных данных (такие как паттерны временных рядов или изображения графиков), которые больше всего влияют на предсказания типа «покупать», «продавать» или «держать».

В этой главе рассматриваются теоретические основы Grad-CAM, его адаптация для финансовых временных рядов и распознавания графических паттернов, а также практические реализации на Python и Rust. Мы демонстрируем применение как на традиционных данных фондового рынка, так и на криптовалютных данных с биржи Bybit.

Содержание

  1. Введение в объяснимый ИИ в финансах
  2. Понимание Grad-CAM
  3. CNN для финансовых данных
  4. Реализация
  5. Бэктестинг с интерпретируемыми сигналами
  6. Реализация на Rust
  7. Литература

Введение в объяснимый ИИ в финансах

Объяснимый искусственный интеллект (XAI) стал критически важным в финансовых приложениях по нескольким причинам:

  • Регуляторное соответствие: Финансовые регуляторы всё чаще требуют, чтобы решения алгоритмической торговли были объяснимыми и проверяемыми
  • Управление рисками: Понимание того, почему модель делает определённые предсказания, помогает выявить потенциальные режимы отказа
  • Построение доверия: Портфельные менеджеры и клиенты должны понимать обоснование решений, принимаемых ИИ
  • Отладка модели: Инструменты интерпретируемости помогают выявить, когда модели обучаются на ложных корреляциях

Традиционные методы интерпретируемости, такие как оценка важности признаков, хорошо работают с табличными данными, но плохо справляются с пространственными и временными паттернами, которые CNN извлекают из финансовых графиков. Grad-CAM заполняет этот пробел, предоставляя интуитивно понятные визуальные объяснения, которые выделяют, какие части графического паттерна повлияли на решение модели.

Понимание Grad-CAM

Математические основы

Grad-CAM использует градиентную информацию, поступающую в последний свёрточный слой CNN, для создания грубой карты локализации, выделяющей важные области входных данных для предсказания целевого класса.

Для заданного класса $c$ вычисляется градиент оценки $y^c$ (до softmax) по отношению к картам признаков $A^k$ свёрточного слоя:

$$\alpha_k^c = \frac{1}{Z} \sum_i \sum_j \frac{\partial y^c}{\partial A_{ij}^k}$$

где $Z$ — количество пикселей в карте признаков, а $\alpha_k^c$ представляет вес важности карты признаков $k$ для класса $c$.

Тепловая карта Grad-CAM затем вычисляется как:

$$L_{Grad-CAM}^c = ReLU\left(\sum_k \alpha_k^c A^k\right)$$

ReLU применяется потому, что нас интересуют только признаки, положительно влияющие на класс интереса. Отрицательные влияния, вероятно, относятся к другим классам.

Как работает Grad-CAM

Алгоритм Grad-CAM состоит из следующих шагов:

  1. Прямой проход: Пропускаем вход (например, изображение свечного графика) через CNN для получения оценок классов
  2. Обратный проход: Вычисляем градиент оценки целевого класса по отношению к картам признаков последнего свёрточного слоя
  3. Вычисление весов: Применяем глобальное усреднение по пространственным измерениям градиентов для получения весов важности для каждой карты признаков
  4. Взвешенная комбинация: Вычисляем взвешенную комбинацию карт признаков с использованием этих весов важности
  5. Активация ReLU: Применяем ReLU для фокусировки только на положительных влияниях
  6. Масштабирование: Увеличиваем полученную тепловую карту до размера входного изображения для визуализации

Варианты: Grad-CAM++, Score-CAM и LayerCAM

Было предложено несколько улучшений оригинального Grad-CAM:

  • Grad-CAM++: Использует взвешенное среднее попиксельных градиентов, обеспечивая лучшую локализацию для нескольких экземпляров одного класса
  • Score-CAM: Полностью устраняет зависимость от градиентов, используя оценку прямого прохода на каждой карте активации в качестве её веса
  • LayerCAM: Сочетает способности локализации CAM-методов с безградиентной природой пертурбационных методов

Для финансовых приложений оригинального Grad-CAM часто достаточно, но Grad-CAM++ может быть полезен, когда несколько паттернов вносят вклад в одно предсказание.

CNN для финансовых данных

Преобразование временных рядов в изображения

Финансовые временные ряды могут быть преобразованы в изображения несколькими способами для обработки CNN:

  1. Тепловые карты OHLCV: Складываем несколько временных рядов (Open, High, Low, Close, Volume) как каналы
  2. Грамианские угловые поля (GAF): Преобразуем временной ряд в полярные координаты и вычисляем угловые разности
  3. Марковские переходные поля (MTF): Кодируем вероятности переходов между дискретизированными состояниями
  4. Рекуррентные диаграммы: Визуализируем повторение состояний в фазовом пространстве
  5. Свечные графики: Рендерим реальные изображения свечных графиков

Каждое представление захватывает разные аспекты данных:

  • Тепловые карты OHLCV сохраняют сырую ценовую информацию
  • GAF и MTF захватывают временные корреляции
  • Свечные графики используют паттерны, которые трейдеры применяют веками

Распознавание свечных графиков

Свечные паттерны используются трейдерами на протяжении веков для предсказания движений рынка. Распространённые паттерны включают:

  • Доджи: Указывает на нерешительность (маленькое тело, длинные тени)
  • Молот/Повешенный: Сигналы разворота (маленькое тело, длинная нижняя тень)
  • Поглощение: Сильные сигналы разворота (большая свеча поглощает предыдущую)
  • Утренняя/Вечерняя звезда: Трёхсвечные паттерны разворота

CNN могут обучаться распознавать эти паттерны непосредственно из изображений графиков, а Grad-CAM показывает, на какие конкретно паттерны модель обращает внимание.

Тепловые карты технических индикаторов

Несколько технических индикаторов могут быть объединены в многоканальные изображения:

  • Канал 1: Цена относительно скользящих средних
  • Канал 2: RSI (индекс относительной силы)
  • Канал 3: Гистограмма MACD
  • Канал 4: Положение в полосах Боллинджера
  • Канал 5: Объём относительно среднего

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

Реализация

Пример кода: построение CNN для предсказания движения цены

Python-реализация в python/model.py предоставляет архитектуру CNN, специально разработанную для классификации финансовых временных рядов, вместе с функциональностью Grad-CAM:

import torch
import torch.nn as nn
import torch.nn.functional as F
class FinancialCNN(nn.Module):
"""CNN для классификации финансовых временных рядов с поддержкой Grad-CAM."""
def __init__(self, input_channels=5, num_classes=3, sequence_length=60):
super().__init__()
# Свёрточные слои
self.conv1 = nn.Conv1d(input_channels, 32, kernel_size=5, padding=2)
self.bn1 = nn.BatchNorm1d(32)
self.conv2 = nn.Conv1d(32, 64, kernel_size=5, padding=2)
self.bn2 = nn.BatchNorm1d(64)
self.conv3 = nn.Conv1d(64, 128, kernel_size=3, padding=1)
self.bn3 = nn.BatchNorm1d(128)
# Глобальный усредняющий пулинг и классификатор
self.gap = nn.AdaptiveAvgPool1d(1)
self.fc = nn.Linear(128, num_classes)
# Для Grad-CAM
self.gradients = None
self.activations = None
def forward(self, x):
x = F.relu(self.bn1(self.conv1(x)))
x = F.relu(self.bn2(self.conv2(x)))
x = F.relu(self.bn3(self.conv3(x)))
# Сохраняем активации для Grad-CAM
if x.requires_grad:
x.register_hook(self.save_gradient)
self.activations = x
x = self.gap(x).squeeze(-1)
x = self.fc(x)
return x

Полную реализацию см. в python/model.py и пайплайн обучения в python/train.py.

Пример кода: применение Grad-CAM к торговым сигналам

Ноутбук example.ipynb демонстрирует:

  1. Загрузку и предобработку криптовалютных данных с Bybit
  2. Обучение CNN для предсказания движений цены
  3. Генерацию визуализаций Grad-CAM для торговых сигналов
  4. Интерпретацию того, какие временные периоды и признаки определяют предсказания

Пример кода: визуализация важных графических паттернов

Реализация Grad-CAM выделяет, какие части входного временного ряда наиболее сильно повлияли на решение модели:

class GradCAM:
"""Реализация Grad-CAM для 1D финансовых временных рядов."""
def __init__(self, model, target_layer):
self.model = model
self.target_layer = target_layer
def __call__(self, input_tensor, target_class=None):
# Прямой проход
output = self.model(input_tensor)
if target_class is None:
target_class = output.argmax(dim=1)
# Обратный проход
self.model.zero_grad()
one_hot = torch.zeros_like(output)
one_hot[0, target_class] = 1
output.backward(gradient=one_hot, retain_graph=True)
# Получаем градиенты и активации
gradients = self.model.gradients
activations = self.model.activations
# Взвешиваем по глобально усреднённым градиентам
weights = gradients.mean(dim=2, keepdim=True)
cam = (weights * activations).sum(dim=1)
# Применяем ReLU
cam = F.relu(cam)
# Нормализуем
cam = (cam - cam.min()) / (cam.max() - cam.min() + 1e-8)
return cam.squeeze().detach().numpy()

Бэктестинг с интерпретируемыми сигналами

Пример кода: построение интерпретируемой торговой стратегии

Модуль бэктестинга в python/backtest.py реализует торговую стратегию, которая:

  1. Использует CNN-модель для генерации сигналов покупки/продажи
  2. Применяет Grad-CAM для объяснения каждого торгового решения
  3. Фильтрует сделки на основе уверенности и интерпретируемости
  4. Отслеживает метрики производительности, включая коэффициент Шарпа, максимальную просадку и долю выигрышных сделок

Отслеживаемые ключевые метрики:

  • Коэффициент Шарпа: Измерение доходности с поправкой на риск
  • Коэффициент Сортино: Доходность с поправкой на риск снижения
  • Максимальная просадка: Наибольшее снижение от пика до впадины
  • Доля выигрышных сделок: Процент прибыльных сделок
  • Фактор прибыли: Валовая прибыль, делённая на валовые убытки

Реализация на Rust

Prod-ready Grad-CAM с интеграцией Bybit

Rust-реализация в rust/ предоставляет готовую к производству систему с:

  • Высокопроизводительный инференс: Оптимизирован для торговли с низкой задержкой
  • Интеграция Bybit API: Получение данных в реальном времени и размещение ордеров
  • Безопасность памяти: Модель владения Rust предотвращает распространённые ошибки
  • Конкурентная обработка: Async runtime для работы с несколькими символами

Rust-реализация фокусируется на эффективном инференсе, а не на обучении, поскольку обучение модели обычно выполняется офлайн на Python.

См. rust/src/lib.rs для основной библиотеки и rust/examples/ для примеров использования.

Литература

  1. Grad-CAM: Visual Explanations from Deep Networks via Gradient-based Localization

  2. Grad-CAM++: Improved Visual Explanations for Deep Convolutional Networks

  3. Score-CAM: Score-Weighted Visual Explanations for Convolutional Neural Networks

  4. Encoding Time Series as Images for Visual Inspection and Classification Using Tiled Convolutional Neural Networks

    • Wang, Z., & Oates, T.
    • AAAI Workshop on Artificial Intelligence for Smart Grids and Buildings
    • Год: 2015
  5. Deep Learning for Financial Applications: A Survey

    • Ozbayoglu, A.M., Gudelek, M.U., & Sezer, O.B.
    • Applied Soft Computing
    • Год: 2020
  6. Explainable Artificial Intelligence (XAI): Concepts, Taxonomies, Opportunities and Challenges toward Responsible AI

    • Arrieta, A.B., et al.
    • Information Fusion
    • Год: 2020