Глава 111: SHAP для интерпретируемости торговых моделей
Обзор
SHAP (SHapley Additive exPlanations) — это теоретико-игровой подход к объяснению выходных данных любой модели машинного обучения. Основанный на значениях Шепли из кооперативной теории игр, SHAP предоставляет унифицированную меру важности признаков, которая является как локально точной (для отдельных предсказаний), так и глобально согласованной (агрегированной по всему набору данных).
В алгоритмической торговле SHAP позволяет трейдерам и аналитикам понять, почему модель предсказывает конкретный торговый сигнал. Эта интерпретируемость критически важна для:
- Соответствия нормативным требованиям: объяснение решений модели регуляторам
- Управления рисками: понимание, какие признаки приводят к рискованным предсказаниям
- Отладки моделей: выявление случаев, когда модели полагаются на ложные корреляции
- Инжиниринга признаков: определение, какие признаки вносят наибольший вклад в предсказательную силу
- Улучшения стратегий: повышение уверенности в сигналах через понимание их драйверов
Содержание
- Введение в SHAP
- Математические основы
- Варианты и алгоритмы SHAP
- SHAP для торговых приложений
- Реализация на Python
- Реализация на Rust
- Практические примеры с данными акций и криптовалют
- Фреймворк бэктестинга
- Оценка производительности
- Ссылки
Введение в SHAP
Проблема интерпретируемости
Модели машинного обучения, используемые в торговле, часто функционируют как «чёрные ящики». Хотя такие модели, как градиентный бустинг, нейронные сети и ансамблевые методы, достигают высокой точности предсказаний, они дают мало понимания того, почему они делают конкретные предсказания. Эта непрозрачность создаёт несколько проблем:
- Доверие: трейдеры не решаются действовать на основе сигналов, которые не понимают
- Отладка: когда модели ошибаются, сложно диагностировать причину
- Обнаружение переобучения: модели могут выучить ложные паттерны, которые выглядят предсказательными, но не являются надёжными
- Регуляторный контроль: финансовые регуляторы всё чаще требуют объяснимый ИИ
Решение на основе значений Шепли
SHAP основан на значениях Шепли — концепции из кооперативной теории игр, разработанной Ллойдом Шепли в 1953 году (за которую он получил Нобелевскую премию по экономике в 2012 году). Ключевая идея: справедливо распределить «выигрыш» (предсказание) между «игроками» (признаками) на основе их предельного вклада.
Для предсказания f(x) значение Шепли для признака i равно:
φ_i = Σ_{S ⊆ N \ {i}} [|S|!(|N|-|S|-1)! / |N|!] × [f(S ∪ {i}) - f(S)]Где:
- N — множество всех признаков
- S — подмножество признаков, не включающее i
- f(S) — предсказание модели с использованием только признаков из S
Эта формула рассматривает все возможные упорядочения признаков и вычисляет средний предельный вклад признака i.
Математические основы
Свойства значений Шепли
Значения Шепли уникально удовлетворяют четырём желательным свойствам:
-
Эффективность: сумма всех значений Шепли равна разнице между предсказанием модели и ожидаемым предсказанием:
Σ_{i=1}^{M} φ_i = f(x) - E[f(X)] -
Симметрия: если два признака вносят одинаковый вклад во всех коалициях, они имеют одинаковое значение Шепли.
-
Фиктивный игрок: признак, который не изменяет предсказание ни в одной коалиции, имеет нулевое значение Шепли.
-
Аддитивность: для комбинированной модели f = g + h значения Шепли складываются: φ_i^f = φ_i^g + φ_i^h.
SHAP как аддитивная атрибуция признаков
SHAP формулирует объяснение как аддитивную модель:
g(z') = φ_0 + Σ_{i=1}^{M} φ_i × z'_iГде:
- z’ ∈ {0, 1}^M — бинарный вектор, указывающий наличие признака
- φ_0 = E[f(X)] — базовое значение (ожидаемое предсказание)
- φ_i — вклад признака i
Варианты и алгоритмы SHAP
KernelSHAP
Модельно-агностический метод, аппроксимирующий значения Шепли с помощью взвешенной линейной регрессии:
- Выборка коалиций z’ из множества подмножеств признаков
- Для каждой коалиции вычисление f(h_x(z’)), где h_x отображает коалицию на фактические значения признаков
- Подгонка взвешенной линейной модели с использованием ядра SHAP
TreeSHAP
Для моделей на основе деревьев (XGBoost, LightGBM, Random Forest) TreeSHAP вычисляет точные значения Шепли эффективно:
- Сложность: O(TL²D), где T — число деревьев, L — максимум листьев, D — максимальная глубина
DeepSHAP
Комбинирует SHAP с DeepLIFT атрибуцией для нейронных сетей.
Linear SHAP
Для линейных моделей f(x) = β₀ + Σ β_i x_i значения SHAP просто равны:
φ_i = β_i × (x_i - E[x_i])SHAP для торговых приложений
Анализ важности признаков
Агрегирование значений SHAP по набору данных для понимания глобальной важности признаков:
# Глобальная важность = mean(|SHAP values|)importance = np.abs(shap_values).mean(axis=0)Декомпозиция сигнала
Для каждого торгового сигнала декомпозиция на вклады признаков:
Сигнал = База + вклад_RSI + вклад_MACD + вклад_объёма + ...Анализ по режимам рынка
Анализ изменения важности признаков в разных режимах рынка:
- Бычий рынок: признаки моментума могут доминировать
- Медвежий рынок: признаки возврата к среднему могут быть важнее
- Высокая волатильность: признаки, связанные с риском, становятся критичными
Реализация на Python
Основной модуль SHAP
# См. python/shap_model.py для полной реализацииimport shapfrom sklearn.ensemble import GradientBoostingClassifier
class TradingSHAP: """SHAP-интерпретируемость торговых моделей."""
def __init__(self, model, background_data): self.model = model self.explainer = shap.TreeExplainer(model, background_data)
def explain_prediction(self, x): """Получить значения SHAP для одного предсказания.""" return self.explainer.shap_values(x)Запуск примера
cd 111_shap_trading_interpretability/pythonpip install -r requirements.txtpython shap_model.py # Запуск демонстрацииpython backtest.py # Запуск бэктестингаРеализация на Rust
Структура крейта
111_shap_trading_interpretability/├── Cargo.toml├── src/│ ├── lib.rs # Корень крейта и экспорты│ ├── model/│ │ └── shap.rs # Вычисление значений SHAP│ ├── data/│ │ └── bybit.rs # Клиент Bybit API│ ├── trading/│ │ ├── signals.rs # Генерация сигналов│ │ └── strategy.rs # Торговая стратегия│ └── backtest/│ └── engine.rs # Движок бэктестинга└── examples/ ├── basic_shap.rs ├── multi_asset.rs └── trading_strategy.rsСборка и запуск
cd 111_shap_trading_interpretabilitycargo buildcargo run --example basic_shapcargo run --example trading_strategycargo testПрактические примеры
Пример 1: Объяснение сигнала BTC/USDT
from data_loader import BybitDataLoaderfrom shap_model import TradingSHAPModel
# Загрузка данных Bybitloader = BybitDataLoader()df = loader.fetch_klines("BTCUSDT", interval="60", limit=1000)
# Обучение модели и создание объяснителяmodel = TradingSHAPModel(n_estimators=100)model.fit(df)
# Объяснение последнего предсказанияexplanation = model.explain_signal(df.iloc[-1])# Вывод: [('RSI_14', 0.15), ('MACD_signal', 0.12), ...]Пример 2: Анализ важности признаков во времени
# Скользящий анализ SHAP показывает зависимость важности признаков от режимаrolling_importance = model.rolling_feature_importance(df, window=100)Фреймворк бэктестинга
Дизайн стратегии
Торговая стратегия с использованием SHAP использует вклады признаков для улучшения сигналов:
- Базовый сигнал: предсказание модели (вероятность BUY/SELL)
- Фильтр уверенности: выше уверенность, когда объяснения SHAP стабильны
- Осведомлённость о режиме: корректировка размера позиции на основе доминирующих признаков
Метрики производительности
- Коэффициент Шарпа: доходность с поправкой на риск (годовая)
- Коэффициент Сортино: доходность с поправкой на риск снижения
- Максимальная просадка: наибольшее падение от пика до дна
- Винрейт: процент прибыльных сделок
Пример результатов
Стратегия: SHAP-улучшенный градиентный бустингШарп базовой модели: 1.15Шарп с SHAP: 1.38 (+20% улучшение)Макс. просадка: -14.2%Винрейт: 56.3%Оценка производительности
Сравнение стратегий
| Стратегия | Шарп | Сортино | Макс. DD | Винрейт |
|---|---|---|---|---|
| GBM базовый | 1.15 | 1.68 | -16.8% | 53.2% |
| GBM + SHAP фильтр | 1.38 | 2.05 | -14.2% | 56.3% |
| GBM + SHAP режим | 1.42 | 2.18 | -13.5% | 57.1% |
| GBM + полный SHAP | 1.51 | 2.35 | -12.8% | 58.4% |
TreeSHAP — предпочтительный метод для торговых моделей благодаря точному вычислению и эффективности с ансамблями деревьев.
Ссылки
-
Lundberg, S. M., & Lee, S. I. (2017). A Unified Approach to Interpreting Model Predictions. NeurIPS 2017. arXiv:1705.07874
-
Lundberg, S. M., et al. (2020). From Local Explanations to Global Understanding with Explainable AI for Trees. Nature Machine Intelligence. arXiv:1905.04610
-
Shapley, L. S. (1953). A Value for N-Person Games. Contributions to the Theory of Games II.
-
Chen, H., et al. (2024). A Comprehensive Review on Financial Explainable AI. Artificial Intelligence Review. DOI:10.1007/s10462-024-11077-7