def updateRiskyDstn(self): """ Creates the attributes RiskyDstn from the primitive attributes RiskyAvg, RiskyStd, and RiskyCount, approximating the (perceived) distribution of returns in each period of the cycle. Parameters ---------- None Returns ------- None """ # Determine whether this instance has time-varying risk perceptions if ( (type(self.RiskyAvg) is list) and (type(self.RiskyStd) is list) and (len(self.RiskyAvg) == len(self.RiskyStd)) and (len(self.RiskyAvg) == self.T_cycle) ): self.addToTimeVary("RiskyAvg", "RiskyStd") elif (type(self.RiskyStd) is list) or (type(self.RiskyAvg) is list): raise AttributeError( "If RiskyAvg is time-varying, then RiskyStd must be as well, and they must both have length of T_cycle!" ) else: self.addToTimeInv("RiskyAvg", "RiskyStd") # Generate a discrete approximation to the risky return distribution if the # agent has age-varying beliefs about the risky asset if "RiskyAvg" in self.time_vary: self.RiskyDstn = [] for t in range(self.T_cycle): self.RiskyDstn.append( Lognormal.from_mean_std( self.RiskyAvg[t], self.RiskyStd[t] ).approx(self.RiskyCount) ) self.addToTimeVary("RiskyDstn") # Generate a discrete approximation to the risky return distribution if the # agent does *not* have age-varying beliefs about the risky asset (base case) else: self.RiskyDstn = Lognormal.from_mean_std( self.RiskyAvg, self.RiskyStd, ).approx(self.RiskyCount) self.addToTimeInv("RiskyDstn")
def get_Risky(self): """ Sets the attribute Risky as a single draw from a lognormal distribution. Uses the attributes RiskyAvgTrue and RiskyStdTrue if RiskyAvg is time-varying, else just uses the single values from RiskyAvg and RiskyStd. Parameters ---------- None Returns ------- None """ if "RiskyDstn" in self.time_vary: RiskyAvg = self.RiskyAvgTrue RiskyStd = self.RiskyStdTrue else: RiskyAvg = self.RiskyAvg RiskyStd = self.RiskyStd self.shocks["Risky"] = Lognormal.from_mean_std( RiskyAvg, RiskyStd, seed=self.RNG.randint(0, 2 ** 31 - 1) ).draw(1)