Round 2: reverting power law and cycle-on-powerlaw tests; one-time holdout run.

Add TrendReversionVol: deviations from the power-law trend follow a daily
AR(1), so uncertainty levels off, optionally plus trend-parameter
uncertainty with an autocorrelation-adjusted effective sample size.

Two experiments, run under the unchanged verdict rule:
- powerlaw-ou: +21% to +45% vs powerlaw at 2-4 years, but slightly negative
  point estimates at 1 month make it inconclusive.
- cycle-on-powerlaw: inconclusive (+18% at 2 years, negative elsewhere).

The holdout (outcomes after 2024-11-26) was scored once, for the four
candidates fixed beforehand. powerlaw is the best long-horizon forecast
(+45% and +58% vs the random walk at 2 and 3 years); nothing beats the
random walk inside a year; cycle fails badly. Results are in the README.
This commit is contained in:
sam
2026-09-24 03:06:21 -07:00
parent b0243adf61
commit 082bcfbbbc
4 changed files with 116 additions and 6 deletions
+28 -1
View File
@@ -24,7 +24,7 @@ from .models.drift import (
TrailingMeanDrift,
)
from .models.shape import Empirical, StudentT
from .models.volatility import CycleVol, EwmaVol, ReversionVol, TrailingVol
from .models.volatility import CycleVol, EwmaVol, ReversionVol, TrailingVol, TrendReversionVol
@dataclass(frozen=True)
@@ -64,6 +64,7 @@ def verdict(variant_summary: pd.DataFrame) -> str:
# Idea labels (D1, V2, ...) refer to docs/2024-ideas.md.
CYCLE = MODELS["cycle"]
DRIFT_RW = MODELS["drift_rw"]
POWERLAW = MODELS["powerlaw"]
# Volatility and shape experiments use drift_rw as the control: the zero-drift
# random walk is biased low at long horizons, so anything that merely widened
# its intervals would look like an improvement.
@@ -138,5 +139,31 @@ EXPERIMENTS: dict[str, Experiment] = {
CYCLE,
(Composite("cycle_fraction", CycleDrift(phase="fraction"), TrailingVol()),),
),
# Round 2. Before running these, the holdout candidates were fixed as:
# the three original models, powerlaw, and any variant below that is
# "better" than its control.
Experiment(
"powerlaw-ou",
"deviations from the power-law trend fade, so long-horizon uncertainty is bounded",
"follow-up to diminishing-returns: powerlaw_revert beat drift_rw, but its bands"
" were too wide",
POWERLAW,
(
Composite("powerlaw_ou", PowerLawDrift(revert=True), TrendReversionVol()),
Composite(
"powerlaw_ou_param",
PowerLawDrift(revert=True),
TrendReversionVol(parameter_uncertainty=True),
),
),
),
Experiment(
"cycle-on-powerlaw",
"with the level set by the power law, the cycle's timing adds information",
"D1 on D3. This pair was already compared informally on the same data after"
" round 1, so only the holdout can really settle it",
POWERLAW,
(Composite("cycle_on_powerlaw", PowerLawScaledCycleDrift(), TrailingVol()),),
),
)
}