Functional Weave
Code in TypeScript

invest.fee-drag@1.0.0

README.md

1,573 bytes · view raw

# invest.fee-drag

How much an ongoing charge (a fund's OCF, a platform fee, an adviser's
percentage) costs over a number of years, by running the same investment
twice, with and without the charge, and comparing.

## The convention

Each year, in this order, in whole minor units:

1. growth = value x `annualGrowthBasisPoints` / 10000, rounded half away from
   zero (`money.apply-rate`, half-up), and added;
2. fee = the grown value x `annualFeeBasisPoints` / 10000, rounded the same
   way, and taken off (the "with fee" run only).

So the fee is charged once a year on the year-end value, as an annual
management charge on a statement is. Real platforms often charge monthly on
the average value; the difference is small and this capability does not model
it. Growth is a constant rate you choose; it is an illustration, not a
forecast.

## Why the drag is more than the fees

`feesPaid` is the charges taken. `drag` is the whole difference in the final
value, which also includes the growth the charged money would have earned.
With no growth they are equal; with positive growth the drag is larger, and
the gap widens with the years. That gap is the point of the capability, and
the reason an answer computed as "fee x years" is wrong.

## Edge cases

- `years` 0 returns the start value twice and an empty schedule.
- Growth of -10000 (a total loss) is allowed; anything lower is an error.
- `dragBasisPoints` is 0 when the value without the fee is 0.
- Errors: negative or fractional start value, years outside 0-100, a fee
  outside 0-10000, growth below -10000.