рекомендации

пятница, 8 января 2021 г.

Тестирование торговых стратегий на исторических данных с помощью Quantstrat. Часть 7. Анализ результатов тестирования.

Первая часть
Вторая часть
Третья часть
Четвертая часть
Пятая часть
Шестая часть

 

 

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

Для этого воспользуемся функцией chart.Posn(). Она создает четкую и информативную визуализацию эффективности вашей торговой системы в ходе моделирования.

 

chart.Posn(portfolio.st, Symbol = symbols, 

  TA = "add_SMA(n = 7, col = 4); add_SMA(n = 21, col = 2)")

 

 

 

Подробную статистику по торговле можно вывести с помощью следующего кода:

 

# Статистика торговли

tstats <- tradeStats(portfolio.st)

kable(t(tstats), format = "simple", caption = "Стратегия пересечения двух скользящих средних")

 

При этом результаты выводятся в виде таблицы непосредственно в консоль R:

 

Table: Стратегия пересечения двух скользящих средних

 

                     SBER         

-------------------  -------------

Portfolio            Port.CrossMA 

Symbol               SBER         

Num.Txns             75           

Num.Trades           37           

Net.Trading.PL       5384         

Avg.Trade.PL         105.9189     

Med.Trade.PL         -72          

Largest.Winner       2380         

Largest.Loser        -937         

Gross.Profits        10631        

Gross.Losses         -6712        

Std.Dev.Trade.PL     668.7483     

Std.Err.Trade.PL     109.9415     

Percent.Positive     43.24324     

Percent.Negative     56.75676     

Profit.Factor        1.58388      

Avg.Win.Trade        664.4375     

Med.Win.Trade        383.5        

Avg.Losing.Trade     -319.619     

Med.Losing.Trade     -242         

Avg.Daily.PL         105.9189     

Med.Daily.PL         -72          

Std.Dev.Daily.PL     668.7483     

Std.Err.Daily.PL     109.9415     

Ann.Sharpe           2.514265     

Max.Drawdown         -3582        

Profit.To.Max.Draw   1.503071     

Avg.WinLoss.Ratio    2.078842     

Med.WinLoss.Ratio    1.584711     

Max.Equity           5749         

Min.Equity           -1689        

End.Equity           5384         

 

Здесь можно просмотреть все основные результаты тестирования. Например, в нашем случае всего было совершено 75 сделок, доля прибыльных трейдов (Percent.Positive) составила 43,2%, общая прибыль (Net.Trading.PL) составила 5384 рублей.

Profit factor, то есть результат отношения общего количества всех сделок, принесших прибыль, к сумме убыточных торговых операций за определенный временной интервал, равен 1,58. Он близок к единице, поэтому результат торговли можно считать практически нулевым.

 

Далее можно вывести классические графики, отражающие эффективность торговой системы во времени: совокупная прибыль (cumulative return), дневная прибыль (daily return) и просадка (Drawdown).

 

rets <- PortfReturns(Account = account.st)

rownames(rets) <- NULL

charts.PerformanceSummary(rets, colorset = bluefocus)

 

 

Для тех, кто хочет подробно изучить работу торговой системы, можно вывести таблицу всех сделок. Она, как правило, имеет большой размер и включает множество показателей, поэтому ее целесообразно сохранить в отдельном файле в формате html, и позже просмотреть в браузере. Это можно сделать с помощью следующего кода:

 

pts <- perTradeStats(portfolio.st, Symbol = symbols)

kable(pts, booktabs = TRUE, caption = symbols)

kable(pts, format = "simple")

 

pts %>%

  kable() %>%

  kable_styling() %>%

  save_kable(file = "table1.html", self_contained = T)

 

 Ниже на скриншоте приведен фрагмент данной таблицы.

 

 

Разберем подробнее показатели, которые включаются в таблицу всех сделок:

 

Start - временная метка POSIXct начала торговли;

End - временная метка POSIXct окончания торговли;

Init.Qty- количество ценных бумаг при инициации сделки;

Init.Pos - размер позиции после инициации сделки;

Max.Pos - максимальный размер открытой позиции;

End.Pos - размер позиции, оставшейся после закрытия сделки;

Closing.Txn.Qty - количество ценных бумаг, закрывающее сделку;

Num.Txns - количество комиссий, включенных в сделку;

Max.Notional.Cost - максимальная условная инвестиционная стоимость этой сделки;

Net.Trading.PL - чистая торговая прибыль/убыток;

MAE - максимальный плавающий убыток, который был во время удержания позиции;

MFE - максимальная плавающая прибыль, которая была во время удержания позиции;

Pct.Net.Trading.PL - чистая торговая прибыль/убыток в процентах от максимальной условной инвестиционной стоимости этой сделки;

Pct.MAE - MAE в процентах;

Pct.MFE - MFE в процентах;

tick.Net.Trading.PL - чистая торговая прибыль/убыток в тиках;

tick.MAE - MAE в тиках;

tick.MFE - MFE в тиках;

duration - difftime, описывающий продолжительность сделки, в секундах.

 

Можно вывести основные совокупные показатели эффективности стратегии:

 

tab.perf <- table.Arbitrary(rets,

                            metrics=c(

                              "Return.cumulative",

                              "Return.annualized",

                              "SharpeRatio.annualized",

                              "CalmarRatio"),

                            metricsNames=c(

                              "Совокупный доход",

                              "Годовая прибыль",

                              "Годовой коэффициент Шарпа",

                              "Коэффициент Кальмара"))

kable(tab.perf, format = "simple")

 

                            SBER.DailyEqPL

--------------------------  ---------------

Совокупный доход                  0.0542655

Годовая прибыль                   0.0106504

Годовой коэффициент Шарпа         0.5330113

Коэффициент Кальмара              0.3015005

 

Таким образом, общая прибыль за период тестирования составила 5,43% от депозита, а средняя годовая прибыль - 1,06%.

 

Можно также посмотреть показатели рисков стратегии:

 

# Показатели рисков

tab.risk <- table.Arbitrary(rets,

                            metrics=c(

                              "StdDev.annualized",

                              "maxDrawdown",

                              "VaR",

                              "ES"),

                            metricsNames=c(

                              "Annualized StdDev",

                              "Max DrawDown",

                              "Value-at-Risk",

                              "Conditional VaR"))

kable(tab.risk, format = "simple")

 

                     SBER.DailyEqPL

------------------  ---------------

Annualized StdDev         0.0199816

Max DrawDown              0.0353246

Value-at-Risk            -0.0017052

Conditional VaR          -0.0018119

 

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

 

Вывод основной информации по счету в графическом виде:

 

# Информация по счету в графическом виде

a <- getAccount(account.st)

xyplot(a$summary, type = "h", col = 4)

 

 

Кривая эквити:

 

equity <- a$summary$End.Eq

plot(equity, main = "Equity Curve")

 

 

Распределение прибылей:

 

 


Комментариев нет:

Отправить комментарий