为期权定价创建 python 类 时出错

Errors while creating python classes for option pricing

我正在尝试创建两个 classes 来为选项定价。第一个 class 捕获选项的参数,第二个生成路径。我需要将一些变量(基础波动率的起点)从第一个 class 传递到第二个。然而,我提到第一个 class 的方式有些不对劲。我将不胜感激。

这是代码(我正在使用 VSCode (1.43.2) 和 Python(3.7.3)):

class bsEuroParam(object):
  # model parameters of a European option
  # pc = put/call
  #type = vanila, lookback, asian
    def __init__(self,pc,type,So,K,T,Vol,r):
       self.pc = pc
       self.type = type
       self.So = So
       self.K = K
       self.T = T
       self.Vol = Vol
       self.r = r

class mcPaths(OptParam):
    def __init__(self,numPaths=None,numSteps=None):        
      ***OptParam.__init__(self)***
      self.numPaths = numPaths
      self.numSteps = numSteps      

    def paths(self):
      dt=self.So/self.numSteps
      S=np.zeros((self.numSteps,self.numPaths+1))      
      S[0]=self.So

      for t in range(1,self.numSteps+1):
        S[t]=S[t-1]*np.exp((self.r - 0.5 * self.Vol **2) * dt + self.Vol * math.sqrt(dt)*npr.standard_normal(self.numPaths+1))
      self.results = np.array(S)

我在 class mcPaths 顶部的第三行做错了。我不太确定引用第一个 class 的正确方法是什么。

在 运行 代码之前,我收到以下 pylint 警告:

No value for argument "X" in unbound method call" for each of the arguments defined in class OptParam.

Pylint 突出显示 mcPaths class 下方行中的 optParam,表明这是错误的来源。

当我运行代码如下:

myopt = OptParam('c','eur',100,100,1,0.75,0.02)
mySims = mcPaths(10,50)

第一行运行没问题。第二行,mySims=mcPaths(10,50),returns:

TypeError                                 Traceback (most recent call last)
filepath\pytest12.py in 
----> 9 mySims = mcPaths(10,50)

filepath\pytest12.py in __init__(self, numPaths, numSteps)
         30 class mcPaths(OptParam):
         31     def __init__(self,numPaths=None,numSteps=None):
    ---> 32       OptParam.__init__(self)
         33       self.numPaths = numPaths
         34       self.numSteps = numSteps

    TypeError: __init__() missing 7 required positional arguments: 'pc', 'type', 'So', 'K', 'T', 'Vol', and 'r'

----------------根据与 Delena 的讨论进行的代码编辑

Class OptParam(object):
  # model parameters of a European option
  # pc = put/call
  #type = vanila, lookback, asian
    def __init__(self,pc,type,So,K,T,Vol,r):
       self.pc = pc
       self.type = type
       self.So = So
       self.K = K
       self.T = T
       self.Vol = Vol
       self.r = r


#myopt=bsEuroParam('c','eur',100,100,1,0.75,0.02)


class mcPaths(OptParam):    
    def __init__(self,numPaths=None,numSteps=None,optPrm_val=None):              
      #OptParam.__init__(self)
      self.numPaths = numPaths
      self.numSteps = numSteps      
      self.So = optPrm_val.So
      self.Vol = optPrm_val.Vol
      self.r = optPrm_val.r

    def paths(self):
      dt=self.So/self.numSteps
      S=np.zeros((self.numSteps,self.numPaths+1))      
      S[0]=self.So

      for t in range(1,self.numSteps+1):
        S[t]=S[t-1]*np.exp((self.r - 0.5 * self.Vol **2) * dt + self.Vol * math.sqrt(dt)*npr.standard_normal(self.numPaths+1))
      self.results = np.array(S)

致电:

myopt=OptParam('c','eur',100,100,1,0.75,0.02)
mysim = mcPaths(10,50,myopt)

错误: 11 mysim = mcPaths(10,50,myopt) init() 接受 1 到 3 个位置参数,但给出了 4 个

如果我对你的理解正确,在下面的代码中,你希望能够从 mcPaths__init__ 函数中获取你用来创建 myopt 的值,当你创建 mySims:

myopt = OptParam('c','eur',100,100,1,0.75,0.02)
mySims = mcPaths(10,50)

您可以将参数添加到 __init__ 函数 mcPaths 以获取您希望能够访问的 OptParam

class mcPaths(OptParam):
    def __init__(self, numPaths=None, numSteps=None, opt_param_value=None):

当您创建 mySims 时,您可以将 myopt 作为参数传递给 mcPaths:

mySims = mcPaths(10, 50, myopt)

然后您将能够从 __init__:

中的 opt_param_value 中获取这些值
class mcPaths(OptParam):
    def __init__(self, numPaths=None, numSteps=None, opt_param_value=None):
        self.r = opt_param_value.r