0
votes

Meilleure pratique pour calculer le delta d'une option

Une option est un contrat dérivé basé sur la valeur de certaines garanties sous-jacentes (généralement un prix d'actions). Formellement, sous un modèle de tarification, le prix d'option est une fonction de S0 , le prix de sécurité sous-jacent actuel, un lot d'autres arguments (volatilité, taux d'intérêt, taux de dividendes, etc. .), et quelques autres kwargs .

Le delta d'une option est le taux de changement de son prix en ce qui concerne le prix de la sécurité sous-jacente. En pratique, cela est implémenté comme

(CALC_PRICE (S0 + DS, ** KWARGS) - CALC_PRICE (S0 - DS, ** KWARGS)) / (2 * DS)

Ce que je veux faire est d'implémenter get_delta comme méthode de la classe de la classe donc j'ai maintenant mis en place une tarification Modèle pour l'option comme: xxx

Le problème est qu'il existe vraiment un lot de args autres que S0 ( représenté comme lots_of_args , mais en fait, ils ne sont pas un seul arg, mais il y en a une douzaine d'entre eux), alors je déteste vraiment à les copier un par un dans le get_delta une fonction. J'ai besoin d'un moyen d'obtenir une dict des arguments qui sont transmis à __ init __ . La première pensée, bien sûr, est d'utiliser locaux () . Cependant, il y a quelques problèmes:

  1. Un auto arg est inclus.

  2. kwargs sont pas déballé.

  3. the doc sur locaux () conseille contre la modification du dict renvoyé par locaux () , donc je ne pense pas que ce soit une bonne idée de del le auto arg et update le kwargs non déballé .

    Quelqu'un peut-il aider? Merci.


2 commentaires

Vous pouvez appeler "copier" sur un dict pour obtenir une copie librement modifiable.


@Michaelbutscher il fonctionne. La copie de locaux () peut être traité comme n'importe quel dict ordinaire.


3 Réponses :


2
votes

Que diriez-vous de copier?

import copy

class Option:
    def __init__(self, s0, lots_of_args, **kwargs):
        self.s0 = s0

    def calc_price(self):
        price = ...
        return price

    def get_delta(self, ds=.05):
        cd = copy.copy(self)
        cd.s0 -= ds
        cu = copy.copy(self)
        cu.s0 += ds

        return (cu.calc_price() - cd.calc_price()) / (2 * ds)


0 commentaires

1
votes

Si vous avez juste pour copier ces "Beaucoup de Args", sans les changer, vous pouvez utiliser une approche similaire à NamedTuPle 'S ' 'S _replace Méthode: xxx

alors votre get_delta () méthode ressemblerait à ceci: xxx

s'il faut hériter directement d'un nomméTuple ou pour créer votre propre _replace mode méthode est à vous.


0 commentaires

0
votes

Pourquoi ne pas modifier la méthode Calc_Price pour inclure une DS? Get_delta simplifie ensuite appeler calc_price avec DS positif et négatif: xxx


2 commentaires

Merci, je pense que cela fonctionnera aussi. Mais puisque ds n'est pas lié à calc_price , il peut sembler étrange de l'inclure comme une ARG.


@Vim True, mais la plupart des autres suggestions sont encore plus obscures. Si vous modifiez CALC_PRICE n'est pas une possibilité que je recommande l'approche de la copie de l'impose, qui est toujours raisonnablement claire.