pyppr.matching_underlying_assets_cagr#

pyppr.matching_underlying_assets_cagr(nper, ua_tr, ppr_ev, ppr_costr, ppr_tcr, ppr_standard_withdrawal)#

Compute the Cumulative Annual Growth Rate (CAGR) of the PPR’s Underlying Assets that makes the PPR’s tax-net final value match that of an investment in the underlying assets, with a defined extra return.

Given:
  • the total number of compounding periods, nper,

  • the tax rate, ua_tr, the investor would pay on the capital gains in the underlying assets, had he invested in them directly,

  • the PPR’s total costs, ppr_costr, including its management commission and others, expressed as a percentage of the invested capital,

  • the tax credit rate, ppr_tcr, the investor gets in his IRS for investing in a PPR,

  • the extra after-tax value, ppr_ev, the PPR can/should generate comparing to its underlying assets. Expressed in percentage and can be negative,

  • and whether the PPR will be withdrawn in standard conditions or not, ppr_standard_withdrawal.

Return:

The Underlying Assets’ CAGR that makes the PPR and an investment in its underlying assets generate the same tax-net final value, plus/minus the defined extra return.

Parameters:
nperscalar or array_like of shape(M, )

Number of compounding periods

ua_trscalar or array_like of shape(M, )

Tax rate the investor would pay on the capital gains in the underlying assets Example: 0.28

ppr_evscalar or array_like of shape(M, )

PPR’s extra after-tax final value comparing to its underlying assets Example: -0.03 means that the final after-tax investment value generated by the PPR is 3% less than that of an investment made directly in the PPR’s underlying assets

ppr_costrscalar or array_like of shape(M, )

PPR’s total costs, including its management commission and others, expressed as a percentage of the invested capital Example: 0.0075

ppr_tcrscalar or array_like of shape(M, )

Tax credit rate the investor gets in his IRS for investing in a PPR Example: 0 or 0.2

ppr_standard_withdrawalbool

Whether the PPR will be withdrawn in standard conditions or not.

Returns:
outarray_like

The Underlying Assets’ CAGR. If all input is scalar, returns a scalar float. If any input is array_like, returns the annual cost rate for each input element.

Warning

matching_underlying_assets_cagr considers the PPR’s tax credit is reinvested into the PPR, itself not generating any tax credit.

Notes

Returns the result of

V0+(PPRnV0)(1trPPR)+TC0+(TCnTC0)(1trPPR)=[V0+(UAnV0)(1trUA)](1+evPPR)

which, according to The Math Behind the Functions, in its longest form, can be decomposed to

V0(1+tcpPPR)(1+r)n(1crPPR)n(1trPPR)+V0(1+tcpPPR)(trPPR)=V0(1+r)n(1trETF)(1+evPPR)+V0(trETF)(1+evPPR)

solved to r, which gives the following formula:

r=trETF(1+evPPR)trPPR(1+tcpPPR)(1crPPR)n(1+tcpPPR)(1trPPR)(1trETF)(1+evPPR)n1

You should take care to define the PPR’s tax credit rate according to the law. We recommend you to only consider inputting 0 or the current credit rate (at the time of this writing, 0.2) in the pprtcr parameter, even if only part of the investment will generate the credit. In that case, split the investment into two parts, one with pprtcr = 0 and the other with pprtcr=0.2.

Examples

>>> import pyppr

There’s a PPR that tracks the ETF I’m interested in investing in. Should I invest in the PPR or directly in the ETF? Here’s the scenario:

  • I expect to hold this investment for the next 20 years.

  • During that time, I expect the ETF to grow at a CAGR of 7%.

  • When withdrawing, I expect to pay 28% on capital gains.

  • Given the limitations and hurdles of the PPR, I require it to generate an extra 8% return, to choose it over the ETF.

  • I already invest in another ETF and I max out my tax credit when investing in it.

  • This PPR charges a management commission of 0.75% per year, and no other costs.

  • I will withdraw the PPR under standard conditions.

>>> match = pyppr.matching_underlying_assets_cagr(20, 0.28, 0.08, 0.0075, 0, True)
>>> if ( match >= 0.007 ):
...     print('I should invest directly in the underlying assets.')
>>> else:
...     print('I should invest in the PPR.')

We can make this decision by comparing the matching CAGR with our expectation of it because we know that higher CAGRs make PPRs more attractive than investing directly in its underlying assets. This is because higher CAGRs make the PPR’s costs lower and the tax benefits higher in relative terms.

What range would the PPR’s cost rate have to be in, for it to deliver somewhere between 6% and 9% extra value than investing in its underlying assets directly?

>>> import numpy as np
>>> years = np.array([10, 20, 30])
>>> match = pyppr.matching_underlying_assets_cagr(years, 0.28, 0.08, 0.0075, 0, True)
>>> for year, match in zip(years, matches):
...     if np.isnan(match):
...         print(f'A PPR with 0.75% yearly cost cannot provide 8% more value for a {year}-year investment.')
...     else:
...         print(f'A {match:.2%} CAGR is required for a {year}-year investment.')
A 11.38% CAGR is required for a 10-year investment.
A 14.91% CAGR is required for a 20-year investment.
A PPR with 0.75% yearly cost cannot provide 8% more value for a 30-year investment.