Applicare GBSVolatility a ogni riga
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
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)))