Машинне навчання проти фінансової математики: проблеми і рішення

Всім привіт! Так вийшло, що я вже близько семи років займаюся машинним навчанням. В останні кілька з них я як дослідник і CTO Neurons Lab часто працюю з фінансовими даними в рамках проектів, пов'язаних з інвестиційним менеджментом і алгоритмічним трейдингом. Найчастіше клієнти приходять з поточними стратегіями, які потрібно оптимізувати, або ідеями з альтернативними даними, які потенційно можуть прогнозувати ринок. Звичайно ж, аналіз даних у таких завданнях — наше все. Поряд з великою відповідальністю за капітал інвесторів :)

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

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

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

Проблеми економетрики

Реальні дані складніше, ніж «ціни, попит і пропозиція»

Стандартна процедура у фінансовій математиці — взяти часовий ряд якихось цін, обробити його за допомогою time series differentiation, після чого побудувати якісь моделі розподілу і показати, що ця модель описує ці дані (безвідносно того, чи це ARIMA або стохастичне диференціальне рівняння Фоккера-Планка).

В чому тут проблема?

Фінансові моделі в більшості своїй працюють з максимально неінформативними даними, ще й обробляючи їх неправильно і пояснюючи патерни in-sample (про це — далі).

Кореляції і лінійні залежності нічого не пояснюють

З університету ми знаємо, що кореляція пояснює міру лінійної залежності між двома випадковими величинами. Більше того, ми навіть чули про те, що кореляція != причинно-наслідкового зв'язку.

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

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

Найпростіший приклад того, як кореляція «лажає», видно на картинці нижче: очевидна нелінійна залежність праворуч показує кореляцію -0.008.

Image Source

Економетричні моделі пояснюють минуле, але нічого не прогнозують

Переважна частина фінансових моделей ґрунтується на поясненні варіативності даних всередині вибірки. Ми звикли в машинному навчанні завжди вважати помилку на out-of-sample даних, і про це створено багато мемів, але в економетриці, яка спочатку запозичила свої методи з біології, це просто не прийнято!

Практично всі математичні моделі в літературі пояснюють патерни або їх еволюцію всередині якогось датасета. Майже ніколи мова не йде про банальну крос-валідації, не кажучи вже про більш просунутих методів валідації моделей. Більше того, навіть сам факт «пояснення» минулого заснований на корреляциях, що, як ми знаємо, нічого не говорить про причинно-наслідкових зв'язках.

Тільки не показуйте цей мем эконометрикам

«Статистична достовірність» недостовірна

Знову-таки, з університетського курсу статистики ми знаємо, що якщо ми отримали p-value, досить низька для якоїсь змінної, то це значить, що ми відкидаємо нульову гіпотезу про неважности цієї змінної і вважаємо її «достовірної». Для того, щоб збільшити рівень достовірності, ми можемо ставити кордон для цього p-value. Часто воно дорівнює 0.01 або 0.05.

От тільки це не зовсім те, що нам потрібно.

Якщо що, то навіть американська асоціація статистиків не так-то позитивно ставиться до цих p-values. Але розкажіть про це у себе на кафедрі :)

Бэктестинг як спосіб досліджень

Бэктестинг — це процедура перевірки стратегії на історичних даних одного чи кількох фінансових інструментів, щоб зрозуміти, як стратегія б відпрацювала «в минулому», і на основі цього оцінити ризики її поведінки в майбутньому.

Почнемо з того, що ціни «в минулому» — це всього лише одна з реалізацій складного стохастичного процесу, і навіть якщо ми могли б його змоделювати, то перевіряти треба було б не на одній випадкової реалізації, а на сотні тисяч (див. Монте-Карло ).

Більш того, бэктестинг — це все один великий і красивий набір даних in-sample. Зробити модель, яка добре заробить в минулому, — простіше простого, питання тільки в тому, як вона відпрацює на живих грошах.

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

Чим більше експериментуємо — тим краще результат. Як зручно, так? (див. книгу )

Машинне навчання допоможе?

З эконометрикой і фінансовим моделюванням начебто розібралися, зрозумілі проблеми і як машинне навчання може допомогти. Чому ж тоді у багатьох спроби навчити моделі на історичних даних ні до чого не призводять? Пройдемося по тих же пунктах, але вже із зазначенням проблем машинного навчання в них. Кому цікаво заглибитися в тему, 14 березня я буду проводити воркшоп по цій темі на конференції Data Science UA Conference .

Складні дані треба ще приготувати

Неструктуровані дані самі по собі — ще не панацея. Навіть з сирими даними з ринку (ticks) або з альтернативними даними sentiment потрібно ще серйозно попрацювати.

Правильний семплінг даних

Навіщо ви вважаєте свічки кожні N хвилин? Ринок адже працює не по годинах, а по івентам: набагато логічніше робити свічки кожні X доларів торгів або схожим чином (див. Bars ).

Головна цінність альтернативних підходів полягає в тому, що всередині кожної свічки у нас буде зберігатися не проміжок часу, а якийсь логічний проміжок торгівлі. Це призведе до того, що кожна свічка окремо буде більш інформативна, і у всіх них буде схоже кількість інформації. У тимчасових свічках ж цілком можлива ситуація, коли в одному годині не відбувалося нічого, а в наступному — ринок звалився. Давайте подивимося, що відбувається, якщо ми будемо будувати свічки (комбінація з мінімального, максимального, першого і останнього значень цін заявок за якийсь період часу) різних періодів часу:

Приклади сирих цін, тимчасових, «об'ємних» і «доларових» свічок

Також можна побачити, що свічки, створені на основі періодів часу, мають набагато менше варіативності, ніж інші:

Варіативність цін всередині різних свічок

Ви можете спробувати провести експерименти зі своїми даними на основі коду звідси . В багатьох інших завданнях з нерегулярним семплінгом івентів (медицина, трекінг) схожі техніки можуть допомогти зробити дані більш придатними для аналізу.

Правильна нормалізація даних

Відоме нам диференціювання тимчасового ряду геть видаляє всю пам'ять про еволюцію цін (див. Fractional differentiation ).

На допомогу приходить не особливо відома в широких колах техніка fractional differentiation. Оператор різниці математично зазвичай представлений цілим числом, що і стирає пам'ять з лагом цього цілого числа. А що, якщо ми могли б використовувати дробове число від нуля до одиниці?

Приклад роботи fractional differentiation. Image Source

Аналіз ADF-статистики (про стаціонарність часових рядів) і різні параметри fractional differentiation: від 0 до 1. Як бачимо, оптимальні параметри завжди менше або дорівнює 0.5!

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

Поправка на IID-гіпотезу

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

В даному випадку ми можемо скористатися техніками підрахунку «перетинів» вікон, що використовуються для навчання. Якщо коротко: чим більше одне вікно перетинається з іншими — тим менший індекс «унікальності» ми присвоюємо йому. Далі нам дуже зручно використовувати цей індекс у комбінації з алгоритмами на основі дерев рішень, як random forest: ми можемо або зважувати кожен навчальний приклад на основі індексу унікальності, або використовувати bootstrap в бэггинге, який буде сэмплить «не унікальні» приклади з меншою ймовірністю.

Швидше за все, вийде так, що велика частина прикладів у вибірці буде «не унікальними».

Правильний вибір таргету для прогнозування

У світі з stop losses і take targets прогнозувати ціну за N годин — дурість. Наш таргет повинен бути максимально схожим на прийняття рішення (див. Triple barrier labeling ).

Техніка triple barrier labeling дозволяє розмічати дані на основі «вікна майбутнього». Наприклад, якщо ми хочемо відкрити операцію в наступний годину, нам потрібно прогнозувати не що відбудеться рівно через годину, а яким буде максимальний рух ціни і в яку сторону протягом цієї години (а раптом рівно через годину ціна піде вгору на 1%, але протягом цієї години буде більший стрибок на 5%?). Візуально ця техніка представлена на рисунку нижче:

Приклад того, як треба розмічати дані в межах одного вікна «в майбутньому», Image source

Що робити з залежностями?

Раз ми вирішили, що кореляція (або, що ще гірше, якісь околоэвклидовые метрики) не підходить для визначення залежностей або міри схожості, що ми можемо тут використовувати? Я бачу два шляхи:

На основі нових метрик ми зможемо краще аналізувати схожість змінних, проводити їх кластеризацію, шукати аномалії і так далі. Реалізації «літературних» методів можна взяти в бібліотеці , візуально різниця між кореляцією та іншими метриками видно на наступних ілюстраціях:

Як ми бачимо, метрики як information variation і max correlation, про яких можна детальніше прочитати тут , справляються набагато краще з виявленням нелінійних патернів.

Крос-валідацію теж треба зробити правильно

Недостатньо просто тестувати роботу алгоритмів на якомусь шматку даних «в майбутньому». Стандартна K-Fold крос-валідація буде точно прогнозувати «минуле», а спеціалізована крос-валідація для часових рядів буде порушувати IID-семплінг вибірок, особливо якщо фічі вважаються з лагом.

Є кілька способів поліпшити крос-валідацію: наприклад, чергувати вікна для тренування і тестування в хронологічному порядку з проміжками між ними. Все для того, щоб вибірки були максимально незалежні (приклад на ілюстрації нижче). Другий спосіб — це комбінаторна крос-валідація, про неї детальніше можна почитати в книзі Dr. Lopez de Prado .

Image Source

Значимість факторів out-of-sample

Так, feature importance — це вихід для заміни p-values. Але його теж потрібно використовувати out-of-sample. В ідеалі — поєднати з вищеописаними методами крос-валідації і вважати розподіл важностей на шматочках крос-валідації. Таким чином ми зможемо зрозуміти передбачувану значимість фіч «по-справжньому». Більш детально метод можна вивчити і запустити код в цій статті .

Приклад важливості факторів для цього датасета з кількома штучними шумами для валідації методу

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

Бэктестинг — це не спосіб досліджень

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

Ми поговорили про те, як вибирати змінні, між якими може бути залежність, як її рахувати і як перевіряти out-of-sample. Десь посередині буде алгоритм машинного навчання, який при адекватній постановці завдання і даних буде щось прогнозувати. Бэктестинга в дослідженнях немає!

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

Не треба підганяти модельки під бэктест. Спочатку — дослідження гіпотез про залежностях (тобто правильне машинне навчання), а потім споруда торгових стратегій. Поганий бэктест? Починаємо дослідження спочатку, і ніяк інакше.

Висновки

Я сподіваюся, що тепер трохи зрозуміліше, чому машинне навчання «в лоб» у фінансах не працює, але легше від цього точно не стало.

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

Правильна «фінансова» постановка завдання:

Більш глибоке розуміння вхідних і вихідних даних і вибір метрик:

Детальний аналіз навчених моделей:

Правильна валідація гіпотез і поділ з бэктестингом:

І так, все це — тільки про дослідження, які становлять від сили 10% роботи над торговими стратегіями. Ще більш складна робота вас буде чекати при впровадженні і живих торгах, оптимізації, оновлення та підтримки, але про це — іншим разом.

Список літератури

Базова література:

Прикладна література:

Опубліковано: 27/02/20 @ 08:00
Розділ Різне

Рекомендуємо:

«Якщо б у вас був мільйон доларів, ви б не працювали в аутсорсингу». Чому не варто закидати мрії про своєму бізнесі
Здоров'я ІТ-спеціаліста: біль у спині та проблеми з хребтом
iOS дайджест #36: MVVM на Combine, Swift 6, конференції 2020
Slim Docker image, або Як зменшити вагу Java-додатки
Open source: що це, для чого і як розпочати