Domanda

Ho una piuttosto semplice domanda, ma purtroppo proprio non può arrivare a un risultato: Vorrei applicare la funzione GBSVolatility a ogni riga della mia data.frame.

Ho fatto il seguente:

> vol <- function(x) GBSVolatility(x$Price, "c", S = 1000, x$Strike, Time = 1/4, 
r = 0.01, b = 0.02, maxiter = 500)
> foo$iv <- apply(foo, 1, vol)

Ma questo non funziona. Qualcuno può dirmi perché?

Grazie mille

Dani

Aggiornamento: Grazie per il tuo suggerimento. Il mio frame di dati si chiama pippo e si presenta come questo

Date Price Strike Name
1.1  100   1200    X
1.1  120   1500    P
etc.

Vorrei fare una nuova colonna con la volatilità implicita. Ho cercato di applicare,

vol <- function(x) GBSVolatility(x["Price"], "c", S = 1000, x["Strike"], 
     Time = 1/4,  r = 0.01, b = 0.02, maxiter = 500)
foo$iv <- apply(foo, 1, vol)

, ma non ha funzionato pure.

Avete altri suggerimenti? Grazie

È stato utile?

Soluzione

domanda di frame di dati nel braccio converte numerico a carattere se uno o più colonna del frame di dati è il carattere. Così facile soluzione è quella di convertire nuovamente nel volume:

vol <- function(x) GBSVolatility(as.numeric(x["Price"]), "c", S = 1000,    
  as.numeric(x["Strike"]), Time = 1/4, r = 0.01, b = 0.02, maxiter = 500)
apply(foo, 1, vol)

Questo non è elegante. Non riesco a ricordare in questo momento il modo più elegante, probabilmente utilizzando d * ply o qualcosa del genere ...

Probabilmente questo è più elegante:

library(plyr)
vol <- function(x) GBSVolatility(x$Price, "c", S = 1000, x$Strike, 
  Time = 1/4, r = 0.01, b = 0.02, maxiter = 500)
foo$iv <- adply(foo, 1, vol)$V1

Altri suggerimenti

Non dovrebbe usare $ in quanto gli input forniti da applicare sono chiamati non vettori data.frames. Quindi questo dovrebbe funzionare:

vol <- function(x) GBSVolatility(x["Price"], "c", S = 1000, x["Strike"], 
         Time = 1/4,  r = 0.01, b = 0.02, maxiter = 500)
foo$iv <- apply(foo, 1, vol)

Questo è il meglio che posso fare. E 'un po' più "magica", ma anche credo che l'opzione più leggibile fino ad ora?

foo <- read.table(textConnection("Date Price Strike Name
1.1  100   1200    X
1.1  120   1500    P"),header=TRUE)

foo$iv <- with(d,mapply(GBSVolatility,
              Price,Strike,
              MoreArgs=list(TypeFlag="c",S=1000,
                Time=1/4,r=0.01,b=0.02,maxiter=500)))
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top