# bquant.analysis.zones.strategies — паттерн Strategy > **✅ v2.1 - Универсальные стратегии** > > Все аналитические стратегии теперь работают с **ЛЮБЫМ индикатором**! > > **Что изменилось:** > - Все стратегии принимают явный параметр `indicator_col` > - `VolumeMetrics.volume_macd_corr` → `volume_indicator_corr` (универсальное именование) > - Сигнатуры протоколов обновлены для универсальности > > **Примеры:** Каждая стратегия теперь показывает использование с MACD, RSI, AO и пользовательскими индикаторами > > **Подтверждено:** Работает с FICTIONAL_INDICATOR_99 и 10+ реальными индикаторами (100% покрытие тестами) > > **Стабильность API:** 🟢 STABLE - этот API не изменится после универсализации > 📘 Для разработчиков: см. [Zone Detection Strategies — Developer Guide](../../developer_guide/zone_detection_strategies.md) > для пошаговой инструкции по созданию собственных стратегий детекции зон. ## Обзор BQuant использует **Strategy Pattern** для расширяемого расчета метрик зон. Это позволяет: - Добавлять новые алгоритмы анализа без изменения основного кода - Переключаться между алгоритмами через конфигурацию - A/B тестировать разные подходы - Комбинировать несколько стратегий одновременно ## Архитектура ``` ZoneFeaturesAnalyzer ├── SwingStrategy → SwingMetrics (23 поля) ├── ShapeStrategy → ShapeMetrics (3 поля) ├── DivergenceStrategy → DivergenceMetrics (4 поля) ├── VolatilityStrategy → VolatilityMetrics (10 полей) └── VolumeStrategy → VolumeMetrics (4 поля) ``` Каждая стратегия: 1. Реализует протокол (`Protocol`) 2. Возвращает типизированный результат (`Dataclass`) 3. Регистрируется в `StrategyRegistry` 4. Создается через фабрику из `config.py` --- ## Protocols и Dataclasses ### SwingCalculationStrategy Protocol ```python class SwingCalculationStrategy(Protocol): def calculate_swing(self, data: pd.DataFrame) -> SwingMetrics: ... def get_name(self) -> str: ... def get_metadata(self) -> dict: ... ``` ### SwingMetrics Dataclass (23 поля) Полный результат анализа свингов в зоне. **Категории метрик:** #### Базовые (6 полей) - `num_swings`: Количество свингов (пар impulse+correction) - `avg_rally_pct`: Средняя амплитуда ралли (%) - `avg_drop_pct`: Средняя амплитуда откатов (%) - `max_rally_pct`: Максимальная амплитуда ралли (%) - `max_drop_pct`: Максимальная амплитуда откатов (%) - `rally_to_drop_ratio`: Отношение среднего ралли к среднему откату #### Счетчики (2 поля) - `rally_count`: Количество восходящих движений - `drop_count`: Количество нисходящих движений #### Минимумы и распределение (6 полей) - `min_rally_pct`: Минимальная амплитуда ралли (%) - `min_drop_pct`: Минимальная амплитуда откатов (%) - `rally_amplitude_std`: Стандартное отклонение амплитуд ралли - `drop_amplitude_std`: Стандартное отклонение амплитуд откатов - `rally_amplitude_median`: Медиана амплитуд ралли (%) - `drop_amplitude_median`: Медиана амплитуд откатов (%) #### Длительность в барах (4 поля) - `avg_rally_duration_bars`: Средняя длительность ралли (бары) - `avg_drop_duration_bars`: Средняя длительность откатов (бары) - `max_rally_duration_bars`: Максимальная длительность ралли (бары) - `max_drop_duration_bars`: Максимальная длительность откатов (бары) #### Скорость движения (4 поля) - `avg_rally_speed_pct_per_bar`: Средняя скорость ралли (% за бар) - `avg_drop_speed_pct_per_bar`: Средняя скорость откатов (% за бар) - `max_rally_speed_pct_per_bar`: Максимальная скорость ралли (% за бар) - `max_drop_speed_pct_per_bar`: Максимальная скорость откатов (% за бар) #### Симметрия (1 поле) - `duration_symmetry`: Отношение средней длительности ралли к откатам #### Метаданные - `strategy_name`: Имя использованной стратегии - `strategy_params`: Параметры стратегии **Интерпретация:** - `rally_to_drop_ratio > 2`: Сильные импульсы, слабые коррекции - `duration_symmetry > 1.5`: Импульсы длиннее коррекций - Высокое значение `*_speed`: Быстрые резкие движения - Низкое значение `*_std`: Однородные свинги --- ### ShapeCalculationStrategy Protocol ```python class ShapeCalculationStrategy(Protocol): def calculate(self, data: pd.DataFrame, indicator_col: Optional[str] = None) -> ShapeMetrics: ... # ^^^^^^^^^^^^^^^^^^^^^^^^ # v2.1: Required for universal usage def get_name(self) -> str: ... def get_metadata(self) -> dict: ... ``` **Универсальное использование v2.1:** Параметр `indicator_col` **обязателен** для универсального использования с любым осциллятором. **Примеры:** ```python from bquant.analysis.zones.strategies.shape import StatisticalShapeStrategy strategy = StatisticalShapeStrategy() # MACD shape = strategy.calculate(zone_data, indicator_col='macd_hist') # RSI shape = strategy.calculate(zone_data, indicator_col='RSI_14') # Awesome Oscillator shape = strategy.calculate(zone_data, indicator_col='AO_5_34') # CCI shape = strategy.calculate(zone_data, indicator_col='CCI_20') # Custom indicator shape = strategy.calculate(zone_data, indicator_col='MY_CUSTOM_OSC') ``` **Все возвращают одну и ту же структуру ShapeMetrics:** - `hist_skewness`: Асимметрия распределения - `hist_kurtosis`: Острота пика - `hist_smoothness`: Согласованность изменений ### ShapeMetrics Dataclass (3 поля) Характеристики формы гистограммы индикатора. - `hist_skewness`: Асимметрия распределения - `hist_kurtosis`: Эксцесс (острота пика) - `hist_smoothness`: Гладкость изменения значений **Интерпретация:** - **Skewness > 0:** Правосторонняя асимметрия (больше положительных значений) - **Skewness < 0:** Левосторонняя асимметрия (больше отрицательных значений) - **Kurtosis > 3:** Острый пик (лептокуртический) - **Kurtosis < 3:** Плоское распределение (платикуртический) - **Smoothness высокая:** Плавное изменение индикатора - **Smoothness низкая:** Резкие скачки индикатора --- ### DivergenceCalculationStrategy Protocol ```python class DivergenceCalculationStrategy(Protocol): def calculate_divergence(self, data: pd.DataFrame, indicator_col: Optional[str] = None, indicator_line_col: Optional[str] = None) -> DivergenceMetrics: ... # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ # v2.1: Support for 2-line indicators (MACD line + signal) def get_name(self) -> str: ... def get_metadata(self) -> dict: ... ``` **Универсальные примеры v2.1:** ```python from bquant.analysis.zones.strategies.divergence import ClassicDivergenceStrategy strategy = ClassicDivergenceStrategy() # RSI divergence div = strategy.calculate_divergence(data, indicator_col='RSI_14') # MACD histogram divergence div = strategy.calculate_divergence(data, indicator_col='macd_hist') # MACD with signal line (2-line divergence) div = strategy.calculate_divergence(data, indicator_col='macd', indicator_line_col='macd_signal') # Awesome Oscillator divergence div = strategy.calculate_divergence(data, indicator_col='AO_5_34') ``` ### DivergenceMetrics Dataclass (4 поля) Информация о дивергенциях между ценой и индикатором. - `divergence_type`: Тип ('regular_bullish', 'regular_bearish', 'hidden_bullish', 'hidden_bearish', None) - `divergence_count`: Количество обнаруженных дивергенций - `divergence_strength`: Сила дивергенции (0.0-1.0) - `divergence_direction`: Направление дивергенции (+1, -1, 0) **Интерпретация:** - **Regular bullish:** Цена формирует более низкий минимум (lower low), индикатор — более высокий минимум (higher low) → потенциальный разворот вверх - **Regular bearish:** Цена формирует более высокий максимум (higher high), индикатор — более низкий максимум (lower high) → потенциальный разворот вниз - **Strength > 0.7:** Сильная дивергенция - **Strength < 0.3:** Слабая дивергенция --- ### VolatilityCalculationStrategy Protocol ```python class VolatilityCalculationStrategy(Protocol): def calculate_volatility(self, data: pd.DataFrame) -> VolatilityMetrics: ... def get_name(self) -> str: ... def get_metadata(self) -> dict: ... ``` ### VolatilityMetrics Dataclass (10 полей) Оценка волатильности в зоне через Bollinger Bands и ATR. **Bollinger Bands метрики (5):** - `bollinger_width_pct`: Ширина полос (% от цены) - `bollinger_width_std`: Ширина в стандартных отклонениях - `bollinger_squeeze_ratio`: Отношение текущей ширины к средней - `bollinger_upper_touches`: Количество касаний верхней полосы - `bollinger_lower_touches`: Количество касаний нижней полосы **ATR метрики (3):** - `atr_normalized_range`: Диапазон зоны нормализованный на ATR - `atr_trend`: Тренд ATR в зоне (-1: падает, 0: стабилен, +1: растет) - `avg_atr`: Средний ATR в зоне **Композитные метрики (2):** - `volatility_score`: Комплексный скор 0-10 (weighted avg) - `volatility_regime`: Классификация ('low', 'medium', 'high', 'extreme') **Интерпретация volatility_score:** - **0-3:** Low volatility - спокойный рынок - **3-6:** Medium volatility - нормальный рынок - **6-8:** High volatility - повышенная волатильность - **8-10:** Extreme volatility - экстремальная волатильность --- ### VolumeCalculationStrategy Protocol ```python class VolumeCalculationStrategy(Protocol): def calculate_volume(self, data: pd.DataFrame, baseline_volume: Optional[float] = None) -> VolumeMetrics: ... def get_name(self) -> str: ... def get_metadata(self) -> dict: ... ``` ### VolumeMetrics Dataclass (4 поля) Анализ объемов торгов в зоне (v2.1: универсальный для ЛЮБОГО индикатора). - `volume_zone_ratio`: Отношение среднего объема зоны к baseline - `volume_at_entry_change`: Изменение объема при входе в зону (%) - `volume_indicator_corr`: Корреляция объема с индикатором ✨ **v2.1: переименовано из volume_macd_corr** - `avg_volume_zone`: Средний объем в зоне **Интерпретация:** - `volume_zone_ratio > 1.5`: Высокий объем - сильное движение - `volume_zone_ratio < 0.7`: Низкий объем - слабое движение - `volume_indicator_corr > 0.7`: Объем подтверждает индикатор ✨ **v2.1: универсальный** - `volume_at_entry_change > 0.5`: Объем растет при входе — подтверждение **Универсальные примеры v2.1:** ```python from bquant.analysis.zones.strategies.volume import StandardVolumeStrategy strategy = StandardVolumeStrategy() # MACD correlation vol = strategy.calculate_volume(zone_data, baseline_volume=1000, indicator_col='macd_hist') # RSI correlation vol = strategy.calculate_volume(zone_data, baseline_volume=1000, indicator_col='RSI_14') # AO correlation vol = strategy.calculate_volume(zone_data, baseline_volume=1000, indicator_col='AO_5_34') # Access universal field print(f"Volume-Indicator correlation: {vol.volume_indicator_corr:.2f}") ``` --- ## StrategyRegistry Централизованный реестр всех стратегий. ### Регистрация стратегий ```python from bquant.analysis.zones.strategies.registry import StrategyRegistry # Register swing strategy @StrategyRegistry.register_swing_strategy('my_strategy') class MySwingStrategy: pass # Manual registration StrategyRegistry.register_swing_strategy('another', AnotherStrategy) ``` ### Получение стратегий ```python # Get strategy class StrategyClass = StrategyRegistry.get_swing_strategy('zigzag') # Create instance strategy = StrategyClass(legs=10, deviation=0.05) # List all available print(StrategyRegistry.list_swing_strategies()) # ['zigzag', 'find_peaks', 'pivot_points'] ``` ### Статистика реестра ```python stats = StrategyRegistry.get_registry_stats() print(f"Total strategies: {stats['total']}") print(f"By type: {stats['by_type']}") # {'swing': 3, 'shape': 1, 'divergence': 1, 'volatility': 1, 'volume': 1} ``` --- ## Реализованные стратегии ### Стратегии свингов #### ZigZagSwingStrategy **Алгоритм:** Использует индикатор pandas-ta ZigZag для обнаружения значимых разворотов цены. **Параметры:** - `legs` (по умолчанию: 10): Количество баров для анализа назад/вперед - `deviation` (по умолчанию: 0.05): Минимальное изменение цены 5% для формирования новой ноги **Когда применять:** - ✅ Плавные трендовые рынки - ✅ Старшие таймфреймы (H4, D1) - ✅ Необходимо отфильтровать шум **Пример:** ```python from bquant.analysis.zones import ZoneFeaturesAnalyzer analyzer = ZoneFeaturesAnalyzer(swing_strategy='zigzag') # Or with custom parameters from bquant.core.config import create_swing_strategy strategy = create_swing_strategy('zigzag', legs=15, deviation=0.03) analyzer = ZoneFeaturesAnalyzer(swing_strategy=strategy) ``` **Фокус метрик:** Более крупные и значимые свинги --- #### FindPeaksSwingStrategy **Алгоритм:** Использует scipy.signal.find_peaks для обнаружения всех локальных экстремумов. **Параметры:** - `prominence` (по умолчанию: 0.02): Минимальная выраженность 2% для пика - `distance` (по умолчанию: 3): Минимум 3 бара между пиками **Когда применять:** - ✅ Рынки во флэте/волатильные диапазоны - ✅ Нужно находить все локальные экстремумы - ✅ Младшие таймфреймы (M15, H1) - ✅ Детальный анализ свингов **Пример:** ```python analyzer = ZoneFeaturesAnalyzer(swing_strategy='find_peaks') # Custom parameters strategy = create_swing_strategy('find_peaks', prominence=0.01, distance=5) ``` **Фокус метрик:** Более многочисленные, но меньшие свинги --- #### PivotPointsSwingStrategy **Алгоритм:** Классический N-барный паттерн — максимум/минимум, являющийся наивысшим/наименьшим среди N баров слева и справа. **Параметры:** - `left_bars` (по умолчанию: 5): Количество баров слева от пивота - `right_bars` (по умолчанию: 5): Количество баров справа от пивота **Когда применять:** - ✅ Классический подход технического анализа - ✅ Требуются четко определенные пивоты - ✅ Любой таймфрейм - ✅ Консервативное определение свингов **Пример:** ```python analyzer = ZoneFeaturesAnalyzer(swing_strategy='pivot_points') # Asymmetric window strategy = create_swing_strategy('pivot_points', left_bars=7, right_bars=3) ``` **Фокус метрик:** Подтвержденные, проверенные свинги --- ### Стратегии формы #### StatisticalShapeStrategy **Алгоритм:** Статистический анализ формы гистограммы индикатора с использованием scipy.stats. **Параметры:** Нет (используются статистические моменты) **Рассчитываемые метрики:** - `hist_skewness`: Коэффициент асимметрии (scipy.stats.skew) - `hist_kurtosis`: Куртозис (scipy.stats.kurtosis) - `hist_smoothness`: Гладкость (обратная дисперсии изменений) **Когда применять:** - ✅ Понять характеристики распределения - ✅ Выявить взрывные vs плавные зоны - ✅ Кластеризовать зоны по форме - ✅ Любой индикатор с гистограммой **Пример:** ```python analyzer = ZoneFeaturesAnalyzer(shape_strategy='statistical') features = analyzer.extract_zone_features(zone_dict) shape = features.metadata['shape_metrics'] print(f"Skewness: {shape.hist_skewness:.2f}") print(f"Kurtosis: {shape.hist_kurtosis:.2f}") print(f"Smoothness: {shape.hist_smoothness:.2f}") ``` **Интерпретация:** - Положительная асимметрия + высокий куртозис → Взрывные движения - Отрицательная асимметрия + низкий куртозис → Плавное снижение - Высокая гладкость → Устойчивый тренд - Низкая гладкость → Рваное движение --- ### Стратегии дивергенций #### ClassicDivergenceStrategy **Алгоритм:** Обнаруживает обычные бычьи/медвежьи дивергенции через детекцию пиков. **Параметры:** - `use_macd_line` (по умолчанию: False): Использовать линию MACD вместо гистограммы **Типы дивергенций:** - **Regular Bullish:** Цена формирует lower low, индикатор — higher low - **Regular Bearish:** Цена формирует higher high, индикатор — lower high **Когда применять:** - ✅ Потенциальные точки разворота - ✅ Подтверждение сигналов на вход - ✅ Генерация сигналов на выход - ✅ Работает с любым осциллятором **Пример:** ```python analyzer = ZoneFeaturesAnalyzer(divergence_strategy='classic') features = analyzer.extract_zone_features(zone_dict) div = features.metadata['divergence_metrics'] if div.divergence_count > 0: print(f"Divergence detected: {div.divergence_type}") print(f"Strength: {div.divergence_strength:.2f}") print(f"Count: {div.divergence_count}") ``` **Расчет силы:** - Основан на вертикальном расстоянии между пиками - Нормализованная корреляция между пиками цены и индикатора - Диапазон: 0.0 (слабая) до 1.0 (сильная) **Применение в торговле:** - Фильтрация входов: принимать сигналы только при `divergence_strength > 0.5` - Размер позиции: увеличивать для более сильных дивергенций - Установка стопов: ориентироваться на `divergence_direction` --- ### Стратегии волатильности #### CombinedVolatilityStrategy **Алгоритм:** Комбинированная оценка через Bollinger Bands и ATR. **Параметры:** - `bb_window` (по умолчанию: 20): Окно для полос Боллинджера - `bb_std` (по умолчанию: 2): Количество стандартных отклонений - `atr_window` (по умолчанию: 14): Окно ATR - `atr_multiplier` (по умолчанию: 1.0): Множитель ATR для диапазона **Компоненты:** **Bollinger Bands:** - Метрики ширины: насколько широкие/узкие полосы - Обнаружение сжатия: полосы сужаются - Подсчет касаний: цена тестирует полосы **ATR:** - Нормализованный диапазон: диапазон зоны относительно типичного - Тренд ATR: волатильность растет/снижается - Постепенная деградация: оценки через True Range при отсутствии колонки ATR **Показатель волатильности (0-10):** Взвешенная комбинация: - 40%: перцентиль ширины полос Боллинджера - 30%: тренд ATR - 30%: коэффициент сжатия **Классификация режимов:** - **Low (0-3):** Консолидация, торговля в диапазоне - **Medium (3-6):** Нормальная волатильность, стандартные стратегии - **High (6-8):** Повышенный риск, меньшие позиции - **Extreme (8-10):** Кризисный режим, минимальная экспозиция **Пример:** ```python analyzer = ZoneFeaturesAnalyzer(volatility_strategy='combined') features = analyzer.extract_zone_features(zone_dict) vol = features.metadata['volatility_metrics'] print(f"Volatility score: {vol.volatility_score:.1f}/10") print(f"Regime: {vol.volatility_regime}") print(f"Bollinger width: {vol.bollinger_width_pct:.2%}") print(f"Upper touches: {vol.bollinger_upper_touches}") # Adaptive position sizing if vol.volatility_regime == 'low': position_size = 2.0 # Larger position elif vol.volatility_regime == 'medium': position_size = 1.0 # Normal elif vol.volatility_regime == 'high': position_size = 0.5 # Smaller else: # extreme position_size = 0.25 # Minimal ``` --- ### Стратегии объема #### StandardVolumeStrategy **Алгоритм:** Стандартный анализ объема с сопоставлением с базовым значением. **Параметры:** - `baseline_volume` (опционально): Эталонный объем для сравнения **Метрики:** - `volume_zone_ratio`: Объем зоны / базовый объем - `volume_at_entry_change`: Изменение объема при входе в зону (%) - `volume_indicator_corr`: Корреляция между объемом и индикатором ✨ **v2.1: универсальный** - `avg_volume_zone`: Средний объем в зоне **Постепенная деградация:** - Работает без baseline (ratio = None) - Работает без колонки объема (все метрики = None) - Не падает при отсутствии данных **Когда применять:** - ✅ Подтверждать силу сигнала - ✅ Определять накопление/распределение - ✅ Дивергенции объема и цены - ✅ Любой рынок с объемами **Пример:** ```python # Without baseline analyzer = ZoneFeaturesAnalyzer(volume_strategy='standard') # With baseline (e.g., overall average) overall_avg_volume = data['volume'].mean() strategy = create_volume_strategy('standard') analyzer = ZoneFeaturesAnalyzer(volume_strategy=strategy) features = analyzer.extract_zone_features(zone_dict) vol = features.metadata.get('volume_metrics') if vol: print(f"Volume ratio: {vol.volume_zone_ratio:.2f}") print(f"Volume-Indicator correlation: {vol.volume_indicator_corr:.2f}") # v2.1: universal # Trading decision if vol.volume_zone_ratio > 1.5 and vol.volume_indicator_corr > 0.6: print("✅ Strong volume confirmation") ``` --- ## Примеры использования ### Базовый: использование Universal Pipeline v2.1 ```python from bquant.analysis.zones import analyze_zones # Universal Pipeline with strategies result = ( analyze_zones(df) .with_indicator('custom', 'macd', fast_period=12, slow_period=26, signal_period=9) .detect_zones('zero_crossing', indicator_col='macd_hist') .with_strategies(swing='zigzag', volatility='combined') .analyze(clustering=True) .build() ) # Access metrics from first zone zone = result.zones[0] if zone.features: print(f"Duration: {zone.features.get('duration', 'N/A')}") print(f"Swings: {zone.features.get('num_swings', 0)}") print(f"Volatility: {zone.features.get('volatility_regime', 'unknown')}") ``` ### Продвинутый: переключение стратегий в Universal Pipeline ```python from bquant.analysis.zones import analyze_zones # Try different swing strategies with Universal Pipeline strategies = ['zigzag', 'find_peaks', 'pivot_points'] for strategy_name in strategies: result = ( analyze_zones(df) .with_indicator('custom', 'macd', fast_period=12, slow_period=26, signal_period=9) .detect_zones('zero_crossing', indicator_col='macd_hist') .with_strategies(swing=strategy_name) .analyze(clustering=True) .build() ) if result.zones and result.zones[0].features: features = result.zones[0].features print(f"\n{strategy_name}:") print(f" Swings: {features.get('num_swings', 0)}") print(f" Avg rally: {features.get('avg_rally_pct', 0):.2%}") ``` ### Экспертный: A/B-тестирование стратегий в Universal Pipeline ```python import pandas as pd from bquant.analysis.zones import analyze_zones # Test all swing strategies on multiple zones using Universal Pipeline results = [] # Get base result for zone iteration base_result = ( analyze_zones(df) .with_indicator('custom', 'macd', fast_period=12, slow_period=26, signal_period=9) .detect_zones('zero_crossing', indicator_col='macd_hist') .analyze(clustering=True) .build() ) for zone in base_result.zones[:10]: # First 10 zones for strategy_name in ['zigzag', 'find_peaks', 'pivot_points']: # Re-analyze with specific strategy result = ( analyze_zones(df) .with_indicator('custom', 'macd', fast_period=12, slow_period=26, signal_period=9) .detect_zones('zero_crossing', indicator_col='macd_hist') .with_strategies(swing=strategy_name) .analyze(clustering=True) .build() ) # Find matching zone by time range matching_zone = None for z in result.zones: if (z.start_time == zone.start_time and z.end_time == zone.end_time): matching_zone = z break if matching_zone and matching_zone.features: results.append({ 'zone_id': zone.zone_id, 'strategy': strategy_name, 'num_swings': matching_zone.features.get('num_swings', 0), 'avg_rally': matching_zone.features.get('avg_rally_pct', 0), 'rally_count': matching_zone.features.get('rally_count', 0) }) # Analyze results df_results = pd.DataFrame(results) summary = df_results.groupby('strategy').agg({ 'num_swings': 'mean', 'avg_rally': 'mean', 'rally_count': 'mean' }) print(summary) # Choose best strategy for your needs # - ZigZag: fewer, larger swings # - FindPeaks: more, smaller swings # - PivotPoints: balanced, validated swings ``` ### Пользовательский: создание и использование собственной стратегии ```python # 1. Create strategy @StrategyRegistry.register_swing_strategy('threshold_based') class ThresholdSwingStrategy: def __init__(self, threshold=0.02): self.threshold = threshold def calculate_swing(self, data): # Your algorithm return SwingMetrics(...) def get_name(self): return 'ThresholdBased' def get_metadata(self): return {'threshold': self.threshold} # 2. Use it analyzer = ZoneFeaturesAnalyzer(swing_strategy='threshold_based') # 3. Or with custom parameters strategy = ThresholdSwingStrategy(threshold=0.03) analyzer = ZoneFeaturesAnalyzer(swing_strategy=strategy) ``` ### Комбинация нескольких стратегий в Universal Pipeline ```python # Use different strategies for different purposes with Universal Pipeline result = ( analyze_zones(df) .with_indicator('custom', 'macd', fast_period=12, slow_period=26, signal_period=9) .detect_zones('zero_crossing', indicator_col='macd_hist') .with_strategies( swing='zigzag', # For trend analysis shape='statistical', # For clustering divergence='classic', # For entries volatility='combined', # For position sizing volume='standard' # For confirmation ) .analyze(clustering=True) .build() ) # All strategies' results in zone.features zone = result.zones[0] if zone.features: print(f"Swing metrics: {zone.features.get('num_swings', 0)} swings") print(f"Shape metrics: {zone.features.get('hist_skewness', 0):.2f} skewness") print(f"Divergence: {zone.features.get('has_classic_divergence', False)}") print(f"Volatility: {zone.features.get('volatility_regime', 'unknown')}") print(f"Volume: {zone.features.get('volume_indicator_corr', 0):.2f} correlation") ``` --- ## Сравнительная таблица стратегий | Стратегия | Скорость | Детализация | Шум | Лучшее применение | |-----------|----------|------------|-----|-------------------| | **ZigZag** | Medium | Low | Low | Тренды, старшие ТФ | | **FindPeaks** | Fast | High | High | Волатильные рынки, все экстремумы | | **PivotPoints** | Medium | Medium | Low | Классический ТА | | **Statistical** | Fast | N/A | N/A | Анализ формы | | **Classic** | Medium | N/A | N/A | Дивергенции | | **Combined** | Medium | High | N/A | Волатильность | | **Standard** | Fast | Medium | N/A | Объем | --- ## 🔗 Связанные разделы ### 📚 Core API - **[Universal Pipeline](pipeline.md)** - Полная документация Universal Pipeline v2.1 - **[Zone Features](zones.md)** - Универсальный API для анализа зон - **[Statistical Analysis](statistical.md)** - Проверки гипотез и статистика - **[Quick Start](../../user_guide/quick_start.md)** - Быстрый старт с Universal Pipeline ### 🎯 Learning Path - **[Examples](../../examples/README.md)** - Готовые примеры использования - **[Deep Dive Tutorial](../../research/notebooks/03_zones_universal.py)** - Подробный разбор - **[Advanced Features](../../research/notebooks/03_analysis_new_features.py)** - Свинги, дивергенции, регрессия - **[Migration Guide](../../examples/02_macd_zone_analysis.py)** - Переход с legacy API ### 🏗️ Developer Resources - **[Architecture Patterns](../../developer_guide/README.md)** - Паттерны проектирования, точки расширения - **[Testing Framework](../../tests/integration/)** - Интеграционные тесты, обратная совместимость - **[Visualization](../../api/visualization/README.md)** - Визуализация зон, статистические графики - **[Indicators](../../api/indicators/README.md)** - IndicatorFactory, пользовательские индикаторы ### 🔧 Technical Resources - **Implementations:** `bquant/analysis/zones/strategies/` - **Tests:** `tests/unit/test_*_strategy.py` - **Technical docs:** `devref/gaps/swing_detection_approaches.md`