Функция внутри класса не работает при вызове (python)

#python #python-class

#питон #python-class

Вопрос:

Я создаю библиотеку моделирования, одна из которых использует геометрическое геометрическое броуновское движение (gbm). Я создал для него класс, в котором есть функция update для обновления значений переменных. Вот код для класса gbm:

 import numpy as np

from sn_random_numbers_gen import sn_random_numbers
from generic_simulation_class import simulation_class

class geometric_brownian_motion(simulation_class):
#class to generate simiulated paths usinig gbm
# attriibutes: name, mar_env, corr
#methods: update(to update parameters), generate_paths
    def __init__(self, name, mar_env, corr=False):
        super().__init__(name, mar_env, corr)

    def update(self, initial_value = None, volatility=None, final_date=None):
        if initial_value is not None:
            self.initial_value = initial_value
        if volatility is not None:
            self.volatility = volatility
        if final_date is not None:
            self.final_date = final_date


    def generate_paths(self, fixed_seed = False, day_count = 365):
        if self.time_grid is None:
            self.generate_time_grid()
        
        M = len(self.time_grid)
        J = self.paths
        paths = np.zeros((M,J))
        paths[0] = self.initial_value
        if not self.correlated:
            rand = sn_random_numbers((1,M,J), fixed_seed=fixed_seed)
        else:
            rand = self.random_numbers
        
        short_rate = self.discount_curve.short_rate
        for t in range(1, len(self.time_grid)):
            if not self.correlated:
                ran = rand[t]
            else:
                ran = np.dot(self.cholesky_matrix, rand[:, t, :])
                ran = ran[self.rn_set]
            dt = (self.time_grid[t]-self.time_grid[t-1]).days/day_count
            paths[t] = paths[t-1]*np.exp((short_rate-0.5*self.volatility**2)*dt   self.volatility*np.sqrt(dt)*ran)
        self.instrument_values = paths 
 

Вот пример использования класса (этот вариант использования также вызывает некоторые другие предопределенные мной классы) :

 import datetime as dt
from dx_frame import *

me_gbm = market_environment('me_gbm', dt.datetime(2020,1,1))

me_gbm.add_constant('initial_value', 36)
me_gbm.add_constant('volatility', 0.1)
me_gbm.add_constant('final_date', dt.datetime(2020,12,31))
me_gbm.add_constant('currency', 'EUR')
me_gbm.add_constant('frequency', 'M')
me_gbm.add_constant('paths', 10000)
csr = constant_short_rate('csr', 0.05)
me_gbm.add_curve('discount_curve', csr)
gbm = geometric_brownian_motion('gbm', me_gbm)
gbm.generate_time_grid()
paths_1 = gbm.get_instrument_values()

gbm.update(volatility=0.5)
paths_2 = gbm.get_instrument_values()
 

Здесь вызывается функция обновления для изменения значения переменной volatility. Но переменная остается прежней. Поскольку значение обоих путей paths_1 и paths_2 одинаково (я приложил изображения путей paths_1 и paths_2 для справки). Все остальные функции работают нормально. Не могли бы вы, пожалуйста, помочь мне понять проблему?
График путей_1 и путей_2

Комментарии:

1. Возможно, вам нужно вызвать generate_time_grid или generate_paths после обновления volatility , чтобы пересчитать значения инструмента?

2. Обнаружена ошибка в вызове get_instrument_value,

Ответ №1:

Функция обновления в порядке, проблема с get_instrument_values, поскольку пути не являются none, он не обновляется и возвращает тот же путь. Использование fixed_seed = False решает проблему