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

В 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 тест с синтетическими данными известной волатильности
