Methodology
Every number the engine emits carries a method version and the hash of the exact inputs that produced it. This page is the method for version aac-0.3.0.
1. Alignment and stationarity
Two price paths are put on one grid with forward fill (a posted price stays in force until it changes; interpolation would invent prices that never existed). The grid step is inferred from each series' own median spacing, taking the finest. Correlation and causality run on log returns r_t = ln P_t - ln P_(t-1), never on levels, because two levels that share a cost trend correlate at 0.9 while being independent. Returns are tested for stationarity (ADF) before any vector autoregression.
2. Price Parallelism Index
Per window (1h, 24h, 7d) and per lag k in a small band:
pearson rho_P(r_A,t , r_B,t-k) spearman rho_S(r_A,t , r_B,t-k) concordance share of periods where sign(r_A) = sign(r_B), both non-zero composite 0.4 * max(pearson,0) + 0.3 * max(spearman,0) + 0.3 * max((concordance - 0.5)/0.5, 0)
The best lag per window is kept and reported. PPI for a horizon is the median composite across its windows; the headline is the longest horizon with at least three windows. The lag band exists because a bot that copies its rival one step later has a contemporaneous return correlation near zero and would otherwise read as independent.
3. Lead-lag and reaction latency
Granger causality is run in both directions with the lag chosen by minimum F-test p up to a maximum. The lead index is (1 - p_B→A) · p_A→B when p_B→A is significant, so it is high only when B predicts A and A does not predict B.
Separately, on the raw timestamps, every material change in B (relative size at least 0.2%) is matched to the first subsequent same-direction change in A within 24 hours; the follower's threshold is a quarter of the trigger's, because a seller that answers a 1% cut with a 0.25% cut has still reacted. Latency is in seconds. Reaction speed is 1 - ln(1 + median latency) / ln(1 + 86400). The automated-agent flag requires at least 20 followed events, at least 90% of them under the threshold (30 s by default), and a follow rate of at least 50%.
4. Asymmetric response
r_A,t = c + Σ_k [ b_up,k · max(r_B,t-k, 0) + b_dn,k · min(r_B,t-k, 0) ] + e_t Wald contrast: Σ b_up - Σ b_dn = 0
This is the reduced form of the asymmetric error-correction model used in the fuel-price literature (rockets and feathers). Event-based, the ratchet index averages three non-negative gaps: follow rate up minus down, normalised pass-through up minus down, and normalised latency down minus up. Floor rigidity is the share of competitor decreases the client did not follow at all within the horizon.
5. Human delegation
Acceptance rate of algorithmic recommendations, the longest unbroken acceptance streak, and whether rejected recommendations were larger moves than accepted ones (a reviewer rejects big moves; a rubber stamp rejects at random). Only acceptance above 90% contributes to risk. The high-delegation flag needs at least 100 decisions.
6. Non-public data commingling
Input feature names are normalised (snake_case split) and screened for a competitor term together with a private-state term (occupancy, lease, contract, cost, margin, inventory, booking, realised price) without a public-source marker (posted, listed, advertised, scraped). Provenance tags naming a shared pool, vendor feed or another tenant add to the score, as does transaction-level granularity. This is a screen on names and tags, not an inspection of data flows, and it says so.
7. Cartel screens
Variance screen: windows where the coefficient of variation falls below half its whole-sample baseline while the mean rises above it. Structural break: the single most significant mean shift by binary segmentation on the level and on absolute returns. Benford first-digit test, reported as information only.
8. Simulated competitive nulls
For each pair, three competitive worlds are simulated with the data's own volatility and length: independent random walks; a common cost or demand shock with independent noise; and a human-speed follower matching a public price partially and symmetrically. The identical parallelism statistic is computed on every draw, and the observed value's empirical p is reported under each null. The composite uses the most generous of them: the p under the competitive explanation that comes closest to the data.
9. Multiple testing and the composite
Every p-value that feeds a flag (Granger both directions, the asymmetry contrast, the null calibration) is listed and Benjamini-Hochberg corrected. The pair composite is a stated weighted sum:
0.25 PPI + 0.15 lead + 0.20 reaction speed + 0.15 ratchet + 0.10 floor rigidity + 0.15 null significance
Seller-level risk adds the commingling index and half of the delegation excess above 90%. Overall risk is the maximum over pairs and sellers.
10. The certificate rule
A Certificate of Independent Action is issued only when overall risk is below 0.30 and no flag at high or critical severity fired. Otherwise the same content is issued as an Audit Findings Report. Both are written as canonical JSON, hashed with SHA-256, and appended to an evidence log where each entry carries the previous entry's hash. verify_chain recomputes every hash.
11. Known limits
- Learned tacit collusion in steady state is a stable high level with little co-movement. Co-movement markers see nothing to correlate; the engine's own Q-learning reproduction scores in the certificate range. Detecting that case needs a benchmark: a cost index or a competitive reference period. Until that module exists, the certificate states this limit.
- Reaction latency is bounded by the timestamp resolution of the supplied data.
- Null models bound competitive explanations; they do not exhaust them.
- No index is a finding of agreement. Agreement is a legal question.
12. Sources
The mechanism: Calvano, Calzolari, Denicolo and Pastorello (2020); Klein (2021); Assad, Clark, Ershov and Xu (2024); Fish, Gonczarowski and Shorrer (2024). The screens: Abrantes-Metz, Froeb, Geweke and Taylor (2006); Harrington and Imhof (2022); the OECD's 2017 report on algorithms and collusion. Corrections to any statement on this page are welcome through the contact form.