Vessel Finance
Budget vs actual, forecast.
A vessel’s annual budget is a number on a spreadsheet until you start spending it. Once spending starts, the question shifts: “are we tracking, and if not, where is the variance coming from, and will it close out the year over plan?“
Three numbers
| Number | What it answers |
|---|---|
| YTD variance | Are we over or under against where we should be right now? |
| Year-end forecast | If nothing changes, where do we close out the year? |
| NB fund balance | Is there cash to keep operating? |
The Vessel Finance pipeline computes all three on a rolling basis, drills to the cost categories driving the variance, and surfaces the fund-balance position so a Technical Superintendent can act before the month-end close.
Pro-rata: the trick everyone gets wrong
Comparing month-to-date spend against one-twelfth of the annual budget produces nonsense. Drydocks land in a single month; surveys cluster around certificate cycles; lube-oil bunkering happens at port calls. The pipeline uses category-aware pro-rata:
B_prorata(t) = B_annual × f_category(t)
Variance_prorata = Actual_YTD − B_prorata(t)f_category(t) is the cumulative fraction of the annual budget expected to have been spent by time t. Crew uses a linear profile; Drydock uses a step function around the planned drydock month.
A vessel “10% over annual budget” looks alarming until pro-rata accounting shows it’s within 2% of the expected curve because the drydock landed in March.
Worked example — MV POSUN
2026 budget year, reviewed end of April:
| View | Number | Verdict |
|---|---|---|
| OPEX YTD pro-rata variance | +$48,300 (+8.4%) | Watch |
| Year-end forecast | +$112,000 (+11.7%) | Over — escalate |
| Top variance driver | Lube Oil +$16,400 (Singapore bunker Apr-12) | — |
| Second driver | Repairs +$22,800 (turbocharger overhaul March) | — |
| Third driver | Stores +$9,100 (consumables uptick) | — |
| NB fund closing | $1.2M positive | Healthy |
| DD fund vs planned | $340k vs $850k planned | Underfunded |
| Per-day OPEX | $4,150 | $50 over fleet median |
Verdict: HIGH on year-end forecast — projecting +12%, primarily repairs and the Singapore bunker outlier. DD funding gap routes to owner / commercial for attention.
Under the hood
Pro-rata implementation
def prorata_calculation(row, env): """Compute the pro-rata budget for a row given category and current period.""" category = row["category"] period_end = row["period_end_date"] annual_bud = row["annualBudget"] today = datetime.utcnow() if env != "test" else datetime(2025, 11, 20)
# Choose the time profile by category profile = CATEGORY_PROFILES.get(category, "linear") if profile == "linear": elapsed = (today - row["budget_start_date"]).days total = (period_end - row["budget_start_date"]).days fraction = elapsed / total elif profile == "drydock": # Step function — full allocation lands in planned drydock month fraction = 1.0 if today >= row["drydock_month"] else 0.0 elif profile == "lubeoil_quarterly": # Quarterly lumps tied to typical bunker calls fraction = quarterly_fraction(today, row["budget_start_date"]) else: fraction = elapsed / total
return annual_bud * fractionThe reviewer doesn’t see this calculation. They see one number: variance against the expected curve.
Year-end forecast logic
Forecast_YE = Actual_YTD + burn_rate_recent × Months_remainingburn_rate_recent is the average monthly spend over the last 3 months.
| Forecast vs annual budget | Tier |
|---|---|
| ≤ +5% | On track |
| +5% to +10% | Watch |
| +10% to +25% | Over — escalate |
| > +25% | Critical — re-forecast required |
A vessel forecasting -15% under budget is also flagged — that usually means deferred maintenance storing up future cost, not genuine savings.
Cost-driver attribution — the transaction detail
When a category is over budget, the analyzer ranks the underlying transactions:
LUBE OIL — Annual budget $84,000 · YTD pro-rata $42,000 Actual $58,400 · Variance +$16,400 (+39%)
Top drivers: 1. PO LUB-2026-04-118 Singapore bunker $12,200 2. PO LUB-2026-02-073 Cylinder oil × 4 drums $4,800 3. PO LUB-2026-03-091 System oil top-up $1,200“Lube oil over by $16k” can be a budgeting error, a price spike, a one-off bunker, or systematic overconsumption. The driver list collapses the ambiguity: “Singapore bunker drove most of it.”
Variance shape classification
Different variance shapes mean different things:
| Pattern | Likely cause |
|---|---|
| Single-month spike, returns to baseline | One-off event (drydock, bunker, repair) |
| Rising trend across 3+ months | Structural — price inflation, aging equipment, over-consumption |
| Stable variance, growing absolute number | Volume — more vessel days, more activity |
| Falling variance | Recovery or under-spend (check for deferred work) |
The pipeline classifies the variance shape and adds it to the verdict so a TSI knows whether they’re chasing an event or a trend.
The five tables a reviewer reads
The Committed Cost Summary assembles five views:
- OPEX Current Month — spend vs pro-rata monthly budget; the most-recent-data view.
- OPEX Previous Month — closed prior month for trend comparison.
- NB (Newbuilding fund) — opening balance, receipts, expenses, closing balance.
- DD (Drydock fund) — reserve status (accumulating or drawn down) vs planned drydock cost.
- PD (Periodic drydock) — periodic drydock provision tracking.
A reviewer reading all five together can spot an OPEX overrun being absorbed by an underfunded DD reserve — a problem invisible in any single view.
NB fund and per-day OPEX
NB fund balance tracks a separate ledger from OPEX:
Closing balance = Opening + Receipts − ExpensesA vessel with NB fund running negative is a cash issue, not a budget issue — usually visible weeks before the month-end close.
Per-day OPEX answers “what does this vessel cost per operating day?”:
Per-day OPEX = OPEX_YTD / Operating_days_YTDComparable across vessels of the same type. A vessel at $4,200/day where the fleet median is $3,600/day is structurally more expensive — usually older equipment, higher repair burden, or longer port stays.
Escalation triggers
| Trigger | Severity |
|---|---|
| Year-end forecast breach > 25% | CRITICAL |
| Year-end forecast breach > 10% | HIGH |
| NB fund balance turning negative | CRITICAL |
| DD fund underfunded vs planned drydock with < 90 days | HIGH |
| Single category overspend > 25% | HIGH |
| Rising variance trend across 3+ months in any category | HIGH |
| Unbudgeted spend on safety-critical items | CRITICAL |