# Trade & Signal Analysis — March 10, 2026 (Weekly Expiry Day)

**Date:** March 10, 2026  
**Type:** Weekly Expiry (Nifty — Tuesday expiry)  
**Instruments:** Nifty 10-Mar weekly options (23500–25000 CE/PE)  
**Data Sources:** `paper_trades` table, `tracked_signals` table

---

## Table of Contents

1. [Executive Summary](#1-executive-summary)
2. [Tracked Signals Overview](#2-tracked-signals-overview)
3. [Paper Trades Overview](#3-paper-trades-overview)
4. [PnL Breakdown](#4-pnl-breakdown)
5. [Performance by Signal Type (Entry Reason)](#5-performance-by-signal-type-entry-reason)
6. [Performance by Strike Category](#6-performance-by-strike-category)
7. [Performance by Instrument](#7-performance-by-instrument)
8. [Performance by Hour](#8-performance-by-hour)
9. [Exit Reason Analysis](#9-exit-reason-analysis)
10. [Trade Duration Analysis](#10-trade-duration-analysis)
11. [PnL% Distribution](#11-pnl-distribution)
12. [Signal Quality vs Trade Outcome](#12-signal-quality-vs-trade-outcome)
13. [Key Problems Identified](#13-key-problems-identified)
14. [Improvement Roadmap](#14-improvement-roadmap)

---

## 1. Executive Summary

| Metric | Value |
|--------|-------|
| Total signals generated | **957** |
| Total trades taken | **684** |
| All trades status | All CLOSED |
| BUY / SELL split | 503 BUY / 181 SELL (74% / 26%) |
| Wins / Losses / Breakeven | 206 / 451 / 27 |
| **Overall Win Rate** | **30.12%** |
| Total PnL (raw, qty=1) | **+1,448 pts** |
| Avg PnL per trade | +2.12 pts |
| Max Win | +108 pts |
| Max Loss | -73.15 pts |
| SL Hit Rate | **83% of all trades** |

**Verdict:** The system is technically profitable on the day (+1,448 pts) but only because a narrow set of ITM momentum trades carry heavy PnL. The vast majority of trades (especially OTM premium spike entries) are noise that erodes win rate and reliability. On a weekly expiry day, the signal mix was dominated by gamma-driven OTM premium fluctuations — which the system treated as real directional signals.

---

## 2. Tracked Signals Overview

**Total signals detected on March 10: 957**

### By Signal Type

| Signal Type | Count | % of total |
|---|---|---|
| `premium_spike` | 594 | 62% |
| `momentum` | 298 | 31% |
| `oi_spike` | 65 | 7% |

### By Strike Category

| Category | Count | % |
|---|---|---|
| OTM | 681 | 71% |
| ATM | 140 | 15% |
| ITM | 136 | 14% |

### By Market Regime

| Regime | Count |
|---|---|
| `ranging` | 898 |
| `opening` | 43 |
| `ranging_bullish` | 12 |
| `ranging_bearish` | 4 |

> **Note:** 94% of signals fired during `ranging` regime. On expiry day, Nifty was range-bound with theta decay — not trending. Momentum detectors in a ranging market produce high false-positive rates.

### Signal Quality

| Metric | Value |
|---|---|
| Confirmed (`is_confirmed = true`) | 370 (38.7%) |
| Unconfirmed | 587 (61.3%) |
| Avg confidence score | 64.53 |
| Avg signal strength | 1.48 |

### Hourly Signal Distribution

| Hour | Signals |
|---|---|
| 09:00 | 57 |
| 10:00 | 82 |
| 11:00 | 49 |
| 12:00 | 70 |
| 13:00 | 97 |
| 14:00 | 258 |
| 15:00 | 344 |

> **Critical:** 602 of 957 signals (63%) fired in the last 2 hours of the expiry day. These are driven by options gamma explosion and theta decay acceleration — not genuine directional setups.

### Unique Instruments Tracked

31 instruments across strikes 23500–25000 (CE and PE):
> NIFTY2631023500CE/PE, NIFTY2631023600CE/PE … NIFTY2631025000CE/PE

---

## 3. Paper Trades Overview

| Metric | Value |
|---|---|
| Total trades | 684 |
| Status | All CLOSED |
| BUY | 503 (73.5%) |
| SELL | 181 (26.5%) |

> The strong BUY bias (73.5%) reflects the system defaulting to `expected_premium_dir = UP` for most signals. On a bearish expiry close or range-bound day, this directional bias adds drag.

---

## 4. PnL Breakdown

| Outcome | Count | % |
|---|---|---|
| Wins (PnL > 0) | 206 | 30.1% |
| Losses (PnL < 0) | 451 | 65.9% |
| Breakeven (PnL = 0) | 27 | 3.9% |

| PnL Metric | Value |
|---|---|
| Total PnL | +1,448.10 pts |
| Avg PnL per trade | +2.12 pts |
| Max single win | +108 pts |
| Max single loss | -73.15 pts |

---

## 5. Performance by Signal Type (Entry Reason)

| Entry Reason | Count | Win | Loss | WR% | Total PnL |
|---|---|---|---|---|---|
| Premium spike - UP (OTM) | 199 | 4 | 178 | **2.0%** | -18.50 |
| Premium spike - DOWN (OTM) | 125 | 1 | 122 | **0.8%** | -23.50 |
| **Momentum signal - UP (ITM)** | 112 | 70 | 42 | **62.5%** | **+1,261.65** |
| Momentum signal - UP (OTM) | 111 | 56 | 47 | 50.5% | -35.55 |
| **Momentum signal - UP (ATM)** | 72 | 43 | 29 | **59.7%** | **+248.35** |
| OI spike (long_unwinding) - DOWN (ITM) | 7 | 6 | 1 | 85.7% | +125.60 |
| Premium spike - UP (ATM) | 7 | 4 | 3 | 57.1% | +6.90 |
| OI spike (long_unwinding) - UP (ITM) | 4 | 4 | 0 | **100%** | +106.15 |
| OI spike (fresh_long_buildup) - DOWN (ATM) | 4 | 2 | 2 | 50.0% | -19.15 |
| OI spike (short_covering) - UP (ITM) | 4 | 1 | 3 | 25.0% | -72.80 |
| OI spike (long_unwinding) - DOWN (ATM) | 4 | 1 | 3 | 25.0% | -58.05 |
| OI spike (fresh_short_buildup) - UP (OTM) | 3 | 0 | 3 | 0.0% | -32.95 |
| OI spike (neutral) - DOWN (OTM) | 2 | 2 | 0 | 100% | +54.05 |
| OI spike (short_covering) - DOWN (OTM) | 2 | 0 | 2 | 0.0% | -8.50 |

**Key Takeaways:**
- **Premium Spike OTM (324 trades, 47% of all trades)** → combined 1.4% WR, net negative. These are pure noise on expiry day.
- **Momentum ITM (112 trades)** → 62.5% WR, generates +1,261 pts — the backbone of the day's profit.
- **Momentum ATM (72 trades)** → 59.7% WR, +248 pts — reliable signal.
- **OI spike ITM subtypes** → small sample but excellent WR (85–100%); signal type worth expanding.

---

## 6. Performance by Strike Category

| Category | Trades | WR% | Total PnL |
|---|---|---|---|
| **ITM** | 135 | **63.0%** | **+1,351** |
| **ATM** | 101 | **56.4%** | **+204** |
| **OTM** | 448 | **14.3%** | **-107** |

- OTM = 65.5% of all trades, generated negative PnL overall.
- ITM + ATM = 34.5% of trades, but produced **107% of the total PnL**.
- Strike category is the single strongest predictor of whether a trade will win.

---

## 7. Performance by Instrument (Top 20)

| Symbol | Trades | Win | WR% | PnL |
|---|---|---|---|---|
| NIFTY2631025000CE | 79 | 1 | 1.3% | -5.85 |
| NIFTY2631024900CE | 42 | 1 | 2.4% | -3.20 |
| NIFTY2631024800CE | 36 | 0 | 0.0% | -3.50 |
| NIFTY2631023500PE | 35 | 6 | 17.1% | -0.45 |
| NIFTY2631023900PE | 34 | 9 | 26.5% | -30.45 |
| NIFTY2631024000PE | 31 | 8 | 25.8% | -12.40 |
| NIFTY2631023600PE | 29 | 5 | 17.2% | +2.20 |
| NIFTY2631024100PE | 28 | 14 | 50.0% | +17.70 |
| NIFTY2631024300CE | 27 | 14 | 51.9% | +19.00 |
| NIFTY2631024100CE | 27 | 13 | 48.1% | +10.00 |
| NIFTY2631024500CE | 27 | 5 | 18.5% | -15.35 |
| NIFTY2631023800PE | 26 | 7 | 26.9% | -5.80 |
| **NIFTY2631024300PE** | 25 | 16 | **64.0%** | **+143.60** |
| NIFTY2631024700CE | 25 | 2 | 8.0% | -3.55 |
| NIFTY2631024200CE | 23 | 10 | 43.5% | -19.15 |
| NIFTY2631023700PE | 21 | 2 | 9.5% | +0.05 |
| NIFTY2631024400CE | 21 | 8 | 38.1% | +1.85 |
| **NIFTY2631024400PE** | 20 | 14 | **70.0%** | **+177.50** |
| **NIFTY2631024200PE** | 20 | 15 | **75.0%** | **+45.60** |
| NIFTY2631024000CE | 20 | 12 | 60.0% | -27.85 |

> **Top 3 most-traded instruments** (25000CE, 24900CE, 24800CE) were deep OTM on the day. Combined: 157 trades, near-zero win rate. These should be filtered out by a strike-distance-from-ATM limit.

---

## 8. Performance by Hour

| Hour | Trades | Win | Loss | WR% | Total PnL |
|---|---|---|---|---|---|
| 09:00 | 48 | 19 | 29 | 39.6% | +151.15 |
| **10:00** | **77** | **52** | **24** | **67.5%** | **+1,007.95** |
| 11:00 | 48 | 28 | 19 | 58.3% | +13.70 |
| 12:00 | 67 | 32 | 29 | 47.8% | +15.60 |
| 13:00 | 102 | 31 | 54 | 30.4% | +33.85 |
| **14:00** | **216** | **32** | **182** | **14.8%** | **+272.00** |
| **15:00** | **126** | **12** | **114** | **9.5%** | **-46.15** |

**Key Takeaways:**
- **10:00 is the single best hour**: 67.5% WR, generates +1,008 pts (70% of the day's profit in 1 hour).
- **10:00–12:00 golden window**: Consistent 58–67% WR with positive PnL in all three hours.
- **14:00–15:30 is a trap on expiry day**: 342 trades (50% of the day!), 12% WR, nearly breakeven PnL despite massive trade volume. These are gamma/theta noise trades.
- The signal flood in the last 2 hours (602 signals → 342 trades) is the biggest source of system inefficiency.

---

## 9. Exit Reason Analysis

| Exit Reason | Count |
|---|---|
| Stop loss hit | 311 |
| stop_loss_hit | 259 |
| Target hit | 98 |
| target_hit | 12 |
| Manual FIFO close | 4 |

- **570/684 trades (83.3%) hit stop loss.**
- Only **110/684 (16.1%) hit target.**
- Duplicate exit reason strings (`stop_loss_hit` vs `Stop loss hit`, `target_hit` vs `Target hit`) indicate inconsistent enum usage in `PaperTradeSignalService`.

---

## 10. Trade Duration Analysis

| Bucket | Count | % |
|---|---|---|
| < 5 min | 415 | **60.7%** |
| 5–15 min | 180 | 26.3% |
| 15–30 min | 57 | 8.3% |
| 30–60 min | 25 | 3.7% |
| > 60 min | 7 | 1.0% |

| Duration Metric | Value |
|---|---|
| Avg duration | 7.5 min |
| Min duration | ~1 sec |
| Max duration | 145 min |

> 61% of trades are closed in under 5 minutes — almost all hit stop loss immediately after entry. Combined with the 83% SL-hit rate, this signals that either: (a) SL is too tight relative to OTM premium volatility on expiry day, or (b) entries are poorly timed into adverse momentum.

---

## 11. PnL% Distribution

| Cohort | Avg PnL% | Max/Min |
|---|---|---|
| Winners | **+18.20%** | +119.75% max |
| Losers | **-32.63%** | -83.57% worst |

- **Losers are losing 1.8× more in % terms than winners are gaining** — the system has an inverted risk/reward profile.
- Average loss magnitude significantly exceeds average win magnitude, which is why you need above 64% WR just to break even on a per-trade basis.

---

## 12. Signal Quality vs Trade Outcome

- `tracked_signal_id` is **not linked** on any of the 684 paper trades (FK is null or mismatched). Signal attribution per trade is currently broken.
- This means: confidence score, signal strength, and confirmation status from `tracked_signals` cannot be retroactively correlated to trade outcomes without manual re-matching.

**Action required:** Fix `PaperTradeSignalService::createTradeFromSignal()` to reliably persist `tracked_signal_id` on every created `PaperTrade`.

---

## 13. Key Problems Identified

### P1 — Critical
| # | Problem | Impact |
|---|---|---|
| P1.1 | **Premium Spike OTM fires 324 trades at 1.4% WR** — pure expiry day gamma noise | 47% of all trades, net negative |
| P1.2 | **14:00–15:30 generates 342 trades (50%) at 12% WR** on expiry day | No edge; system overtrading |
| P1.3 | **83% of trades hit stop loss** — SL/target ratio is inverted | Risk/reward broken |

### P2 — High
| # | Problem | Impact |
|---|---|---|
| P2.1 | 61% of signals are unconfirmed (`is_confirmed = false`) — all traded | Low quality signal set |
| P2.2 | 94% of signals fired in `ranging` regime but momentum detector is not regime-aware | High false positive rate |
| P2.3 | `tracked_signal_id` is null on all trades — signal → trade attribution broken | No feedback loop possible |
| P2.4 | Losers lose 1.8× more % than winners gain — inverted R:R profile | Requires 64%+ WR to break even |

### P3 — Medium
| # | Problem | Impact |
|---|---|---|
| P3.1 | Deep OTM instruments (25000CE, 24900CE, 24800CE) being traded freely | 157 trades, ~0% WR |
| P3.2 | Duplicate exit reason strings (`stop_loss_hit` vs `Stop loss hit`) | Analytics unreliable |
| P3.3 | BUY bias 73.5% — no regime-based directional filter | Drag on bearish/neutral days |
| P3.4 | No max-trades-per-day cap | Overexposure; 684 trades is not scalable |

---

## 14. Improvement Roadmap

### 🔴 Phase 1 — Immediate (Kill the Noise)

**1.1 Disable Premium Spike → OTM trades on expiry days**
```php
// config/momentum.php
'disable_otm_premium_spike_on_expiry' => true,
```
- Removes 324 trades (47%), eliminates ~-42 pts drag, dramatically reduces noise.

**1.2 Hard block all new entries after 13:30 on expiry day**
- 14:00–15:30 has 12% WR and 342 trades with no meaningful edge.
- Add `is_expiry_day` detection + `expiry_day_cutoff_time = '13:30'` config.

**1.3 Require `is_confirmed = true` before trade entry**
- Gates out 61% of signals immediately.
- Simplest quality filter available with existing data.

---

### 🟡 Phase 2 — Short Term (Signal Quality)

**2.1 Add minimum confidence score threshold**
- Current avg: 64.5. Set `min_confidence_score = 70` (or 75 for OTM signals).

**2.2 Market regime gating for momentum signals**
- Require `market_regime IN ('trending_bullish', 'trending_bearish')` for momentum entries.
- In `ranging` regime, momentum signals produce false breakouts; fire OI spike signals only.

**2.3 Stop trading "Premium Spike - DOWN" as a BUY signal**
- Premium DOWN means premium is falling. The direction-to-side mapping logic needs review. A falling OTM premium is not a BUY signal for that option.

**2.4 Fix `tracked_signal_id` persistence in `PaperTradeSignalService`**
- Required for any signal-quality feedback loop.
- Without this, no per-signal attribution is possible.

---

### 🟡 Phase 3 — Short Term (Risk Management)

**3.1 Enforce minimum 1:2 Risk/Reward ratio before entry**
- If `(target - entry) / (entry - stop_loss) < 2.0` → do not enter.
- Currently losers average -32.6% while winners average +18.2% → ratio is 0.56:1 (inverted).

**3.2 ITM-only Trailing Stop Loss**
- ITM trades have 63% WR and high-magnitude winners (+119.75% max).
- Enable TSL for ITM only; OTM trades rarely reach a profit worth trailing.

**3.3 Normalize exit reason strings**
- Use a single constant/enum: `ExitReason::STOP_LOSS` and `ExitReason::TARGET_HIT`.
- Fix in `PaperTradeSignalService` and any other exit location.

**3.4 Add max-trades-per-day cap**
- Example: `max_daily_paper_trades = 60`
- Forces the system to be selective; 684 trades/day is not scalable for real execution.

---

### 🟢 Phase 4 — Medium Term (Structural)

**4.1 Add strike distance filter**
- No trades more than N strikes away from ATM (e.g., `max_strikes_from_atm = 3`).
- Eliminates deep OTM (25000CE etc.) which had 0–2% WR.

**4.2 Expiry-day configuration profile**
Create a separate config for expiry days:
```php
'expiry_day' => [
    'allowed_signal_types'   => ['momentum'],
    'allowed_strike_cats'    => ['ITM', 'ATM'],
    'entry_cutoff_time'      => '13:30',
    'min_confidence_score'   => 75,
    'require_confirmed'      => true,
    'max_daily_trades'       => 40,
],
```

**4.3 Add `signal_type` and `strike_category` as first-class columns on `paper_trades`**
- Remove reliance on parsing `entry_reason` text for analytics.
- Enables direct DB-level grouping and filtering.

**4.4 Post-trade feedback loop to `tracked_signals`**
- When a `PaperTrade` closes, write `profit_points` and `profit_percentage` back to the linked `TrackedSignal`.
- Columns already exist on the model; the pipeline just needs to be wired up.

---

### 🔵 Phase 5 — Long Term (Analytics & Intelligence)

**5.1 Regime-aware signal quality scoring**
- Track per-signal-type WR per market regime.
- Dynamically adjust `min_confidence_score` threshold per regime.

**5.2 Backtesting per market condition**
- Separate backtest runs for: expiry day vs normal day, trending vs ranging, morning vs afternoon.
- The data shows performance varies drastically by these dimensions.

**5.3 Signal scoring pipeline**
- Assign a "signal quality score" that combines: confidence, strength, is_confirmed, regime, strike category, time of day.
- Only enter if composite score exceeds threshold.

---

## Summary Decision Table

| Signal Type | Recommendation |
|---|---|
| Momentum - ITM | ✅ Keep. 62.5% WR, backbone of profitability |
| Momentum - ATM | ✅ Keep with time filter (before 13:30 on expiry) |
| Momentum - OTM | ⚠️ Restrict. 50.5% WR but net-flat; block on expiry days |
| Premium Spike - OTM | 🔴 Disable on expiry day entirely. 1.4% WR |
| Premium Spike - ATM | ⚠️ Keep only when `is_confirmed = true` |
| OI Spike - ITM (long_unwinding, fresh_long) | ✅ Keep. 85–100% WR in small sample; expand carefully |
| OI Spike - OTM/ATM (generic) | 🔴 Gate on confirmation + regime |
| All signals — 14:00–15:30 on expiry | 🔴 Block entirely |

---

*Generated: March 11, 2026*  
*Analysis covers: `paper_trades` and `tracked_signals` for date 2026-03-10*

---

## Cross-Reference

- [March 9, 2026 — 1DTE Pre-Expiry Analysis](2026-03-09-1dte-analysis.md) — Baseline: same system, 73% WR, +3,852 pts
- [Analysis Index](README.md)
