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

Était-ce utile?

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)))
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top