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

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

Среди наших лучших пользователей, которые в настоящее время получают плату за свои системы, у нас действительно есть студенты технических факультетов, такие как Алекс, аспирант физики Калифорнийского университета в Санта-Барбаре, который получил 1 миллион долларов в качестве ассигнований, когда он выиграл Конкурс Quantiacs и Дэниел, инженер-мехатроник и профессиональный трейдер, получивший 2 миллиона долларов в виде ассигнований, выиграв два конкурса. Больше материалов можно найти на нашей странице в сети.

Вы специалист по данным, который хочет заняться количественной торговлей, или вы хотите проверить, работают ли некоторые идеи, которые у вас есть? Тогда вам стоит попробовать Quantiacs.

Использование Quantiacs

Присоединиться к Quantiacs просто:

  • Зарегистрируйтесь на платформе. Поскольку мы ценим конфиденциальность наших пользователей, вам следует просто указать имя пользователя и пароль. Вы также можете войти, используя свои учетные данные GitHub, Google или Facebook, если хотите.
  • В вашем распоряжении будет личный кабинет с разделом Разработка. Здесь вы можете выбрать один из предоставленных примеров и нажать кнопку Клонировать. После этого вы сможете редактировать код в разделе Мои стратегии с помощью Jupyter Notebook или JupyterLab в нашем облаке. Вы сможете запускать каждую стратегию в нашем облаке, используя 8 ГБ ОЗУ и 1 ядро ​​Xeon E5–1650, и у вас будет онлайн-доступ ко всем финансовым данным, которые мы предоставляем.

  • Если вы предпочитаете работать локально на своей рабочей станции, вы можете загрузить все финансовые данные и наш бэктестер локально. Для локальной установки мы рекомендуем использовать conda и прочитать подробные инструкции, которые мы приводим на нашей странице.
  • Как только вы будете удовлетворены своим кодом, вы можете нажать кнопку «Отправить» в своей пользовательской области и отправить его на наши серверы для оценки в реальном времени. В настоящее время мы проводим два конкурса (15-й классический конкурс Quantiacs Futures и 1-й конкурс на биткойн-фьючерсы) и 7 лучших квантов для каждого конкурса, оцениваемых в соответствии с живым рейтингом Шарпа. соотношение их систем, примет участие в гарантированном распределении 4 миллиона долларов. Тем не менее, все представленные системы будут считаться подходящими для распределения при условии, что они будут иметь интересную репутацию вживую.

Поступают первые заявки. Вы можете проверить их на странице Таблица лидеров.

Когда мы писали новую версию платформы Quantiacs, мы уделяли особое внимание созданию среды, подходящей для использования методов машинного обучения. В этой статье мы опишем реализацию системы, торгующей контрактом Биткойн-фьючерсы и основанной на Риджевой регрессии (или на более общей концепции регуляризации Тихонова). .

Полный код

Полный код очень компактен и может быть скопирован в ячейку записной книжки:

import xarray as xr
import numpy as np
import logging
import qnt.data as qndata
import qnt.backtester as qnbt
def load_data(period):
    return qndata.cryptofutures.load_data(tail=period)
def predict_weights(market_data):
  def get_ml_model():
    from sklearn.linear_model import RidgeClassifier
    model = RidgeClassifier(random_state=18)
    return model
  def get_features(data):

    def preprocess_data(raw_prices):
      log_prices = raw_prices.copy(True)
      assets = log_prices.columns
      for asset in assets:
        log_prices[asset] = np.log(log_prices[asset])
      return log_prices
    prices = data.sel(field="close").\
             ffill("time").bfill("time").fillna(0)
    prices_df = prices.to_pandas()
    features = preprocess_data(prices_df)
    return features
  def get_target_classes(data):
    price_current = data.sel(field="close").dropna("time")
    price_future = price_current.shift(time=-1).dropna("time")
    class_positive = 1
    class_negative = 0
    target_up = xr.where(price_future > price_current,\
                class_positive, class_negative)
    return target_up.to_pandas()
  data = market_data.copy(True)
  asset_names = data.coords["asset"].values
  features = get_features(data)
  target = get_target_classes(data)
  prediction_df = data.sel(field="close").isel(time=-1).to_pandas()
  for asset_name in asset_names:
    target_asset = target[asset_name]
    features_asset = features[asset_name][:-1]
    target_asset, features_asset = \
      target_asset.align(features_asset, axis=0, join="inner")
    model = get_ml_model()
    try:
      model.fit(features_asset.values.reshape(-1, 1), target_asset)
      features_asset_predict = features[asset_name][-1:]
      prediction_asset = \
        model.predict(features_asset_predict.values.reshape(-1, 1))
      prediction_df[asset_name] = prediction_asset
    except:
      logging.exception("model failed")
      return xr.zeros_like(data.isel(field=0, time=0))
  return prediction_df.to_xarray()
weights = qnbt.backtest(
    competition_type = "cryptofutures",
    load_data = load_data,
    lookback_period = 18,
    start_date = "2014-01-01",
    strategy = predict_weights,
    analyze = True,
    build_plots = True
)

Обсуждение

Разберем его поблочно. В самом начале мы импортируем базовые библиотеки общего назначения и нужные нам модули из библиотеки Quantiacs:

import xarray as xr
import numpy as np
import logging
import qnt.data as qndata
import qnt.backtester as qnbt

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

Функция загрузки данных фьючерсов на биткойн просто определяется следующим образом:

def load_data(period):
    return qndata.cryptofutures.load_data(tail=period)

Более подробную информацию о загрузке данных можно найти, просмотрев исходный код библиотеки Quantiacs, доступной в нашем репозитории GitHub, и прочитав страницу документации Quantiacs.

Ядро кода, в котором определяется стратегия, содержится в блоке:

def predict_weights(market_data):
  def get_ml_model():
    from sklearn.linear_model import RidgeClassifier
    model = RidgeClassifier(random_state=18)
    return model
  def get_features(data):

    def preprocess_data(raw_prices):
      log_prices = raw_prices.copy(True)
      assets = log_prices.columns
      for asset in assets:
        log_prices[asset] = np.log(log_prices[asset])
      return log_prices
    prices = data.sel(field="close").\
             ffill("time").bfill("time").fillna(0)
    prices_df = prices.to_pandas()
    features = preprocess_data(prices_df)
    return features
  def get_target_classes(data):
    price_current = data.sel(field="close").dropna("time")
    price_future = price_current.shift(time=-1).dropna("time")
    class_positive = 1
    class_negative = 0
    target_up = xr.where(price_future > price_current,\
                class_positive, class_negative)
    return target_up.to_pandas()
  data = market_data.copy(True)
  asset_names = data.coords["asset"].values
  features = get_features(data)
  target = get_target_classes(data)
  prediction_df = data.sel(field="close").isel(time=-1).to_pandas()
  for asset_name in asset_names:
    target_asset = target[asset_name]
    features_asset = features[asset_name][:-1]
    target_asset, features_asset = \
      target_asset.align(features_asset, axis=0, join="inner")
    model = get_ml_model()
    try:
      model.fit(features_asset.values.reshape(-1, 1), target_asset)
      features_asset_predict = features[asset_name][-1:]
      prediction_asset = \
        model.predict(features_asset_predict.values.reshape(-1, 1))
      prediction_df[asset_name] = prediction_asset
    except:
      logging.exception("model failed")
      return xr.zeros_like(data.isel(field=0, time=0))
  return prediction_df.to_xarray()

Функция «pred_weights» для прогнозирования весов содержит три вспомогательных логических блока:

  • Функция “get_ml_model”, в которой определяется модель машинного обучения. Мы выбрали классификатор регрессии Ridge из scikit-learn, но можно использовать любой другой классификатор / библиотеку, доступную в экосистеме Python. Ваша онлайн-среда содержит блокнот для инициализации для установки необходимых библиотек и решения зависимостей с помощью conda или pip. Для автономной разработки мы рекомендуем работать в специальной среде Quantiacs и использовать conda для установки пакетов, как описано здесь.
  • Функция «get_features», в которой определяются функции прогнозирования. Здесь мы просто берем в качестве характеристики логарифм цены закрытия различных активов.
  • Функция «get_target_classes», в которой мы определяем цели. Наш выбор очень прост: если цена сегодня больше, чем цена вчера, мы присваиваем метку «1», иначе метку «0». Метка «1» позже будет использоваться для получения положительного риска по активу (открытия длинной позиции), а метка «0» будет использоваться для закрытия позиции (закрытие длинной позиции и инвестирование всего наличными).

Остальная часть функции выполняет контролируемое обучение: проверяются прошлые данные и для каждого значения признака (логарифм цены актива) реализованное значение цели (1 для положительного движения цены. , иначе 0) проверяется. Классификатор Ridge обучается каждый день в последние доступные L дней, где L = 18 (период ретроспективного анализа в функции тестирования на исторических данных). После обучения модель предсказывает торговое решение на следующий день, считывая новое значение функции и присваивая прогнозируемое целевое значение 1 или 0. Обучение обновляется каждый день на скользящей основе.

Наконец, мы вызываем функцию бэктестера:

weights = qnbt.backtest(
    competition_type = "cryptofutures",
    load_data = load_data,
    lookback_period = 18,
    start_date = "2014-01-01",
    strategy = predict_weights,
    analyze = True,
    build_plots = True
)

который вычисляет веса, которые мы назначаем контракту на биткойн-фьючерсы каждый день.

Производительность системы неплохая, что видно из графика прибылей и убытков и подводного графика:

Система имеет в выборке коэффициент Шарпа больше 1 и может быть подана на конкурс. Мы предоставляем готовую версию в разделе «Примеры» вашего аккаунта (Machine Learning-Ridge Classifier).

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

Исходный код GitHub: https://github.com/quantiacs/strategy-cryptofutures-ml-ridge

Есть вопросы? Используйте наш форум сообщества: https://quantiacs.com/community/

Или напишите нам по почте: [email protected]