Дизайн

Як влаштовані технічні індикатори на фондових ринках

Будь-хто коли-небудь цікавився фондовими або криптовалютными ринками бачив ці додаткові лінії. І ви напевно чули думки від досвідчених трейдерів про те, що вони не працюють і як вони не використовують нічого. Але багатьом вони дуже допомагають і мій торговий термінал, в який я ліниво дивлюся раз в день, виглядає приблизно як на картинці нижче.

Як же все таки вони влаштовані? І кому це може бути корисно? Вам безумовно з цим слід ознайомитися, якщо:

  1. Ви ними користуєтеся у своїй торгівлі
  2. Ви плануєте написати торгового робота
  3. Ви хочете реалізувати торгову стратегію самі

Індикатори, це найчастіше віконна, вагова або рекурентна функція від цін та обсягів, які приходять з біржі у форматі масиву свічок TOHLCV (unix time, open, high, low, close, volume). Так само можуть використовуватися різні фільтрації, максимуми-мінімуми або інші індикатори як основа для подальших обчислень.

Змінна середня (SMA)

При реалізації індикаторів дуже зручно використовувати функціональний підхід програмування. Наприклад, змінна середня, це всього лише середнє значення від кожного значення ковзної віконної функції на ціні закриття

function sma($close window) {
 return rolling(x => mean(x), window, $close);
}

де функція mean() середнє значення, параметор window — розмір вікна, а rolling() це комбінація віконної функції, яка для кожної поточної комірки масиву видає масив з останніх n елементів, і операції, яка згортає вікно до числа.

function rolling(operation, window, array) {
 let result = [];
 for (let i = 0; i < array.length; i++) {
 if (i + 1 < window) {
result.push(NaN);
 } else {
 result.push(operation(array.slice(i + 1 - window, i + 1)));
}
}
 return result;
}

Змінна середня є запаздывающим індикатором і допомагають визначити тренд. Вона малюється накладенням поверх графіка цін і перші значення зазвичай зазвичай відкидаються. Зазвичай розглядають пару идникаторов і точка, коли идикатор з коротким вікном перетинає идикатор з довгим вікном знизу розглядається як потенційна точка входу, і зверху — виходу. На практиці частіше використовують експоненціально зважену ковзну середню, застосовуючи вагову віконну функцію, що б зменшити ефект запізнювання.

Середньоквадратичне відхилення (STDEV)

Якщо ми замінимо в попередньому варіанті функцію mean() на корінь з дисперсії sd(), то отримаємо вже ковзне середньоквадратичне відхилення.

function stdev($close window) {
 return rolling(x => sd(x), window, $close);
}

Дисперсія вважається звичайним всім відомим способом, найчастіше без корекції Бесселя. Так само використовується саме корінь з дисперсії, так як сама дисперсія вимірюється в квадратних гривнях/доларах.

Смуги Боллинджера (BB)

Таким чином ми вже отримали два базові індикатори, які вже можна комбінувати і отримувати нові. Наприклад, якщо поточечно скласти ковзну середню і середньоквадратичне відхилення, при цьому домножив на 2, то ми отримаємо верхню частину смуги Боллинджера, а якщо відняти — нижню.

У коді це буде виглядати так

function bb($close window, mult) {
 let middle = sma($close window);
 let upper = pointwise((a, b) => a + b * mult, middle, stdev($close window));
 let lower = pointwise((a, b) => a - b * mult, middle, stdev($close window));
 return { lower : lower, upper : upper};
}

де функція pointwise, нічого іншого не робить, окрім як поелементно збирає з двох масивів один, використовуючи дану їй операцію.

Смуги Боллинджера допомагають визначити затишшя перед великим рухом ціни, і використовуються як інструмент для зручного відображення волатильності на графіку, середньоквадратичне відхилення не відобразити накладенням на одному графіку з ціною, тому його зручно відкладати від ковзної середньої.

ПриміткаУ цього індикатора є один недолік — він використовує експоненційно зважені функції. Як вправу, можете спробувати самостійно перетворення, не забувайте враховувати, що стандартне відхилення теж потрібно вираховувати експоненціально виважено.

Експоненційно зважена середня змінна (EMA)

Як можна зменшити запізнювання ковзної середньої? Так як при її обчисленні складається n останніх цін закриття, можна зрозуміти що можна складати з вагою, зменшуючи внесок старих цін. Таким чином ми приходимо до формули зваженої віконної функції.

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

Так строго высчитается зважена ковзна середня. Але в сучасних торговельних системах існує два типи розрахунку ema. Так як можна значно спростити обчислення, якщо не враховувати внесок хвостів. Розширивши розмір вікна на всю довжину і переобозначив константу, можна помітити, що наступний член рекуррентно виводиться через попередній.

при цьому константу зазвичай вибирають рівною , а за початковий відлік вибирають середнє значення.

function ema($close window, weight = null) {
 weight = weight ? weight : 2 / (window + 1);
 let ema = [ mean($close.slice(0, window)) ];
 for (let i = 1; i < $close.length; i++) {
 ema.push($close[i] * weight + ema[i - 1] * (1 - weight));
};
 return ema;
}

В цілому ця та ж змінна середня, але більш чутлива. Ефективність використання залежить від вашого досвіду і настройок. Наприклад на цьому сайті досить вдало підібрані параметри.

Сходження/розходження ковзних середніх (MACD)

Джеральд Аппель в 1979 році придумав один з найпростіших і в той же час ефективних осциляторів цінових моментів. Він перетворює два трендових індикатора EMA в індикатор моментів, беручи з двох світів найкраще. Тобто він, грубо кажучи, знаходить похідну. Малюється він в окремому вікні двома лініями і гістограмою, а не накладенням, як попередні. Насправді індикаторів які малюються в окремому вікні значно більше, але про це може бути як небудь іншим разом.

Формула розрахунку досить проста, беруться дві ema з динным і коротким вікном, наприклад в 26 і 12 одиниці, і віднімаються, отримана лінія і буде шуканим індикатором. Взявши від цієї різниці ще одну ema c кроком в 3 одиниці отримаємо сигнальну лінію. Гістограма, яку Джеральд додав пізніше вираховується різницею між двома попередніми результатами і по суті є середньозваженою похідної.

function macd($close, wshort, wlong, wsig) {
 let line = pointwise((a, b) => a - b, ema($close, wshort), ema($close, wlong));
 let signal = ema(line, wsig);
 let hist = pointwise((a, b) => a - b, line, signal);
 return { line : line, signal : signal, hist : hist };
}

Тестування індикаторів, нормована середньоквадратична помилка

Маючи точні таблиці зі значенням індикаторів, можна якісно протестувати ваш розрахунок. Існують різні способи визначення заходів помилки між двома функціями, але практика показала що нормована середньоквадратична помилка, яка вважається як

краще всього працює, як при малих величинах, так і при великих. Наприклад биткоин в доларах може коштувати 20000$ і різниця в 10$ не критична, в той же час один альткоин можлива обчислюватися декількома сатошами.

function nrmse(f, g) {
 let sqrDiff = pointwise((a, b) => (a - b) * (a - b), f, g);
 return Math.sqrt(mean(sqrDiff)) / (Math.max(...f) - Math.min (f...));
}

Висновок

Так в декілька рядків можна виразити базові індикатори, якщо ви плануєте виконувати їх аналіз машинним навчанням, то для визначення ідеальних точок входу раджу звернути увагу на індикатор ZigZag, який не є корисним для торгівлі, але виключно корисний в якості вчителя. Слід так само враховувати, що вам для торгівлі потрібно вибирати максимально не схожі один на одного идикаторы і пробувати змінювати вхідні параметри. Можна спробувати автоматично змінювати їх у часі, так як максимально ефективним параметрами властиво зміняться.

Використані джерела

1. StockCharts — список алгиритмов з перевірочними даними в таблицях
2. Cryptowatch — добре налаштовані параметри індикаторів
3. Tradingview — створення скріншотів, платформа з безліччю індикаторів
4. Github — вихідний код

Related Articles

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *

Close