AlgorithmicAntitrust

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

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.