Esto es algo simple, pero no pude encontrar un revestimiento rápido (1,2,3) para resolverlo. Tengo un vector de media móvil de retornos de 10 días: la estrategia es simple: ir largo cuando la media móvil cruza la barrera cero desde abajo y vender cuando cruza la barrera desde arriba. Para ser más precisos, digamos que los retornos de la media móvil se almacenan en retornos vectoriales.

which(Returns > 0)
[1]    3    4    5    9   10   11   14   18   27   28   29   36   37   38   47   48

En base a esto, sería largo a veces 4,5,6 (a las 3 solo recibimos la señal de entrada y a las 6 salimos), 10,11,12,15,19 y así sucesivamente. ¿Cómo puedo obtener este vector? He experimentado con diff, otra que y varias otras combinaciones pero nada realmente resuelve el problema. Cualquier ayuda será apreciada.

Editar (basado en la primera respuesta):

Initiate_Long_Position  <- which(ifelse(goLong  == TRUE, 1,0) == 1) 
Terminate_Long_Position <- which(ifelse(goShort  == TRUE, 1,0) == 1) 

if (length(Terminate_Long_Position) > length(Initiate_Long_Position) ){
  Terminate_Long_Position <- Terminate_Long_Position[-1]
}

Days_Long_Returns <- rep(0, dim(ticker)[1])
Daily_returns <- returns(Cl(ticker))
for (i in 1:length(Initiate_Long_Position)){
  Days_Long_Returns[(Initiate_Long_Position[i]+1):(Terminate_Long_Position[i])] <-
  Daily_returns[(Initiate_Long_Position[i]+1):(Terminate_Long_Position[i])]
}

Agregué +1 a Initiate_Long_Position [i] en el bucle foor, ya que solo obtenemos el siguiente período de retorno después de que se observa la señal de largo, mientras que la venta se realiza en "tiempo real". ¿Me estoy perdiendo algo, es decir, los retornos están indexados correctamente para que no estemos mirando hacia el futuro de usar los retornos i-1 en el momento i?

0
user3612816 23 ene. 2018 a las 12:37

3 respuestas

La mejor respuesta

Necesitas el paquete zoológico y el paquete dplyr

library(zoo) # to compute rolling means
library(dplyr) # to compute lagged vectors

a <- c(-5:5, 5:-5) # create a sample vector

# rolling mean over the last 3 observations
myRollmeans <- rollmean(a, 3, fill = NA, align = "right")
goLong <- lag(myRollmeans) < 0 & myRollmeans >= 0
goShort <- lag(myRollmeans) > 0 & myRollmeans <= 0

data.frame(myRollmeans, goLong, goShort)

Resultados en

       myRollmeans goLong goShort
1           NA     NA      NA
2           NA     NA      NA
3    -4.000000  FALSE      NA
4    -3.000000  FALSE   FALSE
5    -2.000000  FALSE   FALSE
6    -1.000000  FALSE   FALSE
7     0.000000   TRUE   FALSE
8     1.000000  FALSE   FALSE
9     2.000000  FALSE   FALSE
10    3.000000  FALSE   FALSE
11    4.000000  FALSE   FALSE
12    4.666667  FALSE   FALSE
13    4.666667  FALSE   FALSE
14    4.000000  FALSE   FALSE
15    3.000000  FALSE   FALSE
16    2.000000  FALSE   FALSE
17    1.000000  FALSE   FALSE
18    0.000000  FALSE    TRUE
19   -1.000000  FALSE   FALSE
20   -2.000000  FALSE   FALSE
21   -3.000000  FALSE   FALSE
22   -4.000000  FALSE   FALSE
1
Georgery 23 ene. 2018 a las 10:17

Puede usar rle en el sign de Devoluciones para obtener una secuencia de devoluciones superiores a 0 o inferiores a 0. Después de eso, se trata de identificar cuándo ir largo o corto. Si es necesario eliminar la señal de entrada, puede usar diff el TIEMPO y eliminar más de 2.

set.seed(23L)
(Returns <- rnorm(50))

#generate sequence of positive and or negative returns
runs <- rle(sign(Returns))

#identify the time to go long or short
trades <- data.frame(
    TIME=seq_along(Returns),
    RETURN=Returns,
    DIRN=rep(runs$values, runs$lengths),
    RUNS=rep(runs$lengths, runs$lengths))
longs <- trades[trades$DIRN==1 & trades$RUNS >= 2,]
shorts <- trades[trades$DIRN==-1 & trades$RUNS >= 2,]

Referencia: Encuentra la secuencia consecutiva de ceros en R

0
chinsoon12 23 ene. 2018 a las 10:08

Traté de hacer un ejemplo de devoluciones ya que no estoy familiarizado con el comercio

Returns<-c(-1,-2,-1,1,2,4,1,-2,-3,-2,-1,1,2,4,5,3,2,-1)
LagReturns<-lag(Returns,1)
position=rep("0",length(Returns))
mask1=Returns*LagReturns<0&Returns<0
mask2=Returns*LagReturns<0&Returns>0
position[mask1]="sell"
position[mask2]="long"

En mi opinión, cuando no se cruza el cero, no toma posición ("0") cuando los retornos de lo negativo se vuelven positivos, toma la posición larga ("largo") y cuando de lo negativo negativo toma la posición vender ("vender")

0
Antonis 23 ene. 2018 a las 10:10
48398403