11 votos

Hay una técnica para usar xts o el zoológico de objetos con las opciones de datos (es decir, muchas entradas por fecha) en R?

Estoy empezando a trabajar con las opciones de datos de optionmetrics. Yo uso de los marcos de datos, pero parece que xts o el zoológico de objetos son el camino a seguir por las características y la velocidad. No puedo calcular el mejor trabajo para obtener 1 fila por fecha. Debo hacer una lista de xts objetos con un objeto por optionid?

Aquí está mi enfoque actual: estoy tratando de precio superior momentos mirando la devuelve a cubierto de las carteras de índice S&P 500 opciones, así que realmente necesita para el partido del próximo período el precio de la opción con este período de la fecha. Yo uso una trama de datos con las fechas como un Date de la clase y se desprenda de la fecha, optionid, y el precio de la opción (boa) columnas. Yo adaptará al ancho, con la optionid como los nombres de las columnas y cambiar la fecha de vuelta (aquí hago a diario, pero también puede ser cualquier período de tenencia). Entonces me derrita de vuelta a largo dataframe y mezcla de nuevo en la estructura de datos original. Voy a dar el código de abajo.

Si yo hago esto por tanto las llamadas y pone, entonces puedo combinar en la fecha de strike y vencimiento y forma de cubrirse las carteras. Este enfoque funciona bastante bien, pero no parece muy extensible y, probablemente, haciendo caso omiso de un montón de buenas herramientas en R. ahora mismo sólo estoy mirando las opciones de índice, pero tal vez más adelante voy a estar mirando a la sección transversal, por lo que la velocidad será muy útil.

¿Cómo ir sobre la forma de trabajar con las opciones de datos en R? Gracias!

Aquí está el código:

> head(call.l)
        date     exdate dte optionid strike close   Xms    boa    delta
1 1996-01-04 1996-03-16  72 10003226    600 617.7 -17.7 25.250 0.768930
2 1996-01-04 1996-02-17  44 10016457    570 617.7 -47.7 48.750 0.000000
3 1996-01-04 1996-06-22 170 10019107    595 617.7 -22.7 39.000 0.732626
4 1996-01-04 1997-06-21 534 10050656    700 617.7  82.3 15.750 0.294790
5 1996-01-04 1996-02-17  44 10060564    615 617.7  -2.7 11.000 0.599153
6 1996-01-04 1996-02-17  44 10091463    655 617.7  37.3  0.375 0.046054

temp.l <- call.l[, c("date", "optionid", "boa")]
temp.w <- dcast(temp.l, formula = "date ~ optionid", value_var = "boa")
temp.w <- temp.w[ order(temp.w[, "date"]), ]
temp.w.shift <- tail(temp.w, -1) 
temp.w.shift[, "date"] <- head(temp.w[, "date"], -1)
temp.l.shift <- melt(temp.w.shift, id.vars = "date", variable.name = "optionid", value.name = "boa.fut", na.rm = T)
call.l.new <- merge(call.l, temp.l.shift)

> head(subset(call.l.new, strike == 615))
          date optionid     exdate dte strike  close   Xms    boa    delta boa.fut
5   1996-01-04 10060564 1996-02-17  44    615 617.70 -2.70 11.000 0.599153 10.6250
43  1996-01-04 10372012 1996-03-16  72    615 617.70 -2.70 15.000 0.593709 14.6250
80  1996-01-04 10823593 1996-01-20  16    615 617.70 -2.70  7.750 0.597414  6.0000
144 1996-01-05 10060564 1996-02-17  43    615 616.71 -1.71 10.625 0.577407 12.2500
182 1996-01-05 10372012 1996-03-16  71    615 616.71 -1.71 14.625 0.578089 16.2500
219 1996-01-05 10823593 1996-01-20  15    615 616.71 -1.71  6.000 0.584558  7.0625

5voto

EndangeredMassa Puntos 9532

Por lo que vale, aquí es el enfoque que se utiliza. Sigo las fechas como un entero en AAAAMMDD forma y la combinación de las llamadas y los pone en un marco de datos both. Entonces yo uso ddply a operar en cada uno de los pareados de llamada y poner a encontrar el futuro SPX cerca y call/put oferta-oferta promedio boa.

library(plyr)
both <- merge(calls, puts[, c("date", "exdate", "strike", "boa", "delta", "vega")], by = c("date", "exdate", "strike"), suffixes = c(".calls", ".puts"), sort = T) 

Lo que da:

> head(both)
      date   exdate strike  close    Xms boa.calls delta.calls vega.calls
1 19960104 19960120    490 588.97 -98.97   100.375    0.965229   8.954686
2 19960104 19960120    495 588.97 -93.97    95.375    0.964108   9.199321
3 19960104 19960120    510 588.97 -78.97    80.375    0.960100  10.064710
4 19960104 19960120    515 588.97 -73.97    75.375    0.958478  10.407010
5 19960104 19960120    525 588.97 -63.97    65.500    0.949837  12.130740
6 19960104 19960120    530 588.97 -58.97    60.625    0.942449  13.559780
  boa.puts delta.puts vega.puts
1  0.03125  -0.002597  0.960498
2  0.03125  -0.002725  1.003923
3  0.09375  -0.007769  2.548534
4  0.12500  -0.010310  3.279840
5  0.28125  -0.021612  6.162532
6  0.28125  -0.023069  6.512128

both <- transform(both, date.ym = date %/% 100, exdate.ym = exdate %/% 100, exdate.d = exdate %% 100)
both <- ddply(both, .variables = c("exdate", "strike"), .fun = my.shift, direc = "fut", value.col = c("close", "boa.calls", "boa.puts"), .parallel = in.parallel)

Lo que da:

> head(both)
      date   exdate strike    close      Xms boa.calls delta.calls vega.calls
1 19960109 19960120    565 582.7998 -17.7998  18.50000    0.953215   9.323605
2 19960109 19960120    575 582.7998  -7.7998   9.06250    0.834628  23.915020
3 19960109 19960120    580 582.7998  -2.7998   6.06250    0.626327  36.502140
4 19960109 19960120    585 582.7998   2.2002   3.81250    0.445721  38.105320
5 19960109 19960120    590 582.7998   7.2002   2.06250    0.287108  32.854870
6 19960109 19960120    595 582.7998  12.2002   1.03125    0.166120  24.049020
  boa.puts delta.puts vega.puts date.ym exdate.ym exdate.d close.fut
1   3.1875  -0.220331  28.53901  199601    199601       20    581.99
2   5.1875  -0.345956  35.53591  199601    199601       20    581.99
3   7.0000  -0.432961  37.89640  199601    199601       20    581.99
4   9.6250  -0.525538  38.34777  199601    199601       20    581.99
5  12.8750  -0.610547  36.90346  199601    199601       20    581.99
6  17.1250  -0.671490  34.82305  199601    199601       20    581.99
  boa.calls.fut boa.puts.fut
1      17.62500      0.34375
2       8.06250      1.12500
3       4.43750      2.40625
4       1.84375      4.93750
5       0.71875      8.93750
6       0.28125     13.37500

Donde la my.shift de la función es:

my.shift <- function(x, date.col = "date", value.col = NULL, steps = 1, direc = NULL) {

    if (direc == "fut") {
        x.shift <- tail(x[, c(date.col, value.col)], -1 * steps) 
        x.shift[, date.col] <- head(x[, date.col], -1 * steps)
    } else {
        x.shift <- head(x[, c(date.col, value.col)], -1 * steps) 
        x.shift[, date.col] <- tail(x[, date.col], -1 * steps)
    }

    x <- merge(x, x.shift, by = date.col, suffixes = c("", paste("", direc, sep = ".", collapse = "")))
    return(x)
}    

HTH (yo uso el de .ym y .d columnas más tarde para recoger el derecho fecha de vencimiento).

4voto

ICR Puntos 6960

No he visto un marco de opciones específicamente, sin embargo... La forma en que lo he hecho en el pasado es esencialmente la instalación de un unicc(xts o zoológico) para cada opción(subyacente,el tipo,la huelga de expiración). Obviamente hacerlo a través de código es importante porque es intensamente propenso a error.

Podemos utilizar una generación en la función y aquellos en el área de trabajo. Es aún más difícil y brittel a hacer más pruebas que abarcan varios vencimientos.

Finalmente nos dio en R y matlab en favor de un enfoque de programación funcional. De esta manera evaluamos el código examina un mapa de la estructura, en lugar de una matriz.

Claramente esto es más lento, pero realmente simplifica la programación, y es fácilmente parallized. Se realiza razonablemente bien en un feed de datos en vivo. Probablemente no es manejable para HFT ( calc en ms, no microsegundos).

Finanhelp.com

FinanHelp es una comunidad para personas con conocimientos de economía y finanzas, o quiere aprender. Puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X