Start with the Qantiva Workstation for rates, extend it to credit and FX, and let our engineers connect it to everything else you run.
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.
SOFR, €STR and SONIA OIS curves, a SOFR curve stepped on FOMC meeting dates, and government curves: constant-maturity, on-the-run and fitted.
Deliverable baskets, CTD, gross and net basis, implied repo, the switch and delivery options, and option-adjusted basis at the vol you type.
Term repo for every bond off its market's OIS curve, plus specials you set per issue or upload in bulk.
Swap pricing, cross-currency basis and FX swaps, with bucketed PV01 against every instrument the curve is built from.
Swaption grids, FX vol surfaces and SABR on listed options, with option structures priced and run through scenarios.
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.
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, riskGET /v1/toolsAn OpenAI function-calling manifest of every toolqantiva mcpThe same tools for Claude Desktop and Claude Codeqantiva 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"
Curve construction, instrument pricing and risk for fixed income portfolios, built for domestic and cross-border rate markets.
Spread analytics and relative value for investment-grade and high-yield books, measured against the same OIS and government curves your rates desk uses.
FX swaps, cross-currency basis and FX options, with full lifecycle support.
Proprietary quant and dev tools tailored to your strategies: risk engines, backtesting frameworks, data pipelines and trading systems.
Connect your tools and data sources, from Bloomberg, LSEG and FactSet to AWS, Azure, Databricks and Snowflake, into one workflow.
Expert guidance on quant models, technology stacks and engineering practice, from model validation to performance tuning.
From a single integration to a full platform rollout, we build what scales with your business.