Результаты анализа свинг-метрик MACD зон

Итоговая сводка работы с пакетом BQuant

Дата: 2025-10-28


🎯 Цель анализа

Проверить “профпригодность” индикатора MACD (12,26,9) через анализ свинг-метрик ВНУТРИ зон:

  • Есть ли достаточные колебания для торговли?

  • “Дает ли море” - можно ли заработать на внутренних rally/drop?

  • Есть ли асимметрия (rally > drop в bull зонах)?

Ключевая идея: Не просто анализировать “от начала до конца зоны”, а исследовать колебания внутри зон используя ZigZag индикатор.


🔧 Что использовано из пакета BQuant

✅ Успешно использованные компоненты:

  1. ZoneDetection: zero_crossing стратегия

    • Детекция bull/bear зон по пересечению MACD histogram нуля

    • 79 зон найдено (40 bull, 39 bear)

  2. SwingStrategy: zigzag (pandas_ta ZigZag)

    • 23 поля метрик (SwingMetrics dataclass)

    • Автоматический расчет rally/drop амплитуд, длительностей, скоростей

    • Сохранение в zone.features['metadata']['swing_metrics']

  3. ShapeStrategy: statistical

    • Skewness, Kurtosis гистограммы

  4. DivergenceStrategy: classic

    • Classic divergences detection

  5. VolumeStrategy: standard

    • Volume-indicator correlation

  6. UniversalZoneAnalyzer

    • Полный pipeline анализа

    • Clustering (3 кластера)

    • Hypothesis testing


📊 Результаты анализа

MACD (12,26,9) + ZigZag (default: deviation=0.05, legs=10)

Тип зоны

Кол-во зон

Среднее rally в зоне

Среднее drop в зоне

Средняя амплитуда rally

Средняя амплитуда drop

BULL

40

0.1

0.1

0.251%

0.258%

BEAR

39

0.1

0.1

0.200%

0.257%

Интерпретация:

🟡 Амплитуды (0.20-0.26%)

ПОЛОЖИТЕЛЬНО: Достаточны для торговли на XAUUSD (> 0.05% минимум)

🔴 Количество колебаний (0.1 rally/drop)

ПРОБЛЕМА: Очень мало свингов в зоне!

  • Дефолтные параметры ZigZag слишком строгие (deviation=5%)

  • Для XAUUSD 15min нужно уменьшить до 1-2% (deviation=0.01-0.02)

🟡 Асимметрия

  • BULL зоны: ratio=0.97 (rally ≈ drop) - НЕТ асимметрии

  • BEAR зоны: ratio=1.28 (drop > rally) - ЕСТЬ асимметрия!

Вердикт:

🟢 BEAR зоны: Потенциал есть (амплитуда + асимметрия), но мало колебаний 🟡 BULL зоны: Амплитуда есть, но нет асимметрии и мало колебаний

Рекомендация: Оптимизировать параметры ZigZag (уменьшить deviation до 0.01-0.02)


✅ Что работает отлично в пакете

1. Универсальность

  • Один API для всех индикаторов (MACD, RSI, AO, custom)

  • indicator_context - зоны “знают” как они были обнаружены

2. Полнота SwingMetrics (23 поля)

SwingMetrics = {
    # Счетчики
    'rally_count': int,
    'drop_count': int,
    'num_swings': int,

    # Амплитуды
    'avg_rally_pct': float,
    'avg_drop_pct': float,
    'max_rally_pct': float,
    'max_drop_pct': float,
    'min_rally_pct': float,
    'min_drop_pct': float,
    'rally_amplitude_std': float,
    'drop_amplitude_std': float,
    'rally_amplitude_median': float,
    'drop_amplitude_median': float,

    # Длительности
    'avg_rally_duration_bars': float,
    'avg_drop_duration_bars': float,
    'max_rally_duration_bars': int,
    'max_drop_duration_bars': int,

    # Скорости
    'avg_rally_speed_pct_per_bar': float,
    'avg_drop_speed_pct_per_bar': float,
    'max_rally_speed_pct_per_bar': float,
    'max_drop_speed_pct_per_bar': float,

    # Соотношения
    'rally_to_drop_ratio': float,
    'duration_symmetry': float,
}

3. Интеграция pandas_ta

  • ZigZag из pandas_ta успешно работает через LibraryManager

  • 158 индикаторов доступны

4. Модульность

  • Можно использовать отдельные компоненты

  • Расширяемая архитектура (Strategy Pattern)


❌ Что отсутствует в пакете (TODO для разработки)

1. Swing Metrics в top-level features

Текущее состояние:

swing_metrics = zone.features['metadata']['swing_metrics']

Желаемое:

avg_rally = zone.features['avg_rally_pct']  # Прямой доступ

Причина: Удобство доступа, совместимость с ML pipeline


2. Backtesting модуль для swing торговли

Отсутствует:

  • Симуляция входов/выходов на swing точках

  • Расчет win rate, profit factor для swing стратегий

  • Position sizing на основе swing амплитуд

Пример желаемого API:

from bquant.backtest import SwingBacktester

backtester = SwingBacktester(
    entry_strategy='rally_start',   # Вход в начале rally
    exit_strategy='rally_end',       # Выход в конце rally
    risk_per_trade=0.01             # 1% на сделку
)

results = backtester.run(zones=result.zones, data=df)
print(f"Win rate: {results.win_rate:.2%}")
print(f"Profit factor: {results.profit_factor:.2f}")

3. Оптимизатор параметров ZigZag

Отсутствует:

  • Grid search по параметрам (deviation, legs)

  • Walk-forward validation

  • Автоматический подбор оптимальных параметров

Пример желаемого API:

from bquant.optimization import ZigZagOptimizer

optimizer = ZigZagOptimizer(
    deviation_range=(0.01, 0.10, 0.01),  # от 1% до 10% с шагом 1%
    legs_range=(5, 20, 5),                # от 5 до 20 с шагом 5
    metric='avg_rally_amplitude'          # Метрика для оптимизации
)

best_params = optimizer.optimize(zones=result.zones)
print(f"Best deviation: {best_params.deviation}")
print(f"Best legs: {best_params.legs}")

4. Визуализация swing points

Отсутствует:

  • Отметки rally/drop на графиках зон

  • Entry/exit точки для swing торговли

  • Интерактивные графики с зонами

Пример желаемого API:

from bquant.visualization import plot_zone_swings

fig = plot_zone_swings(
    zone=result.zones[0],
    show_rally_points=True,
    show_drop_points=True,
    show_entry_exit=True
)
fig.show()

5. Machine Learning для swing предсказаний

Отсутствует:

  • Регрессия: предсказание avg_rally_pct по zone features

  • Классификация: profitable_swing vs unprofitable

  • Feature importance для swing метрик

Пример желаемого API:

from bquant.ml import SwingPredictor

predictor = SwingPredictor(model='random_forest')
predictor.fit(zones=result.zones[:60])  # Обучение на первых 60 зонах

prediction = predictor.predict(zone=result.zones[61])
print(f"Predicted avg_rally: {prediction.avg_rally_pct:.3f}%")
print(f"Confidence: {prediction.confidence:.2f}")

6. Фильтр зон по swing качеству

Отсутствует:

  • Swing Quality Score (0-100)

  • Автоматический отбор зон с лучшими swing метриками

  • Ранжирование зон по профитабельности

Пример желаемого API:

from bquant.analysis.zones import filter_zones_by_swing_quality

best_zones = filter_zones_by_swing_quality(
    zones=result.zones,
    min_rally_count=2.0,           # Минимум 2 rally в зоне
    min_avg_rally_pct=0.15,        # Минимум 0.15% амплитуда
    min_asymmetry_ratio=1.2,       # Rally > Drop * 1.2
    return_top_n=10                # Топ-10 зон
)

for zone in best_zones:
    print(f"Zone {zone.zone_id}: swing_quality_score={zone.swing_quality_score}")

📝 Выводы

Что удалось сделать:

✅ Правильно использовать весь инструментарий пакета BQuant ✅ Извлечь SwingMetrics из metadata (23 поля метрик) ✅ Проанализировать колебания ВНУТРИ зон (не просто от начала до конца) ✅ Оценить “дает ли море” - есть ли альфа в свингах ✅ Идентифицировать недостающие компоненты для production использования

Архитектура пакета:

🟢 Отлично спроектирована - универсальная, расширяемая, модульная 🟢 SwingMetrics полностью реализованы - 23 детальных поля 🟢 Strategy Pattern - легко добавлять новые стратегии

Недостающие компоненты:

🔴 Backtesting для swing торговли 🔴 Оптимизатор параметров 🔴 Визуализация swing points 🔴 ML для предсказаний 🔴 Фильтр зон по качеству


🚀 Рекомендации для дальнейшей разработки

Приоритет 1 (Critical):

  1. Backtesting модуль - необходим для проверки реальной профитабельности

  2. Swing Metrics в top-level features - удобство доступа

  3. Оптимизатор параметров ZigZag - автоматический подбор

Приоритет 2 (High):

  1. Визуализация swing points - критично для анализа

  2. Фильтр зон по swing качеству - отбор лучших зон

Приоритет 3 (Medium):

  1. ML модуль для предсказаний - продвинутый анализ


📚 Примеры кода

Как правильно извлечь swing метрики:

from bquant.data.samples import get_sample_data
from bquant.analysis.zones import analyze_zones

# Загрузка данных
df = get_sample_data('mt_xauusd_m15')

# Анализ с ZigZag
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', min_duration=3)
    .with_strategies(swing='zigzag')  # ZigZag из pandas_ta
    .build()
)

# Извлечение swing metrics из METADATA
for zone in result.zones:
    metadata = zone.features.get('metadata', {})
    swing_metrics = metadata.get('swing_metrics')

    if swing_metrics:
        print(f"Zone {zone.zone_id} ({zone.type}):")
        print(f"  Rally count: {swing_metrics['rally_count']}")
        print(f"  Avg rally: {swing_metrics['avg_rally_pct']:.3f}%")
        print(f"  Avg drop: {swing_metrics['avg_drop_pct']:.3f}%")
        print(f"  Ratio: {swing_metrics['rally_to_drop_ratio']:.2f}")

Дата создания: 2025-10-28 Версия пакета: BQuant 0.0.1 Автор анализа: Claude Code + kogriv