| name | retrospective |
| description | Subjective retrospective / time-machine analysis: rewind a name to a past point, reconstruct what it looked like THEN (no future knowledge), align the news catalysts to the price path, and pressure-test "if I'd entered there, would it have worked?". Use when the question is about a past moment or a hypothetical entry: "rewind XLE to early April", "what did NVDA look like before earnings", "if we'd bought energy after the Iran headline, easy money?", "replay the SMH spike — policy or earnings?", "was there an entry signal at the time", "would an 8% trailing stop have saved me", "event study on the Hormuz escalation". It strings together the as-of snapshot, the date-windowed news, and the backtest into one honest replay — and it is ruthless about data freshness, because a retro built on a stale or future-leaking price is worse than no retro.
|
Retrospective / Time-Machine analysis
Rewind a name to a moment, see it as it was THEN, attribute the move to
catalysts, and test whether a tradeable edge actually existed. The whole value
is honesty: no lookahead (never use a price the moment didn't yet know) and
no stale data (never report yesterday's close as "now").
The tools (run them — don't answer from memory):
alice analysis snapshot, alice analysis simulate, alice rss window,
alice rss grep / read. (See the alice, alice-analysis skills for the
quant scripting language.)
The freshness gate — DO THIS FIRST, every time
Every snapshot/quant result carries a freshness contract:
asOf, isLatestActual, staleTradingDays, and a freshnessWarning when the
data does not reach the anchor. Before you state any "current" number, check
it.
isLatestActual: false → the close you're holding is STALE. Do not call it
the current price. Say "as of , N trading days behind" and, for
anything live, pull a realtime broker source.
- A free vendor (yfinance) lags a day or two and a free broker tier (alpaca
SIP) may not have today yet. An overnight catalyst can land in exactly that
blind spot — the classic trap is reporting a flat green close while the real
reaction already happened after the bar you can see.
snapshot --query <SYM> auto-picks the freshest source (realtime broker >
delayed vendor). Prefer it over hand-fetching from a delayed vendor.
Procedure
-
Snapshot the anchor (no lookahead). Reconstruct the moment with
asOf — bars never run past it.
alice analysis snapshot --query XLE --asOf 2026-04-03
alice analysis snapshot --query XLE --asOf 2026-04-03 --bars 30
Read the latest print (close, vs-prevClose, day high/low, amplitude —
a sleepy vs-prevClose number hides an intraday plunge-and-recover) and
levels (sma20/50, rsi14, distance from the period high — the "how far off
the top" feel). The snapshot is summary-only by default (the dated path
can be large); add --bars N when you actually need the per-day series.
windowBars tells you how many are available.
-
Align the catalysts to the price. Pull the news IN the window,
oldest-first, and lay the timestamps against the bars.
alice rss window --from 2026-04-01 --to 2026-04-10 --pattern "Iran|oil|OPEC"
Each hit has an ISO time — put it next to the bar it moved. This is how you
answer "was the spike policy or earnings". Coverage is the user's SUBSCRIBED
feeds only: an empty window means "not in the feeds", NOT "nothing happened"
— say so, and don't pretend you saw everything. (Cookie-gated sources —
Barchart options flow, Reddit sentiment — are unreachable from a headless
run; if the call needs them, flag the gap rather than imply full coverage.)
-
Test the entry (backtest the hypothesis). "If I'd bought at the anchor,
would a stop/exit have worked?"
alice analysis simulate --query XLE --entryDate 2026-04-03 \
--exitRule trailing_stop --exitPct 8
Read entry/exit (date·price·reason), returnPct, and MFE/MAE (the
best and worst it went while you held — the round trip a single end-number
hides). open: true means it never triggered the exit; the return is
mark-to-market, not realized. Compare a couple of exit rules — the
interesting finding is usually "the move was real but giving it back to a
loose stop ate most of it", or vice-versa.
-
Most
reads are covered by snapshot; when you must compute over the series and want
the date axis, add to (it returns
for one interval, or when the same
barId appears at multiple intervals, so you can map each value to its day).
Write it down honestly
A retro is only worth as much as its weakest assumption. State, every time:
- the asOf and that the analysis used no later data,
- the source + freshness of every "current" number,
- what you couldn't see (feeds didn't cover it / cookie-gated / SIP didn't
have the latest day) — name the gap rather than paper over it.
The failure mode this skill exists to prevent: a confident call built on a
stale or future-leaking price. When in doubt, distrust the data before the
market.