调用时类中的函数不起作用python

问题描述

我正在创建模拟库,其中一个使用几何几何布朗运动(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,corr=False):
        super().__init__(name,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',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()

这里调用更新函数来改变可变波动率的值。但是,变量保持不变。由于paths_1和paths_2的值相同(我附上了paths_1和paths_2的图像以供参考)。所有其他功能都可以正常工作。你能帮我理解这个问题吗?

Plot of paths_1 and paths_2

解决方法

更新函数没问题,问题出在 get_instrument_values 上,因为路径不是 none 它不会更新并返回相同的路径。 使用 fixed_seed = False 解决问题

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...