@@ -60,7 +60,7 @@ def __repr__(self):
6060 @property
6161 def discount_rate (self ) -> float :
6262 """
63- Portfolio cash flow discount rate.
63+ Annual effective discount rate for portfolio cash flow .
6464
6565 Returns
6666 -------
@@ -182,14 +182,10 @@ def wealth_index(self, discounting: Literal["fv", "pv"], include_negative_values
182182 if discounting .lower () == "fv" :
183183 return wealth_index_fv
184184 elif discounting .lower () == "pv" :
185- n_rows = wealth_index_fv .shape [0 ]
186- discount_factors = (1.0 + self .discount_rate / settings ._MONTHS_PER_YEAR ) ** np .arange (n_rows )
187- wealth_index_pv = wealth_index_fv .div (discount_factors , axis = 0 )
188- return wealth_index_pv
185+ return dcf_calculations .discount_monthly_cash_flow (wealth_index_fv , self .discount_rate )
189186 else :
190187 raise ValueError ("'discounting' must be either 'fv' or 'pv'" )
191188
192-
193189 def cash_flow_ts (self , discounting : Literal ["fv" , "pv" ], remove_if_wealth_index_negative : bool = True ) -> pd .Series :
194190 """
195191 Wealth index Future Values (FV) time series for the portfolio with cash flow (contributions and
@@ -240,10 +236,7 @@ def cash_flow_ts(self, discounting: Literal["fv", "pv"], remove_if_wealth_index_
240236 if discounting .lower () == "fv" :
241237 return cash_flow_fv
242238 elif discounting .lower () == "pv" :
243- n_rows = cash_flow_fv .shape [0 ]
244- discount_factors = (1.0 + self .discount_rate / settings ._MONTHS_PER_YEAR ) ** np .arange (n_rows )
245- cash_flow_pv = cash_flow_fv .div (discount_factors , axis = 0 )
246- return cash_flow_pv
239+ return dcf_calculations .discount_monthly_cash_flow (cash_flow_fv , self .discount_rate )
247240 else :
248241 raise ValueError ("'discounting' must be either 'fv' or 'pv'" )
249242
@@ -499,10 +492,7 @@ def monte_carlo_wealth(
499492 if discounting .lower () == "fv" :
500493 return monte_carlo_wealth_fv
501494 elif discounting .lower () == "pv" :
502- n_rows = monte_carlo_wealth_fv .shape [0 ]
503- discount_factors = (1.0 + self .discount_rate / settings ._MONTHS_PER_YEAR ) ** np .arange (n_rows )
504- monte_carlo_wealth_pv = monte_carlo_wealth_fv .div (discount_factors , axis = 0 )
505- return monte_carlo_wealth_pv
495+ return dcf_calculations .discount_monthly_cash_flow (monte_carlo_wealth_fv , self .discount_rate )
506496 else :
507497 raise ValueError ("'discounting' must be either 'fv' or 'pv'" )
508498
@@ -567,9 +557,7 @@ def monte_carlo_cash_flow(
567557 if discounting .lower () == "fv" :
568558 return mc_cash_flow_fv
569559 elif discounting .lower () == "pv" :
570- n_rows = mc_cash_flow_fv .shape [0 ]
571- discount_factors = (1.0 + self .discount_rate / settings ._MONTHS_PER_YEAR ) ** np .arange (n_rows )
572- return mc_cash_flow_fv .div (discount_factors , axis = 0 )
560+ return dcf_calculations .discount_monthly_cash_flow (mc_cash_flow_fv , self .discount_rate )
573561 else :
574562 raise ValueError ("'discounting' must be either 'fv' or 'pv'" )
575563
@@ -630,12 +618,12 @@ def plot_forecast_monte_carlo(
630618 years = months / settings ._MONTHS_PER_YEAR
631619 periods = years / settings .frequency_periods_per_year [self .cashflow_parameters .frequency ]
632620 self .cashflow_parameters .amount *= (1.0 + self .cashflow_parameters .indexation ) ** periods
633- s2 = self .monte_carlo_wealth_fv
621+ s2 = self .monte_carlo_wealth ( discounting = "fv" , include_negative_values = False )
634622 for s in s2 :
635623 s2 [s ].plot (legend = None )
636624 self .cashflow_parameters = backup_obj
637625 else :
638- s2 = self .monte_carlo_wealth_fv
626+ s2 = self .monte_carlo_wealth ( discounting = "fv" , include_negative_values = False )
639627 s2 .plot (legend = None )
640628 self .cashflow_parameters ._clear_cf_cache ()
641629
@@ -684,7 +672,7 @@ def monte_carlo_survival_period(self, threshold: float = 0) -> pd.Series:
684672 >>> s.quantile(50 / 100)
685673 np.float64(17.5)
686674 """
687- s2 = self .monte_carlo_wealth_fv
675+ s2 = self .monte_carlo_wealth ( discounting = "fv" , include_negative_values = False )
688676 dates : pd .Series = helpers .Frame .get_survival_date (s2 , self .discount_rate , threshold )
689677 return dates .apply (helpers .Date .get_period_length , args = (self .parent .last_date ,))
690678
0 commit comments