Кратко про библиотеку mlfinlab: инструмент для финансового ML

от автора

Привет, Хабр!

Сегодня мы рассмотрим такую замечательную библиотеку как mlfinlab.

Если вы пытались применить методы машинного обучения к финансовым данным, то наверняка сталкивались с массой подводных камней: от шумных данных до проблем с автокорреляцией. mlfinlab — это библиотека, которая реализует передовые техники из книги Маркоса Лопеса де Прадо «Advances in Financial Machine Learning«. Она позволяет не изобретать велосипед, а использовать проверенные временем методы для решения сложных задач финансового МЛ.

Начнем с установки. Ничего сложного:

pip install mlfinlab

Теперь импортируем необходимые модули:

import pandas as pd import numpy as np import mlfinlab

Добываем данные

Для примера будем использовать исторические данные по акциям компании Apple (тикер: AAPL). Воспользуемся библиотекой yfinance для загрузки данных.

import yfinance as yf  ticker = 'AAPL' data = yf.download(ticker, start='2020-01-01', end='2021-01-01', interval='1d') prices = data['Close']

Разметка баров

Обычные временные бары могут вводить в заблуждение из-за неравномерной активности рынка. mlfinlab предлагает альтернативу — создание баров на основе объема, долларов или количества тиков.

Создадим долларовые бары с порогом в 1 миллион долларов.

from mlfinlab.data_structures import StandardBars  db = StandardBars(bar_type='dollar', threshold=1e6) dollar_bars = db.batch_run(data)

Теперь данные сгруппированы по реальной рыночной активности.

Разметка событий

Определение значимых изменений цены — важный момент в финансовом МЛ. Используем CUSUM фильтр для выявления точек смены тренда.

from mlfinlab.filters.filters import cusum_filter  threshold = 0.02  # 2% изменение цены events = cusum_filter(prices, threshold=threshold)

Мы получили список дат, когда цена изменилась более чем на 2%. Это потенциальные точки входа или выхода.

Тройной барьер в помощь

Теперь нужно присвоить метки нашим событиям, чтобы модель могла учиться. Используем метод Triple Barrier Method.

from mlfinlab.labeling.labeling import get_events, get_bins  # Устанавливаем вертикальные барьеры через 5 дней vertical_barriers = mlfinlab.labeling.add_vertical_barrier(t_events=events, close=prices, num_days=5)  # Получаем события с учетом тройного барьера events = get_events(close=prices,                     t_events=events,                     pt_sl=[1, 1],  # Устанавливаем пороги прибыли и убытка                     target=None,                     min_ret=0.01,                     vertical_barrier_times=vertical_barriers)  # Получаем метки labels = get_bins(events=events, close=prices)

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

Применяем мета-лейблинг

Финансовые данные часто несбалансированы: количество успешных сделок может быть значительно меньше неудачных. Мета-лейблинг помогает решить эту проблему.

from mlfinlab.meta_labeling.meta_labeling import MetaLabeling  meta = MetaLabeling() meta_labels = meta.get_meta_labels(events, prices)

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

Учет автокорреляции

Автокорреляция может привести к переобучению модели. Используем метод Computation of the Effective Sample Size (ESS).

from mlfinlab.sample_weights import get_weights_by_time_decay  # Получаем веса с учетом времени weights = get_weights_by_time_decay(meta_labels['t1'], decay=0.5)

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

Теперь можно и обучить модельку

Настало время обучить нашу модель. Используем XGBoost, потому что почему бы и нет?

import xgboost as xgb from sklearn.model_selection import train_test_split  # Подготавливаем данные X = prices.loc[labels.index].to_frame() y = labels['bin']  # Разбиваем на обучающую и тестовую выборки X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)  # Создаем DMatrix для XGBoost dtrain = xgb.DMatrix(X_train, label=y_train) dtest = xgb.DMatrix(X_test, label=y_test)  # Задаем параметры модели params = {     'objective': 'binary:logistic',     'eval_metric': 'auc', }  # Обучаем модель bst = xgb.train(params, dtrain, num_boost_round=100)

Посмотрим на качество нашей модели.

from sklearn.metrics import classification_report  # Предсказываем y_pred = bst.predict(dtest) y_pred_binary = [1 if y > 0.5 else 0 for y in y_pred]  # Выводим отчет print(classification_report(y_test, y_pred_binary))

Чтобы убедиться, что наша модель не переобучилась, используем метод Walk-forward validation.

from mlfinlab.cross_validation.cross_validation import ml_cross_val_score  scores = ml_cross_val_score(bst, X, y, cv=5, sample_weight=weights) print('Средний AUC: ', np.mean(scores))

Заключение

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

Куда идти дальше?

  • Изучить Fractionally Differentiated Features для создания стационарных временных рядов.

  • Попробовать Bet Sizing для управления капиталом.

  • Исследовать Clustering Algorithms для выявления скрытых закономерностей.

Подробнее с библиотекой можно ознакомиться здесь.

28 октября пройдет открытый урок на тему «Построение торгового агента на базе алгоритмов обучения с подкреплением». Участники узнают, как построить модель финансового рынка, создать и обучить торгового агента с использованием специализированного фреймворка. Если интересно — записывайтесь на урок на странице курса «ML для финансового анализа».


ссылка на оригинал статьи https://habr.com/ru/articles/852076/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *