Открытие коротких позиций в пакете SIT имеет особенность: для тестирования
торговых стратегий необходимо пользоваться функцией bt.run.share(data, clean.signal = T),
или вместо весов позиций пользоваться количеством акций.

Почему нельзя пользоваться bt.run(data) проиллюстрируем на следующем примере:

library(SIT)
library(quantmod)
data <- new.env()
data$quote <- xts(c(100, 90, 81, 90, 100), order.by = Sys.Date() + 0:4)
colnames(data$quote) <- "Close"
bt.prep(data)
ls(data)
## [1] "dates"           "execution.price" "prices"          "quote"          
## [5] "symbolnames"     "weight"

Далее, посмотрим как будет меняться стоимость позиции, если мы попробуем
оценить стоимость короткой позиции “обычным” способом, т.е. с помощью
bt.run(data)

data$weight[] <- -1
shortStrategyWrong <- bt.run(data, silent = T)
shortStrategyWrong$equity
##                quote
## 2015-02-27 1.0000000
## 2015-02-28 1.1000000
## 2015-03-01 1.2100000
## 2015-03-02 1.0755556
## 2015-03-03 0.9560494

Как мы видим, произошла странная вещь: мы начали со стоимости бумаги 1, закончили также
на стоимости 1, а стоимость портфеля на конечный день составляет 0.96.

Посмотрим внимательнее на первые три строки в стоимости торгуемой бумаги и
соответствующую стоимость нашей позиции, вычисленной с помощью bt.run(data)

data$quote[1:3,]
##            Close
## 2015-02-27   100
## 2015-02-28    90
## 2015-03-01    81
shortStrategyWrong$equity[1:3]
##            quote
## 2015-02-27  1.00
## 2015-02-28  1.10
## 2015-03-01  1.21

Как мы видим, 19% прироста на короткой позиции превратились в 21%: 10% в первый день,
реинвестиция, и 10% во второй день, что неправильно при подсчете прибыли с короткой
позиции.

Для правильного подсчета прибыли с короткой позиции необходимо отбросить элемент
реинвестирования. Сделать это можно двумя способами:

  • При помощи bt.run(data, type="share"), где веса соответствуют количеству акций
  • При помощи bt.run.share(data, clean.signal = T)

Пример 1.

data$weight[] <- -1
capital <- 100000     # по умолчанию, капитал равняется 100'000
data$weight[] <- (capital/data$prices)*bt.exrem(data$weight)
shortStrategyRight <- bt.run(data, type="share", silent = T)
shortStrategyRight$equity
##            quote
## 2015-02-27  1.00
## 2015-02-28  1.10
## 2015-03-01  1.19
## 2015-03-02  1.10
## 2015-03-03  1.00

Пример 2.

data$weight[] <- -1
shortStrategyRight2 <- bt.run.share(data, clean.signal = T, silent = T)
shortStrategyRight2$equity
##            quote
## 2015-02-27  1.00
## 2015-02-28  1.10
## 2015-03-01  1.19
## 2015-03-02  1.10
## 2015-03-03  1.00

Пример 3.

data$weight[] <- 1
longStrategy <- bt.run.share(data, clean.signal = T, silent = T)
longStrategy$equity
##            quote
## 2015-02-27  1.00
## 2015-02-28  0.90
## 2015-03-01  0.81
## 2015-03-02  0.90
## 2015-03-03  1.00
© 2014 In R we trust.
Top
Follow us: