2015-05-21 16 views
9

Konstruuję strategię handlową i utknąłem w dwóch kluczowych obszarach. Kiedy używam Stoch i MACD w quantmod, próbuję stworzyć sygnał, gdy wolna stochastyczna przechodzi przez szybką stochastyczną (1), i na odwrót (-1), i płaska, gdy pomiędzy (0). MACD kod jest identyczny z wyjątkiem nazw kolumn MACD i Signal. Wreszcie, staram się połączyć te trzy sygnały do ​​tworzenia sygnału głównego, gdy wszystkie trzy sygnały są równe 1, -1, 0.Tworzenie sygnałów handlowych w 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 

Odpowiedz

4

Aktualizacja: Naprawiłem wszystkie nieprzyjemne pętle używające diff zamiast po this answer.

W ten sposób podchodzę do tego problemu. Obliczasz wszystkie pozycje, które mają pożądane relacje. Chcesz tylko pierwszej pozycji, która zaspokaja sygnał handlowy, aby zareagować na nią tak szybko, jak to możliwe.

chciałbym skonfigurować sygnał pasma Bollingera tak:

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 

Chciałbym utworzyć sygnał stochastyczny takiego:

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 

Po obliczyć różnicę, chcesz znaleźć pierwszy crossover, gdzie jeden jest wyższy od drugiego, więc powinieneś rozważyć następujące pozycje: i th i i-1. Również sygnał będzie silniejszy, jeśli jesteś w wykupieniu lub wyprzedania terytorium (0,8 lub 0,2).

Podobnie dla 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 

Teraz możemy je połączyć i obliczanie sygnału kombajnu:

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

Gdyby mnie, wolałbym mieć sumę sygnałów, ponieważ będzie to powiedzieć W jaki sposób zaufanie jest godne każdego sygnału. Jeśli masz 3, to jest stong, ale 1 lub 2 nie jest tak silny. Więc podążałbym za sumą jako połączony sygnał.

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

teraz all jest macierzą wszystkie sygnały i ostatnia kolumna jest połączona moc sygnału.

Zastanów się również, w jaki sposób może to nie dać dobrego sygnału. Używając podejścia do tego wykresu, Najsilniejsze sygnały, jakie otrzymuję, to -2, a mam tylko 5 okazji. Trochę dziwne, ponieważ wykres idzie prosto w górę, ale nie ma silnych zakupów.

> 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 

Te sygnały sprzedaży dają tylko krótki minus, a następnie rakiety są wyższe. Oczywiście wszystko zależy od zasobów itp

również uzyskać sytuacje tak:

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

Niektóre wskaźniki są szybciej lub wolniej niż inne. To byłby mój sposób podejścia, ale powinieneś przeprowadzić szeroko zakrojone testy i zdecydować, czy uważasz, że będą to transakcje podlegające zaskarżeniu, i czy wykonasz na nich dowolne pieniądze minus prowizja i czas wstrzymania.

+0

Co próbuję osiągnąć za pomocą MACD, a STOCH jest sygnałem, gdy linie przecinają się. (1) i wszystko inne (0). Zasadniczo stanowi potwierdzenie band z bollingerami. Punkt, w którym krzyżuje się linia, jest wszystkim, na czym mi zależy. Podstawą są prążki Bollingera, a MACD i STOCH potwierdzają i potwierdzają oryginalny sygnał. jakieś pomysły? – SJSU2013

+0

@ SJSU2013 powinno to rozwiązać twój problem. Punkt, w którym krzyżują się linie, będzie miał wartość 1 lub -1, gdy zastosujesz 'diff' do wektora logicznego, który otrzymasz z' z $ macd> z $ signal'. Podobnie dla stochastycznych. – pbible

1

Jak o tym

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

Wydaje się, że po prostu zwraca wartość i nie dodaje z powrotem do ramki danych. Ponadto wciąż próbuję ustawić pozycję -1, 0, 1 dla Stochastics i MACD – SJSU2013

+0

@ SJSU2013 Nie jestem całkiem jasny, czego chcesz. Czy mógłbyś podać dokładniejszy opis lub po prostu zrobić mały przykład i pokazać mi formę oczekiwanego wyniku? – nanoix9

+0

, więc celem jest powtórzenie tego wyniku dla Bolinger Bands (patrz snipet poniżej) dla Stochastics i macd – SJSU2013