Привет!
Сегодня мы рассмотрим такую замечательную библиотеку как 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 для финансового анализа».
Автор: badcasedaily1