Track Record

Conviction accuracy, recommendation drift, and the price journey since each report was published.

Public-facing accountability for research calls. Not financial advice.

Summary

Total reports
-
Current CONVICTION BUY
-
Current BUY
-
Current OPPORTUNISTIC
-
Current SPECULATIVE
-
Conviction unchanged since publish
-
Conviction upgraded
-
Conviction downgraded
-

Important context

  • This page is public. It shows published research only. No position information, no cost basis, no portfolio data.
  • Conviction history vs price history. Conviction is a 0-100 score that reflects the research view at the time. It is not a price target. The price journey below is the published price only; I do not store historical intraday data.
  • No back-tested results. Reports are only listed from the date of first publication. Earlier conviction history (where present) reflects score changes for the same company, not a back-tested pre-publication view.
  • Survivor bias. Companies that delisted, were acquired, or otherwise left coverage are not in this view.
  • Not a guarantee of future results. Past conviction accuracy is not predictive of future calls. Markets change. The framework is judgement-driven.

What we got right, and why we got it wrong

Analysis period: 2026-04-11 to 2026-08-06 (about 4 months). 378 directional calls covering 219 right and 159 wrong, with 20 calls flagged (sub-dollar at call or one-way move > 999%, excluded from hit rate).

The headline

Across 378 directional calls, 58.0% were directionally right. BUY-side average return was +6.9% on a median hold of 101 days, so the right-rate comes with a positive expectancy, not just a coin-toss. The wrong calls averaged -14.0% so the asymmetry is genuine: right calls lock in modest gains, wrong calls lose roughly twice as much.

Where we got it right

UniverseCallsRightWrongRight %
Fortune 10080582272.5%
AI Infra2619773.1%
S&P 1002114766.7%
Irish37241364.9%
UK99554455.6%
Space 6042231954.8%

What these universes have in common: large, liquid, public-traded names with stable sector exposure and multiple quarters of operating history. The model's thesis could be tested against actual financials rather than sentiment. BUY at 64.6% was the strongest single tier: the highest-conviction tier is where the methodology's six independent gates all pass, and the gates do their job there.

Where we got it wrong

UniverseCallsRightWrongRight %
Watchlist47182938.3%
Power Energy93633.3%
Physical AI1651131.2%

Five specific patterns in the wrong calls:

  1. Pre-revenue / shell / story stocks. BK -87.4%, YSS -59.6%, QED -58.1%, FCM -46.2%, BOKU -40.1%, OKLO -41.4%. Tick targets with no current revenue, often thinly traded, dominated by narrative. The model discounts the lack of fundamentals, but not enough. Several of these were published as OPP BUY at conviction 49-65 where the right answer was SPEC BUY at conviction 35 or AVOID.
  2. The April regime shift that we did not walk back. Right rate was 60% in April, 47% in June, 38% in July. The defensive-commodity-space selloff in Q2 caught tier levels that were set in April; once the broader sector turned, conviction scores did not decay with it. The methodology re-uses snapshot data but does not refit tier weights to detected regime change.
  3. AVOID is too narrow a tool. We published 9 AVOIDs over 4 months on 378 directional calls (2.4% of calls). Of those 9, only 5 avoided a subsequent positive move. We did not flag the larger losers (CRWD -50%, ARM-style names, JPM dim names) because the scanner only filters thinly-traded microcaps and pre-revenue shells.
  4. Scenario weighting was always bullish. Even on tickers that subsequently lost 30-50%, the published scenarios often sat at 30% bull / 50% base / 20% bear. The model's base case is too generous when the underlying beta is high and the bear case often fails the test in pre-revenue names.
  5. Same model, opposite outcomes across AI Infra vs Physical AI. AI Infra hit 73% (large-cap public-traded semis, hyperscalers, cybersecurity). Physical AI hit 31% (pre-revenue space, defence, quantum). The methodology could not distinguish "profitable AI bet" from "story-stock AI bet" and treated them identically.

Why the rights were right

The methodology has six independent gates that must all pass for BUY. That structure filters out weak theses. What got through tended to be large-cap, liquid, public-traded names with years of operating history, where fundamentals actually drove the price move rather than sentiment. Add a strong sector tailwind (AI compute, energy demand, defence) and the model's direction typically matches the market.

Why the wrongs were wrong

The same six gates, but applied to tickers that either:

  • had no fundamental driver (pre-revenue, no earnings, narrative-led);
  • caught a rolling 2026-Q2 selloff the model had no regime detector for;
  • slipped through because the AVOID scanner only fires on thinly-traded microcaps.

What changes would lift this

  1. Stronger bear-case floor when fundamentals are thin. Tick targets with null freeFloat, null earningsDate, or null sector auto-tier down to SPEC BUY at conviction cap 35 (or AVOID). OPP BUY at conviction 65 on a shell produces a 50%+ drawdown.
  2. Add a regime-shift detector to the methodology. If the Sheet's overall median move is -10% in 30 days, every conviction score decays by 10. A global risk-off event currently requires regenerating 350 reports individually.
  3. Raise AVOID call rate. 2.4% AVOID rate on 378 calls is an order of magnitude too few. Auto-tiering low-conviction (30-49) tickers to AVOID instead of SPEC BUY improves downside protection, and the data shows the AVOIDs we did publish were right more than half the time.

Note: a handful of the worst-looking single moves (BK -87.4%, ASTS, JROOF etc.) are flagged in the underlying dataset as "price snapshot may reflect a corporate action, split, or currency-conversion miss." The percentages above use the displayMovePct column from reports/track-performance.json, which excludes those single-issue cases. The aggregate right-rate number is robust to those edge cases.

Tier x month drift (Table 1)

The single biggest finding from the deeper audit. Right rate is the unflagged set, by month of first call and first-call tier. Read across rows to see whether a tier was right on calls made that month; read down columns to see whether a tier's right-rate decayed over time.

MonthCONV BUYBUYOPP BUYSPEC BUYAVOID
Loading from track-analysis.json...

Numbers are loaded client-side from /track-analysis.json on page load. If a cell shows "--" it means there were no unflagged calls in that tier x month bucket.

Right rate by entry timing (Table 2)

The single biggest predictor of a wrong call. We measure how far above the buy ceiling the price was when we made the call. At-or-under the buy ceiling: 100% right, mean +38.0%. The more overextended we were, the worse the call. Calls made when the price was already 50%+ above the buy ceiling had only a 21.4% right rate with mean -17.7%.

Distance from buy ceiling at callnRight %MeanMedian
Loading from track-analysis.json...

The buy-ceiling distance is computed against the *current* entryFramework.buyCeiling - what we'd use today. A name with no buyCeiling (AVOID-tier calls) sits in the "no buy ceiling" bucket at the bottom.

Decay curve (Table 3)

Right rate as a function of how long ago the call was made. Calls in the 0-30 day window are 81.6% right; calls in the 30-60 day window drop to 47.4%; calls in the 60-90 day window drop to 37.5%. This is the structural evidence for the regime-shift detector: a methodology that decays conviction in risk-off regimes would have walked back the older stale calls before they went wrong.

Age of call at evaluationnRight %MeanMedian
Loading from track-analysis.json...

The 20 excluded calls (Table 4)

20 calls are flagged as "penny" (sub-dollar at call) or "spike" (one-way move exceeding 999%). They are excluded from the headline right-rate calculation but the underlying moves are real. Of the 20, 11 were AVOIDs, 6 were SPEC BUY, 3 were OPP BUY. The AVOID cohort mostly spiked, which is why the AVOID call's meanMovePct is misleading: half of them were sub-dollar names that 50x'd. The 4 most extreme:

TickerTierConvictionMove %Flag
Loading from track-analysis.json...

Filter

Ticker Company Pub'd Orig. Curr. Chg. Rec. Updated Move
Loading...