TRAINED ON 545 REAL TRADES  ·  logistic regression  ·  NOT A LIVE TRADING SIGNAL
Model Card

NEO-LR-v0.1

A model card is the ML industry's standard one-page "nutrition label" for a model: what it is, what it's for, where it breaks, and who it can hurt. This one is honest to a fault: the model trains on real money but is not yet proven to add skill. Do not trade real money on it.

Version: NEO-LR-v0.1 Type: logistic regression Trained: 2026-06-25 N: 545 real trades
Model name
NEO-LR-v0.1
Architecture
Binary logistic regression (gradient descent), 14 input features
Task
Predict whether a short-options trade will be a "win" (close profitable)
Training set
545 real Charles Schwab closed trades (2025 + 2026 YTD)
Train / test split
436 train / 109 test (time-ordered)
Win rate (base rate)
88.6% strategy's base rate
Train accuracy
0.888
Test accuracy
0.890 barely beats base rate
Test AUC
0.688 modest skill
Status
NOT A LIVE SIGNAL — places no orders, has never traded real money
Maturity
Real data, genuinely profitable strategy — but the model is not yet proven to add skill over always guessing "win".

Every number above is wired live from metrics.json — the same file the dashboard reads. If the model retrains, these numbers update themselves. Nothing here is rounded up to look better.

What it's for

Out of scope

DO NOT TRADE REAL MONEY ON THIS MODEL
The data is real and the strategy is profitable — but the model is not yet proven to add anything. Its test accuracy (0.890) barely beats the 88.6% you'd score by blindly guessing "win" every time, and its AUC of 0.688 means it's only modestly good at the thing that actually matters: spotting the rare losses. Using it to size, time, or filter real trades would be acting on an edge that hasn't been demonstrated.

What's in it

545 real closed options trades exported from a Charles Schwab Realized Gain/Loss report — every fill is real money, not a paper or synthetic trade. The set spans the 2025 full year plus 2026 year-to-date and covers many underlyings (CIEN, SNDK, LITE, MU, QQQ, ASML, CRWD and others), not a single ticker. Each closed trade becomes one labeled row: win or loss by realized P&L.

Across those trades the strategy won 483 and lost 62 for a net realized P&L of +$81,955.09. That is the strategy's real track record — and the source of the modeling challenge: a strategy that wins this often produces a heavily imbalanced dataset (88.6% wins), which makes raw accuracy a misleading score (see §5).

DATA PROVENANCE
Source: one trader's real Charles Schwab Realized Gain/Loss export (545 rows, all tagged SCHWAB_GL). Real fills, real P&L. The split is time-ordered (436 earliest trades to train, 109 most recent to test), never a random shuffle.

The model takes 14 numeric features per trade. They fall into two buckets:

Live (non-zero weight, real variation)

Only 5 of the 14 features actually carry signal. Weights come straight from metrics.json:

Dead (zero weight, no data yet)

9 of the 14 features are dead — the export carries no value for them, so they had no variation and contributed nothing: vix, vix_change_1h, iv_rank, delta, hour, stock_return_1d, stock_return_5d, distance_pct, stock_price. These aren't bad features — there's just no market-feed data wired in yet to fill them. They are exactly the inputs most likely to help spot losses (see §6), which is why the model's skill is still limited.

NO DATA LEAKAGE
The training pipeline runs a leakage guard that drops post-trade columns (win, pnl, exit_reason, hold_hours, ml_score, etc.) before fitting. metrics.json reports zero leakage features in the model. Every input above is known at trade-entry time.
THE BASE-RATE PROBLEM — READ THIS FIRST
This strategy wins 88.6% of the time. So a "model" that does nothing but guess win on every single trade already scores 88.6% accuracy. My model's test accuracy is 0.890 — it barely beats that do-nothing baseline. Accuracy is the wrong lens here. The real test is AUC: how well the model separates the rare losses from the many wins. Ours is 0.688 — better than a coin flip (0.5), but only modestly. Real data, genuinely profitable strategy, but a model not yet proven to add skill.
Headline metrics — and what each one really means
Train accuracy
0.888 — on the 436 earliest trades. Essentially the base rate; no sign of memorization.
Test accuracy
0.890 — on 109 held-out, time-later trades. Barely above the 88.6% always-guess-win baseline.
Test AUC
0.688 — the metric that matters. Modest skill at ranking losers below winners; far from proven.
Wilson 95% CI (acc)
test accuracy CI [0.817, 0.936] — wide enough that the true accuracy could sit at or below the base rate.
Walk-forward CV
0.884 mean accuracy across 5 time-ordered folds (±0.032). Again, hovering right around the base rate.

The takeaway is consistent across every metric: the accuracy numbers look high only because the strategy itself wins so often. Strip that away and the model has shown modest separating power (AUC 0.688) and nothing more. See the methodology for why the base rate makes accuracy misleading and AUC the real test.

Has it traded?

No. The model has never placed a real order — its realized P&L is $0. The +$81,955.09 net P&L on this page is the human's realized result that produced the training labels, not the model's. Nothing here is evidence the model would have done better or worse than the human; it simply hasn't been tested with money.

IT BARELY BEATS GUESSING "WIN" EVERY TIME
The single most important caveat: test accuracy 0.890 is almost identical to the 88.6% you'd get by ignoring the model and assuming every trade wins. The model's only demonstrated edge is a modest AUC of 0.688. Until it clearly separates losses from wins, it adds no proven value over the strategy alone.
Owner
DevBased / Volia Ventures (built in public)
Current version
NEO-LR-v0.1 (trained 2026-06-25)
Cadence
Retrain whenever a fresh Schwab Gain/Loss export is ingested
Next milestone
Wire in market-feed features (VIX, IV rank, delta) to revive the 9 dead inputs → retrain → see if AUC clears 0.688
Decommission
Replaced once a model with proven skill (AUC well above the base-rate floor, CI clearing it) exists

Version history lives on the changelog. The live model object is always reflected in metrics.json.

← Back to the ML dashboard