Appliquer GBSVolatility à chaque ligne
Question
J'ai une question assez simple mais, malheureusement, ne peut pas arriver à un résultat: Je voudrais appliquer la fonction GBSVolatility à chaque ligne de mon data.frame.
je l'ai fait ce qui suit:
> 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)
Mais cela ne fonctionne pas. Quelqu'un peut-il me dire pourquoi?
Merci beaucoup
Dani
Mise à jour: Merci pour votre suggestion. Mon trame de données est appelée foo et ressemble à ceci
Date Price Strike Name
1.1 100 1200 X
1.1 120 1500 P
etc.
Je voudrais faire une nouvelle colonne avec la volatilité implicite. J'ai essayé d'appliquer,
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)
mais ça n'a pas marché aussi bien.
Avez-vous d'autres suggestions? Merci
La solution
demande de trame de données sur la ligne numérique convertit un personnage si une ou plusieurs colonnes de la trame de données est le caractère. Donc, solution facile est de convertir à nouveau en vol:
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)
Ce n'est pas élégant. Je ne me souviens pas tout à l'heure de la façon plus élégante, en utilisant probablement d * plis ou quelque chose ...
C'est probablement plus élégant:
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
Autres conseils
Vous ne devriez pas utiliser $
puisque les entrées données par application sont nommés vecteurs non data.frames. Donc, cela devrait fonctionner:
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)
Ceci est le meilleur que je peux faire. Il est un peu plus « magique », mais aussi je pense que l'option la plus lisible jusqu'à présent?
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)))