2015-05-21 22 views
9

Sto costruendo una strategia di trading e sono bloccato in due aree chiave. Quando si utilizza Stoch e MACD in quantmod, sto cercando di creare un segnale quando lo stocastico lento attraversa lo stocastico veloce (1) e il visa-versa (-1), e piatto quando nel mezzo (0). MACD il codice è identico tranne che con i nomi delle colonne MACD e Signal. Infine, sto cercando di unire i tre segnali per creare un segnale di maestro quando tutti e tre i segnali uguali 1, -1, 0.Creazione di segnali di trading in R

library(quantmod) 

#################### 
## BOLINGER BANDS ## 
#################### 

getSymbols("SPY", src="yahoo", from="2013-01-01", to="2015-05-01") 
x <- na.omit(merge(SPY, BBands(Cl(SPY)))) 

x$sig <- NA 

# Flat where Close crossed the mavg 
x$sig[c(FALSE, diff(sign(Cl(x) - x$mavg), na.pad=FALSE) != 0)] <- 0 
x$sig[Cl(x) > x$up] <- -1 # short when Close is above up 
x$sig[Cl(x) < x$dn] <- 1 # long when Close is below dn 
x$sig[1] <- 0 # flat on the first day 
x$sig[nrow(x)] <- 0 # flat on the last day 

# Fill in the signal for other times 
x$sig <- na.locf(x$sig) # wherever sig is NA, copy previous value to next row 

# Now Lag your signal to reflect that you can't trade on the same bar that 
# your signal fires 
x$sig <- Lag(x$sig) 
x$sig[1] <- 0 # replace NA with zero position on first row 

#################### 
### STOCHASTICS #### 
#################### 

y <- na.omit(merge(SPY, stoch(Cl(SPY)))) 

y$sig <- NA 

# Flat where between crosses. Not sure how to write 
#y$sig[c(FALSE, diff(sign(y$slowD == y$fastD), na.pad=FALSE !=0)] <- 0 
y$sig[y$fastD > y$slowD] <- -1 # short when Close is above up 
y$sig[y$fastD < y$slowD] <- 1 # long when Close is below dn 
y$sig[1] <- 0 # flat on the first day 
y$sig[nrow(x)] <- 0 # flat on the last day 

# Fill in the signal for other times 
y$sig <- na.locf(y$sig) # wherever sig is NA, copy previous value to next row 

# Now Lag your signal to reflect that you can't trade on the same bar that 
# your signal fires 
y$sig <- Lag(y$sig) 
y$sig[1] <- 0 

#################### 
###### MACD ######## 
#################### 

z <- na.omit(merge(SPY, MACD(Cl(SPY)))) 

z$sig <- NA 

# Flat where between crosses. Not sure how to write 
z$sig[c(FALSE, diff(sign(z$signal == z$macd), na.pad=FALSE) != 1)] <- 1 
z$sig[z$signal > z$macd] <- -1 # short when Close is above up 
z$sig[z$signal < z$macd] <- 1 # long when Close is below dn 
z$sig[1] <- 0 # flat on the first day 
z$sig[nrow(z)] <- 0 # flat on the last day 

# Fill in the signal for other times 
z$sig <- na.locf(z$sig) # wherever sig is NA, copy previous value to next row 

# Now Lag your signal to reflect that you can't trade on the same bar that 
# your signal fires 
z$sig <- Lag(z$sig) 
z$sig[1] <- 0 

# Merge xyz by date and create new signal when all three conditions are met 

risposta

4

Aggiornamento: ho risolto tutti i cattivi cicli utilizzando diff invece dopo this answer.

Questo è il modo in cui vorrei affrontare questo problema. Stai calcolando tutte le posizioni che hanno le relazioni desiderate. Vuoi solo la prima posizione che soddisfi il segnale di trading per agire al più presto possibile.

vorrei impostare il segnale di banda di Bollinger in questo modo:

price.over.up <- Cl(x) > x$up 
price.under.dn <- Cl(x) < x$dn 

x$sig <- rep(0,nrow(x)) 
#sell which price breaks top band 
x$sig[which(diff(price.over.up)==1] <- -1 
#buy when price breaks bottom band 
x$sig[which(diff(price.under.dn)==1)] <- 1 

x$sig <- Lag(x$sig) 
x$sig[1] <- 0 

vorrei creare il segnale stocastico in questo modo:

fast.over.slow <- y$fastD > y$slowD 
y$sig <- rep(0,nrow(y)) 
y$sig[which(diff(fast.over.slow) == 1 & y$slowD < 0.2)] <- 1 
y$sig[which(diff(fast.over.slow) == -1 & y$slowD > 0.8)] <- -1 
y$sig <- Lag(y$sig) 
y$sig[1] <- 0 

Una volta che si calcola la differenza, si desidera trovare la prima crossover dove uno è più alto dell'altro quindi è necessario considerare le posizioni i e i-1 th. Inoltre, il segnale sarà più forte se ci si trova in territorio ipercomprato o ipervenduto (0.8 o 0.2).

Allo stesso modo per il MACD:

mac.over.signal <- z$macd > z$signal 
z$sig <- rep(0,nrow(z)) 
z$sig[diff(mac.over.signal) == 1] <- 1 
z$sig[diff(mac.over.signal) == -1] <- -1 
z$sig <- Lag(z$sig) 
z$sig[1] <- 0 

Ora li si fondono e calcolare il segnale di combinare:

all <- merge(x$sig,y$sig,z$sig) 
all[is.na(all)] <- 0 

Se si trattasse di me, avrei preferito una somma dei segnali perché vi dirà tu come la fiducia sia degna di ogni segnale. Se hai un 3, è forte ma un 1 o 2 non è così forte. Quindi andrei con la somma come segnale combinato.

all <- cbind(all,rowSums(all)) 

Ora all è una matrice con tutti i segnali e l'ultima colonna è la potenza del segnale combinato.

Pensa anche a come questo potrebbe non darti un buon segnale. Usando l'approccio per questo grafico, i segnali più forti che ottengo sono -2, e ottengo solo 5 occasioni. È un po 'strano dato che il grafico va dritto, ma non ci sono forti acquisti.

> all[which(all[,4] == -2),] 
      sig sig.1 sig.2 ..2 
2013-04-16 0 -1 -1 -2 
2013-08-07 0 -1 -1 -2 
2013-11-08 0 -1 -1 -2 
2014-04-07 0 -1 -1 -2 
2014-06-24 0 -1 -1 -2 

Questi segnali di vendita danno solo uno svantaggio basso e quindi il grafico razzi più in alto. Naturalmente tutto dipende dal magazzino ecc

Vedrete anche situazioni come questa:

2014-07-07 -1  0  1 0 
2014-07-08 0 -1  0 -1 
2014-07-09 0  0 -1 -1 

Alcuni indicatori sono veloce o più lento rispetto ad altri. Questo sarebbe il mio approccio, ma dovresti fare test di ampio respiro e determinare se ritieni che si tratti di scambi azionabili e se dovessi fare soldi agendo su di essi meno la commissione e mantieni la durata.

+0

Quello che sto cercando di ottenere con MACD e STOCH è un segnale quando le linee si incrociano. (1) e tutto il resto (0). Agisce essenzialmente una conferma delle bande di Bollinger. Il punto in cui la linea incrociata è tutto ciò che mi interessa. le basi di Bollinger sono la base, con MACD e STOCH che forniscono conferma e affermazione del segnale originale. qualche idea? – SJSU2013

+0

@ SJSU2013 questo dovrebbe risolvere il tuo problema allora. Il punto in cui le linee si incrociano sarà 1 o -1 quando si applica 'diff' al vettore booleano che si ottiene da' z $ macd> z $ signal'. Allo stesso modo per lo stocastico. – pbible

1

ne dite di questo

master.signal <- rep(NA, nrow(x)) # init to all NA's or whatever you like 
master.signal[x$sig == 1 & y$sig == 1 & z$sig == 1] <- 1 
master.signal[x$sig == -1 & y$sig == -1 & z$sig == -1] <- -1 
master.signal[x$sig == 0 & y$sig == 0 & z$sig == 0] <- 0 
+0

Questo sembra solo restituire un valore e non ritorna al frame dei dati. Inoltre, sto ancora provando a impostare un -1, 0, 1 posizione per Stochastics e MACD – SJSU2013

+0

@ SJSU2013 Non sono abbastanza chiaro cosa vuoi. Potresti fornire una descrizione più dettagliata o solo fare un piccolo esempio e mostrarmi la forma del risultato atteso? – nanoix9

+0

quindi l'obiettivo è di riattivare questa uscita per Bolinger Bands (vedi snipet sotto) per Stochastics, e macd – SJSU2013