Python 3.x 如何更新Python类中的链接属性而不重复代码和不必要的计算?
我正在用Python实现一个简单的black-scholes(期权定价模型)。以下是我目前的代码:Python 3.x 如何更新Python类中的链接属性而不重复代码和不必要的计算?,python-3.x,oop,attributes,finance,Python 3.x,Oop,Attributes,Finance,我正在用Python实现一个简单的black-scholes(期权定价模型)。以下是我目前的代码: import math from scipy.stats import norm class Option: def __init__(self, spot, strike, tte, int_rate, b, vol): self.spot = spot self.strike = strike self.tte = tte
import math
from scipy.stats import norm
class Option:
def __init__(self, spot, strike, tte, int_rate, b, vol):
self.spot = spot
self.strike = strike
self.tte = tte
self.int_rate = int_rate
self.b = b
self.vol = vol
@property
def _d1(self):
return (math.log(self.spot / self.strike) + (self.b + self.vol ** 2 / 2.0) * self.tte) / (self.vol * math.sqrt(self.tte))
@property
def gamma(self):
return math.exp((self.b - self.int_rate) * self.tte) * norm.pdf(self._d1) / (self.spot * self.vol * math.sqrt(self.tte))
@property
def vega(self):
(self.spot * math.exp((self.b - self.r) * self.tte) * norm.pdf(self._d1) * math.sqrt(self.tte))
上述方法的问题是速度比需要的慢。例如,如果我访问vega,即使没有任何更改,它也需要重新计算整个树
当我在这个类的实例中更新一个属性时,我希望所有使用这个属性的属性也被更新。例如,当我更改spot
时,中间的d1
术语应该更新,以及gamma
等
另一种方法是一种名为set\u-spot
的方法,它可以更新下游的所有内容。然而,在这种情况下,我需要类似的方法,比如set\u strike
,这将是非常重复的
我最好的想法是用一种方法更新所有内容,如下所示:
def update_greeks(self):
d1 = (math.log(self.spot / self.strike) + (self.b + self.vol ** 2 / 2.0) * self.tte) / (
self.vol * math.sqrt(self.tte))
d2 = d1 - self.vol * math.sqrt(self.tte)
self.gamma = math.exp((self.b - self.int_rate) * self.tte) * norm.pdf(d1) / (
self.spot * self.vol * math.sqrt(self.tte))
self.vega = (self.spot * math.exp((self.b - self.r) * self.tte) * norm.pdf(d1) * math.sqrt(self.tte))
尽管我更喜欢模块化的方法(随着我添加更多功能,这种方法会变得更大)。是否有一种方法可以实现这两个目标(没有不必要的计算,没有重复的代码)