Loading local snapshots…
How to interpret these signals
Theoretical flips assume a passive buy at the observed low and a sale at the observed high. These are different past trades, not executable quotes. Tax is estimated per item. A positive margin does not guarantee a fill or profit.
Each component is capped at 100: liquidity uses log10(1 + the smaller hourly side volume) / log10(1001) × 100; net ROI reaches 100 at 5%; discount to the volume-weighted hourly average reaches 100 at 5%. Negative ROI and premiums score zero in those components. Weighted contributions add to the research score. This provisional heuristic has not been validated for predictive value.
Both prices must be recent, both hourly sides must pass the volume threshold, and the after-tax margin must be positive. Missing or stale inputs exclude an item. The hourly reference is not a 24-hour average. Buy limits are not guaranteed volume. Bonds are excluded because resale conversion costs are not modeled.
| Item | Buy assumption | Sell assumption | Net GP / item | Hourly volume | Score / 100 | Flags |
|---|
No items match. Fetch data, change the filter, or inspect “All observed items” for exclusion reasons.
Signals from collected history
Score components
| Component | Value / 100 | Weight | Contribution |
|---|
Signal explanations
Imported historical averages
| Window | Coverage | Mean GP | Median GP | Std dev GP | Low-price deviation | Z-score | Endpoint momentum | Return volatility |
|---|
7/30-day windows end at the imported period end, not necessarily now. Statistics require every interval to have usable prices and volumes. Mean, median and standard deviation describe volume-weighted interval prices. Momentum compares the first and last interval averages; volatility is the standard deviation of interval returns, not annualized. These descriptive statistics do not change the research score.
Same time each year?
A Christmas item that climbs every December would be worth knowing, and nothing else here can see it: a z-score compares a price with its recent past, never with the same week last year. Each month is shown against its own year's average, so an item that doubled in price does not read as rising every month.
| Month | Years seen | Median vs its year | Spread | Each year |
|---|
Imported intervals and item volumes
| Interval start | Average high | Average low | High-side volume | Low-side volume |
|---|
Paper portfolio
Record a simulated purchase of this item at the latest observed low. No GP is spent and no trade is placed.
Locally collected price history
History values and trade times
| Captured | High | High trade time | Low | Low trade time |
|---|
Predicted opportunities
This is the only thing here that predicts. Every state in the imported history — where a price sat against its own trailing window, how it had moved, how it had been traded — is paired with what followed it, and the pattern in the earlier part of that history is applied to today. The ranking below is what that model says about the next few intervals.
Read the held-out measurement first. The model was fitted on the earlier part of the history and then tested on the later part, which it never saw. If the highest-predicted slice of that later period did not beat the lowest, the ranking is a list of items and nothing more, and it says so above the table.
What is predicted is relative: how far an item beats the rest of the market over the hold, not what it returns on its own. A day when everything rose is not skill, and fitting on the raw return would let it look like skill. The realised columns show both, because they answer different questions — what holding it actually did, and what the model was trying to predict.
Loading…
What the held-out period did
| Predicted slice | Observations | Items | Predicted | Realised median | Against the market | Realised mean | Positive |
|---|
How far it survives into items you could actually buy
Turnover is volume times price — the GP an item moves per interval. Volume on its own is counted in items, not trades and not money, which makes it useless for comparing one item with another: the model's highest-ranked picks move a few hundred thousand GP a day while a Death rune moves 6.4 billion, and on item count they look alike. The Wiki publishes no trade counts at all, and the distinct trades this app observes are censored at roughly one per capture, so turnover is what stands in for them.
| Items moving at least | Items | Observations | Rank correlation | Top fifth | Bottom fifth | Gap |
|---|
Today's ranking
| Item | Predicted | Over | Last interval average | Turnover / interval | Median price | As of | What is driving it |
|---|
No item has enough recent imported history to be ranked. Enable backfill_per_capture and let it run, or import history for an item by hand from its detail panel.
How the model works, and what it cannot be
For each feature, the training history is cut into five quantile bins, and each bin records how much the trimmed-mean forward return inside it differed from the overall figure. This started out using medians and measurably threw the fit away: over a year of real daily averages, 8% of seven-day outcomes are exactly zero — illiquid items whose published average does not move — so the pooled median is 0.0000%, and so was the median of most bins. Twenty-four of thirty fitted lifts came out at exactly zero and the model ran on the remaining six. That is structural rather than a shortage of data: more history adds more of the same point mass. A tenth is trimmed from each tail before averaging, because the raw mean of this distribution is +12% against a standard deviation of 1,500% and describes a handful of enormous recoveries.
The measurement is reported at every rung of a turnover ladder, because the decay across those rungs is itself the result. Measured on 500 backfilled items, the gap between the highest- and lowest-predicted fifths runs +3.23% over everything, +2.00% above a million GP a day, +1.64% above fifty million and +1.57% above a hundred million. The edge is concentrated where it cannot be used: the model ranks on predicted percentage alone, and prices are integers, so on a 2 GP item a one-GP tick is a 50% move. The ladder is computed from whatever history has been imported, so it moves with coverage — at 197 items the top rung read +0.68%, at 500 it reads +1.57%, so some of that steepness was coverage rather than the market.
Two floors, answering two different questions. Turnover says whether the market can absorb a position. A price floor of 100 GP says whether a percentage is meaningful at all: prices are integers, so a one-GP tick is 1% at 100 GP and 25% on a 4 GP fire rune, and below that the tick is the prediction. An item can pass one and fail the other in both directions, so neither substitutes for the other.
Volume on its own was the first attempt and barely moved the figure, because it counts items rather than money. A price floor of 1,000 GP was the second, and was worse than useless — it threw out Death rune, Chaos rune, Coal, Nature rune and Gold ore, all moving billions a day, for costing under 200 GP. The mistake was the level, not the instrument. At 100 GP the floor removed 49 of 286 items and raised the held-out gap from +1.77% to +2.16%, so what it took out was noise rather than signal.
A large turnover is still not proof of a liquid market: it can be a handful of bulk trades, and nothing here can tell the difference.
Both floors gate the forward test. liquid10-7d commits only to items clearing them, because filling the record with positions nobody could have taken — or whose predicted move is rounding — would look like a result and could not have been one.
Each bin records how much the trimmed-mean forward return inside it differed from the overall figure. An estimate is that overall median plus one such difference per feature, so every prediction decomposes into named contributions, the same way the research score does. A bin with too few observations behind it contributes nothing rather than a number drawn from too little to mean anything.
The estimate is not calibrated in level. The features are correlated, so adding their separate lifts counts the same information more than once and the magnitude is too large by an unknown factor. Only the ordering was measured, and only the ordering is worth reading. A predicted +4% is a claim that the item is ranked above one predicted +1%, not a claim about four percent.
Prices are interval volume-weighted averages, so an outcome is drift in a published series: no spread is captured and no tax is charged, because neither is observable at this resolution. The decision point is the close of an interval, the entry is the interval after it, and the outcome is read after that — so no feature can depend on a price that did not exist when the decision was made. A missing interval is a gap and is never bridged.
The fit never saw the held-out period, but a person chose the features after looking at this market, and no held-out split protects against that. The only thing that does is committing to picks before the outcome exists, which is why these picks are also committed to the forward test as predicted10-24h — and committed only while the fit is still passing its held-out check. A state that resembles a past state is also not that state: the model has no notion of an update, an event, or anything else that reprices an item for a reason.
Flagged for a closer look
Loading…
| Item | Score | Confidence | Why | What would make it wrong |
|---|
How these are chosen, and what they are worth
Claude is given the app's own candidates with every number already computed — price, net GP after tax, ROI, volume, z-score against the item's own history, flags — and asked which are worth holding for the next day, and why. It is told not to recompute any figure, not to predict a price, and to pick only from the list it was given. Any item it names that was not offered is dropped rather than looked up.
What it adds is the part no price series contains: what an item is for, who buys it, what usually moves its demand, and whether a pattern has a plausible cause in the game. What it cannot do is forecast. A confident reason is a claim about its reasoning, not about the market.
Its picks are committed to the forward test as ai10-24h and settled like every other strategy, so there will be an answer about whether they beat the research score and beat random picking, rather than an impression. Until then these are leads to look at, not calls to act on.
Forward test
At every capture, each strategy below commits to the items it would buy, at the price observed then, for a period fixed in advance. When that period elapses the position is settled once, at the next capture's observed price. Nothing about a pick can change after it is made, because the record is written before the outcome exists.
Loading committed picks…
What this can and cannot show
The control strategies pick at random from the same pool of eligible items. Without them a positive return means nothing, because the whole market may have risen. A scored strategy has to beat its control to be interesting, and beating it over a short run is still not evidence.
Several strategies run at once. Reporting only the best of several would find a winner in pure noise, so they are all shown together and the count is stated. Each is fixed and named; changing a rule means adding a new strategy, never editing one, because an edited rule would silently rewrite what already-settled records mean.
Read the median drift column. Not the mean, and not ROI. The mean of this distribution is meaningless: prices are integers, so a 3 GP item that prints 119 GP is a +3,867% drift, and a dozen of those carry an average over thousands of positions — one strategy here read +1,828% mean against a +13.6% median. Only the predicted strategies gate on turnover and price; the others can and do pick such items.
ROI assumes buying at the observed low and selling at the observed high, which no single trade does; and net ROI is 40% of the research score, so a scored strategy picks wide-spread items by construction and will beat a random control on ROI whether or not the score predicts anything. Drift compares low to low. It is the part the selection does not already determine, and so the only side of this that could be evidence.
Entry and exit are observed past trades, not fills. No order was placed and nothing competed for the same offer. Size is capped at a tenth of the thinner side's hourly volume and at the buy limit, which are assumptions about what the market absorbs, not measurements. A position whose price cannot be observed at settlement is abandoned with a reason and left out, never guessed at.
| Strategy | Held | Open | Settled | Mean ROI | Median | Hit rate | Worst | Best | Median drift | Mean drift | Worst drift | Best drift | Net GP |
|---|
The most recent commitments and how they settled
| Strategy | Item | Rank | Score | Committed | Due | Entry | Exit | ROI | Outcome |
|---|
Suggestion history
Every pick this app has committed to, and what happened to it. Succeeded means the price went up — the item's observed instant-sell price was higher when the position settled than when it was committed. That is the unflattering measure, and it is the headline for the same reason the forward test reads drift rather than ROI.
Each row also carries what was true when the pick was made: the flags it had, its z-score, its predicted return, and Claude's reason where there was one. Those were written down at commitment and never revised, so the reason can be read beside the result instead of reconstructed from today's numbers.
Patterns
Cut the settled record one way at a time and compare each group against what every suggestion did. A group below fifteen outcomes reports that instead of a number.
Loading…
| Group | Settled | Items | Succeeded | Success rate | vs. all | Median move | vs. all | Worst | Best | Median ROI |
|---|
Every suggestion
Loading…
| Item | Strategy | Rank | Committed | Entry → exit | Move | ROI | Outcome | What was true at the time |
|---|
No suggestions match. The forward test commits picks at every capture, so this fills up as captures accumulate.
What this can and cannot show
An abandoned suggestion had no usable price at settlement. It is listed and counted, but excluded from every figure, because an unmeasurable outcome is not a flat one — and dropping those would quietly select for the items that stayed liquid.
The risk on this page is the search itself. The record can be cut eleven ways, each into several groups. Slicing one overlapping record enough ways finds a pattern in it whether or not there is one, so the number of groups examined is reported with every table, and a group that stands out is a thing to watch rather than a thing to act on.
Suggestions committed at the same capture share one market and the same items recur across captures, so these are not independent samples. No significance is computed and none should be read in. Entry and exit are observed past trades, not fills: nothing was bought, nothing competed for the same offer, and the quantity is an assumption.
ROI is shown beside the move and is the flattering measure. It books a spread no single trade captures, and net ROI is 40% of the research score, so a scored strategy picks wide-spread items by construction whether or not the score predicts anything.
Has the score been any good?
This measures the model against captures you already collected. It is not a prediction, and it cannot become one.
Loading saved scores…
How this is measured, and what it cannot tell you
Every capture stores each item's score. Each scored capture is paired with the earliest later capture at least one horizon away, and the outcome measured is the trade the score describes: buy at the entry capture's observed low, sell at the exit capture's observed high, less per-item GE tax. Price drift compares the two lows instead, separating market movement from spread capture.
Scores are read exactly as they were stored, under the settings and model version in force at capture time. Recomputing them under today's settings would be rewriting a prediction after seeing its outcome. Changing your weights therefore does not change any figure here.
An item with no usable exit observation is dropped and counted, never carried at its entry price. Bonds are excluded throughout. Overlapping windows and repeated items are not independent samples, so no significance is reported: a rank correlation is shown as a description of ordering only. A favourable result here is not evidence the score works.
| Entry score | Outcomes | Items | Mean ROI | Median ROI | Positive | Worst | Best | Mean drift |
|---|
Outcomes that could not be measured
Backtest on imported history
The forward test is slow and honest. This is fast and fragile: it replays the oversold rule over history already imported from the Wiki, so a year of data answers in a second. It exists to generate hypotheses, and the forward test exists to judge them. A result here is a reason to put something under forward test, never a reason to act.
Loading…
| Set | Entries | Items | Median | Trimmed mean | Raw mean | Positive | Worst | Best |
|---|
Paper portfolio
Loading saved paper positions…
How paper positions are priced
Simulation only: no GP is spent, no trade is placed, and nothing is sent to RuneScape. A position can only be opened at the latest capture's observed low and closed at its observed high, so no entry or exit price is ever invented. If that observation is missing or stale, the action is refused.
Open positions are marked against the selected snapshot using the patient exit: selling into the observed instant-buy price, less per-item GE tax. The immediate exit sells into the observed instant-sell price instead, and is the worse case rather than a second opinion. Both are past observed trades, not achievable fills.
A position whose current observation is missing or stale is shown with its last computed figures but excluded from the totals, and counted as unvalued. A closed position keeps the price, tax, and tax policy recorded at the moment it was closed; it is not recalculated. The research score at entry is stored so the model can later be checked against what actually happened.
Open positions
| Item | Quantity | Unit cost | Cost | Patient exit net | Immediate exit net | Unrealised | ROI | Held | Entry score | Basis | Actions |
|---|
No open paper positions. Select an item above and record a simulated purchase.
Closed positions
| Item | Quantity | Cost | Sold at | GE tax | Net proceeds | Realised | ROI | Held | Entry score | Actions |
|---|
No closed paper positions yet.