Kinetic Detrender: торговый индикатор средней реверсии

Наука всегда была искусным источником вдохновения для построения индикаторов. От физических теорий до обработки сигналов или математики, многие индикаторы используют концепции, обычно применяемые в основных областях, таких как машиностроение, электроника, вероятности … Мы уже обсуждали в разделе «Интеллектуальный анализ данных» блога Superalgos об использовании термодинамической и информационной теории для создания индикаторов и подробно показали, как использовать статистические и вероятностные инструменты, такие как сокращенный нормальный закон, чтобы воспользоваться событиями с низкой вероятностью.

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

Краткое определение гармонического осциллятора

Гармонический осциллятор — это идеальный осциллятор, описываемый синусоидальной функцией. Энергия гармонического осциллятора сохраняется с течением времени и записывается как:

С

как энергия сохраняется с течением времени.

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

Адаптация энергетической формулы к ценовому осциллятору

Рассматривая ранее данное определение гармонического осциллятора, мы должны определить кинетическую составляющую и потенциальную составляющую для нашего ценового осциллятора. Мы определяем скорость осциллятора как скорость изменения, а положение к равновесию как отношение расстояния цены к ее скользящей средней.

Кинетическая энергия цены записывается так:

А потенциальная энергия выглядит так:

С

и

где L — количество периодов для расчета скорости изменения, а P — количество периодов для расчета EMA по цене закрытия.

Затем суммарная энергия ценового осциллятора задается следующим образом:

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

Скользящая средняя и стандартное отклонение E будут рассчитываться в течение 20 периодов.

Используя Knime Analytics, мы перешли к расчету Z на BTC/USDT на случайно выбранный период, с L = 10 и P = 21.

График показывает полностью бестрендированное поведение. Мы добавили две горизонтальные линии при +/- 1,6, образуя зону, соответствующую 94,5% вероятности возникновения значения в соответствии с таблицами сводного нормального права. Мы наблюдаем четкое колебательное поведение, соответствующее ценовым циклам ее скользящей средней. Красные и зеленые стрелки показывают точки, где осциллятор соответственно пересекает верхнюю границу и пересекает нижнюю границу, соответствующую точке, в которой колебание цены находится на своем максимуме/минимуме. Поскольку результаты кажутся немного шумными, хорошим улучшением было бы применение неотстающего фильтра нижних частот или многополюсного фильтра, такого как фильтры Баттерворта или Лагерра, и вместо или в дополнение к фиксированным уровням мы также могли бы использовать динамические полосы с кратным стандартным отклонением Z.

Реализация Кинетического детрендера Superalgos

Кинетический детрендер был реализован в Superalgos с фиксированными верхним и нижним уровнями и динамическими диапазонами волатильности.

Код довольно прост и не требует огромного количества строк кода.

Он начинается со стандартных определений указателя свечи и объявления константы:

let candle = record.current
let len = 10
let P = 21
let T = 20
let up = 1.6
let low = 1.6

Вверх и минимум являются соответственно константой для расчета верхней и нижней динамических полос волатильности

Приступаем к инициализации предыдущего значения для EMA:

if (variable.prevEMA === undefined) {
    variable.prevEMA = candle.close
}

И вычисление EMA с функцией (стоит отметить, что функция объявлена в конце фрагмента кода в Superalgos):

variable.ema = calculateEMA(P, candle.close, variable.prevEMA)//EMA calculation
function calculateEMA(periods, price, previousEMA) {
    let k = 2 / (periods + 1)
    return price * k + previousEMA * (1 - k)
}

Скорость изменения рассчитывается путем предварительного хранения нужного количества значений цены закрытия и перехода к расчету путем деления текущей цены закрытия на первого члена массива цен закрытия:

variable.allClose.push(candle.close)
if (variable.allClose.length > len) {
    variable.allClose.splice(0, 1)
}if (variable.allClose.length === len) {
    variable.roc = candle.close / variable.allClose[0]
} else {
    variable.roc = 1
}

Наконец, энергия получается с помощью простой линии:

variable.E = 1 / 2 * len * variable.roc + 1 / 2 * P * candle.close / variable.ema

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

variable.allE.push(variable.E)if (variable.allE.length > T) {
    variable.allE.splice(0, 1)
}variable.sum = 0
variable.SQ = 0
if (variable.allE.length === T) {
    for (var i = 0; i < T; i++) {
        variable.sum += variable.allE[i]
    }
    variable.MA = variable.sum / Tfor (var i = 0; i < T; i++) {
        variable.SQ += Math.pow(variable.allE[i] - variable.MA, 2)
    }
    variable.sigma = Math.sqrt(variable.SQ / T)variable.Z = (variable.E - variable.MA) / variable.sigma
} else {
    variable.Z = 0
}variable.allZ.push(variable.Z)
if (variable.allZ.length > T) {
    variable.allZ.splice(0, 1)
}variable.sum = 0
variable.SQ = 0
if (variable.allZ.length === T) {
    for (var i = 0; i < T; i++) {
        variable.sum += variable.allZ[i]
    }
    variable.MAZ = variable.sum / Tfor (var i = 0; i < T; i++) {
        variable.SQ += Math.pow(variable.allZ[i] - variable.MAZ, 2)
    }
    variable.sigZ = Math.sqrt(variable.SQ / T)
} else {
    variable.MAZ = variable.Z
    variable.sigZ = variable.MAZ * 0.02
}variable.upper = variable.MAZ + up * variable.sigZ
variable.lower = variable.MAZ - low * variable.sigZ

И мы не забываем, конечно, обновить предыдущее значение для EMA:

variable.prevEMA = variable.EMA

Заключение

Используя простую теорию гармонических осцилляторов, мы показали возможность построения детрендированного осциллятора для выделения возможностей возврата средних значений. Кинетический детрендер состоит из основной линии, колеблющейся между 2 фиксированными уровнями, обрамляющими 95% значений, и 2 динамическими уровнями, что приводит к автоадаптативным зонам, показывающим возможности среднего возврата.

Кинетический индикатор детрендера можно найти в майне данных Normalized Momentum в Superalgos.

Все материалы, представленные здесь, могут быть повторно использованы и интегрированы свободно при условии ссылки на эту статью и веб-сайт Superalgos.

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

Источник