Прогноз волатильности в 3 строки кода без знания ML. python.. python. волатильность.. python. волатильность. волатильность рынка.. python. волатильность. волатильность рынка. ИИ.. python. волатильность. волатильность рынка. ИИ. искусственный интеллект.. python. волатильность. волатильность рынка. ИИ. искусственный интеллект. Машинное обучение.. python. волатильность. волатильность рынка. ИИ. искусственный интеллект. Машинное обучение. машинное+обучение.. python. волатильность. волатильность рынка. ИИ. искусственный интеллект. Машинное обучение. машинное+обучение. трейдинг.. python. волатильность. волатильность рынка. ИИ. искусственный интеллект. Машинное обучение. машинное+обучение. трейдинг. финансы.. python. волатильность. волатильность рынка. ИИ. искусственный интеллект. Машинное обучение. машинное+обучение. трейдинг. финансы. Финансы в IT.

Привет, друзья! Меня зовут Денис, я алгоритмический трейдер и разработчик.

Когда я пришёл в алготрейдинг, мне очень хотелось быстро применить машинное обучение. Но для этого нужно было разбираться в ML и Data Science, а я только начинал. Сейчас я уже разбираюсь, но знаю, что далеко не все трейдеры готовы тратить на это месяцы.

Специально для тех, кто хочет попробовать ML для прогноза волатильности без глубоких знаний, я сделал библиотеку dquant.

Теперь можно обучить модель, вообще не разбираясь в feature engineering, сплитах и гиперпараметрах. Нужны лишь знания python и уметь достать сырые данные (open, close, high, low, volume).

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

Весь процесс состоит из 2-х этапов:

  1. Подготовка сырых данных (open, close, high, low, volume)

  2. Обучение и прогноз (3 строки кода)

Что происходит под капотом?:

  1. Данные разделяются на входные и выходные

  2. Из входных данных создаются  фичи, из выходных – таргеты

  3. Данные разделяются на обучающую и валидационную выборки

  4. Обучение может остановится раньше времени, если модель начинает переобучаться

  5. В конце обучения выводится график ошибок

Дальше использовать модель для прогнозов или можно сохранить модель и использовать позже.

Поехали.

Установка

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)

    Прогноз волатильности в 3 строки кода без знания ML - 1
  • Красная гистограмма — историческая волатильность

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

Прогноз волатильности в 3 строки кода без знания ML - 2

Готово. Можно сразу ставить стопы или калибровать размер позиции.

Разберем код из самой библиотеки 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, я отвечаю быстро.

Автор: denchikslaz

Источник

Rambler's Top100