В 2026 году «купил и держал» это ставка на то, что выдержишь -40…-70% просадку без эмоционального или маржинального выхода. Рынок стал хрупким: каскады ликвидаций случаются несколько раз в год. Статичный холд больше не работает.

Что такое опционы

Если вы купили акцию за 100 долларов и она выросла на 10 %, у вас +10 долларов - всё просто и линейно. С опционами всё иначе. Опцион это обязательство продать акцию потом по фиксированной цене. Их цена меняется неравномерно: то медленно, то очень резко. Эта «кривизна» и есть главная особенность. Чем дальше до истечения опциона, тем больше этой кривизны «накоплено». Ближе к экспирации она исчезает - время работает против держателя.

Плавное движение vs. внезапные прыжки

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

Как подстраивают позицию

Есть две большие группы клиентов:

Первая группа - пенсионные фонды и банки.
Они покупают опционы на падение, чтобы красиво отчитаться перед начальством/вкладчиками: «да, рынок упал, но у нас защита, убытки нереализованные».

Вторая группа - вкладчики компании.
Покупают продукты типа «защищённый рост»: если рынок сильно растёт - получаешь часть прибыли, если падает - ничего не теряешь (по крайней мере на бумаге).

Получается вилка - если цена растёт мы купим по более выгодной цене. Если цена падает у нас открыт SHORT от другого вкладчика

Конфликт интересов

Экономика хедж-фондов создаёт специфическую структуру стимулов.

Хедж-фонд не гарантирует покрытие убытков.

2% management fee - забирают независимо от результата, даже если клиент в минусе 20% performance fee - только с прибыли (high-water mark обычно) Убытки - несёт клиент полностью

Первая часть (2% от AUM) - это "оклад за время". Чем дольше деньги в фонде и чем больше AUM, тем больше гарантированный доход.

Фонду выгодно:

  1. Привлечь больше денег (больше AUM → больше 2%)

  2. Держать деньги дольше (2% капает каждый год)

  3. Показать прибыль (получить 20% от неё)

Цели 2 (держать дольше) и 3 (генерировать прибыль) конфликтуют. Фонд может держать позиции с низким риском годами, собирать 2% и не гнаться за performance fee. Многие так и делают.

Это создаёт несоответствие: фонд выигрывает от длинных периодов удержания, а капитал клиента остаётся под хвостовым риском.

Как возникают каскады и «внезапные» обвалы

Когда сразу много участников вынуждены закрывать позиции - цена начинает двигаться сама по себе, усиливая давление. Один большой гэп → хедж не успевает → большой минус → ещё больше вынужденных продаж → ещё больший гэп. Так получались известные обвалы: 2008, март 2020 и десятки локальных историй.

Как защититься от падения

Чтобы уменьшить вероятность попадания в GAP нужно снизить время нахождения капитала в позиции

Компромис

Для баланса между временем удержания позиции и доходностью акции можно было бы мониторить настроения рынка. Это не работает

  1. Нет авторитетов: Настроение рынка формируется не постами одного блогера, а выборкой постов показываемая всем посетителям алгоритмом рекомендаций

  2. Нет деанонимизации: Нет возможности различить 10 перефразированных постов с одним мнением одного человека от 10 постов с разными мнениями разных людей

Согласно гипотезе эффективного рынка из работы Eugene Fama, японские свечи уже включают в себя реакцию рынка на новости. Дело в том, что трейдер покупает на слухах и продаёт на новостях. В этом можно убедиться на практике, открыв TradingView после наступления новости: иконка с молнией (Latest News) всегда содержит предшествующее продолжительное движение цены сразу на много пунктов

Что делать частному лицу

Вместо долгого холда - адаптивная система

  1. Берёт скелет стратегии с определённой логикой входа

  2. Прогоняет бэктест на свежих данных (скользящее окно)

  3. ИИ Анализирует логи исполнения: где сигналы работали, где нет

  4. Модифицирует параметры на основе детекции режима

  5. Повторяет

Пример скелета:

  • Определить направление на таймфрейме 4H

  • Дождаться распространённого ритейл-сигнала на 15M (куда входит алго-поток)

  • Если 15M сигнал совпадает с 4H направлением - проверить прогноз волатильности

  • Использовать модели реализованной волатильности (варианты GARCH, HAR-RV) с критерием QLIKE для выбора

  • Если σ > порога, покрывающего комиссии и проскальзывание - входить

  • R:R 1:1, масштабировать выход после breakeven

Примеры кода:

На длительном временном промежутке если это сведется к 50/50 с суммой 0 без прибыли по гипотеза эффективного рынка: любая публичная информация (включая паттерны, индикаторы, сигналы) уже в цене. Если RSI oversold "работает", то арбитраж будет покупать до того, как RSI достигнет 30, размывая сигнал.Стратегию нужно обновлять

Ключевое: нужно срезать в 0 время на бектест стратегии через self reinforcement runtime и ИИ так как ставка на временные неэффективности и режимную адаптацию

Адаптивный цикл не имеет состояния «готово» - параметры пересчитываются на каждой итерации под текущий режим рынка.

Фильтр волатильности (garch):

import { predict } from 'garch'; // https://www.npmjs.com/package/garch
import { getCandles } from 'backtest-kit'; // https://www.npmjs.com/package/backtest-kit

const candles = await getCandles(symbol, '15m', 300);
const { sigma, reliable, upperPrice, lowerPrice } = predict(candles, '15m');

// sigma - ожидаемое движение цены (0.012 = 1.2%)
// reliable - сошлась ли модель
// upperPrice / lowerPrice - +-1 sigma коридор для следующей свечи

if (!reliable) return null;  // модель не адекватна данным
if (sigma < 0.01) return null;  // движение < 1%, не окупит fees и slippage

// upperPrice и lowerPrice используем как TP/SL
return { upperPrice, lowerPrice }

Связка в JavaScript:

import {
  addExchangeSchema,
  addStrategySchema,
  addActionSchema,
  Cache,
  Constant,
  commitPartialProfit,
  getCandles,
} from "backtest-kit";

import { extract, run, toSignalDto, File } from "@backtest-kit/pinets";
import { predict } from 'garch';

const getPlotHigher = Cache.fn(
  async (symbol) => {
    return await run(File.fromPath("timeframe_4h.pine"), {
      symbol,
      timeframe: "4h",
      limit: 100,
    });
  },
  { interval: "4h", key: ([symbol]) => symbol },
);

const getDataHigher = async (symbol) => {
  const plots = await getPlotHigher(symbol);
  return extract(plots, {
    allowLong: "AllowLong",
    allowShort: "AllowShort",
    allowBoth: "AllowBoth",
    noTrades: "NoTrades",
  });
};

const getPlotLower = Cache.fn(
  async (symbol) => {
    return await run(File.fromPath("timeframe_15m.pine"), {
      symbol,
      timeframe: "15m",
      limit: 100,
    });
  },
  {
    interval: "15m",
    key: ([symbol]) => `${symbol}`,
  },
);

const getDataLower = async (symbol) => {
  const plots = await getPlotLower(symbol);
  return extract(plots, {
    position: "Signal",
    priceOpen: "Close",
    priceTakeProfit: "TakeProfit",
    priceStopLoss: "StopLoss",
    minuteEstimatedTime: "EstimatedTime",
  });
};

addStrategySchema({
  strategyName: "main_strategy",
  interval: "5m",
  getSignal: async (symbol) => {
    const data_higher = await getDataHigher(symbol);

    if (data_higher.noTrades) {
      return null;  // ADX < 25, боковик
    }

    const data_lower = await getDataLower(symbol);

    if (data_lower.position === 0) {
      return null;  // нет сигнала
    }

    // Фильтр: не входим против старшего таймфрейма
    if (data_higher.allowShort && data_lower.position === 1) {
      return null;
    }
    if (data_higher.allowLong && data_lower.position === -1) {
      return null;
    }

    const {
      upperPrice, 
      lowerPrice
    } = predict(
      await getCandles(symbol, '15m', 300),
      '15m'
    );

    // Long: TP = upperPrice, SL = lowerPrice
    // Short: TP = lowerPrice, SL = upperPrice
    const isLong = data_lower.position === 1;
    const tp = isLong ? upperPrice : lowerPrice;
    const sl = isLong ? lowerPrice : upperPrice;

    const signal = await toSignalDto(signalId, data_lower, null); 
    
    Object.assign(signal, {
      priceTakeProfit: tp,
      priceStopLoss: sl,
    });

    return signal;
  },
});

Управление позицией:

addActionSchema({
  actionName: "partial_profit_action",
  handler: class {
    async partialProfitAvailable({ symbol, level }) {
      if (level === Constant.TP_LEVEL3) {
        await commitPartialProfit(symbol, 33);
      }
      if (level === Constant.TP_LEVEL2) {
        await commitPartialProfit(symbol, 33);
      }
      if (level === Constant.TP_LEVEL1) {
        await commitPartialProfit(symbol, 34);
      }
    }
  },
});

addActionSchema({
  actionName: "breakeven_action",
  handler: class {
    async breakevenAvailable({ symbol, currentPrice }) {
      // Снижаем trailing-stop после breakeven
      await commitTrailingStop(symbol, -3, currentPrice);
    }
  }
});

Выход частями: 33% на каждом уровне TP. Это фиксирует прибыль до разворота. После breakeven - снижаем SL, чтобы не потерять накопленное.

Спасибо за внимание