Skip to content

Commit b2ff033

Browse files
committed
feat: get_wealth_indexes_with_cashflow has use_discounted_values parameters
1 parent c1df18d commit b2ff033

File tree

3 files changed

+16
-13
lines changed

3 files changed

+16
-13
lines changed

main.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
ind = ok.IndexationStrategy(pf)
2929
ind.initial_investment = 10_000
3030
ind.frequency = "year"
31-
ind.amount = -1_000
31+
ind.amount = -500
3232
ind.indexation = "inflation"
3333

3434
# # TimeSeries strategy
@@ -44,12 +44,12 @@
4444
# Assign a strategy
4545
pf.dcf.cashflow_parameters = ind
4646
pf.dcf.discount_rate = 0.10
47-
pf.dcf.use_discounted_values = False
47+
pf.dcf.use_discounted_values = True
4848

4949
# Set Monte Carlo
5050
pf.dcf.set_mc_parameters(distribution="t", period=50, number=100)
5151

52-
pf.dcf.plot_forecast_monte_carlo(backtest=False)
52+
pf.dcf.plot_forecast_monte_carlo(backtest=True)
5353

5454
plt.yscale("log") # log or linear
5555
plt.legend("")

okama/common/helpers/helpers.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -197,19 +197,19 @@ def get_wealth_indexes_with_cashflow(
197197
portfolio_symbol: Optional[str],
198198
inflation_symbol: Optional[str],
199199
cashflow_parameters: type[CashFlow],
200+
use_discounted_values: bool,
200201
) -> Union[pd.Series, pd.DataFrame]:
201202
"""
202203
Returns wealth index for a series of returns with cash flows (withdrawals/contributions).
203204
204205
Values of the wealth index correspond to the beginning of the month.
205206
"""
206-
# TODO: add use_discounted_values parameters to setup initial conditions without modifying cashflow_parameters
207207
pf_object = cashflow_parameters.parent
208208
dcf_object = cashflow_parameters.parent.dcf
209209
amount = getattr(cashflow_parameters, "amount", None)
210210
period_initial_amount = (
211211
dcf_object.initial_investment_pv
212-
if dcf_object.use_discounted_values
212+
if use_discounted_values
213213
else cashflow_parameters.initial_investment
214214
)
215215
period_initial_amount_cached = period_initial_amount
@@ -218,7 +218,7 @@ def get_wealth_indexes_with_cashflow(
218218
else:
219219
try:
220220
# amount is not defined in TimeSeriesStrategy & PercentageStrategy
221-
amount = dcf_object.cashflow_pv if dcf_object.use_discounted_values else cashflow_parameters.amount
221+
amount = dcf_object.cashflow_pv if use_discounted_values else cashflow_parameters.amount
222222
except AttributeError:
223223
pass
224224
if isinstance(ror, pd.DataFrame):
@@ -240,7 +240,7 @@ def get_wealth_indexes_with_cashflow(
240240
elif cashflow_parameters.NAME == "time_series":
241241
try:
242242
cashflow = cashflow_parameters.time_series[date]
243-
if dcf_object.use_discounted_values:
243+
if use_discounted_values:
244244
last_date = pf_object.last_date
245245
first_date = date.to_timestamp(how="End")
246246
period_length = Date.get_period_length(last_date, first_date)

okama/portfolio.py

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2505,6 +2505,7 @@ def wealth_index(self) -> pd.DataFrame:
25052505
portfolio_symbol=self.parent.symbol,
25062506
inflation_symbol=infl,
25072507
cashflow_parameters=self.cashflow_parameters,
2508+
use_discounted_values=self.use_discounted_values,
25082509
)
25092510
self._wealth_index = self.parent._make_df_if_series(df)
25102511
return self._wealth_index
@@ -2553,6 +2554,7 @@ def wealth_index_with_assets(self) -> pd.DataFrame:
25532554
None, # symbol
25542555
None, # inflation_symbol
25552556
self.cashflow_parameters,
2557+
self.use_discounted_values
25562558
),
25572559
)
25582560
return wealth_df
@@ -2776,6 +2778,7 @@ def monte_carlo_wealth(self) -> pd.DataFrame:
27762778
None, # portfolio_symbol
27772779
None, # inflation_symbol
27782780
self.cashflow_parameters,
2781+
False, # use_discounted_values
27792782
),
27802783
)
27812784

@@ -2876,12 +2879,12 @@ def plot_forecast_monte_carlo(
28762879
>>> plt.yscale("log") # Y-axis has logarithmic scale
28772880
>>> plt.show()
28782881
"""
2879-
backup_obj = self.cashflow_parameters
2880-
backup = self.use_discounted_values
2881-
self.use_discounted_values = False # we need to start with not discounted values
28822882
if backtest:
28832883
if self.cashflow_parameters is None:
28842884
raise AttributeError("'cashflow_parameters' is not defined.")
2885+
backup_obj = self.cashflow_parameters
2886+
backup = self.use_discounted_values
2887+
self.use_discounted_values = False # we need to start with not discounted values
28852888
s1 = self.wealth_index[self.parent.symbol]
28862889
s1.plot(legend=None, figsize=figsize)
28872890
last_backtest_value = s1.iloc[-1]
@@ -2895,12 +2898,12 @@ def plot_forecast_monte_carlo(
28952898
s2 = self.monte_carlo_wealth
28962899
for s in s2:
28972900
s2[s].plot(legend=None)
2901+
self.cashflow_parameters = backup_obj
2902+
self.use_discounted_values = backup
2903+
self.cashflow_parameters._clear_cf_cache()
28982904
else:
28992905
s2 = self.monte_carlo_wealth
29002906
s2.plot(legend=None)
2901-
self.cashflow_parameters = backup_obj
2902-
self.cashflow_parameters._clear_cf_cache()
2903-
self.use_discounted_values = backup
29042907

29052908
def monte_carlo_survival_period(self, threshold: float = 0) -> pd.Series:
29062909
"""

0 commit comments

Comments
 (0)