Как мы знаем, машинное обучение является одним из наиболее часто используемых инструментов в наши дни, мы можем использовать эту подобласть ИИ для прогнозирования значений, прогнозирования заболеваний, классификации видов… В нашем случае мы будем использовать этот инструмент для прогнозирования конечной стоимости акций. , это значение, которое будет иметь акция в конце дня.

Для этого мы шаг за шагом будем следовать следующему списку:

  • Импорт пакетов.
  • Очистите необработанные данные.
  • Выберите зависимые и независимые столбцы.
  • Обучите модель.
  • Делайте прогнозы и классифицируйте результаты.

Давайте начнем.

1. Импорт пакетов.

Прежде всего, нам нужны некоторые пакеты, которые помогут нам упростить обучение, прогнозы, построение результатов…

import numpy as np 
import pandas as pd
import warnings
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression

Как только у нас есть необходимые пакеты, импортированные в наш скрипт, мы можем начать со следующего шага.

2. Очистите необработанные данные.

Возможно, в нашем наборе данных у нас есть категориальные данные, это означает, что у нас есть значения в строковом типе, но нам нужны значения с плавающей запятой, поэтому, прежде чем начать, мы преобразуем строковые значения в значения с плавающей запятой.

Python помогает нам легко преобразовать одно строковое значение в значение с плавающей запятой, но формат значения должен быть x.xx или подобным, что, если у нас есть x,xx?

В этом случае мы должны заменить запятую на точку и, наконец, разобрать значение до типа с плавающей запятой. Мы можем сделать что-то вроде этого:

data = pd.read_csv('C:\data.csv')
def str_to_float(data, column):
    for i in range(data[column].shape[0]):
        data[column][i] = data[column][i].replace(',', '.')
    data[column] = data[column].astype(float) 

В приведенном выше коде мы определили функцию, этой функции нужны два аргумента: один — это данные, а другой — столбец, который мы хотим преобразовать в тип с плавающей запятой.

Функция только просматривает все значения в столбце и заменяет запятую точкой. Как только у нас будет правильный формат для всех значений, мы изменим тип столбца на тип с плавающей запятой.

Теперь вызовите функцию только для анализа типа различных столбцов, и мы начнем обучать модель.

str_to_float(data,'close')
str_to_float(data,'open')
str_to_float(data,'max')
str_to_float(data,'min')

3. Выберите зависимые и независимые столбцы.

Сначала мы создаем две переменные, переменная x (зависимая переменная) содержит столбцы, которые мы будем использовать для прогнозирования значения переменной y (независимая переменная).

x = data[['open', 'max' ,'min']].values
y = data['close'].values 

Как мы можем себе представить, мы будем использовать значения столбцов open, max и min для прогнозирования значения close, но мы также можем поместить столбец close в зависимые переменные и обучить модель прогнозировать максимум или любой другой столбец, это вам решать.

Теперь нам нужно разделить данные, мы будем использовать 82% нашего набора данных для обучения модели, а остальные 18% — для тестирования этой модели. Для этого воспользуемся функцией train_test_split(). Нам нужно использовать аргумент random_state, чтобы модель не получала разные значения каждый раз, когда мы обучаем модель, с помощью этого аргумента мы заставляем модель всегда получать одни и те же значения для обучения нашей модели.

x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.18 , random_state = 0)

4. Обучите модель.

Наконец, мы готовы обучить модель, мы будем использовать для этого алгоритм линейной регрессии, но мы можем использовать любой алгоритм, в этом случае этот алгоритм дает наилучшие результаты. Для обучения модели мы использовали следующий код:

clf = LinearRegression()
clf.fit(x_train, y_train)
print("Accuracy train {:.3f}".format(clf.score(x_train, y_train)))
print("Accuracy test {:.3f}".format(clf.score(x_test, y_test)))

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

Эти оценки должны быть очень похожими и быть близкими к 1, чтобы сказать, что у нас есть хорошо обученная модель.

5. Делайте прогнозы и классифицируйте результаты.

Теперь мы можем использовать нашу обученную модель, чтобы делать прогнозы, сравнивать прогнозируемое значение закрытия с реальным значением закрытия и видеть разницу между ними. Мы будем использовать код ниже, чтобы сделать это.

X = [[1.3182, 1.3190, 1.3095]]
predicted = clf.predict(X)
print("Predicted value for close value:", predicted)

Помещаем в переменную X значения open, max и min, в том же порядке, в каком мы ставили переменную x в зависимых переменных. И, наконец, мы используем функцию, чтобы увидеть, какое близкое значение для этих значений в переменной X, и вывести его.

Ну, это хорошо, но как мы можем узнать, близко ли это прогнозируемое значение к реальному близкому значению?

Чтобы проверить это, мы можем использовать следующий код:

predictions = [] #Vector for our predictions
realvalues = [] #Vector for real values
iter = x_train.shape[0]
for i in range(0, int(iter)):
    values = [[x_train[i][0], x_train[i][1], x_train[i][2]]] 
    pred = clf.predict(values) 
    predictions.append(pred) 
    realvalues.append(y_train[i]) #
    values = [[]]

Мы создаем два массива, один для наших прогнозов, а другой для реальных близких значений, затем мы используем переменную iter, чтобы получить количество строк в переменной x_train, и используем ее, чтобы получить количество необходимых нам итераций.

На следующем шаге в массив значений помещаются значения столбцов open, max и min, это столбцы 0, 1 и 2 в нашем наборе данных, и используйте этот массив, чтобы сделать прогноз и вставить прогнозируемое значение в массив прогнозов, позже мы помещаем реальное близкое значение в массив реальных значений.

Когда цикл завершится, мы будем иметь в массиве прогнозов все наши прогнозируемые значения, а в массиве реальных значений — реальное близкое значение.

Теперь мы будем использовать приведенный ниже код, чтобы увидеть хорошо предсказанные значения и плохо предсказанные значения.

bad = []
good = []
for i in range(0, len(realvalues)):
    sub = realvalues[i] - predictions[i] 
    abs(sub)
    
    if(sub > 0.08):
        bad.append(sub)
    else:
        good.append(sub)
print("The number of well predicted values is: ", len(good))
print("The number of bad predicted values is: ", len(bad))

Прежде всего, мы создали два массива, один для неправильно классифицированных значений, а другой для хорошо классифицированных значений, а затем мы просматриваем все значения и вычисляем вычитание между реальным значением и нашим прогнозом. Если этот прогноз больше 0,08, мы помещаем значение в плохой массив, если это вычитание меньше или равно 0,08, мы предполагаем, что прогноз приемлем.

В приведенном выше коде мы печатали результат вычисления длины каждого массива, но лучше, если мы увидим результат графически, для этого мы используем код ниже:

labels = 'bad', 'good'
length = np.array([len(bad), len(good)])
plt.pie(length, labels = labels, autopct='%1.1f%%')

Результат этого кода следующий:

Как мы видим, 12,4 % значений были классифицированы как плохие, а остальные 87,6 % — также.

Что ж, мы закончили. Как мы видим, мы научились обучать модель, которая может помочь нам делать прогнозы для наших акций.

Я надеюсь, что вам понравилось!