Calculates compounded value of portfolio
(returns, start_balance=1e5, mode="comp", round_to=None)
| 411 | |
| 412 | |
| 413 | def make_portfolio(returns, start_balance=1e5, mode="comp", round_to=None): |
| 414 | """Calculates compounded value of portfolio""" |
| 415 | returns = _prepare_returns(returns) |
| 416 | |
| 417 | if mode.lower() in ["cumsum", "sum"]: |
| 418 | p1 = start_balance + start_balance * returns.cumsum() |
| 419 | elif mode.lower() in ["compsum", "comp"]: |
| 420 | p1 = to_prices(returns, start_balance) |
| 421 | else: |
| 422 | # fixed amount every day |
| 423 | comp_rev = (start_balance + start_balance * returns.shift(1)).fillna( |
| 424 | start_balance |
| 425 | ) * returns |
| 426 | p1 = start_balance + comp_rev.cumsum() |
| 427 | |
| 428 | # add day before with starting balance |
| 429 | p0 = _pd.Series(data=start_balance, index=p1.index + _pd.Timedelta(days=-1))[:1] |
| 430 | |
| 431 | portfolio = _pd.concat([p0, p1]) |
| 432 | |
| 433 | if isinstance(returns, _pd.DataFrame): |
| 434 | portfolio.iloc[:1, :] = start_balance |
| 435 | portfolio.drop(columns=[0], inplace=True) |
| 436 | |
| 437 | if round_to: |
| 438 | portfolio = _np.round(portfolio, round_to) |
| 439 | |
| 440 | return portfolio |
| 441 | |
| 442 | |
| 443 | def _flatten_dataframe(df, set_index=None): |
nothing calls this directly
no test coverage detected