Стратегия торговли по ценам открытия

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

1. Подготовка

Сначала нужно подготовить рабочее пространство - загрузить данные и библиотеки

# Import basic libraries.
import xarray as xr
import numpy as np
import pandas as pd

# Import quantnet libraries.
import qnt.data    as qndata
import qnt.stepper as qnstepper
import qnt.stats   as qnstats
import qnt.graph   as qngraph
import qnt.forward_looking as qnfl # forward looking checking
# load historical data
data = qndata.load_data(min_date = "2017-01-01",
                        max_date = None,
                        dims     = ("time", "field", "asset"))

« data «- это xarray.DataArray, который содержит исторические данные. Например, мы хотим получить цены открытия и закрытия акций Apple:

apple_close = data.loc[::, "close", "NASDAQ:AAPL"]
apple_open = data.loc[::, "open", "NASDAQ:AAPL"]

# you can also work with pandas:
# apple_close = data.loc[::, "close", :].to_pandas()["NASDAQ:AAPL"]

Таблицу доступных данных можно посмотреть здесь. Некоторые другие данные:

all_close = data.loc[::, "close", :]
all_open = data.loc[::, "open", :]

# boolean parameter. True if the stock is in top 500 most liquid stocks over the last month
liquid = data.loc[::, "is_liquid", :]

2. Распределение весов

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

\[\frac{1}{open}\]

Мы можем распределить капитал, присваивая веса инструментам портфеля. (читать подробнее здесь):

weights = 1/all_open

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

# buy all positions: weights = all_open/all_open
# sell all positions: weights = -all_open/all_open
# the more price change, the more we buy = (all_close - all_open)/all_open

Обратите внимание, что мы торгуем только ликвидными акциями. Можно сформировать выходные веса:

output = weights*liquid


# If you worked with pandas and weigths is pandas.Dataframe:
# output = xr.DataArray(weights.values, dims = ["time","asset"], coords= {"time":weights.index,"asset":weights.columns} )

3. Оценка эффективности

После того, как мы построили алгоритм, нам нужно его оценить. Для начала нам нужно рассчитать статистику.

# calc_stat calculate statistic on a relevenat time frame window
stat = qnstats.calc_stat(data, output)
display(stat.to_pandas().tail())

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

# show plot with profit and losses:
performance = stat.to_pandas()["equity"]
qngraph.make_plot_filled(performance.index, performance, name="PnL (Equity)", type="log")

Equity

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

# Actual sharpe on a relevant timeframe. 
# According to the rules the Sharpe ratio must be greater than 1:
display(stat[-1:].sel(field = ["sharpe_ratio"]).transpose().to_pandas())

# According to the rules the correlation with other strategies must be less than 90%:
qnstats.print_correlation(output, data)

4. Отправка стратегии

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

# Finally, write the output
qnstepper.write_output(output)

На этом этапе код готов к отправке. Просто нажмите на кнопку отправки на странице вашего аккаунта, и мы оценим вашу стратегию на наших серверах!

СОЗДАТЬ СТРАТЕГИЮ

Не забудьте зарегистрироваться на платформе