Trade Bot Dictionary · Economics

eco_anchor

eco_anchor is a stopwatch, not a forecast. It lets your bot enter only in the minutes just before or just after a scheduled US macro release — a Fed rate decision, a CPI inflation print, the monthly jobs report, PPI, GDP, or Fed minutes. It has no view on what the number will be. It knows one thing: what time it is, and whether that time is close to something that is about to move the whole board. Every other signal in this dictionary reads data from somewhere. This one reads a clock.

Bots using it
2 (both out-of-sample, none live)
Data source
A list typed into the module
Refresh
Never — it's a constant
Events on the calendar
55 all of them in 2026
Backtest-replayable
Yes — see catch #3
Anchor module
quants/eco_anchor.py
How eco_anchor gets from a hand-typed calendar to a trade decision Unlike every other signal in the library, eco_anchor has no external source, no poller and no database table. The source is a Python list called ECO_EVENTS inside quants/eco_anchor.py holding 55 release timestamps, all in calendar year 2026, transcribed by hand from the Federal Reserve, Bureau of Labor Statistics and Bureau of Economic Analysis calendars. The poller box is empty: nothing fetches anything, so nothing can go stale and nothing can update. The table box is empty too: the signal registry reports a table called eco_anchor, but no such table exists in any of our databases; the registry matched the name out of the module's own docstring. The gate, eco_anchor_satisfied, converts each event to UTC and asks whether the current time falls between within_minutes_before ahead of it and within_minutes_after past it, for the kinds of release the bot selected. If yes, the engine scans markets as normal. If no, the engine skips the entire scan, because this gate does not depend on any individual market. The lower half of the figure plots all 55 events across 2026 as tick marks: tall marks are FOMC decisions, medium marks are CPI and jobs reports, short marks are PPI, GDP and Fed minutes. Two annotations sit on that timeline. Our price history only begins on 22 June 2026, so only the events to the right of that line can be replayed in a backtest. And the December FOMC tick is drawn in the wrong place: the code says 16 December, while the Federal Reserve's published calendar says the December 2026 statement lands at 2 PM Eastern on 9 December. After the last event on 16 December 2026 the calendar simply stops, and the gate returns false for every timestamp after it, permanently. SOURCE POLLER TABLE GATE DECISION quants/eco_anchor.py ECO_EVENTS = [ … ] 55 release timestamps, typed in by hand every one of them 2026 from the Fed / BLS / BEA NONE nothing fetches this so nothing can go stale — and nothing can correct itself NONE the registry reports a table; we looked in every database and there isn't one eco_anchor_satisfied() is the clock inside −before … +after of a release of a kind this bot asked for? no market data involved YES → scan other rules now apply NO → skip all whole scan short-circuits the two boxes every other signal fills in are empty here — that is the whole story THE CALENDAR · ALL 55 EVENTS, AND WHERE IT STOPS after 16 Dec 2026 the list runs out. The gate returns false for every timestamp after it, until someone types in 2027 — catch #2 price history starts 22 Jun only events right of here can be backtested nothing to the left is replayable the Fed says 9 Dec … … our list says 16 Dec. Catch #1. J F M A M J J A S O N D FOMC CPI · jobs PPI · GDP · minutes Calendar read from quants/eco_anchor.py; FOMC dates checked against federalreserve.gov; price-history start read from predictive.db on 2026-08-10. There is no poller and no table for this signal — verified against the production crontab and every database we run.
The honest version of the pipeline diagram: two of the five boxes are empty. eco_anchor is the only signal in the library whose data never leaves the source file — which is exactly why it is the only one that can be wrong forever without anything noticing.

Where the data comes from

Nowhere. That is not a dodge — it is the design. There is no API call, no poller, no cron line and no table. The entire data set is a Python list called ECO_EVENTS sitting in quants/eco_anchor.py: 55 timestamps, typed in by hand, every one of them in calendar year 2026. Eight FOMC statements, twelve CPI prints, twelve jobs reports, twelve PPI prints, four GDP releases and seven sets of Fed minutes.

The module explains itself, and the reasoning is decent. The Fed and the BLS publish their whole annual calendar a year ahead; the dates rarely move; a poller would add a network dependency, a freshness check and a rate limit to a problem that already has a stable answer. Its own comment names the primary calendars it was copied from — the Federal Reserve's FOMC statement schedule, the BLS release calendar, and the BEA release calendar. When 2027 comes, you append more tuples.

Two things our own registry says about this signal are worth correcting on the page rather than quietly, because you may go and run it yourself:

What it means for your bot

You are not adding an opinion. You are adding an opening hours sign. Two knobs: within_minutes_before and within_minutes_after, plus an optional list of which release kinds you care about (fomc, cpi, nfp, ppi, gdp, fed_minutes; leave it out and you get all six). At least one of the two windows must be set — the builder rejects a config with neither.

Because the gate depends only on the clock and never on the market, the engine treats it as a master switch: when it is shut, the bot skips the entire market scan rather than testing each candidate and rejecting it. That makes it the cheapest gate in the library and the bluntest. It is also, unusually, one of the few signals the backtester genuinely replays — it checks the same list against the timestamp of each historical snapshot, with no database lookup at all. Compare resolution_anchor, which the backtester cannot replay.

The two bots that use it read like this in plain English:

BotKindsWindowStatusTrades ever
FOMC Arb Window — also gated on arb_anchor FOMC, CPI120 min beforeout-of-sample0
CPI Pre-Release Reversion — buys dips into the print CPI, jobs, FOMC180 min beforeout-of-sample1

Note what neither bot does: use the after window. Both are positioning into a release, not reacting to one.

How rarely the light is green

This is the number nobody thinks about when they add the signal. Our replayable price history covers 22 June to 10 August 2026 — 50 days. Here is how much of that window each configuration is actually open for:

ConfigurationEvents in the 50 daysGate open
FOMC Arb Window — 120 min before FOMC + CPI20.34%
CPI Pre-Release Reversion — 180 min before CPI + jobs + FOMC41.01%
for reference: all six kinds, ±90 min71.76%

A bot with this gate is switched off roughly 99% of the time. That is the point of it — but it means every other rule you attach has to earn its keep in a couple of hours a month, and it means a bot that also has to clear a second gate may never fire at all. The arb_anchor page reported that FOMC Arb Window has never placed a trade in its life. This is a large part of why: it must find a cross-book price gap and be inside a 0.34% slice of the clock.

The one trade this signal has ever produced

Between them the two bots have traded exactly once, and it is worth walking through, because it shows both what the gate does well and what it cannot do at all.

On 14 July 2026 at 11:30:10 UTC, CPI Pre-Release Reversion bought YES at 49¢ on the Polymarket contract "Will annual inflation be 3.8% in June?", staking $5.00. The June CPI print landed at 8:30 AM Eastern that morning — 12:30 UTC. The bot entered exactly 60 minutes before the number, comfortably inside its 180-minute window. The gate did precisely what it was built to do.

The contract settled to zero. Annual inflation was not 3.8%. The position closed the next morning for a loss of −$5.00 — the whole stake.

One trade is not a track record, and we are not going to present it as one. It is an illustration: the clock put the bot in the room at the right moment, and then the bot had no opinion about the number, because eco_anchor does not have opinions about numbers. Whatever edge you think you are getting has to come from the rules you pair it with.

The catch

Every signal has one. This one has five, and we found the first while writing this page.

1. There is a wrong date in the calendar

The list schedules the December 2026 FOMC statement for 16 December. The Federal Reserve's published calendar says the December 2026 meeting is 8–9 December, with the statement released at 2:00 PM Eastern on the 9th — and it has said so since the tentative schedule was first announced in August 2024, so this was never a rescheduling. It is a transcription error, one of 55. We checked the other seven FOMC dates and all seven are right; so are all seven Fed minutes dates and the GDP date we could verify.

The consequence is not subtle. On the real Fed day, both bots stay shut. A week later, on a Wednesday when nothing happens, the gate opens for two hours and invites them to trade an event that isn't occurring.

We also could not confirm the August dates. The code puts CPI on 11 August and PPI on 12 August; every release schedule we were able to reach says the July CPI lands on 12 August and the July PPI on 13 August — one day later in each case. We are flagging this rather than asserting it: bls.gov refuses automated requests from us (HTTP 403, from both our office and our server), so unlike the FOMC date we could not read the primary calendar ourselves. Either way the code's 11 August CPI is a date we could not confirm from any BLS source, and if the schedules are right, then the gate opens on the wrong day tomorrow and stays shut for the actual print.

2. The calendar runs out on 16 December 2026 — and nothing will tell you

There is no 2027 in the list. From 1 January 2027, eco_anchor_satisfied() compares every timestamp against 55 events that are all in the past and returns false — every time, until somebody appends a 2027 list by hand. That is a maintenance task, not a mathematical death sentence, but there is no expiry warning, no log line and no health check to prompt it. The module's own comment says "when 2027 rolls around, add a new constant list", and nothing in the system will remind anyone.

Meanwhile a bot with this gate will not error and will not stop. It will simply stop entering — and a bot that enters nothing because its calendar expired looks a great deal like a bot that enters nothing because it found nothing worth trading. Telling those apart means checking whether the gate is short-circuiting the scan, not reading the trade count. Nothing here fails loudly, so nothing prompts you to go and look.

3. It is backtest-replayable — but there is almost nothing to replay

Genuinely good news first: eco_anchor is on the backtester's supported list, and it replays honestly, checking the calendar against each historical snapshot's own timestamp. No lookahead, no fudge. Most signals in this library can't say that.

The catch is arithmetic, and it is our tape rather than the signal. Our market price history begins on 22 June 2026; the calendar itself holds 55 events. Inside the window we can actually replay, FOMC Arb Window's gate is open for two releases and CPI Pre-Release Reversion's for four — so a backtest of either bot is a backtest of two to four macro releases, and the whole entry stack has to share them. That is enough to smoke-test that the gate fires when it should. It is nowhere near enough to estimate whether the idea makes money. A gate that opens monthly needs years of history to say anything; we have seven weeks.

4. A hardcoded list cannot know a release was delayed, moved, or never happened

Scheduled releases are not guaranteed. They get postponed; during a lapse in government funding, statistical agencies stop publishing altogether, and the catch-up schedule afterwards is not the original one. A live calendar feed would show you that. A list of tuples has no way to represent it — there is no "cancelled" field and no way to find out. The gate will open on the old wall-clock time regardless, and hand a bot a window around an event that is not taking place.

The same shape as catch #1, with a different cause: this signal cannot detect that it is wrong. Every other signal in the dictionary has a poller that would eventually fail loudly. This one has nothing to fail.

5. It is a scheduling primitive, not a predictive model

Worth saying plainly because the name sounds analytical, and because we file it under "signals" alongside things that genuinely forecast. eco_anchor does not forecast CPI, does not read consensus, does not know whether the market is priced well, and does not tell you which side to take. It expresses one belief — that information and liquidity risk are concentrated around a handful of timestamps, and that your bot should only be awake for them.

That is a perfectly respectable thing for a gate to be; it is how you express an event-window thesis, not a substitute for having one. But the edge, if there is one, lives entirely in what you do inside the window — and the window is precisely when spreads widen, quotes thin out, and a fill lands further from the mid you were looking at.

How to actually use it

Treat it as a schedule, not a strategy. Three practical notes:

Pair it with something directional. On its own the gate will let your bot buy anything at any price, as long as the clock is right. Both of our bots pair it — one with a cross-book price gap, one with a 45-minute price drop of at least 8¢. The gate decides when; something else has to decide what.

Decide honestly whether you want before or after. The before-window is a bet on positioning and drift into a known event, on thinning liquidity. The after-window is a bet on the repricing — on markets that have just been handed a fact and haven't finished arguing about it. They are opposite trades and the config makes them look like the same knob. Both of our bots chose before, and neither has anything to show for it yet.

Pick your kinds narrowly, then check the arithmetic. Every kind you remove makes the gate rarer. Leave kinds out entirely and you get all 55 events; ask only for FOMC and you get eight a year. Before you commit, work out how many events your window will actually contain over the period you care about — and if the answer is single digits, know that you are running an experiment, not a strategy.

Where to go next

arb_anchor is the other half of our FOMC bot and the clearest example of a gate that needs no forecast; wx_anchor is the most-used signal we have; and resolution_anchor is the one built entirely from our own history. If the vocabulary here is new, start with the glossary and what is a signal?, then how a bot works.

Every claim on this page traces to one of four things: the output of quants/signal_registry.py; the source of quants/eco_anchor.py, quants/strategy.py, quants/engine.py and quants/backtest.py; a read-only query against our own database with its window stated; or a primary calendar we read ourselves. The December FOMC date was checked against the Federal Reserve's published FOMC calendar and its August 2024 tentative-schedule announcement. The August CPI and PPI dates are flagged, not asserted — bls.gov returned HTTP 403 to every automated request we made, so we could not read that calendar directly. Bot configurations, trade history and the price-history start date were read at 7:30 PM UTC on 2026-08-10 and will have moved since. "Bots using it" counts strategies our registry marks live or out-of-sample — here that is 2, both out-of-sample, so no live bot currently trades this signal; the registry's column header says "live bots", which overstates it. P&L is simulated — TinyCorp bots trade paper money only. Verified 2026-08-10.