В отличие от классических скользящих средних, которые используют фиксированное временное окно и неизбежно запаздывают, современные алгоритмы математической фильтрации динамически подстраиваются под волатильность рынка. В этом материале мы публикуем готовый и проверенный высокоскоростной скрипт на языке 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 от Финама
Чтобы запустить и развернуть индикатор на рабочем пространстве своего терминала, выполните следующие шаги:
- Создайте на компьютере пустой текстовый файл, скопируйте в него этот код и сохраните под именем
kalman_filter.lua. Проверьте, чтобы расширение файла было строго .lua, а не .txt. - Поместите готовый файл в специализированную системную папку
LuaIndicators, которая находится внутри корневой директории вашего QUIK. Если такой папки нет, создайте ее вручную. - Откройте в терминале график нужного вам арбитражного спреда (например, предварительно построенный математический график разницы цен акций и фьючерсов).
- Нажмите правой кнопкой мыши по окну графика, выберите «Добавить индикатор» и в самом низу списка пользовательских скриптов найдите "Kalman Filter Spread". Индикатор наложится тремя линиями прямо на ценовой график спреда.
Правила чтения сигналов и риск-менеджмент
Индикатор наносит на график центральную сглаженную линию (Kalman Mean), верхнюю красную границу (Upper Band) и нижнюю зеленую границу (Lower Band). Реализуя стратегии арбитража, трейдер должен использовать этот канал волатильности для фиксации крайних рыночных неэффективностей:
В моменты, когда текущая рыночная линия спреда пробивает верхнюю красную границу, алгоритм сигнализирует о чрезмерном математическом отклонении цены вверх. Это зона для одновременного входа в шорт дорогого фьючерса и лонг дешевой акции через Единый денежный счет (ЕДС). Пробитие нижней зеленой границы указывает на зону покупки спреда. Фиксация чистой прибыли происходит в момент возврата графика к центральной синей линии, где система приходит в баланс. Строгий риск-менеджмент подразумевает закрытие позиций вручную или роботом, если спред «залипает» за границами канала дольше расчетного времени.
Чтобы изучить подробную теоретическую базу этого метода фильтрации, читайте статью в категории «Теории и обзоры», а запустить другие утилиты и скопировать промпты для написания торговых ботов вы можете в разделе «Сервисы и ИИ для арбитража».