Ich schreibe meine MSc-Abschlussarbeit und bin dabei, eine Handelsstrategie mit dem quantity-Paket zu entwickeln. Was ich tun möchte, ist, den SPY zu handeln, indem ich auf die Signale schaue, die von einem auf dem VIX aufbauenden MACD erzeugt werden.QUANTSTRAT - Wie erstellt man eine Strategie für ein bestimmtes Asset und verwendet es für ein anderes?
Ich bin schwer mit der Entwicklung der Strategie auf dem VIX und dann verwenden Sie es auf dem SPY. Ich möchte den VIX nehmen und einen MACD berechnen. Wenn der MACD des VIX die Signallinie nach unten kreuzt, möchte ich, dass der Algo den SPY kauft. Wenn der MACD des VIX die Signallinie nach oben kreuzt, möchte ich, dass der Algo die vorherige Position schließt.
Dies ist der Code, den ich, bis jetzt wrot:
# MACD strategy on VIX and SPY (SPDR S&P500 FUND)
#
# I will use MACD as trend indicator.
#
# This is the main idea.
#
# I want to make prediction on SPY's returns. Due to the EMH, returns are not predictable.
# Otherwise, the volatility clustering effect allows us to forecast volatility.
# The VIX is the S&P500's implied volatility index. I can make previsions about it and use them
# to forecast the SPY returns. This is because S&P500 and VIX have a strong negative correlation.
#
# This strategy consists of buying/selling the SPY when the VIX's MACD generates sell/buy signal
#
# Author: Matteo Cavaggioni, 2016
######################################################################################################################
require(quantstrat)
ttz <- Sys.getenv('TZ')
Sys.setenv(TZ = 'UTC')
#startDate <- '2000-01-01'
initDate <- '2004-01-02'
endDate <- '2015-12-31'
initEq <- 1e6
fastMA <- 12
slowMA <- 26
signalMA <- 9
maType <- "EMA"
symb1 <- '^VIX'
symb2 <- 'SPY'
portfolio1.st <- "vmacd"
portfolio2.st <- "smacd"
account.st <- "vsmacd"
getSymbols(c(symb1, symb2), from = initDate, to = endDate, adjust = TRUE, index.class = c("POSIXt", "POSIXct"))
symb1 <- 'VIX'
currency("USD")
stock(symb1, currency = "USD", multiplier = 1)
stock(symb2, currency = "USD", multiplier = 1)
volStrat <- 'volStrat'
rm.strat(volStrat)
initPortf(name = portfolio1.st, symbols = symb1, initDate = initDate) # portafoglio contenente il VIX
initPortf(name = portfolio2.st, symbols = symb2, initDate = initDate) # portafoglio contenente lo SPY
initAcct(name = account.st, portfolios = c(portfolio1.st, portfolio2.st), initEq = initEq, initDate = initDate)
initOrders(portfolio = portfolio2.st, initDate = initDate)
volStrat <- strategy('volStrat', store = TRUE, assets = symb1)
volStrat <- add.indicator(strategy = volStrat, name = "MACD",
arguments = list(x = quote(Ad(mktdata)),
nFast = fastMA,
nSlow = slowMA,
nSig = signalMA,
maType = maType),
label = 'macd.out')
#####
volStrat <- add.signal(strategy = volStrat, name = "sigCrossover",
arguments = list(columns = c("macd.macd.out", "signal.macd.out"),
relationship = "gt"),
label = "macd.gt.signal")
volStrat <- add.signal(strategy = volStrat, name = "sigCrossover",
arguments = list(columns = c("macd.macd.out", "signal.macd.out"),
relationship = "lt"),
label = "macd.lt.signal")
# go long when macd < signal
volStrat <- add.rule(strategy = volStrat, name = "ruleSignal",
arguments = list(sigcol = "macd.lt.signal", sigval = TRUE,
orderqty = 1000,
ordertype = "market",
orderside = "long"),
type = "enter")
# exit long when macd > signal
volStrat <- add.rule(strategy = volStrat, name = "ruleSignal",
arguments = list(sigcol = "macd.gt.signal", sigval = TRUE,
orderqty = "all",
ordertype = "market",
orderside = "long"),
type = "exit")
#####
start_t <- Sys.time()
out <- applyStrategy(strategy = volStrat, portfolios = portfolio2.st,
parameters = list(nFast = fastMA, nSlow = slowMA, nSig = signalMA, maType = maType), verbose = T)
end_t <- Sys.time()
print(end_t - start_t)
start_t<-Sys.time()
updatePortf(Portfolio='smacd',Dates=paste('::',as.Date(Sys.time()),sep=''))
updateAcct(account.st)
updateEndEq(account.st)
end_t<-Sys.time()
print(end_t-start_t)
book = getOrderBook('smacd')
stats = tradeStats('smacd')
ptstats = perTradeStats('smacd')
rets = PortfReturns(account.st)
txns = getTxns('smacd', symb2)
chart.Posn(Portfolio = 'smacd',Symbol = symb2)
plot(add_MACD(fast = fastMA, slow = slowMA, signal = signalMA, maType = "EMA"))
# COMPARING STRATEGY WITH SPY
instRets <- PortfReturns(account.st)
portfRets <- xts(rowMeans(instRets) * ncol(instRets), order.by = index(instRets))
portfRets <- portfRets[!is.na(portfRets)]
cumPortfRets <- cumprod(1 + portfRets)
firstNonZeroDay <- as.character(index(portfRets)[min(which(portfRets != 0))])
getSymbols("SPY", from = firstNonZeroDay, to = endDate)
SPYrets <- diff(log(Cl(SPY)))[-1]
cumSPYrets <- cumprod(1 + SPYrets)
comparison <- cbind(cumPortfRets, cumSPYrets)
colnames(comparison) <- c("strategy", "SPY")
chart.TimeSeries(comparison, legend.loc = "topleft", colors = c("green", "red"))
#
Sys.setenv(TZ=ttz)
mir jemand in herauszufinden, helfen kann, was daran falsch ist?
Vielen Dank.
Hallo Alex! Danke für Ihre Antwort und Vorschläge! Die Papiere scheinen sehr interessant und ich werde versuchen, die Strategie ohne quanstrat zu entwickeln. Über die Zufälligkeit ... Ich stimme Ihnen völlig zu, aber ich habe einige interessante Muster gefunden, die die Möglichkeit, mit VIX's MACD auf SPY zu profitieren, unterstreichen. Ich möchte mit einer sehr oberflächlichen Analyse beginnen und dann tiefer und tiefer gehen, wenn die Ergebnisse besser werden! Über quantstrat: Wissen Sie, ob ich das tun kann, was ich erklärt habe (Aufbau der Strategie auf dem VIX und dann auf den SPY anwenden)? Vielen Dank – matcava
Ich bin mir sicher, dass es möglich ist, aber ich habe das Paket nicht ausreichend genutzt, um Ihre Frage beantworten zu können. Außerdem ist Ihr Code sehr lang und komplex und wie ich bereits erwähnt habe, ist dieser Platz ideal, um sehr spezifische Fragen zu 2-3 Zeilen Code zu stellen, aber nicht um einen ganzen Algo zu "reparieren", der nicht funktioniert. Wenn Sie dies nur als Experiment versuchen möchten, sollten Sie etwas einfaches tun, wie ich oben erklärt habe. –
Gut! Danke nochmal Alex, du warst super nett! viel Glück mit Ihrer These – matcava