如何解决如何在Python类中更新链接属性而又无需重复代码和进行不必要的计算?
我正在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
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_spot
的方法可以替代下游的所有内容。但是,在这种情况下,我需要类似set_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))
尽管我更喜欢模块化的方法(随着我添加更多功能,该方法将变得更大)。我是否缺少一种同时实现两个目标的方法(没有不必要的计算,没有重复的代码)?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。