9#include "../lorentz/lorentz_transform.hpp"
10#include "../lorentz/beta_calculator.hpp"
21 : config_(std::move(config))
26std::optional<backtest::BacktestComparison>
28 if (bars.size() < config_.min_bars) {
33 std::vector<double> closes;
34 closes.reserve(bars.size());
35 for (
const auto& b : bars) {
36 closes.push_back(b.close);
40 auto returns = compute_returns(closes);
41 if (returns.empty()) {
46 auto betas = compute_betas(closes, config_.max_market_velocity);
50 if (betas.size() > returns.size()) {
51 betas.resize(returns.size());
57 std::vector<backtest::BarData> bar_data;
58 bar_data.reserve(returns.size());
60 for (std::size_t i = 0; i < returns.size(); ++i) {
64 const double raw_signal = 1.0;
67 const double benchmark = 0.0;
72 .benchmark = benchmark,
78 return bt.
run(bar_data, returns);
83std::optional<PipelineBar>
85 stream_window_.push_back(bar);
88 if (stream_window_.size() < 2) {
92 const OHLCV& prev = stream_window_[stream_window_.size() - 2];
93 const OHLCV& curr = stream_window_.back();
96 double price_return = 0.0;
97 if (std::isfinite(prev.
close) && prev.
close > 0.0 && std::isfinite(curr.
close)) {
102 std::vector<double> window_closes;
103 const std::size_t window_size = std::min(stream_window_.size(), std::size_t{5});
104 const std::size_t start = stream_window_.size() - window_size;
105 for (std::size_t i = start; i < stream_window_.size(); ++i) {
106 window_closes.push_back(stream_window_[i].close);
110 auto betas = compute_betas(window_closes, config_.max_market_velocity);
111 if (!betas.empty()) {
123 const double momentum_indicator = price_return * curr.
volume;
124 const auto event = to_event(curr, momentum_indicator);
127 const auto prev_event = to_event(prev, 0.0);
131 interval_type = *cls;
136 .price_return = price_return,
140 .interval_type = interval_type,
147 stream_window_.clear();
153 return stream_window_;
159Engine::compute_returns(std::span<const double> prices)
noexcept {
160 if (prices.size() < 2) {
164 std::vector<double> rets;
165 rets.reserve(prices.size() - 1);
167 for (std::size_t i = 1; i < prices.size(); ++i) {
168 const double prev = prices[i - 1];
169 const double curr = prices[i];
171 if (!std::isfinite(prev) || !std::isfinite(curr) || prev <= 0.0) {
174 rets.push_back((curr - prev) / prev);
183std::vector<BetaVelocity>
184Engine::compute_betas(std::span<const double> prices,
185 double max_velocity)
noexcept {
186 if (prices.empty() || max_velocity <= 0.0) {
190 std::vector<BetaVelocity> betas;
191 betas.reserve(prices.size());
193 constexpr std::size_t WINDOW = 5;
195 for (std::size_t i = 0; i < prices.size(); ++i) {
197 const std::size_t win_size = std::min(i + 1, WINDOW);
198 const std::size_t start = i + 1 - win_size;
199 auto window = prices.subspan(start, win_size);
201 BetaVelocity beta{0.0};
204 window, win_size, max_velocity, 1.0);
209 betas.push_back(beta);
217manifold::SpacetimeEvent
218Engine::to_event(
const OHLCV& bar,
double momentum_indicator)
noexcept {
219 return manifold::SpacetimeEvent{
220 .time = bar.timestamp,
222 .volume = bar.volume,
223 .momentum = momentum_indicator,
Relativistic Backtester — AGT-05 public API.
std::optional< BacktestComparison > run(std::span< const BarData > bars, std::span< const double > asset_returns) const noexcept
std::optional< PipelineBar > process_stream_bar(const OHLCV &bar) noexcept
std::optional< backtest::BacktestComparison > run_backtest(std::span< const OHLCV > bars) const noexcept
std::span< const OHLCV > stream_window() const noexcept
Return a read-only view of the current streaming bar window.
Engine(EngineConfig config=EngineConfig{})
Construct with optional configuration.
void reset_stream() noexcept
Reset streaming state (clear internal bar window).
static std::optional< BetaVelocity > fromRollingWindow(std::span< const double > prices, std::size_t window, double max_velocity, double time_delta) noexcept
static std::optional< IntervalType > classify(const SpacetimeEvent &a, const SpacetimeEvent &b) noexcept
Core Integration Engine — AGT-06 public API.
Momentum-Velocity Signal Processor — AGT-03 public API (implemented by AGT-06).
Spacetime Market Manifold — AGT-02 public API (implemented by AGT-06).
IntervalType
Causal character of a spacetime interval.
@ Timelike
ds² < 0 — causal market movement (β < c)
Lorentz factor γ = 1/√(1−β²). Always ≥ 1.0 for valid beta.
A single time-bar of backtester input.
double raw_signal
Strategy signal before relativistic correction.
Configuration parameters for the core engine.
A single OHLCV bar of market data.
double close
Closing price.
double volume
Traded volume.
Intermediate state for one bar after full pipeline processing.
OHLCV raw
Original bar data.