preview
Майнинг данных балансов центробанков и получение картины мировой ликвидности

Майнинг данных балансов центробанков и получение картины мировой ликвидности

MetaTrader 5Торговые системы |
525 1
Yevgeniy Koshtenko
Yevgeniy Koshtenko

Финансовые кризисы XXI века — от ипотечного краха 2008 года до пандемических потрясений 2020-х — радикально изменили правила игры. Центральные банки больше не ограничиваются скромной ролью регуляторов процентных ставок. Их арсенал пополнился экзотическими инструментами: выкуп корпоративных облигаций, прямое кредитование банков, валютные свопы и даже финансирование государственных расходов. Эти меры, словно мощные насосы, вливают или изымают ликвидность из мировой экономики, отражаясь в балансах центробанков — своеобразных зеркалах их монетарной политики.

Эта статья — не просто путеводитель по анализу балансов центральных банков. Это глубокое погружение в создание системы, которая, словно алхимический котел, преобразует сырые данные о ликвидности в золотые прогнозы движения валютных пар. Мы объединим информацию от Федеральной резервной системы США (ФРС), Европейского центрального банка (ЕЦБ), Банка Японии (BOJ) и Народного банка Китая (PBoC), чтобы создать композитный индекс глобальной ликвидности. Мы разберем, как машинное обучение и технический анализ могут работать в тандеме, чтобы уловить скрытые закономерности, недоступные традиционным методам. Более того, мы покажем, как интегрировать эту систему с реальной торговлей, превращая абстрактные данные в конкретные торговые решения.

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


Теоретические основы: ликвидность как пульс мировой экономики

Глобальная ликвидность — это не просто сумма денег в обращении. Это жизненная сила мировой экономики, сложная система, объединяющая денежные агрегаты, финансовые инструменты и механизмы, которые обеспечивают свободное течение капитала. В узком смысле ликвидность — это способность актива быстро превратиться в деньги без потери стоимости. Но в глобальном масштабе она отражает, насколько легко капитал движется между странами, рынками и секторами. Само по себе движение капитала - это создание очень мощных долгосрочных трендов.

Центральные банки — ФРС, ЕЦБ, BOJ, PBoC — выступают главными дирижерами этого оркестра. Их балансы — это не просто бухгалтерские отчеты, а индикаторы того, сколько денег они влили в экономику через покупку активов, кредитование или другие меры. Когда ФРС скупает гособлигации, она создает новую ликвидность, увеличивая свой баланс. Когда ЕЦБ повышает резервные требования, он изымает ликвидность, сужая денежные потоки.

Увеличение баланса центробанка через количественное смягчение или выкуп активов обычно ослабляет национальную валюту. Это происходит по двум причинам. Во-первых, рост денежной массы снижает стоимость валюты по законам спроса и предложения. Во-вторых, такие меры часто сопровождаются снижением процентных ставок, что делает валюту менее привлекательной для инвесторов, ищущих доходность.

Однако, эта связь не так проста. Если все ведущие центробанки одновременно расширяют балансы, эффект на валютные пары может быть минимальным — все валюты "раздуваются" синхронно. Ключевым фактором становится относительная динамика: если BOJ увеличивает баланс быстрее, чем ФРС, йена, скорее всего, ослабнет против доллара.

Понимание того, как ликвидность передается через финансовую систему, критически важно для прогнозирования. Существует несколько каналов:

  • Процентный канал: снижение ставок центробанком увеличивает денежную массу, что снижает доходность валютных активов и ослабляет валюту.
  • Портфельный канал: массовые покупки активов центробанками изменяют структуру портфелей инвесторов, заставляя их искать альтернативные инвестиции.
  • Кредитный канал: улучшение условий кредитования стимулирует экономическую активность и влияет на валютные потоки.
  • Канал ожиданий: коммуникация и опережающие сигналы центробанков формируют рыночные ожидания еще до фактических действий. 

Ожидания будущей политики  рождают будущие тренды, сейчас рассмотрим это подробнее.

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


Архитектура системы: инженерия финансового будущего

Наша система — это не монолит, а тщательно выстроенная мозаика, где каждый модуль выполняет четко определенную функцию. GlobalLiquidityMiner собирает и обрабатывает данные о балансах центробанков, превращая хаотичные потоки информации в стройные временные ряды. ForexLiquidityForecaster использует эти данные, обогащая их техническими индикаторами и прогоняя через алгоритмы машинного обучения для создания точных прогнозов. Такой подход позволяет обновлять отдельные компоненты, не ломая всю систему, и адаптировать ее к новым источникам данных или рыночным условиям.

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

Модуль GlobalLiquidityMiner — это сердце системы сбора данных. Он работает с разнородными источниками: от API FRED для ФРС до сложных форматов данных BOJ и ограниченной информации PBoC. Основная задача — не просто загрузить данные, а привести их к единому стандарту, пригодному для анализа. Разные банки публикуют данные с разной периодичностью (еженедельные отчеты ФРС против квартальных данных PBoC) и в разных валютах. Модуль интерполирует недостающие значения, нормализует показатели и синхронизирует временные ряды.

import pandas as pd
import logging
from typing import Dict
from fredapi import Fred
import yfinance as yf
import requests
from io import StringIO

logger = logging.getLogger(__name__)

class GlobalLiquidityMiner:
    def __init__(self, fred_api_key: str, start_date: str, end_date: str):
        self.fred = Fred(api_key=fred_api_key) if fred_api_key else None
        self.start_date = start_date
        self.end_date = end_date
        self.data_cache = {}

    def fetch_central_bank_balance_sheets(self) -> Dict[str, pd.DataFrame]:
        """Получение данных балансов центральных банков."""
        balance_sheets = {}
        
        if self.fred:
            logger.info("Загрузка данных ФРС...")
            try:
                fed_total_assets = self.fred.get_series('WALCL', start=self.start_date, end=self.end_date)
                fed_securities = self.fred.get_series('WSHOSHO', start=self.start_date, end=self.end_date)
                fed_loans = self.fred.get_series('WLRRAL', start=self.start_date, end=self.end_date)
                
                balance_sheets['FED'] = pd.DataFrame({
                    'date': fed_total_assets.index,
                    'total_assets': fed_total_assets.values,
                    'securities_held': fed_securities.reindex(fed_total_assets.index, method='ffill').values,
                    'loans_and_repos': fed_loans.reindex(fed_total_assets.index, method='ffill').values,
                    'currency': 'USD'
                })
                
                balance_sheets['FED']['assets_growth_rate'] = balance_sheets['FED']['total_assets'].pct_change(periods=52)
                balance_sheets['FED']['securities_share'] = balance_sheets['FED']['securities_held'] / balance_sheets['FED']['total_assets']
                
                logger.info(f"Загружено {len(fed_total_assets)} записей данных ФРС")
            except Exception as e:
                logger.error(f"Ошибка при загрузке данных ФРС: {e}")
        
        self.data_cache['balance_sheets'] = balance_sheets
        return balance_sheets

Модуль объединяет данные ликвидности с техническими индикаторами, создавая признаки для моделей машинного обучения. Использование скользящих окон позволяет учитывать краткосрочные и долгосрочные эффекты изменений ликвидности.

from sklearn.ensemble import RandomForestRegressor
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import r2_score, mean_squared_error
import numpy as np

class ForexLiquidityForecaster:
    def __init__(self, liquidity_miner: GlobalLiquidityMiner):
        self.liquidity_miner = liquidity_miner
        self.models = {}
        self.scalers = {}
        
    def build_prediction_model(self, symbol: str, feature_df: pd.DataFrame):
        """Обучение модели прогнозирования."""
        targets = {
            f'return_{h}d': feature_df['close'].shift(-h) / feature_df['close'] - 1
            for h in [1, 5]
        }
        
        feature_columns = [col for col in feature_df.columns if not col.startswith(('return_', 'volatility_', 'direction_'))]
        X = feature_df[feature_columns].dropna()
        
        train_size = int(len(X) * 0.8)
        X_train, X_test = X.iloc[:train_size], X.iloc[train_size:]
        
        models = {}
        for target_name, target_series in targets.items():
            y = target_series.dropna()
            common_idx = X.index.intersection(y.index)
            X_aligned, y_aligned = X.loc[common_idx], y.loc[common_idx]
            
            scaler = StandardScaler()
            X_train_scaled = scaler.fit_transform(X_aligned.iloc[:train_size])
            X_test_scaled = scaler.transform(X_aligned.iloc[train_size:])
            
            model = RandomForestRegressor(n_estimators=100, max_depth=10, random_state=42)
            model.fit(X_train_scaled, y_aligned.iloc[:train_size])
            
            test_pred = model.predict(X_test_scaled)
            test_r2 = r2_score(y_aligned.iloc[train_size:], test_pred)
            
            models[target_name] = {'model': model, 'scaler': scaler, 'r2': test_r2}
        
        self.models[symbol] = models
        self.scalers[symbol] = scaler

Модуль ForexLiquidityForecaster — это мозг системы, где данные о ликвидности встречаются с рыночными индикаторами. Он использует Random Forest для выявления нелинейных зависимостей между балансами центробанков, техническими индикаторами (RSI, MACD, скользящие средние) и движением валютных пар. Признаки создаются с учетом временных лагов, чтобы уловить как мгновенные, так и отложенные эффекты изменений ликвидности.

from sklearn.ensemble import RandomForestRegressor
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import r2_score
import numpy as np
import pandas as pd

class ForexLiquidityForecaster:
    def __init__(self, liquidity_miner: GlobalLiquidityMiner):
        self.liquidity_miner = liquidity_miner
        self.models = {}
        self.scalers = {}
        self.forecasts = {}

    def prepare_features(self, symbol: str, historical_data: pd.DataFrame) -> pd.DataFrame:
        """Создание признаков для прогнозирования."""
        df = historical_data.copy()
        
        # Технические индикаторы
        df['rsi_14'] = self.calculate_rsi(df['close'], 14)
        df['ema_50'] = df['close'].ewm(span=50).mean()
        df['volatility_20d'] = df['close'].pct_change().rolling(20).std()
        
        # Присоединение данных ликвидности
        if 'balance_sheets' in self.liquidity_miner.data_cache:
            for bank, bs_data in self.liquidity_miner.data_cache['balance_sheets'].items():
                df = df.join(bs_data[['total_assets']].rename(columns={'total_assets': f'{bank}_balance'}), how='left')
                df[f'{bank}_balance'].fillna(method='ffill', inplace=True)
        
        return df.dropna()

    def calculate_rsi(self, series: pd.Series, period: int = 14) -> pd.Series:
        """Расчет RSI."""
        delta = series.diff()
        gain = delta.where(delta > 0, 0).rolling(window=period).mean()
        loss = -delta.where(delta < 0, 0).rolling(window=period).mean()
        rs = gain / loss
        return 100 - (100 / (1 + rs))

    def build_prediction_model(self, symbol: str, feature_df: pd.DataFrame):
        """Обучение модели прогнозирования."""
        targets = {
            f'return_{h}d': feature_df['close'].shift(-h) / feature_df['close'] - 1
            for h in [1, 3, 5, 8]
        }
        
        feature_columns = [col for col in feature_df.columns if not col.startswith('return_')]
        X = feature_df[feature_columns].dropna()
        
        train_size = int(len(X) * 0.8)
        X_train, X_test = X.iloc[:train_size], X.iloc[train_size:]
        
        models = {}
        for target_name, target_series in targets.items():
            y = target_series.dropna()
            common_idx = X.index.intersection(y.index)
            X_aligned, y_aligned = X.loc[common_idx], y.loc[common_idx]
            
            scaler = StandardScaler()
            X_train_scaled = scaler.fit_transform(X_aligned.iloc[:train_size])
            X_test_scaled = scaler.transform(X_aligned.iloc[train_size:])
            
            model = RandomForestRegressor(n_estimators=200, max_depth=15, random_state=42)
            model.fit(X_train_scaled, y_aligned.iloc[:train_size])
            
            test_pred = model.predict(X_test_scaled)
            test_r2 = r2_score(y_aligned.iloc[train_size:], test_pred)
            
            models[target_name] = {'model': model, 'scaler': scaler, 'r2': test_r2}
        
        self.models[symbol] = models
        self.scalers[symbol] = scaler


Практическая реализация: от данных к действиям

API FRED — это сокровищница данных о балансе ФРС, включая общие активы, ценные бумаги и кредиты. Код обрабатывает ограничения API, такие как лимиты запросов, и синхронизирует данные с разной периодичностью.

def fetch_fed_data(self):
    """Получение данных ФРС через API FRED."""
    try:
        fed_data = self.fred.get_series('WALCL', start=self.start_date, end=self.end_date)
        return pd.DataFrame({
            'date': fed_data.index,
            'total_assets': fed_data.values,
            'currency': 'USD'
        }).set_index('date')
    except Exception as e:
        logger.error(f"Ошибка загрузки данных ФРС: {e}")
        return pd.DataFrame()

Для ЕЦБ данные извлекаются через Statistical Data Warehouse, а при сбоях используются прокси-показатели, такие как EURUSD и Euro Stoxx 50. Для BOJ и PBoC, где доступ к данным ограничен, применяются рыночные индикаторы (Nikkei 225, USDJPY, китайские облигации).

def fetch_boj_proxy_data(self):
    """Получение прокси-данных BOJ."""
    try:
        usdjpy = yf.download('USDJPY=X', start=self.start_date, end=self.end_date, progress=False)
        nikkei = yf.download('^N225', start=self.start_date, end=self.end_date, progress=False)
        
        proxy_balance = pd.DataFrame(index=usdjpy.index)
        proxy_balance['jpy_strength'] = 1 / usdjpy['Close']
        proxy_balance['equity_liquidity'] = nikkei['Close'] / nikkei['Close'].rolling(252).mean()
        proxy_balance['synthetic_balance'] = proxy_balance['jpy_strength'].rolling(30).mean() * proxy_balance['equity_liquidity'] * 1000000
        
        return proxy_balance
    except Exception as e:
        logger.error(f"Ошибка загрузки данных BOJ: {e}")
        return pd.DataFrame()


Индекс ликвидности: создание финансового компаса

Композитный индекс ликвидности объединяет нормализованные данные балансов центробанков с весами, отражающими их влияние: ФРС (35%), ЕЦБ (25%), BOJ (15%), PBoC (20%), другие (5%). Динамическая корректировка учитывает волатильность и надежность данных.

def calculate_liquidity_index(self) -> pd.DataFrame:
    """Расчет композитного индекса ликвидности."""
    all_series = {}
    weights = {'FED_balance': 0.35, 'ECB_balance': 0.25, 'BOJ_balance': 0.15, 'PBOC_balance': 0.20}
    
    for bank, df in self.data_cache.get('balance_sheets', {}).items():
        series_name = f'{bank}_balance'
        normalized = (df['total_assets'] - df['total_assets'].rolling(252).mean()) / df['total_assets'].rolling(252).std()
        all_series[series_name] = normalized
    
    combined_df = pd.DataFrame(all_series).fillna(method='ffill')
    liquidity_index = combined_df.dot(pd.Series(weights))
    
    return pd.DataFrame({'liquidity_index': liquidity_index}, index=combined_df.index)

Помимо основного индекса, система создает под-индексы: краткосрочный (30 дней), долгосрочный (252 дня), индекс ускорения и волатильности ликвидности. Эти показатели помогают адаптировать прогнозы под разные рыночные условия.

def enhance_liquidity_index(self, base_index: pd.Series) -> pd.DataFrame:
    """Создание расширенных индикаторов ликвидности."""
    enhanced_df = pd.DataFrame(index=base_index.index)
    enhanced_df['base_liquidity_index'] = base_index
    enhanced_df['short_term_liquidity'] = base_index.rolling(window=30).mean()
    enhanced_df['long_term_trend'] = base_index.rolling(window=252).mean()
    enhanced_df['liquidity_acceleration'] = base_index.diff().diff()
    enhanced_df['liquidity_volatility'] = base_index.rolling(window=60).std()
    
    return enhanced_df


Интеграция с MetaTrader 5: мост в реальную торговлю

Система интегрируется с MetaTrader 5 для получения рыночных данных и генерации торговых сигналов. Признаки включают как технические индикаторы, так и показатели ликвидности, создавая уникальный набор данных для прогнозирования.

import MetaTrader5 as mt5
from datetime import datetime, timedelta

class TradingIntegration:
    def __init__(self, forecaster: ForexLiquidityForecaster):
        self.forecaster = forecaster
        mt5.initialize()
    
    def fetch_forex_data(self, symbol: str, days: int = 1460) -> pd.DataFrame:
        """Получение данных с MetaTrader 5."""
        utc_from = datetime.now() - timedelta(days=days)
        rates = mt5.copy_rates_from(symbol, mt5.TIMEFRAME_D1, utc_from, days)
        
        if rates is None:
            return pd.DataFrame()
        
        df = pd.DataFrame(rates)
        df['date'] = pd.to_datetime(df['time'], unit='s')
        df.set_index('date', inplace=True)
        return df
    
    def generate_trading_signals(self, symbol: str, forecasts: dict) -> dict:
        """Генерация торговых сигналов."""
        signals = {}
        short_term_returns = [f['return'] for h, f in forecasts['forecasts'].items() if h in ['1d', '2d', '3d']]
        avg_return = np.mean(short_term_returns) if short_term_returns else 0
        
        signals['short_term'] = {
            'signal': 'BUY' if avg_return > 0.005 else 'SELL' if avg_return < -0.005 else 'HOLD',
            'strength': min(abs(avg_return) * 100, 100)
        }
        
        return signals


Визуализация: картина мира в графиках

Система создает интерактивные визуализации, которые помогают трейдерам видеть взаимосвязи между ликвидностью и ценами. Графики включают прогнозы цен, динамику индекса ликвидности и важность признаков.

import matplotlib.pyplot as plt
import numpy as np

def create_comprehensive_visualization(self, symbol: str):
    """Создание набора визуализаций."""
    forecasts = self.forecaster.forecasts.get(symbol, {})
    historical_data = self.fetch_forex_data(symbol, days=180)
    
    plt.figure(figsize=(15, 8))
    plt.plot(historical_data.index[-60:], historical_data['close'].iloc[-60:], label='Исторические цены', linewidth=2)
    
    forecast_dates = [datetime.strptime(f['date'], '%Y-%m-%d') for f in forecasts.get('forecasts', {}).values()]
    forecast_prices = [f['price'] for f in forecasts.get('forecasts', {}).values()]
    
    if forecast_dates:
        plt.plot(forecast_dates, forecast_prices, 'r--', label='Прогноз', linewidth=2)
    
    plt.title(f'{symbol}: Прогноз цен с учетом ликвидности', fontsize=14, fontweight='bold')
    plt.xlabel('Дата', fontsize=12)
    plt.ylabel('Цена', fontsize=12)
    plt.legend()
    plt.grid(True, alpha=0.3)
    plt.savefig(f'forecast_{symbol}.png', dpi=300)
    plt.close()

В результате получаем картину мировой ликвидности:

Также прогнозы на ее основе:

И матрицу корреляций:


Заключение

Разработанная система представляет собой мощный инструмент, который объединяет анализ балансов центральных банков с передовыми методами машинного обучения и технического анализа, обеспечивая комплексный подход к прогнозированию валютных курсов. Модульная архитектура системы, включающая GlobalLiquidityMiner и ForexLiquidityForecaster, обеспечивает гибкость, масштабируемость и возможность адаптации к меняющимся рыночным условиям.

Интеграция с MetaTrader 5 позволяет трейдерам применять прогнозы в реальной торговле, превращая сложные данные в конкретные торговые решения. Интерактивные визуализации и результаты бэктестинга повышают прозрачность и надежность системы, предоставляя трейдерам возможность принимать обоснованные решения с высокой степенью уверенности.

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

Система не лишена ограничений. Ограниченный доступ к данным некоторых центробанков, таких как PBoC, требует использования прокси-показателей, что может снижать точность. Кроме того, машинное обучение, несмотря на свою мощь, не гарантирует абсолютной точности прогнозов, особенно в условиях неожиданных геополитических или экономических шоков. Тем не менее, постоянное совершенствование алгоритмов, расширение источников данных и учет новых рыночных факторов позволят системе оставаться актуальной и эффективной.

В будущем развитие системы может включать интеграцию с нейросетевыми моделями для обработки больших объемов неструктурированных данных, таких как новости и социальные медиа, что усилит прогностическую мощь. Также возможно внедрение адаптивных механизмов, автоматически корректирующих веса индекса ликвидности в зависимости от текущих экономических условий. Это открывает путь к созданию нового поколения торговых систем, которые будут еще более устойчивы к неопределенности и способны обеспечивать стабильные результаты в любых рыночных условиях.

Прикрепленные файлы |
FREED_Predict.py (27.15 KB)
Последние комментарии | Перейти к обсуждению на форуме трейдеров (1)
Denis Kirichenko
Denis Kirichenko | 6 июн. 2025 в 06:27

Картинка просто огонь, для интернет мемов самое то.

От начального до среднего уровня: Рекурсия От начального до среднего уровня: Рекурсия
В этой статье мы рассмотрим очень интересную и довольно интересную концепцию программирования, хотя к ней следует относиться с большой осторожностью, поскольку неправильное её использование или непонимание превращает относительно простые программы в нечто неоправданно сложное. Но правильное использование и идеальная адаптация в одинаково подходящих ситуациях делают рекурсию отличным союзником в решении вопросов, которые в другом случае были бы гораздо более трудоемкими и длительными. Представленные здесь материалы предназначены только для изучения. Ни в коем случае нельзя рассматривать это приложение как окончательное, цели которого будут иные, кроме изучения представленных концепций.
Трейдинг с экономическим календарем MQL5 (Часть 1): Освоение функций экономического календаря MQL5 Трейдинг с экономическим календарем MQL5 (Часть 1): Освоение функций экономического календаря MQL5
В этой статье мы рассмотрим, как использовать экономический календарь MQL5 для торговли, сначала разобравшись с его основными функциями. Затем мы реализуем ключевые функции экономического календаря в MQL5 для извлечения необходимых новостей для принятия торговых решений. Наконец, мы посмотрим, как использовать эту информацию для эффективного совершенствования торговых стратегий.
Построение модели для ограничения диапазона сигналов по тренду (Часть 9): Советник с несколькими стратегиями (II) Построение модели для ограничения диапазона сигналов по тренду (Часть 9): Советник с несколькими стратегиями (II)
Количество стратегий, которые можно интегрировать в виде советника, практически безгранично. Однако каждая дополнительная стратегия увеличивает сложность алгоритма. Благодаря использованию нескольких стратегий советник может лучше адаптироваться к изменяющимся рыночным условиям, что потенциально повышает его прибыльность. Сегодня мы рассмотрим, как реализовать в MQL5 одну из выдающихся стратегий, разработанных Ричардом Дончианом, продолжая при этом совершенствовать функциональность нашего советника Trend Constraint.
Изучаем конформное прогнозирование финансовых временных рядов Изучаем конформное прогнозирование финансовых временных рядов
В этой статье вы познакомитесь с конформными предсказаниями и библиотекой MAPIE, которая их реализует. Данный подход является одним из самых современных в машинном обучении и позволяет сосредоточиться на контроле рисков для уже существующих разнообразных моделей машинного обучения. Конформные предсказания, сами по себе, не являются способом поиска закономерностей в данных. Они лишь определяют степень уверенности существующих моделей в предсказании конкретных примеров и позволяют фильтровать надежные предсказания.