Индикатор для QUIK - фильтрация Калмана

Скрипт Lua для QUIK: Адаптивный индикатор фильтрации Калмана

В отличие от классических скользящих средних, которые используют фиксированное временное окно и неизбежно запаздывают, современные алгоритмы математической фильтрации динамически подстраиваются под волатильность рынка. В этом материале мы публикуем готовый и проверенный высокоскоростной скрипт на языке Lua для торгового терминала QUIK от брокера Финам. Этот индикатор реализует метод фильтрации Калмана (Kalman Filter) для сглаживания цен и автоматического построения адаптивных динамических каналов вокруг спреда на Московской бирже (MOEX).

Технический разбор переменных и структуры алгоритма

Данный QLua-скрипт оптимизирован под мгновенную обработку тиковых обновлений из биржевого стакана ордеров и работает без создания лишней нагрузки на процессор. Логика индикатора опирается на непрерывный цикл прогнозирования и корректировки данных, где ключевую роль играют параметры внутренней математической модели (доступные в таблице настроек Settings):

  • Q (Шум процесса / Process Noise): Коэффициент изменчивости самой системы. Чем ниже это значение (например, 0.001), тем более гладкой и консервативной будет центральная линия индикатора.
  • R (Шум измерений / Measurement Noise): Коэффициент ложного рыночного шума. Чем выше данный параметр, тем сильнее фильтр игнорирует случайные хаотичные всплески и микро-манипуляции ценой в стакане.
  • Multiplier (Множитель отклонения): Коэффициент ширины динамического канала (стандартно равен 2), который строит верхнюю и нижнюю границы на основе скользящей дисперсии ошибки предсказания.

Готовый Lua-код фильтра Калмана для QUIK

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

Settings = {
    Name = "Kalman Filter Spread",
    Q = 0.001,      
    R = 0.1,        
    Multiplier = 2, 
    line = {
        {Name = "Kalman Mean", Type = TYPE_LINE, Color = RGB(0, 128, 255), Width = 2},
        {Name = "Upper Band", Type = TYPE_LINE, Color = RGB(255, 0, 0), Width = 1},
        {Name = "Lower Band", Type = TYPE_LINE, Color = RGB(0, 192, 0), Width = 1}
    }
}

local x_est = {} 
local p_est = {} 
local variance = {} 

function Init()
    return 3
end

function OnCalculate(index)
    local price = C(index)
    
    if price == nil then 
        return nil, nil, nil 
    end

    if index == 1 then
        x_est[index] = price
        p_est[index] = 1.0
        variance[index] = 0
        return price, price, price
    end

    local x_pred = x_est[index - 1] or price
    local p_pred = (p_est[index - 1] or 1.0) + Settings.Q

    local k_gain = p_pred / (p_pred + Settings.R) 
    local current_x = x_pred + k_gain * (price - x_pred)
    local current_p = (1 - k_gain) * p_pred

    x_est[index] = current_x
    p_est[index] = current_p

    local diff = price - current_x
    local alpha = 0.05 
    local prev_var = variance[index - 1] or 0
    variance[index] = (1 - alpha) * prev_var + alpha * (diff * diff)

    local std_dev = math.sqrt(variance[index])
    local upper_band = current_x + (Settings.Multiplier * std_dev)
    local lower_band = current_x - (Settings.Multiplier * std_dev)

    return current_x, upper_band, lower_band
end

Инструкция по установке скрипта в QUIK от Финама

Чтобы запустить и развернуть индикатор на рабочем пространстве своего терминала, выполните следующие шаги:

  1. Создайте на компьютере пустой текстовый файл, скопируйте в него этот код и сохраните под именем kalman_filter.lua. Проверьте, чтобы расширение файла было строго .lua, а не .txt.
  2. Поместите готовый файл в специализированную системную папку LuaIndicators, которая находится внутри корневой директории вашего QUIK. Если такой папки нет, создайте ее вручную.
  3. Откройте в терминале график нужного вам арбитражного спреда (например, предварительно построенный математический график разницы цен акций и фьючерсов).
  4. Нажмите правой кнопкой мыши по окну графика, выберите «Добавить индикатор» и в самом низу списка пользовательских скриптов найдите "Kalman Filter Spread". Индикатор наложится тремя линиями прямо на ценовой график спреда.

Правила чтения сигналов и риск-менеджмент

Индикатор наносит на график центральную сглаженную линию (Kalman Mean), верхнюю красную границу (Upper Band) и нижнюю зеленую границу (Lower Band). Реализуя стратегии арбитража, трейдер должен использовать этот канал волатильности для фиксации крайних рыночных неэффективностей:

В моменты, когда текущая рыночная линия спреда пробивает верхнюю красную границу, алгоритм сигнализирует о чрезмерном математическом отклонении цены вверх. Это зона для одновременного входа в шорт дорогого фьючерса и лонг дешевой акции через Единый денежный счет (ЕДС). Пробитие нижней зеленой границы указывает на зону покупки спреда. Фиксация чистой прибыли происходит в момент возврата графика к центральной синей линии, где система приходит в баланс. Строгий риск-менеджмент подразумевает закрытие позиций вручную или роботом, если спред «залипает» за границами канала дольше расчетного времени.

Чтобы изучить подробную теоретическую базу этого метода фильтрации, читайте статью в категории «Теории и обзоры», а запустить другие утилиты и скопировать промпты для написания торговых ботов вы можете в разделе «Сервисы и ИИ для арбитража».

Похожие материалы

Линейный индикатор Z-Score календарных спредов для QUIK