Methodology.
How everything on TinyCorp Signal is computed — how a bot is backtested, how a signal decides whether to trade, and where every price comes from. The rule we hold ourselves to: every number on the site is either a real backtest result or a settled market outcome. Nothing is illustrative. If you find a mistake — in the math, a source, or a number we publish — tell us; we log the correction in public.
How a bot works
A bot on TinyCorp Signal is just a set of plain-English rules — there is no code to write. You pick:
- a market — a prediction market (Kalshi or Polymarket) or a stock-options contract;
- a side and an entry — what to buy, and at what price or strike;
- signals — optional gates that must be true before the bot trades (e.g. “only when VIX is below 15”);
- an exit — when to close, at expiry or on a rule.
Those rules then go through three honest stages:
- Backtest. We replay your exact rules over real historical prices and show what they would have done.
- Turn it on. Flip the bot live — still simulated; no real money is ever at risk.
- Forward paper-trade. An always-on engine trades the bot going forward on live data, so you see how the same rules behave out-of-sample.
The backtesting engine
A backtest replays your bot one day at a time across historical data:
- On each trading day, the engine checks whether your signals pass. If any gate fails, the bot sits out that day.
- When the gates pass, the bot enters at the real recorded price for that day — never a made-up or favorably-rounded price.
- The position is marked and settled against the real outcome — a prediction market’s settlement, or an option’s value at expiry.
- The day’s profit or loss is added to a running total.
No look-ahead. A signal can only use information that existed on the day it fires — a 5-day momentum reading on June 10 uses June 5–10, never anything after. When the data a day needs is missing, the engine skips that day honestly rather than inventing a fill.
$0 is break-even: above it the strategy is ahead, below it the strategy is behind. That $0 line is the “baseline” — the account starts flat, and the curve is everything the rules earned or lost from there.
The signal library
Signals are the optional gates that decide whether a bot trades. Each is written in plain English and added with a click — no formulas to type. There are 40+ signals for prediction-market bots and 15 live signals for stock-options bots, with new ones shipping regularly.
A signal carries a live badge once it actually filters the backtest, or a soon badge while it is still being wired in — we never let a signal claim to work before it does. Every options signal is verified against a real backtest (it must change the trade set in the documented direction) before it goes live.
The 15 live stock-options signals
| Signal | Only enters when… |
|---|---|
| Volatility — is the option cheap? | |
| VIX below | The market’s fear gauge (VIX) is below your level — i.e. calmer markets. |
| Realized vol below | The stock’s 20-day realized volatility is below your level — a quieter stock. |
| Realized-vol rank ≤ | Today’s volatility is cheap versus the stock’s own past year (a low vol-rank). |
| Vol above SPY | The name is moving more on its own than the market is (idiosyncratic vol). |
| Garman-Klass range vol ≤ | Range-based volatility (using the day’s high & low) is low — cheaper options. |
| Compression — coiled before a move | |
| ATR% range ≤ | The daily range is compressed versus the last 60 days (coiled). |
| Vol squeeze ≤ | A Bollinger-band “squeeze” — the bands are unusually tight, which often comes right before a big move. |
| NR7 range rank ≤ | A “narrowest range in 7 days” bar — a tight day that often precedes a breakout. |
| Trend & momentum — which way? | |
| 5-day momentum > | The stock has risen at least this % over the last 5 days (riding momentum). |
| Above 50-day MA by | Price is at least this % above its 50-day moving average (a short-term uptrend). |
| Above 200-day MA by | Price is above its 200-day moving average by this % (a long-term uptrend). |
| Beats SPY (20d) by | The name is beating the S&P 500 by at least this % over 20 days (relative strength). |
| RSI(14) ≤ | RSI(14) is at or below your level — i.e. the stock is oversold. |
| ADX(14) ≥ | The stock is in a strong trend, not chop — ADX measures trend strength. |
| Off 52-week high ≤ | Price is within this % of its 52-week high (near the highs / breakout zone). |
The full, searchable catalogue — including the prediction-market signals — lives on the signal library.
Stock-options engine
Options bots trade real listed contracts in simulation. The historical data is Alpaca’s daily option bars, covering 20 liquid underlyings — broad ETFs (SPY, QQQ, IWM…) and large-cap single names — on every trading day since 2024. For each entry the engine:
- picks the contract by your rule — a call or put, a strike (e.g. 3% out-of-the-money), and an expiry window (e.g. 7–30 days out);
- enters at that contract’s recorded closing price;
- holds to your exit — expiry, or an engine rule;
- settles at the option’s intrinsic value at expiry — what the contract is actually worth.
Sizing is in contracts per trade, not dollars. An option can cost many times what a one-dollar prediction-market contract costs, so a fixed dollar stake would be misleading — you choose how many contracts each trade buys.
The implied-volatility signals (vol-rank and its siblings) need an implied vol for every historical day. We derive it by inverting the Black–Scholes formula on the option closes we already store — the same number, computed the same way, in both the backtest and the live forward engine, so the two stay consistent.
Forward paper-trading
A backtest is in-sample: it scores rules against history those rules can already see. The forward engine is the out-of-sample check. When you turn a bot on, an always-on process trades it going forward on live data — it opens a position when your gates pass, marks it each day, and settles it at expiry, exactly as the backtest would.
Same rules, prices nobody has seen yet. A bot’s backtest record and its forward record are shown side by side on its page, so you can judge for yourself whether the backtest holds up once it has to face the future.
Data sources
Where every price and settlement comes from. We don’t take revshare from these platforms and we don’t resell their data. Market data — prices and orderbooks — is used only to settle and price trades, never to model an outcome.
| Source | What we use it for | Refresh |
|---|---|---|
| Kalshi public API | Prediction-market metadata, orderbook, and settled outcomes — what weather, econ and sports bots trade and settle on. | 15–60 s |
| Polymarket gamma-api | Cross-platform prediction markets and their settled outcomes. | ~60 s |
| Manifold REST | Market data we read for breadth only. We never trade Manifold — no bot has ever placed a simulated trade there. | ~60 s |
| Alpaca Market Data | Historical and live option bars, quotes and greeks for the stock-options engine (20 underlyings). | daily bars · live quotes intraday |
| FRED (St. Louis Fed) | Macro series behind the economic signals — GDP nowcast, the 2s10s yield curve, jobless claims and more. | per release |
| NWS CLI + METAR | Authoritative settlement values and observations for the weather edge model (below). | minutes–hours |
Weather edge model
Alongside the bots, we run a forecasting model for daily-temperature markets. It exists to answer one question: what will a city’s high or low actually settle at?
- Settlement source. Every weather market on Kalshi settles on the NWS CLI (the daily climate report). That exact document is our ground truth — we never grade against anything else.
- Sub-hourly peaks. We read the METAR RMK 6-hour groups, which capture max/min temperatures at finer precision than the hourly observations and catch peaks the hourly feed misses.
- Bias correction. Raw NWS gridded forecasts pass through a per-city bias table (
nws_bias.json) built from 1,278 city-days of resolved settlements (May–Nov 2025). The table used at forecast time is frozen with the forecast and never recomputed after the fact. - City tiers. Each station is graded on its own track record. In the most recent backtest (391 city-days) the model was within ±1°F 99% of the time, mean bias −0.04°F. Tier-1 stations forecast cleanly enough for narrow brackets; Tier-2 stations get a more conservative read.
No fabricated data
This is the rule the whole site is built around, so it’s worth stating plainly:
- Every performance number is a real backtest result or a settled outcome. We don’t show illustrative returns, “representative” equity curves, or sample trades that didn’t happen.
- When data is missing, we skip. We never fill a gap with an invented price to keep a streak alive.
- Nothing is retroactively edited. A forecast or a backtest is scored against what actually settled — not a number we wish we’d published.
Corrections log
When we ship a fix that affects published numbers we log it here. Older entries are in the repo history.
- 2026-06-19. Site-wide fabricated-stat sweep — every illustrative figure left from early prototypes (builder previews, demo P&L, stale teasers) was replaced with live backtest data or removed.
- 2026-06-14. Retired the
/calibrationscoreboard: it wasn’t backed by a live, audited dataset. The route now redirects here and the methodology was rewritten to honest definitions. - 2026-05-04. Weather: cache-first observation reader; a new
nws_observationstable backs the source cascade so a flaky NWS API doesn’t drop us to FAA-only. - 2026-04-21. Weather: v3 backtest re-derived the city tiers from 391 city-days of resolved settlements.
- 2026-04-18. Weather: Dallas observations routed to
KDFWbecause Kalshi settles at DFW, not Love Field — the map and the settlement station now agree.