Time series for finance
Financial time series carry traps that general charting advice does not cover: periods are discrete
and closed, values get restated, definitions change mid-series, and the thing people want to compare
usually has a different magnitude than the thing beside it.
Discrete periods are not continuous
Monthly data is monthly. A line smoothed through monthly points invents intermediate values that
never existed, and a reader will read them off.
- Columns for discrete periods where each period is a closed fact — monthly revenue, quarterly
bookings.
- Lines for continuously-varying quantities sampled over time — cash balance, headcount, open AR.
- Never spline/smooth between periods. Straight segments, or columns.
- Break the line at missing periods.
chartkit.linePath does this by default, deliberately —
connecting across a gap draws data you do not have.
- Mark partial periods (month-to-date) distinctly. An incomplete month plotted alongside complete
ones reads as a collapse.
Instead of dual axes
Dual axes create a crossover point that is an artifact of two arbitrary scales, and readers infer
meaning from it. Three honest substitutes:
1. Index both to 100 at a common base period. Now they share a scale and the comparison is real.
index_t = 100 × value_t / value_base
Best for comparing growth rates of differently-sized things. Label the base period in the axis title
— an index chart with no stated base is unreadable.
2. Two stacked panels sharing an x-axis. Costs vertical space, keeps both scales honest, and
aligned time makes the relationship visible anyway.
3. Chart the derived measure. If the reason for two axes is "revenue and margin", chart margin %
alone. Usually the second axis exists because the real question was a ratio.
Log scale — when and how
Use a log y-axis when the series spans more than roughly two orders of magnitude, or when the
question is about growth rate rather than absolute change. On a log scale, equal slopes mean
equal percentage growth, which is exactly what a growth-stage conversation is about.
- Label it clearly — most readers will not notice otherwise, and a log chart read as linear is
badly misread.
- Ticks at powers of ten with intermediate gridlines.
- Log cannot show zero or negatives. A log chart of a series that crosses zero is not possible;
use linear.
- Do not reach for it by default. Most finance series are fine on linear, and log costs
interpretability.
TTM, run-rate, and point-in-time
Three different series, routinely confused. Label which one is plotted.
| Measure |
Definition |
Good for |
Watch |
| Point-in-time |
The value at period end |
ARR, headcount, cash, balances |
Noisy; single-day timing effects |
| TTM |
Sum of trailing 12 months |
Revenue, bookings, spend |
Smooths seasonality; lags turning points by up to a year |
| Run rate |
Latest period × 12 |
Quick annualization |
Wildly overstates from a good month; nearly useless in a seasonal business |
| Rolling 3-month average |
Mean of last 3 |
Burn, collections |
The practical middle ground |
Never mix them on one chart without explicit labelling. A TTM line beside a point-in-time line
looks like a divergence when it is a definitional artifact.
For burn and runway specifically, use a trailing 3-month average rather than the latest month —
a single month's burn is not a rate.
Seasonality
- YoY comparison is the honest way to handle it: same month, prior year. Seasonality cancels.
- Overlay prior-year as a muted line on the same axis for a same-period comparison.
- Small multiples by year — one panel per year, months on the x-axis — makes the seasonal shape
visible directly.
- Do not deseasonalize a short series. With under about three years of history the adjustment is
fitting noise.
Forecast boundaries
Where actuals end and projection begins must be unmistakable:
- Solid line for actuals, dashed for forecast, with a vertical rule at the boundary labelled
"forecast →".
- A single forecast line understates uncertainty. Prefer a band. See
uncertainty-charts.
- Label the forecast vintage: "Forecast (Aug-26 reforecast)". Forecasts get revised, and an
unlabelled one is unreconcilable.
- Never continue a confidence-inspiring solid line past the last actual.
Annotation
Events explain shape. A chart without them makes the reader ask questions the chart could have
answered.
- Vertical rules with short labels for discrete events: a price change, a launch, an outage, a
funding round, a definition change.
- Shaded regions for periods: a pricing pilot, a hiring freeze, a COVID-like disruption.
- Direct callouts on the two or three points that matter — a peak, a trough, the current value.
A definition change gets an annotation and a visible break in the series. A smooth line across a
definition change is a false continuity claim. See chart-annotation.
Alignment and axis discipline
- Zero baseline for additive measures — revenue, cash, ARR, headcount. Truncating doubles the
apparent size of a change.
- Truncation is fine for rates and ratios where zero is not meaningful; say so in the axis label.
- Consistent period boundaries. A chart mixing calendar and fiscal quarters is wrong even if
every point is right.
- Date labels:
Jan 26, Q1 26, 2026 — never bare 1, 2, 3.
- Time runs left to right. Always. This should not need saying, and yet.
Restatement
Prior periods change — a reclass, a correction, a re-segmentation. When they do:
- Do not silently redraw history. A chart that quietly moves last quarter destroys trust in every
number on the page.
- Annotate the restatement and, where it matters, show both the as-reported and the restated series.
- State the as-of of the data (
microcopy-and-states), so two versions of the same chart can be
reconciled later.
Related skills
chart-selection — line versus column versus something else
uncertainty-charts — forecast bands
variance-charts — actual against plan over time
svg-charting — linePath and its null handling
chart-annotation — events, vintages, and definition breaks
1---2name: timeseries-finance3description: Time series for financial data - indexing and rebasing, log scale for compounding, TTM and run-rate versus point-in-time, seasonality handling, forecast boundaries, event annotation, period alignment, and the alternatives to dual axes. Trigger on "time series", "trend", "over time", "monthly chart", "YoY", "TTM", "run rate", "seasonality", "log scale", "two different scales", "index to 100".4---56# Time series for finance78Financial time series carry traps that general charting advice does not cover: periods are discrete9and closed, values get restated, definitions change mid-series, and the thing people want to compare10usually has a different magnitude than the thing beside it.1112---1314## Discrete periods are not continuous1516Monthly data is monthly. A line smoothed through monthly points invents intermediate values that17never existed, and a reader will read them off.1819- **Columns for discrete periods** where each period is a closed fact — monthly revenue, quarterly20 bookings.21- **Lines for continuously-varying quantities** sampled over time — cash balance, headcount, open AR.22- **Never spline/smooth** between periods. Straight segments, or columns.23- **Break the line at missing periods.** `chartkit.linePath` does this by default, deliberately —24 connecting across a gap draws data you do not have.25- Mark **partial periods** (month-to-date) distinctly. An incomplete month plotted alongside complete26 ones reads as a collapse.2728---2930## Instead of dual axes3132Dual axes create a crossover point that is an artifact of two arbitrary scales, and readers infer33meaning from it. Three honest substitutes:3435**1. Index both to 100** at a common base period. Now they share a scale and the comparison is real.3637```38index_t = 100 × value_t / value_base39```4041Best for comparing growth rates of differently-sized things. Label the base period in the axis title42— an index chart with no stated base is unreadable.4344**2. Two stacked panels** sharing an x-axis. Costs vertical space, keeps both scales honest, and45aligned time makes the relationship visible anyway.4647**3. Chart the derived measure.** If the reason for two axes is "revenue and margin", chart margin %48alone. Usually the second axis exists because the real question was a ratio.4950---5152## Log scale — when and how5354Use a log y-axis when the series spans **more than roughly two orders of magnitude**, or when the55question is about **growth rate rather than absolute change**. On a log scale, equal slopes mean56equal percentage growth, which is exactly what a growth-stage conversation is about.5758- **Label it clearly** — most readers will not notice otherwise, and a log chart read as linear is59 badly misread.60- Ticks at powers of ten with intermediate gridlines.61- **Log cannot show zero or negatives.** A log chart of a series that crosses zero is not possible;62 use linear.63- Do not reach for it by default. Most finance series are fine on linear, and log costs64 interpretability.6566---6768## TTM, run-rate, and point-in-time6970Three different series, routinely confused. Label which one is plotted.7172| Measure | Definition | Good for | Watch |73|---|---|---|---|74| **Point-in-time** | The value at period end | ARR, headcount, cash, balances | Noisy; single-day timing effects |75| **TTM** | Sum of trailing 12 months | Revenue, bookings, spend | Smooths seasonality; **lags turning points by up to a year** |76| **Run rate** | Latest period × 12 | Quick annualization | Wildly overstates from a good month; nearly useless in a seasonal business |77| **Rolling 3-month average** | Mean of last 3 | Burn, collections | The practical middle ground |7879**Never mix them on one chart** without explicit labelling. A TTM line beside a point-in-time line80looks like a divergence when it is a definitional artifact.8182For burn and runway specifically, use a **trailing 3-month average** rather than the latest month —83a single month's burn is not a rate.8485---8687## Seasonality8889- **YoY comparison** is the honest way to handle it: same month, prior year. Seasonality cancels.90- **Overlay prior-year as a muted line** on the same axis for a same-period comparison.91- **Small multiples by year** — one panel per year, months on the x-axis — makes the seasonal shape92 visible directly.93- Do not deseasonalize a short series. With under about three years of history the adjustment is94 fitting noise.9596---9798## Forecast boundaries99100Where actuals end and projection begins must be unmistakable:101102- **Solid line for actuals, dashed for forecast**, with a vertical rule at the boundary labelled103 "forecast →".104- **A single forecast line understates uncertainty.** Prefer a band. See `uncertainty-charts`.105- Label the forecast **vintage**: "Forecast (Aug-26 reforecast)". Forecasts get revised, and an106 unlabelled one is unreconcilable.107- Never continue a confidence-inspiring solid line past the last actual.108109---110111## Annotation112113Events explain shape. A chart without them makes the reader ask questions the chart could have114answered.115116- **Vertical rules with short labels** for discrete events: a price change, a launch, an outage, a117 funding round, a definition change.118- **Shaded regions** for periods: a pricing pilot, a hiring freeze, a COVID-like disruption.119- **Direct callouts** on the two or three points that matter — a peak, a trough, the current value.120121**A definition change gets an annotation and a visible break in the series.** A smooth line across a122definition change is a false continuity claim. See `chart-annotation`.123124---125126## Alignment and axis discipline127128- **Zero baseline for additive measures** — revenue, cash, ARR, headcount. Truncating doubles the129 apparent size of a change.130- Truncation is fine for **rates and ratios** where zero is not meaningful; say so in the axis label.131- **Consistent period boundaries.** A chart mixing calendar and fiscal quarters is wrong even if132 every point is right.133- Date labels: `Jan 26`, `Q1 26`, `2026` — never bare `1`, `2`, `3`.134- **Time runs left to right.** Always. This should not need saying, and yet.135136---137138## Restatement139140Prior periods change — a reclass, a correction, a re-segmentation. When they do:141142- **Do not silently redraw history.** A chart that quietly moves last quarter destroys trust in every143 number on the page.144- Annotate the restatement and, where it matters, show both the as-reported and the restated series.145- State the as-of of the data (`microcopy-and-states`), so two versions of the same chart can be146 reconciled later.147148---149150## Related skills151152- `chart-selection` — line versus column versus something else153- `uncertainty-charts` — forecast bands154- `variance-charts` — actual against plan over time155- `svg-charting` — `linePath` and its null handling156- `chart-annotation` — events, vintages, and definition breaks