Кратко про библиотеку 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 для финансового анализа».