Как элегантно отображать транзакции для разных пороговых значений с помощью Quantstrat? - PullRequest
0 голосов
/ 16 апреля 2020

Предположим, я начинаю с данных случайного временного ряда, предположим, что это цена акции за 1000 дней:

library(tseries)
library(blotter)
library(quantstrat)

vec <- rnorm(1000)
time <- seq(as.Date("2018-01-01", "%Y-%m-%d"), as.Date("2018-01-01", "%Y-%m-%d") + 1000, by = 1)
mu <- mean(vec) ## mean value
sigma <- sd(vec) ## standard deviation

Моя цель - сравнить несколько различных торговых стратегий на этих данных. Для произвольного коэффициента c я куплю 1000 акций, если текущая цена меньше, чем mu - c* сигма, и продам все из них, если текущая цена больше, чем mu + c* сигма. И я собираюсь сравнить торговые результаты по различным c.

Моя текущая стратегия состоит в том, чтобы создать фрейм данных, используя ve c несколько раз, к каждому фрейму данных также добавляется столбец c, чтобы я мог сравнить (цена - му) / c с + -сигмой, чтобы определить, продавать или покупать. Код ниже:

currency("USD")
strategy.st <- portfolio.st <- account.st <- "SpreadTrading"
rm.strat(strategy.st)

thresholds <- c(0.5, 0.75, 1, 1.25, 1.5)
symbols <- paste0("hedge_", thresholds, "*sigma")
for(c in thresholds){
  hedge_xts <- xts(data.frame(price = vec, coef = c), 
                   order.by = time)
  assign(paste0("hedge_", c, "*sigma"), hedge_xts)
}
#colnames(hedge_xts) <- "price"
stock(symbols, currency = "USD")
initPortf(portfolio.st, symbols)
initAcct(account.st, portfolios = portfolio.st, initEq = 1000)
initOrders(portfolio.st)
strategy(strategy.st, store = T)

fluctuation <- function(x, y){
  tmp <- (x - mu) / y
  colnames(tmp) <- "fluctuation"
  return(tmp)
}

add.indicator(strategy = strategy.st, name = "fluctuation",
              arguments=list(x=quote(mktdata$price), y=quote(mktdata$coef)), 
              label = "fluctuation")

add.signal(strategy.st, name = "sigThreshold", 
           arguments = list(column = "fluctuation",
                            relationship = "lt", threshold = -sigma),
           label = "buy")
add.signal(strategy.st, name = "sigThreshold", 
           arguments = list(column = "fluctuation",
                            relationship = "gt", threshold = sigma),
           label = "sell")
add.rule(strategy.st, name="ruleSignal",
         arguments = list(sigcol="buy", sigval=T, orderqty=1000,
                          ordertype="market", orderside="long",
                          pricemethod="market", replace=F),
         type = "enter")
add.rule(strategy.st, name="ruleSignal",
         arguments = list(sigcol="sell", sigval=T, orderqty="all",
                          ordertype="market", orderside="long",
                          pricemethod="market", replace=F),
         type = "exit")

out<-try(applyStrategy(strategy.st, 
                       portfolios=portfolio.st))
updatePortf(portfolio.st)
updateAcct(portfolio.st)
updateEndEq(account.st)

for(s in symbols){
  chart.Posn(Portfolio=portfolio.st,
               Symbol=s,log=TRUE)
}

tstats <- tradeStats(portfolio.st)
t(tstats)

rets <- PortfReturns(account.st)
rownames(rets) <- NULL
tab <- table.Arbitrary(rets,
                       metrics=c(
                         "Return.cumulative",
                         "Return.annualized",
                         "SharpeRatio.annualized",
                         "CalmarRatio"),
                       metricsNames=c(
                         "Cumulative Return",
                         "Annualized Return",
                         "Annualized Sharpe Ratio",
                         "Calmar Ratio"))
tab
charts.PerformanceSummary(rets, colorset = bluefocus)

На самом деле все, что мне нужно - это таблица из функции tradeStats () с именами столбцов, которые имеют разные пороговые значения. Я действительно считаю, что мое решение не является оптимальным, поскольку дублирование вектора цен очень неэффективно во времени и пространстве. Тем не менее, я новичок в пакете Quantstrat, и я не уверен, как сравнить торговые стратегии на разных пороговых уровнях. Кто-нибудь может мне помочь?

Спасибо!

...