Back to Case Studies

Building Explainable Market Analytics with a Deterministic Core

Product Engineering — Market Analytics | SmartMoney

Challenge

Fragmented market participation and indicator data needed a consistent analytical model, understandable explanations, and a dependable dashboard delivery path.

Approach

Built a scheduled scoring pipeline that produces reproducible analytics and explanations, stores historical results, and delivers precomputed data to a Vue dashboard.

Outcome

Implemented participant scoring, divergence analysis, historical outputs, and offline evaluation with a clear separation between quantitative facts and supplementary context.

Engagement snapshot

Product engineering across market-data processing, deterministic scoring, explanations, historical persistence, dashboard data contracts, external context, and an optional AI interpretation foundation.

Explainable calculations
Explicit scoring rules and deterministic explanations

The scoring implementation defines normalization, participant weights, regime-dependent calculations, and divergence. Explanations are derived from finalized model outputs.

Dashboard delivery
Scheduled job → static JSON → Vue dashboard

The canonical runtime stores scoring history in SQLite and exports dashboard data for GitHub Pages, without requiring a request-time scoring API.

Evaluation foundation
Historical outputs and an offline backtest runner

The repository contains scoring tests and forward-return evaluation capabilities. Their existence does not establish predictive accuracy or investment performance.

Challenge

Market participation, positioning, and volatility indicators describe different aspects of the same trading environment. Bringing them into one dashboard requires consistent calculations and a clear explanation of how each input contributes to the result.

SmartMoney needed to turn those inputs into a repeatable analytical product. Historical results had to remain available for comparison and evaluation. The dashboard needed a straightforward delivery model. Supplementary news and future AI-generated commentary needed clear boundaries so they could not silently change quantitative conclusions.

The central engineering question was how to make the analysis understandable while keeping the calculations authoritative and reproducible.

Approach

Compute the analytics in one authoritative pipeline. A scheduled .NET job processes market data, applies explicit scoring rules, and produces the dashboard outputs. Short- and long-window normalization, participant weights, and regime-dependent calculations live in the scoring layer. The frontend displays the results rather than recalculating them.

Explain the result from its components. Participant contributions and indicator relationships feed deterministic explanations. Institutional-versus-retail divergence provides another view of how participant groups align or differ. This connects the displayed score with the factors that produced it.

Separate computation from delivery. The job stores scoring history in SQLite and exports static JSON. A Vue dashboard consumes those files through GitHub Pages. Viewing the dashboard does not trigger a new scoring run or depend on the secondary diagnostic API.

Keep external context independent. A separate news pipeline normalizes, deduplicates, and ranks items from configured sources. Source failures are isolated, and news does not participate in the core market score. This allows informational context to evolve independently of the quantitative model.

Solution Architecture

Market data enters a scheduled .NET job for deterministic scoring and explanations. The job stores history in SQLite and exports static JSON to a Vue dashboard hosted on GitHub Pages.

The main runtime follows a single path: source data, scheduled processing, finalized calculations, and published dashboard data. SQLite retains scoring history, while an offline runner supports historical evaluation.

An optional AI interpretation foundation sits after the quantitative outputs are finalized. Its interface, input fingerprint, timeout handling, and output validator are implemented, but no live provider is connected and the feature is disabled by default. It is an extension point for commentary; the implemented explanations remain deterministic.

Engineering Decisions

The most important boundary is between a fact calculated by the product and commentary about that fact. Scores, classifications, drivers, and evaluation results remain the responsibility of deterministic code.

The optional interpretation path accepts only a defined set of finalized inputs. It checks generated text before accepting it and can reuse a previous result only when its input fingerprint matches and validation still succeeds. If the provider is unavailable or its response fails validation, the normal quantitative output is preserved.

The same separation applies to external news. Context can help a reader explore the wider environment without changing the scoring model or blocking the core pipeline when a feed fails.

These boundaries make it possible to develop the analytical model, dashboard, and supplementary features without allowing one to quietly redefine another.

Outcome

SmartMoney has an implemented foundation for explainable market analytics:

  • Reproducible scoring: explicit calculations produce participant scores, market bias, and divergence measures.
  • Traceable explanations: deterministic narratives connect displayed results to their underlying contributions.
  • Historical evaluation: persisted results and an offline backtest runner support investigation across past periods.
  • Precomputed delivery: the Vue dashboard consumes job-generated files without a request-time scoring service.
  • Independent context: news processing and the optional interpretation foundation are separated from the authoritative calculations.

These are product-engineering outcomes. The case study does not establish predictive accuracy, investment returns, measured hosting savings, or a live AI advisory capability. Upstream data reliability and automated test execution remain areas for further hardening.

The broader lesson applies to analytical products beyond markets: define which calculations are authoritative, make their outputs explainable, and give supplementary features explicit limits.

Technologies

  • C# / .NET 8 for scheduled processing, scoring, and evaluation
  • SQLite for scoring history
  • Vue 3 for the analytical dashboard
  • Static JSON for the dashboard data contract
  • GitHub Pages for frontend delivery
  • xUnit test artifacts for scoring and supporting behavior

From proof to your next decision

See the capability demonstrated in this engagement and the thinking behind the approach.

Discuss a similar challenge with the team behind our microsoft & dynamics 365 solutions work.

Start a conversation