# Tutorial: RSI zones (Пример 5) — смена стратегии детекции ## 🎯 Цели - Реализовать pipeline из Примера 5: RSI через talib (см. документацию) - Показать, как переключаться между `threshold` и `line_crossing` без пересчёта индикатора - Сравнить контекст и распределение зон после смены стратегии ## 🔧 Предварительные требования - `pip install bquant talib-binary` (или установленный TA-Lib) - Набор данных с колонками OHLCV (используем sample `tv_xauusd_1h`) - Понимание логики порогов RSI ## 📥 Подготовка данных ```python from bquant.data.samples import get_sample_data df = get_sample_data('tv_xauusd_1h') ``` ## 🛠️ Шаг 1. Базовый threshold-подход Следуем конфигурации из Примера 5: рассчитываем RSI через `talib` и применяем стратегию `threshold` с уровнями 70/30. ```python from bquant.analysis.zones import analyze_zones rsi_threshold = ( analyze_zones(df) .with_indicator('talib', 'rsi', timeperiod=14) .detect_zones('threshold', indicator_col='RSI', upper_threshold=70, lower_threshold=30) .analyze(clustering=True) .build() ) print(f"Threshold zones: {len(rsi_threshold.zones)}") print(rsi_threshold.statistics['zone_distribution']) ``` ## ♻️ Шаг 2. Переключение стратегии без пересчёта индикатора `ZoneAnalysisResult` возвращает DataFrame с уже рассчитанным RSI в поле `data`. Сохраним его и построим сигнал для сравнения линий. ```python # Извлекаем DataFrame с RSI (он уже содержит колонку 'RSI') rsi_data = rsi_threshold.data.copy() rsi_data['RSI_signal'] = rsi_data['RSI'].rolling(5, min_periods=1).mean() ``` Теперь перезапускаем pipeline только со стадией детекции, используя `line_crossing`. Эта стратегия сопоставляет RSI и его сглаженную версию и позволяет обнаруживать смены тренда. ```python rsi_line = ( analyze_zones(rsi_data) .detect_zones('line_crossing', line1_col='RSI', line2_col='RSI_signal', min_duration=3) .analyze(clustering=True) .build() ) print(f"Line-crossing zones: {len(rsi_line.zones)}") first_ctx = rsi_line.zones[0].indicator_context print(first_ctx['detection_strategy']) # 'line_crossing' print(first_ctx['signal_line']) # 'RSI_signal' ``` ### Сравнение результатов ```python print("Threshold win-rate:", rsi_threshold.statistics.get('win_rate')) print("Line crossing win-rate:", rsi_line.statistics.get('win_rate')) ``` ## 📊 Визуализация смены стратегии Для быстрой проверки используем встроенную визуализацию. ```python # Threshold контекст threshold_fig = rsi_threshold.visualize('overview', title='RSI Threshold Zones') threshold_fig.show() # Line crossing контекст line_fig = rsi_line.visualize('overview', title='RSI Line Crossing Zones') line_fig.show() ``` > 💡 При необходимости можно вызвать `visualize('detail', zone_id=...)`, чтобы сравнить структуру конкретной зоны до и после смены стратегии. ## ✅ Лучшие практики 1. **Переиспользуйте данные** — работайте с `result.data`, чтобы не пересчитывать индикаторы при экспериментировании со стратегиями. 2. **Логируйте контекст** — сохраняйте `zone.indicator_context` в отчёты, чтобы понимать, какие правила сработали в каждом запуске. 3. **Подбор параметров** — используйте разные окна для `RSI_signal` (3–7 баров), чтобы регулировать чувствительность `line_crossing`. 4. **Комбинируйте стратегии** — начните с `threshold`, чтобы отфильтровать экстремумы, затем запускайте `line_crossing` для уточнения точек выхода. ## 🚀 Что дальше - Добавьте `CombinedRulesDetection` с дополнительным условием по объёму. - Подготовьте backtest: сохраните `rsi_line.zones` и прогоните через торговый симулятор. - Изучите `examples/02a_universal_zones.py` для дополнительных сценариев работы с RSI.