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
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:
-
It reports a table named
eco_anchor. There isn't one. The registry harvests backticked names out of a module's docstring, and this module mentions its own name that way. We checked every database we run —predictive.db,quants.db,analytics.dbandtinycorp_signal.db. No such table exists, and none is needed. - It reports the data source as "undocumented". Strictly it isn't — the module names the Fed, BLS and BEA calendars in a comment a few lines below the docstring, and the registry only reads the docstring. But it is documented in the same sense a photocopy is documented: it tells you where the numbers came from originally, not where they come from now. Now they come from the file.
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:
| Bot | Kinds | Window | Status | Trades ever |
|---|---|---|---|---|
| FOMC Arb Window — also gated on arb_anchor | FOMC, CPI | 120 min before | out-of-sample | 0 |
| CPI Pre-Release Reversion — buys dips into the print | CPI, jobs, FOMC | 180 min before | out-of-sample | 1 |
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:
| Configuration | Events in the 50 days | Gate open |
|---|---|---|
| FOMC Arb Window — 120 min before FOMC + CPI | 2 | 0.34% |
| CPI Pre-Release Reversion — 180 min before CPI + jobs + FOMC | 4 | 1.01% |
| for reference: all six kinds, ±90 min | 7 | 1.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.