Solutions

A platform, a team, and the AI to tie them together.

Start with the Qantiva Workstation for rates, extend it to credit and FX, and let our engineers connect it to everything else you run.

Qantiva Workstation

A bond-basis and curve workstation for rates desks. Every build records its quotes, fixings and definition versions, so any number can be traced and reproduced. A missing input fails the build and names what to load. Nothing is estimated behind your back.

Request a demo
01

Curve engine

SOFR, €STR and SONIA OIS curves, a SOFR curve stepped on FOMC meeting dates, and government curves: constant-maturity, on-the-run and fitted.

OISFOMC stepsGovt fits
02

Bond futures basis

Deliverable baskets, CTD, gross and net basis, implied repo, the switch and delivery options, and option-adjusted basis at the vol you type.

CTDOABCalendar rolls
03

Repo & funding

Term repo for every bond off its market's OIS curve, plus specials you set per issue or upload in bulk.

Term repoSpecials
04

Swaps, xccy & FX

Swap pricing, cross-currency basis and FX swaps, with bucketed PV01 against every instrument the curve is built from.

PV01Xccy basisFX swaps
05

Volatility

Swaption grids, FX vol surfaces and SABR on listed options, with option structures priced and run through scenarios.

SwaptionsFX volSABR
06

AI analyst

Claude connected to the workstation's pricing engine: ask for basis, curves or risk in plain English and get answers you can trace back to their inputs.

ClaudeNatural languageTraceable
Market data BloombergLSEGFile feeds

Run your strategies from any language.

Every analytic in the workstation is one HTTP call. Script a basis screen, a curve monitor or a risk report in the language your desk already uses, and get the same numbers the screens show.

  • POST /v1/<group>/<tool>One typed endpoint per analytic: curves, pricing, basis, risk
  • GET /v1/toolsAn OpenAI function-calling manifest of every tool
  • qantiva mcpThe same tools for Claude Desktop and Claude Code
  • qantiva runREST and MCP on one local port, data stays on your machine
# Start the workstation: REST + MCP on one local port
qantiva run --port 8000

# Price the TY basis at 80bp yield vol, keep the bonds that screen cheap
curl -s -X POST http://localhost:8000/v1/bondbasis/basis_analysis \
  -H "Content-Type: application/json" \
  -d '{"contract": "TY", "vol_bp": 80}' |
jq -r '.bonds[] | select(.deliverable and .verdict == "cheap")
       | "\(.label)  net \(.net_32)/32  OAB \(.oab_32)/32"'
import requests

QANTIVA = "http://localhost:8000/v1"

def cheap_basis(contract: str, vol_bp: float) -> list[dict]:
    """Deliverables the model calls cheap at this yield vol."""
    r = requests.post(f"{QANTIVA}/bondbasis/basis_analysis",
                      json={"contract": contract, "vol_bp": vol_bp})
    r.raise_for_status()
    return [b for b in r.json()["bonds"]
            if b["deliverable"] and b["verdict"] == "cheap"]

for b in cheap_basis("TY", vol_bp=80):
    print(f'{b["label"]:<20} net {b["net_32"]:5.1f}/32  OAB {b["oab_32"]:+.1f}/32')
const QANTIVA = "http://localhost:8000/v1";

type Bond = {
  label: string; deliverable: boolean;
  verdict: "cheap" | "rich" | "fair" | null;
  net_32: number | null; oab_32: number | null;
};

const res = await fetch(`${QANTIVA}/bondbasis/basis_analysis`, {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({ contract: "TY", vol_bp: 80 }),
});
if (!res.ok) throw new Error(await res.text());

const { bonds } = (await res.json()) as { bonds: Bond[] };
bonds
  .filter(b => b.deliverable && b.verdict === "cheap")
  .forEach(b => console.log(`${b.label}  net ${b.net_32}/32  OAB ${b.oab_32}/32`));
using System.Net.Http.Json;
using System.Text.Json;

var http = new HttpClient { BaseAddress = new Uri("http://localhost:8000/v1/") };

var res = await http.PostAsJsonAsync("bondbasis/basis_analysis",
    new { contract = "TY", vol_bp = 80 });
res.EnsureSuccessStatusCode();

using var doc = JsonDocument.Parse(await res.Content.ReadAsStringAsync());
foreach (var b in doc.RootElement.GetProperty("bonds").EnumerateArray())
{
    if (b.GetProperty("deliverable").GetBoolean() &&
        b.GetProperty("verdict").GetString() == "cheap")
        Console.WriteLine($"{b.GetProperty("label")}  OAB {b.GetProperty("oab_32")}/32");
}
import java.net.URI;
import java.net.http.*;
import com.fasterxml.jackson.databind.*;

void main() throws Exception {
    var http = HttpClient.newHttpClient();
    var req = HttpRequest.newBuilder(URI.create("http://localhost:8000/v1/bondbasis/basis_analysis"))
        .header("Content-Type", "application/json")
        .POST(HttpRequest.BodyPublishers.ofString("{\"contract\":\"TY\",\"vol_bp\":80}"))
        .build();

    var res = http.send(req, HttpResponse.BodyHandlers.ofString());
    if (res.statusCode() != 200) throw new IllegalStateException(res.body());

    for (JsonNode b : new ObjectMapper().readTree(res.body()).get("bonds")) {
        if (b.get("deliverable").asBoolean() && "cheap".equals(b.get("verdict").asText()))
            System.out.printf("%s  OAB %.1f/32%n", b.get("label").asText(), b.get("oab_32").asDouble());
    }
}
# Give Claude the whole workstation as tools
claude mcp add qantiva -- qantiva mcp

# Then ask in plain English
claude -p "Run the TY basis at 80bp vol and list the bonds that screen cheap, with their OAB"
localhost:8000 Same engine, same numbers as the workstation screens
Asset coverage

Rates first, with credit and FX alongside.

Rates

Curve construction, instrument pricing and risk for fixed income portfolios, built for domestic and cross-border rate markets.

CurvesFutures basisRepoVol
New

Credit

Spread analytics and relative value for investment-grade and high-yield books, measured against the same OIS and government curves your rates desk uses.

  • Spread curves per issuer and sector, fitted to bonds or CDS
  • Z-spread, I-spread and asset-swap spread on each bond's own conventions
  • CDS curves and survival probabilities, with bond–CDS basis
  • Relative value: rich/cheap to the fitted curve, by issuer and tenor
  • Risk: CS01, spread duration and jump-to-default by name
IGHYCDSBond–CDS basis

FX

FX swaps, cross-currency basis and FX options, with full lifecycle support.

FX swapsXccy basisFX options
Services

Engineers who speak the desk's language.

Custom Tool Development

Proprietary quant and dev tools tailored to your strategies: risk engines, backtesting frameworks, data pipelines and trading systems.

Risk EnginesBacktestingData Pipelines

System Integration & Data Engineering

Connect your tools and data sources, from Bloomberg, LSEG and FactSet to AWS, Azure, Databricks and Snowflake, into one workflow.

BloombergLSEGFactSetAWS/Azure

Technical Consulting

Expert guidance on quant models, technology stacks and engineering practice, from model validation to performance tuning.

Model ValidationArchitectureOptimization

Tell us what your desk needs.

From a single integration to a full platform rollout, we build what scales with your business.