# 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() ⇔ converged ``` Error 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`.