C++ API (Phase 1)
cpp
#include "raid/data/io.hpp" // read_bars_csv / read_bars_parquet / read_bars_arrow_ipc
#include "raid/data/calendar.hpp" // MarketCalendar (XNYS)
#include "raid/data/returns.hpp" // intraday_returns
#include "raid/estimators/realized.hpp"
#include "raid/estimators/ols.hpp"
#include "raid/models/garch.hpp"
#include "raid/backend/backend.hpp" // resolve(plan), list_devices()
auto bars = raid::data::read_bars_csv("datasets/fixtures/synthetic_bars_1m.csv");
raid::MarketCalendar cal;
auto& b = bars["SYN1"]; b.normalize(); // sort, dedupe, session index
auto q = b.validate(cal); // QualityReport (counts, coverage)
auto reg = b.filter_session(cal, raid::SessionPolicy::regular);
auto ir = raid::data::intraday_returns(reg); // CSR: r + session_offsets
raid::est::RealizedOptions ro; ro.plan.backend = raid::Backend::automatic;
auto m = raid::est::realized_measures(ir, ro); // rv, bpv, rsv±, rq, jump, tripv; m.stats.backend/precision
raid::est::OlsOptions oo; oo.cov.type = raid::stats::CovType::hac_bartlett; oo.cov.hac_lags = 4;
auto fit = raid::est::ols(X, y, oo); // fit.estimate.to_json()
raid::models::GarchFitOptions go; go.model = raid::models::GarchModel::gjr; go.forecast_horizon = 5;
auto g = raid::models::garch_fit(daily_returns, go); // g.ok() ⇔ convergedError handling: all failures throw raid::RaidError with an ErrorCode (invalid_argument, data_quality, numerical,
not_converged, unsupported, io, api, insufficient_samples, memory, cancelled). Optimisers do not throw on
non-convergence; they return Estimate with convergence.converged = false.