# 03 — Projection Method Overview ## Mathematical and Conceptual Guide This file defines the five projection method families and the exact calculation logic for each. The Agent must use this file as the sole mathematical authority when computing pricing windows. --- ## 1. The Universal Calculation Sequence Every projection method, regardless of family, follows this sequence: ``` Step 1: Apply Non-GBD Roll Rule to BOL_Date → Effective_BOL Step 2: Apply Pivot_Date_Offset to Effective_BOL → Pivot_Date (For 0d methods: Pivot_Date = Effective_BOL) (For symbolic methods: Pivot_Date = resolved month/week/sequence start) Step 3: Apply Before_Pivot_Offset to Pivot_Date → Window_Start (then roll if non-GBD) Step 4: Apply After_Pivot_Offset to Pivot_Date → Window_End (then roll if non-GBD) Step 5: Enumerate reset dates from Window_Start to Window_End using Reset_Sym_Date: — Reset_Sym_Date = 1d → enumerate Good Business Days only Step 6: If Include_Pivot = Exclude → remove Pivot_Date from Reset_Dates[] Step 7: Num_Days = count(Reset_Dates[]) Step 8: For each date in Reset_Dates[], look up price from the contract identified by Nearby: — Nearby = 0 → spot price for that date — Nearby = 1 → front month (prompt) contract price as of that date Price_Average = arithmetic mean (blank if any price is missing) ``` --- ## 1.1 The Nearby Field — Futures Contract Price Selection **Nearby is a price lookup field, not a window calculation field.** | Nearby | Contract referenced | |---|---| | 0 | Spot — price effective for the reset date itself | | 1 | Front month (prompt) — nearest upcoming expiry as of each reset date | | 2 | Second nearby | | N | Nth nearby | The same pricing window is produced regardless of Nearby value. Num_Days is identical for any Nearby setting — only the price column values differ. > **Terminology note:** "Nearby" in Endur refers exclusively to futures contract proximity. No geographic meaning. --- ## 1.5 Pivot_Date_Offset Architecture — Key Design Principle The redesign of Pivot_Date_Offset as the primary anchor mechanism for month/week/sequence methods is the most important architectural concept: **Old approach:** Before_Pivot_Offset carried the symbolic expression (e.g. `1d>-2lom`). The window start was driven by a complex Before offset. **New approach:** Pivot_Date_Offset carries the symbolic expression. Before_Pivot_Offset is `0d` (window starts at the Pivot itself). This makes the model cleaner: - For EventPMANOWE: Pivot = first GBD of prior month. Window = [Pivot, last of Pivot's month]. - For EventCWA: Pivot = Monday of BOL week. Window = [Pivot, Friday of Pivot's week]. - For TMA CME: Pivot = first GBD after previous CME expiry. Window = [Pivot, next CME expiry]. **Why this matters:** With the Pivot anchored at the period start, `After = 1lom` always means "last of the Pivot's month" — which is the prior month end for PMA methods, regardless of when the BOL falls. This eliminates the month-contamination risk of the old architecture. --- ## 2. Family A — Event-Anchored Methods **Defining characteristic:** Pivot_Date_Offset = 0d. The Pivot equals the Effective BOL. Window defined by fixed GBD offsets before/after. **Methods:** X DAYS ARD Event, Event Date Roll Early, Event +Xdays_Roll Fwd, Event -Xdays_Roll Back, X days after Event_Roll Fwd, X days prior Event_Roll Back, Event Date Only, CycleSchDt-2 ### 2.1 Core Formula ``` Pivot_Date = Effective_BOL (Pivot_Date_Offset = 0d) Window_Start = AddGBDs(Pivot_Date, Before_Pivot_Offset) Window_End = AddGBDs(Pivot_Date, After_Pivot_Offset) ``` ### 2.2 Method-by-Method Logic #### X DAYS ARD Event - Roll Rule: `-Sat+Sun+MonHol-Hol` - Before = **−1 GBD**, After = **+1 GBD**, Include Pivot = **Include** - **Window:** [BOL − 1 GBD, BOL + 1 GBD] — symmetric 3-day window centred on BOL - **Num_Days:** 3 ``` Example: BOL = 03/18/2026 Wed (GBD) Pivot = 03/18/2026 Wed Window_Start = 03/18 − 1 GBD = 03/17/2026 Tue Window_End = 03/18 + 1 GBD = 03/19/2026 Thu Reset_Dates = [Tue 03/17, Wed 03/18, Thu 03/19] Num_Days = 3 ``` ``` Example: BOL = 03/27/2026 Fri (GBD) Pivot = 03/27/2026 Fri Window_Start = 03/27 − 1 GBD = 03/26/2026 Thu Window_End = 03/27 + 1 GBD = 03/30/2026 Mon (skip weekend) Reset_Dates = [Thu 03/26, Fri 03/27, Mon 03/30] Num_Days = 3 ``` #### Event Date Only - Roll Rule: `-Sat+Sun+MonHol-Hol` - Before = 0 GBDs, After = 0 GBDs, Include Pivot = **Include** - **Window:** [BOL, BOL] — single day - **Num_Days:** 1 #### Event Date Roll Early - Roll Rule: `-Sat+Sun+MonHol-Hol` - Before = −2 GBDs, After = +2 GBDs, Include Pivot = **Include** - **Window:** [BOL − 2 GBDs, BOL + 2 GBDs] — 5-day symmetric window - **Num_Days:** 5 #### Event +Xdays_Roll Fwd - Roll Rule: `-Sat+Sun+MonHol-Hol` - Before = 0 GBDs, After = +2 GBDs, Include Pivot = **Include** - **Window:** [BOL, BOL + 2 GBDs] - **Num_Days:** 3 #### Event -Xdays_Roll Back - Roll Rule: `-Sat+Sun+MonHol-Hol` - Before = −2 GBDs, After = 0 GBDs, Include Pivot = **Include** - **Window:** [BOL − 2 GBDs, BOL] - **Num_Days:** 3 #### X days after Event_Roll Fwd - Roll Rule: `-Sat+Sun+MonHol-Hol` - Before = 0 GBDs, After = +2 GBDs, Include Pivot = **Exclude** - **Effective Reset_Dates:** BOL+1 GBD and BOL+2 GBDs only - **Num_Days:** 2 #### X days prior Event_Roll Back - Roll Rule: `-Sat+Sun+MonHol-Hol` - Before = −2 GBDs, After = 0 GBDs, Include Pivot = **Exclude** - **Effective Reset_Dates:** BOL−2 GBDs and BOL−1 GBD only - **Num_Days:** 2 #### CycleSchDt-2 - Roll Rule: `-Sat+Sun+MonHol-Hol` - Pricing Event: **Cycle Close Date** (not BOL) - Before = −2 GBDs, After = 0 GBDs, Include Pivot = **Include** - **Window:** [CycleCloseDate − 2 GBDs, CycleCloseDate] - **Num_Days:** 3 --- ## 3. Family B — Calendar-Month Methods **Defining characteristic:** Pivot_Date_Offset anchors the Pivot to the first day of the target month. Before = 0d (window starts at Pivot). After = `1lom` (window ends at last of Pivot's month). **Methods:** CMANOWE, FX_Ref, CMAWE ### 3.1 Method-by-Method Logic #### CMANOWE - Roll Rule: `-SatSunHol`, Roll Boundary Resets = **No** - Pivot_Date_Offset: `1d>-1lom` → **first GBD of the current month** - Before = 0d, After = `1lom` → last calendar day of Pivot's month → rolls to last GBD - Avg Type: Unweighted - **Window:** First GBD to last GBD of the BOL month ``` Example: BOL = 03/18/2026 → Pivot = 03/02/2026 Mon (first GBD of March) Window_Start = 03/02/2026 Mon Window_End = 03/31/2026 Tue (last GBD of March) Num_Days = count of GBDs in March 2026 = 22 ``` #### FX_Ref - Same window as CMANOWE. Nearby = **0** (spot pricing). Roll Rule: `-SatSunHol`, Roll Boundary = No. - **Window:** Identical to CMANOWE — full current calendar month GBDs. #### CMAWE - Roll Rule: **No Roll**, Roll Boundary Resets = Yes - Pivot_Date_Offset: `1cd>-1lom` → **first calendar day of the current month** (may be Sat/Sun) - Before = 0d, After = `1lom` → last calendar day of Pivot's month - Avg Type: **Notional Weighted**, Stack_Non_GBD_Volume = **Yes** - **Window_Start:** Always the 1st of the month (even if weekend/holiday) - **Reset_Dates:** GBDs only (same set as CMANOWE), but volume from non-GBD days at month start stacks onto the first GBD ``` Example: BOL = 03/18/2026 (March 1 = Sunday) Pivot = 03/01/2026 Sun ← 1cd>-1lom Window_Start = 03/01/2026 Sun ← Before=0d Window_End = 03/31/2026 Tue Reset_Dates = all GBDs in March (same as CMANOWE) March 01 (Sun) volume stacked onto March 02 (Mon) Num_Days = 22 ``` **⚠ CMAWE ≠ CMANOWE:** Different Pivot_Date_Offset (`1cd>` vs `1d>`) and notional weighted vs unweighted. --- ## 4. Family C — Prior-Month / TMA Methods **Defining characteristic:** Pivot anchored to start of the prior month or previous date sequence boundary. Window covers the period between two sequence dates. **Methods:** EventPMANOWE, EventPMAWE, TMA Argus/Platts, TMA Nymex/CME ### 4.1 Sub-family C1 — Prior Calendar Month (EventPMANOWE, EventPMAWE) #### EventPMANOWE - Roll Rule: `-SatSunHol`, Roll Boundary Resets = **No** - Pivot_Date_Offset: `1d>-2lom` → **first GBD of the prior month** - Before = 0d (Window_Start = Pivot = first GBD of prior month) - After = `1lom` → last calendar day of Pivot's month → last GBD of prior month - Avg Type: Unweighted, Include_Pivot = **Include** - **Window:** All GBDs in the calendar month before the BOL month ``` Example: BOL = 03/18/2026 → Pivot = 02/02/2026 Mon (first GBD of February) Window_Start = 02/02/2026 Mon Window_End = 02/27/2026 Fri (last GBD of February; 02/28 is Saturday) Num_Days = 19 (Presidents' Day 02/16 excluded) ``` > **Note:** EventPMANOWE is sometimes confused with EventPMANEWE. The correct method name in Endur is EventPMANOWE. The corrected > Projection Methods Definition. #### EventPMAWE - Roll Rule: **No Roll**, Roll Boundary Resets = Yes - Pivot_Date_Offset: `1cd>-2lom` → **first calendar day of the prior month** - Before = 0d, After = `1lom` → last of prior month - Avg Type: **Notional Weighted**, Stack_Non_GBD_Volume = **Yes** - **Window_Start:** First calendar day of prior month (may be weekend/holiday) - **Reset_Dates:** GBDs of prior month (same set as EventPMANOWE); non-GBD volumes at month start stack onto first GBD **⚠ EventPMAWE ≠ EventPMANOWE:** `1cd>` vs `1d>` Pivot offset; notional weighted vs unweighted. ### 4.2 Sub-family C2 — TMA Argus/Platts > Uses the **arg_trm** date sequence from File 2 Section 2. No approximation needed — data is available. ``` currDate = smallest arg_trm date ≥ BOL Date (if BOL = sequence date exactly: currDate = BOL itself) Pivot_Anchor = currDate −2 entries [= -2arg_trm] Pivot_Date = NextGBD(Pivot_Anchor) [= 1d>-2arg_trm] = Window_Start Window_End = Pivot_Anchor +1 entry [= 1arg_trm] Num_Days = CountGBDs(Window_Start, Window_End) Include_Pivot = Include ``` #### TMA Argus/Platts - Reset Convention: `arg_trm` - Roll Rule: **No Roll** - Avg Type: Unweighted ``` Example: BOL = 03/18/2026 currDate = 03/25/2026 Wed (next arg_trm after BOL) Pivot_Anchor = 01/23/2026 Fri (currDate −2 entries: 03/25→02/25→01/23) Pivot_Date = NextGBD(01/23) = 01/26/2026 Mon = Window_Start Window_End = 02/25/2026 Wed (Pivot_Anchor +1 entry: 01/23→02/25) Num_Days = 22 [pivot 01/26 included; Presidents Day 02/16 excluded] ``` ### 4.3 Sub-family C3 — TMA Nymex/CME > Uses the **dmo_one_cme_xxv_minusgbd_three** sequence from File 2 Section 3. ``` currDate = smallest CME date ≥ BOL Date (if BOL = sequence date exactly: currDate = BOL itself) Pivot_Anchor = currDate −2 entries [= -2dmo_one_cme_xxv_minusgbd_three] Pivot_Date = NextGBD(Pivot_Anchor) [= 1d>-2dmo_one_cme_xxv_minusgbd_three] = Window_Start Window_End = Pivot_Anchor +1 entry [= 1dmo_one_cme_xxv_minusgbd_three] Num_Days = CountGBDs(Window_Start, Window_End) Include_Pivot = Include ``` #### TMA Nymex/CME - Reset Convention: `dmo_one_cme_xxv_minusgbd_three` - Roll Rule: **No Roll** - Avg Type: Unweighted ``` Example: BOL = 03/18/2026 currDate = 03/20/2026 Fri (next CME date after BOL) Pivot_Anchor = 01/20/2026 Tue (currDate −2 entries: 03/20→02/20→01/20) Pivot_Date = NextGBD(01/20) = 01/21/2026 Wed = Window_Start Window_End = 02/20/2026 Fri (Pivot_Anchor +1 entry: 01/20→02/20) Num_Days = 22 [pivot 01/21 included; Presidents Day 02/16 excluded] ``` --- ## 5. Family D — Week-Average Methods **Defining characteristic:** Pivot_Date_Offset anchors the Pivot to a Monday. After = `1low` (Friday of Pivot's week). Window spans Mon–Fri. **Methods:** EventCWA, EventPWA ### 5.1 Method-by-Method Logic #### EventCWA - Roll Rule: **-Sat+Sun+MonHol-Hol** (applied to BOL_Date → Effective_BOL; NOT the window boundary) - Pivot_Date_Offset: `0monday` → **Monday of the BOL week** - Before = 0d (Window_Start = Monday of BOL week) - After = `1low` → Friday (last calendar day) of the Pivot's week - Roll Boundary Resets = **Yes** → if Friday is a holiday, Window_End rolls FORWARD (After) to Monday - Avg Type: Unweighted - **Window:** Mon–Fri of the BOL week (Window_End may cross into next week if Friday is a holiday) ``` Example A: BOL = 03/18/2026 Wed (no holiday that week) Pivot_Date = 03/16/2026 Mon Window_Start = 03/16/2026 Mon Window_End = 03/20/2026 Fri Num_Days = 5 Example B: BOL = 03/31/2026 Tue (TC-077 — Good Friday 04/03) Pivot_Date = 03/30/2026 Mon Window_Start = 03/30/2026 Mon 1low = 04/03/2026 Fri = Good Friday (holiday) Non-GBD Roll Rule: −Hol → BACKWARD → Window_End = 04/02/2026 Thu ⚠ After Offset Roll = "After" controls SEQUENCING (roll applied after offset calculation), NOT direction. Direction always comes from the Non-GBD Roll Rule tokens. Reset dates in [03/30, 04/02]: 03/30, 03/31, 04/01, 04/02 = 4 GBDs ``` > ⚠ **Common confusion:** The "No Roll" label in some summary tables refers to the > Non-GBD Roll Rule for BOL_Date (column R of the spreadsheet). It does NOT mean > Roll Boundary Resets = No. For EventCWA, Roll Boundary Resets = **Yes**. #### EventPWA - Roll Rule: **-Sat+Sun+MonHol-Hol** (applied to BOL_Date → Effective_BOL; NOT the window boundary) - Pivot_Date_Offset: `-1monday` → **Monday of the PRIOR week** (week before the BOL week) - Before = 0d (Window_Start = Monday of prior week) - After = `1low` → Friday (last calendar day) of the Pivot's week (= Friday of prior week) - Roll Boundary Resets = **Yes** → if prior Friday is a holiday, Window_End rolls FORWARD to Monday - Avg Type: Unweighted - **Window:** Mon–Fri of the week BEFORE the BOL week ``` Example: BOL = 03/18/2026 Wed BOL week starts on 03/16 Mon Prior week Monday = -1monday = 03/09/2026 Mon Pivot_Date = 03/09/2026 Mon Window_Start = 03/09/2026 Mon Window_End = 03/13/2026 Fri Num_Days = 5 (no holidays that prior week) ``` > **⚠ EventPWA ≠ EventCWA:** EventPWA prices the PRIOR week. EventCWA prices the CURRENT week. > This is not a subtle difference — the windows are entirely different sets of dates. --- ## 6. Family E — Flexible Pricing Period (DEEMED DATE) **Method:** DEEMED DATE The pricing window is defined entirely at the **deal level** by the user. No window can be calculated from BOL. The Agent must ask the user for the pricing period start and end dates. ### 6.1 Core Concept | Parameter | Source | |---|---| | Window_Start | User-provided (deal-level) | | Window_End | User-provided (deal-level) | | Reset_Sym_Date | User-configurable: `1d` (default) or `1cd` | | NGB Roll Rule | **No Roll** (base configuration) | ### 6.2 Agent Interaction Required When a user requests DEEMED DATE calculation, ask for: 1. **Pricing Period Start Date** (Window_Start) 2. **Pricing Period End Date** (Window_End) 3. **Reset_Sym_Date:** `1d` (GBDs only, default) or `1cd` (calendar days)? --- ## 7. Include vs Exclude Pivot — Effect on Num_Days | Include_Pivot | Window | Pivot in Reset_Dates? | Num_Days | |---|---|---|---| | Include | [BOL−1, BOL+1] | Yes | 3 | | Include | [BOL−2, BOL+2] | Yes | 5 | | Include | [BOL, BOL] | Yes | 1 | | Exclude | [BOL, BOL+2] | No — BOL excluded | 2 | | Exclude | [BOL−2, BOL] | No — BOL excluded | 2 | | Include (TMA/PMA) | [PivotStart, SequenceEnd] | Yes — Pivot counted | varies (19–22) | | N/A | Full calendar month | Not applicable | 19–23 | | N/A | Mon–Fri of week | Not applicable | 4–5 | --- ## 8. Quick Reference: All Methods | Name | Family | Roll Rule | Pivot_Date_Offset | Window Start | Window End | Incl/Excl | Typical Days | |---|---|---|---|---|---|---|---| | DEEMED DATE | E-Flexible | No Roll | 0d | User-provided | User-provided | N/A | varies | | EventPMANOWE | C1-Prior Month | -SatSunHol | `1d>-2lom` | First GBD prior month | Last GBD prior month | Include | ~19–21 | | EventPMAWE | C1-Prior Month | No Roll | `1cd>-2lom` | First cal day prior month | Last GBD prior month | Include | ~19–21 | | CMANOWE | B-Cal Month | -SatSunHol | `1d>-1lom` | First GBD current month | Last GBD current month | Include (N/A) | ~20–23 | | TMA Argus/Platts | C2-ArgTRM | No Roll | `1d>-2arg_trm` | NextGBD(prev arg_trm) | curr arg_trm | Include | ~18–22 | | CycleSchDt-2 | A-Event | -Sat+Sun+MonHol-Hol | 0d | −2 GBDs | 0 GBDs | Include | 3 | | FX_Ref | B-Cal Month | -SatSunHol | `1d>-1lom` | First GBD current month | Last GBD current month | Include (N/A) | ~20–23 | | X DAYS ARD Event | A-Event | -Sat+Sun+MonHol-Hol | 0d | −1 GBD | +1 GBD | Include | 3 | | CMAWE | B-Cal Month | No Roll | `1cd>-1lom` | First cal day current month | Last GBD current month | Include (N/A) | ~20–23 | | EventCWA | D-Week | No Roll | `0monday` | Monday of BOL week | Friday of BOL week | Include (N/A) | 4–5 | | TMA Nymex/CME | C3-CME | No Roll | `1d>-2dmo_one_cme_xxv_minusgbd_three` | NextGBD(prev CME expiry) | curr CME expiry | Include | ~18–22 | | Event Date Roll Early | A-Event | -Sat+Sun+MonHol-Hol | 0d | −2 GBDs | +2 GBDs | Include | 5 | | Event +Xdays_Roll Fwd | A-Event | -Sat+Sun+MonHol-Hol | 0d | 0 GBDs | +2 GBDs | Include | 3 | | Event -Xdays_Roll Back | A-Event | -Sat+Sun+MonHol-Hol | 0d | −2 GBDs | 0 GBDs | Include | 3 | | X days after Event_Roll Fwd | A-Event | -Sat+Sun+MonHol-Hol | 0d | 0 GBDs | +2 GBDs | Exclude | 2 | | X days prior Event_Roll Back | A-Event | -Sat+Sun+MonHol-Hol | 0d | −2 GBDs | 0 GBDs | Exclude | 2 | | EventPWA | D-Week | No Roll | `-1monday` | Monday of **prior** week | Friday of prior week | Include (N/A) | 4–5 | | Event Date Only | A-Event | -Sat+Sun+MonHol-Hol | 0d | 0 GBDs | 0 GBDs | Include | 1 | --- *Source: Projection Methods Definition.xlsx (updated), Endur V26 documentation, validated test cases*