Guided walkthrough · about 30 minutes

Work a reserve analysis, a rate indication, and a layer price. Live.

11 steps over one commercial auto liability book, at working rigor: development, trend, on-level premium, credibility, a Mack chain ladder on real industry data, and a seeded frequency-severity simulation. Every cell below calls the engine over HTTP. Edit it, run it, and the page checks your answer. Nothing to install, no account, and no data kept after the call. The case study is synthetic and illustrative; the RAA triangle is real industry data, and every number on the page comes from the engine.

0 of 11 done
Commercial auto liabilityAccident year 2023, evaluated 12/31/2025
$6,350,000Earned premium, AY2023
$3,050,000 / 460Reported losses at 36 months / claims
1.07, 1.03, 1.01, 1.02Selected factors from 36 months, tail last
+5%, +3%Filed rate changes since AY2023
-1% / +5%Frequency / severity trend, 4 years

Start here · Step 1 of 11

Your first call

The loss and LAE ratio at 36 months, computed by the engine.

The engine speaks Excel. You send one formula and you get one value back, over plain HTTP, with no key and no account. Nothing about the calculation is stored after the response.

Start with the number every review opens on. AY2023 reported losses are 3,050,000 against 6,350,000 of earned premium. Press Run, or edit the formula first: the cell below is a live request to POST /v1/evaluate, not a screenshot of one.

Live engine

POST /v1/evaluate
Ctrl + Enter runs it
Result Press Run Expect 0.4803, the reported loss ratio at 36 months, losses only

Your turn

This book carries LAE as a ratio to loss of 12.5 percent. Report the loss and LAE ratio to four decimals. (This is LAE relative to loss, not the LAE-to-premium ratio that enters a combined ratio.)

Your answer

POST /v1/evaluate
Ctrl + Enter runs it
Result Press Run Starts from the example above. Edit it, then Run.
Not done yet

Think it through (optional)

This 0.5404 is a raw reported ratio. Before it can support a rate indication, what must happen to the numerator and the denominator?

A leading = is optional; the engine promotes a bare expression. Everything Excel computes, this cell computes.

Start here · Step 2 of 11

The actuarial catalog, by bare name

VaR and TVaR over the year’s largest claims, no add-in required.

The catalog holds the Excel library plus a deep actuarial one, called by bare name exactly as you would write them in a cell: RISK.VAR, TVAR, LDF.CDF, PREM.ONLEVEL, CRED.BLEND, and several hundred more.

Here are the year's 20 largest closed claims, as an array literal. Read a percentile over a truncated listing for what it is: the 75th percentile of the top-20 file, which over a 460-claim year sits near the 99th percentile of the whole claim file. The starter is that Value at Risk.

Live engine

POST /v1/evaluate
Ctrl + Enter runs it
Result Press Run Expect 54,250, the listing’s 75th percentile

Your turn

A percentile marks where the tail starts, not how heavy it is. Report the Tail Value at Risk (the conditional tail expectation) at the same 75 percent level: the average of the top five claims.

Your answer

POST /v1/evaluate
Ctrl + Enter runs it
Result Press Run Starts from the example above. Edit it, then Run.
Not done yet

Think it through (optional)

Capital work quotes tails as return periods. What return period corresponds to the 99.6th percentile? (RISK.RETURNPERIOD(0.996) checks your arithmetic.)

The 75 percent level over 20 claims leaves five observations in the tail average. Read a tail statistic off a handful of points, not off one or two; deeper levels belong to the simulation chapter, where the sample size is yours to choose. Browse every function name at /v1/functions before you write a call.

Reserving · Step 3 of 11

From link ratios to broad IBNR

Chain the selected factors, then carry reported losses to ultimate.

Off the triangle you selected age-to-age factors from 36 months: 1.07, 1.03, 1.01, then a 1.02 tail. The age-to-ultimate factor is their product, and LDF.CDF takes the whole column at once.

Run it, and you have the cumulative development factor that carries 36 months of reported losses to ultimate.

Live engine

POST /v1/evaluate
Ctrl + Enter runs it
Result Press Run Expect 1.13538342, the age-to-ultimate factor at 36 months

Your turn

Turn the factor into dollars. Report the development on 3,050,000 of reported losses, rounded to whole dollars. On a reported triangle this is broad IBNR: pure IBNR plus development on known claims (IBNER).

Your answer

POST /v1/evaluate
Ctrl + Enter runs it
Result Press Run Starts from the example above. Edit it, then Run.
Not done yet

Think it through (optional)

The CDF is 1.13538. What percentage of the ultimate is still unreported at 36 months? Answer to one decimal, as a percent.

A factor below 1.0 returns a negative estimate rather than clamping to zero: favorable development at mature ages is a result, not an error.

Reserving · Step 4 of 11

A Mack chain ladder on a real triangle

The Python reserving library, called from a formula, on industry data.

A selected factor is a judgement. Mack’s method gives the same chain-ladder reserve with a standard error attached, and the engine runs the real chainladder package rather than a reimplementation of it.

Library calls pass a fitted-model handle between functions: FIT takes a model and a triangle, GET pulls one fitted attribute, TOTAL sums it. The triangle here is raa, the Reinsurance Association of America’s published incurred triangle, so the answer is checkable against the package itself. Your own triangle goes in the same argument slot as a cell range.

Live engine

POST /v1/evaluate
Ctrl + Enter runs it
Result Press Run Expect 52,135.23, the broad IBNR total across accident years

Your turn

A point estimate without a measure of spread is half an answer. Report the Mack standard error of that same total, rounded to two decimals.

Your answer

POST /v1/evaluate
Ctrl + Enter runs it
Result Press Run Starts from the example above. Edit it, then Run.
Not done yet

Think it through (optional)

The coefficient of variation of the reserve is the standard error over the broad IBNR. Compute it to two decimals.

raa is a reported (incurred) triangle, so ibnr_ here is ultimate less reported: broad IBNR, excluding case reserves. On a paid triangle the same attribute is the full unpaid-claim estimate.

Ratemaking · Step 5 of 11

Trend: frequency and severity, combined multiplicatively

Bring the developed losses to the cost level of the future policy period.

Development answers what AY2023 will ultimately cost at AY2023 price levels. Trend carries that cost to the period the new rates will cover. The book runs a −1% frequency trend and a +5% severity trend, and they combine multiplicatively, not additively: (1 − 0.01) × (1 + 0.05) − 1 = 3.95%.

The trend period is derived, not asserted: the new rates take effect 7/1/2026 for one year of annual policies, so the average written date is 1/1/2027 and the average loss date is near 7/1/2027. From the AY2023 midpoint, 7/1/2023, that is 4.0 years.

Live engine

POST /v1/evaluate
Ctrl + Enter runs it
Result Press Run Expect 1.16761, the four-year net trend factor

Your turn

Apply the whole loss side at once: report the trended ultimate loss and LAE, to whole dollars. That is reported losses of 3,050,000, developed at the CDF from the reserving chapter, loaded 12.5 percent for LAE, trended at this factor.

Your answer

POST /v1/evaluate
Ctrl + Enter runs it
Result Press Run Starts from the example above. Edit it, then Run.
Not done yet

Think it through (optional)

Suppose you had trended severity alone at +5% (factor 1.05⁴ = 1.2155) and ignored the frequency improvement. What does that do to the indication?

Ratemaking · Step 6 of 11

On-level premium and the projected ratio

Restate the premium at current rate level, then read the ratio that matters.

Two rate changes were filed since AY2023 was earned: +5% effective 7/1/2024, +3% effective 7/1/2025. A loss ratio over unadjusted premium compares projected losses to prices no longer charged. PREM.ONLEVEL applies the cumulative rate-level index, oldest change first.

One assumption to state out loud: applying each change in full treats every historical dollar as written at the pre-change rate level. That is the extension-of-exposures ideal; when premium is only available in aggregate, the parallelogram method earns each change in geometrically and the factors shrink accordingly.

Live engine

POST /v1/evaluate
Ctrl + Enter runs it
Result Press Run Expect 6,867,525.00, AY2023 earned premium at current rate level

Your turn

Divide the trended ultimate loss and LAE from the last step by this on-level premium: the projected loss and LAE ratio, to four decimals.

Your answer

POST /v1/evaluate
Ctrl + Enter runs it
Result Press Run Starts from the example above. Edit it, then Run.
Not done yet

Think it through (optional)

Applying each filed change in full, as this cell does, is exact only when…

Hold on to 0.6624: the credibility step weights it, and the indication divides it through the permissible loss ratio. Also set aside here: premium trend, the companion adjustment for average-premium drift from mix shift, taken as nil for this per-vehicle book with a stable mix.

Ratemaking · Step 7 of 11

Credibility

Weight 460 claims of experience against the complement.

460 claims is a thin basis for a 0.6624 projected ratio. Limited fluctuation credibility sets the weight: Z = √(n / 1082), with 1,082 the Longley-Cook full-credibility standard for ±5% at 90% confidence under Poisson frequency.

The complement of credibility here is 0.685: the loss and LAE ratio underlying the current rates, trended to the same future period. The complement must live at the same cost and rate level as the experience, or the blend mixes two eras.

Live engine

POST /v1/evaluate
Ctrl + Enter runs it
Result Press Run Expect 0.6520, the credibility assigned to 460 claims

Your turn

Report the credibility-weighted loss and LAE ratio, to four decimals: Z times the projected 0.6624, plus (1 − Z) times the 0.685 complement.

Your answer

POST /v1/evaluate
Ctrl + Enter runs it
Result Press Run Starts from the example above. Edit it, then Run.
Not done yet

Think it through (optional)

Tighten the standard to ±2.5% at the same 90% confidence. How many claims does full credibility now require? (=(NORM.S.INV(0.95)/0.025)^2 in the cell above checks you.)

The 1,082 standard is derived from claim counts alone (Poisson frequency, constant severity). Applied to a loss ratio, severity variation argues for a higher standard, so treat this Z as generous. CRED.BUHLMANN (least squares) and the CRED.BAYES family are in the catalog when the square-root rule is not defensible for the book at hand.

Models, not formulas · Step 8 of 11

The indication as a workbook

The whole chain in one model, with the assumptions as named inputs.

You have now run every link by hand: develop, load LAE, trend, on-level, weight by credibility. POST /v1/run holds the chain as one workbook: a template of cells, inputs binding named assumptions into cells, outputs naming the cells you want back.

The last row is the Werner & Modlin loss-ratio-method indication: the credibility-weighted ratio plus the 6.5% fixed expense ratio, divided by the variable permissible loss ratio (1 − 25% variable expense − 5% target profit), minus one. Run it and read indicatedChange: +5.0%.

Live engine

POST /v1/run
Ctrl + Enter runs it
Result Press Run Expect indicatedChange 0.0503: an indicated rate increase of 5.0 percent

Your turn

Management asks what the indication becomes at a 7.5 percent profit provision. Change the assumption, not the model: edit only the data block and run it again.

Your answer

POST /v1/run
Ctrl + Enter runs it
Result Press Run Starts from the example above. Edit it, then Run.
Not done yet

Think it through (optional)

The claims department strengthened case reserves across the board this year. What does that do to the raw reported development pattern this workbook consumes?

One deliberate simplification: a filing indication runs three to five accident years, each developed and trended, and weights them; one year keeps this chain readable, and the credibility step is doing the work that averaging over years would share. Every run returns a provenance stamp (a hash of the full computation and the engine build); recording both beside the output is what makes the indication reproducible in a filing defense.

Models, not formulas · Step 9 of 11

TSRA: the model as readable text

Named inputs, named formulas, reusable functions. No cell coordinates.

A workbook binds meaning to coordinates: B20 is the credibility-weighted ratio because row 20 says so. TSRA — a Traceable Spreadsheet Reproducible Artifact — is the same computation written as named declarations instead: input for what the caller supplies (with defaults), let for named intermediate formulas, output for results, and func for reusable functions. It compiles to the same workbook /v1/run executes, so the numbers cannot differ between the two forms.

The program below prices the reinsurance layer the next chapter simulates: expected ceded loss plus a standard-deviation risk load, grossed up for expenses, with rate on line and payback period as functions any program in the bundle could reuse. This editor holds TSRA source, and Run posts it to POST /v1/run-tsra.

Live engine

POST /v1/run-tsra
Ctrl + Enter runs it
Result Press Run Expect technical_premium 203,714, rate_on_line 0.407, payback_years 2.45

Your turn

The ceding company will ask what loss ratio the layer is expected to run at this price. Add one line: an output named expected_loss_ratio, equal to expected_ceded over technical_premium.

Your answer

POST /v1/run-tsra
Ctrl + Enter runs it
Result Press Run Starts from the example above. Edit it, then Run.
Not done yet

Think it through (optional)

Before any loading: what is the pure loss-cost rate on line, expected ceded loss over the 500K limit? Two decimals.

A program can span several files that merge into one namespace, so a shared library of funcs (your shop’s standard loads, your ILF interpolations) is one upload away.

Reinsurance · Step 10 of 11

A seeded frequency-severity simulation of the layer

Poisson large-claim counts, lognormal severities, ceded through 500K xs 250K.

Where do 119,702 of expected ceded loss and its standard deviation come from? From this model. Each iteration draws the year’s large-claim count from Poisson(0.8), draws each claim from the lognormal fitted to the book’s five-year large-loss file (μ = 12.6, σ = 0.85), cedes each through LAYER.CEDED(loss, 250000, 500000), and sums. Twelve claim slots bound the draw: P(N > 12) is below 10−11, so the truncation never binds. Note the fit is to five years, not to 2023 alone: the year’s own largest claim was 175,000, below the attachment, which is exactly the kind of year a Poisson(0.8) process produces.

The seed is what makes this an audit-grade tool rather than a demo: the same seed over the same workbook draws the same samples, and the seed used comes back in the response, so even an unpinned run can be replayed exactly.

Live engine

POST /v1/run
Ctrl + Enter runs it
Result Press Run Expect mean ceded loss 119,701.77 over 5,000 seeded iterations

Your turn

The reinsurer’s capital charge keys off the 1-in-100 year outcome. Collect the 99th percentile of the ceded loss alongside the mean and standard deviation.

Your answer

POST /v1/run
Ctrl + Enter runs it
Result Press Run Starts from the example above. Edit it, then Run.
Not done yet

Think it through (optional)

Poisson(0.8) gives P(no large claim) = e⁻⁰·⁸ ≈ 45%. Yet about 63% of simulated years cede nothing to the layer. Why?

The p99 lands near 922,000: almost twice the per-occurrence limit, because a bad year cedes several claims. The response’s epCurve is the full exceedance-probability curve if you want to see the whole tail.

Take it with you · Step 11 of 11

Take it back to your desk

The same engine from Excel, from an agent, or from your own code.

Everything above was plain HTTP, which is why it reaches you wherever you work. The three surfaces below share one evaluator, so the number in a cell, the number your assistant quotes, and the number your script logs are the same number.

Excel

Install the add-in and the whole catalog answers in a cell under the TESORA namespace. Your triangle stays in the workbook; the computation happens here.

Manifest URL
https://compute-fleet.tesora.ai/addin/manifest.xml
In a cell
=TESORA.LDF.CDF(B2:B6)
=TESORA.TVAR(C2:C201, 0.9)
=TESORA.CHAINLADDER.MACKCHAINLADDER(A1:J10)

An AI assistant

Point an MCP client at the server and your assistant can evaluate, run a workbook or a TSRA program, browse the catalog, and stage a CSV or Parquet file to compute over. Sign in when the client asks: the MCP surface has no anonymous tier.

Claude Code
claude mcp add --transport http tesora-compute https://compute-fleet.tesora.ai/mcp

Your own code

Save the workbook once as a named operation, then run it by name with only the inputs that changed. That is the quarterly review as an API call rather than a file someone has to find.

Save it, then run it
curl -X POST https://compute-fleet.tesora.ai/v1/operations \
  -H 'Content-Type: application/json' \
  -d '{"slug":"auto-indication","name":"Commercial auto indication",
       "step":{"template":{"sheets":[{"name":"Ind","data":[[0,"=A1*1.125"]]}]},
       "inputs":{"Ind!A1":"trigger.data.losses"},
       "outputs":{"lossAndLae":"Ind!B1"},
       "inputSchema":{"losses":{"schemaType":"PRIMITIVE","schemaItemType":"NUMBER"}}}}'

# then, every quarter:
curl -X POST https://compute-fleet.tesora.ai/v1/operations/auto-indication/run \
  -H 'Content-Type: application/json' -d '{"inputs":{"losses":3050000}}'

Read /llms-full.txt for the complete contract, including large-file uploads, inline custom functions, and the provenance stamp on every run. Something wrong or missing? Send it to POST /v1/feedback or the support page, and it reaches the people who maintain the engine.

Wrap up

Pick the surface you will actually use tomorrow, and connect it.