Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Васильев Ю. - Python для data science (Библиотека программиста) - 2023.pdf
Скачиваний:
6
Добавлен:
07.04.2024
Размер:
7.21 Mб
Скачать

268      Глава 12. Машинное обучение для анализа данных

она, упадет или останется прежней. Выяснить это можно, изучив столбец priceRise в строке для следующего дня, который можно получить с помощью команды df['priceRise'].shift(-1). Отрицательный сдвиг смещает будущие значения назад во времени. На основе этого сдвига можно создать новый столбец со значением -1, если цена падает, 0, если цена остается прежней, и 1, если цена растет. Вот как это делается:

conditions = [

(df['priceRise'].shift(-1) > 0.01), (df['priceRise'].shift(-1)< -0.01)

]

choices = [1, -1]

df['Pred'] = np.select(conditions, choices, default=0)

Алгоритм, реализованный выше, исходит из следующих предположений:

1.Увеличение цены более чем на 1% по отношению к стоимости акции в следующий день расценивается как повышение (1).

2.Снижение цены более чем на 1% по отношению к стоимости акции в следующий день расценивается как падение (-1).

3.Остальные случаи расцениваются как стагнация (0).

Для реализации алгоритма мы задаем список conditions, который проверяет данные в соответствии с пунктами 1 и 2 , а также список choices со значениями 1 и -1 для обозначения роста или падения цены . Затем мы передаем эти два списка в функцию NumPy select() , которая создает массив, выбирая значения из choices на основе значений в conditions. Если ни одно из условий не выполняется, в соответствии с пунктом 3 по умолчанию используется значение 0. Сохраняем массив в новом столбце Pred датафрейма, который можно использовать в качестве выходных данных для обучения и тестирования модели. По сути, -1, 0 и 1 теперь являются классами, из которых модель будет делать выбор при классификации новых данных.

Обучение и оценка модели

Для обучения модели scikit-learn требуется представить входные и выходные данные в отдельных массивах NumPy. Создаем массивы из датафрейма df:

features = df[['priceRise','volumeRise','priceRise_idx','volumeRise_idx']].to_numpy() features = np.around(features, decimals=2)

target = df['Pred'].to_numpy()

Прогнозирование тенденций фондового рынка      269

Массив features теперь содержит четыре независимые переменные (входные данные), а массив target — одну зависимую переменную (выходные данные). Далее можно разделить данные на обучающий и тестовый наборы и обучить модель:

from sklearn.model_selection import train_test_split

rows_train, rows_test, y_train, y_test = train_test_split(features, target, test_size=0.2)

from sklearn.linear_model import LogisticRegression clf = LogisticRegression()

clf.fit(rows_train, y_train)

Так же как в примере с анализом тональности, приведенном в начале главы, мы используем функцию scikit-learn train_test_split() для разделения датасета по схеме 80/20, а для обучения модели используем классификатор LogisticRegression. Далее передаем тестовую часть датасета в метод классификатора score() для оценки его точности:

print(clf.score(rows_test, y_test))

Результат будет приблизительно таким:

0.6274509803921569

Он означает, что примерно в 62% случаев модель верно предсказала тенденции для акций Apple на следующий день. Разумеется, у вас может получиться другая цифра.

УПРАЖНЕНИЕ № 20: ЭКСПЕРИМЕНТИРУЕМ С РАЗЛИЧНЫМИ АКЦИЯМИ

И НОВЫМИ МЕТРИКАМИ

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