Предположим, я начинаю с данных случайного временного ряда, предположим, что это цена акции за 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, и я не уверен, как сравнить торговые стратегии на разных пороговых уровнях. Кто-нибудь может мне помочь?
Спасибо!