Быстрый старт¶
Что такое 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")
Вывод данную стратегию лучше не использовать в торговле.
Отправка стратегии в конкурс¶
Если стратегия имеет шарп большей 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")
Видим, что стратегия начала зарабатывать деньги. Есть и другие способы улучшения алгоритма.
Вебинар. Как начать работу на платформе¶
Вебинар. Создаем стратегию с помощью шаблонов¶
Готовы к большему?¶
Пока мы лишь кратко представили самые основные возможности платформы QuantNet — остаток этого руководства посвящён более детальному рассмотрению этих и других возможностей, поэтому советуем прочитать его целиком!