# Trade & Signal Analysis — March 9, 2026 (1DTE — 1 Day Before Expiry)

**Date:** March 9, 2026  
**Type:** 1DTE — 1 day before Nifty weekly expiry (expiry was March 10, Tuesday)  
**Instruments:** Nifty 10-Mar weekly options (23500–25000 CE/PE)  
**Data Sources:** `paper_trades` table, `tracked_signals` table

> **Context:** This was the last full trading session before the weekly Tuesday expiry. Option premiums had significant time value remaining (1DTE), resulting in cleaner momentum signals compared to the gamma-distorted expiry day. This day serves as the baseline for **what the system looks like when working correctly**.

---

## 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. [Side-by-Side Comparison: Mar 9 vs Mar 10](#12-side-by-side-comparison-mar-9-vs-mar-10)
13. [Key Observations](#13-key-observations)
14. [Improvement Roadmap](#14-improvement-roadmap)

---

## 1. Executive Summary

| Metric | Value |
|--------|-------|
| Total signals generated | **253** |
| Total trades taken | **223** |
| All trades status | All CLOSED |
| BUY / SELL split | 153 BUY / 70 SELL (69% / 31%) |
| Wins / Losses / Breakeven | 163 / 60 / 0 |
| **Overall Win Rate** | **73.09%** |
| Total PnL (raw, qty=1) | **+3,852 pts** |
| Avg PnL per trade | +17.27 pts |
| Max Win | +111.4 pts |
| Max Loss | -67.65 pts |

**Verdict:** March 9 is a fundamentally different picture from March 10. With 1DTE, momentum signals were genuine and directional — the system performed at its best. A 73% win rate with +3,852 pts on 223 trades vs 30% and +1,448 pts on 684 trades the next day tells the full story: **the problem is not the system, it's operating on the wrong day (expiry) in the wrong conditions**.

---

## 2. Tracked Signals Overview

**Total signals detected on March 9: 253**

### By Signal Type

| Signal Type | Count | % |
|---|---|---|
| `momentum` | 205 | **81%** |
| `oi_spike` | 46 | 18% |
| `premium_spike` | 2 | 1% |

> Striking contrast to March 10 where `premium_spike` dominated (62%). On 1DTE, the system was mostly generating clean momentum and OI signals — not gamma noise.

### By Strike Category

| Category | Count | % |
|---|---|---|
| OTM | 148 | 58% |
| ITM | 54 | 21% |
| ATM | 51 | 20% |

> More balanced distribution across categories compared to March 10's 71% OTM dominance.

### By Market Regime

| Regime | Count |
|---|---|
| `ranging` | 189 (75%) |
| `ranging_bearish` | 42 (17%) |
| `opening` | 22 (9%) |

> 17% of signals fired in `ranging_bearish` — directional bearish context appeared on this day (absent on March 10). This helped SELL-side signals perform better.

### Signal Quality

| Metric | Value |
|---|---|
| Confirmed (`is_confirmed = true`) | 160 (63%) |
| Unconfirmed | 93 (37%) |
| Avg confidence score | 66.25 |
| Avg signal strength | 1.99 |

> **63% confirmed** vs 38.7% on March 10. Nearly twice as many confirmed signals. Signal strength (1.99 vs 1.48) also meaningfully higher — this is the quality baseline the system should aim to maintain on all days.

### Hourly Signal Distribution

| Hour | Signals |
|---|---|
| 09:00 | 30 |
| 10:00 | 62 |
| 11:00 | 31 |
| 12:00 | 19 |
| 13:00 | 42 |
| 14:00 | 38 |
| 15:00 | 31 |

> Even distribution throughout the day — no late-day explosion. Compare to March 10 where 14:00 had 258 and 15:00 had 344 signals (expiry gamma noise). Here 14:00 and 15:00 combined had only 69 signals.

---

## 3. Paper Trades Overview

| Metric | Value |
|---|---|
| Total trades | **223** |
| Status | All CLOSED |
| BUY | 153 (69%) |
| SELL | 70 (31%) |

> SELL trades (31%) were nearly double the ratio from March 10 (26%), consistent with the `ranging_bearish` regime context on this day.

---

## 4. PnL Breakdown

| Outcome | Count | % |
|---|---|---|
| Wins (PnL > 0) | **163** | **73.1%** |
| Losses (PnL < 0) | 60 | 26.9% |
| Breakeven (PnL = 0) | 0 | 0.0% |

| PnL Metric | Value |
|---|---|
| Total PnL | **+3,852.05 pts** |
| Avg PnL per trade | **+17.27 pts** |
| Max single win | +111.4 pts |
| Max single loss | -67.65 pts |

> Avg PnL of +17.27 per trade vs +2.12 on March 10 — 8× more profitable per trade on the 1DTE day.

---

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

| Entry Reason | Count | Win | Loss | WR% | Total PnL |
|---|---|---|---|---|---|
| **Momentum signal - UP (OTM)** | 105 | 83 | 22 | **79.0%** | **+1,574** |
| **Momentum signal - UP (ITM)** | 37 | 25 | 12 | **67.6%** | **+1,151** |
| **Momentum signal - UP (ATM)** | 30 | 24 | 6 | **80.0%** | **+932** |
| OI spike (short_covering) - UP (ITM) | 4 | 1 | 3 | 25.0% | -109 |
| OI spike (fresh_short_buildup) - UP (ATM) | 3 | 3 | 0 | 100% | +69 |
| OI spike (long_unwinding) - DOWN (ITM) | 3 | 3 | 0 | 100% | +161 |
| OI spike (short_covering) - UP (OTM) | 3 | 2 | 1 | 66.7% | +25 |
| Premium spike - UP (OTM) | 3 | 0 | 3 | **0.0%** | **-55** |
| OI spike (fresh_short_buildup) - DOWN (ITM) | 2 | 0 | 2 | 0.0% | -102 |
| OI spike (short_covering) - UP (ATM) | 2 | 2 | 0 | 100% | +83 |
| OI spike (long_unwinding) - UP (ATM) | 2 | 2 | 0 | 100% | +62 |
| Auto-Trade (various pressure ≥89%) | ~15 | ~13 | ~2 | ~87% | +22 |

**Key Takeaways:**
- **Momentum signals across all strike categories performed brilliantly** on 1DTE (67–80% WR).
- **OTM momentum** (105 trades): 79% WR, +1,574 pts — the exact opposite of March 10 where OTM premium spike had 2% WR. The signal *type* matters enormously.
- **Premium spike OTM** (3 trades): 0% WR, -55 pts — consistent with March 10 finding. Premium spike OTM is unreliable regardless of the day.
- **Auto-Trade pressure-based entries** (~15 trades): High WR (~87%), small PnL — these are a distinct entry mechanism worth investigating as a supplementary signal type.

---

## 6. Performance by Strike Category

| Category | Trades | WR% | Total PnL |
|---|---|---|---|
| **OTM** | 116 | **75.0%** | **+1,540** |
| **ATM** | 42 | **76.2%** | **+1,055** |
| **ITM** | 48 | **64.6%** | **+1,242** |

> All three categories are profitable and above 64% WR. Huge contrast to March 10 where OTM had 14.3% WR.  
> **On 1DTE, OTM trades are fully viable because premium has value and direction.** The problem on expiry day was gamma-driven OTM premium spikes masquerading as signals — not the OTM category itself.

---

## 7. Performance by Instrument (Top 20)

| Symbol | Trades | Win | WR% | PnL |
|---|---|---|---|---|
| NIFTY2631024300CE | 17 | 12 | 70.6% | +97.10 |
| NIFTY2631024400CE | 16 | 12 | 75.0% | +61.40 |
| NIFTY2631024100CE | 15 | 11 | 73.3% | +248.35 |
| NIFTY2631023800CE | 13 | 10 | 76.9% | +312.80 |
| NIFTY2631024200CE | 13 | 11 | 84.6% | +210.30 |
| NIFTY2631023900CE | 11 | 9 | 81.8% | +365.70 |
| NIFTY2631024000CE | 10 | 9 | **90.0%** | +289.55 |
| NIFTY2631023600CE | 10 | 4 | 40.0% | -54.30 |
| NIFTY2631023700CE | 10 | 6 | 60.0% | +160.05 |
| NIFTY2631023900PE | 9 | 8 | **88.9%** | +337.10 |
| NIFTY2631023800PE | 9 | 8 | **88.9%** | +236.25 |
| NIFTY2631023600PE | 8 | 7 | 87.5% | +273.10 |
| NIFTY2631024000PE | 8 | 7 | 87.5% | +382.75 |
| NIFTY2631023500PE | 7 | 5 | 71.4% | +117.35 |
| NIFTY2631024500CE | 6 | 4 | 66.7% | -1.85 |
| NIFTY2631024900CE | 5 | 1 | 20.0% | -0.20 |

> Almost all instruments were profitable except 24900CE (deep OTM, consistent loser across both days) and 23600CE (40% WR). The near-ATM instruments performed at 88–90% WR.

---

## 8. Performance by Hour

| Hour | Trades | Win | Loss | WR% | Total PnL |
|---|---|---|---|---|---|
| 09:00 | 8 | 7 | 1 | 87.5% | +207.10 |
| **10:00** | **54** | **43** | **11** | **79.6%** | **+1,369** |
| 11:00 | 37 | 30 | 7 | 81.1% | +714.20 |
| 12:00 | 21 | 18 | 3 | 85.7% | +251.90 |
| 13:00 | 42 | 33 | 9 | 78.6% | +372.65 |
| 14:00 | 40 | 29 | 11 | 72.5% | +1,172 |
| **15:00** | **21** | **3** | **18** | **14.3%** | **-234.80** |

**Key Takeaways:**
- **09:00–14:00 consistently profitable** with 72–87% WR across all hours.
- **15:00 collapses** even on 1DTE: 14.3% WR, -234.80 pts. This is a universal pattern — the last hour of trading is noisy regardless of the day.
- **14:00 on March 9** is the polar opposite of **14:00 on March 10**: 72.5% WR vs 14.8% WR. Same hour, different day — expiry gamma is the differentiator.

---

## 9. Exit Reason Analysis

| Exit Reason | Count |
|---|---|
| Auto TP: +0.5% | 68 |
| target_hit | 46 |
| Target hit | 39 |
| stop_loss_hit | 37 |
| Auto SL: -1% | 14 |
| Stop loss hit | 13 |
| Close All (FIFO) | 4 |
| Auto-Close: Target hit | 2 |

- **Only 50 trades (22%) hit stop loss** — vs 83% on March 10. The system was catching moves and exiting at target.
- **107 trades (48%) hit target** (combining `target_hit` + `Target hit`).
- **68 trades hit Auto TP at +0.5%** — a quick partial profit-take mechanism. These may be capping upside on bigger moves.
- Exit reason strings are still inconsistent (`target_hit` vs `Target hit`, `stop_loss_hit` vs `Stop loss hit`) — same bug as March 10.

---

## 10. Trade Duration Analysis

| Bucket | Count | % |
|---|---|---|
| < 5 min | 39 | 17.5% |
| 5–15 min | 21 | 9.4% |
| 15–30 min | 63 | **28.3%** |
| 30–60 min | 53 | 23.8% |
| > 60 min | 47 | **21.1%** |

| Duration Metric | Value |
|---|---|
| Avg duration | **39.9 min** |
| Min duration | ~1 sec |
| Max duration | 190.6 min |

> Average duration of 39.9 min vs 7.5 min on March 10. Trades were held much longer on 1DTE — positions had room to breathe and reach targets. Only 17.5% closed in under 5 minutes (vs 61% on expiry day). This signals that on 1DTE, trades were working as intended.

---

## 11. PnL% Distribution

| Cohort | Avg PnL% | Extreme |
|---|---|---|
| Winners | **+21.49%** | +58.87% max |
| Losers | **-13.96%** | -32.63% worst |

- **Winners gain 1.54× more than losers lose** — a healthy, positive risk/reward profile.
- Compare to March 10: winners +18.2% vs losers -32.6% (inverted at 0.56:1).
- On 1DTE, the R:R ratio was approximately **1.54:1** — close to ideal.

---

## 12. Side-by-Side Comparison: Mar 9 vs Mar 10

| Metric | Mar 9 (1DTE) | Mar 10 (Expiry) | Change |
|---|---|---|---|
| Total Signals | 253 | 957 | +704 (+278%) |
| Total Trades | 223 | 684 | +461 (+207%) |
| Win Rate | **73.1%** | 30.1% | **-43%** |
| Total PnL | **+3,852** | +1,448 | -2,404 |
| Avg PnL/trade | **+17.27** | +2.12 | -15.15 |
| Max Loss | -67.65 | -73.15 | marginal |
| SL Hit Rate | **22%** | **83%** | +61pp |
| Avg Duration | **39.9 min** | 7.5 min | trades held vs stopped |
| Signal Confirmation | **63%** | 38.7% | -24pp |
| Avg Signal Strength | **1.99** | 1.48 | -0.51 |
| premium_spike % | **1%** | 62% | +61pp (noise) |
| Late-day signals (14–15h) | **69** | **602** | +533 (gamma noise) |
| OTM WR% | **75%** | 14.3% | night and day |

---

## 13. Key Observations

### What March 9 Proves
1. **The core momentum detection logic is sound.** 73% WR on 223 trades with clean R:R proves the underlying system works when signals are genuine.
2. **OTM is not inherently bad** — it's OTM *premium spike* on expiry day that is the problem. OTM momentum on 1DTE had 79% WR.
3. **Signal quality (confirmation, strength) directly correlates with outcome.** Higher confirmed % → higher WR.
4. **The 15:00 close-hour is universally noisy** on both days. Last-hour trades should be blocked or extremely filtered.
5. **Auto-Trade pressure-based entries** (unique to March 9) had a strong ~87% WR — this entry type deserves further investigation and possible expansion.

### What March 9 Reveals as Systemic Issues
1. **Auto TP at +0.5%** capped 68 trades early. If those were held to full target, total PnL could be significantly higher (especially on big momentum days).
2. **Deep OTM (24900CE, 24500CE)** still showed weakness even on the good day — consistent pattern across both days.
3. **23600CE** is a persistent underperformer (40% WR on March 9). Specific strike/instrument-level filters may be warranted.

---

## 14. Improvement Roadmap

### 🔴 Phase 1 — Expiry Day Risk Controls (from March 10 learnings, validated here)

**1.1 Disable all trading on expiry day OR switch to an expiry-day-only config**
March 9 vs March 10 is the clearest possible evidence: same system, same instruments, same signals — radically different outcomes because of expiry day conditions. The correct approach:
- **Option A:** Hard-disable paper trading on expiry day (Tuesday for weekly Nifty) entirely.
- **Option B:** Run a minimal expiry-day profile (ITM momentum only, before 13:30, confirmed signals only).

**1.2 Block last-hour entries universally (15:00–15:30)**
15:00 had 14.3% WR on March 9 and 9.5% on March 10. This is a universal bad window. Block new entries after 15:00 on all days.

---

### 🟡 Phase 2 — Capture More Upside (1DTE and Beyond)

**2.1 Remove or raise the Auto TP at +0.5% cap**
68 trades were auto-closed at +0.5% profit. On a day with 79% WR and avg winner of +21.5%, these trades likely had significantly more upside. Options:
- Raise Auto TP threshold from 0.5% to 2–3% for momentum signals.
- Replace fixed Auto TP with Trailing Stop Loss (TSL) for momentum trades.
- Apply Auto TP only for OTM trades (higher gamma risk) not ITM/ATM.

**2.2 Hold winners longer with TSL**
Max win on March 9 was only +111 pts (+58.87%) while the system had 73% WR. With TSL, average win could potentially be 30–40% higher.

---

### 🟡 Phase 3 — Signal Quality Maintenance

**3.1 Enforce `is_confirmed = true` as a baseline requirement**
March 9 had 63% confirmed signals and 73% WR. If March 10 had matched 63% confirmation, trade volume would have dropped from 684 to ~420 but quality would have improved dramatically.

**3.2 Keep `signal_strength` threshold ≥ 1.8**
March 9 avg strength was 1.99 vs March 10's 1.48. A minimum strength filter would naturally reduce expiry-day noise.

**3.3 Premium spike OTM — disable on all days**
Even on the excellent March 9, Premium spike OTM had 0% WR (3/3 losses). This signal type is unreliable on both days. Disable it globally.

---

### 🟢 Phase 4 — Instrument-Level Filtering

**4.1 Remove deep OTM instruments from the tracked list on expiry week**
`24900CE`, `24800CE`, `25000CE` consistently underperform across both March 9 and March 10. On 1DTE, `24900CE` was 20% WR. Add a dynamic ATM-distance filter: maximum 4 strikes from ATM.

**4.2 Flag persistently underperforming symbols**
`23600CE` was the only CE instrument below 50% WR on the strong March 9. A per-symbol performance tracker with automatic de-listing after N consecutive losing days would help.

---

### 🟢 Phase 5 — Leverage the Auto-Trade Pressure Mechanism

**5.1 Investigate and document the pressure-based Auto-Trade entries**
March 9 showed ~15 `Auto-Trade: BUY signal at live market price - Pressure: X%` entries with ~87% WR. These appear to be a separate entry mechanism (likely from buy/sell pressure scoring). They are:
- High win rate
- Small average PnL (quick scalps)
- Only present on March 9 (not March 10 — worth investigating why)

This mechanism should be documented, tested at higher pressure thresholds (≥92%) and potentially scaled up.

---

### 🔵 Phase 6 — Structural & Analytics

**6.1 Normalize exit reason constants**
Both days show `target_hit` vs `Target hit`, `stop_loss_hit` vs `Stop loss hit`. Fix to a single enum/constant in `PaperTradeSignalService`.

**6.2 Fix `tracked_signal_id` FK on paper trades**
Still null on all March 9 trades — same issue as March 10. Without signal attribution, feedback loops are impossible.

**6.3 Build a day-type classifier**
Before trading starts, determine: is today expiry day? 1DTE? 2DTE? Normal day? Apply the appropriate config profile per day type. Use `config/market.php` expiry calendar.

**6.4 Week-over-week comparison dashboard**
Now that two days are analyzed, the pattern is clear. Build a weekly summary view comparing Mon–Fri performance metrics to identify consistent weak/strong windows.

---

## Summary Decision Table (1DTE Context)

| Signal Type | 1DTE Verdict | Notes |
|---|---|---|
| Momentum - OTM | ✅ Excellent | 79% WR — keep as primary signal |
| Momentum - ATM | ✅ Excellent | 80% WR |
| Momentum - ITM | ✅ Good | 67.6% WR |
| Premium Spike - OTM | 🔴 Disable | 0% WR on both days |
| OI Spike - ITM (long_unwinding, short_covering select) | ✅ Keep | 100% WR on small sample |
| OI Spike - short_covering UP (ITM) | ⚠️ Mixed | 25% WR on Mar 9 despite ITM |
| Auto-Trade Pressure ≥89% | ✅ Investigate | ~87% WR, needs deeper analysis |
| All signals — 15:00–15:30 | 🔴 Block | 14.3% WR universal |

---

## Cross-Reference

- [March 10, 2026 — Expiry Day Analysis](2026-03-10-expiry-day-analysis.md) — Full analysis of the next day (weekly expiry)
- [Analysis Index](README.md)

---

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