Автори: Kleon Ang Cunrong (технически ръководител), Vinod s/o Jaya Kumar, Hans Neddyanto Tandjung, Nixon Widjaja

Въведение

Фон

През 2006 г. Джоел Грийнблат публикува своята вече известна книга, Малката книга, която побеждава пазара. В него той описва стратегия за инвестиране на стойност, която нарича Магическата формула. Уникалната характеристика на Magic Formula Investing е, че използва само два финансови показателя, възвръщаемост на капитала (ROC) и доходност на печалбите (EY), за да избере портфолио от акции. Учудващо, според Грийнблат, неговата стратегия за инвестиране в Magic Formula може да постигне средно 30,8% годишна възвръщаемост за 17 години, когато се тества на американския пазар, далеч надхвърляйки пазарния индекс – S&P 500 – който възвръща средно 12,4% всяка година през същият 17-годишен период от време.

Включване на магическата формула в машинното обучение

Вдъхновени от магическата формула на Greenblatt, решихме да използваме ROCи EYкато единствените две функции, когато обучаваме нашите модели за машинно обучение. Освен това, тъй като открихме, че Магическата формула все още не е проучена задълбочено в нашия местен (Сингапур) контекст, решихме да приложим тази стратегия за инвестиране на стойност към акциите на SGX и я определихме като проблем с машинно обучение.

Представянето на акциите на SGX беше сравнено с пазарния индекс на Сингапур - Straits Times Index (STI). STI е индекс, базиран на пазарната капитализация, който проследява представянето на 30-те най-големи листнати компании. Решихме среден времеви хоризонт от 5 години за нашия проект. С други думи, днешните финансови показатели ще бъдат използвани за прогнозиране на представянето на акциите след 5 години. По-конкретно, използвахме времева рамка от 2014 до 2022 г. Цифрите ROCи EY, получени през 2014 г., след това ще бъдат използвани за прогнозиране на представянето на акциите 5 години по-късно или от 2019 до бъди точен. Данните за 2015 г. ще бъдат използвани за прогнозиране на представянето на акциите през 2020 г. и т.н. Структурирахме тази задача като класификационен проблем, класифицирайки всяка акция с двоичен етикет, за да посочим дали акцията бие пазарния индекс за 5 години.

Предварителна обработка на данни

Списък на компаниите от основната платка на SGX

За да генерираме нашия набор от данни, първо получихме списък с компании, изброени в SGX, от официалния уебсайт на SGX. След това филтрирахме данните, за да получим само компаниите, изброени в основната платка на SGX, и тези, които не са спрени или поставени в списъка за наблюдение от SGX. Този процес създаде нашата „инвестируема вселена“ от 414 уникални брояча на акции.

След което извлякохме финансови данни, свързани с акциите в нашата „инвестируема вселена“ и ги обработихме предварително в 3 отделни набора от данни (A, B и C), преди да ги използваме за обучение на нашите модели за машинно обучение.

Процесът на генериране на 3-те набора от данни беше паралелен чрез използването на примерни набори от данни, които съдържаха фиктивни данни, които емулираха техните действителни съответни набори от данни. Тези примерни набори от данни също послужиха като тестови случаи за набор от данни C (който трябваше да бъде генериран от набори от данни A и B). Подробностите за 3-те набора от данни са както следва.

Набор от данни A

Набор от данни A включва финансови данни на компанията. Състои се от шест колони и описанието на всяка от тези колони е посочено по-долу:

Selenium беше използван като избран инструмент за извличане на данни от реномиран източник за всяка от 414-те компании, които идентифицирахме по-рано. От 414 компании, ние получихме необходимите данни за 246 компании чрез нашата методология за уеб скрапинг. След това данните за колоните година, roc, EBIT и EV бяха получени от уебсайта. Произведената колона eyвпоследствие беше получена чрез формулата ey = EBIT/EV, в съответствие с дефиницията на Грийнблат за доходност на печалбата в неговата книга.

Набор от данни B

Набор от данни B бяха исторически данни за цената на акциите, получени от Yahoo Finance. Чрез извикване на API на Yahoo Finance бяха получени месечни данни (т.е. първи ден на всеки месец) за цените на акциите на STI. След това филтрирахме само цената на акциите при затваряне, получена на 1 януари. Решихме да подредим данните само по име, така че данни с едно и също име, но различни години да могат да се комбинират в един запис, вместо да имат няколко записа.

Набор от данни C

Набор от данни C комбинира информацията от набори от данни A и B. Той споделя същите първи 4 колони като набор от данни A (борсов код, година, ROC и EY). Преминавайки през всеки ред от набор от данни A, ние намираме съвпадащия борсов код и година в набор от данни B и проверяваме дали цената на акциите на съответната компания е по-висока или по-ниска от индекса на Straits Times (STI), т.е. пазара за тази година . Поставяме етикет „1“, ако компанията е победила пазара 5 години от годината, в която са отчетени нейните финансови показатели, и „0“ в противен случай. Ако данните за цените на акциите не съществуват в набор от данни B, ние отхвърляме този ред в набор от данни C. В крайна сметка нашият набор от данни C имаше общо 235 уникални брояча на акции, за които успяхме да получим данни за техните финансови резултати

Обучение/тестово разделение

Окончателният набор от данни (набор от данни C) беше разделен така, че 80% от данните отидоха в обучителния набор, а останалите 20% отидоха в тестовия набор. Тъй като класовете на крайния набор от данни бяха изкривени към отрицателните примери (71,7% от набора от данни имаха етикет на класа „0“), стратификацията беше използвана, за да се гарантира, че същата пропорция на положителни и отрицателни етикети е използвана както в обучението, така и тестови комплекти.

Един и същ обучителен набор беше използван за обучение на всеки от моделите, описани подробно по-долу, и същият тестов набор беше използван за оценка на моделите, за да се осигури последователност и сравнимост на резултатите между различните модели.

По-долу е визуализирана диаграма на разпръскване на част от нашите данни за обучение, където зелените точки показват положителен етикет за клас (акцията превъзхожда STI за 5 години), а червените точки показват отрицателен етикет за клас (акцията се представя по-слабо от STI за 5 години).

Като се има предвид, че точките не изглеждат линейно разделими, по-сложните модели бяха предпочитани за тази задача в сравнение с линейните модели като логистична регресия.

Нашите избрани модели

Разгледахме четири типа модели за етапа на обучение на модела: SVM, KNN, невронни мрежи и произволна гора и GBM. При обучението на всеки от моделите, описани по-долу, ние основно избрахме да оптимизираме за точност [(#True Positives + #True Negatives) / (Общо # реда данни)], въпреки че, предвид изкривяването на нашия набор от данни към отрицателни етикети, ние също взе предвид други фактори като прецизност и F1-резултат.

Прецизността се дефинира като [(# истински положителни резултати) / (# истински положителни + # фалшиви положителни резултати)], така че висока точност показва, че моделът е консервативен при прогнозирането на положителни етикети (че определена акция наистина ще победи пазара). F1-резултатът взема предвид както прецизността, така и припомнянето [(# истински положителни) / (# истински положителни + # фалшиви отрицателни)] и се определя като [(2 × прецизност × припомняне) / (прецизност + припомняне)].

В допълнение към тези показатели беше генерирана и матрица за объркване, която показва основните компоненти на всеки показател в следния формат:

[[(# True Negatives) (# False Positives)]
[(# False Negatives) (# True Positives)]]

SVM (Support Vector Machine)

Импортирахме SVM от пакета sklearn на Python и първоначално опитахме обикновен SVM с линейни, RBF, полиномни и сигмоидни ядра, но не получихме полезни резултати. Моделът не се учи и извежда 0 за всички данни. След това настроихме хиперпараметрите на модела (C, гама и ядро) с помощта на GridSearchCV, променяйки C от диапазон 0,001 до 10 000 и гама от диапазон 0,01 до 100 000, което доведе до подобрена точност, прецизност и F1-резултат.

Нашият SVM модел постига F1-резултат от 0,66, точност от 0,86 и прецизност от 0,49. Той не създава фалшиви отрицания (не пропускате страхотни сделки с акции) и нашият модел правилно върши работата си, за да „не ви предложи“ акции, които не се представят добре. Ако решите да използвате този модел, за да предвидите кои акции трябва да купите, имате около 50% шанс да получите акции, които успешно бият пазара.

KNN (K-най-близки съседи)

Моделите KNN бяха обучени с помощта на R. Моделите бяха обучени с помощта на различни стойности на k в интервали от 5 (1, 5, 10, …, 100) и графики на точност спрямо s (броя на съседите), прецизност спрямо s, и F1-резултат спрямо s се генерират. Този процес се повтаря с различни произволни начални стойности за възпроизводимост и надеждност. Въпреки че има вариации във формата на графиките за различни произволни начални стойности, беше установено, че s=1 винаги е най-доброто по отношение на точност (0,7962), прецизност (0,6438) и F1-резултат (0,6351). Струва си да се отбележи, че въпреки че е прост алгоритъм, KNN постига постоянно добри резултати по тези три показателя.

Невронни мрежи

При обучението на модела на невронната мрежа беше използван последователен модел. Настроихме различни хиперпараметри, включително броя на слоевете и броя на невроните във всеки слой. От нашето тестване установихме, че мрежите с няколко слоя се представят по-добре от мрежите с много слоеве и решихме невронна мрежа с два скрити слоя според следните спецификации:

Установихме обаче, че прецизността не се е подобрила значително чрез промяна на броя на възлите в рамките на скритите слоеве, въпреки че избрахме средния брой възли за двата скрити слоя, които дават най-добра производителност при множество изпълнения.

Следното беше матрицата на объркването и докладът за класификация, генериран, когато моделът беше оценен на тестовия набор.

Както се вижда от резултатите по-горе, въпреки че обученият модел успя да предвиди правилно някои положителни резултати, той имаше относително голям брой фалшиво-отрицателни прогнози. С други думи, повечето от акциите, които потенциално могат да победят пазара, са неправилно класифицирани като непобедители на пазара. С невронни мрежи успяхме да постигнем точност от 0,72 (което не е значително по-високо от предвиждането на всички негативи) и F1-резултат от 0,05.

Произволна гора и GBM

Бяха изследвани базирани на Дърво на решения ансамблови модели под формата на RandomForest (пакетиране), XGBoost (усилване) и LightGBM (усилване), като се има предвид, че емпирично е установено, че тези алгоритми дават най-добри резултати при таблични данни. За всеки от трите алгоритъма основните настроени хиперпараметри бяха: n_estimators, вариращи от 100 до 1500, max_depth, вариращи от 5 до 15, като Няма е включен като възможен параметър, num_leaves варира от 4 до 30.

Сред трите алгоритъма LightGBM даде най-добри резултати. В допълнение, неговият лек характер също означава, че резултатите са получени най-бързо от трите! Оптималните хиперпараметри, избрани чрез търсене в мрежата, са max_depth от 10, n_estimators от 1300 и num_leaves от 20.

Резултатите са както следва: 0,86 за неговата точност, 0,71 за неговата прецизност, 0,78 за неговото извикване и 0,74 за неговия F1-резултат. Комбинацията от висока точност с висока прецизност означава, че човек може да бъде уверен, че акциите, които този модел е идентифицирал като „побеждаващи пазара“, вероятно ще го направят.

Резултатите, получени от другите модели, са приложени в таблицата по-долу:

И така... Вълшебната формула наистина ли работи?

Нашите резултати показват, че отговорът е ДА, поне когато принципите зад стратегията за инвестиране на Magic Formula на Greenblatt се използват при изграждането на модели за машинно обучение и в контекста на пазара в Сингапур.

Сред всички модели, които изследвахме, моделите с градиентно усилване (по-специално LightGBM) се представиха най-добре като цяло, с точност от 86%. SVM беше на второ място, въпреки че имаше по-нисък резултат за прецизност и F1 в сравнение с LightGBM.

Нашите констатации показват, че е възможно да се изградят пазарни модели, вдъхновени от Магическата формула с прилично ниво на точност. Бихме препоръчали използването на градиентно подсилени модели като LightGBM за тази цел. Като се има предвид използването само на два финансови показателя (ROC и EY) при обучението на нашия модел, този прост модел може да бъде по-обясним от други модели, обучени с голям брой функции.

В бъдещи проучвания може дори да се опита да се комбинират повече функции с ROC и EY (за сметка на обяснимостта), за да се постигне по-добро представяне на модела или да се вдъхнови от други стратегии за инвестиране на стойност когато създавате модели за машинно обучение, за да идентифицирате акции, които потенциално могат да победят пазара.

Референции

Четива

  1. Грийнблат, Дж. (2006). Малката книга, която надминава пазара. Джон Уайли и синове.

Събиране на данни

  1. https://www.sgx.com/securities/stock-screener

Дефиниция на ключовите термини

  1. https://www.investopedia.com/terms/e/ebit-ev-multiple.asp
  2. https://www.investopedia.com/terms/r/returnoninvestmentcapital.asp#toc-what-is-return-on-invested-capital-roic

Документация: Метрики

  1. https://scikit-learn.org/stable/modules/generated/sklearn.metrics.confusion_matrix.html
  2. https://scikit-learn.org/stable/modules/generated/sklearn.metrics.classification_report.html

Документация: SVM

  1. https://scikit-learn.org/stable/modules/svm.html
  2. https://scikit-learn.org/stable/modules/grid_search.html

Документация: КНН

  1. https://www.rdocumentation.org/packages/class/versions/7.3-20/topics/knn

Документация: Случайна гора и GBM

  1. https://xgboost.readthedocs.io/en/stable/
  2. https://lightgbm.readthedocs.io/en/latest/
  3. https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html

Документация: Невронни мрежи

  1. https://www.tensorflow.org/api_docs/python/tf/keras/