За тези от вас, които не са запознати с индонезийския фондов пазар, има 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]