Обнаружение аномалий на крипторынке с помощью Z-Score

Обнаружение аномалий на крипторынке с помощью Z-Score

Обнаружение аномалий на крипторынке с помощью Z-Score: мощный инструмент для трейдеров

Криптовалютный рынок славится своей высокой волатильностью, что делает его как привлекательным, так и сложным для анализа. Важно уметь отличать обычные колебания цены от действительно аномальных движений, которые могут сигнализировать о возможности для входа в сделку или выхода из неё. В этой статье мы разберём, как с помощью Z-Score и простого Python-скрипта обнаруживать аномалии на графике цен BTCUSDT, используя публичное API Bybit.

Почему Z-Score полезен для анализа аномалий?

Применение Z-Score в анализе временных рядов — это эффективный способ выявления значительных отклонений в данных. Этот метод позволяет:

✅ Фильтровать рыночный шум — устраняя незначительные изменения цены, которые не несут полезной информации.
✅ Выявлять мощные движения — определять резкие скачки цены, которые могут быть вызваны новостями, крупными сделками или изменением настроения рынка.
✅ Обрабатывать данные быстро и эффективно — расчёты просты и не требуют сложных математических моделей.

Как работает наш Python-скрипт?

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

Получение исторических данных

Первый шаг — получение данных о свечах с Bybit API. Мы используем запрос к API для получения 100 последних 15-минутных свечей:

def get_kline_data():
    """Получает исторические свечи"""
    params = {"category": "spot", "symbol": SYMBOL, "interval": INTERVAL, "limit": LIMIT}
    response = requests.get(KLINE_URL, params=params)

    if response.status_code == 200:
        return response.json().get("result", {}).get("list", [])
    else:
        print(f"Ошибка API: {response.status_code}")
        return None

Вычисление Z-Score

Мы анализируем закрытия свечей, вычисляя разницу между последовательными значениями (returns). Затем определяем среднее значение и стандартное отклонение, чтобы вычислить Z-оценку каждого изменения цены:

closes = np.array([float(c[4]) for c in candles])
returns = np.diff(closes)  # Разница между ценами закрытия

mean = np.mean(returns)
std = np.std(returns)
z_scores = (returns - mean) / std  # Z-оценка

Обнаружение аномалий

Если абсолютное значение Z-Score превышает пороговое значение (3), мы считаем это аномальным движением. Скрипт выводит предупреждение о значительном росте или падении цены:

threshold = 3  # Граница аномалий
anomalies = np.where(abs(z_scores) > threshold)[0]

for idx in anomalies:
    move = "🚀 Резкий рост" if z_scores[idx] > 0 else "⚠️ Резкое падение"
    print(f"{move}: Свеча {idx+1}, Изменение: {returns[idx]:.2f}, Z-Score: {z_scores[idx]:.2f}")

Как использовать этот скрипт в трейдинге?

📌 Фильтрация ложных сигналов — стандартные индикаторы (MACD, RSI) иногда дают ложные сигналы. Использование Z-Score помогает игнорировать шум.
📌 Автоматическое обнаружение движений — можно встроить скрипт в торгового бота, который будет уведомлять о резких скачках цены.
📌 Комбинирование с другими методами — сочетание с другими методами анализа (например, объёмами торгов) повышает точность сигналов.

Заключение

Анализ аномалий с Z-Score — это мощный инструмент для обнаружения значительных движений на рынке криптовалют. Его можно использовать для фильтрации шума, выявления сильных импульсов и автоматизации сигналов. Этот метод прост в реализации и может стать отличным дополнением к вашей торговой стратегии.

Полный код:

import requests
import numpy as np

# Настройки
SYMBOL = "BTCUSDT"
KLINE_URL = "https://api.bybit.com/v5/market/kline"
INTERVAL = "15"  # 15-минутные свечи
LIMIT = 100  # Количество свечей

def get_kline_data():
    """Получает исторические свечи"""
    params = {"category": "spot", "symbol": SYMBOL, "interval": INTERVAL, "limit": LIMIT}
    response = requests.get(KLINE_URL, params=params)

    if response.status_code == 200:
        return response.json().get("result", {}).get("list", [])
    else:
        print(f"Ошибка API: {response.status_code}")
        return None

def detect_anomalies():
    """Анализ аномальных движений"""
    candles = get_kline_data()
    if not candles:
        return

    closes = np.array([float(c[4]) for c in candles])
    returns = np.diff(closes)  # Вычисляем разницу между свечами

    mean = np.mean(returns)
    std = np.std(returns)
    z_scores = (returns - mean) / std  # Z-оценка для каждого изменения

    threshold = 3  # Граница аномалий
    anomalies = np.where(abs(z_scores) > threshold)[0]

    for idx in anomalies:
        move = "🚀 Резкий рост" if z_scores[idx] > 0 else "⚠️ Резкое падение"
        print(f"{move}: Свеча {idx+1}, Изменение: {returns[idx]:.2f}, Z-Score: {z_scores[idx]:.2f}")

if __name__ == "__main__":
    detect_anomalies()

 

Комментарии

Пока нет комментариев. Будьте первым!

Оставить комментарий

Чтобы оставить комментарий, пожалуйста, войдите или зарегистрируйтесь.