О прогнозе нейтрального тренда актива

В backtest-kit GARCH используется как один из источников в графе сигналов. Идея: вход открывается только если GARCH-канал достаточно широк, чтобы TP и SL уместились с запасом над комиссиями.
Например, этим можно законтрить боковик, который был на BTCUSDT в Феврале 2024
5–10 февраля, 73% нейтральных баров
11–16 февраля, 63% нейтральных баров
19–24 февраля, 75% нейтральных баров
26–29 февраля, 69% нейтральных баров
Пример кода
import { sourceNode, outputNode } from '@backtest-kit/graph';
import { predict } from 'garch';
import { getCandles } from 'backtest-kit';
const CANDLES_FOR_GARCH = 300;
const GARCH_CONFIDENCE = 0.6827; // ±1σ
const garchSource = sourceNode(
Cache.fn(
async (symbol) => {
const candles = await getCandles(symbol, '8h', CANDLES_FOR_GARCH);
return predict(candles, '8h', null, GARCH_CONFIDENCE);
},
{ interval: '8h', key: ([symbol]) => symbol },
),
);
const entrySignal = outputNode(
async ([trend, volume]) => {
// Пропускаем если модель не сошлась
if (!volume.reliable) return null;
// Проверяем что до границ канала достаточно места
const upperDiff = percentDiff(trend.close, volume.upperPrice);
const lowerDiff = percentDiff(trend.close, volume.lowerPrice);
if (upperDiff < TAKE_PROFIT_PERCENT) return null;
if (lowerDiff < STOP_LOSS_PERCENT) return null;
// TP и SL по границам GARCH-канала
const tp = trend.position === 'long' ? volume.upperPrice : volume.lowerPrice;
const sl = trend.position === 'long' ? volume.lowerPrice : volume.upperPrice;
return { position, priceOpen: trend.close, priceTakeProfit: tp, priceStopLoss: sl };
},
trendSource,
garchSource,
);GARCH здесь не генерирует направление. Он отвечает только на вопрос «достаточно ли ожидаемое движение». Направление приходит от другого источника (это может быть Pine Script через @backtest-kit/pinets или LLM через @backtest-kit/ollama)
Ключевые детали
Parkinson estimator для per-candle RV:
(1/4ln2) · ln(H/L)²— в ~5× эффективнее squared returnsLog-normal bands:
P·exp(±z·σ)— не линейное приближение, правильное маппирование в ценовое пространствоreliable: trueкогда: оптимизатор сошёлся + persistence < 0.999 + Ljung-Box p ≥ 0.05Оптимизация: multi-start Nelder-Mead, GARCH — 4 рестарта, NoVaS — 7 (11-мерная задача)
932 теста, включая ground-truth тест с синтетическими данными известной волатильности














