Price data
The investable universe is every stock token listed in Robinhood's asset registry for Robinhood Chain (chain 4663) that also has a Chainlink price feed. Today that is 35 tokens: US stocks plus ETFs such as SPY, QQQ, SGOV, SLV, USO and EWY.
Each price is the answer of the token's Chainlink feed. Feed answers include the token's corporate-action multiplier, so dividends and splits that Robinhood applies through the multiplier are already in the price.
Daily closes
A daily close is the last Chainlink round at or before 4:00pm New York time (1:00pm on early-close days) on each NYSE trading day. Feeds update when the price moves 0.5% or once a day, so a close can sit up to 0.5% away from the exchange's official close.
The feeds began on 22 June 2026. Their first rounds that day carried a wrong scale (100 million times too large), so we drop any round more than 20 times away from the median of its batch. The first clean close is 23 June 2026, which is day one of every chart and backtest here.
We use no off-chain price history. History is short, but every close maps to a round id you can look up on the feed contract.
Backtest methodology
- One day at a time. The engine walks trading days in order. Decisions (rebalance checks, trend rules, idle-cash rules) use the previous close. Trades fill at today's close. Nothing looks ahead.
- Costs on every trade. Each dollar bought or sold pays a fee and an estimated slippage, 0.30% and 0.20% by default. You can change both in Studio.
- Deposits. The starting amount is invested on day one by target weight. Recurring amounts land on the first trading day of each week or month and are split by target weight; the cash share stays cash.
- Rebalancing. "On drift" checks every day; monthly and quarterly check on the first trading day of the period. A trade happens only when a token sits further from its target than the band. Sells go first, then buys, funded by what the sells raised.
- Rules. "Deploy cash" invests the excess when cash is above your threshold. "Trend guard" holds a token only while its previous close is above its 20- or 50-day average; otherwise its share waits in cash and is bought back when the trend returns. Averages need that many days of history first.
- Cash. Cash earns nothing in the backtest. If you want T-bill yield, hold SGOV.
- Benchmark. Every dollar you deposit is also put into SPY on the same day with the same costs, so the comparison is fair for recurring plans.
Metrics
| Metric | Definition |
|---|---|
| Return (time-weighted) | Growth of one dollar that stayed invested the whole time; deposits do not inflate it. |
| Profit | Final value minus everything deposited. |
| Volatility | Standard deviation of daily time-weighted returns, annualised with √252. |
| Max drawdown | Largest fall from a peak of the time-weighted index. |
| Sharpe | Mean daily return over its standard deviation, annualised, risk-free rate 0. Shown after 40 days. |
| Risk label | Lower under 18% volatility, higher above 40%, medium between. |
| Market statistics | 7/30/90-day returns are calendar-day lookbacks to the nearest earlier close. Volatility uses the last 60 trading days. RSI is Wilder's 14-day. Beta is against SPY on shared days. |
Policy engine
Plain code with no model in it. Every agent proposal, every Studio backtest and every live order goes through it. Same input, same verdict.
| Check | Fails when | Default |
|---|---|---|
| Permitted assets | A token is not in the registry, has no Chainlink feed, or trading is paused by the issuer. | Eligible list only |
| Position limit | One token's target weight is above your cap. | 40% (hard ceiling 60%) |
| Concentration | Warns when one sector holds more than the cap. | 70% |
| Total budget | The plan needs more up front, or per month, than you allow. | $10,000 · $2,000/month |
| Transaction size | A single live order is above the per-order limit. | $2,500 |
| Slippage threshold | A live quote's price impact is above the limit. | 1.00% |
| Price vs Chainlink | A live fill price is too far from the Chainlink price. | 1.50% |
| Market session | Live orders outside the 24/5 session (Sunday 8pm to Friday 8pm New York time). | Wait for the session |
| Price feeds | Warns when a feed has not updated within 1.5× its heartbeat. | 24h heartbeat |
Paper trading
A paper run takes one saved version of a strategy and moves it forward with simulated money, one real close at a time, using the same engine as the backtest. Its first day is the first close after you press start. It is never backfilled, so a paper record can only be as old as the run. House examples run on paper too, from launch day.
The agent
The agent uses a language model (gpt-oss-120b on Cloudflare Workers AI) for one job: reading your message into settings such as budget, recurring amount, position cap, focus and rules. If the model is unavailable, a plain parser reads the same settings from your words and says so.
Everything after that is code: it ranks matching tokens by published statistics (steadiest first for a careful plan, strongest 90-day move for an aggressive one, return per unit of volatility otherwise), weights them by inverse volatility within your cap, runs the policy engine and the backtest. Each step is shown with the proposal. The agent cannot save, publish, start a paper run or place an order; you do those.
Limits and tiers
Every wallet starts on Free: 5 agent messages a day (10 an hour) and 3 paper runs at once. Studio, backtests and Markets have only a rate limit. Holding $CHEEK in the wallet you sign in with raises those limits once thresholds are published on the $CHEEK page.
Public API
Free, read-only, JSON, rate-limited per IP. No key.
| Request | Returns |
|---|---|
GET /api/markets | Every eligible token with live price, statistics and a 30-close sparkline. |
GET /api/markets/{symbol} | One token: full daily history, SPY history, correlations, strategies holding it. |
GET /api/strategies | Public strategies. Query: category, risk, kind, template, sort (backtest, paper, drawdown, newest). |
GET /api/strategies/{id} | One public strategy with its spec, backtest and policy result. |
POST /api/backtest | Backtest any spec. Body: {"spec": {...}}. |
GET /api/templates | The five templates and the default policy limits. |
GET /api/stats | The numbers on the usage page. |
Strategy spec
{
"template": "rebalance", // buy_hold | dca | fixed_weight | rebalance | rules
"weights": { "SPY": 50, "QQQ": 30, "SGOV": 20 }, // %, CASH allowed, sums to 100
"initial": 1000, // USD on day one
"dca": { "amount": 100, "every": "month" }, // or null
"rebalance": { "every": "quarter", "band": 5 }, // none | drift | month | quarter
"maxPosition": 50,
"rules": [ { "kind": "deploy_cash", "above": 20 },
{ "kind": "trend_guard", "symbol": "*", "sma": 50 } ],
"costs": { "feeBps": 30, "slippageBps": 20 }
}
Paid endpoints for agents over x402 are coming next.
Changelog
8 November 2026
- New hero object: a two-part ceramic body with a real seam and indicator window, circled by aluminium coins engraved with the official marks of the "Tech leaders" example's holdings. An About sheet and the X link are now in the header.
- CheekCache becomes an agentic investing app for tokenized stocks on Robinhood Chain: Markets, Strategies, Studio, Agent, paper trading, the policy engine, the public API and the usage page.
- Daily closes rebuilt from Chainlink rounds since 22 June 2026; mis-scaled first-day rounds are dropped.
- The earlier hamster cards are retired. Old card links open the home page.