Открытие коротких позиций в пакете 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