pnlbench. Paper trading
METHODS / controlled-allocation-v3

What this experiment measures

PnL Bench is a prospective, constrained portfolio experiment. It tests whether Jev’s allocation choices improve on equal weights for the same selected stocks. Separate deterministic controls distinguish allocation and selection effects; SPY provides a market reference.

Protocol v3 defines the study from its first eligible fill. All published decisions, costs and performance belong to this experiment.

01 / DESIGN

Five portfolios, different questions

Each portfolio starts with $10,000 in simulated capital at the same first eligible execution opportunity. Accounts have independent cash, shares, costs and dividends. They allow fractional shares, prohibit shorting and leverage, and do not let the model time the market with cash.

PortfolioPolicyInterpretation
Jev allocationJev selects ten issuers and chooses one feasible allocation.The constrained model-assisted strategy.
Equal-weight controlThe same Jev shortlist, with 10% target weights.Primary comparison: allocation value conditional on selection.
Inverse-volatility controlThe same Jev shortlist, deterministically weighted inversely to historical volatility and projected onto the same constraints.Whether choosing allocations adds value beyond a supplied formula.
Momentum controlDescending completed 20-session return relative to SPY; ten issuers, equal weights and the same eligibility/sector rules.A fixed non-AI stock-selection reference, not an optimized strategy.
SPY referenceOne initial purchase of SPY; distributions remain cash.The market opportunity-cost reference, not risk-adjusted alpha.

The primary endpoint is the difference in cumulative net return between Jev allocation and its equal-weight control over 126 trading sessions from first fill. Inverse volatility is a predeclared critical control. Other comparisons and risk measures are secondary; the application does not declare a statistical winner.

02 / DATA AND INFORMATION SET

Observed information, with explicit limitations

The current collector uses Yahoo Finance’s unofficial endpoints and Wikipedia’s observed constituent list and company summaries. An official replacement feed is not activated until access, coverage, adjustment semantics and public-display rights are verified. A public API key or a free account alone is not evidence of redistribution permission.

Every collection shard uses the same completed-minute price cutoff, fixed twenty minutes before the workflow starts and capped at the regular-session close. The price timestamp denotes the minute cutoff, not a guaranteed executable quote. Indicators have their own completed-bar timestamps; collection and availability times are retained separately. Yahoo’s adjustment convention is labelled unverified. Stock and benchmark quote timestamps must be closely aligned; this is a quote-based simulator, not evidence that a broker could execute every position at those prices.

Daily caches contain only bars completed when fetched. The cache key changes with the latest completed exchange session, including early closes and a fifteen-minute completion buffer. A cached partial row cannot become a completed close merely because time passes. Daily histories must end on the expected completed session.

The selection request contains business context, sector, price, hourly and daily RSI14, one/five/twenty-session returns relative to SPY, historical volatility and timestamps. Supplemental context includes available intraday change, approximate dollar volume and relative performance against the observed sector peer group. Unavailable earnings dates, relative volume, overnight gaps and fundamentals remain null—not zero or invented facts.

Company descriptions are contextual data, not current news. The system does not yet have an activated earnings, news or financial-statement provider. Input enrichment must preserve publication timestamps and begin as a separately identified protocol, not an unnoticed addition to a measured series. Wikipedia membership is an observed list, not an official point-in-time constituent database.

03 / MODEL TASK

A forecast with a defined outcome

At most one Jev invocation is attempted per New York trading session. If the scheduled collection fails before any model request is sent, later eligible checks in that same session retry with a newly collected snapshot. Positions are held through those failures. Eligible stocks are scored in alphabetical batches of at most 100, with shared definitions and a SPY reference. Repeated provenance is stored once and referenced by index; financial inputs are not removed to shorten a request. Each request is checked against a 60,000-byte safety bound before transmission. This is not an exact token count. Identical instructions do not prove cross-batch invariance; batching remains part of the policy.

The forecast runs from the next eligible entry observation through the close of the first regular session with a later New York date. The outcome is stock total return minus SPY total return, in percentage points. Every screened stock receives a forecast record, not only the selected ten.

LabelRelative-return interval
Much lowerBelow −1 pp
Lower−1 to below −0.25 pp
Similar−0.25 to below +0.25 pp
Higher+0.25 to below +1 pp
Much higherAt least +1 pp

Uncertainty belongs in the probability distribution, not automatically in “Similar.” The numeric score is the probability-weighted mean of label indices 0–4; it is not an expected percentage return. Confidence measures concentration of the returned distribution, not the probability that a trade will be profitable.

The forecast ledger fixes entry eligibility and the outcome horizon independently of later portfolio trades. The resolver incorporates retrieved splits and cash distributions, retains missing outcomes, and reports rank correlation and multiclass Brier scores for resolved records. Rounded probabilities are normalized for scoring. Results remain provisional with respect to upstream data quality; an absent or unusable price is not a zero return.

04 / CONSTRUCTION

Constraints applied by code

Stocks are ranked by score, with alphabetical tie-breaking, one class per issuer and at most three issuers per sector. Ten eligible names are required. Allocation candidates use 5–20% per stock, a 30% sector cap, 0.5-percentage-point increments and weights summing to 100%.

The candidate menu contains equal weights, rank tilts, inverse volatility, a current-weight projection where applicable, and constrained single-name tilts. Duplicate allocations are removed. Jev chooses a whole candidate, rather than independently inventing ten weights. Descriptive rule names are withheld from the model and candidate presentation order follows a deterministic timestamp-seeded permutation; the permutation is not chosen after observing an answer.

The allocation objective is expected net return relative to the same-stock equal-weight control. Historical risk is contextual evidence under explicit constraints, not an undefined “risk-adjusted” objective. Lower volatility does not, by itself, imply higher expected return. The second model call is not independent confirmation of the screening scores.

Risk estimates use up to sixty common, adjacent exchange-session log returns, with at least forty valid observations. Missing sessions are not bridged and treated as one daily return. Sample covariance uses an N−1 denominator and fixed 25% diagonal shrinkage. Annualization uses 252 sessions. The exact return intervals, window and shrinkage are retained.

05 / EXECUTION AND ACCOUNTING

Daily decisions, five-minute valuations

The scheduler runs on weekday market hours only. At :35 it attempts execution and, if Jev has not yet been invoked that session, a full-universe research collection so the model can be called. Collection keeps retrying at later :35 checks until a Jev request is sent; after that, later hours skip the 504-name scrape. Other checks, every fifteen minutes, only revalue held positions: they cannot open the study, execute or expire pending targets, or call Jev. Positions are held through collection failures. A delayed successful decision still fills only on a later aligned quote. Rebalances below 5% gross turnover are skipped; explicit name exits always trade.

The twenty-minute price buffer is unchanged. For an already invested portfolio, the first eligible five-minute check is 9:55am ET, using the minute ending 9:35am. A normal-session close can first be recorded at 4:20pm; the hourly closing check remains at 4:35pm. Early closes follow the exchange calendar. A browser polls saved state once per minute, backed by a shared thirty-second response cache; opening more dashboards does not trigger more Yahoo requests.

Checks skip while another workflow owns the ledger. Failed valuation requests retain the last valid point and back off for five, ten, twenty, then at most thirty minutes between attempts. There is no immediate retry, model-call fallback, or invented point for a missing observation. The displayed price timestamp, rather than the browser refresh time, identifies the latest measurement.

The public stock table is a separate, replaceable display feed. Collected company prices and indicators can appear before a review completes, or after a review fails. Every price retains its observation time; a partially refreshed table is not a synchronized decision snapshot. This display feed is never used to calculate benchmark returns, execute targets or modify the saved inputs to Jev.

If a security has no quote for the requested minute, its immediately preceding completed minute can be used within the registered sixty-second alignment tolerance. The original bar-close timestamp is retained; an older price is never labelled current. Execution checks a missing batch-feed minute against Yahoo’s detailed minute chart, using the same cutoff and tolerance, and records which feed supplied each mark. Older or absent observations fail validation. Missing daily sessions in the batch feed are checked against Yahoo’s detailed chart history, without interpolation or a lower coverage threshold.

A saved target is not a fill. All required quotes must follow its decision timestamp and satisfy the synchronization rule. A target expires after its eligible session; it cannot unexpectedly execute a week later. Overnight bootstrap targets may survive until the next eligible session, but are not backdated to earlier prices.

Each portfolio pays five basis points per dollar bought or sold. Post-cost sizing conserves capital. Drift-only rebalances below 5% gross absolute turnover are skipped; explicit exits bypass this filter. Each account applies the rule to its own holdings, so actual weights need not remain equal to target weights.

All portfolios, including SPY, credit cash distributions without automatic dividend reinvestment. Corporate actions have stable identifiers and per-symbol progress. Repeated events are idempotent; late dividends use historical holdings for entitlement. Revised events and splits discovered after intervening trades stop affected accounting for reconciliation rather than inventing lots. This is a documented ex-date cash convention, not a broker’s complete payment-date ledger.

Execution and valuation run before the full-universe research refresh. This focused step fetches completed-minute quotes for held and pending securities plus SPY, reconciles corporate actions, executes an eligible saved target and records all portfolio values atomically. It does not call Jev or require a fresh indicator screen: selection eligibility was established when the target was recorded. Missing required quotes or unresolved corporate actions stop accounting explicitly; unrelated company-refresh failures cannot erase a committed fill or valuation.

An execution reliability amendment was introduced on September 17, 2026, before the first fill, after full-universe collection failures blocked the initial saved target. It preserves the recorded decision and the existing price delay, alignment, expiry, sizing and cost rules. Authenticated recovery checks may record additional observations between hourly checks, at their actual timestamps. They never backdate fills or reconstruct missed performance. The execution runtime has a separate published source fingerprint, retained with each execution record.

Later on September 17, five-minute held-position valuation was enabled prospectively. This changes observation density, not decision frequency, execution opportunities, costs or the primary daily-return endpoint. More frequent marks can reveal drawdowns missed by hourly observations; they do not create additional independent trials. Earlier gaps are not backfilled.

Additional 10- and 25-basis-point Jev cost scenarios follow the same recorded target sequence with their own post-cost sizing. These are conditional cost sensitivities, not reruns of an adaptive model that would have seen different holdings. Spread, market impact, taxes and broker-specific execution are not simulated.

06 / MEASUREMENT

Returns and uncertainty

Portfolio value is cash plus marked shares. Cumulative return is value divided by initial capital, minus one. The allocation effect is the difference between Jev and equal-weight cumulative returns. SPY outperformance is an arithmetic comparison, not alpha. Drawdown includes initial capital in its running peak and can miss losses between observations.

Daily statistics use recorded closing observations and adjacent exchange sessions, restricted to the fixed evaluation window. Post-window valuations may continue for observation, but do not extend the primary measurement window. Missing sessions are excluded explicitly, not converted into zero returns or compressed into one day. Reported diagnostics include realized volatility, tracking error and beta. Approximate uncertainty for mean daily active return uses a prespecified Newey–West estimator with five lags; intervals are withheld before thirty adjacent daily returns.

Thirty observations do not establish skill, and 126 sessions are a reporting window, not a proof threshold. Shared market shocks, overlapping forecasts and repeated comparisons create dependence. The number of stocks multiplied by the number of reviews is not an independent sample size. No automatic early victory or significance claim is produced.

Inference spending is reported separately from investment returns, based on reported input tokens and the configured rate. It includes reported usage from successful and failed calls in this study. Unknown usage is not zero, and the estimate is not a reconciled billing statement.

07 / REPRODUCIBILITY

Version boundaries and retained evidence

Runs retain their protocol, model identifier, requests, responses, hashes, decisions, fills and failures. The build fingerprint includes all research modules, market-clock code, scheduler code and dependency lockfile. A changed research build or returned model identifier pauses new decisions; valuation does not silently combine a new policy with an existing track record.

The mutable provider alias remains a limitation: a returned identifier is not independent proof of immutable model weights. Source hashes establish content identity, not external timestamping or attestation.

Audit payloads can be losslessly compressed. SHA-256 verification restores original JSON before display. Collection shards are removed only after their canonical snapshot has been retained and verified; original requests and responses are not discarded. Partial failed attempts remain inspectable. Secrets stay server-side and credential-like strings are redacted from provider responses.

Transient data-collection errors may be retried twice per batch, with a maximum of six additional requests per workflow. All retries retain the original quote cutoff and fifteen-minute deadline. Exhausted attempts fail explicitly; a later scheduled run uses a new snapshot. Model calls and ambiguous inference responses are never automatically replayed. Batch progress and timed-out runs are visible independently of whether a complete snapshot was published.

Before the first decision or measured fill, an operator may authorize one corrected startup attempt if the provider explicitly rejected the first request for exceeding its input limit. This exception requires a retained HTTP 400 response with that exact error, no scores and no other inference attempt. Original evidence and any unreported billing are retained; the new review records the correction and uses newly collected data. It cannot reset a measured study or retry a partial model result.

The study starts at its first eligible fill. Changes to the research policy require a new, explicitly identified experiment. There is no hidden reset, retry-until-success strategy, or reconstructed control history.

Inspect the protocol manifest ↗

08 / LIMITATIONS

What a result would not establish

This is one constrained strategy in one evolving market. Concentration, sector exposure, candidate design, batching, data quality and assumed costs can drive results. A profitable period does not establish general AI investment skill. A losing period is still a valid result if the protocol and measurement remain intact.

This public research preview retains the Yahoo collector. Independent verification of data quality, adjustment semantics and display/archive permissions remains outstanding; deployment does not establish data qualification. Published results begin with this study’s first eligible fill. Operational reliability must be assessed across actual market sessions. An enriched-input arm, an hourly-trading comparison and live order execution are not activated. No real money is traded.

Open the dashboard ↗