Ошибки при создании python классов для определения цены опциона - PullRequest
0 голосов
/ 02 апреля 2020

Я пытаюсь создать два класса для определения цены опциона. Первый класс фиксирует параметры опции, а второй генерирует путь. Мне нужно передать некоторые переменные (начальную точку базовой волатильности) из первого класса во второй. Однако в том, что я имею в виду в первом классе, что-то не так. Буду признателен за некоторые рекомендации.

Вот код (я использую 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)

Я делать что-то не так в третьей строке из верхней части класса mcPaths. Я не совсем уверен, каким будет правильный способ ссылки на первый класс.

Перед запуском кода я получаю следующее предупреждение pylint:

Нет значения для аргумента «X» в несвязанном вызове метода »для каждого из аргументов, определенных в классе OptParam.

Pylint выделяет optParam из строки под классом mcPaths, указывая, что это источник ошибки .

Когда я запускаю код следующим образом:

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

Первая строка работает нормально. Вторая строка, mySims=mcPaths(10,50), возвращает:

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'

- -------------- изменения кода, основанные на обсуждениях с Деленой

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 получили

1 Ответ

1 голос
/ 02 апреля 2020

Если я правильно вас понимаю, в приведенном ниже коде вы хотите использовать значения, которые вы использовали для создания myopt из функции __init__ mcPaths при создании 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)

Тогда вы сможете получить эти значения из opt_param_value из __init__:

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