За тези от вас, които не са запознати с индонезийския фондов пазар, има 678 акции за избор в Jakarta Composite Index (тикер: ^JKSE от yahoo finance). Избирам Unilever, защото е една от най-широко избираните от мениджърите на фондове поради размера на пазарната капитализация, ликвидността, доброто корпоративно управление и е една от най-дългите акции, които са включени в Jakarta Composite Index, и е една от акциите в LQ45 (Еквивалент на S&P 500)

Първо трябва да импортираме необходимите пакети, за да изпълним желаната функция:

import numpy as np
import pandas as pd
import datetime as dt
import pandas_datareader.data as web
import talib as tlb
import talib
from sklearn.metrics import confusion_matrix

След това трябва да дефинираме времевата рамка на нашите данни:

start = dt.datetime(2014,1,1)
finish = dt.datetime.today()
source = ‘yahoo’

Избирам данни за около 5 години поради икономическия цикъл, но зависи от вас и можете свободно да си играете с времевата рамка

Сега извличаме данните:

df = web.DataReader(‘UNVR.JK’, source, start, finish)
df.head()

Ще използвам данни от „Adj Close“ за нашата цел. Що се отнася до прогнозирането на точната цена на акциите всеки ден след ден, това е трудно да се направи с машинно обучение, така че това, което бих прогнозирал, е движението на акциите, независимо дали акциите се понижават или покачват. За да направя това, ще изчисля процентната промяна на днешната цена на акциите от вчера и така нататък и ако е положителна, ще бъде отбелязана с +1,0 и обратно. За да направим това, трябва само да напишем тези кодове:

data = pd.DataFrame(index=df.index)
data[‘Today’] = df[‘Adj Close’]
data[‘pct change’] = data[‘Today’].pct_change()
data[‘direction’] = np.sign(data[‘pct change’])

След това ще направим няколко инженеринга на функции, използвайки технически анализ, използвайки пакета talib, и ще нормализираме резултата, така че да е в същия диапазон, като разделим резултата на коригираната цена на затваряне:

Това, което основно прави кодът по-горе, е създаването на проста подвижна средна и индекс на относителна сила от 5, 14, 30 и 50 дни. Разбира се, можем да използваме друг индикатор за технически анализ и друг период за по-добро прогнозиране. Вие сте свободни да си играете с него.

След това още един кратък поглед върху нашите данни изглежда след инженеринг на функции с помощта на data.head(10):

Изглежда, че нашите данни имат много липсващи данни поради изчисляването на периодите в пакета за технически анализ. За да направим това, просто трябва да направим следното:

data.dropna(inplace = True)

Ако проверим отново нашите данни, сега те са чисти и готови за машинно обучение. Това е важно, защото повечето машинно обучение не могат да приемат липсващи данни и безкраен брой.

След това искаме да премахнем колоните „Днес“ и „промяна на процента“, тъй като не се нуждаем от тях в нашата прогноза, защото прогнозираме само посоката на акциите. За да направим това, ние правим този прост код:

data.drop([‘Today’, ‘pct change’], axis = 1, inplace = True)

Сега задаваме нашата целева прогноза и данните, необходими за машинно обучение:

y = data[‘direction’]
x = data.drop(‘direction’, axis = 1)

След това ще разделим нашите данни на обучителен и тестов набор. Използвам 80% съотношение, както в 80% набор за обучение, 20% тестов набор, но можете да използвате различно съотношение.

Ще използвам 3 пакета за машинно обучение, за да видя кой е по-ефективният. А именно KNN, логистична регресия и поддържаща векторна машина. Нека импортираме тези пакети:

Сега ще направим KNN и ще проверим точността на нашия модел:

Резултатът:

След това ще опитаме логистичната регресия:

Сега пробваме Support Vector Machine:

Изглежда, че всичките 3 различни пакета за машинно обучение са дали един и същ резултат, но можем ли да настроим чрез хиперпараметър един от нашите пакети за машинно обучение и малко различен пакет, за да постигнем по-добър резултат? Ще използвам обикновен SVC вместо LinearSVC и ще го настройвам с хиперпараметър:

И увеличаване до 72,4% точност.

Заключение:

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

Можете да видите моя код тук

Ако имате въпроси или критики, не се колебайте да се свържете с мен на: [email protected]