Рівняння на модель: що потрібно знати про створення стратегій для торгівлі на біржі. Частина II



У минулому матеріалі ми поговорили про використання неэффективностей ринку на прикладі історії з ціновим обмеженням для швейцарського франка. Цього разу автор блогу Financial Hacker вирішив розібратися в тому, як виглядають стратегії, орієнтовані на певну модель. Ми представляємо вашій увазі головні тези другої статті з циклу.

Як вже згадувалося в минулий раз, є два основних методи побудови стратегій онлайн-трейдингу. Перший орієнтований на певну модель (model-based), другий – на інтелектуальний аналіз даних (data mining). Сьогодні мова піде про першому варіанті. Побудовані на її основі алгоритми напрочуд прості. Але процес їх створення має свої підводні камені (інакше б їх писали всі, кому не лінь). Навіть очевидна неефективність ринку дає системі лише невеликий зазор, куди можна потрапити зі своїм алгоритмом. А сама дріб'язкова помилка при його написанні перетворить виграшну стратегію в невдачу. І цей збій не завжди можна розгледіти на пробному прогоні.

Для початку необхідно вибрати одну з неэффективностей ринку, яку трейдер хоче використовувати у своїй стратегії. Неефективність виробляє цінову аномалію або цінової патерн, який можливо описати за допомогою кількісної або якісної моделі. Ця модель покликана передбачати поточну ціну yt, ґрунтуючись на попередньому значенні ціни yt-1, до якого додається деяка функція f від обмеженого числа попередніх значень, плюс мінлива шуму ε



Очевидно, що чим вище значення передбачуваної функції перед непередбачуваним шумом, тим надійнішою є стратегія. Деякі трейдери люблять говорити, що їх метод не передбачає поведінку ринку, а «реагує на його зміни». Але системи, що не базуються на прогнозуванні ринку, безумовно повинні розраховувати на удачу. Вони лише перерозподіляють ризики. Змінюють, наприклад, високий ризик від невеликих втрат на терпимий від великих втрат. Але ймовірність прибутку залишається негативною.

Не всі цінові аномалії придатні до вживання. Обмеження котирувань 1/16 долара – очевидна неефективність, але автор статті чесно зізнається, що не розуміє, як її можна використовувати для отримання прибутку. Як би те ні було, відомі йому працюють стратегії, засновані на моделях, можна розділити на кілька категорій. Про кожну з них по порядку.

Дотримання тренду

Моментум або динаміка зміни ціни – мабуть, найбільш очевидна і частіше інших використовується аномалія. Існує безліч методів стратегії слідування тренду. Класичний варіант – перетин ковзних середніх (moving average crossover). За адресою можна подивитися скрипти для неї на R і C.

Є одна проблема: моментум не діє на всіх ринках. Будь-які активи можуть не торгуватися протягом тривалого періоду. Випадкове відхилення може бути позитивним або негативним, але при цьому сам моментум може бути відсутнім. Як би те ні було, безперечна користь у фільтрі, який пізнає режим реального ринку, є. Ось приклад використання фільтра нижніх частот для виявлення зворотного тренда в стратегії, написаної на скриптовом мовою Zorro. Індикатор MMI потрібен для фіксації моменту входження в тренд.

function run()
{
vars Price = series(price());
vars Trend = series(LowPass(Price,500));

vars MMI_Raw = series(MMI(Price,300));
vars MMI_Smooth = series(LowPass(MMI_Raw,500));

if(falling(MMI_Smooth)) {
if(valley(Trend))
reverseLong(1);
else if(peak(Trend))
reverseShort(1);
}
}

Крива доходу даної стратегії:



Повернення до середнього значення (mean reversion)

Віра в те, що ринок повертається до середнього значення, передбачає наявність «реальної» чи «чесної» ціни. Трейдери купують, коли поточна ціна нижче тієї, яка, на їх думку, має бути. І продають при більш високому її значенні. Це, нібито, змушує ціну повертатися до середнього значення більш часто, ніж це б відбувалося при випадкових відхиленнях. Є дані, що повернення до середнього відбувається в 75% випадків (деякі аргументи «за» перераховані тут — на англійському). Тому все, що вище 75%, повинна мати відношення до неефективності ринку. Модель розрахунку:


,

Де yt, — ціна на шкалі t, y^ — чесна ціна, λ – коефіцієнт напіврозпаду (half-life factor), ε – шум.

Чим вище half-life factor, тим менш імовірний повернення до середнього. Зазвичай середнє значення цінової серії досягається в інтервалі від 50 до 200 барів. λ можна підрахувати через лінійну регресію між yt-1 і (yt-1-yt). Для досягнення середнього значення цінові серії не можуть бути статичними оскільки чесна ціна може змінюватися. Просто це зміни не повинно бути менш істотним, ніж при випадковому відхиленні. Зазвичай повернення до середнього використовують, прибираючи тренд з цінової кривій і нормалізуючи підсумковий результат. Таким чином, ми отримуємо сигнал коливання, який буде ініціювати угоди при досягненні верхніх або нижніх значень. Ось простий скрипт системи, що використовує цей метод:

function run()
{
vars Price = series(price());
vars Filtered = series(HighPass(Price,30));
vars Signal = series(FisherN(Filtered,500));
var Threshold = 1.0;

if(Hurst(Price,500) < 0.5) { // do we have mean reversion?
if(crossUnder(Signal,-Threshold))
reverseLong(1); 
else if(crossOver(Signal,Threshold))
reverseShort(1);
}
} 

Фільтр високих частот послаблює вплив всіх циклів зі значенням більше 30 тактів, таким чином, виключаючи тренд з цінової кривої. Результат нормалізується через перетворення Фішера, що призводить до гаусовим розподілом. Це дозволяє визначити фіксовані межі значень при 1 і -1, для того щоб відокремити «хвіст» нормального розподілу. Коли ціна досягає дробу в будь-якому напрямку, ініціюється операція в очікуванні того, що найближчим часом вона повернеться до нормальних значень. Для входження в режим повернення до середніх значень, в скрипті використаний показник Херста, встановлений на значенні 0,5 для випадкового відхилення.



Статистичний арбітраж

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


,
Де y1 і y2 – це ціни двох активів, коефіцієнти h1 і h2 визначають співвідношення для хеджування. Вони розраховуються, виходячи з припущення, що різниця між вартістю активів дорівнює нулю або є константою. Найпростіший спосіб розрахунку – це лінійна регресія між y1 і y2. Далі тут також може бути застосована стратегія повернення до середніх значень, яку ми згадували вище.

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

Ось простий приклад системи арбітражу з туториала по R:

require(quantmod)

symbols <- c("AAPL", "QQQ")
getSymbols(symbols)

#define training set
startT <- "2007-01-01"
endT <- "2009-01-01"
rangeT <- paste(startT,"::",endT,sep ="")
tAAPL <- AAPL[,6][rangeT]
tQQQ <- QQQ[,6][rangeT]

#compute price differences on in-sample data
pdtAAPL <- diff(tAAPL)[-1]
pdtQQQ <- diff(tQQQ)[-1]

#build the model
model <- lm(pdtAAPL ~ pdtQQQ - 1)

#extract the hedge ratio (h1 is assumed 1)
h2 <- as.numeric(model$coefficients[1])

#spread price (in-sample)
spreadT <- tAAPL - h2 * tQQQ

#compute statistics of the spread
meanT <- as.numeric(mean(spreadT,na.rm=TRUE))
sdT <- as.numeric(sd(spreadT,na.rm=TRUE))
upperThr <- meanT + 1 * sdT
lowerThr <- meanT - 1 * sdT

#run in-sample test
spreadL <- length(spreadT)
pricesB <- c(rep(NA,spreadL))
pricesS <- c(rep(NA,spreadL))
sp <- as.numeric(spreadT)
tradeQty <- 100
totalP <- 0

for(i in 1:spreadL) {
spTemp <- sp[i]
if(spTemp < lowerThr) {
if(totalP <= 0){
totalP <- totalP + tradeQty
pricesB[i] <- spTemp
}
} else if(spTemp > upperThr) {
if(totalP >= 0){
totalP <- totalP - tradeQty
pricesS[i] <- spTemp
}
}
}

Обмеження ціни

Цінові обмеження викликають стійкий дрейф ціни або встановлюють її граничні нижні або верхні значення. Найвідоміший приклад тут це історія з парою EUR/CHF (євро/франк), про яку ми детально говорили минулого разу. Але навіть після скасування ліміту, обмеження в парі залишилися. На цей раз вони були обумовлені не політикою швейцарського Центробанку, а серйозної асиметрією в купівельній спроможності кожної з валют. Подібні речі можна використовувати торгової стратегії. Зазвичай вони дають високу віддачу на коротких часових відрізках при використанні сітки.

Цикли

Якщо ми говоримо не про сезонні цикли, то вони можуть бути викликані зворотною реакцією цінової кривий на дії трейдерів. Коли більшість гравців вірить в якусь чесну ціну акцій, вони відкривають позиції з купівлі або продажу, якщо ціна досягає певного значення при відхиленні від цієї вартості. Або ж вони закривають виграшні позиції, коли краща динаміка починає сповільнюватися. Таким чином, достатнє число трейдерів може синхронізувати свої цикли по входу-виходу і викликати стійкі коливання ціни протягом певного періоду. Часто багато подібні цикли накладаються на криву. Наприклад:



Якщо вам відомий період Cі і фаза Dі домінантного циклу, трейдер зможе визначити оптимальні моменти для відкриття і закриття позицій, поки сам цикл стійкий. Визначити дію циклів можна через функції спектрального аналізу. Ну, наприклад, через швидке перетворення Фур'є або через набір смугових фільтрів (bandpass filters). Ось діапазон частот для пари євро/долар на жовтень 2015:



Управлятися з циклами складніше, ніж використовувати тренд або повернення до середнього значення. Потрібно враховувати не тільки тривалість циклу, але і його фазу і амплітуду (щоб розуміти, чи варто взагалі звертати на нього увагу). Ось приклад базового сценарію для цих цілей:

function run()
{
vars Price = series(price());
var Phase = DominantPhase(Price,10);
vars Signal = series(sin(Phase+PI/4));
vars Dominant = series(BandPass(Price,rDominantPeriod,1));
ExitTime = 10*rDominantPeriod;
var Threshold = 1*PIP;

if(Amplitude(Dominant,100) > Threshold) {
if(valley(Signal))
reverseLong(1); 
else if(peak(Signal))
reverseShort(1);
}
}

Функція
DominantPhase
визначає фазу і тривалість циклу основного максимуму в спектрі. Він позначений змінної
rDominantPeriod
. Фаза перетворюється в синусоїду, зміщену на значення
π/4
. Так ми отримуємо криву, що йде над цінової кривої. Питання лише в тому, чи буде ціна слідувати нашим прогнозам. Це ми перевіряємо через смугові фільтри, центровані за домінантним циклу на ціновій кривий, і вимірюємо їх амплітуду (aі у формулі). Якщо амплітуда перевищує граничне значення, отже, цикл, досить стійкий. Так як короткі цикли, час відкриття позиції обмежено
ExitTime
з максимальним значенням в 10 циклів.



На цьому графіку видно, що для пари євро/долар у 2012 і 2014 не було тривалих періодів, де б мали місце стійкі цикли.

Кластери

Той же ефект, що змушує ціни коливатися, що може призвести до їх об'єднання в групи на певних рівнях. У своєму крайньому вираз це навіть може дати лінії попиту і пропозиції (або підтримки та опору) – улюблені об'єкти розгляду на трейдерських семінарах. Експерти на таких семінарах можуть виявити лінії підтримки та опору на будь-яких діаграмах, не думаючи про кластери, будь то реальні акції або результати бейсбольного сезону. Для всіх інших очевидність існування цих ліній залишається під питанням. Є лише кілька стратегій, націлених на їх виявлення і використання. Ще менше приносять реальний дохід. Теоретично кластери на цінових кривих можуть бути виявлені за допомогою гістограми, схожої зі спектограммой, що ми використовували для виявлення циклів.

Патерни цінової кривий

Такі патерни беруть початок у повторюваному поведінці трейдерів. На біржах не тільки виробляють певні шаблони, але й вірять в існування таких. Більшість з них, наприклад, знаменитий «голова і плечі», фігура руху цін у технічному аналізі, який, нібито, передбачає зміну тренда, є міфами. Принаймні, автору статті не траплялося жодного статистичного підтвердження цього паттерну. Однак деякі шаблони, типу «чашка» (cup) і «півчашка» (half-cup), дійсно мають місце бути і можуть передбачати рух кривої вниз і вгору. Патерни кривої не слід плутати зі свічковими патернами. В цілому їх можна експлуатувати за допомогою методів визначення шаблонів. Наприклад, алгоритму Фречета.

Особливий випадок – патерн пробиття (breakout), що позначає раптовий моментум після тривалого руху у вузьких межах значень. Він може бути викликаний, наприклад, бажанням трейдерів розміщувати свої ордера стоп-лосс на короткій відстані над або під поточним плато. Перше закриття прискорює рух ціни, поки все більше таких закриттів не буде ініційовано. Цей ефект можна використовувати, створивши систему, яка фіксує період невеликих коливань і переходить у режим очікування до першого руху в кожному напрямку.

Сезонність

Сезон в нашому випадку не завжди означає пору року. Попит і пропозиція можуть слідувати за місячними, тижневими патернами або навіть патернами одного дня. Для прикладу, індекс S&P500, як прийнято вважати, йде вгору в перші дні кожного місяця або на початку відкриття торгів щодня. Такі речі легко використовувати в своїх цілях. Але найчастіше вони короткочасні, ненадійні, їх не можна розпізнати, просто вдивляючись в криву цін. Але при бажанні для кожного дня, місяця та тижня можна створити свій профіль середніх цінових змін.

Гепи

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

Авторегрессия та гетероскедастичність

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

Моделі ARIMA і GARCH – це перші моделі, з якими маєш справу в матанализе фінансової сфери. Вони виходять із припущення, що майбутня прибуток або майбутня волатильність можуть бути визначені через лінійну комбінацію минулих доходів і минулого волатильності. Вони мають статус теоретичних моделей. Але ви можете знайти їм практичне застосування. З їх допомогою можна передбачати завтрашню ціну, нітрохи не гірше, ніж за допомогою будь-яких інших. Вивчіть на дозвіллі коррелограмму зі статистикою кореляції поточних і минулих доходів. Можливо, ARIMA можна пристосувати під конкретні цінові серії. Є дві статті по використанню цих моделей в діючих торгових стратегіях: «Трейдингова стратегія ARIMA/ GARCH для S&P500» і «Можна передбачати ціни через ARIMA/ GARCH?

Новини

Цінова струс зазвичай трапляється по понеділках і п'ятницях, коли багато компанії або організації публікують хороші чи не дуже хороші новини для ринку. Навіть не знаючи їх зміст, можна передбачити з допомогою стратегії першу цінову реакцію і опинитися на стороні переможців. Але вищий пілотаж, зрозуміло, це коли трейдеру вдається інтерпретувати ці новини. Деякі інформаційні сервіси випускають новини з позначкою «добре» або «погано». Для того щоб розібратися, як можна використовувати публічну інформацію більш творчо і ефективно, слід познайомитися з блискучою книгою «Індекс страху» Роберта Харріса, обов'язковим чтивом в бібліотеці будь-якого просунутого фінансиста.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.