Last Payment Adjustment#
When the product \(n \cdot m\) of a term and payment frequency is not an integer, the final sub-annual period is incomplete. Lactuca applies a proportional weight to that last period so that the present value reflects the true contracted term \(n\) — not the nearest aligned grid point.
Note
This adjustment applies only to discrete_precision mode. discrete_simplified and
the continuous modes do not implement fractional final-period scaling.
Annuity-due versus annuity-immediate#
Lactuca exposes separate methods for each payment convention:
Method family |
Convention |
Symbol |
Fractional adjustment |
|---|---|---|---|
|
Annuity-due — payments at the start of each sub-period |
\(\ddot{a}^{(m)}\) |
None — last payment is at \(\lfloor nm \rfloor / m \le n\) with full weight |
|
Annuity-immediate — payments at the end of each sub-period |
\(a^{(m)}\) |
Last payment scaled by \(w\) when \(w > 0\) |
For annuity-due methods (äx, äxy, äxyz, äjoint), the last payment is at
\(\lfloor nm \rfloor / m \le n\) and is included with full weight — no scaling. The next
payment would fall at \((\lfloor nm \rfloor + 1)/m > n\) and is simply excluded.
For annuity-immediate methods (ax, axy, axyz, ajoint), the final period ends at
\((\lfloor nm \rfloor + 1)/m > n\), so the last payment is pulled back to \(n\) and
proportionally reduced by \(w\).
The fractional weight#
The core quantity is the fractional part of \(n \cdot m\):
When \(w = 0\) the term is exactly aligned with the payment grid and no adjustment is needed. When \(w > 0\) the final period is incomplete and \(w\) is used as the scaling weight.
Note
When a time shift ts > 0 and deferment d are used together, \(w\) is computed from the
effective term \(n_\text{eff} = n - \max(ts - d,\, 0)\) rather than from raw \(n\).
When \(ts \le d\) the shift falls entirely within the deferment period and \(n_\text{eff} = n\).
Example 1 — aligned (\(n = 10.75\), \(m = 4\), quarterly):
No fractional adjustment is applied.
Example 2 — incomplete (\(n = 10.6\), \(m = 4\), quarterly):
The last quarter covers only \(w/m = 0.1\) year out of a full sub-period of \(1/m = 0.25\) years.
Annuity adjustment#
For ax, axy, axyz, ajoint (annuity-immediate) with \(w > 0\):
The last payment time is the exact term endpoint \(n_\text{eff} + d\) (where \(d\) is the deferment period; for the common case \(d = 0\) this is simply \(n_\text{eff}\)).
The last payment amount is scaled by \(w\):
where \(g(\cdot)\) is the growth factor and \({}_{n_\text{eff}}p_x\) is the survival probability
from the shifted age to \(n_\text{eff}\) (for multi-life methods axy, axyz, ajoint,
this is the joint survival probability of all lives).
This is exposed in the payment_adjustment array returned by return_flows=True
(see Inspecting Cash Flows): all elements are 1.0 except the last, which equals \(w\).
For äx, äxy, äxyz, äjoint (annuity-due), \(w\) does not produce a scaled final payment:
the last payment was already made at \(\lfloor nm \rfloor / m\) with full weight.
Insurance adjustment#
For all insurance methods — Ax, Axy, Axyz, Afirst, and their term and deferred
variants — the fractional-period scaling applies whenever \(w > 0\). Insurances have no
due/immediate distinction (that concept is replaced by mortality_placement), so the
adjustment fires regardless of any annuity-related convention:
The last period’s death probability is scaled by \(w\):
The last period’s discount time offset is also scaled:
where \(\delta_m\) is the mortality_placement offset (\(0\), \(1/(2m)\), or \(1/m\)).
Both effects are visible in the return_flows=True dict via the
death_probability_adjustment and discount_time arrays — see Inspecting Cash Flows.
Irregular cashflows#
When using cashflow_times and cashflow_amounts instead of the n/m grid, the
fractional adjustment is not applied — the programmer controls each payment’s timing
and amount directly. See Irregular Cashflows for details.
Note
äjoint does not accept cashflow_times (annuity-due with multiple lives uses the
standard grid only). For irregular schedules with multiple lives use ajoint, axy,
axyz, or ax with explicit cashflow_times.
See also#
Inspecting Cash Flows —
payment_adjustmentanddeath_probability_adjustmentarraysCalculation Modes —
discrete_precisionis the only mode that applies this adjustmentIrregular Cashflows — arbitrary cashflow timing
Configuration —
force_integer_tsand other calculation settingsNotation and Glossary — \(\ddot{a}\), \(a\), \(m\), \(n\) symbol definitions