Быстрый старт

Что такое QuantNet?

QuantNet — компания, которая занимается разработкой инструментов для создания торговых стратегий.

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

Мы предлагаем пользователям:

  • участвовать в розыгрыше 500 тысяч рублей за квартал, отправив стратегии в соревнования;

  • открытые инструменты для выгрузки данных с финансовых бирж;

  • открытые инструменты для создания торговых стратегий. Вы можете применить их для частной торговли;

  • протестировать финансовые идеи;

  • дружественное комьюнити и быструю обратную связь в vk, Telegram;

Стратегии создаются на языке python или scala.

Разрабатывайте стратегий в Jupyter Notebook или JupyterLab.

Предоставляем инстансы до 8 гб оперативной памяти на каждую стратегию.

Начало работы

Цель. Познакомить вас с тем как создавать и тестировать идеи финансовых стратегий, на примере.

Необходимые условия.

Нажмите создать стратегию или скопируйте любой шаблон готовых стратегий.

Исторические финансовые данные

Возьмём исторические цены компаний Google и Apple за последние 4*365 дней, отсортированные в хронологическом порядке

import qnt.data as qndata
import datetime as dt

data = qndata.load_data(
                       assets=['NASDAQ:AAPL', 'NASDAQ:GOOGL'],
                       tail = dt.timedelta(days=4*365),
                       forward_order=True)
data.sel(field="open").to_pandas().tail()
asset NASDAQ:AAPL NASDAQ:GOOGL
time
2020-08-03 12118.40 1491.00
2020-08-04 12222.84 1486.71
2020-08-05 12250.28 1476.82
2020-08-06 12365.36 1476.15
2020-08-07 12678.96 1509.04

Создание финансовой стратегии

Стратегии на платформе создаются в виде весов от финансового портфеля.

Например вы хотите торговать акциями компаний Google и Apple.

  • Сколько процентов от капитала инвестировать в Google, а сколько в Apple, чтобы заработать завтра? - задача алгоритма.

  • Каждый торговый день проценты могут меняться. Вы получаете прибыль, если угадываете направления цен или теряете капитал.

Идея стратегии. Возьмём абсолютные изменения цен открытия. Цена текущего дня минус цена предыдущего дня. Получившиеся изменения возьмём как веса активов.

price_open = data.sel(field="open")
strategy = price_open - price_open.shift(time=1)

Абсолютные изменения цен:

strategy.to_pandas().tail()
asset NASDAQ:AAPL NASDAQ:GOOGL
time
2020-08-10 -67.76 -18.2400
2020-08-11 -70.70 3.2000
2020-08-12 -164.78 -6.8755
2020-08-13 440.44 21.0855
2020-08-14 44.66 5.4000

Превращаем их в веса для нашего портфеля.

weights = strategy / abs(strategy).sum('asset')
weights.to_pandas().tail()
asset NASDAQ:AAPL NASDAQ:GOOGL
time
2020-08-10 -0.787907 -0.212093
2020-08-11 -0.956698 0.043302
2020-08-12 -0.959946 -0.040054
2020-08-13 0.954313 0.045687
2020-08-14 0.892129 0.107871

Алгоритм считает какие веса портфеля должны быть на открытии торгов следующего дня.

В следующий торговый день 2020-08-17 (понедельник) алгоритм распределит капитал так, чтобы 0.892129 составляли акции компании AAPL и 0.107871 компании GOOGL

Проверка финансовой стратегии

  • Сколько вы сможете заработать или потерять? - показывает equity.

  • Хорошая идея или нет - показывает коэффициент шарпа. Чем больше тем лучше.

import qnt.stats   as qnstats
stat = qnstats.calc_stat(data, weights)
display(stat.to_pandas().tail())
field equity relative_return volatility underwater max_drawdown sharpe_ratio mean_return bias instruments avg_turnover avg_holding_time
time
2020-08-10 0.466479 0.014505 0.277919 -0.542720 -0.664973 -0.696295 -0.193513 -1.000000 2.0 1.201497 1.658224
2020-08-11 0.471410 0.010569 0.277976 -0.537887 -0.664973 -0.690718 -0.192003 -0.913396 2.0 1.203822 1.666114
2020-08-12 0.457143 -0.030265 0.278233 -0.551872 -0.664973 -0.698488 -0.194343 -1.000000 2.0 1.203890 1.665696
2020-08-13 0.449022 -0.017764 0.278343 -0.559833 -0.664973 -0.724633 -0.201697 1.000000 2.0 1.203835 1.665697
2020-08-14 0.448528 -0.001100 0.278333 -0.560317 -0.664973 -0.728930 -0.202885 1.000000 2.0 1.204111 1.664291

Обратите внимание на последнюю строчку (2020-08-14).

Величина equity = 0.448528 означает, что первоначальный капитал «1» уменьшился до «0.448528» Коэффициент sharpe_ratio -0.728930 отрицательный.

Как ведут себя прибыль и стабильность её получения можно посмотреть на графиках.

import qnt.graph   as qngraph
equity = stat.to_pandas()["equity"]
qngraph.make_plot_filled(equity.index, equity, name="PnL (Equity)", type="log")

sharpe = stat.to_pandas()["sharpe_ratio"].fillna(0)
qngraph.make_plot_filled(sharpe.index, sharpe, name="sharpe_ratio")

equity sharpe

Вывод данную стратегию лучше не использовать в торговле.

Отправка стратегии в конкурс

Если стратегия имеет шарп большей 1, вы можете принять участие в соревнованиях (подробнее):

  • проверьте коррелирует ли стратегия с уже отправленными соревнованиями. Если всё ок переходите к следующему шагу

qnstats.print_correlation(weights, data)
  • вызовите функцию write_output передав в неё веса, которые сгенерировала стратегия.

import qnt.stepper as qnstepper
qnstepper.write_output(weights)
  • в вашем личном кабинете, в разделе стратегии выберите стратегию и нажмите значок отправки стратегии

Полный код стратегии

import qnt.data as qndata
import qnt.stats   as qnstats
import qnt.stepper as qnstepper
import datetime as dt

data = qndata.load_data(
                       assets=['NASDAQ:AAPL', 'NASDAQ:GOOGL'],
                       tail = dt.timedelta(days=4*365),
                       forward_order=True)


price_open = data.sel(field="open")
strategy = price_open - price_open.shift(time=1)


weights = strategy / abs(strategy).sum('asset')


stat = qnstats.calc_stat(data, weights)
display(stat.to_pandas().tail())

qnstats.print_correlation(weights, data)

qnstepper.write_output(weights)

Улучшаем алгоритм

Для примера мы использовали две компании Google и Apple, но нам доступно большое количество других компаний.

Посмотрим как покажет себя алгоритм если будем торговать ликвидными компаниями и попробуем уменьшить количество сделок в портфеле.

Для этого будем брать максимальные значения весов портфеля за последние 10 дней.

import qnt.data as qndata
import qnt.stats   as qnstats
import qnt.stepper as qnstepper
import datetime as dt

data = qndata.load_data(
                       tail = dt.timedelta(days=4*365),
                       forward_order=True)

def get_weights_strategy(data):
    price_open = data.sel(field="open")
    strategy = price_open - price_open.shift(time=1)

    strategy = strategy * data.sel(field="is_liquid")

    weights = strategy / abs(strategy).sum('asset')
    return weights


def get_reduce_number_trades(weights, day_rolling):
    return weights.rolling({"time": day_rolling}).max()


weights_clean = get_weights_strategy(data)
weights = get_reduce_number_trades(weights_clean,
                                   day_rolling = 10)



stat = qnstats.calc_stat(data, weights)
display(stat.to_pandas().tail())

qnstats.print_correlation(weights, data)

qnstepper.write_output(weights)
field equity relative_return volatility underwater max_drawdown sharpe_ratio mean_return bias instruments avg_turnover avg_holding_time
time
2020-08-10 1.593945 -0.004482 0.236717 -0.011803 -0.329837 0.516429 0.122248 1.0 951.0 0.098621 20.868946
2020-08-11 1.572682 -0.013340 0.236853 -0.024986 -0.329837 0.495218 0.117294 1.0 951.0 0.098591 20.870772
2020-08-12 1.599595 0.017113 0.236704 -0.008301 -0.329837 0.556694 0.131772 1.0 951.0 0.098665 20.874677
2020-08-13 1.605007 0.003384 0.236706 -0.004945 -0.329837 0.557238 0.131901 1.0 951.0 0.098590 20.858870
2020-08-14 1.603470 -0.000957 0.236606 -0.005898 -0.329837 0.536024 0.126826 1.0 951.0 0.098747 20.914003
WARNING! This strategy correlates with other strategies.
The number of systems with a larger Sharpe ratio and correlation larger than 0.8: 3
The max correlation value (with systems with a larger Sharpe ratio): 0.9511156122825762
Current sharpe ratio(3y): 0.5360242631712083

write output: /root/fractions.nc.gz
import qnt.graph   as qngraph
equity = stat.to_pandas()["equity"]
qngraph.make_plot_filled(equity.index, equity, name="PnL (Equity)", type="log")

equity_up

Видим, что стратегия начала зарабатывать деньги. Есть и другие способы улучшения алгоритма.

Вебинар. Как начать работу на платформе

video

Вебинар. Создаем стратегию с помощью шаблонов

video

Готовы к большему?

Пока мы лишь кратко представили самые основные возможности платформы QuantNet — остаток этого руководства посвящён более детальному рассмотрению этих и других возможностей, поэтому советуем прочитать его целиком!