Reconcile/README.md
ayantrader 36e2518353 Reconciliation engine, both hierarchies and the walk-forward evidence
CReconciler projects a set of incoherent forecasts onto the column space of a
summing matrix, which cannot increase total squared error under the orthogonal
projection. The engine knows nothing about markets, so the same object serves a
sixty-node temporal hierarchy over twenty-four free hourly returns and a
twenty-one pair currency graph over seven free log prices.

W is never inverted. It is factorised by Cholesky with an escalating ridge, S is
pushed through the same factor, and the only explicit inverse is taken on the
small m x m normal-equation matrix. Five weightings are available, from OLS
through structural and measured WLS to MinT on the sample and Schaefer-Strimmer
shrunk covariances.

Recon_Inspect measures three exact invariants on every run, the last through an
independent projector so it cannot flatter itself. Recon_Evidence walks forward
with residuals entering the error store only after scoring, and compares loss
differentials with a Diebold-Mariano test using a Bartlett kernel and the
Harvey-Leybourne-Newbold correction.
2026-08-26 09:58:58 +05:00

5.4 KiB

Reconcile

Forecast reconciliation in native MQL5: a projection that makes a set of mutually contradictory forecasts consistent, and provably cannot increase their total squared error while doing it.

Companion code for the MQL5 article: https://www.mql5.com/en/articles/24318

What it does

Run one model per timeframe and the answers disagree. The H1 model describes the next few hours, the H4 model describes the same hours differently, and the D1 model describes a window containing both. All three describe the same stretch of price, so at most one of them can be right. The same thing happens across instruments, where the arithmetic is not a modelling convention: in log space EURUSD plus USDJPY is EURJPY, whether or not you forecast the cross directly.

Reconciliation treats that disagreement as measurable error rather than as something to average away. Write the constraints as a summing matrix S, and the truth is guaranteed to lie in its column space while your forecasts generally do not. Every component pointing out of that subspace is aimed somewhere the target can never be, so removing it cannot move you further from the truth. Under the orthogonal projection that is the Pythagorean theorem, not a claim about markets.

CReconciler implements the projection and knows nothing about markets. It receives a summing matrix and a weighting, and from then on does arithmetic, which is what lets one object serve two structures with no code in common between them: a temporal hierarchy of sixty nodes over twenty-four free hourly returns, and a currency graph of twenty-one pairs over seven free log prices. Five weightings are available, from OLS through structural and measured WLS to MinT on the sample and Schaefer-Strimmer shrunk covariances.

The numerics are the part that decides whether the guarantee survives contact with real data. W is never inverted. It is factorised by Cholesky with a ridge that escalates until it succeeds, S is pushed through the same factor, and the only explicit inverse in the library is taken on the small m x m normal-equation matrix. Three exact invariants are measured on every inspect run: a coherent input returns unchanged, reconciling twice equals reconciling once, and the output satisfies the constraints, the last checked by an independent projector so it cannot flatter itself.

Recon_Evidence.mq5 then tests the theorem instead of asserting it, walking forward one top period at a time with residuals entering the error store only after they have been scored. Loss differentials go through a Diebold-Mariano test with a Bartlett kernel and the Harvey-Leybourne-Newbold small-sample correction, both of which push toward believing the result less. Pooled squared error falls on both hierarchies under the orthogonal projection. Textbook MinT on an unregularised sample covariance does not merely underperform at sixty nodes, it destroys the forecasts it was given, which is a dimensionality problem rather than a verdict on the estimator: the same scheme costs about one percent on the twenty-one node currency graph.

The diagnostic that follows sorts origins by how incoherent the base forecasts were and finds the payoff tracks the contradiction, monotonically. It also finds the uncomfortable half of the same fact. MinT minimises the trace, the sum across all nodes, and a sum will buy a large reduction in fifty-nine terms with an increase in the sixtieth. In a temporal hierarchy the widest node is the cheapest place to put that error, so if you act on a single forecast you should check that node specifically.

Layout

Include/Reconcile/ReconcileTypes.mqh         enums and the dense linear algebra kernel
Include/Reconcile/Shrinkage.mqh              rolling error store, sample, diagonal and shrunk covariance
Include/Reconcile/Reconcile.mqh              CReconciler: the projection and the five weightings
Include/Reconcile/Hierarchy.mqh              both summing matrices, connectivity check, time-keyed loader
Include/Reconcile/BaseForecast.mqh           random walk, window mean and fitted AR(1)
Scripts/Reconcile/Recon_Inspect.mq5          summing matrix, per-node adjustment, invariants, triangle violations
Scripts/Reconcile/Recon_Evidence.mq5         walk-forward over five weightings, DM tests, incoherence buckets
Indicators/Reconcile/ReconciledForecast.mq5  base against reconciled for one node, with the incoherence histogram

Run Recon_Inspect.mq5 first. It prints the structure you are about to trust and the three invariants, and if those are not at machine precision nothing downstream is worth reading. Recon_Evidence.mq5 produces the walk-forward tables. The indicator defaults to the daily node under OLS, which is both the node where base and reconciled visibly disagree and the node the trace is most willing to sacrifice.

Substituting your own models is a single edit: BaseForecast.mqh is the only place that turns a price series into a number, and the engine never asks where the vector it receives came from. Adding a third structure is the same kind of edit at the other end, since nothing downstream of S knows what the constraints mean.

Disclaimer

Educational code. Reconciliation is a forecast-accuracy method, and nothing here demonstrates a trading edge: the directional hit rates it measures are flat before and after. What it improves is squared error, which is a different thing from money. Test on your own data and broker conditions before drawing conclusions.