2016-04-05 18 views
0

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.

Antwort

0

Das ist lustig, ich habe aus Neugier auf Ihre Frage zufällig geklickt. Momentan forsche ich intensiv an den VIX-Indizes.

Ausnutzen der negativen Korrelation mit MACD ... es könnte funktionieren, aber technische Analyse ist nutzlos auf zufällige Reihen. Wenn Sie zufällige Tests am VIX durchführen, wird die Hypothese nicht abgelehnt.

zusätzlich hat VIX zufällige Intraday-Spikes, die sich nicht in den Schlusskursen widerspiegeln (wie von getSybmols geliefert - keine zuverlässige Quelle für die Forschung). In einem realen Szenario würden Sie angehalten oder Ihr Kursziel erreichen, bevor Ihr Datensatz es tatsächlich darstellt. Sie können dies vermeiden, indem Sie höhere Frequenzen verwenden, was hier sehr empfohlen wird.

Hier sind zwei Papiere, die Sie lesen sollten:

Der VIX Futures Basis: Evidence and Trading Strategies - David P.Simon (2013)

Die obige Strategie ist die gleiche wie die Ausbeute Strategie in dieser nächstes Papier: Einfache Volatilität Investieren - Tony Cooper (2013)

Das letzte Papier kommt mit 4 anderen Strategien neben der Ausbeute eins.

In Bezug auf den Code, da Sie fast keine Beiträge haben, ist es erwähnenswert, dass es höchst unwahrscheinlich jemand wird Ihren gesamten Code überprüfen. es sei denn, du bezahlst sie wahrscheinlich und würdest du einem Fremden mit deinen Berechnungen trauen?

Zorro ist eine einfache Möglichkeit, Strategien wie diese zu implementieren und integriert sich in R. check it out.

You're using a very complex package for something very simple. I haven't looked at yoru code but if I were you i would try something like this: 
     1. calculate MACD for VIX 
     2. Create a trade signal - Make new column by SPY with 1s for periods where VIX MACD >0 and zeros for VIX MACD <0 
     3. Simply add up SPY returns for rows that contain either 0s or 1s in the $MACD column/multiply by -1 if you want to go short.. 


P.S. use the xts package - helps u keep track of dates and not missmatch data 

Viel Glück, ich mache auch meine Diplom-ATM, nicht in diesem tho.

+0

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

+0

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. –

+0

Gut! Danke nochmal Alex, du warst super nett! viel Glück mit Ihrer These – matcava