You are on page 1of 87

НАЦІОНАЛЬНИЙ ТЕХНІЧНИЙ УНІВЕРСИТЕТ УКРАЇНИ

«КИЇВСЬКИЙ ПОЛІТЕХНІЧНИЙ ІНСТИТУТ ІМЕНІ ІГОРЯ


СІКОРСЬКОГО»
Навчально-науковий інститут атомної та теплової енергетики

Кафедра цифрових технологій в енергетиці

"На правах рукопису" «До захисту допущено»


УДК__________ Завідувач кафедри
_______ Наталія АУШЕВА
“___”_____________2023р.

Дипломна робота
на здобуття ступеня бакалавра

За освітньою програмою «Комп’ютерний моніторинг та геометричне


моделювання процесів та систем»
Спеціальності 122 Комп’ютерні науки
на тему «Прогнозування курсу кріптовалюти на основі лінійних
алгоритмів»

Виконав: студент 4 курсу, групи ТР-91


_Іванник Антон Олегович________________________ __________
(прізвище, ім’я, по батькові)
(підпис)

Керівник доцент, к. т. н., доцент Шаповалова Світлана Ігорівна _______


(посада, науковий ступінь, вчене звання, прізвище та ініціали) (підпис)

Рецензент __________ _______


(посада, науковий ступінь, вчене звання, прізвище та ініціали) (підпис)

Засвідчую, що у цій дипломній роботі


немає запозичень з праць інших
авторів без відповідних посилань.
Студент _____________

Київ - 2023
2

Національний технічний університет України


“Київський політехнічний інститут імені Ігоря Сікорського”
Навчально-науковий інститут атомної та теплової енергетики
Кафедра цифрових технологій в енергетиці
Рівень вищої освіти перший (бакалаврський)

За освітньою програмою «Комп’ютерний моніторинг та геометричне


моделювання процесів та систем»
спеціальність 122 Комп’ютерні науки
освітня програма «Комп’ютерний моніторинг та геометричне моделювання
процесів та систем»

ЗАТВЕРДЖУЮ
Завідувач кафедри
Наталія АУШЕВА
(підпис)

« » 2023р.

ЗАВДАННЯ
на дипломну роботу студенту
Іваннику Антону Олеговичу
(прізвище, ім’я, по батькові)
1. Тема роботи Прогнозування курсу кріптовалюти на основі лінійних
алгоритмів

Керівник Шаповалова Світлана Ігорівна, доцент, к. т. н., доцент


(прізвище, ім’я, по батькові, науковий ступінь, вчене звання)
затверджені наказом по університету від «29» травня 2023р. № 2039-с
2. Термін подання студентом роботи 09.06.2023

3. Вихідні дані до роботи Середовище розробки JetBrains PhpStorm, мови


програмування PHP, програмний каркас Laravel
3

4. Перелік питань, які потрібно розробити

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


2)зробити аналіз існуючих систем
3)описати засоби розробки програмного забезпечення
4)розробити програмне забезпечення
5) описати процес використання системи користувачами

5. Орієнтований перелік ілюстративного матеріалу: ілюстрації роботи


системи, архітектура та структура системи, архітектури методів, графіки
роботи системи

6. Дата видачі завдання «19» вересня 2022 р.

КАЛЕНДАРНИЙ ПЛАН

№ Назва етапів виконання дипломної Термін П


з/ Роботи виконання римітки
п етапів роботи
1. Затвердження теми роботи 11.10.22 виконано

2. Вивчення та аналіз задачі 12.10.22-17.04.23 виконано


3. Розробка архітектури та загальної 17.04.23-24.04.23 виконано
структури системи
4. Програмна реалізація системи 24.04.23-14.05.23 виконано
5. Оформлення пояснювальної записки 15.05.23-02.06.23 виконано
6. Захист програмного продукту 17.05.2023 виконано

7. Передзахист 05.06.23- виконано


07.06.23
8. Захист 19.06.23-24.06.23

Студент ________ _______Іванник А. О.______


(підпис) (прізвище та ініціали)

Керівник ________ _______Шаповалова С. І._____


(підпис) (прізвище та ініціали)
4

АНОТАЦІЯ

Метою даної роботи є створення програмної системи для


прогнозування курсу кріптовалютних активів. Система реалізована за
допомогою мови програмування PHP, програмного каркасу Laravel,
бібліотеки для адміністраторських панелей Filament, системами керування
реляційними базами даних MySQL та PostgreSQL.
Результатом є програмний продукт для аналізу та прогнозування
курсу кріптовалютних активів.
Ключові слова: кріптовалюта, актив, прогнозування, аналіз.
Дипломна робота виконана на 87 сторінках, містить 28 ілюстрацій, 1
додаток, 15 джерел в переліку посилань.
5

ABSTRACT

This work aims to create a software system for forecasting the exchange
rate of cryptocurrency assets. The system is implemented using the PHP
programming language, the Laravel software framework, the Filament library for
admin panels, MySQL and PostgreSQL relational database management systems.
The result is a software product for analyzing and forecasting the course of
cryptocurrency assets.
Keywords: cryptocurrency, asset, forecasting, analysis.
The thesis was completed on 87 pages, contains 28 illustrations, 1 addition,
15 sources in the list of references.
6

ЗМІСТ
ПЕРЕЛІК УМОВНИХ ПОЗНАЧЕНЬ, СКОРОЧЕНЬ І ТЕРМІНІВ ..... 8

ВСТУП ...................................................................................................... 9

1 ЗАДАЧА ТА ОГЛЯД РОЗРОБКИ ПРОГРАМНОГО ЗАСОБУ..... 12

1.1 Задача розробки програмного засобу прогнозування


кріптовалютних операцій ............................................................................ 12
1.2 Платформи кріптовалютних активів ...................................... 13
1.2.1 Binance ................................................................................... 13
1.2.2 Investing.com ......................................................................... 14
1.2.3 CoinMarketCap ...................................................................... 16
1.2.4 CoinGecko .............................................................................. 17
1.2.5 CryptoCompare ...................................................................... 19
1.3 Програмний інструментарій .................................................... 21
1.3.1 Мова програмування PHP.................................................... 21
1.3.2 Програмний каркас Laravel ................................................. 22
1.3.3 Бібліотека Filament ............................................................... 23
1.3.4 Бібліотека Chart.js................................................................. 24
1.3.5 Інструментарій Docker ......................................................... 25
1.3.6 СКБД MySQL ....................................................................... 25
1.3.7 СКБД PostgreSQL ................................................................. 27

2 ЛІНІЙНІ АЛГОРИТМИ ................................................................... 29

2.1 Лінійні алгоритми. Прогнозування кріптовалютних операцій


29
2.2 Методи прогнозування ............................................................ 30
2.2.1 Індекс відносної сили (RSI) ................................................. 30
2.2.2 Стохастичний індекс відносної сили (Stochastic RSI) ...... 30
2.2.3 Проста рухома середня (SMA) ............................................ 32
7

2.2.4 Експоненціальна рухома середня (EMA)........................... 33


2.2.5 Метод найменших квадратів ............................................... 33
2.2.6 Хребтова регресія ................................................................. 35

3 ПРОГРАМНА РЕАЛІЗАЦІЯ ........................................................... 36

3.1 Архітектура програмного забезпечення................................. 36


3.2 Структура мікросервісу сховища............................................ 38
3.3 Бази даних мікросервісу сховища........................................... 42
3.4 Структура мікросервісу адмін-панелі аналізатора................ 45
3.5 Бази даних мікросервісу адмін-панелі аналізатора............... 49

4 ВЗАЄМОДІЯ КОРИСТУВАЧА З ВЕБ-ДОДАТКОМ .................. 53

ВИСНОВКИ ............................................................................................ 63

СПИСОК ВИКОРИСТАНИХ ДЖЕРЕЛ .............................................. 65

ДОДАТОК A КЛАС-ОБЕРТКА СТОРІНКИ АНАЛІТИКИ СЕРВІСУ


АДМІНІСТРАТОРСЬКОЇ ПАНЕЛІ ............................................................... 67
8

ПЕРЕЛІК УМОВНИХ ПОЗНАЧЕНЬ, СКОРОЧЕНЬ І


ТЕРМІНІВ

СКБД – система керування базами, набір взаємопов'язаних даних і


програм для доступу до цих даних. Надає можливості створення,
збереження, оновлення та пошуку інформації в базах даних з контролем
доступу до даних.
API – прикладний програмний інтерфейс.
HTML – Hyper Text Markup Language, мова створення розмітки веб-
додатків.
Chart.js – це безкоштовна бібліотека JavaScript для створення діаграм
на основі HTML.
RSI – Relative Strength Index, технічний індикатор, який вимірює силу
та інтенсивність руху цін.
Stochastic RSI – Stochastic Relative Strength Index, технічний індикатор
комбінує в собі RSI та стохастичний осцилятор.
SMA – Simple Moving Average, технічний індикатор простої рухомої
середньої, яка використовується для згладжування цінових даних і
визначення загального тренду.
EMA - Exponential Moving Average, технічний індикатор схожий на
SMA, проте він надає більший ваговий коефіцієнт останнім ціновим даним.
PHP - скриптова мова програмування, була створена для генерації
HTML-сторінок на стороні вебсервера.
9

ВСТУП

У сучасному світі кріптовалюти стають важливою частиною


фінансової системи. Зараз вони привертають значну увагу інвесторів у
всьому світі. Кріптовалюти — це цифрові або віртуальні валюти, які
використовуються для проведення фінансових операцій або обміну
цінностей в Інтернеті. Однією з найвідоміших кріптовалют є біткоін.
Запущений у 2009 році, він являє собою перше промислове застосування
технології блокчейн і зараз використовується в усіх сучасних рішеннях у
сфері кріптовалют.
Попит на інвестиції в кріптовалютні активи стрімко зростає. Це
можна пояснити кількома факторами. По-перше, кріптовалюти пропонують
можливість швидких і безпосередніх фінансових операцій, привертаючи
увагу тих, хто цінує швидкість і зручність платежів. По-друге,
кріптовалюти пропонують інвесторам додаткові можливості для участі в
нових ринках, що розвиваються, з високим потенціалом зростання. Крім
того, основною рушійною силою зростання популярності цих активів є
недовіра до традиційних фінансових установ і бажання знайти
альтернативні шляхи збереження та збільшення капіталу [2].
Важливим аспектом інвестування в кріптовалюти є аналіз та
прогнозування кріптовалютних даних, зокрема японських свічок. Японські
свічки - це графічний метод відображення цінової динаміки активів, який
надає важливу інформацію про тренди та патерни на ринку. Аналіз цих
даних дозволяє інвесторам здійснювати обґрунтовані рішення щодо
купівлі, продажу та управління кріптовалютними активами.
Застосування технічних та лінійних алгоритмів є важливою
складовою успішного інвестування в кріптовалюти. Інвестори активно
використовують ці алгоритми для аналізу та прогнозування цінових змін на
10

ринку.
Технічний аналіз базується на припущенні, що цінова динаміка має
певні закономірності та повторювані моделі. Він дозволяє інвесторам
виявити тренди, підтвердити їхню міцність, ідентифікувати ключові рівні
підтримки та опору та визначити потенційні точки входу та виходу з
позицій. Технічний аналіз використовує різноманітні технічні індикатори,
які надають інформацію про перекупленість або перепроданість активу та
допомагають виявляти зміни на ринку.
Лінійні алгоритми, такі як метод регресії найменших квадратів та
хребтова регресія, використовуються для аналізу та прогнозування
кріптовалютних даних на основі статистичних моделей. Вони дозволяють
побудувати математичні моделі, які описують залежність цінової динаміки
від різних факторів та також дозволяють інвесторам здійснювати прогнози
щодо майбутніх цінових рухів.
Застосування технічних та лінійних алгоритмів дозволяє інвесторам
отримувати обґрунтовані та об'єктивні рішення щодо управління своїми
кріптовалютними інвестиціями. Аналіз та прогнозування кріптовалютних
даних з використанням цих алгоритмів допомагають інвесторам визначати
оптимальні моменти для входу та виходу з позицій, зменшуючи ризики та
підвищуючи можливість отримання прибутку.
Метою дипломної роботи є створення програмного застосунку, який
використовує технічні та лінійні алгоритми для аналізу та прогнозування
кріптовалютних даних на основі японських свічок.
У зв’язку з цим були сформульовані наступні завдання:

1. Провести огляд вже існуючих рішень в сфері аналізу та


прогнозування курсу кріптовалютних активів.
2. Обґрунтувати вибір технологій реалізації програмного застосунку.

3. Розробити лінійні алгоритми та технічні індикатори для


11

можливості аналізу кріптовалютних активів.


4. Здійснити реалізацію алгоритмів та розробити користувацький
інтерфейс програмного продукту.
Програмний інструментарій, який розробляється, призначено для
інвесторів, які прагнуть отримувати інформовані рішення та
максимізувати свій потенційний прибуток на ринку кріптовалют.
Дипломна робота виконана на 87 сторінках, містить 28 ілюстрацій, 1
додаток, 15 джерел в переліку посилань.
12

1 ЗАДАЧА ТА ОГЛЯД РОЗРОБКИ


ПРОГРАМНОГО ЗАСОБУ

1.1 Задача розробки програмного засобу прогнозування


кріптовалютних операцій
У сучасному світі кріптовалюти стають все більш популярними та
важливими фінансовими активами. Їх висока прибутковість та широкі
можливості привертають увагу інвесторів, які прагнуть здійснювати
успішні операції на цьому ринку. Однак, кріптовалюти також відомі своєю
високою волатильністю, що створює складність у прогнозуванні цінових
змін.
Задача дипломного проекту полягає в розробці моделей та
алгоритмів, які допоможуть інвесторам зробити обґрунтовані рішення щодо
купівлі, продажу та управління кріптовалютними активами з урахуванням
наявних даних про японські свічки.
Прогнозування цінових змін кріптовалют є важливою задачею для
інвесторів, оскільки допомагає їм приймати обґрунтовані рішення щодо
управління своїми інвестиціями. Через високу волатильність ринку
кріптовалют, точне прогнозування майбутніх цінових рухів може мати
значний вплив на успішність операцій та отримання прибутку [3].
Система збирає дані з різних джерел, таких як кріптовалютна біржа
Binance, за допомогою API та зберігає їх в уніфікованому вигляді у
мікросервіс-сховище. Потім мікросервіс адмін-панель отримує та аналізує
ці дані, застосовуючи лінійні алгоритми та технічні індикатори, щоб надати
інвесторам об'єктивну інформацію для прийняття рішень щодо
кріптовалютних операцій. Крім того, система також забезпечує можливість
налаштування параметрів алгоритмів та вибір різних стратегій аналізу для
відповідності індивідуальним потребам інвесторів.
13

1.2 Платформи кріптовалютних активів

1.2.1 Binance

Платформа Binance є однією з найпопулярніших кріптовалютних


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

Рисунок 1.2.1.1 – Інтерфейс вікна аналізу платформи Binance


14

Binance надає доступ до різних технічних індикаторів, таких як RSI,


MACD та Bollinger Bands. Ці індикатори допомагають трейдерам
отримувати сигнали та аналізувати рухи цін на ринку кріптовалют.
Проте, разом із перевагами, є деякі недоліки. Наприклад, платформа
має обмежену кількість історичних даних (тільки від 2017 року), що може
обмежити аналіз довгострокових трендів. Також, Binance концентрується
переважно на технічному аналізі, і може бути обмежена в доступі до
детальних фундаментальних даних про кріптовалютні активи. Окрім цього,
Binance не гарантує точне прогнозування, а тільки є зручним інструментом
аналізу для трейдерів [11].
Додатково, платформа вимагає стабільного інтернет-з'єднання для
доступу до графіків та аналізу. Проблеми з підключенням до мережі можуть
вплинути на доступність та продуктивність платформи.

1.2.2 Investing.com

Investing.com є фінансовою платформою та веб-сайтом новин. Це


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

новин [12]. Тому трейдери можуть приймати обґрунтовані торгові рішення


на базі максимального обсягу інформації. Інтерфейс вікна аналізу
представлено на рисунку 1.2.2.1

Рисунок 1.2.2.1 – Інтерфейс вікна аналізу платформи Investing.com

Однак, платформа Investing.com має деякі недоліки, які варто


враховувати. Наприклад, доступність історичних даних може бути
обмеженою, що ускладнює проведення довготермінового аналізу та
виявлення трендів. Крім того, використання Investing.com вимагає важкої
16

реєстрації з підтвердженням особистості та створення облікового запису,


що може бути незручним для деяких трейдерів. Також варто враховувати,
що платформа потребує стабільного інтернет-з'єднання, і проблеми з
підключенням можуть обмежити доступ до аналітичних функцій. Також,
Investing.com не гарантує точне прогнозування, а тільки є зручним
інструментом аналізу.

1.2.3 CoinMarketCap

Платформа CoinMarketCap надає широкі можливості для аналізу


кріптовалютних графіків та отримання інформації про ринок. Завдяки
своєму великому обсягу даних та широкій кількості підтримуваних
кріптовалют, CoinMarketCap стає незамінним інструментом для трейдерів
та інвесторів у кріптовалютному просторі.
Однією з переваг платформи є її зручний та легкий у використанні
інтерфейс. Користувачі можуть швидко знайти необхідну інформацію про
будь-яку кріптовалюту, переглянути її ринкові дані та графіки цін. Графіки
мають різні налаштування, що дозволяє трейдерам змінювати періоди та
типи графіків для проведення аналізу [13]. Інтерфейс вікна аналізу
представлено на рисунку 1.2.3.1

Рисунок 1.2.3.1 – Інтерфейс вікна аналізу платформи CoinMarketCap


17

Крім того, CoinMarketCap надає розширені функції технічного


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

1.2.4 CoinGecko

CoinGecko є веб-платформою, що надає користувачам можливість


аналізувати кріптовалютні графіки та отримувати інформацію про
кріптовалютний ринок. У ній є кілька переваг, які привертають увагу
користувачів.
Перш за все, CoinGecko надає широкий спектр даних, що дозволяє
здійснювати детальний аналіз кріптовалютного ринку. Користувачі можуть
отримувати статистичні дані про ціни, обсяги торгів, ринкову капіталізацію
та інші показники для кожної кріптовалюти.
Друга перевага полягає в тому, що CoinGecko має гнучкі графіки, які
дозволяють налаштовувати періоди та типи графіків. Користувачі можуть
18

використовувати різні технічні індикатори для детального аналізу трендів


та показників кріптовалют [14]. Інтерфейс вікна аналізу представлено на
рисунку 1.2.4.1

Рисунок 1.2.4.1 – Інтерфейс вікна аналізу платформи CoinGecko

Крім цього, CoinGecko надає можливість порівняння різних


кріптовалют за різними показниками. Це допомагає користувачам виявляти
відмінності в цінах, обсягах торгів, ринковій капіталізації та інших
параметрах між різними кріптовалютами.
Точність та актуальність даних на CoinGecko можуть залежати від
джерел, з яких вони отримуються, і можуть варіюватись в різних ситуаціях.
Користувачам слід бути обережними при використанні цієї платформи для
прийняття торгівельних рішень.
Загалом, CoinGecko - корисна платформа для аналізу кріптовалютних
графіків та отримання інформації про ринок. Її широкий спектр даних,
гнучкі графіки та можливість порівняння кріптовалют є важливими
перевагами. Проте, варто пам'ятати про обмежені можливості торгівлі та
19

можливість відхилень в точності даних.

1.2.5 CryptoCompare

CryptoCompare - це платформа, що надає можливості аналізу


кріптовалютних графіків та володіє деякими особливостями, які
заслуговують на увагу.
Однією з переваг CryptoCompare полягає в широкому спектрі
інструментів технічного аналізу, доступних для користувачів. Платформа
надає можливість застосовувати різні індикатори, включаючи рухові
середні, стохастичні індикатори, індекси сили та багато інших. Це дозволяє
трейдерам проводити глибокий аналіз графіків та виявляти потенційні
торгівельні можливості.
Крім того, CryptoCompare надає доступ до широкого спектру даних
про кріптовалюти. Користувачі можуть отримувати інформацію про ціни,
обсяги торгів, ринкову капіталізацію, волатильність та інші показники для
кожної кріптовалюти [15]. Це допомагає трейдерам і інвесторам проводити
детальний аналіз ринку та приймати обґрунтовані торгівельні рішення.
Інтерфейс вікна аналізу представлено на рисунку 1.2.5.1

Рисунок 1.2.5.1 – Інтерфейс вікна аналізу платформи CryptoCompare


20

Одним з основних переваг CryptoCompare є його інтерактивні


графіки. Платформа надає користувачам можливість налаштовувати
графіки за різними параметрами, включаючи періоди часу, типи графіків та
показники. Це дозволяє трейдерам вивчати різні аспекти руху цін та
аналізувати їх в контексті своїх торгівельних стратегій.
Проте, варто відзначити деякі недоліки CryptoCompare. Платформа
може бути менш популярною у порівнянні з іншими відомими
платформами, такими як CoinGecko або CoinMarketCap. Це може вплинути
на обсяги даних та актуальність інформації, яку надає платформа.
У підсумку, CryptoCompare є платформою, яка надає користувачам
можливості для аналізу кріптовалютних графіків та отримання
різноманітної інформації про ринок. Інструменти технічного аналізу,
широкий спектр даних та інтерактивні графіки є його головними
перевагами. Проте, варто знати, що популярність та доступність деяких
функцій можуть бути обмеженими, а точність та актуальність даних можуть
залежати від обсягу та джерел, з яких вони отримуються.
Були розглянуті різні платформи для аналізу кріптовалютних графіків
та отримання інформації про ринок, зокрема Binance, Investing.com,
CoinMarketCap, CoinGecko та CryptoCompare. Ці платформи надають
користувачам широкий спектр даних, гнучкі графіки та інструменти
технічного аналізу. Вони є незамінними інструментами для трейдерів та
інвесторів у кріптовалютному просторі. Проте, перед використанням цих
платформ варто враховувати обмеження, такі як точність та актуальність
даних, і здійснювати обґрунтовані торгівельні рішення. Для максимальної
актуальності даних та правильності вибору на ринку потрібно
використовувати декілька програмних рішень, тому що кожна платформа
має свої результати та індивідуальні рішення щодо аналізу.
21

1.3 Програмний інструментарій


Для розробки дипломного проекту був обраний набір технологій,
який би зміг запровадити гнучку та зручну архітектуру програмного
продукту для будь-яких рішень, які необхідно було імплементувати.

1.3.1 Мова програмування PHP

У світі веб-розробки, мова програмування PHP займає одне з


провідних місць. Вона є популярним вибором серед розробників завдяки
своїм численним перевагам. Ця мова програмування спеціалізується на
створенні динамічних веб-сайтів та додатків. Вона надає розробникам
потужні інструменти та функціональні можливості, які дозволяють швидко
розробляти та розширювати веб-проекти.
Однією з переваг PHP є його велика спільнота розробників, яка
активно співпрацює та підтримує мову. Тому розробникам доступні
величезна кількість ресурсів, документації, форумів та плагінів, які
полегшують процес розробки.
PHP має простий і зрозумілий синтаксис, що робить його легким у
вивченні. Вона базується на структурі мови C, що робить її знайомою для
розробників, які вже працювали з іншими мовами програмування [6].
Ще однією з переваг PHP є його широкі можливості. Мова має
багатий набір вбудованих функцій та бібліотек, які дозволяють
розробникам швидко виконувати різноманітні завдання. Вона підходить
для створення систем управління контентом, онлайн-магазинів та різних
веб-додатків, тощо.
Ця мова програмування також підтримує взаємодію з різними базами
даних, таких як MySQL, PostgreSQL, SQLite та інші.
Незважаючи на всі переваги, PHP має деякі недоліки. В порівнянні з
22

іншими мовами програмування, вона може бути менш продуктивною з


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

1.3.2 Програмний каркас Laravel

Laravel - один з найпопулярніших програмних каркасів для веб-


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

Одним з найбільших переваг Laravel є його активна та велика


спільнота розробників. Тому можна знайти безліч документації, плагінів,
розширень та підтримку від інших розробників. Ви завжди зможете знайти
відповіді на свої питання та розв'язати проблеми, з якими стикаєтесь під час
розробки на форумах та інших ресурсах [7].
Laravel надає розробникам велику свободу в творчому процесі та
допомагає створити масштабовані, безпечні та ефективні веб-додатки.
Використання Laravel спрощує розробку та підтримку веб-проектів, що
робить його відмінним вибором для розробників усіх рівнів навичок.

1.3.3 Бібліотека Filament

Laravel Filament - інструмент для розробки адміністративних панелей


у веб-додатках. Ця бібліотека, яка базується на потужному програмному
каркасі Laravel, забезпечує зручний спосіб створення професійних та
досконало налаштованих панелей управління.
Filament пропонує інтуїтивно зрозумілий та елегантний інтерфейс, що
дозволяє розробникам швидко налаштовувати та розгортати
адміністративні панелі для своїх веб-додатків. Це дозволяє програмістам
сконцентруватись на реалізації основної функціональності додатка, не
витрачаючи багато часу на розробку складних інтерфейсів адміністрування.
Одною з головних переваг Filament є його гнучкість та можливості
налаштування. За допомогою цієї бібліотеки, можна легко визначити та
налаштувати поля, форми, таблиці, фільтри та інші елементи, необхідні для
вашої адміністративної панелі. Є можливість використовувати готові
компоненти та розширювати їх функціональність, щоб задовольнити ваші
унікальні потреби.
Ще однією значною перевагою Filament є його спрощена робота з
24

моделями та базами даних. Він надає інтуїтивний спосіб взаємодії з даними,


включаючи створення, редагування, видалення та пошук записів. Бібліотека
автоматично забезпечує розміщення даних у таблицях та взаємозв'язок між
ними, що дозволяє легко управляти даними вашого додатка.
Незважаючи на всі його переваги, Filament також має деякі
обмеження. Оскільки це відносно нова бібліотека, наявність розширень та
документація можуть бути обмеженими порівняно з іншими рішеннями.
Однак, активна спільнота Laravel і постійні оновлення від команди
розробників допомагають у вирішенні проблем та встановленні додаткових
функцій [8].

1.3.4 Бібліотека Chart.js

Chart.js - інструмент для візуалізації даних. Це потужна бібліотека,


яка дозволяє розробникам легко та ефективно створювати графіки, діаграми
та інші види даних на веб-сторінках.
Chart.js пропонує простий та зрозумілий інтерфейс, що дозволяє
розробникам швидко інтегрувати графіки у свої проекти. За допомогою цієї
бібліотеки, можна створювати різні типи графіків, такі як лінійні, кругові,
стовпчасті та багато інших. Крім того, можна налаштовувати вигляд
графіків, включаючи кольори, шрифти та масштабування, щоб забезпечити
оптимальну візуалізацію даних.
Однією з ключових переваг Chart.js є його можливості
інтерактивності. Можливо включати взаємодію з графіками, таку як
підсвічування точок при наведенні, масштабування, переміщення та інші
дії. Це дозволяє користувачам взаємодіяти з графіками та отримувати
більше інформації з представлених даних.
Chart.js також надає широкі можливості для налаштування та
25

розширення. Є можливість налаштовувати осі, легенду, мітки та інші


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

1.3.5 Інструментарій Docker

Docker - це інструмент, який дозволяє розробникам розгортати та


керувати програмними додатками в контейнерах. Контейнери є
портативними та легкими середовищами, що містять усі необхідні
залежності, бібліотеки та конфігураційні файли для запуску додатків.
Головна перевага Docker полягає в його можливості ізолювати
додатки від один одного та від операційної системи хоста. Це означає, що
ви можете запускати додатки в контейнерах з однаковою надійністю та
стабільністю, незалежно від конфігурації вашої операційної системи. Крім
того, Docker дозволяє швидко масштабувати та розподіляти додатки на
різні середовища, забезпечуючи більшу гнучкість та ефективність.
Інший важливий аспект Docker - це його зручність в управлінні та
розгортанні додатків. Він надає широкий спектр інструментів та команд, що
спрощують створення, запуск, зупинку та моніторинг контейнерів. Це
дозволяє розробникам ефективно керувати своїми додатками та швидко
реагувати на зміни вимог.

1.3.6 СКБД MySQL

MySQL є однією з найпопулярніших та широко використовуваних


26

СКБД на сьогоднішній день. Вона забезпечує зручне та ефективне


зберігання, керування та доступ до даних.
Одна з головних переваг цієї СКБД – це швидкодія для більшості
простих рішень. MySQL забезпечує високу швидкість обробки запитів і
доступу до даних, що робить її ефективною для веб-додатків з великим
обсягом даних.
Крім того, MySQL має простий та зрозумілий синтаксис запитів. Це
робить його дружнім для розробників, навіть для тих, хто має обмежений
досвід у роботі з базами даних. Запити можна легко складати та виконувати,
що прискорює розробку та тестування програмного забезпечення. СКБД
також має гнучкість у використанні. Вона підтримує різні типи даних,
включаючи текстові, числові, дати та багато інших. Це дозволяє
розробникам зберігати та обробляти різноманітні дані залежно від потреб
їх додатків.
Окрім цього, MySQL має широку спільноту користувачів та активну
підтримку. Це означає, що ви можете знайти багато ресурсів, документації,
форумів та експертів, готових допомогти вам у разі потреби.
Незважаючи на всі ці переваги, MySQL також має деякі недоліки.
Наприклад, він може стикатись з обмеженнями масштабування, особливо
при обробці великих обсягів даних.
У підсумку, MySQL - це широко використовувана СКБД з простим
синтаксисом та високою швидкодією, особливо для веб-додатків. Вона має
гнучкість у використанні та підтримує різні типи даних. І хоча вона має
деякі обмеження масштабування, наявність активної спільноти
користувачів та підтримки допомагає забезпечити успішну роботу з цією
СКБД.
27

1.3.7 СКБД PostgreSQL

PostgreSQL - це потужна система керування базами даних, розроблена


на основі мови SQL (Structured Query Language). Вона відома своєю
надійністю, гнучкістю та розширюваністю, і є однією з найпопулярніших
відкритих СКБД.
Однією з найважливіших особливостей PostgreSQL є його
розширюваність. Ви можете створювати власні типи даних, функції та мови
програмування, що дозволяє адаптувати систему до конкретних вимог
проекту. Це дає вам велику гнучкість при розробці та налаштуванні бази
даних.
Постгрес також має вражаючі можливості масштабування. Він
підтримує роботу з великими обсягами даних та високими навантаженнями.
Завдяки паралельному виконанню запитів, реплікації та кластеризації,
можна забезпечити високу доступність та продуктивність вашої бази даних.
Безпека також є однією з ключових характеристик PostgreSQL. Він
використовує механізми транзакцій та журналування для забезпечення
цілісності даних. Це означає, що ви можете бути впевнені в надійності та
стійкості вашої бази даних навіть при виникненні непередбачених ситуацій
або збоях.
Крім того, PostgreSQL має широкий набір вбудованих функцій, які
дозволяють вам працювати з різними типами даних, включаючи
географічні та геодезичні дані, JSON, XML, повнотекстовий пошук та інші.
Ви також можете створювати власні розширення та модулі, які доповнюють
функціональність бази даних згідно з вашими потребами.
Загалом, PostgreSQL є потужною, надійною та розширюваною СКБД,
яка підходить для різних проектів і використовується як в індустрії, так і в
наукових дослідженнях. Його активне співтовариство розробників і
користувачів забезпечує постійну підтримку, розвиток та вдосконалення
28

цієї бази даних.


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

2 ЛІНІЙНІ АЛГОРИТМИ

2.1 Лінійні алгоритми. Прогнозування кріптовалютних


операцій
Лінійні алгоритми є потужним інструментом у прогнозуванні
кріптовалютних операцій. Вони базуються на статистичних моделях та
аналізують залежність між різними факторами та ціновою динамікою.
Застосування лінійних алгоритмів, таких як метод регресії найменших
квадратів та хребтова регресія, дозволяє нам побудувати моделі, які
описують залежність між вхідними факторами та цінами кріптовалют.
У програмному застосунку окрім лінійних алгоритмів також
застосовані інші технічні індикатори для аналізу та прогнозування
кріптовалютних даних.
У сучасному світі кріптовалюти стають все більш популярними та
важливими фінансовими активами. Їх висока прибутковість та широкі
можливості привертають увагу інвесторів, але вони також відомі своєю
високою волатильністю. Прогнозування цінових змін кріптовалют є
важливою задачею для інвесторів, оскільки допомагає приймати
обґрунтовані рішення. Лінійні алгоритми, такі як регресія найменших
квадратів та хребтова регресія, можуть бути потужним інструментом у
прогнозуванні. У програмному застосунку також використовуються
технічні індикатори, такі як RSI, стохастичний RSI, SMA та EMA, для
аналізу та прогнозування кріптовалютних даних. Система збирає дані з
різних джерел та надає інвесторам об'єктивну інформацію для прийняття
рішень щодо кріптовалютних операцій.
30

2.2 Методи прогнозування

2.2.1 Індекс відносної сили (RSI)

Індекс відносної сили (RSI) – технічний індикатор, який


використовується для вимірювання сили та швидкості зміни цін фінансових
активів. Він надає цінну інформацію про перекупленість або
перепроданість активів, допомагаючи визначити можливі зміни у тренді
ціни.
RSI обчислюється шляхом порівняння зростання та зниження цін
активів на певний період. Спочатку треба визначити середнє значення
зростання ціни та середнє значення зниження ціни за цей період. Зростання
та зниження ціни обчислюються як різниця між ціною закриття активу на
сьогодні та ціною закриття на попередній день.
Після обчислення середніх значень, визначається відносна сила
(relative strength, RS) шляхом ділення середнього зростання на середнє
зниження ціни. Чим більше значення RS, тим сильніше актив.
Завершальним кроком є обчислення самого RSI, який виражається у
відсотках. Це робиться за допомогою формули, де 100 віднімається від
ділення 100 на одиницю плюс RS. Значення RSI варіюється від 0 до 100.
RSI використовують для отримання сигналів про перекупленість або
перепроданість активів. Зазвичай, якщо індикатор перевищує 70, це може
вказувати на перекупленість активу, що може спричинити зворотний рух
ціни. З іншого боку, якщо RSI падає нижче 30, це може вказувати на
перепроданість активу, що може призвести до зростання ціни [1].

2.2.2 Стохастичний індекс відносної сили (Stochastic RSI)

Стохастичний індекс відносної сили (Stochastic RSI) є комбінацією


31

двох популярних технічних індикаторів - індексу відносної сили (RSI) та


стохастичного осцилятора. Він дозволяє виявляти перекупленість або
перепроданість активів та визначати можливі точки входу або виходу з
ринку.
Для розуміння стохастичного індексу відносної сили потрібно
додатково розглянути, як працює стохастичний осцилятор, а потім як їх
можна обʼєднати..
Стохастичний осцилятор дозволяє визначити швидкість зміни ціни та
порівняти поточну ціну активу з його діапазоном цін за певний період [5].
Процес розрахунку стохастичного осцилятора включає наступні кроки:
1. Обрання періоду стохастичного осцилятора, наприклад, 14 днів.
2. Визначення максимальної та мінімальної ціни активу за обраний
період.
3. Обчислення поточного значення стохастичного осцилятора,
порівнюючи поточну ціну з діапазоном цін та використовуючи відповідну
формулу.
𝐶𝑡 − 𝐿𝑛
%𝐾𝑡 =
𝐻𝑛 − 𝐿𝑛
Де 𝐶𝑡 — ціна закриття поточного періоду, 𝐿𝑛 — найнижча ціна за
останні n періодів, 𝐻𝑛 — найвища ціна за останні n періодів, %𝐾𝑡 – значення
стохастичного осцилятора.
Лінія значень %𝐾𝑡 відображає значення стохастичного RSI і може
бути використана для аналізу ринку та прийняття рішень щодо торгівлі.
Стратегії торгівлі з використанням стохастичного RSI можуть
варіюватися в залежності від власних уподобань та стиль торгівлі кожного
трейдера. Наприклад, можна шукати сигнали перекупленості або
перепроданості активу, коли значення стохастичного RSI перетинає певні
порогові значення (наприклад, 80 або 20) [1].
Загалом, Stochastic RSI є корисним технічним індикатором для
32

аналізу ринку та прийняття рішень щодо торгівлі через поєднання одразу


двох технічних індикаторів у собі.

2.2.3 Проста рухома середня (SMA)

Проста рухома середня (SMA) є одним з базових технічних


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

𝑆𝑀𝐴 = ∑ 𝑐𝑖
𝑖=0,..𝑛

Де SMA - проста рухома середня, 𝑐𝑖 – цінові значення активу за


вибраний період, N - кількість днів або період, за який розраховується SMA
Наприклад, якщо потрібно розрахувати 10-денну SMA, то потрібно
взяти останні 10 цінових значень активу та обчислити їх середнє значення.
SMA використовується для згладжування цінових даних та виявлення
загальної тенденції ринку. Чим більший період SMA, тим більше
згладжування відбувається, а загальна тенденція стає більш очевидною.
SMA використовують для різних цілей, таких як визначення моменту
входу або виходу з ринку, виявлення перекриття (коли ціна перетинає
SMA), а також для визначення підтримок та опорних рівнів [4].
Цій індикатор є простою та добре зрозумілою методологією, що
робить її популярним інструментом для аналізу ринку.
33

2.2.4 Експоненціальна рухома середня (EMA)

Експоненціальна рухома середня (EMA) - це технічний індикатор,


який використовується для згладжування цінових даних та виявлення
трендів на фінансових ринках. EMA надає більше ваги недавнім даним,
дозволяючи швидше реагувати на зміни цін.
Формула для розрахунку EMA полягає в оновленні попереднього
значення EMA з поточним ціновим значенням активу. Оновлення EMA
здійснюється за допомогою наступної формули:
𝐸𝑀𝐴(𝑡) = 𝑐(𝑡) ∗ 𝑘 + 𝐸𝑀𝐴(𝑦) ∗ (1 − 𝑘)
Де EMA(t) – значення EMA в поточний часовий період t, с(t) - цінове
значення активу в поточний часовий період t, EMA(y) - попереднє значення
EMA в попередньому часовому періоді (t-1), k - коефіцієнт згладжування,
який визначає вагу недавніх даних (часто обчислюється як 2 / (N + 1), де N
- кількість періодів)
Важливо зазначити, що для обчислення першого значення EMA
(EMA(0)), потрібно використовувати ініціалізаційний метод, наприклад,
просту рухому середню (SMA) або початкове значення ціни [1].
EMA є корисним інструментом для трейдерів, оскільки вона надає
швидку реакцію на зміни цін та допомагає виявляти трендові рухи активів.

2.2.5 Метод найменших квадратів

Метод найменших квадратів (МНК) є математичним підходом до


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

даними. Ця сума квадратів відхилень відома як квадратична помилка.


Модель лінійної функції, що використовується в МНК, може бути
представлена наступним чином:
𝑦 = 𝛽0 + 𝛽1 𝑥
Де Y - залежна змінна, яку ми намагаємося прогнозувати, X -
незалежна змінна, яка використовується для прогнозування, β0 та β1 -
параметри моделі, які потрібно знайти.
Основна ідея МНК полягає в підборі параметрів β0 та β1, таким
чином, щоб сума квадратів різниць між фактичними значеннями Y і
прогнозованими значеннями моделі була якомога меншою. Це досягається
шляхом рішення системи нормальних рівнянь, яка виводиться з
диференціювання функції помилки за параметрами β0 та β1.

Формули для обчислення параметрів МНК:


∑𝑛𝑖=0,..𝑛(𝑥𝑖 − 𝑥̅ )(𝑦𝑖 − 𝑦̅)
𝛽1 =
∑𝑛𝑖=0,..𝑛(𝑥𝑖 − 𝑥̅ )2
𝛽0 = 𝑦̅ − 𝛽1 𝑥̅
Де Xi та Yi - значення незалежної та залежної змінних відповідно, X̄
та Ȳ - середні значення незалежної та залежної змінних відповідно.
Після визначення параметрів моделі МНК – їх можна
використовувати для прогнозування значень залежної змінної Y на основі
нових значень незалежної змінної X.
Метод найменших квадратів є потужним інструментом для аналізу
даних та виявлення залежностей між змінними. Він широко
використовується в економічних, фінансових та наукових дослідженнях для
побудови прогнозів, оцінки ризиків та прийняття рішень [10].
35

2.2.6 Хребтова регресія

Хребтова регресія (Ridge regression) є методом регуляризації, який


використовується для зменшення перенавчання у лінійній регресії. Вона
базується на додаванні штрафу за величину коефіцієнтів у функцію втрат з
метою зменшення їхніх значень. Цей метод допомагає контролювати
складність моделі та поліпшує її узагальнюючу здатність.
У матричній формі хребтова регресія може бути записана наступною
формулою:
𝛽 = (𝑋 𝑇 ∗ 𝑋 + 𝜆 ∗ 𝐼)−1 ∗ 𝑋 𝑇 ∗ 𝑌
Де β̂ - оновлені коефіцієнти моделі регресії, X – матриця ознак (n
рядків, p стовпців), де n - кількість спостережень, p - кількість ознак, Y -
вектор цільових значень (n рядків), λ - параметр, який контролює рівень
регуляризації, I - p × p одинична матриця
Головна ідея хребтової регресії полягає в додаванні
регуляризаційного члена до матриці X^T*X. Цей член включає параметр λ,
який контролює вплив регуляризації. Чим більше значення λ, тим сильніше
штрафується величина коефіцієнтів, що допомагає зменшити їхні значення.
Хребтова регресія є ефективним методом для управління
перенавчанням у лінійних моделях регресії. Вона дозволяє підвищити
стійкість моделі до шуму та недосконалостей в даних, а також поліпшити її
прогностичні здібності. Параметр λ використовується для налаштування
рівня регуляризації, де більші значення λ відповідають сильнішій
регуляризації. Цей метод широко використовується в статистиці,
машинному навчанні та інших областях для побудови стійких та
узагальнюючих регресійних моделей.
36

3 ПРОГРАМНА РЕАЛІЗАЦІЯ

3.1 Архітектура програмного забезпечення


Головною функцією програмного забезпечення є аналіз та
прогнозування кріптовалютних даних, а саме – ціни закриття японських
свічок. Для оптимального використання та швидкодії потрібно розділити
обовʼязки окремих частин.
Тому з самого початку розроблення архітектури програмного
продукту були розроблені наступні концептуальні предметні області, які
ніяк не повʼязані між собою:
Джерела даних – це будь-які ресурси у мережі Інтернет, які містять
необхідні дані для подальшого використання у аналізі. Основними даними,
які були необхідні були у джерелах – це реальні значення японських свічок
з кріптовалютних бірж, а саме: ціна відкриття, ціна закриття, максимальна
та мінімальна ціна, обсяг торгів базового та котирувального активів,
кількість угод за деякий визначений період часу;
Сервіс-сховище – мікросервіс для генерування та зберігання
уніфікованих кріптовалютних даних із різних джерел. У дипломному
проекті реалізовано зберігання даних з кріптобіржі Binance;
Адмін-панель аналізатор – мікросервіс, який представляє собою
адміністраторську панель з можливістю автентифікації. Цей сервіс дає
можливість переглядати активи, по яким є можливість витягнути дані із
сервісу-сховища та зберігти їх у локальній базі даних. Та головною
функцією є можливість аналізу та прогнозування наступної ціни активу на
базі збережених кріптовалютних даних;
Програмний продукт дипломного проекту складається з двох окремих
незалежних програмних застосунків. Усю архітектуру можна представити
наступною схемою на рисунку 3.1.1
37

Рисунок 3.1.1 – Схема архітектури програмного продукту

Тобто спочатку потрібно знайти якісь джерела даних (наприклад


кріптовалютна біржа Binance) із можливістю віддаленої взаємодії через
API.
Далі сервіс-сховище із швидкою базою даних для зберігання потрібно
інтегрувати до джерел даних. Також цей мікросервіс повинен мати
можливість отримувати два запити по API:
Для генерування даних по японським свічкам по заданим параметрам.
Параметри включають – назву пари активів (наприклад BTC/USDT), тип
інтервалу (наприклад 1 годину), дата початку та кінця інтервалу (наприклад
2023-05-19 – дата початку та 2023-05-20 – дата кінця);
Для отримання даних по японським свічкам по заданим параметрам.
Параметри включають – назву пари активів (наприклад BTC/USDT), тип
інтервалу (наприклад 1 годину), дата початку та кінця інтервалу (наприклад
2023-05-19 – дата початку та 2023-05-20 – дата кінця) та ліміт (наприклад
500), який позначає максимальну кількість обʼєктів, які можна отримати за
один запит;
Далі мікросервіс адміністраторська-панель аналізатор повинна мати
38

можливість отримувати дані від сервіса-сховища та зберігати їх у локальній


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

3.2 Структура мікросервісу сховища


Мікросервіс сховище побудований на мові програмування PHP за
допомогою програмного каркасу Laravel.
Проект запускається та будується за допомогою інструментарію
Docker. Docker-compose файл має три контейнера:
Laravel.test – контейнер, який є оболонкою програмного застосунку та
програмного серверу. Є контейнером за замовчуванням від програмного
каркасу Laravel;
Postgres – контейнер для бази даних PostgreSQL. Усі запити до бази
даних переадресовуються у цю інстанцію;
Redis – контейнер для NoSQL бази даних Redis. Він використовується
здебільшого для програмних черг програмного каркасу Laravel;
Додаток має низку структурних компонентів, кожен з яких відповідає
за своє призначення. Основну структуру представлено на рисунку 3.2.1
39

Рисунок 3.2.1 – Структура додатку мікросервіса-сховища

Структура включає в себе наступні компоненти:


Console – включає усю взаємодію із консоллю та її командами. Для
програмного застосунку був реалізована команда для генерації зразків
даних по японським свічкам по максимально варіативним критеріям за
схожі проміжки часу, але по різним типам періодів та пар активів;
Contracts – усі контракти програмної системи. Головним контрактом
є інтерфейс отримання із зовнішних джерел кріптовалютних даних;
DataTransferObjects – сутності, які застосовуються для перекидання
даних з одного програмного шару на інший;
Enums – директорія із усіми перерахуваннями, які застосовуються у
додатку;
Exceptions – класи-винятки, які застосовуються для більш
конкретного найменування окремих видів помилок;
40

ExternalApi – компонента, яка містить код із інтеграціями до


зовнішних додатків по API;
Factories – класи-фабрики для створення обʼєктів класів по однім
правилам;
Http – велика компонента, яка містить усі програмні взаємодії із
додатком по протоколу HTTP;
Jobs – компонент, який дозволяє виконувати задачі асинхронно в
фоновому режимі. Він забезпечує механізм для розподілу важких задач,
таких як відправка електронних листів, обробка зображень або виконання
довгих операцій, на віддалені сервери або робочі процеси;
Models - є компонентом, який представляє структуру та логіку
взаємодії з базою даних. Він дозволяє вам визначити та маніпулювати
даними в таблицях вашої бази даних за допомогою об'єктно-орієнтованого
підходу;
Providers - є компонентами, які відповідають за реєстрацію та
налаштування різних складових вашого додатку. Вони дозволяють вам
організовувати та керувати залежностями, сервісами, маршрутами та
іншими ресурсами у вашому Laravel-додатку;
Services – є компонентами-сервісами, які дозволяють виокремити
надскладну бізнес або додатка логіку в окремі класи;
Розподілена структура та обовʼязки у застосунку надають можливість
легкого масштабування та простої розробки.
Для отримання даних є API маршрут, по якому можна отримати по
набору параметрів – готовий комплект даних про японські свічки. Приклад
Для генерування кріптовалютних даних у структурі є дві різні
можливості.
Перший варіант – це зробити запит по API. Приклад запиту надано на
рисунку 3.2.2
41

Рисунок 3.2.2 – Приклад API запиту для отримання даних японських


свічок

Другий варіант – це генерування зразків даних по японським свічкам


по максимально варіативним критеріям за схожі проміжки часу, але по
різним типам періодів та пар активів. Параметри, які застосовуються за
замовчуванням у команді надані на рисунку 3.2.3
42

Рисунок 3.2.3 – Параметри за замовчуванням у команді для


генерування зразків даних по японським свічкам

3.3 Бази даних мікросервісу сховища


База даних мікросервісу сховища побудовано на СКБД PostgreSQL.
PostgreSQL застосовується для більш швидкого зберігання та отримання
даних аніж СКБД MySQL. Для нашого випадку це дуже важливо для
прискорення запитів та генерацій даних.
Структура бази даних включає тільки одну таблицю, яка не є
43

таблицею за замовчуванням від програмного каркасу Laravel – candlesticks


(перекладається як свічники). Повна структура представлена на рисунку
3.3.1

Рисунок 3.3.1 – Структура бази даних мікросервісу сховища

Таблиця candlesticks має наступні колонки:


Id – унікальний ідентифікатор запису;
Asset_pair – назва пари активів;
Open_time – час відкриття японської свічки;
Interval_type – часовий тип інтервалу. Може містити наступні
значення: OneSecond = '1s', OneMinute = '1m', ThreeMinutes = '3m',
FiveMinutes = '5m', FifteenMinutes = '15m', ThirtyMinutes = '30m', OneHour =
'1h', TwoHours = '2h', FourHours = '4h', SixHours = '6h', EightHours = '8h',
TwelveHours = '12h', OneDay = '1d', ThreeDays = '3d', OneWeek = '1w',
OneMonth = '1M';
Open_price – ціна відкриття японської свічки;
44

Close_price – ціна закриття японської свічки;


High_price – максимальна ціна японської свічки;
Low_price – мінімальна ціна японської свічки;
Total_base_asset_volume - загальний обсяг головного активу;
Total_quote_asset_volume - загальний обсяг котирувального активу;
Trades_count – кількість угод між продавцями та покупцями;
Takers_buy_asset_volume – обсяг головного активу, купленого через
спот закупівлі;
Takers_quote_asset_volume – обсяг котирувального активу, купленого
через спот закупівлі;
Created_at – час створення запису у базі даних;
Updated_at – час останнього оновлення запису у базі даних;
Повне представлення таблиці показано на рисунку 3.3.2

Рисунок 3.3.2 – Схема таблиці для зберігання японських свічок

Таким чином база даних сконцентрована на оптимізації запитів до


45

однієї таблиці.

3.4 Структура мікросервісу адмін-панелі аналізатора


Мікросервіс адмін-панелі аналізатора побудований на мові
програмування PHP за допомогою програмного каркасу Laravel.
Проект запускається та будується за допомогою інструментарію
Docker. Docker-compose файл має три контейнера:
Laravel.test – контейнер, який є оболонкою програмного застосунку та
програмного серверу. Є контейнером за замовчуванням від програмного
каркасу Laravel;
mysql – контейнер для бази даних MySQL. Усі запити до бази даних
переадресовуються у цю інстанцію;
Redis – контейнер для NoSQL бази даних Redis. Він використовується
здебільшого для програмних черг програмного каркасу Laravel;
Додаток має низку структурних компонентів, кожен з яких відповідає
за своє призначення. Основну структуру представлено на рисунку 3.4.1
46

Рисунок 3.4.1 – Структура додатку мікросервіса адміністраторської


панелі

Contracts – усі контракти програмної системи. Головним контрактом


системи є інтерфейс регресії;
DataTransferObjects – сутності, які застосовуються для перекидання
даних з одного програмного шару на інший;
Enums – директорія із усіми перерахуваннями, які застосовуються у
додатку;
Exceptions – класи-винятки, які застосовуються для більш
конкретного найменування окремих видів помилок;
ExternalApi – компонента, яка містить код із інтеграціями до
зовнішних додатків по API;
47

Factories – класи-фабрики для створення обʼєктів класів по однім


правилам;
Filament – директорія для зберігання усіх компонент бібліотеки
Filament для адміністраторської панелі;
Http – велика компонента, яка містить усі програмні взаємодії із
додатком по протоколу HTTP;
Jobs – компонент, який дозволяє виконувати задачі асинхронно в
фоновому режимі. Він забезпечує механізм для розподілу важких задач,
таких як відправка електронних листів, обробка зображень або виконання
довгих операцій, на віддалені сервери або робочі процеси;
Models - є компонентом, який представляє структуру та логіку
взаємодії з базою даних. Він дозволяє вам визначити та маніпулювати
даними в таблицях вашої бази даних за допомогою об'єктно-орієнтованого
підходу;
Providers - є компонентами, які відповідають за реєстрацію та
налаштування різних складових вашого додатку. Вони дозволяють вам
організовувати та керувати залежностями, сервісами, маршрутами та
іншими ресурсами у вашому Laravel-додатку;
Services – є компонентами-сервісами, які дозволяють виокремити
надскладну бізнес або додатка логіку в окремі класи;
Traits – це компонента із механізмами мови програмування PHP. Вони
дозволяють використовувати повторно властивості та методи в декількох
класах;
Основні структурні елементи адміністраторської панелі показані на
рисунку 3.4.2
48

Рисунок 3.4.2 – Структура адміністраторської панелі

Адміністраторська панель має три головні сторінки:


Asset Pairs – базована на моделі пари кріптовалютних активів.
Представлення усієї моделі у вигляді таблиці та можливість генерування по
пари активів даних по японським свічкам;
Candlestick Records - базована на моделі японських свічок. Показує у
вигляді таблиці наявні у локальній базі даних записи;
Candlestick Analytics – найголовніша сторінка, де проходить аналіз та
прогнозування кінцевих цін японських свічок;
Також важливим модулем програмного додатку є модуль із
імплементацією технічних та лінійних алгоритмів аналізу. Структура цього
модуля представлена на рисунку 3.4.3
49

Рисунок 3.4.2 – Структура модуля аналітичних методів

Цей модуль реалізує базові технічні індикатори (RSI, EMA, SMA,


Stochastic RSI) та лінійні алгоритми аналізу (Регресія методом найменших
квадратів, хребтова регресія).

3.5 Бази даних мікросервісу адмін-панелі аналізатора

База даних мікросервісу сховища побудовано на СКБД MySQl.


Структура бази даних включає три таблиці, які не є таблицями за
замовчуванням від програмного каркасу Laravel – candlesticks
(перекладається як свічники), asset_pairs (перекладається як пара активів) та
users (перекладається як користувачі). Повна структура представлена на
рисунку 3.5.1
50

Рисунок 3.5.1 – Структура бази даних мікросервісу адмін-панелі


аналізатора

Таблиця candlesticks має наступні колонки:


Id – унікальний ідентифікатор запису;
Asset_pair_id – ідентифікатор пари асетів із таблиці asset_pairs ;
Open_time – час відкриття японської свічки;
Interval_type – часовий тип інтервалу. Може містити наступні
значення: OneSecond = '1s', OneMinute = '1m', ThreeMinutes = '3m',
FiveMinutes = '5m', FifteenMinutes = '15m', ThirtyMinutes = '30m', OneHour =
'1h', TwoHours = '2h', FourHours = '4h', SixHours = '6h', EightHours = '8h',
TwelveHours = '12h', OneDay = '1d', ThreeDays = '3d', OneWeek = '1w',
OneMonth = '1M';
51

Open_price – ціна відкриття японської свічки;


Close_price – ціна закриття японської свічки;
High_price – максимальна ціна японської свічки;
Low_price – мінімальна ціна японської свічки;
Total_base_asset_volume - загальний обсяг головного активу;
Total_quote_asset_volume - загальний обсяг котирувального активу;
Trades_count – кількість угод між продавцями та покупцями;
Takers_buy_asset_volume – обсяг головного активу, купленого через
спот закупівлі;
Takers_quote_asset_volume – обсяг котирувального активу, купленого
через спот закупівлі;
Created_at – час створення запису у базі даних;
Updated_at – час останнього оновлення запису у базі даних;
Таблиця asset_pairs має наступні колонки:
Id – унікальний ідентифікатор запису;
Name – найменування пари активів;
Created_at – час створення запису у базі даних;
Updated_at – час останнього оновлення запису у базі даних;
Таблиця users має наступні колонки:
Id – унікальний ідентифікатор запису;
Name – імʼя користувача;
Email – електронна пошта;
Email_verified_at – колонка за замовчуванням від Laravel. Не
застосовується;
Password – пароль;
Remember_token - колонка за замовчуванням від Laravel. Не
застосовується;
Created_at – час створення запису у базі даних;
Updated_at – час останнього оновлення запису у базі даних;
52

Таким чином база даних максимально нормалізована для


оптимальних запитів у доменній області адмін-панелі аналізатора.
Архітектура та гарна структура програмного продукту є однією з
головних та першочергових речей при проектуванні бізнес продукту.
Для мінімізації звʼязків та розподіленню обовʼязків була обрана
мікросервісна архітектура, яка складалася із джерел даних, сервісу-сховища
та сервісу-аналізатора. Кожен з них відповідає за свої функції та має тільки
API інтерфейс як оболонку для взаємозвʼязків із іншими зовнішніми
сутностями архітектури.
53

4 ВЗАЄМОДІЯ КОРИСТУВАЧА З ВЕБ-ДОДАТКОМ

Розроблене програмне забезпечення наразі не є загальнодоступним в


Інтернет. Обидва мікросервіси знаходяться у відкритих репозиторіях на
GitHub. Тому для запуску потрібно зробити клони проектів у будь-якому
інтегрованому середовищі розробки за допомогою команди “git clone”.
Для подальшого запуску у будь-якому середовищі потрібно мати
наступне встановленим:
Інструментарій Docker для контейнеризації додатка;
Менеджер пакетів Composer;
Менеджер пакетів npm;
Node.js;
Далі для того, щоб встановити усі необхідні пакети – потрібно
запустити дві команди: composer install & npm i.
Через те, що усі налаштування до Docker контейнерів вже є у
репозиторіях, то для кожного проекту можна запустити ./vendor/sail up -d
для розгортання усіх необхідних контейнерів.
Після виконання описаних вище дій ми будемо мати два працюючих
додатка на різних портах у локальній мережі.
Для генерування бази даних для обох додатків також потрібно
запустити sail artisan migrate. Також для запуску усіх npm пакетів потрібно
запустити npm run dev у консолі.
Для генерування зразків даних у проекту сервісу-сховища потрібно
запустити додаткову команду sail artisan candlesticks:generate-samples.
Також для проекту сервісу-адмін-панелі потрібно запустити додаткову
команду sail artisan db:seed.
Після цього додатки готові до роботи, та можна зробити першого
користувача, додавши його за допомогою консольної команди sail artisan
54

make:filament-user. Додавання нового користувача проілюстровано на


рисунку 4.1

Рисунок 4.1 – Додавання нового користувача через консоль

Тепер користувач має змогу авторизуватися у нашому додатку.


Перейдемо за посиланням, яке нам запропонувала консоль та потрапимо до
сторінки логіну. Введемо свою електронну поштову адресу та пароль.
Сторінка авторизації показана на рисунку 4.2

Рисунок 4.2 – Сторінка авторизації


55

Після аутентифікації системою ми потрапляємо до


адміністраторської панелі управління. Вона показана на рисунку 4.3

Рисунок 4.3 – Адміністраторська панель

Користувач має можливість переглянути усі наявні пари


кріптовалютних активів на сторінці “Asset Pairs” як показано на рисунку 4.4
56

Рисунок 4.4 – Сторінка наявних пар кріптовалютних активів

Для подальшого використання додатку потрібно отримати дані по


якійсь парі активів по японським свічкам. Це можливо зробити на сторінці
наявних пар кріптовалютних активів за допомогою кнопок “Generate
candles”. Для прикладу натиснемо для пари активів “BTC/USDT”. Буде
показано вікно, де користувач може обрати за яким типом інтервалу та за
який час отримати дані із сервісу-сховища наявні дані. На рисунку 5.5
показаний приклад заповнення даного вікна

Рисунок 4.5 – Приклад заповнення вікна для отримання даних по


парі кріптовалютних активів

Після запуску має пройти деякий час для того, щоб усі дані збереглися
у локальній базі даних сервісу адмін-панелі аналізатора. Після цього ми
можемо переглянути згенеровані дані на сторінці “Candlestick->Records”.
Приклад даних показаний на рисунку 4.6
57

Рисунок 4.6 – Сторінка із згенерованими даними по японським


свічкам

Також для максимального налаштування – кожен рядок згенерованих


даних можна переглянути повністю, натистувши на нього, та змінити будь-
яке його поле як показано на рисунку 4.7

Рисунок 4.7 – Сторінка із налаштування окремого рядка таблиці


даних по японським свічкам
58

Після отримання деякого набору даних – зʼявляється можливість


аналітики та прогнозування наступних даних. Для цього потрібно перейти
на сторінку “Candlesticks->Analytics”.
Ця сторінка містить низку кнопок для кожного виду технічного
індикатора та лінійного алгоритму аналізу. Для прикладу натиснемо на
кнопки SMA(7) та EMA(7) та згенеруємо відповідні графіки цих
індикаторів до існуючого графіка японських свічок. Отримаємо наступну
ілюстрацію як на рисунку 4.8

Рисунок 4.8– Сторінка аналітики із включеними індикаторами


SMA(7) та EMA(7)

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


технічних індикаторів RSI та Stochastic RSI. Для прикладу згенеруємо усі
можливі варіанти (за період 3, 5 та 7) для кожного індикатора. Це робиться
для того, щоб отримати максимально точний показник індикаторів. Графік
59

для індикаторів RSI показано на рисунку 4.9

Рисунок 4.9– Графіки індикаторів RSI(3), RSI(5) та RSI(7)

Графік для індикаторів Stochastic RSI показано на рисунку 4.10

Рисунок 4.10– Графіки індикаторів Stochastic RSI(3), Stochastic


RSI(5) та Stochastic RSI(7)
60

Для прогнозування за допомогою лінійних регресій ми можемо


застосувати кнопки наверху сторінки “Generate LSR” та “Generate RR”. Для
прикладу візьмемо “Generate RR”, яка позволить нам згенерувати графік до
хребтової регресії. Натиснемо на кнопку та заповнимо усі поля у вікні. Для
прикладу заповнимо, що будемо генерувати графік за основою поля ціни
відкриття на перших 35 (максимально на графіку японських свічок на
рисунку 5.8 проілюстровано 40 свічок) зразках даних та із альфа-похибкою
рівною 10000.
Також згенеруємо за такими же даними, але без похибки, графік
регресії на основі методу найменших квадратів. Отримаємо наступні
графіки для порівняння на рисунках 4.11 та 4.12

Рисунок 4.11– Графік регресії на основі методу найменших


квадратів
61

Рисунок 4.12– Графік хребтової регресії

Після генерування усіх можливих типів технічних індикаторів та


лінійних графіків є можливість переглянути прогнозування чи варто
купувати або продавати даний актив на базі поточних даних. Це можливо
зробити за допомогою кнопки “Should you buy?” наверху тієї ж сторінки.
Результати можна переглянути на рисунку 4.13

Рисунок 4.13– Результати прогнозування на основі поточних даних


62

Таким чином кожний індикатор говорить різні речі щодо купівлі-


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

ВИСНОВКИ

Під час виконання дипломної роботи було проведено детальне


дослідження та розробка програмного продукту для прогнозування та
аналізу кріптовалютних операцій на основі лінійних алгоритмів та
технічних індикаторів. Робота включала в себе аналіз проблеми
прогнозування кріптовалютних активів, вибір технічних та лінійних
алгоритмів для вирішення цієї задачі та розробку програмного рішення.
Був проведений огляд вже існуючих рішень в сфері аналізу та
прогнозування курсу кріптовалютних активів для отримання максимально
оптимальних та корисних рішень від конкурентів та подальшого їх
застосування у програмному рішенні.
Програмний продукт, створений під час дипломної роботи, дозволяє
інвесторам аналізувати кріптовалютні графіки, використовуючи технічні
індикатори та лінійні алгоритми. Він надає можливість отримувати
прогнози щодо руху цін кріптовалютних активів, що допомагає інвесторам
зробити обґрунтовані рішення при торгівлі активами.
Під час розробки програмного продукту були враховані принципи
модульності, ефективності та надійності. Застосування технічних та
лінійних алгоритмів дозволило покращити точність прогнозування і
забезпечити більш об'єктивні результати.
Оцінка розробленого програмного рішення проводилась на основі
аналізу його ефективності, точності та користувальницької зручності.
Програмний продукт демонструє стабільну роботу, швидкий розрахунок
прогнозів та інтуїтивно зрозумілий інтерфейс, що сприяє легкому
використанню.
У результаті дипломної роботи було успішно розроблено програмний
продукт для проведення кріптовалютних операцій на основі лінійних
64

алгоритмів. Він може бути корисним інструментом для інвесторів, які


бажають здійснювати обґрунтовані рішення щодо кріптовалютних активів.
65

СПИСОК ВИКОРИСТАНИХ ДЖЕРЕЛ

1. Murphy J. J. Technical Analysis of the Financial Markets. Pengiun Books,


1999. 576 p.
2. Antonopoulos A. M. Mastering Bitcoin: Unlocking Digital Cryptocurrencies.
O'Reilly Media, 2014. 298 p.
3. URL: https://www.coinbase.com/ru/learn/crypto-basics (дата звернення
27.05.2023).
4. URL: https://cointelegraph.com/learn/crypto-charts-101-how-to-read-
cryptocurrency-charts (дата звернення 27.05.2023).
5. Baumohl B. Secrets of Economic Indicators: Hidden Clues to Future
Economic Trends and Investment Opportunities. Pearson Education, Limited,
2012. 496 p.
6. URL: https://www.php.net/manual/en/intro-whatis.php (дата звернення
27.05.2023).
7. URL: https://laravel.com/docs/10.x (дата звернення 27.05.2023).
8. URL: https://filamentphp.com/docs/1.x/admin/getting-started (дата
звернення 27.05.2023).
9. URL: https://www.chartjs.org/docs/latest/ (дата звернення 27.05.2023).
10.URL: https://www.statisticshowto.com/ridge-regression (дата звернення
27.05.2023).
11.URL:
https://www.binance.com/en/trade/BTC_USDT?theme=dark&type=spot
(дата звернення 27.05.2023).
12.URL: https://www.investing.com/crypto/bitcoin/btc-usdt (дата звернення
27.05.2023).
13.URL: https://coinmarketcap.com/currencies/bitcoin/ (дата звернення
27.05.2023).
66

14.URL: https://www.coingecko.com/uk/coins/bitcoin (дата звернення


27.05.2023).
15.URL: https://www.cryptocompare.com/coins/btc/overview (дата звернення
27.05.2023).
67

ДОДАТОК A

Клас-обертка сторінки аналітики сервісу адміністраторської панелі

Текст програми

УКР.НТУУ «КПІ імені Ігоря Сікорського» _ТЕФ_АПЕПС_ТР91 _22Б 12-


1

Аркушів 20

Київ - 2023
68

<?php

namespace App\Filament\Pages;

use
App\DataTransferObjects\Candlestick\CandlestickChartBar;
use App\Enums\AnalyticChartShouldBuyStatus;
use App\Enums\AssetRSIStatus;
use App\Enums\CandlestickIntervalTypeEnum;
use App\Models\AssetPair;
use App\Models\Candlestick;
use App\Services\Analysis\ML\LeastSquaresRegression;
use App\Services\Analysis\ML\RidgeRegression;
use
App\Services\Analysis\Technical\ExponentialMovingAverage;
use
App\Services\Analysis\Technical\RelativeStrengthIndex;
use App\Services\Analysis\Technical\SimpleMovingAverage;
use
App\Services\Analysis\Technical\StochasticRelativeStrengthInde
x;
use App\Services\Enum\EnumToKeyValueMapper;
use Filament\Forms\Components\DateTimePicker;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\TextInput;
use Filament\Pages\Actions\Action;
use Filament\Pages\Page;
use Illuminate\Support\Arr;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\App;
use Illuminate\Support\Str;

final class CandlestickAnalytics extends Page


{
69

protected static ?string $navigationIcon = 'heroicon-


o-trending-up';

protected static string $view =


'filament.pages.candlestick-analytics';

protected static ?string $navigationGroup =


'Candlesticks';

protected static ?string $title = 'Analytics';

private const CANDLESTICKS_LIMIT = 50;

private const DEFAULT_ASSET_PAIR = 'BTC/USDT';

private const DEFAULT_PERIOD_TYPE =


CandlestickIntervalTypeEnum::OneMinute;

private const REGRESSION_TARGET_FIELD_NAME =


'close_price';

public Collection $candlesticks;

private array $candleBarRegressionSampleFieldNames = [


'open_time_timestamp_ms',
'close_time_timestamp_ms',
'open_price',
'high_price',
'low_price',
'total_base_asset_volume',
'total_quote_asset_volume',
'trades_count',
'takers_base_asset_volume',
'takers_quote_asset_volume',
70

];

public array $sMAResults;

public array $eMAResults;

public array $rSIResults;

public array $stochasticRSIResults;

public array $lSRSlopeCoefficients;

public array $ridgeRegressionSlopeCoefficients;

public function mount(): void


{
$this->sMAResults = [];
$this->eMAResults = [];
$this->rSIResults = [];
$this->stochasticRSIResults = [];
$this->lSRSlopeCoefficients = [];
$this->ridgeRegressionSlopeCoefficients = [];

/** @var AssetPair $assetPair */


$assetPair = AssetPair::query()->where('name',
self::DEFAULT_ASSET_PAIR)->first();

$this->candlesticks = Candlestick::query()
->where([
['asset_pair_id', $assetPair->id],
['interval_type',
self::DEFAULT_PERIOD_TYPE],
])
->limit(self::CANDLESTICKS_LIMIT)
71

->get()
->map(fn(Candlestick $candlestick) =>
CandlestickChartBar::fromCandlestick($candlestick,
self::DEFAULT_ASSET_PAIR));
}

protected function getActions(): array


{
return [
$this->getGenerateCandlesticksChartAction(),
$this-
>getGenerateLeastSquaresRegressionChartAction(),
$this-
>getGenerateRidgeRegressionChartAction(),
$this->getShouldYouBuyAction(),
];
}

private function getGenerateCandlesticksChartAction():


Action
{
/** @var EnumToKeyValueMapper
$enumToKeyValueMapper */
$enumToKeyValueMapper =
App::make(EnumToKeyValueMapper::class);

return Action::make('Generate candlesticks')


->action(function(array $data) {
/** @var AssetPair $assetPair */
$assetPair =
AssetPair::find($data['asset_pair_id']);
$assetPairName = $assetPair->name;

$this->candlesticks = Candlestick::query()
72

->where([
['asset_pair_id',
$data['asset_pair_id']],
['interval_type',
CandlestickIntervalTypeEnum::tryFromName($data['interval_type'
])],
])
->whereDate('open_time', '>=',
$data['from_time'])
->whereDate('close_time', '<=',
$data['to_time'])
->limit(self::CANDLESTICKS_LIMIT)
->get()
->map(fn (Candlestick $candlestick) =>
CandlestickChartBar::fromCandlestick($candlestick,
$assetPairName));

$this->resetAnalyticsData();

$this-
>dispatchBrowserEvent('livewire:generate-candlestick-chart',
['candlesticks' => $this->candlesticks]);
})
->form([
Select::make('asset_pair_id')
->label('Asset Pair')
->options(AssetPair::all()-
>pluck('name', 'id')->toArray())
->required(),
Select::make('interval_type')
->label('Interval Type')
-
>options($enumToKeyValueMapper(CandlestickIntervalTypeEnum::cl
ass))
73

->required(),
DateTimePicker::make('from_time')
->maxDate(now())
->required(),
DateTimePicker::make('to_time')
->maxDate(now())
->required(),
]);
}

private function
getGenerateLeastSquaresRegressionChartAction(): Action
{
/** @var LeastSquaresRegression
$leastSquaresRegression */
$leastSquaresRegression =
App::make(LeastSquaresRegression::class);
$maxSamplesCount = $this->candlesticks->count() -
1;

return Action::make('Generate LSR')


->label('Generate LSR')
->hidden(fn () => $this->candlesticks-
>isEmpty())
->action(function(array $data) use
($leastSquaresRegression) {
$sampleFieldKey = Str::camel($this-
>candleBarRegressionSampleFieldNames[$data['sample_field_key']
]);
$targetFieldKey =
Str::camel(self::REGRESSION_TARGET_FIELD_NAME);

$samples = $this->candlesticks-
>pluck($sampleFieldKey)
74

->map(fn ($sample) => [$sample])


->toArray();

$trainSamples =
array_values(array_slice($samples, 0, $data['samples_count']));
$targets = $this->candlesticks-
>pluck($targetFieldKey)->take($data['samples_count'])-
>toArray();

$leastSquaresRegression-
>train($trainSamples, $targets);

$residualSamples =
array_values(array_slice($samples, -(count($samples) -
$data['samples_count'])));
$predictions = $leastSquaresRegression-
>predict($residualSamples);

$this->lSRSlopeCoefficients =
$leastSquaresRegression->getCoefficients();

$this-
>dispatchBrowserEvent('livewire:generate-least-squares-
regression-chart', [
'train_samples' => $trainSamples,
'prediction_samples' =>
$residualSamples,
'targets' => $targets,
'predictions' => $predictions,
'slope_coefficients' => $this-
>lSRSlopeCoefficients,
'intercept' =>
$leastSquaresRegression->getIntercept(),
]);
75

})
->form([
Select::make('sample_field_key')
->label('Regression sample field')
->options($this-
>candleBarRegressionSampleFieldNames)
->required(),
TextInput::make('samples_count')
->numeric()
->integer()
->minValue(1)
->maxValue($maxSamplesCount)
->hint('Max: '.$maxSamplesCount)
->required(),
]);
}

private function
getGenerateRidgeRegressionChartAction(): Action
{
/** @var RidgeRegression $ridgeRegression */
$ridgeRegression =
App::make(RidgeRegression::class);
$maxSamplesCount = $this->candlesticks->count() -
1;

return Action::make('Generate RR')


->label('Generate RR')
->hidden(fn () => $this->candlesticks-
>isEmpty())
->action(function(array $data) use
($ridgeRegression) {
$sampleFieldKey = Str::camel($this-
>candleBarRegressionSampleFieldNames[$data['sample_field_key']
76

]);
$targetFieldKey =
Str::camel(self::REGRESSION_TARGET_FIELD_NAME);

$samples = $this->candlesticks-
>pluck($sampleFieldKey)
->map(fn ($sample) => [$sample])
->toArray();

$trainSamples =
array_values(array_slice($samples, 0, $data['samples_count']));
$targets = $this->candlesticks-
>pluck($targetFieldKey)->take($data['samples_count'])-
>toArray();

$ridgeRegression->train($trainSamples,
$targets, $data['alpha']);

$residualSamples =
array_values(array_slice($samples, -(count($samples) -
$data['samples_count'])));
$predictions = $ridgeRegression-
>predict($residualSamples);

$this->ridgeRegressionSlopeCoefficients =
$ridgeRegression->getCoefficients();

$this-
>dispatchBrowserEvent('livewire:generate-ridge-regression-
chart', [
'train_samples' => $trainSamples,
'prediction_samples' =>
$residualSamples,
'targets' => $targets,
77

'predictions' => $predictions,


'slope_coefficients' => $this-
>ridgeRegressionSlopeCoefficients,
'intercept' => $ridgeRegression-
>getIntercept(),
]);
})
->form([
Select::make('sample_field_key')
->label('Regression sample field')
->options($this-
>candleBarRegressionSampleFieldNames)
->required(),
TextInput::make('samples_count')
->numeric()
->integer()
->minValue(1)
->maxValue($maxSamplesCount)
->hint('Max: '.$maxSamplesCount)
->required(),
TextInput::make('alpha')
->numeric()
->minValue(0)
->default(0)
->required(),
]);
}

private function resetAnalyticsData(): void


{
$this->sMAResults = [];
$this->eMAResults = [];
$this->rSIResults = [];
$this->stochasticRSIResults = [];
78

$this->lSRSlopeCoefficients = [];
$this->ridgeRegressionSlopeCoefficients = [];
}

public function toggleSMA(int $period): void


{
$this->sMAResults[$period] = Arr::has($this-
>sMAResults, $period) && !empty($this->sMAResults[$period])
? []
: $this->calculateSMA($period);

$this->dispatchBrowserEvent('livewire:toggle-sma-
'.$period, ['sma_results' => $this->sMAResults[$period]]);
}

private function calculateSMA(int $period): array


{
/** @var SimpleMovingAverage $sMA */
$sMA = App::make(SimpleMovingAverage::class);

$sMAResults = $sMA->calculate($this-
>getCandlesticksClosePrices()->toArray(), $period);

return $this-
>mapTechIndicatorResultsWithTimestamps($sMAResults);
}

public function toggleEMA(int $period): void


{
$this->eMAResults[$period] = Arr::has($this-
>eMAResults, $period) && !empty($this->eMAResults[$period])
? []
: $this->calculateEMA($period);
79

$this->dispatchBrowserEvent('livewire:toggle-ema-
'.$period, ['ema_results' => $this->eMAResults[$period]]);
}

private function calculateEMA(int $period): array


{
/** @var ExponentialMovingAverage $eMA */
$eMA = App::make(ExponentialMovingAverage::class);

$eMAResults = $eMA->calculate($this-
>getCandlesticksClosePrices()->toArray(), $period);

return $this-
>mapTechIndicatorResultsWithTimestamps($eMAResults);
}

private function getCandlesticksClosePrices():


Collection
{
return $this->candlesticks->map(
fn (array $bar) => $bar['closePrice'],
);
}

public function updateCandlestickChart(): void


{
$this-
>dispatchBrowserEvent('livewire:candlestick-chart-updated');
}

public function toggleRSI(int $period): void


{
$this->rSIResults[$period] = Arr::has($this-
>rSIResults, $period) && !empty($this->rSIResults[$period])
80

? []
: $this->calculateRSI($period);

$this->dispatchBrowserEvent('livewire:toggle-rsi-
'.$period, ['rsi_results' => $this->rSIResults[$period]]);
}

private function calculateRSI(int $period): array


{
/** @var RelativeStrengthIndex $rSI */
$rSI = App::make(RelativeStrengthIndex::class);

$rSIResults = $rSI->calculate($this-
>getCandlesticksClosePrices()->toArray(), $period);

return $this-
>mapTechIndicatorResultsWithTimestamps($rSIResults);
}

public function toggleStochasticRSI(int $period): void


{
$this->stochasticRSIResults[$period] =
Arr::has($this->stochasticRSIResults, $period) && !empty($this-
>stochasticRSIResults[$period])
? []
: $this->calculateStochasticRSI($period);

$this->dispatchBrowserEvent('livewire:toggle-
stochastic-rsi-'.$period, ['rsi_results' => $this-
>stochasticRSIResults[$period]]);
}

private function calculateStochasticRSI(int $period):


array
81

{
/** @var StochasticRelativeStrengthIndex
$stochasticRSI */
$stochasticRSI =
App::make(StochasticRelativeStrengthIndex::class);

$rSIResults = $stochasticRSI->calculate($this-
>getCandlesticksClosePrices()->toArray(), $period);

return $this-
>mapTechIndicatorResultsWithTimestamps($rSIResults);
}

private function
mapTechIndicatorResultsWithTimestamps(array $sMAResults): array
{
$sMAResultsKeys = array_keys($sMAResults);

$resultsWithKeys = $this->candlesticks-
>filter(function (array $bar, int $key) use ($sMAResultsKeys) {
return in_array($key, $sMAResultsKeys, true);
})
->map(fn(array $bar, int $key) => [
'open_time_timestamp_ms' =>
$bar['openTimeTimestampMs'],
'result' => $sMAResults[$key],
])
->toArray();

return array_values($resultsWithKeys);
}

private function getShouldYouBuyAction(): Action


{
82

return Action::make('Should you buy?')


->action(static function () {})
-
>modalContent(view('filament.resources.event.actions.should_yo
u_buy', [
'shouldBuyOnSMA3' => $this-
>shouldBuyOnSMA(3),
'shouldBuyOnSMA5' => $this-
>shouldBuyOnSMA(5),
'shouldBuyOnSMA7' => $this-
>shouldBuyOnSMA(7),
'shouldBuyOnEMA3' => $this-
>shouldBuyOnEMA(3),
'shouldBuyOnEMA5' => $this-
>shouldBuyOnEMA(5),
'shouldBuyOnEMA7' => $this-
>shouldBuyOnEMA(7),

'assetRSI3Status' => $this-


>getAssetRSIStatus(3),
'shouldBuyOnRSI3' => $this-
>shouldBuyOnRSI(3),
'assetRSI5Status' => $this-
>getAssetRSIStatus(5),
'shouldBuyOnRSI5' => $this-
>shouldBuyOnRSI(5),
'assetRSI7Status' => $this-
>getAssetRSIStatus(7),
'shouldBuyOnRSI7' => $this-
>shouldBuyOnRSI(7),

'assetStochasticRSI3Status' => $this-


>getAssetStochasticRSIStatus(3),
'shouldBuyOnStochasticRSI3' => $this-
83

>shouldBuyOnStochasticRSI(3),
'assetStochasticRSI5Status' => $this-
>getAssetStochasticRSIStatus(5),
'shouldBuyOnStochasticRSI5' => $this-
>shouldBuyOnStochasticRSI(5),
'assetStochasticRSI7Status' => $this-
>getAssetStochasticRSIStatus(7),
'shouldBuyOnStochasticRSI7' => $this-
>shouldBuyOnStochasticRSI(7),

'shouldBuyOnLSR' => $this-


>shouldBuyOnLSR(),
'shouldBuyOnRidgeRegression' => $this-
>shouldBuyOnRidgeRegression(),
]));
}

private function shouldBuyOnSMA(int $period):


AnalyticChartShouldBuyStatus
{
if (empty($this->sMAResults[$period])) {
return AnalyticChartShouldBuyStatus::Unknown;
}

$lastIndex = count($this->sMAResults[$period]) -
1;
$lastValue = $this-
>sMAResults[$period][$lastIndex]['result'];
$penultimateValue = $this-
>sMAResults[$period][$lastIndex - 1]['result'];

return $lastValue - $penultimateValue > 0


? AnalyticChartShouldBuyStatus::Buy
: AnalyticChartShouldBuyStatus::Sell;
84

private function shouldBuyOnEMA(int $period):


AnalyticChartShouldBuyStatus
{
if (empty($this->eMAResults[$period])) {
return AnalyticChartShouldBuyStatus::Unknown;
}

$lastIndex = count($this->eMAResults[$period]) -
1;
$lastValue = $this-
>eMAResults[$period][$lastIndex]['result'];
$penultimateValue = $this-
>eMAResults[$period][$lastIndex - 1]['result'];

return $lastValue - $penultimateValue > 0


? AnalyticChartShouldBuyStatus::Buy
: AnalyticChartShouldBuyStatus::Sell;
}

private function getAssetRSIStatus(int $period):


?AssetRSIStatus
{
$periodResults = $this->rSIResults[$period] ??
null;

if (!$periodResults) {
return null;
}

$lastRSI = end($periodResults);

if ($lastRSI >= 70) {


85

return AssetRSIStatus::Overbought;
}

if ($lastRSI >= 50) {


return AssetRSIStatus::Normal;
}

return AssetRSIStatus::Oversold;
}

private function shouldBuyOnRSI(int $period):


AnalyticChartShouldBuyStatus
{
return match ($this->getAssetRSIStatus($period)) {
AssetRSIStatus::Overbought =>
AnalyticChartShouldBuyStatus::Sell,
AssetRSIStatus::Normal =>
AnalyticChartShouldBuyStatus::Stay,
AssetRSIStatus::Oversold =>
AnalyticChartShouldBuyStatus::Buy,
null => AnalyticChartShouldBuyStatus::Unknown,
};
}

private function getAssetStochasticRSIStatus(int


$period): ?AssetRSIStatus
{
$periodResults = $this-
>stochasticRSIResults[$period] ?? null;

if (!$periodResults) {
return null;
}
86

$lastRSI = end($periodResults);

if ($lastRSI >= 80) {


return AssetRSIStatus::Overbought;
}

if ($lastRSI <= 20) {


return AssetRSIStatus::Oversold;
}

return AssetRSIStatus::Normal;
}

private function shouldBuyOnStochasticRSI(int


$period): AnalyticChartShouldBuyStatus
{
return match ($this-
>getAssetStochasticRSIStatus($period)) {
AssetRSIStatus::Overbought =>
AnalyticChartShouldBuyStatus::Sell,
AssetRSIStatus::Normal =>
AnalyticChartShouldBuyStatus::Stay,
AssetRSIStatus::Oversold =>
AnalyticChartShouldBuyStatus::Buy,
null => AnalyticChartShouldBuyStatus::Unknown,
};
}

private function shouldBuyOnLSR():


AnalyticChartShouldBuyStatus
{
if (empty($this->lSRSlopeCoefficients)) {
return AnalyticChartShouldBuyStatus::Unknown;
}
87

$coefficient = $this->lSRSlopeCoefficients[0];

return $coefficient && $coefficient > 0 ?


AnalyticChartShouldBuyStatus::Buy :
AnalyticChartShouldBuyStatus::Sell;
}

private function shouldBuyOnRidgeRegression():


AnalyticChartShouldBuyStatus
{
if (empty($this-
>ridgeRegressionSlopeCoefficients)) {
return AnalyticChartShouldBuyStatus::Unknown;
}

$coefficient = $this-
>ridgeRegressionSlopeCoefficients[0];

return $coefficient && $coefficient > 0 ?


AnalyticChartShouldBuyStatus::Buy :
AnalyticChartShouldBuyStatus::Sell;
}
}

You might also like