К списку статей
July 29, 2025
5 мин. чтения

Диффузионные модели против криптовалютной анархии: почему DDPM может предсказать падение Bitcoin лучше вашего астролога

диффузионные модели
криптовалюты
прогнозирование
машинное обучение
Bitcoin
DDPM
временные ряды

Вместо предисловия: когда классический машинный лёрнинг сдаётся

Криптовалютные рынки — это место, где традиционные методы прогнозирования приходят умирать. LSTM модели начинают нервничать от волатильности Bitcoin, ARIMA модели впадают в истерику от резких скачков Ethereum, а классические нейронные сети просто сдаются, когда видят график Dogecoin. И тут на сцену выходят диффузионные модели — технология, которая изначально учила компьютеры рисовать котиков, а теперь пытается предсказать, когда Bitcoin решит устроить очередной "чёрный понедельник".

Забавно, но архитектура, которая породила Stable Diffusion и DALL-E, сейчас активно применяется для анализа финансовых временных рядов. И знаете что? Работает неплохо. Особенно когда классические подходы начинают галлюцинировать от экстремальной волатильности криптомонет.

Почему диффузионные модели вообще работают с временными рядами?

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

В контексте финансовых временных рядов это означает, что модель учится отделять сигнал от шума в буквальном смысле. Криптовалютные рынки известны своей экстремальной зашумленностью — случайные твиты Илона Маска, панические продажи, FOMO-покупки. Диффузионная модель может научиться "видеть" структурные паттерны сквозь весь этот хаос.

Математически процесс выглядит так:

  • Прямой процесс: q(xtxt1)=N(xt;1βtxt1,βtI)q(x_t | x_{t-1}) = \mathcal{N}(x_t; \sqrt{1-\beta_t}x_{t-1}, \beta_t I)
  • Обратный процесс: pθ(xt1xt)=N(xt1;μθ(xt,t),Σθ(xt,t))p_\theta(x_{t-1} | x_t) = \mathcal{N}(x_{t-1}; \mu_\theta(x_t, t), \Sigma_\theta(x_t, t))

где βt\beta_t — расписание шума, а θ\theta — параметры нейросети.

Конкретные библиотеки и готовые решения

1. Diffusion-TS: универсальный солдат для временных рядов

GitHub: Y-debug-sys/Diffusion-TS

Это флагманская библиотека для работы с диффузионными моделями временных рядов, опубликованная на ICLR 2024. Основное преимущество — она работает как условно (forecasting), так и безусловно (generation).

import torch
from diffusion_ts import DiffusionTS
import pandas as pd

btc_data = pd.read_csv('btc_prices.csv')
prices = torch.tensor(btc_data['close'].values).float()

model = DiffusionTS(
    input_dim=1,
    hidden_dim=64,
    num_layers=4,
    max_sequence_length=100,
    num_diffusion_steps=1000
)

model.fit(prices, epochs=100)

forecast = model.predict(prices[-100:], forecast_horizon=24)

Модель использует encoder-decoder transformer с разделёнными временными представлениями, где декомпозиция помогает захватывать семантический смысл временных рядов.

2. TSDiff: Amazon-овский подход к криптовалютному хаосу

GitHub: amazon-science/unconditional-time-series-diffusion

Amazon Research предложила TSDiff — безусловную диффузионную модель, которая может работать с прогнозированием через self-guidance механизм. Особенность в том, что модель не требует дополнительных сетей для conditioning.

from tsdiff import TSDiff
import numpy as np

crypto_data = load_cryptocurrency_data(['BTC', 'ETH', 'LTC'])

tsdiff = TSDiff(
    input_size=crypto_data.shape[-1],
    hidden_size=128,
    num_layers=6,
    diffusion_steps=1000,
    beta_schedule='cosine'
)

tsdiff.train(crypto_data, num_epochs=200)

synthetic_crypto = tsdiff.sample(num_samples=1000, length=365)

forecast = tsdiff.forecast_with_guidance(
    context=crypto_data[-30:],  # последние 30 дней
    forecast_length=7,          # прогноз на неделю
    guidance_scale=2.0
)

3. FinDiff: табличные финансовые данные встречают диффузию

Paper: FinDiff специально разработан для генерации синтетических финансовых табличных данных. Подходит для создания разнообразных сценариев рынка.

import torch
from findiff import FinancialDiffusion

market_data = pd.read_csv('crypto_market_features.csv')

financial_features = [
    'price', 'volume', 'market_cap', 'volatility',
    'rsi', 'macd', 'bollinger_bands'
]

findiff = FinancialDiffusion(
    categorical_columns=['exchange', 'crypto_type'],
    numerical_columns=financial_features,
    embedding_dim=32,
    hidden_dim=256
)

findiff.fit(market_data[financial_features])

synthetic_scenarios = findiff.generate(n_samples=10000)

stress_test_data = findiff.generate_conditional(
    conditions={'volatility': '>0.8'}  # высокая волатильность
)

4. Быстрая реализация с pytorch-forecasting

Для тех, кто хочет быстро попробовать диффузионные модели в связке с проверенными архитектурами:

import lightning.pytorch as pl
from pytorch_forecasting import TimeSeriesDataSet, TemporalFusionTransformer
from diffusion_wrapper import DiffusionTFT  # гипотетическая обёртка

crypto_df = pd.read_csv('hourly_crypto_data.csv')

training = TimeSeriesDataSet(
    crypto_df,
    time_idx="hour",
    target="btc_price",
    group_ids=["crypto_pair"],
    max_encoder_length=168,  # неделя назад
    max_prediction_length=24,  # сутки вперёд
    time_varying_unknown_reals=["price", "volume", "volatility"],
    time_varying_known_reals=["hour_of_day", "day_of_week"],
)

diffusion_tft = DiffusionTFT.from_dataset(
    training,
    hidden_size=64,
    attention_head_size=4,
    diffusion_steps=100,
    noise_schedule='linear'
)

trainer = pl.Trainer(max_epochs=50, accelerator="gpu")
trainer.fit(diffusion_tft, train_dataloaders=training.to_dataloader(train=True))

Практические результаты: диффузия vs классика

Исследования показывают любопытные результаты. В работе "Prediction of Cryptocurrency Prices through a Path Dependent Monte Carlo Simulation" авторы используют Merton's jump diffusion model — гибрид стохастических процессов и машинного обучения. Результат? Модель смогла захватить как постепенные изменения цен, так и резкие скачки, характерные для крипторынков.

Другое исследование показало, что ADE-TFT (Advanced Deep Learning-Enhanced Temporal Fusion Transformer) с диффузионными компонентами значительно превосходит классические подходы по метрикам MAPE, MSE и RMSE. Особенно впечатляют результаты на конфигурации с 8 скрытыми слоями.

Тёмная сторона диффузионных моделей в финансах

Но давайте будем честными. Диффузионные модели — это не серебряная пуля. У них есть серьёзные проблемы:

1. Вычислительная прожорливость

Обучение диффузионной модели на криптовалютных данных требует серьёзных вычислительных ресурсов. Если ваша модель делает 1000 шагов диффузии, то для получения одного прогноза нужно 1000 проходов через нейросеть. Это не очень подходит для высокочастотного трейдинга.

2. Проблема чёрных лебедей

Криптовалютные рынки известны экстремальными событиями — обвал на 50% за день, запрет криптовалют в Китае, хак крупной биржи. Диффузионные модели, обученные на исторических данных, плохо предсказывают такие события.

3. Режимная зависимость

Рынки криптовалют имеют различные режимы поведения — bull market, bear market, sideways движение. Диффузионная модель может отлично работать в одном режиме и полностью провалиться в другом.

Оптимизация и ускорение: как не разориться на GPU

Token Merging для диффузии

GitHub: dbolya/tomesd

Библиотека Token Merging позволяет ускорить диффузионные модели в 1.24 раза без потери качества за счёт объединения избыточных токенов:

import tomesd
from diffusion_model import CryptoDiffusion

model = CryptoDiffusion(...)

tomesd.apply_patch(model, ratio=0.7)  # убираем 30% токенов

forecast = model.predict(btc_data)

Cached Adaptive Token Merging

GitHub: omidiu/ca_tome

CA-ToMe комбинирует пространственную и временную оптимизацию, что особенно важно для временных рядов:

from ca_tome import apply_ca_tome

apply_ca_tome(
    model, 
    threshold=0.7,
    caching_steps=[0, 10, 20, 30, 40]  # кэшируем каждые 10 шагов
)

Практический пример: полный pipeline для Bitcoin

Вот реалистичный пример того, как можно использовать диффузионные модели для прогнозирования Bitcoin:

import torch
import pandas as pd
import numpy as np
from sklearn.preprocessing import MinMaxScaler
from diffusion_ts import DiffusionTS

class CryptoDiffusionPipeline:
    def __init__(self, sequence_length=100, forecast_horizon=24):
        self.sequence_length = sequence_length
        self.forecast_horizon = forecast_horizon
        self.scaler = MinMaxScaler()
        self.model = None
        
    def prepare_data(self, crypto_data):
        """Подготовка данных с учётом особенностей криптовалют"""
        crypto_data['returns'] = crypto_data['close'].pct_change()
        crypto_data['volatility'] = crypto_data['returns'].rolling(24).std()
        crypto_data['rsi'] = self.compute_rsi(crypto_data['close'])
        
        features = ['close', 'volume', 'volatility', 'rsi']
        scaled_data = self.scaler.fit_transform(crypto_data[features])
        
        return scaled_data
    
    def train_model(self, data):
        """Обучение диффузионной модели"""
        self.model = DiffusionTS(
            input_dim=data.shape[1],
            hidden_dim=128,
            num_layers=6,
            diffusion_steps=1000,
            noise_schedule='cosine',
            loss_type='l2'
        )
        
        X, y = self.create_sequences(data)
        
        self.model.fit(
            X, y,
            epochs=200,
            batch_size=32,
            learning_rate=1e-4,
            validation_split=0.2
        )
    
    def forecast(self, recent_data):
        """Прогнозирование с confidence intervals"""
        predictions = []
        
        for _ in range(100):  # Monte Carlo sampling
            pred = self.model.sample_forecast(
                context=recent_data[-self.sequence_length:],
                horizon=self.forecast_horizon
            )
            predictions.append(pred)
        
        predictions = np.array(predictions)
        
        mean_pred = np.mean(predictions, axis=0)
        std_pred = np.std(predictions, axis=0)
        
        return {
            'forecast': mean_pred,
            'confidence_95': mean_pred + 1.96 * std_pred,
            'confidence_5': mean_pred - 1.96 * std_pred
        }

pipeline = CryptoDiffusionPipeline()
btc_data = pd.read_csv('btc_hourly.csv')

prepared_data = pipeline.prepare_data(btc_data)
pipeline.train_model(prepared_data)

forecast_result = pipeline.forecast(prepared_data)
print(f"Bitcoin forecast for next 24h: {forecast_result['forecast'][-1]:.2f}")

Когда диффузионные модели стоит использовать?

Стоит использовать, если:

  • У вас есть много исторических данных (минимум год hourly data)
  • Вы можете позволить себе длительное обучение (дни-недели на GPU)
  • Нужна генерация синтетических сценариев для бэктестинга
  • Работаете с мультивариатными временными рядами
  • Важна оценка неопределённости прогнозов

Не стоит использовать, если:

  • Нужны быстрые прогнозы в реальном времени
  • Работаете с короткими временными рядами
  • Ограниченные вычислительные ресурсы
  • Критична интерпретируемость модели

Будущее диффузионных моделей в криптоаналитике

Диффузионные модели в финансах — это как криптовалюты в 2010 году. Технология сырая, ресурсоёмкая, но потенциал огромен. Уже сейчас мы видим гибридные подходы: DDPM + Transformer, диффузия + reinforcement learning, conditional diffusion для market regimes.

Следующий прорыв ожидается в области multimodal диффузии — модели, которые будут учитывать не только цены, но и новости, социальные сигналы, on-chain метрики. Представьте диффузионную модель, которая "видит" корреляцию между твитом Илона Маска и движением Dogecoin.

Заключение: диффузия как эволюция, а не революция

Диффузионные модели не заменят классические подходы к прогнозированию криптовалют. Они их дополнят. LSTM останется для быстрых прогнозов, ARIMA — для стационарных участков, а диффузия возьмёт на себя генерацию сценариев и работу с экстремальной волатильностью.

Главный урок: в мире криптовалют нет серебряных пуль. Есть только грамотная комбинация инструментов, глубокое понимание рынка и здоровый скептицизм к любым "революционным" решениям. Диффузионные модели — мощный инструмент, но помните: они всего лишь пытаются найти паттерны в хаосе. А хаос, как известно, не очень любит, когда его предсказывают.

P.S.: Если ваша диффузионная модель показывает 95% accuracy на прогнозировании Bitcoin — проверьте код дважды. Скорее всего, где-то затесался data leakage 😉

MarketMaker.cc Team

Количественные исследования и стратегии

Обсудить в Telegram