Привет, друзья! Меня зовут Денис, я алгоритмический трейдер и разработчик.
Когда я пришёл в алготрейдинг, мне очень хотелось быстро применить машинное обучение. Но для этого нужно было разбираться в ML и Data Science, а я только начинал. Сейчас я уже разбираюсь, но знаю, что далеко не все трейдеры готовы тратить на это месяцы.
Специально для тех, кто хочет попробовать ML для прогноза волатильности без глубоких знаний, я сделал библиотеку dquant.
Теперь можно обучить модель, вообще не разбираясь в feature engineering, сплитах и гиперпараметрах. Нужны лишь знания python и уметь достать сырые данные (open, close, high, low, volume).
Это не полноценный гайд, это лишь базовый пример, для более полной информацией воспользуйтесь документацией.
Весь процесс состоит из 2-х этапов:
Подготовка сырых данных (open, close, high, low, volume)
Обучение и прогноз (3 строки кода)
Что происходит под капотом?:
Данные разделяются на входные и выходные
Из входных данных создаются фичи, из выходных - таргеты
Данные разделяются на обучающую и валидационную выборки
Обучение может остановится раньше времени, если модель начинает переобучаться
В конце обучения выводится график ошибок
Дальше использовать модель для прогнозов или можно сохранить модель и использовать позже.
Поехали.
Установка
pip install dquant
Готово. Зависимости (pandas, numpy, xgboost, lightgbm, matplotlib) тянутся автоматически.
Проверить:
import dquant print(dquant.version) # 1.0.0
Быстрый старт: прогноз волатильности EURUSD за 3 строки с Yahoo Finance
С помощью Yahoo Finance мы сможем получить ценовые данные за определенный период. Для начала нужно будет установить python библиотеку yfinance.
Установка Yahoo Finance
pip install yfinance
Код на python
import pandas as pd import yfinance as yf from datetime import datetime, timedelta from dquant.models import VolClustXGB # 1. Загружаем часовые данные за 730 дней за пару евро/доллар start_date = datetime.now() - timedelta(days=730) df = yf.download("EURUSD=X", start=start_date, interval='1h') # Создаем датафрейм с входными данными(нам нужны только колонки open, close, high, low, volume) df = pd.DataFrame({ 'open': df[('Open', 'EURUSD=X')].values, 'high': df[('High', 'EURUSD=X')].values, 'low': df[('Low', 'EURUSD=X')].values, 'close': df[('Close', 'EURUSD=X')].values, 'volume': df[('Volume', 'EURUSD=X')].values }, index=df.index) # 2. Создаем модель model = VolClustXGB({}, default=True, early_stopping=True) # 3. Обучаем модель model.fit(df, input_bars=70, horizon=20, trees_count=200, show_results=True) # 4. Делаем прогноз rez = model.forecast(df.iloc[-70:].copy(), show=True)
Сам процесс обучения и прогнозирования занимает 3 строки, до этого нужно достать сырые данные.
Что вы увидите:
-
График обучения (ошибка на train/validation)

Красная гистограмма — историческая волатильность
Зелёная гистограмма — прогноз на следующие 20 баров

Готово. Можно сразу ставить стопы или калибровать размер позиции.
Разберем код из самой библиотеки dquant подробнее.
Первая строка
model = VolClustXGB({}, default=True, early_stopping=True)
Создаем класс VolClustXGB, он использует модель XGBoost (eXtreme Gradient Boosting). Первым и вторым аргументом будет пустой словарь и default=True. Это значит что при обучении будут использоваться гиперпараметры по умолчанию. early_stopping=True значить что обучение автоматически прекратится, когда модель начнем переобучаться.
Если вы хотите добавить свои гиперпараметры(для этого нужно разбираться в ML), то нужно поставить default=False и словарь должен быть не пустым. Например:
settings = { 'objective': 'reg:squarederror', 'learning_rate': 0.1, 'n_estimators': 1, 'max_depth': 3, 'min_child_weight': 5, 'subsample': 0.8, 'random_state': 42 } model = VolClustXGB(settings, default=False, early_stopping=True)
Но также можно обойтись и дефолтным примером, если вы не забираетесь в ML. Как раз для вас было и создана эта библиотека.
Вторая строка
model.fit(df, input_bars=70, horizon=20, trees_count=200, show_results=True)
Здесь происходит и разметка данных и обучение.
Первым аргументом мы подаем наши сырые данные df.
Второй аргумент input_bars=70 — это количество баров, на входе. Это наши входные данные, на которых будет обучаться наша модель. После обучения именно столько данных нам нужно будет подавать на вход нашей модели, чтобы получить предсказание.
Третий аргумент horizon=20 — это количество шагов нашего предсказания. В нашем случае мы научим модель предсказывать волатильность на 20 баров вперед. Учитывая то, что у нас часовые данные, предсказываем мы на 20 часов вперед.
Четвертый аргумент trees_count=200 — это максимально количество деревьев, на котором мы будем обучать нашу модель. У нас early_stopping=True еще в первой строке, то есть модель перестанет обучаться, если начнется переобучение, даже если мы поставим 1000 или 10000 деревьев.
Пятый аргумент show_results=True значит, что после обучения будет показан график, на котором будет видно снижение ошибки на тренировочных и на валидационных данных.
Третья строка
rez = model.forecast(df.iloc[-70:].copy(), show=True)
И наконец, третья строка. Модель уже обучена и мы предсказываем волатильность.
Первый аргумент df.iloc[-70:].copy() — наши входные данные. Наша модель принимает на вход 70 баров, мы сами её так обучили. В данном примере мы просто берем последние 70 баров из наших данных, которые мы импортировали.
Второй аргумент show=True — показывает результат прогнозирования на графике. Если вы не хотите этого, то просто не указывайте этот аргумент.
rez = model.forecast(df.iloc[-70:].copy())
Результат прогнозирования запишется в переменную rez в любом случает, хотите ли вы результат на графике или нет.
Проблема Yahoo Finance
Yfinance не позволяет получить внутридневные данные за промежуток более чем 730 дней. Мы можем воспользоваться MetaTrader 5, чтобы получить больше данных. Чем больше данных, тем дольше модель будет обучаться, но тем лучше будут прогнозы.
Чтобы взять данные из MetaTrader 5 нужно его сначала установить и открыть. Выбираете любого брокера(у меня FxPro), устанавливаете MetaTrader 5 себе на компьютер.
После этого нужно будет еще установить python библиотеку MetaTrader5.
Пример с MetaTrader 5
Установка
pip install MetaTrader5
import pandas as pd import MetaTrader5 as mt5 from datetime import datetime as dt from dquant.models import VolClustXGB # Собираем данные из MetaTrader 5 symbol = "EURUSD" # Берем данные за пару евро/доллар timeframe = mt5.TIMEFRAME_H1 # Берем данные с часового таймфрейма days_back = 1000 # Берем данные за 1000 дней if not mt5.initialize(): # Покдлючаемся к MetaTrader print("Не удалось подключиться к MT5") quit() if not mt5.symbol_select(symbol, True): print(f"Символ {symbol} не найден") mt5.shutdown() quit() to_date = dt.now() + dt.timedelta(hours=3) from_date = to_date - dt.timedelta(days=days_back) rates = mt5.copy_rates_range(symbol, timeframe, from_date, to_date) # Получаем данные mt5.shutdown() # Конец сбора данных # Меняем структуру данных для подачи в модель df = pd.DataFrame(rates) df['time'] = pd.to_datetime(df['time'], unit='s') df.set_index('time', inplace=True) df.rename(columns={'tick_volume': 'volume'}, inplace=True) # Само обучение и прогнозирование(занимает 3 строки) model = VolClustXGB({}, default=True, early_stopping=True) model.fit(df, input_bars=70, horizon=20, trees_count=200, show_results=True) rez = model.forecast(df.iloc[-70:].copy(), show=True)
Сохранение модели
# Сохранить один раз — использовать вечно: model.save("eurusd_vol_model") # позже model.load("eurusd_vol_model") model.forecast(df.iloc[-70:].copy(), show=True)
Как попробовать прямо сейчас
Вы можете запустить этот код прямо у себя в браузере через Jupiter Notebook
Ссылки
Библиотека полностью открытая (MIT). Если найдёте баг или захотите фичу — создавайте Issue, я отвечаю быстро.
Комментарии (6)

CrazyElf
23.03.2026 05:38Поскольку это time series задача в какой-то степени, тут нужно очень тщательно подходить к подготовке данных. У меня сложилось впечатление, что вы не как к TS задаче подходите, а как к обычному "обучению с учителем". Или нет? У вас подготовка фич полностью "под капотом", в статье ничего не разъясняется, так нельзя. Нужно всё-таки объяснять - как вы фичи готовите, что у вас получается входные данные, а что target. Тем более если вы не TS алгоритм берёте, навроде ARIMA, а обычную ML модель и сами для неё фичи готовите. Используется ли у вас скользящее среднее, выделяете ли вы сезонность, что вы вообще делаете с данными? Без объяснения этого у вас получается просто какой-то чёрный ящик, который непонятно что и непонятно как предсказывает. В финансовой сфере такой "чёрный ящик" никто всерьёз применять просто не будет.

denchikslaz Автор
23.03.2026 05:38В статье рассказывается про использование библиотеки, конкретно про "прогноз в 3 строки кода". Библиотека вышла недавно, и мне ещё предстоит её дорабатывать, пока собираю обратную связь и параллельно дорабатываю. В документации рассказывается какие фичи используются, в статье нет. Более того, в статье много чего не рассказывается про библиотеку, только т.н. прогноз в три строки. Я учту ваши замечания в последующих обновлениях библиотеки и статьях, спасибо.

NeverIn
23.03.2026 05:38Было бы люблопытно взглянуть на прогноз и реальность на каком либо реальном тикере
AChevozerov
Это даже не trainy-уровень, это словно описание первых нескольких часов изучения ML
Где пояснения по принятым решениям? Почему xgboost? Какие метрики у модели на валидационных данных?
Зачем вам 1000 дней вместо 720, почему прогнозы будут лучше? Просто потому что больше = лучше? Всегда ли? Какая именно компонента вашего временного ряда должна улучшить прогноз вашей модели? Вы ведь не провели никакой валидации и не знаете лучше она работает или хуже.
Шкалы на графиках нечитаемые, любой аналитик по голове бы настучал сразу же
Вы же понимаете что LLM написало бы весь этот код за 2 минуты и сделало бы это корректнее ответив на каждый из этих вопросов? Так какую ценность несёт такой "базовый пример"?
denchikslaz Автор
Спасибо за комментарий. Статья и библиотека ориентирована на тех, кто в мл не разбирается вообще, чтобы им можно было без погружения в детали сразу обучить модель. Библиотека вышла недавно, мне нужна была обратная связь. Я учту вашу критику при последующих обновлениях.