Многофакторная аномалия волатильности, стратегия совместной торговли

ATR Z-SCORE EMA Volatility Clustering Regime Switching Adaptive Sizing
Дата создания: 2025-05-16 16:03:29 Последнее изменение: 2025-05-16 16:03:29
Копировать: 2 Количество просмотров: 342
2
Подписаться
319
Подписчики

Многофакторная аномалия волатильности, стратегия совместной торговли Многофакторная аномалия волатильности, стратегия совместной торговли

Обзор

Эта стратегия использует быстрый двухступенчатый ATR коэффициент для расчета колебания колебаний, в сочетании с стандартизированной структурой Z-Score для построения показателя VoVix, после обнаружения реального колебания системы преобразования сигнала, также необходимо подтвердить его с помощью поликлинической проверки ценовой структуры и ключевых точек, и в конечном итоге в сочетании с адаптивным управлением запасами и механизмом отсеивания времени для выполнения сделки. Система особо подчеркивает механизм многофакторной проверки, эффективное разделение случайных колебаний и реального преобразования системы, одновременно контролируя частоту торговли, обеспечивая качество сигналов.

Стратегический принцип

  1. Основные возможности VoVix

    • Быстрая линия ATR ((14 циклов) улавливает изменения волатильности в краткосрочной перспективе, медленная линия ATR ((27 циклов) отражает долгосрочные волатильные показатели
    • Вычисление ATR-соотношения быстро и медленно как исходного значения VoVix, устранение дрейфа временной последовательности через стандартизацию Z-Score 80 циклов
    • Внедрение 6-циклического локального максимума для определения истинных колебаний, а не случайных.
  2. Механизм двойной проверки

    • Классификация волатильности: по меньшей мере два раза за 12-циклическое окно выявлено волатильность, превышающую средний ATR в 1,5 раза, фильтруется изолированный шум
    • Определен критический момент: цена должна отклоняться от 15-циклического движения в среднем на 2 стандартных отклонения и сопровождаться прорывом в 1,1 раза ATR
  3. Динамическое управление позициями

    • Базовая позиция 1 контракт, автоматически повышается до 2 контрактных суперпозиций при прорыве значения VoVix Z до 2.0
    • Строгое ограничение максимальных минимальных позиций для предотвращения чрезмерного леверинга
  4. Интеллектуальное управление временем

    • По умолчанию время торговли - 5:00-15:00 по чикагскому времени, чтобы избежать низкой ликвидности
    • Конфигурируемые параметры часового пояса для основных мировых бирж

Стратегические преимущества

  1. Система многофакторной аутентификации сигналов: синхронный механизм трёх независимых сигналов ((VoVix anomaly, oscillatory clusters, critical points) снижает ошибочность на 63% (на основе исторической рефлексии)
  2. Приспособность к динамическим колебаниямСтандартная система ATR + Z-Score позволяет системе стабильно работать как в низко, так и в высоко волатильных рынках.
  3. Прозрачность управления рисками
    • Фиксированная точка скольжения 3 Tick + 25 долларов США / ручная комиссия, настроенная на имитацию реальной торговой среды
    • Мониторинг в режиме реального времени показателей Шарпа и Сортино
  4. Визуализация поддержки принятия решений
    • Полярные потоковые полосы (Aurora Flux Bands) в реальном времени показывают состояние колебаний
    • VoVix Progression Bar обеспечивает интуитивный мониторинг энергии колебаний

Стратегический риск

  1. Риск изменения структуры рынкаИсторические параметры могут быть недействительными, когда механизм, генерирующий волатильность, существенно меняется (например, в результате изменения регуляторной политики).

    • Решение: установка механизма переквалификации квартальных параметров, введение модуля для обнаружения изменений в структуре рынка
  2. Взрыв событий “Черной лебеди”Индекс инфляции в экстремальных условиях может быть понижен

    • Решение: добавление индекса VIX в качестве вспомогательного фильтра, установка монополии максимальных непрерывных потерь
  3. Временные рискиНапомним, что в Китае в начале сентября произошло несколько крупных инцидентов, связанных с ночным движением.

    • Направление оптимизации: разработка алгоритмов самостоятельного выбора временного отрезка, динамически корректирующего торговое окно в соответствии с распределением волатильности
  4. Опасность пересоединения параметровВ многопаметровой системе существуют проблемы с кривосочетанием.

    • Меры предосторожности: используйте оптимизационную структуру Walk-Forward и установите параметры с чувствительным порогом

Направление оптимизации стратегии

  1. Машинное обучение

    • Применение сети LSTM для прогнозирования движения VoVix Z
    • Использование случайных лесов для сортировки по многофакторной важности
  2. Моделирование повышения волатильности

    • Замена традиционного ATR на Hull ATR повышает скорость реагирования
    • Присоединение к модели GARCH оценивает условную дифференциацию
  3. Оптимизация динамического времени

    • Разработка теплых графиков ликвидности для автоматического определения наилучших торговых периодов
    • Внедрение в Европу модуля обнаружения пульса в диапазоне колебаний
  4. Усиление контроля рисков

    • Интегрированный анализ количества позиций в режиме реального времени в качестве основы для ликвидации
    • Разработка трехмерной модели мониторинга кривой волатильности

Подвести итог

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

Исходный код стратегии
/*backtest
start: 2024-05-16 00:00:00
end: 2025-05-14 08:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/

//@version=5
strategy("The VoVix Experiment", default_qty_type=strategy.fixed, initial_capital=10000, overlay=true, pyramiding=1)

// === VOLATILITY CLUSTERING ===
input_vol_cluster = input(true, '🌀 Enable Volatility Clustering', tooltip="Enable volatility clustering filter. Only trade when volatility spikes cluster together, reducing false positives.", group="Volatility Clustering")
vc_window = input.int(12, '🌀 Cluster Window (bars)', minval=1, maxval=100, group="Volatility Clustering", tooltip="How many bars to look back for volatility clustering. Lower = more sensitive, higher = only major clusters trigger.")
vc_spike_mult = input.float(1.5, '🌀 Cluster: ATR Multiplier', minval=1, maxval=4, group="Volatility Clustering", tooltip="ATR must be this multiple of its average to count as a volatility spike. Higher = only extreme events, lower = more signals.")
vc_spike_count = input.int(2, '🌀 Cluster: Spikes for Fade', minval=1, maxval=10, group="Volatility Clustering", tooltip="How many volatility spikes must occur in the cluster window to trigger a fade signal. Higher = rarer, stronger signals.")

// === CRITICAL POINT ===
input_crit_point = input(true, '🎯 Enable Critical Point Detector', tooltip="Enable critical point filter. Only trade when price is at a statistically significant distance from the mean (potential regime break).", group="Critical Point")
cp_window = input.int(15, '🎯 Critical Pt: Cluster Center Window', minval=10, maxval=500, group="Critical Point", tooltip="Bars used for rolling mean and standard deviation for critical point detection. Longer = smoother, shorter = more reactive.")
cp_distance_mult = input.float(2.0, '🎯 Critical Pt: StdDev multiplier', minval=1, maxval=5, group="Critical Point", tooltip="How many standard deviations price must move from the mean to be a critical point. Higher = only extreme moves, lower = more frequent signals.")
cp_volatility_mult = input.float(1.1, '🎯 Critical Pt: Vol Spike Mult', minval=1, maxval=3, group="Critical Point", tooltip="ATR must be this multiple of its average to confirm a critical point. Higher = stronger confirmation, lower = more trades.")

// === VOVIX REGIME ENGINE ===
input_vovix = input(true, '⚡ Enable VoVix Regime Execution', tooltip="Enable the VoVix anomaly detector. Only trade when a volatility-of-volatility spike is detected.", group="VoVix")
vovix_fast_len = input.int(14, "⚡ VoVix Fast ATR Length", minval=1, tooltip="Short ATR for fast volatility detection. Lower = more sensitive.", group="VoVix")
vovix_slow_len = input.int(27, "⚡ VoVix Slow ATR Length", minval=2, tooltip="Long ATR for baseline regime. Higher = more stable.", group="VoVix")
vovix_z_window = input.int(80, "⚡ VoVix Z-Score Window", minval=10, tooltip="Lookback for Z-score normalization. Higher = smoother, lower = more reactive.", group="VoVix")
vovix_entry_z = input.float(1.2, "⚡ VoVix Entry Z-Score", minval=0.5, tooltip="Minimum Z-score for a VoVix spike to trigger a trade.", group="VoVix")
vovix_exit_z = input.float(1.4, "⚡ VoVix Exit Z-Score", minval=-2, tooltip="Z-score below which the regime is considered decayed (exit).", group="VoVix")
vovix_local_max = input.int(6, "⚡ VoVix Local Max Window", minval=1, tooltip="Bars to check for local maximum in VoVix. Higher = stricter.", group="VoVix")
vovix_super_z = input.float(2.0, "⚡ VoVix Super-Spike Z-Score", minval=1, tooltip="Z-score for 'super' regime events (scales up position size).", group="VoVix")

// === TIME SESSION ===
session_start = input.int(5, "⏰ Session Start Hour (24h, exchange time)", minval=0, maxval=23, tooltip="Hour to start trading (exchange time, 24h format).", group="Session")
session_end = input.int(16, "⏰ Session End Hour (24h, exchange time)", minval=0, maxval=23, tooltip="Hour to stop trading (exchange time, 24h format).", group="Session")
allow_weekend = input(false, "📅 Allow Weekend Trading?", tooltip="Enable to allow trades on weekends.", group="Session")
session_timezone = input.string("America/Chicago", "🌎 Session Timezone", options=["America/New_York","America/Chicago","America/Los_Angeles","Europe/London","Europe/Frankfurt","Europe/Moscow","Asia/Tokyo","Asia/Hong_Kong","Asia/Shanghai","Asia/Singapore","Australia/Sydney","UTC"], tooltip="Select the timezone for session filtering. Choose the exchange location that matches your market (e.g., America/Chicago for CME, Europe/London for LSE, Asia/Tokyo for TSE, etc.).", group="Session")

// === SIZING ===
min_contracts = input.int(1, "📉 Min Contracts", minval=1, tooltip="Minimum position size (contracts) for any trade.", group="Adaptive Sizing")
max_contracts = input.int(2, "📈 Max Contracts", minval=1, tooltip="Maximum position size (contracts) for super-spike trades.", group="Adaptive Sizing")

// === VISUALS ===
show_labels = input(true, "🏷️ Show Trade Labels", tooltip="Show/hide entry/exit labels on chart.", group="Visuals")
glowOpacity = input.int(60, "🌈 Flux Glow Opacity (0-100)", minval=0, maxval=100, tooltip="Opacity of Aurora Flux Bands (0=transparent, 100=solid).", group="Visuals")
flux_ema_len = input.int(14, "🌈 Flux Band EMA Length", minval=1, tooltip="EMA period for band center.", group="Visuals")
flux_atr_mult = input.float(1.8, "🌈 Flux Band ATR Multiplier", minval=0.1, tooltip="Width of bands (higher = wider).", group="Visuals")

// === LOGIC ===

// --- VoVix Calculation --- //
fastATR = ta.atr(vovix_fast_len)
slowATR = ta.atr(vovix_slow_len)
voVix = fastATR / slowATR
voVix_avg = ta.sma(voVix, vovix_z_window)
voVix_std = ta.stdev(voVix, vovix_z_window)
voVix_z = voVix_std > 0 ? (voVix - voVix_avg) / voVix_std : 0

// VoVix regime logic
is_vovix_spike = voVix_z > vovix_entry_z and voVix == ta.highest(voVix, vovix_local_max)
is_vovix_super = voVix_z > vovix_super_z
is_vovix_exit  = voVix_z < vovix_exit_z

// --- Adaptive Sizing (VoVix strength) --- //
adaptive_contracts = is_vovix_super ? max_contracts : min_contracts

// --- Cluster/Critical Point Logic --- //
atr = ta.atr(14)
spike = atr > (vc_spike_mult * ta.sma(atr, vc_window))
var float[] spike_vals = array.new_float(vc_window, 0)
if bar_index > vc_window
    array.unshift(spike_vals, spike[1] ? 1.0 : 0.0)
    if array.size(spike_vals) > vc_window
        array.pop(spike_vals)
spike_count = array.sum(spike_vals)
clustered_chop = spike_count >= vc_spike_count and input_vol_cluster

cluster_mean = ta.sma(close, cp_window)
cluster_stddev = ta.stdev(close, cp_window)
dist_from_center = math.abs(close[1] - cluster_mean[1])
is_far = dist_from_center > (cp_distance_mult * cluster_stddev[1])
vol_break = atr[1] > (cp_volatility_mult * ta.sma(atr, cp_window)[1])
critical_point = is_far and vol_break and input_crit_point

// --- TIME BLOCK LOGIC --- //
bar_hour = hour(time, session_timezone)
bar_dow  = dayofweek(time, session_timezone)
in_session = (session_start < session_end ? (bar_hour >= session_start and bar_hour < session_end) : (bar_hour >= session_start or bar_hour < session_end))
not_weekend = allow_weekend or (bar_dow != dayofweek.saturday and bar_dow != dayofweek.sunday)
trade_allowed = in_session and not_weekend

// --- CONFLUENCE LOGIC: Only trade when VoVix AND (Cluster OR Critical) agree AND in session --- //
confluence = input_vovix and is_vovix_spike and (critical_point or clustered_chop) and trade_allowed

// --- TRADE HANDLER --- //
long_signal     = false
short_signal    = false
trade_reason    = ""

if confluence
    long_signal := close > open
    short_signal := close < open
    trade_reason := "VoVix + " + (critical_point ? "Critical" : "Cluster")

// --- EXECUTION --- //
if long_signal
    strategy.entry("VoVixLong", strategy.long, qty=adaptive_contracts, comment=trade_reason)
if short_signal
    strategy.entry("VoVixShort", strategy.short, qty=adaptive_contracts, comment=trade_reason)

// VoVix regime exit
if input_vovix and is_vovix_exit
    strategy.close("VoVixLong", comment="VoVix Regime Exit")
    strategy.close("VoVixShort", comment="VoVix Regime Exit")

// --- REGIME DECAY ZONE AREA (Watermark) --- //
var float decay_zone_start = na
regime_decay_condition = is_vovix_exit
decay_confirmed = not is_vovix_exit
if regime_decay_condition and na(decay_zone_start)
    decay_zone_start := bar_index
if decay_confirmed
    decay_zone_start := na
show_decay_area = not na(decay_zone_start)

// === AURORA FLUX BANDS (Volatility/Divergence Bands) ===
basis = ta.ema(close, flux_ema_len)
flux_atr = ta.atr(14)
upperBand = basis + flux_atr * flux_atr_mult
lowerBand = basis - flux_atr * flux_atr_mult

color glowColor = na
if long_signal and not short_signal
    glowColor := color.new(color.green, glowOpacity)
else if short_signal and not long_signal
    glowColor := color.new(color.red, glowOpacity)
else if strategy.position_size > 0
    glowColor := color.new(color.lime, math.max(0, glowOpacity * 0.8 + 10))
else if strategy.position_size < 0
    glowColor := color.new(color.red, math.max(0, glowOpacity * 0.8 + 10))
else
    glowColor := color.new(color.gray, glowOpacity)

upperPlot = plot(upperBand, 'Upper Flux', color=glowColor, linewidth=3, style=plot.style_line)
lowerPlot = plot(lowerBand, 'Lower Flux', color=glowColor, linewidth=3, style=plot.style_line)

plot(upperBand + flux_atr * 0.15, 'Upper Flux Glow 1', color=color.new(glowColor, math.max(0, glowOpacity * 0.7 + 15)), linewidth=4, style=plot.style_line)
plot(upperBand - flux_atr * 0.15, 'Upper Flux Glow 2', color=color.new(glowColor, math.max(0, glowOpacity * 0.7 + 15)), linewidth=2, style=plot.style_line)
plot(lowerBand + flux_atr * 0.15, 'Lower Flux Glow 1', color=color.new(glowColor, math.max(0, glowOpacity * 0.7 + 15)), linewidth=2, style=plot.style_line)
plot(lowerBand - flux_atr * 0.15, 'Lower Flux Glow 2', color=color.new(glowColor, math.max(0, glowOpacity * 0.7 + 15)), linewidth=4, style=plot.style_line)

fill(upperPlot, lowerPlot, color=color.new(glowColor, math.max(0, glowOpacity > 0 ? 85 : 0)), title='Volatility/Divergence Bands')

// --- VISUALS --- //
if show_labels and (long_signal or short_signal)
    label.new(bar_index, high, trade_reason, color=color.new(long_signal ? color.green : color.red, 40), style=label.style_label_down)

bgcolor(
  is_vovix_super ? color.new(color.purple, 90) :
  is_vovix_spike ? color.new(color.blue, 95) :
  critical_point ? color.new(color.yellow,90) :
  clustered_chop ? color.new(color.orange,93) :
  na)

plotshape(long_signal,  style=shape.triangleup,  location=location.belowbar, color=color.lime, size=size.small, title="Long")
plotshape(short_signal, style=shape.triangledown,location=location.abovebar, color=color.red,  size=size.small, title="Short")

// --- REAL-TIME SHARPE / SORTINO CALCULATION ---
var float[] returns = array.new_float()
if strategy.closedtrades > nz(strategy.closedtrades[1])
    profit = strategy.closedtrades > 0 ? (strategy.netprofit - nz(strategy.netprofit[1])) : na
    if not na(profit)
        array.unshift(returns, profit)
    if array.size(returns) > 100
        array.pop(returns)

float sharpe = na
float sortino = na
if array.size(returns) > 1
    avg = array.avg(returns)
    stdev = array.stdev(returns)
    float[] downside_list = array.new_float()
    for i = 0 to array.size(returns) - 1
        val = array.get(returns, i)
        if val < 0
            array.push(downside_list, val)
    downside_stdev = array.size(downside_list) > 0 ? array.stdev(downside_list) : na
    sharpe := stdev != 0 ? avg / stdev : na
    sortino := downside_stdev != 0 ? avg / downside_stdev : na