{"slug": "options-buyer-ml-why-one-model-fails-and-the-v2-fix", "title": "Options Buyer ML: Why One Model Fails (and the V2 Fix)", "summary": "A developer detailed the rebuild of an options-buyer prediction system, moving from a single XGBoost model that learned noise from raw premium data to a multi-head architecture that separates underlying mechanics from option contract evaluation. The V2 fix trains narrow heads for specific timeframes and strike multiples, uses shallow trees with heavy regularization, and gates model promotion on out-of-sample performance gaps.", "body_md": "Lessons from a real rebuild of an options-buyer prediction system. No profit claims —\n\njust the architecture that fixes the chronic bugs of V1.\n\nV1 asked one XGBoost model one big fuzzy question: **\"CE ya PE?\"** — directly from raw\n\nCE/PE premium data. Premium is a *transformed* signal (underlying move × delta × gamma × IV ×\n\ntheta × spread × strike distance × liquidity). The model learned noise as much as signal.\n\nConcrete evidence from the research logs:\n\n`lr=0.02, depth=3`\n\ndefaults used throughout; Optuna existed but was never run).`iv_change_1d`\n\nshift inside single-row groups) silently zeroed a whole\nfeature for the entire history.\n\n``` php\nunderlying mechanics  -->  side, range, ETA, invalidation\noption chain scanner   -->  is the buyer contract worth paying for?\nXGBoost (many heads)   -->  thin calibrated learner on clean mechanics\n```\n\nRule: **underlying decides side; option contract decides execution eligibility.** CE/PE\n\npremium is validated against, never learned as, direction.\n\nInstead of one CE/PE answer, V2 trains separate narrow heads:\n\n`underlying_up/down_touch_{15,30,60}m`\n\n`ce_1p3x / ce_1p5x / ce_2p0x`\n\nand `pe_1p3x / pe_1p5x / pe_2p0x`\n\n(SEPARATE CE and PE)`no_trade_quality`\n\nThis single change removes most of the CE/PE confusion V1 fought for months.\n\n```\nlearning_rate = 0.015–0.035   n_estimators = 800–2000 (early stop)\nmax_depth = 2–3               min_child_weight = 12–40\ngamma = 0.1–2.0               subsample = 0.65–0.90\ncolsample_bytree = 0.55–0.85  reg_alpha = 0.5–3.0\nreg_lambda = 6.0–20.0         scale_pos_weight = min(neg/pos, 8.0)\n```\n\nV1's intraday head had only **8 of 1280 features** with non-zero gain — most of the bloat\n\nwas pure noise the regularizer had to prune. Shallow + hard-regularized is the answer.\n\n`overfit_gap = train_metric − test_metric`\n\n. **Flag if > 0.15.** A model is NOT promoted just\n\nbecause train metrics look good. Log the gap automatically on every head, every retrain.\n\nV2 is a cleaner architecture, but it is still **research**. The lesson that transfers: stop\n\nasking fuzzy questions, declare your nulls, keep trees shallow, and gate promotion on\n\nout-of-sample gap — not training score.\n\n*Research only. Not investment advice.*", "url": "https://wpnews.pro/news/options-buyer-ml-why-one-model-fails-and-the-v2-fix", "canonical_source": "https://dev.to/shaktitiwari/options-buyer-ml-why-one-model-fails-and-the-v2-fix-1hei", "published_at": "2026-08-19 06:55:09+00:00", "updated_at": "2026-08-19 07:12:26.475112+00:00", "lang": "en", "topics": ["machine-learning", "artificial-intelligence", "mlops"], "entities": ["XGBoost", "Optuna"], "alternates": {"html": "https://wpnews.pro/news/options-buyer-ml-why-one-model-fails-and-the-v2-fix", "markdown": "https://wpnews.pro/news/options-buyer-ml-why-one-model-fails-and-the-v2-fix.md", "text": "https://wpnews.pro/news/options-buyer-ml-why-one-model-fails-and-the-v2-fix.txt", "jsonld": "https://wpnews.pro/news/options-buyer-ml-why-one-model-fails-and-the-v2-fix.jsonld"}}