diff --git a/.gitignore b/.gitignore index 0e59d72..a2da2c1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,8 @@ .ipynb_checkpoints ipynb_checkpoints *.png +*/.env +.env +EconomicStressAgentORE/oredata/Output +EconomicStressAgentORE/oredata/ore_agent.xml +EconomicStressAgentORE/oredata/Input/agent_stress.xml diff --git a/EconomicStressAgentORE/.env.example b/EconomicStressAgentORE/.env.example new file mode 100644 index 0000000..0bd2e4a --- /dev/null +++ b/EconomicStressAgentORE/.env.example @@ -0,0 +1,8 @@ +# LLM API key (OpenAI) +OPENAI_API_KEY=sk-... + +# OpenAI model to use +OPENAI_MODEL=gpt-5.2 + +# LLM temperature (0.0 = deterministic, 1.0 = creative) +OPENAI_TEMPERATURE=0.2 diff --git a/EconomicStressAgentORE/.gitignore b/EconomicStressAgentORE/.gitignore new file mode 100644 index 0000000..2b08d06 --- /dev/null +++ b/EconomicStressAgentORE/.gitignore @@ -0,0 +1,2 @@ +OREDir/Output/* +__pycache__/ \ No newline at end of file diff --git a/EconomicStressAgentORE/README.md b/EconomicStressAgentORE/README.md new file mode 100644 index 0000000..7d267cf --- /dev/null +++ b/EconomicStressAgentORE/README.md @@ -0,0 +1,274 @@ +# Economic Scenario Stress Test Agent + +An AI agent that maps a free-text economic scenario to similar historical scenarios, +derives market shifts, runs an ORE stress test, and summarises the P&L impact. + +This is just educational purpose, I developed this agent to learn more about AI Agents +and how to integrate Open Source Risk Engine into an Agent. + +The scenarios are mock and AI generated, as is most of the code. + +## Workflow + +``` +User describes scenario + │ + ▼ +┌─────────────────────────┐ +│ 1. Scenario Analyzer │ GPT-4 + 20-scenario knowledge base +│ (historical lookup) │ +└───────────┬─────────────┘ + │ structured JSON of market shifts + ▼ +┌─────────────────────────┐ +│ 2. Stress Test Builder │ generates agent_stress.xml for ORE +└───────────┬─────────────┘ + │ ore_agent.xml + Input/agent_stress.xml + ▼ +┌─────────────────────────┐ +│ 3. ORE Runner │ runs ORE (Python API) +└───────────┬─────────────┘ + │ Output/stresstest.csv + ▼ +┌─────────────────────────┐ +│ 4. Impact Summarizer │ Markdown report + LLM narrative +└─────────────────────────┘ +``` + +## Known Shortcomings & Shortcuts + +This project is a proof-of-concept built for learning purposes. Several design +decisions were taken as shortcuts and would need to be rethought for any +production use. + +### 1. Historical scenarios are mock data + +The 20 historical episodes in `data/scenarios.json` are AI-generated +approximations, not rigorously sourced market data. In a real system these +would be replaced by: + +- Curated, auditable data sets of actual market moves (sourced from market + data providers or internal risk databases). +- Proper versioning and provenance tracking so every shift can be traced + back to an observed market event. + +### 2. The LLM produces the final shifts directly — not auditable + +Currently the LLM receives the historical scenarios, picks the closest +matches, and returns a _weighted average_ of market shifts in a single step. +This is problematic because: + +- **Non-reproducible**: the same prompt can yield different numbers across + runs or model versions, making results impossible to audit. +- **Not explainable**: there is no transparent formula an auditor or + regulator can inspect — the blending logic is a black box inside the model. + +A better architecture would split the task in two: + +1. **LLM step (qualitative)**: the model selects the _N_ closest historical + scenarios and proposes a _severity multiplier_ (e.g. "80% of the 2008 + crisis combined with 50% of the Dot-com bust"). This output is + human-readable and auditable. +2. **Deterministic step (quantitative)**: a macro-economic model or a simple rule-based mapping takes the selected scenarios and severity parameters + as inputs and produces the final shift vector. Because the model is + versioned code with fixed parameters, the output is fully reproducible, + testable, and auditable. + +This separation keeps the LLM's role limited to _judgement_ (scenario +matching and severity assessment) while all _numerical_ work is done by +auditable, deterministic code. + +### 3. Other simplifications + +- **Single stress scenario per run** — no support for running a grid of + severities or multiple scenarios in one invocation. +- **No volatility or correlation shifts** — only spot-level shifts are + applied; a real stress test would also shock implied vols, correlations, + and basis spreads. +- **Flat extrapolation of tenor grids** — shift curves are linearly + interpolated and flat-extrapolated, which may be too simplistic for + far-out-of-grid tenors. +- **No validation against market bounds** — the LLM-generated shifts are + not sanity-checked (e.g. negative rates below a floor, FX moves beyond + historical extremes). +- **Toy portfolio** — the included ORE workspace has only a handful of + trades; +- **Construction of simulation/stresstest/sensitivity config** is incomplete and can handle + only a few risk factors (no volatilities, no commodity risk factors) and allow only a small range or products. + +## Setup + +### 1. Install dependencies + +```bash +pip install -r requirements.txt +``` + +The `open-source-risk-engine` package provides the ORE Python bindings (`from ORE import *`). + +### 2. Configure environment + +```bash +cp .env.example .env +# then edit .env +``` + +`.env` keys: + +| Key | Description | Required | +| ---------------- | ------------------------------- | -------- | +| `OPENAI_API_KEY` | Your OpenAI API key | Yes | +| `OPENAI_MODEL` | Model name (default: `gpt-5.2`) | No | + +### 3. ORE workspace + +The agent expects the ORE workspace at `./oredata/` containing: + +``` +oredata/ +├── ore.xml ← main ORE config +├── Input/ +│ ├── portfolio.xml +│ ├── marketdata.csv +│ ├── conventions.xml +│ ├── curveconfig.xml +│ ├── todaysmarket.xml +│ ├── simulation.xml +│ ├── sensitivity.xml +│ └── pricingengine.xml +└── Output/ ← cleaned and recreated on each run +``` + +The agent injects two files at runtime: + +- `oredata/Input/agent_stress.xml` — generated stress scenario +- `oredata/ore_agent.xml` — stripped-down ore.xml (stress analytic only) + +## Usage + +```bash +# Basic usage +python agent.py --scenario "Giant monsters emerge from the ocean and destroy two major capitals in Europe and Asia simultaneously, triggering martial law, insurance system collapse, and a global flight to safety" + +# With all options +python agent.py \ + --scenario "python agent.py --scenario "Giant monsters emerge from the ocean and destroy two major capitals in Europe and Asia simultaneously, triggering martial law, insurance system collapse, and a global flight to safety" \ + --ore-workspace ./oredata \ + --scenario-id my_scenario \ + --output report.md \ + --verbose +``` + +## Architecture + +| File | Purpose | +| -------------------------- | ------------------------------------------------------- | +| `agent.py` | CLI orchestrator — ties all steps together | +| `scenario_analyzer.py` | LLM call — maps text to market shifts | +| `stresstest_builder.py` | XML generator — writes ORE stress test config | +| `ore_runner.py` | ORE execution via Python API | +| `impact_summarizer.py` | CSV parser + LLM narrative report | +| `historical_scenarios.py` | `ScenarioKnowledgeBase` class — loads `scenarios.json` | +| `todaysmarket_analyzer.py` | Parses todaysmarket.xml to discover curves and equities | +| `config.py` | Paths, model settings, tenor grids | +| `data/scenarios.json` | 20 historical episodes with structured shifts | + +## Market shift schema + +Shifts are specified in a generic, multi-currency schema: + +| Asset class | Schema key | Value convention | ORE mapping | +| ----------- | ------------ | ---------------------------------------- | ------------------------------- | +| Rates | `rates.CCY` | Absolute (decimal, e.g. -0.015 = -150bp) | Discount + Index curves per ccy | +| FX | `fx.PAIR` | Absolute change in spot | FxSpot (inverted for ORE) | +| Equity | `equity.KEY` | Relative (e.g. -0.25 = -25%) | EquitySpot | +| Credit | `credit.KEY` | Absolute per tenor (widening positive) | SurvivalProbability | + +Rate and credit shifts are interpolated onto the ORE tenor grid using +`ORE.LinearInterpolation` with flat extrapolation. + +Equity and credit names are resolved via an optional sector mapping +(`sector_mapping.csv`) that maps trade-level names to scenario-level keys. + +## Example output + +``` +╔══════════════════════════════════════════════════════════╗ +║ Economic Scenario Stress Test Agent ║ +╚══════════════════════════════════════════════════════════╝ + +Analyzing scenario: "Giant monsters emerge from the ocean and destroy two major capitals in Europe and Asia simultaneously, triggering martial law, insurance system collapse, and a global flight to safety" + + ▶ Step 1/5 Analyzing scenario with LLM … + ✓ Scenario analysis complete + +Matched scenarios: + • 2008 Global Financial Crisis (Sep 2008 – Mar 2009) + • 2020 COVID-19 Crash (Feb – Mar 2020) + • Eurozone Break-up (Tail Risk) (Hypothetical) + +Reasoning: Simultaneous destruction of major capitals with martial law and insurance-system collapse implies an extreme, sudden global risk-off/liquidity shock (GFC/COVID-like) plus acute Europe-specific tail risk and EUR dislocation (Eurozone break-up proxy). Weighted blend emphasizes severe credit stress and safe-haven bid, with EUR underperformance; scaled up to reflect catastrophic severity beyond typical historical episodes. + +Proposed market shifts: + FX EURUSD: -0.1875 + Equity EUR: -63.7% + Equity USD: -48.0% + Rates EUR: 1Y -8bp 2Y -9bp 3Y -9bp 5Y -6bp 10Y -4bp 30Y -2bp + Rates USD: 1Y -225bp 2Y -240bp 3Y -240bp 5Y -225bp 10Y -180bp 30Y -135bp + Credit EUR: 1Y +270bp 2Y +375bp 3Y +435bp 5Y +495bp 10Y +465bp + Credit USD: 1Y +225bp 2Y +300bp 3Y +360bp 5Y +420bp 10Y +375bp + Credit Sovereign: 1Y +675bp 2Y +945bp 3Y +1080bp 5Y +1215bp 10Y +1080bp + + ▶ Step 2/5 Parsing todaysmarket.xml … + ✓ Discovered 2 currencies, 2 discount curves, 2 equities, 1 credit names + + ▶ Step 3/5 Generating ORE stress test XML … + ✓ Written: /Users/matthiasgroncki/quant-dev/IPythonScripts/EconomicStressAgentORE/oredata/Input/agent_stress.xml + ✓ Written: /Users/matthiasgroncki/quant-dev/IPythonScripts/EconomicStressAgentORE/oredata/ore_agent.xml + + ▶ Step 4/5 Running ORE … +Running ORE with config: ore_agent.xml from workspace: /Users/matthiasgroncki/quant-dev/IPythonScripts/EconomicStressAgentORE/oredata +Loading inputs OK +Requested analytics STRESS +StressTestAnalytic: Build Market OK +StressTestAnalytic: Build Portfolio OK +Risk: Stress Test Report OK +Writing reports... OK +Writing cubes... OK +run time: 0.180000 sec +ORE done. + ✓ ORE completed. Results: /Users/matthiasgroncki/quant-dev/IPythonScripts/EconomicStressAgentORE/oredata/Output/stresstest.csv + + ▶ Step 5/5 Generating impact report … + ✓ Report ready + +════════════════════════════════════════════════════════════ + Portfolio Stress Test Impact Report +════════════════════════════════════════════════════════════ + + TOTAL P&L: -20,452,247 EUR [▼ LOSS] + +┌───────────────┬────────────┬──────────────┬─────────────┐ +│ Trade │ Base NPV │ Stressed NPV │ P&L Impact │ +├───────────────┼────────────┼──────────────┼─────────────┤ +│ XccySwap │ 268,878 │ -18,241,162 │ -18,510,040 │ +│ EquityCFD_USD │ 76,647 │ -3,119,320 │ -3,195,967 │ +│ EquityCFD_EUR │ 1,263,244 │ -1,709,064 │ -2,972,308 │ +│ EUR6MSwap │ 5,924,804 │ 5,774,330 │ -150,474 │ +│ CDS │ -6,405,864 │ -2,029,322 │ +4,376,542 │ +├═══════════════┼════════════┼══════════════┼═════════════┤ +│ TOTAL │ 1,127,710 │ -19,324,538 │ -20,452,247 │ +└───────────────┴────────────┴──────────────┴─────────────┘ + +──────────────────────────────────────────────────────────── + Narrative Summary +──────────────────────────────────────────────────────────── + +Under the “global flight to safety” shock—EURUSD down 0.1875 (absolute), equities down 63.7% in EUR and 48.0% in USD, sharp USD rate rallies (down 225–240bp out to 5Y and down 180bp at 10Y), and severe spread widening (EUR credit +270bp to +495bp, USD credit +225bp to +420bp, sovereign credit +675bp to +1,215bp)—the portfolio moves from a base NPV of EUR 1,127,710 to a stressed NPV of EUR -19,324,538. This is a total P&L impact of EUR -20,452,247, indicating the portfolio is highly exposed to combined FX dislocation, equity crash risk, and cross-currency/rates basis dynamics under extreme systemic stress. + +The loss is overwhelmingly driven by the cross-currency and equity risk factors. The XccySwap contributes EUR -18,510,040 of the total drawdown, with its valuation swinging from EUR 268,878 to EUR -18,241,162, consistent with a regime where USD funding stress and large EURUSD moves dominate outcomes. Equity risk is the next major driver: EquityCFD_USD loses EUR -3,195,967 (EUR 76,647 to EUR -3,119,320) and EquityCFD_EUR loses EUR -2,972,308 (EUR 1,263,244 to EUR -1,709,064), reflecting the -48.0% and -63.7% equity shocks compounded by the EURUSD drop for USD-denominated exposure when reported in EUR. + +Offsetting gains come primarily from credit protection. The CDS position generates EUR +4,376,542 (from EUR -6,405,864 to EUR -2,029,322), benefiting from the very large credit and sovereign spread widening (up to +495bp in EUR credit and +1,215bp in sovereign spreads at 5Y). Rates contribute only marginally: the EUR6MSwap loses EUR -150,474 (EUR 5,924,804 to EUR 5,774,330), consistent with relatively small EUR curve shifts (single-digit bp rally across tenors) compared with the much larger moves in USD rates and credit. + +Overall, the stress test indicates a concentrated tail risk profile: the portfolio’s protection via CDS is meaningful but insufficient against the dominant cross-currency swap exposure and equity beta in a simultaneous FX break and equity crash. The result suggests the portfolio is effectively short extreme funding/FX dislocation (via the XccySwap) and long risk assets (via the equity CFDs), with credit hedges providing partial convexity but not enough to prevent a large negative NPV under systemic shock. The key risk interpretation is that diversification breaks down in this scenario and the portfolio’s P&L is governed by a small number of positions whose sensitivities amplify precisely when liquidity and basis risks are most stressed. +``` diff --git a/EconomicStressAgentORE/agent.py b/EconomicStressAgentORE/agent.py new file mode 100644 index 0000000..14046de --- /dev/null +++ b/EconomicStressAgentORE/agent.py @@ -0,0 +1,196 @@ +""" +agent.py — Economic Scenario Stress Test Agent (CLI orchestrator). + +Usage: + python agent.py --scenario "A sudden European banking crisis" [options] +""" + +from __future__ import annotations + +import sys +from pathlib import Path + +import click + +import config +from historical_scenarios import ScenarioKnowledgeBase +import impact_summarizer +import ore_runner +import scenario_analyzer +import stresstest_builder +import todaysmarket_analyzer + +BANNER = """ +╔══════════════════════════════════════════════════════════╗ +║ Economic Scenario Stress Test Agent ║ +╚══════════════════════════════════════════════════════════╝ +""" + +STEP = " ▶ " +OK = " ✓ " +WARN = " ⚠ " + + +# ── Core orchestration ──────────────────────────────────────────────────────── + +def run( + scenario_description: str, + ore_workspace: Path, + scenario_id: str = "agent_scenario", + verbose: bool = False, +) -> str: + """ + Full pipeline: analyze → build → run ORE → summarize. + + Parameters + ---------- + scenario_description : free-text user scenario + ore_workspace : path to the OREDir workspace + scenario_id : identifier embedded in the stress test XML + verbose : print extra debug info + + Returns + ------- + Markdown-formatted report string. + """ + print(BANNER) + print(f'Analyzing scenario: "{scenario_description}"\n') + + # ── Step 1: Scenario Analysis ───────────────────────────────────────── + print(STEP + "Step 1/5 Analyzing scenario with LLM …") + knowledge_base = ScenarioKnowledgeBase( + config.DATA_DIR / "scenarios.json" + ) + analysis = scenario_analyzer.analyze(scenario_description, knowledge_base) + print(OK + "Scenario analysis complete\n") + print(scenario_analyzer.format_shifts(analysis)) + print() + + shifts = analysis["shifts"] + + # ── Step 2: Parse market structure ──────────────────────────────────── + print(STEP + "Step 2/5 Parsing todaysmarket.xml …") + ore_workspace = Path(ore_workspace) + tm_xml = ore_workspace / "Input" / "todaysmarket.xml" + market = todaysmarket_analyzer.parse(tm_xml) + sector_map = todaysmarket_analyzer.load_sector_mapping() + print(OK + f"Discovered {len(market.currencies)} currencies, " + f"{len(market.discount_curves)} discount curves, " + f"{len(market.equity_curves)} equities, " + f"{len(market.default_curves)} credit names\n") + + # ── Step 3: Build stress test XML ───────────────────────────────────── + print(STEP + "Step 3/5 Generating ORE stress test XML …") + + stress_xml = ore_workspace / "Input" / "agent_stress.xml" + stresstest_builder.build( + shifts=shifts, + market=market, + sector_map=sector_map, + output_path=stress_xml, + scenario_id=scenario_id, + scenario_label=( + "Generated by Economic Scenario Stress Test Agent | " + "Matched: " + ", ".join(analysis["matched_scenarios"]) + ), + ) + print(OK + f"Written: {stress_xml}") + + ore_agent_xml = ore_workspace / "ore_agent.xml" + stresstest_builder.build_ore_config( + base_ore_xml=ore_workspace / "ore.xml", + output_ore_xml=ore_agent_xml, + stress_config_file="agent_stress.xml", + market=market, + ) + print(OK + f"Written: {ore_agent_xml}\n") + + # ── Step 4: Run ORE ─────────────────────────────────────────────────── + print(STEP + "Step 4/5 Running ORE …") + csv_path = ore_runner.run( + ore_xml=ore_agent_xml, + workspace=ore_workspace, + ) + print(OK + f"ORE completed. Results: {csv_path}\n") + + # ── Step 5: Summarize ───────────────────────────────────────────────── + print(STEP + "Step 5/5 Generating impact report …") + report = impact_summarizer.summarize( + csv_path=csv_path, + scenario_description=scenario_description, + shifts=shifts, + scenario_id=scenario_id, + ) + print(OK + "Report ready\n") + + return report + + +# ── CLI ─────────────────────────────────────────────────────────────────────── + +@click.command() +@click.option( + "--scenario", "-s", + required=True, + help="Free-text description of the economic scenario to stress-test.", +) +@click.option( + "--ore-workspace", + default=str(config.ORE_WORKSPACE), + show_default=True, + help="Path to the ORE workspace directory (must contain ore.xml, Input/, Output/).", +) +@click.option( + "--scenario-id", + default="agent_scenario", + show_default=True, + help="Identifier for the stress scenario in the ORE XML (no spaces).", +) +@click.option( + "--output", + "-o", + default=None, + help="Write the Markdown report to this file (prints to stdout if not set).", +) +@click.option("--verbose", "-v", is_flag=True, help="Enable verbose output.") +def main( + scenario: str, + ore_workspace: str, + scenario_id: str, + output: str | None, + verbose: bool, +) -> None: + """Economic Scenario Stress Test Agent. + + Analyses a free-text economic scenario, maps it to historical market + parallels, generates an ORE stress test, runs it, and prints a P&L report. + """ + try: + report = run( + scenario_description=scenario, + ore_workspace=Path(ore_workspace), + scenario_id=scenario_id, + verbose=verbose, + ) + except EnvironmentError as exc: + click.echo(f"\n{WARN} Configuration error: {exc}", err=True) + sys.exit(1) + except FileNotFoundError as exc: + click.echo(f"\n{WARN} File not found: {exc}", err=True) + sys.exit(1) + except Exception as exc: # noqa: BLE001 + click.echo(f"\n{WARN} Unexpected error: {exc}", err=True) + if verbose: + import traceback + traceback.print_exc() + sys.exit(1) + + if output: + Path(output).write_text(report, encoding="utf-8") + click.echo(f"Report written to: {output}") + else: + print(report) + + +if __name__ == "__main__": + main() diff --git a/EconomicStressAgentORE/config.py b/EconomicStressAgentORE/config.py new file mode 100644 index 0000000..57034c4 --- /dev/null +++ b/EconomicStressAgentORE/config.py @@ -0,0 +1,46 @@ +""" +config.py — central configuration for the Economic Scenario Stress Test Agent. +""" + +import os +from pathlib import Path + +from dotenv import load_dotenv + +load_dotenv() + +# ── Paths ───────────────────────────────────────────────────────────────────── +BASE_DIR = Path(__file__).parent +DATA_DIR = BASE_DIR / "data" # raw data files (e.g. historical scenarios) +ORE_WORKSPACE = BASE_DIR / "oredata" # workspace that contains ore.xml +ORE_INPUT_DIR = ORE_WORKSPACE / "Input" +ORE_OUTPUT_DIR = ORE_WORKSPACE / "Output" + +# Generated files written by the agent +AGENT_STRESS_XML = ORE_INPUT_DIR / "agent_stress.xml" +AGENT_ORE_XML = ORE_WORKSPACE / "ore_agent.xml" + +# ── LLM ─────────────────────────────────────────────────────────────────────── +OPENAI_API_KEY: str = os.getenv("OPENAI_API_KEY", "") +OPENAI_MODEL: str = os.getenv("OPENAI_MODEL", "gpt-5.2") +OPENAI_TEMPERATURE: float = float(os.getenv("OPENAI_TEMPERATURE", "0.2")) + +# ── Sector-mapping CSV (maps equity/credit names → sectors) ─────────────────── +SECTOR_MAPPING_CSV: Path = BASE_DIR / "sector_mapping.csv" + +# ── Standard tenor grids (used when generating simulation.xml & stresstest) ─── +STANDARD_RATE_TENORS: list[str] = [ + "1Y", "2Y", "3Y", "5Y", "7Y", "10Y", "15Y", "20Y", "30Y", +] + +STANDARD_CREDIT_TENORS: list[str] = [ + "6M", "1Y", "2Y", "3Y", "5Y", "7Y", "10Y", "15Y", "20Y", +] + +STANDARD_INFLATION_TENORS: list[str] = [ + "1Y", "2Y", "3Y", "5Y", "7Y", "10Y", "15Y", "20Y", "30Y", +] + +STANDARD_EQUITY_DIV_TENORS: list[str] = [ + "6M", "1Y", "2Y", "3Y", "5Y", "7Y", "10Y", +] diff --git a/EconomicStressAgentORE/data/scenarios.json b/EconomicStressAgentORE/data/scenarios.json new file mode 100644 index 0000000..0ba7a2e --- /dev/null +++ b/EconomicStressAgentORE/data/scenarios.json @@ -0,0 +1,987 @@ +[ + { + "name": "2008 Global Financial Crisis", + "period": "Sep 2008 – Mar 2009", + "description": "Collapse of Lehman Brothers triggered a global credit crunch, massive equity sell-off, flight to quality into US Treasuries, and extreme volatility across all asset classes.", + "shifts": { + "rates": { + "EUR": { + "1Y": -0.02, + "2Y": -0.025, + "5Y": -0.015, + "10Y": -0.01, + "30Y": -0.005 + }, + "USD": { + "1Y": -0.03, + "2Y": -0.03, + "5Y": -0.02, + "10Y": -0.015, + "30Y": -0.01 + } + }, + "fx": { "EURUSD": -0.1 }, + "equity": { + "EUR": -0.45, + "USD": -0.4 + }, + "credit": { + "EUR": { + "1Y": 0.015, + "2Y": 0.02, + "3Y": 0.025, + "5Y": 0.03, + "10Y": 0.035 + }, + "USD": { "1Y": 0.02, "2Y": 0.025, "3Y": 0.03, "5Y": 0.035, "10Y": 0.04 } + } + } + }, + { + "name": "2010-2012 European Sovereign Debt Crisis", + "period": "2010 – 2012", + "description": "Greek debt crisis spread to Ireland, Portugal, Spain, and Italy. EUR weakened significantly, European equities fell, and EUR rates were cut while peripheral spreads blew out.", + "shifts": { + "rates": { + "EUR": { + "1Y": -0.01, + "2Y": -0.012, + "5Y": -0.008, + "10Y": -0.005, + "30Y": -0.003 + }, + "USD": { + "1Y": -0.008, + "2Y": -0.01, + "5Y": -0.012, + "10Y": -0.015, + "30Y": -0.01 + } + }, + "fx": { "EURUSD": -0.15 }, + "equity": { + "EUR": -0.3, + "USD": -0.12 + }, + "credit": { + "EUR": { + "1Y": 0.012, + "2Y": 0.018, + "3Y": 0.022, + "5Y": 0.025, + "10Y": 0.02 + }, + "USD": { + "1Y": 0.005, + "2Y": 0.006, + "3Y": 0.007, + "5Y": 0.008, + "10Y": 0.008 + }, + "Sovereign": { + "1Y": 0.03, + "2Y": 0.04, + "3Y": 0.05, + "5Y": 0.06, + "10Y": 0.05 + } + } + } + }, + { + "name": "2015 China Devaluation / EM Shock", + "period": "Aug – Sep 2015", + "description": "PBoC surprised markets with a CNY devaluation, triggering a global equity sell-off and flight to safety.", + "shifts": { + "rates": { + "EUR": { + "1Y": -0.002, + "2Y": -0.003, + "5Y": -0.005, + "10Y": -0.008, + "30Y": -0.006 + }, + "USD": { + "1Y": -0.005, + "2Y": -0.008, + "5Y": -0.012, + "10Y": -0.015, + "30Y": -0.01 + } + }, + "fx": { "EURUSD": 0.04 }, + "equity": { + "EUR": -0.18, + "USD": -0.12 + }, + "credit": { + "EUR": { + "1Y": 0.003, + "2Y": 0.004, + "3Y": 0.005, + "5Y": 0.005, + "10Y": 0.004 + }, + "USD": { + "1Y": 0.002, + "2Y": 0.003, + "3Y": 0.004, + "5Y": 0.004, + "10Y": 0.003 + } + } + } + }, + { + "name": "2020 COVID-19 Crash", + "period": "Feb – Mar 2020", + "description": "Global pandemic caused the fastest equity bear market in history, massive rate cuts, and a short-lived USD liquidity squeeze.", + "shifts": { + "rates": { + "EUR": { + "1Y": -0.003, + "2Y": -0.005, + "5Y": -0.007, + "10Y": -0.008, + "30Y": -0.005 + }, + "USD": { + "1Y": -0.015, + "2Y": -0.015, + "5Y": -0.012, + "10Y": -0.01, + "30Y": -0.008 + } + }, + "fx": { "EURUSD": -0.03 }, + "equity": { + "EUR": -0.35, + "USD": -0.34 + }, + "credit": { + "EUR": { + "1Y": 0.012, + "2Y": 0.018, + "3Y": 0.022, + "5Y": 0.025, + "10Y": 0.02 + }, + "USD": { + "1Y": 0.015, + "2Y": 0.02, + "3Y": 0.025, + "5Y": 0.028, + "10Y": 0.022 + } + } + } + }, + { + "name": "2022 Russia-Ukraine / Energy Crisis", + "period": "Feb – Oct 2022", + "description": "Russian invasion of Ukraine caused energy supply shock in Europe, EUR fell to parity with USD, European equities dropped, and central banks hiked rates aggressively to fight inflation.", + "shifts": { + "rates": { + "EUR": { + "1Y": 0.025, + "2Y": 0.03, + "5Y": 0.025, + "10Y": 0.02, + "30Y": 0.015 + }, + "USD": { + "1Y": 0.03, + "2Y": 0.035, + "5Y": 0.025, + "10Y": 0.018, + "30Y": 0.012 + } + }, + "fx": { "EURUSD": -0.15 }, + "equity": { + "EUR": -0.22, + "USD": -0.25 + }, + "credit": { + "EUR": { + "1Y": 0.01, + "2Y": 0.014, + "3Y": 0.016, + "5Y": 0.018, + "10Y": 0.015 + }, + "USD": { + "1Y": 0.004, + "2Y": 0.006, + "3Y": 0.007, + "5Y": 0.008, + "10Y": 0.007 + } + } + } + }, + { + "name": "1992 ERM Crisis / Black Wednesday", + "period": "Sep 1992", + "description": "Speculative attack on the British pound and Italian lira forced exits from the ERM. European currencies fell sharply against the DEM. EUR proxy (DEM) strengthened vs USD.", + "shifts": { + "rates": { + "EUR": { + "1Y": 0.01, + "2Y": 0.008, + "5Y": 0.005, + "10Y": 0.003, + "30Y": 0.002 + }, + "USD": { + "1Y": -0.003, + "2Y": -0.003, + "5Y": -0.002, + "10Y": -0.002, + "30Y": -0.001 + } + }, + "fx": { "EURUSD": 0.05 }, + "equity": { + "EUR": -0.1, + "USD": -0.03 + }, + "credit": { + "EUR": { + "1Y": 0.002, + "2Y": 0.003, + "3Y": 0.004, + "5Y": 0.004, + "10Y": 0.003 + }, + "USD": { + "1Y": 0.001, + "2Y": 0.002, + "3Y": 0.002, + "5Y": 0.002, + "10Y": 0.002 + } + } + } + }, + { + "name": "2001 Dot-com Bust", + "period": "Mar 2000 – Oct 2002", + "description": "Bursting of the tech bubble led to a prolonged equity bear market, recession fears, and aggressive Fed rate cuts.", + "shifts": { + "rates": { + "EUR": { + "1Y": -0.015, + "2Y": -0.012, + "5Y": -0.008, + "10Y": -0.005, + "30Y": -0.003 + }, + "USD": { + "1Y": -0.04, + "2Y": -0.035, + "5Y": -0.025, + "10Y": -0.015, + "30Y": -0.01 + } + }, + "fx": { "EURUSD": 0.08 }, + "equity": { + "EUR": -0.55, + "USD": -0.45, + "Tech": -0.75 + }, + "credit": { + "EUR": { + "1Y": 0.005, + "2Y": 0.007, + "3Y": 0.008, + "5Y": 0.009, + "10Y": 0.008 + }, + "USD": { + "1Y": 0.008, + "2Y": 0.01, + "3Y": 0.012, + "5Y": 0.014, + "10Y": 0.012 + } + } + } + }, + { + "name": "1997 Asian Financial Crisis", + "period": "Jul 1997 – Jan 1998", + "description": "Currency collapses across SE Asia (THB, KRW, IDR) spread contagion to global markets. Safe-haven flows benefited USD and Treasuries.", + "shifts": { + "rates": { + "EUR": { + "1Y": -0.003, + "2Y": -0.004, + "5Y": -0.005, + "10Y": -0.005, + "30Y": -0.003 + }, + "USD": { + "1Y": -0.005, + "2Y": -0.008, + "5Y": -0.01, + "10Y": -0.01, + "30Y": -0.008 + } + }, + "fx": { "EURUSD": -0.06 }, + "equity": { + "EUR": -0.15, + "USD": -0.08 + }, + "credit": { + "EUR": { + "1Y": 0.002, + "2Y": 0.003, + "3Y": 0.004, + "5Y": 0.005, + "10Y": 0.004 + }, + "USD": { + "1Y": 0.003, + "2Y": 0.005, + "3Y": 0.006, + "5Y": 0.007, + "10Y": 0.006 + } + } + } + }, + { + "name": "2023 US Regional Banking Crisis", + "period": "Mar 2023", + "description": "Collapse of SVB and Signature Bank raised fears of a wider banking crisis. Rates fell sharply as markets priced in Fed cuts; equities initially fell but recovered quickly.", + "shifts": { + "rates": { + "EUR": { + "1Y": -0.005, + "2Y": -0.008, + "5Y": -0.01, + "10Y": -0.008, + "30Y": -0.005 + }, + "USD": { + "1Y": -0.01, + "2Y": -0.015, + "5Y": -0.018, + "10Y": -0.015, + "30Y": -0.01 + } + }, + "fx": { "EURUSD": 0.03 }, + "equity": { + "EUR": -0.08, + "USD": -0.05 + }, + "credit": { + "EUR": { + "1Y": 0.003, + "2Y": 0.004, + "3Y": 0.005, + "5Y": 0.005, + "10Y": 0.004 + }, + "USD": { + "1Y": 0.006, + "2Y": 0.008, + "3Y": 0.01, + "5Y": 0.012, + "10Y": 0.01 + }, + "SeniorUnsecured": { + "1Y": 0.012, + "2Y": 0.016, + "3Y": 0.02, + "5Y": 0.024, + "10Y": 0.02 + } + } + } + }, + { + "name": "1998 LTCM / Russian Default", + "period": "Aug – Oct 1998", + "description": "Russian debt default and LTCM collapse caused a global liquidity crisis. Massive flight to quality into US Treasuries, equity sell-off, and credit spreads blew out.", + "shifts": { + "rates": { + "EUR": { + "1Y": -0.005, + "2Y": -0.008, + "5Y": -0.01, + "10Y": -0.01, + "30Y": -0.008 + }, + "USD": { + "1Y": -0.008, + "2Y": -0.012, + "5Y": -0.015, + "10Y": -0.015, + "30Y": -0.012 + } + }, + "fx": { "EURUSD": 0.06 }, + "equity": { + "EUR": -0.3, + "USD": -0.2 + }, + "credit": { + "EUR": { + "1Y": 0.008, + "2Y": 0.012, + "3Y": 0.015, + "5Y": 0.018, + "10Y": 0.015 + }, + "USD": { + "1Y": 0.012, + "2Y": 0.016, + "3Y": 0.02, + "5Y": 0.024, + "10Y": 0.02 + }, + "Sovereign": { + "1Y": 0.02, + "2Y": 0.03, + "3Y": 0.04, + "5Y": 0.05, + "10Y": 0.04 + } + } + } + }, + { + "name": "2011 US Debt-Ceiling Crisis / S&P Downgrade", + "period": "Jul – Aug 2011", + "description": "US debt-ceiling standoff and first-ever S&P downgrade of US sovereign debt. Paradoxically Treasuries rallied on flight to quality, equities sold off.", + "shifts": { + "rates": { + "EUR": { + "1Y": -0.003, + "2Y": -0.005, + "5Y": -0.008, + "10Y": -0.01, + "30Y": -0.008 + }, + "USD": { + "1Y": -0.005, + "2Y": -0.008, + "5Y": -0.012, + "10Y": -0.012, + "30Y": -0.01 + } + }, + "fx": { "EURUSD": -0.05 }, + "equity": { + "EUR": -0.25, + "USD": -0.17 + }, + "credit": { + "EUR": { + "1Y": 0.004, + "2Y": 0.006, + "3Y": 0.008, + "5Y": 0.01, + "10Y": 0.008 + }, + "USD": { + "1Y": 0.005, + "2Y": 0.007, + "3Y": 0.009, + "5Y": 0.01, + "10Y": 0.008 + } + } + } + }, + { + "name": "2018 Volmageddon / Feb Sell-off", + "period": "Feb 2018", + "description": "A sharp spike in US wage growth triggered fears of faster Fed tightening. VIX exploded, inverse-vol products blew up, equities fell sharply.", + "shifts": { + "rates": { + "EUR": { + "1Y": 0.002, + "2Y": 0.003, + "5Y": 0.005, + "10Y": 0.005, + "30Y": 0.003 + }, + "USD": { + "1Y": 0.005, + "2Y": 0.008, + "5Y": 0.01, + "10Y": 0.008, + "30Y": 0.005 + } + }, + "fx": { "EURUSD": 0.02 }, + "equity": { + "EUR": -0.1, + "USD": -0.1 + }, + "credit": { + "EUR": { + "1Y": 0.001, + "2Y": 0.002, + "3Y": 0.002, + "5Y": 0.003, + "10Y": 0.002 + }, + "USD": { + "1Y": 0.002, + "2Y": 0.002, + "3Y": 0.003, + "5Y": 0.003, + "10Y": 0.002 + } + } + } + }, + { + "name": "2013 Taper Tantrum", + "period": "May – Sep 2013", + "description": "Bernanke hinted at tapering QE. US long-term rates spiked, EM currencies and equities fell, USD strengthened.", + "shifts": { + "rates": { + "EUR": { + "1Y": 0.002, + "2Y": 0.005, + "5Y": 0.008, + "10Y": 0.01, + "30Y": 0.008 + }, + "USD": { + "1Y": 0.003, + "2Y": 0.008, + "5Y": 0.012, + "10Y": 0.013, + "30Y": 0.01 + } + }, + "fx": { "EURUSD": -0.04 }, + "equity": { + "EUR": -0.08, + "USD": -0.05 + }, + "credit": { + "EUR": { + "1Y": 0.002, + "2Y": 0.003, + "3Y": 0.003, + "5Y": 0.004, + "10Y": 0.003 + }, + "USD": { + "1Y": 0.002, + "2Y": 0.003, + "3Y": 0.004, + "5Y": 0.004, + "10Y": 0.003 + } + } + } + }, + { + "name": "2016 Brexit Referendum", + "period": "Jun 2016", + "description": "The UK voted to leave the EU. GBP collapsed, EUR weakened, European equities fell, and rates dropped as markets priced slower growth.", + "shifts": { + "rates": { + "EUR": { + "1Y": -0.003, + "2Y": -0.005, + "5Y": -0.008, + "10Y": -0.01, + "30Y": -0.008 + }, + "USD": { + "1Y": -0.005, + "2Y": -0.008, + "5Y": -0.01, + "10Y": -0.012, + "30Y": -0.01 + } + }, + "fx": { "EURUSD": -0.04 }, + "equity": { + "EUR": -0.12, + "USD": -0.05 + }, + "credit": { + "EUR": { + "1Y": 0.004, + "2Y": 0.006, + "3Y": 0.007, + "5Y": 0.008, + "10Y": 0.006 + }, + "USD": { + "1Y": 0.001, + "2Y": 0.002, + "3Y": 0.002, + "5Y": 0.002, + "10Y": 0.002 + } + } + } + }, + { + "name": "2022-2023 Global Rate Hiking Cycle", + "period": "2022 – 2023", + "description": "Post-COVID inflation surge led to synchronised global rate hikes by the Fed, ECB, BoE. Bond markets had historic losses, equities de-rated.", + "shifts": { + "rates": { + "EUR": { + "1Y": 0.035, + "2Y": 0.03, + "5Y": 0.025, + "10Y": 0.02, + "30Y": 0.015 + }, + "USD": { + "1Y": 0.045, + "2Y": 0.04, + "5Y": 0.03, + "10Y": 0.022, + "30Y": 0.015 + } + }, + "fx": { "EURUSD": -0.12 }, + "equity": { + "EUR": -0.18, + "USD": -0.2 + }, + "credit": { + "EUR": { + "1Y": 0.005, + "2Y": 0.007, + "3Y": 0.008, + "5Y": 0.009, + "10Y": 0.008 + }, + "USD": { + "1Y": 0.004, + "2Y": 0.005, + "3Y": 0.006, + "5Y": 0.007, + "10Y": 0.006 + } + } + } + }, + { + "name": "1970s-style Stagflation", + "period": "1973 – 1980 (composite)", + "description": "Oil-price shocks combined with wage-price spirals produced persistently high inflation and economic stagnation. Rates rose dramatically, equities underperformed in real terms.", + "shifts": { + "rates": { + "EUR": { + "1Y": 0.03, + "2Y": 0.03, + "5Y": 0.025, + "10Y": 0.02, + "30Y": 0.015 + }, + "USD": { "1Y": 0.04, "2Y": 0.04, "5Y": 0.035, "10Y": 0.03, "30Y": 0.02 } + }, + "fx": { "EURUSD": -0.08 }, + "equity": { + "EUR": -0.2, + "USD": -0.15 + }, + "credit": { + "EUR": { + "1Y": 0.006, + "2Y": 0.008, + "3Y": 0.01, + "5Y": 0.012, + "10Y": 0.01 + }, + "USD": { + "1Y": 0.008, + "2Y": 0.01, + "3Y": 0.012, + "5Y": 0.014, + "10Y": 0.012 + } + } + } + }, + { + "name": "Deflationary Recession (Japan-style)", + "period": "Composite (1990s–2010s Japan)", + "description": "Protracted deflation, zero-bound rates, equity malaise. If applied to EUR/USD: massive rate cuts, equities drift lower, EUR weakens as ECB goes ultra-loose.", + "shifts": { + "rates": { + "EUR": { + "1Y": -0.02, + "2Y": -0.02, + "5Y": -0.018, + "10Y": -0.015, + "30Y": -0.01 + }, + "USD": { + "1Y": -0.015, + "2Y": -0.015, + "5Y": -0.012, + "10Y": -0.01, + "30Y": -0.005 + } + }, + "fx": { "EURUSD": -0.1 }, + "equity": { + "EUR": -0.25, + "USD": -0.1 + }, + "credit": { + "EUR": { + "1Y": 0.005, + "2Y": 0.007, + "3Y": 0.008, + "5Y": 0.009, + "10Y": 0.008 + }, + "USD": { + "1Y": 0.003, + "2Y": 0.004, + "3Y": 0.005, + "5Y": 0.005, + "10Y": 0.004 + } + } + } + }, + { + "name": "Eurozone Break-up (Tail Risk)", + "period": "Hypothetical", + "description": "A large Eurozone member exits the single currency. Extreme EUR weakness, European equities collapse, EUR rates spike on redenomination risk, USD rates fall on safe-haven flows.", + "shifts": { + "rates": { + "EUR": { + "1Y": 0.03, + "2Y": 0.035, + "5Y": 0.03, + "10Y": 0.025, + "30Y": 0.02 + }, + "USD": { + "1Y": -0.015, + "2Y": -0.02, + "5Y": -0.025, + "10Y": -0.02, + "30Y": -0.015 + } + }, + "fx": { "EURUSD": -0.25 }, + "equity": { + "EUR": -0.5, + "USD": -0.2 + }, + "credit": { + "EUR": { + "1Y": 0.025, + "2Y": 0.035, + "3Y": 0.04, + "5Y": 0.045, + "10Y": 0.04 + }, + "USD": { + "1Y": 0.006, + "2Y": 0.008, + "3Y": 0.01, + "5Y": 0.012, + "10Y": 0.01 + }, + "Sovereign": { + "1Y": 0.05, + "2Y": 0.07, + "3Y": 0.08, + "5Y": 0.09, + "10Y": 0.08 + } + } + } + }, + { + "name": "US-China Trade War Escalation", + "period": "2018 – 2019", + "description": "Escalating tariffs between US and China caused global growth fears, equity sell-offs, and a flight to bonds.", + "shifts": { + "rates": { + "EUR": { + "1Y": -0.003, + "2Y": -0.005, + "5Y": -0.008, + "10Y": -0.01, + "30Y": -0.008 + }, + "USD": { + "1Y": -0.005, + "2Y": -0.008, + "5Y": -0.012, + "10Y": -0.012, + "30Y": -0.008 + } + }, + "fx": { "EURUSD": -0.03 }, + "equity": { + "EUR": -0.12, + "USD": -0.1 + }, + "credit": { + "EUR": { + "1Y": 0.002, + "2Y": 0.003, + "3Y": 0.004, + "5Y": 0.005, + "10Y": 0.004 + }, + "USD": { + "1Y": 0.003, + "2Y": 0.004, + "3Y": 0.005, + "5Y": 0.006, + "10Y": 0.005 + } + } + } + }, + { + "name": "Sudden Inflation Spike", + "period": "Hypothetical / 2021-style", + "description": "Unexpected jump in inflation forces central banks to tighten much faster than expected. Front-end rates spike, curves flatten, equities de-rate.", + "shifts": { + "rates": { + "EUR": { + "1Y": 0.02, + "2Y": 0.018, + "5Y": 0.012, + "10Y": 0.008, + "30Y": 0.005 + }, + "USD": { + "1Y": 0.025, + "2Y": 0.022, + "5Y": 0.015, + "10Y": 0.01, + "30Y": 0.005 + } + }, + "fx": { "EURUSD": -0.05 }, + "equity": { + "EUR": -0.15, + "USD": -0.12 + }, + "credit": { + "EUR": { + "1Y": 0.004, + "2Y": 0.005, + "3Y": 0.006, + "5Y": 0.007, + "10Y": 0.006 + }, + "USD": { + "1Y": 0.003, + "2Y": 0.004, + "3Y": 0.005, + "5Y": 0.006, + "10Y": 0.005 + } + } + } + }, + { + "name": "9/11 Terror Attack", + "period": "Sep 2001", + "description": "Coordinated terrorist attacks on the World Trade Center and Pentagon caused an immediate market shutdown and a sharp sell-off on reopening. The Fed cut rates 50bp within days. Flight to US Treasuries intensified, equities fell sharply, and credit spreads widened across aviation, insurance, and broader corporate sectors.", + "shifts": { + "rates": { + "EUR": { + "1Y": -0.008, + "2Y": -0.007, + "5Y": -0.005, + "10Y": -0.003, + "30Y": -0.002 + }, + "USD": { + "1Y": -0.018, + "2Y": -0.015, + "5Y": -0.01, + "10Y": -0.006, + "30Y": -0.003 + } + }, + "fx": { "EURUSD": 0.02 }, + "equity": { + "EUR": -0.14, + "USD": -0.12 + }, + "credit": { + "EUR": { + "1Y": 0.005, + "2Y": 0.007, + "3Y": 0.009, + "5Y": 0.01, + "10Y": 0.008 + }, + "USD": { + "1Y": 0.008, + "2Y": 0.011, + "3Y": 0.013, + "5Y": 0.015, + "10Y": 0.012 + } + } + } + }, + { + "name": "2011 Tōhoku Earthquake / Fukushima", + "period": "Mar 2011", + "description": "Magnitude-9.0 earthquake and subsequent tsunami devastated northeastern Japan, triggering a nuclear crisis at Fukushima Daiichi. The Nikkei fell ~20% in the first two weeks. Global risk-off sentiment pushed European and US equities lower, rates declined on growth concerns, and credit spreads widened modestly. Safe-haven flows initially strengthened the yen before G7 coordinated intervention reversed the move.", + "shifts": { + "rates": { + "EUR": { + "1Y": -0.004, + "2Y": -0.005, + "5Y": -0.006, + "10Y": -0.007, + "30Y": -0.005 + }, + "USD": { + "1Y": -0.006, + "2Y": -0.008, + "5Y": -0.009, + "10Y": -0.008, + "30Y": -0.005 + } + }, + "fx": { "EURUSD": 0.01 }, + "equity": { + "EUR": -0.1, + "USD": -0.06 + }, + "credit": { + "EUR": { + "1Y": 0.003, + "2Y": 0.004, + "3Y": 0.005, + "5Y": 0.006, + "10Y": 0.005 + }, + "USD": { + "1Y": 0.003, + "2Y": 0.004, + "3Y": 0.005, + "5Y": 0.005, + "10Y": 0.004 + } + } + } + } +] diff --git a/EconomicStressAgentORE/data/sector_mapping.csv b/EconomicStressAgentORE/data/sector_mapping.csv new file mode 100644 index 0000000..ed7fc9e --- /dev/null +++ b/EconomicStressAgentORE/data/sector_mapping.csv @@ -0,0 +1,4 @@ +type,name,currency,sector +equity,RIC:.SPX,USD,Index +equity,RIC:.STOXX50,EUR,Index +credit,Underlying1,USD,SeniorUnsecured diff --git a/EconomicStressAgentORE/historical_scenarios.py b/EconomicStressAgentORE/historical_scenarios.py new file mode 100644 index 0000000..53d34aa --- /dev/null +++ b/EconomicStressAgentORE/historical_scenarios.py @@ -0,0 +1,96 @@ +""" +Historical economic scenarios knowledge base. + +Loads scenario data from a JSON file and provides structured access +for the scenario analyser and stress-test builder. + +Each scenario has the **generic schema**:: + + shifts: + rates: { CCY: { tenor: abs_shift } } + fx: { PAIR: abs_shift } + equity: { CCY_or_sector: relative_shift } + credit: { CCY_or_sector: { tenor: abs_shift } } + +* Rates / credit: absolute change (decimal, e.g. -0.015 = -150 bps). +* FX: absolute change in spot (e.g. -0.10 means spot drops by 0.10). +* Equity: relative change (e.g. -0.25 = -25 %). +""" + +from __future__ import annotations + +import json +from pathlib import Path + + +class ScenarioKnowledgeBase: + """Immutable collection of historical stress scenarios loaded from JSON.""" + + def __init__(self, path: Path | str) -> None: + self._path = Path(path) + if not self._path.exists(): + raise FileNotFoundError(f"Scenario file not found: {self._path}") + self._scenarios: list[dict] = self._load() + + # -- loading ------------------------------------------------------------- + + def _load(self) -> list[dict]: + with open(self._path, "r") as fh: + return json.load(fh) + + # -- public accessors ---------------------------------------------------- + + @property + def scenarios(self) -> list[dict]: + """Return the raw list of scenario dicts.""" + return self._scenarios + + def __len__(self) -> int: + return len(self._scenarios) + + def __getitem__(self, index: int) -> dict: + return self._scenarios[index] + + def __iter__(self): + return iter(self._scenarios) + + # -- formatting ---------------------------------------------------------- + + @staticmethod + def _fmt_tenor_dict(d: dict[str, float], unit: str = "bps") -> str: + """Format a {tenor: shift} dict for display.""" + return " / ".join( + f"{k}: {v * 10000:+.0f}" if unit == "bps" else f"{k}: {v:+.0%}" + for k, v in d.items() + ) + + def get_scenarios_text(self) -> str: + """Return a formatted text dump of all scenarios for LLM context.""" + lines: list[str] = [] + for i, s in enumerate(self._scenarios, 1): + lines.append(f"### {i}. {s['name']} ({s['period']})") + lines.append(s["description"]) + sh = s["shifts"] + + if "fx" in sh: + for pair, v in sh["fx"].items(): + lines.append(f" FX {pair}: {v:+.2f}") + + if "equity" in sh: + for key, v in sh["equity"].items(): + lines.append(f" Equity {key}: {v:+.0%}") + + if "rates" in sh: + for ccy, tenors in sh["rates"].items(): + lines.append( + f" Rates {ccy} (bps): {self._fmt_tenor_dict(tenors)}" + ) + + if "credit" in sh: + for key, tenors in sh["credit"].items(): + lines.append( + f" Credit {key} (bps): {self._fmt_tenor_dict(tenors)}" + ) + + lines.append("") + return "\n".join(lines) diff --git a/EconomicStressAgentORE/impact_summarizer.py b/EconomicStressAgentORE/impact_summarizer.py new file mode 100644 index 0000000..37ccb6e --- /dev/null +++ b/EconomicStressAgentORE/impact_summarizer.py @@ -0,0 +1,245 @@ +""" +impact_summarizer.py — Step 4: parse ORE stresstest.csv output, compute P&L +impacts, and generate a human-readable narrative via LLM. +""" + +from __future__ import annotations + +import io +from pathlib import Path +from typing import Any + +import pandas as pd +from openai import OpenAI + +import config + +# ── CSV parsing ─────────────────────────────────────────────────────────────── + +def _read_stresstest_csv(csv_path: Path, scenario_id: str) -> pd.DataFrame: + """ + Load stresstest.csv and return rows matching *scenario_id*. + + The file has a header line that starts with ``#TradeId`` — pandas handles + the ``#`` by treating it as part of the first column name, so we strip it. + """ + with csv_path.open() as f: + content = f.read() + + # Remove leading # from the header line + content = content.replace("#TradeId", "TradeId", 1) + + df = pd.read_csv(io.StringIO(content)) + df.columns = [c.strip() for c in df.columns] + + # Filter to this scenario + mask = df["ScenarioLabel"].str.strip() == scenario_id + filtered = df[mask].copy() + + if filtered.empty: + raise ValueError( + f"No results found for scenario '{scenario_id}' in {csv_path}.\n" + f"Available scenarios: {df['ScenarioLabel'].unique().tolist()}" + ) + + filtered["PnL"] = filtered["Scenario NPV"] - filtered["Base NPV"] + return filtered + + +# ── Analysis helpers ────────────────────────────────────────────────────────── + +def _compute_summary(df: pd.DataFrame) -> dict[str, Any]: + """Return a dict with totals and per-trade data.""" + total_base = df["Base NPV"].sum() + total_stressed = df["Scenario NPV"].sum() + total_pnl = total_stressed - total_base + + rows = df.sort_values("PnL").to_dict(orient="records") + + return { + "total_base_npv": total_base, + "total_stressed_npv": total_stressed, + "total_pnl": total_pnl, + "trades": rows, + "top_losers": sorted(rows, key=lambda r: r["PnL"])[:3], + "top_gainers": sorted(rows, key=lambda r: r["PnL"], reverse=True)[:3], + } + + +# ── Markdown table ──────────────────────────────────────────────────────────── + +def _format_table(summary: dict[str, Any]) -> str: + """Build a nicely aligned plain-text table with box-drawing characters.""" + # Determine column widths dynamically + trade_ids = [str(r["TradeId"]) for r in summary["trades"]] + ["TOTAL"] + base_vals = [f"{r['Base NPV']:,.0f}" for r in summary["trades"]] + [ + f"{summary['total_base_npv']:,.0f}" + ] + stress_vals = [f"{r['Scenario NPV']:,.0f}" for r in summary["trades"]] + [ + f"{summary['total_stressed_npv']:,.0f}" + ] + pnl_vals = [f"{r['PnL']:+,.0f}" for r in summary["trades"]] + [ + f"{summary['total_pnl']:+,.0f}" + ] + + w_trade = max(len("Trade"), max(len(t) for t in trade_ids)) + 2 + w_base = max(len("Base NPV"), max(len(v) for v in base_vals)) + 2 + w_stress = max(len("Stressed NPV"), max(len(v) for v in stress_vals)) + 2 + w_pnl = max(len("P&L Impact"), max(len(v) for v in pnl_vals)) + 2 + + def hline(left: str, mid: str, right: str, fill: str = "─") -> str: + return f"{left}{fill * w_trade}{mid}{fill * w_base}{mid}{fill * w_stress}{mid}{fill * w_pnl}{right}" + + def row(c1: str, c2: str, c3: str, c4: str, bold: bool = False) -> str: + s = ( + f"│ {c1:<{w_trade - 2}} " + f"│ {c2:>{w_base - 2}} " + f"│ {c3:>{w_stress - 2}} " + f"│ {c4:>{w_pnl - 2}} │" + ) + return s + + lines: list[str] = [] + lines.append(hline("┌", "┬", "┐")) + lines.append(row("Trade", "Base NPV", "Stressed NPV", "P&L Impact")) + lines.append(hline("├", "┼", "┤")) + + for tid, bv, sv, pv in zip(trade_ids[:-1], base_vals[:-1], stress_vals[:-1], pnl_vals[:-1]): + lines.append(row(tid, bv, sv, pv)) + + lines.append(hline("├", "┼", "┤", "═")) + lines.append(row("TOTAL", base_vals[-1], stress_vals[-1], pnl_vals[-1])) + lines.append(hline("└", "┴", "┘")) + + return "\n".join(lines) + + +# ── LLM narrative ───────────────────────────────────────────────────────────── + +_NARRATIVE_SYSTEM = """\ +You are a senior risk analyst writing a concise executive summary of a +portfolio stress test. Keep the summary to 3-4 paragraphs. Use plain prose — +no bullet points. Be specific about the numbers provided. +""" + +def _llm_narrative( + scenario_description: str, + shifts: dict[str, Any], + summary: dict[str, Any], +) -> str: + """Call the LLM to produce a narrative paragraph about the results.""" + if not config.OPENAI_API_KEY: + return ( + "(LLM narrative unavailable — OPENAI_API_KEY not set)\n\n" + f"Total P&L impact: {summary['total_pnl']:+,.0f} EUR" + ) + + client = OpenAI(api_key=config.OPENAI_API_KEY) + + # ── Build a shifts summary from the generic schema ── + shift_lines: list[str] = [] + + # FX + for pair, v in shifts.get("fx", {}).items(): + shift_lines.append(f" FX {pair}: {v:+.4f} (absolute)") + + # Equity + for key, v in shifts.get("equity", {}).items(): + shift_lines.append(f" Equity {key}: {v:+.1%}") + + # Rates + for ccy, tenors in shifts.get("rates", {}).items(): + parts = " / ".join(f"{t} {val*1e4:+.0f}bp" for t, val in tenors.items()) + shift_lines.append(f" Rates {ccy}: {parts}") + + # Credit + for key, tenors in shifts.get("credit", {}).items(): + parts = " / ".join(f"{t} {val*1e4:+.0f}bp" for t, val in tenors.items()) + shift_lines.append(f" Credit {key}: {parts}") + + shifts_text = "\n".join(shift_lines) if shift_lines else " (none)" + + prompt = f"""\ +Scenario description: {scenario_description} + +Applied market shifts: +{shifts_text} + +Portfolio results (all in EUR, base currency): + Base portfolio NPV: {summary['total_base_npv']:,.0f} + Stressed portfolio NPV: {summary['total_stressed_npv']:,.0f} + Total P&L impact: {summary['total_pnl']:+,.0f} + +Trade-level impacts (sorted by P&L): +""" + "\n".join( + f" {r['TradeId']:30s} Base: {r['Base NPV']:>14,.0f} " + f"Stressed: {r['Scenario NPV']:>14,.0f} P&L: {r['PnL']:>+14,.0f}" + for r in summary["trades"] + ) + f""" + +Top losers: {', '.join(r['TradeId'] for r in summary['top_losers'])} +Top gainers: {', '.join(r['TradeId'] for r in summary['top_gainers'])} + +Write an executive summary explaining which asset classes drove the result, +which trades were most affected, and what the overall risk interpretation is. +""" + + resp = client.chat.completions.create( + model=config.OPENAI_MODEL, + messages=[ + {"role": "system", "content": _NARRATIVE_SYSTEM}, + {"role": "user", "content": prompt}, + ], + temperature=config.OPENAI_TEMPERATURE, + ) + return resp.choices[0].message.content or "" + + +# ── Main entry point ────────────────────────────────────────────────────────── + +def summarize( + csv_path: Path, + scenario_description: str, + shifts: dict[str, Any], + scenario_id: str = "agent_scenario", +) -> str: + """ + Parse *csv_path*, compute impacts, and return a Markdown report string. + + Parameters + ---------- + csv_path : path to stresstest.csv produced by ORE + scenario_description : original user text (used for narrative prompt) + shifts : the shifts dict from scenario_analyzer.analyze() + scenario_id : the StressTest id used when building the XML + + Returns + ------- + Markdown-formatted report string. + """ + df = _read_stresstest_csv(csv_path, scenario_id) + summary = _compute_summary(df) + table = _format_table(summary) + narrative = _llm_narrative(scenario_description, shifts, summary) + + width = 60 + header = ( + "═" * width + "\n" + + " Portfolio Stress Test Impact Report\n" + + "═" * width + ) + + pnl_sign = "+" if summary["total_pnl"] >= 0 else "" + pnl_label = f"TOTAL P&L: {pnl_sign}{summary['total_pnl']:,.0f} EUR" + direction = "▲ GAIN" if summary["total_pnl"] >= 0 else "▼ LOSS" + + report = ( + f"{header}\n\n" + f" {pnl_label} [{direction}]\n\n" + f"{table}\n\n" + + "─" * width + "\n" + " Narrative Summary\n" + + "─" * width + "\n\n" + f"{narrative}\n" + ) + return report diff --git a/EconomicStressAgentORE/ore_runner.py b/EconomicStressAgentORE/ore_runner.py new file mode 100644 index 0000000..9b65f55 --- /dev/null +++ b/EconomicStressAgentORE/ore_runner.py @@ -0,0 +1,90 @@ +""" +ore_runner.py — Step 3: execute ORE with the agent-generated stress test config +and return the path to the output stresstest.csv. + +Uses the ORE Python bindings (``from ORE import *``). +ORE is logically "run from" the OREDir workspace directory so +that relative ``inputPath`` / ``outputPath`` in ore.xml resolve correctly. +""" + +from __future__ import annotations + +import os +import shutil +from pathlib import Path + +import config + + +# ── Public API ──────────────────────────────────────────────────────────────── + +def run( + ore_xml: Path | str | None = None, + workspace: Path | str | None = None, +) -> Path: + """ + Run ORE and return the path to the output stresstest.csv. + + Parameters + ---------- + ore_xml : path to the ORE main config file. + Defaults to ``config.AGENT_ORE_XML``. + workspace : directory from which ORE should be launched. + Defaults to ``config.ORE_WORKSPACE``. + + Returns + ------- + Path to ``Output/stresstest.csv`` inside the workspace. + """ + if ore_xml is None: + ore_xml = config.AGENT_ORE_XML + if workspace is None: + workspace = config.ORE_WORKSPACE + + ore_xml = Path(ore_xml) + workspace = Path(workspace) + + if not ore_xml.exists(): + raise FileNotFoundError(f"ORE config not found: {ore_xml}") + if not workspace.exists(): + raise FileNotFoundError(f"ORE workspace not found: {workspace}") + + # Path passed to ORE should be relative to the workspace (since ORE resolves + # Input/Output paths relative to its own working directory). + try: + ore_xml_rel = ore_xml.relative_to(workspace) + except ValueError: + ore_xml_rel = ore_xml # use absolute if not inside workspace + + # Clean the Output directory so stale results never mask a real failure. + output_dir = workspace / "Output" + if output_dir.exists(): + shutil.rmtree(output_dir) + output_dir.mkdir(parents=True, exist_ok=True) + + _run_via_python_api(ore_xml_rel, workspace) + + stdout_csv = workspace / "Output" / "stresstest.csv" + if not stdout_csv.exists(): + raise RuntimeError( + f"ORE run did not produce stresstest.csv at {stdout_csv}.\n" + "Check the ORE log at: " + str(workspace / "Output" / "log.txt") + ) + return stdout_csv + + +# ── Execution back-end ───────────────────────────────────────────────────────── + +def _run_via_python_api(ore_xml_rel: Path, workspace: Path) -> None: + """Execute ORE using the Python bindings (OREApp).""" + from ORE import OREApp, Parameters # type: ignore[import] + print(f"Running ORE with config: {ore_xml_rel} from workspace: {workspace}") + orig_cwd = Path.cwd() + try: + os.chdir(workspace) + params = Parameters() + params.fromFile(str(ore_xml_rel)) + ore = OREApp(params, True) + ore.run() + finally: + os.chdir(orig_cwd) diff --git a/EconomicStressAgentORE/oredata/Input/conventions.xml b/EconomicStressAgentORE/oredata/Input/conventions.xml new file mode 100644 index 0000000..8134b78 --- /dev/null +++ b/EconomicStressAgentORE/oredata/Input/conventions.xml @@ -0,0 +1,126 @@ + + + CDS-STANDARD-CONVENTIONS + 0 + WeekendsOnly + Quarterly + Following + CDS2015 + A360 + true + true + + + EUR-DEPOSIT + true + EUR-EURIBOR + + + EUR-ON-DEPOSIT-ESTER + true + EUR-ESTER + + + USD-ON-SOFR-DEPOSIT + true + USD-SOFR + + + USD-SOFR-3M-FUTURES + USD-SOFR + + + EURIBOR-3M-FUTURES + EUR-EURIBOR-3M + + + EUR-6M-FRA + EUR-EURIBOR-6M + + + EUR-ESTER-OIS + 1 + EUR-ESTER + A360 + 1 + false + Annual + MF + MF + Backward + + + USD-SOFR-OIS + 0 + USD-SOFR + A360 + 2 + false + Annual + MF + MF + Backward + + + EUR-USD-ON-XCCY-BASIS + 2 + TARGET,US + MF + USD-SOFR + 3M + EUR-ESTER + 3M + true + true + + + EUR-USD-FX + 2 + EUR + USD + 10000 + TARGET,US + true + + + EUR-EURIBOR-3M-SWAP + TARGET + Annual + MF + 30/360 + EUR-EURIBOR-3M + + + EUR-EURIBOR-6M-SWAP + TARGET + Annual + MF + 30/360 + EUR-EURIBOR-6M + + + EURIBOR-3M-6M-BASIS + TARGET + Annual + MF + 30/360 + EUR-EURIBOR-6M + Annual + MF + 30/360 + EUR-EURIBOR-3M + true + + + EUHICPXT_INFLATIONSWAP + TARGET + MF + 30/360 + EUHICPXT + false + 3M + false + TARGET + MF + + \ No newline at end of file diff --git a/EconomicStressAgentORE/oredata/Input/curveconfig.xml b/EconomicStressAgentORE/oredata/Input/curveconfig.xml new file mode 100644 index 0000000..684d2eb --- /dev/null +++ b/EconomicStressAgentORE/oredata/Input/curveconfig.xml @@ -0,0 +1,582 @@ + + + + EUR + EUR normal cap floor volatilities + Normal + Flat + Bilinear + false + Actual/365 (Fixed) + TARGET + Following + 1Y, 2Y, 3Y, 4Y, 5Y, 6Y, 7Y, 8Y, 9Y + -0.01, 0, 0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.1 + false + EUR-EURIBOR-6M + Yield/EUR/EUR-ESTER + 1Y, 2Y, 3Y, 4Y, 5Y, 6Y, 7Y, 8Y, 9Y + 0 + OptionletVolatilities + LinearFlat + LinearFlat + false + + 0.0000000000010000 + 0.0000000000010000 + true + 5 + 2 + 2 + 10 + + TermVolatilities + + + + EUR-ESTER + ESTER vols proxied by EURIBOR-6M vols + + + CapFloorVolatility/EUR/EUR + EUR-EURIBOR-6M + + + EUR-ESTER + 3M + + + + + + + + EUR-ESTER + EUR ESTER discount curve bootstrapped from OIS swap rates + EUR + EUR-ESTER + + + Deposit + + MM/RATE/EUR/ESTER/0D/1D + + EUR-ON-DEPOSIT-ESTER + LastRelevantPillarDate + 0 + 1 + + + OIS + + IR_SWAP/RATE/EUR/ESTER/2D/1D/1W + IR_SWAP/RATE/EUR/ESTER/2D/1D/2W + IR_SWAP/RATE/EUR/ESTER/2D/1D/3W + IR_SWAP/RATE/EUR/ESTER/2D/1D/1M + IR_SWAP/RATE/EUR/ESTER/2D/1D/2M + IR_SWAP/RATE/EUR/ESTER/2D/1D/3M + IR_SWAP/RATE/EUR/ESTER/2D/1D/4M + IR_SWAP/RATE/EUR/ESTER/2D/1D/5M + IR_SWAP/RATE/EUR/ESTER/2D/1D/6M + IR_SWAP/RATE/EUR/ESTER/2D/1D/7M + IR_SWAP/RATE/EUR/ESTER/2D/1D/8M + IR_SWAP/RATE/EUR/ESTER/2D/1D/9M + IR_SWAP/RATE/EUR/ESTER/2D/1D/10M + IR_SWAP/RATE/EUR/ESTER/2D/1D/11M + IR_SWAP/RATE/EUR/ESTER/2D/1D/1Y + IR_SWAP/RATE/EUR/ESTER/2D/1D/15M + IR_SWAP/RATE/EUR/ESTER/2D/1D/18M + IR_SWAP/RATE/EUR/ESTER/2D/1D/21M + IR_SWAP/RATE/EUR/ESTER/2D/1D/2Y + IR_SWAP/RATE/EUR/ESTER/2D/1D/3Y + IR_SWAP/RATE/EUR/ESTER/2D/1D/4Y + IR_SWAP/RATE/EUR/ESTER/2D/1D/5Y + IR_SWAP/RATE/EUR/ESTER/2D/1D/6Y + IR_SWAP/RATE/EUR/ESTER/2D/1D/7Y + IR_SWAP/RATE/EUR/ESTER/2D/1D/8Y + IR_SWAP/RATE/EUR/ESTER/2D/1D/9Y + IR_SWAP/RATE/EUR/ESTER/2D/1D/10Y + IR_SWAP/RATE/EUR/ESTER/2D/1D/11Y + IR_SWAP/RATE/EUR/ESTER/2D/1D/12Y + IR_SWAP/RATE/EUR/ESTER/2D/1D/15Y + IR_SWAP/RATE/EUR/ESTER/2D/1D/20Y + IR_SWAP/RATE/EUR/ESTER/2D/1D/25Y + IR_SWAP/RATE/EUR/ESTER/2D/1D/30Y + IR_SWAP/RATE/EUR/ESTER/2D/1D/40Y + IR_SWAP/RATE/EUR/ESTER/2D/1D/50Y + IR_SWAP/RATE/EUR/ESTER/2D/1D/60Y + + EUR-ESTER-OIS + LastRelevantPillarDate + 0 + 1 + + + Discount + LogLinear + 1 + A365 + 0.0000000000010000 + true + + 0.0000000000010000 + 0.0000000000010000 + false + 5 + 2 + 2 + 10 + + + + USD-IN-EUR + USD collateralised in EUR discount curve + USD + + + + FX Forward + + FXFWD/RATE/EUR/USD/ON + FXFWD/RATE/EUR/USD/TN + FXFWD/RATE/EUR/USD/SN + FXFWD/RATE/EUR/USD/1W + FXFWD/RATE/EUR/USD/2W + FXFWD/RATE/EUR/USD/3W + FXFWD/RATE/EUR/USD/1M + FXFWD/RATE/EUR/USD/2M + FXFWD/RATE/EUR/USD/3M + FXFWD/RATE/EUR/USD/4M + FXFWD/RATE/EUR/USD/5M + FXFWD/RATE/EUR/USD/6M + FXFWD/RATE/EUR/USD/7M + FXFWD/RATE/EUR/USD/8M + FXFWD/RATE/EUR/USD/9M + FXFWD/RATE/EUR/USD/10M + FXFWD/RATE/EUR/USD/11M + FXFWD/RATE/EUR/USD/1Y + FXFWD/RATE/EUR/USD/15M + FXFWD/RATE/EUR/USD/18M + FXFWD/RATE/EUR/USD/21M + + EUR-USD-FX + LastRelevantPillarDate + 0 + 1 + + FX/RATE/EUR/USD + + + Cross Currency Basis Swap + + CC_BASIS_SWAP/BASIS_SPREAD/USD/1D/EUR/1D/2Y + CC_BASIS_SWAP/BASIS_SPREAD/USD/1D/EUR/1D/3Y + CC_BASIS_SWAP/BASIS_SPREAD/USD/1D/EUR/1D/4Y + CC_BASIS_SWAP/BASIS_SPREAD/USD/1D/EUR/1D/5Y + CC_BASIS_SWAP/BASIS_SPREAD/USD/1D/EUR/1D/6Y + CC_BASIS_SWAP/BASIS_SPREAD/USD/1D/EUR/1D/7Y + CC_BASIS_SWAP/BASIS_SPREAD/USD/1D/EUR/1D/8Y + CC_BASIS_SWAP/BASIS_SPREAD/USD/1D/EUR/1D/9Y + CC_BASIS_SWAP/BASIS_SPREAD/USD/1D/EUR/1D/10Y + CC_BASIS_SWAP/BASIS_SPREAD/USD/1D/EUR/1D/12Y + CC_BASIS_SWAP/BASIS_SPREAD/USD/1D/EUR/1D/15Y + CC_BASIS_SWAP/BASIS_SPREAD/USD/1D/EUR/1D/20Y + CC_BASIS_SWAP/BASIS_SPREAD/USD/1D/EUR/1D/25Y + CC_BASIS_SWAP/BASIS_SPREAD/USD/1D/EUR/1D/30Y + CC_BASIS_SWAP/BASIS_SPREAD/USD/1D/EUR/1D/40Y + CC_BASIS_SWAP/BASIS_SPREAD/USD/1D/EUR/1D/50Y + + EUR-USD-ON-XCCY-BASIS + LastRelevantPillarDate + 0 + 1 + + FX/RATE/EUR/USD + USD-SOFR + EUR-ESTER + + + Discount + LogLinear + 1 + A365 + 0.0000000000010000 + true + + 0.0000000000010000 + 0.0000000000010000 + false + 5 + 2 + 2 + 10 + + + + USD-SOFR + + USD + USD-SOFR + + + Deposit + + MM/RATE/USD/SOFR/0D/1D + + USD-ON-SOFR-DEPOSIT + LastRelevantPillarDate + 0 + 1 + USD-SOFR + + + Future + + OI_FUTURE/PRICE/USD/2024-04/XCME:SRA/3M + OI_FUTURE/PRICE/USD/2024-05/XCME:SRA/3M + OI_FUTURE/PRICE/USD/2024-06/XCME:SRA/3M + OI_FUTURE/PRICE/USD/2024-07/XCME:SRA/3M + OI_FUTURE/PRICE/USD/2024-08/XCME:SRA/3M + OI_FUTURE/PRICE/USD/2024-09/XCME:SRA/3M + OI_FUTURE/PRICE/USD/2024-10/XCME:SRA/3M + OI_FUTURE/PRICE/USD/2024-11/XCME:SRA/3M + OI_FUTURE/PRICE/USD/2024-12/XCME:SRA/3M + OI_FUTURE/PRICE/USD/2025-03/XCME:SRA/3M + OI_FUTURE/PRICE/USD/2025-06/XCME:SRA/3M + OI_FUTURE/PRICE/USD/2025-09/XCME:SRA/3M + + USD-SOFR-3M-FUTURES + LastRelevantPillarDate + 0 + 1 + + + OIS + + IR_SWAP/RATE/USD/SOFR/0D/1D/2Y + IR_SWAP/RATE/USD/SOFR/0D/1D/3Y + IR_SWAP/RATE/USD/SOFR/0D/1D/4Y + IR_SWAP/RATE/USD/SOFR/0D/1D/5Y + IR_SWAP/RATE/USD/SOFR/0D/1D/6Y + IR_SWAP/RATE/USD/SOFR/0D/1D/7Y + IR_SWAP/RATE/USD/SOFR/0D/1D/8Y + IR_SWAP/RATE/USD/SOFR/0D/1D/9Y + IR_SWAP/RATE/USD/SOFR/0D/1D/10Y + IR_SWAP/RATE/USD/SOFR/0D/1D/12Y + IR_SWAP/RATE/USD/SOFR/0D/1D/15Y + IR_SWAP/RATE/USD/SOFR/0D/1D/20Y + IR_SWAP/RATE/USD/SOFR/0D/1D/25Y + IR_SWAP/RATE/USD/SOFR/0D/1D/30Y + IR_SWAP/RATE/USD/SOFR/0D/1D/40Y + IR_SWAP/RATE/USD/SOFR/0D/1D/50Y + + USD-SOFR-OIS + LastRelevantPillarDate + 0 + 1 + + + Discount + LogLinear + 1 + A365 + 0.0000000000010000 + true + + 0.0000000000010000 + 0.0000000000010000 + false + 5 + 2 + 2 + 10 + + + + EUR-EURIBOR-3M + EUR EURIBOR 3M Index Curve + EUR + EUR-ESTER + + + Deposit + + MM/RATE/EUR/2D/3M + + EUR-DEPOSIT + LastRelevantPillarDate + 0 + 1 + + + Future + + MM_FUTURE/PRICE/EUR/2024-04/XICE:FEI/3M + MM_FUTURE/PRICE/EUR/2024-05/XICE:FEI/3M + MM_FUTURE/PRICE/EUR/2024-06/XICE:FEI/3M + MM_FUTURE/PRICE/EUR/2024-07/XICE:FEI/3M + MM_FUTURE/PRICE/EUR/2024-08/XICE:FEI/3M + MM_FUTURE/PRICE/EUR/2024-09/XICE:FEI/3M + MM_FUTURE/PRICE/EUR/2024-12/XICE:FEI/3M + MM_FUTURE/PRICE/EUR/2025-03/XICE:FEI/3M + MM_FUTURE/PRICE/EUR/2025-06/XICE:FEI/3M + MM_FUTURE/PRICE/EUR/2025-09/XICE:FEI/3M + + EURIBOR-3M-FUTURES + LastRelevantPillarDate + 0 + 1 + + + Swap + + IR_SWAP/RATE/EUR/2D/3M/2Y + IR_SWAP/RATE/EUR/2D/3M/3Y + IR_SWAP/RATE/EUR/2D/3M/4Y + IR_SWAP/RATE/EUR/2D/3M/5Y + IR_SWAP/RATE/EUR/2D/3M/6Y + IR_SWAP/RATE/EUR/2D/3M/7Y + IR_SWAP/RATE/EUR/2D/3M/8Y + IR_SWAP/RATE/EUR/2D/3M/9Y + IR_SWAP/RATE/EUR/2D/3M/10Y + IR_SWAP/RATE/EUR/2D/3M/12Y + IR_SWAP/RATE/EUR/2D/3M/15Y + IR_SWAP/RATE/EUR/2D/3M/20Y + IR_SWAP/RATE/EUR/2D/3M/25Y + IR_SWAP/RATE/EUR/2D/3M/30Y + IR_SWAP/RATE/EUR/2D/3M/40Y + IR_SWAP/RATE/EUR/2D/3M/50Y + IR_SWAP/RATE/EUR/2D/3M/60Y + + EUR-EURIBOR-3M-SWAP + LastRelevantPillarDate + 0 + 1 + EUR-EURIBOR-3M + + + Discount + LogLinear + 1 + A365 + 0.0000000000010000 + true + + 0.0000000000010000 + 0.0000000000010000 + false + 5 + 2 + 2 + 10 + + + + EUR-EURIBOR-6M + EUR EURIBOR 6M Index Curve + EUR + EUR-ESTER + + + Deposit + + MM/RATE/EUR/2D/6M + + EUR-DEPOSIT + LastRelevantPillarDate + 0 + 1 + + + FRA + + FRA/RATE/EUR/1M/6M + FRA/RATE/EUR/2M/6M + FRA/RATE/EUR/3M/6M + FRA/RATE/EUR/4M/6M + FRA/RATE/EUR/5M/6M + FRA/RATE/EUR/6M/6M + FRA/RATE/EUR/9M/6M + FRA/RATE/EUR/12M/6M + + EUR-6M-FRA + LastRelevantPillarDate + 0 + 1 + EUR-EURIBOR-6M + + + Tenor Basis Two Swaps + + BASIS_SWAP/BASIS_SPREAD/3M/6M/EUR/2Y + BASIS_SWAP/BASIS_SPREAD/3M/6M/EUR/3Y + BASIS_SWAP/BASIS_SPREAD/3M/6M/EUR/4Y + BASIS_SWAP/BASIS_SPREAD/3M/6M/EUR/5Y + BASIS_SWAP/BASIS_SPREAD/3M/6M/EUR/6Y + BASIS_SWAP/BASIS_SPREAD/3M/6M/EUR/7Y + BASIS_SWAP/BASIS_SPREAD/3M/6M/EUR/8Y + BASIS_SWAP/BASIS_SPREAD/3M/6M/EUR/9Y + BASIS_SWAP/BASIS_SPREAD/3M/6M/EUR/10Y + BASIS_SWAP/BASIS_SPREAD/3M/6M/EUR/12Y + BASIS_SWAP/BASIS_SPREAD/3M/6M/EUR/15Y + BASIS_SWAP/BASIS_SPREAD/3M/6M/EUR/20Y + BASIS_SWAP/BASIS_SPREAD/3M/6M/EUR/25Y + BASIS_SWAP/BASIS_SPREAD/3M/6M/EUR/30Y + BASIS_SWAP/BASIS_SPREAD/3M/6M/EUR/40Y + BASIS_SWAP/BASIS_SPREAD/3M/6M/EUR/50Y + BASIS_SWAP/BASIS_SPREAD/3M/6M/EUR/60Y + + EURIBOR-3M-6M-BASIS + LastRelevantPillarDate + 0 + 1 + EUR-EURIBOR-6M + EUR-EURIBOR-3M + + + Discount + LogLinear + 1 + A365 + 0.0000000000010000 + true + + 0.0000000000010000 + 0.0000000000010000 + false + 5 + 2 + 2 + 10 + + + + + + Underlying1 + + USD + + + SpreadCDS + Yield/USD/USD-SOFR + Actual/365 (Fixed) + RECOVERY_RATE/RATE/Underlying1/SNRFOR/USD + + CDS/CREDIT_SPREAD/Underlying1/SNRFOR/USD/* + + CDS-STANDARD-CONVENTIONS + true + 2018-09-20 + + 0.0000000000010000 + 0.0000000000010000 + true + 10 + 1 + 2 + 5 + + false + + + + + + + RIC:.SPX + Standard & Poor's Corp + USD + USD + USD-SOFR + ForwardPrice + EQUITY/PRICE/RIC:.SPX/USD + + EQUITY_FWD/PRICE/RIC:.SPX/USD/* + + A365 + + Zero + Linear + + false + false + + + RIC:.STOXX50 + STOXX Europe 50 EUR Price Index option implied forward curve + EUR + + EUR-ESTER + OptionPremium + European + EQUITY/PRICE/RIC:.STOXX50/EUR + + EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/* + + A365 + + Zero + Linear + + false + true + + + + + EUHICPXT_ZC_Swaps + Estimation Curve for EUHICPXT + Yield/EUR/EUR-ESTER + ZC + + ZC_INFLATIONSWAP/RATE/EUHICPXT/1Y + ZC_INFLATIONSWAP/RATE/EUHICPXT/2Y + ZC_INFLATIONSWAP/RATE/EUHICPXT/3Y + ZC_INFLATIONSWAP/RATE/EUHICPXT/4Y + ZC_INFLATIONSWAP/RATE/EUHICPXT/5Y + ZC_INFLATIONSWAP/RATE/EUHICPXT/6Y + ZC_INFLATIONSWAP/RATE/EUHICPXT/7Y + ZC_INFLATIONSWAP/RATE/EUHICPXT/8Y + ZC_INFLATIONSWAP/RATE/EUHICPXT/9Y + ZC_INFLATIONSWAP/RATE/EUHICPXT/10Y + ZC_INFLATIONSWAP/RATE/EUHICPXT/12Y + ZC_INFLATIONSWAP/RATE/EUHICPXT/15Y + ZC_INFLATIONSWAP/RATE/EUHICPXT/20Y + ZC_INFLATIONSWAP/RATE/EUHICPXT/25Y + ZC_INFLATIONSWAP/RATE/EUHICPXT/30Y + ZC_INFLATIONSWAP/RATE/EUHICPXT/35Y + ZC_INFLATIONSWAP/RATE/EUHICPXT/40Y + ZC_INFLATIONSWAP/RATE/EUHICPXT/45Y + ZC_INFLATIONSWAP/RATE/EUHICPXT/50Y + + EUHICPXT_INFLATIONSWAP + true + TARGET + Actual/365 (Fixed) + 3M + Monthly + + 0.0000000000010000 + true + + 2008-01-01 + Monthly + + SEASONALITY/RATE/MULT/EUHICPXT/JAN + SEASONALITY/RATE/MULT/EUHICPXT/FEB + SEASONALITY/RATE/MULT/EUHICPXT/MAR + SEASONALITY/RATE/MULT/EUHICPXT/APR + SEASONALITY/RATE/MULT/EUHICPXT/MAY + SEASONALITY/RATE/MULT/EUHICPXT/JUN + SEASONALITY/RATE/MULT/EUHICPXT/JUL + SEASONALITY/RATE/MULT/EUHICPXT/AUG + SEASONALITY/RATE/MULT/EUHICPXT/SEP + SEASONALITY/RATE/MULT/EUHICPXT/OCT + SEASONALITY/RATE/MULT/EUHICPXT/NOV + SEASONALITY/RATE/MULT/EUHICPXT/DEC + + + + + \ No newline at end of file diff --git a/EconomicStressAgentORE/oredata/Input/fixings.csv b/EconomicStressAgentORE/oredata/Input/fixings.csv new file mode 100644 index 0000000..f5b4c20 --- /dev/null +++ b/EconomicStressAgentORE/oredata/Input/fixings.csv @@ -0,0 +1,416 @@ +#fixingDate,fixingId,fixingValue +2023-11-06,EUR-EONIA,0.0398700000 +2023-11-07,EUR-EONIA,0.0398500000 +2023-11-08,EUR-EONIA,0.0398700000 +2023-11-09,EUR-EONIA,0.0398700000 +2023-11-10,EUR-EONIA,0.0398700000 +2023-11-13,EUR-EONIA,0.0398900000 +2023-11-14,EUR-EONIA,0.0398800000 +2023-11-15,EUR-EONIA,0.0398700000 +2023-11-16,EUR-EONIA,0.0398400000 +2023-11-17,EUR-EONIA,0.0399100000 +2023-11-20,EUR-EONIA,0.0398700000 +2023-11-21,EUR-EONIA,0.0398800000 +2023-11-22,EUR-EONIA,0.0398600000 +2023-11-23,EUR-EONIA,0.0398700000 +2023-11-24,EUR-EONIA,0.0398700000 +2023-11-27,EUR-EONIA,0.0398900000 +2023-11-28,EUR-EONIA,0.0398800000 +2023-11-29,EUR-EONIA,0.0398800000 +2023-11-30,EUR-EONIA,0.0398700000 +2023-12-01,EUR-EONIA,0.0397600000 +2023-12-04,EUR-EONIA,0.0397600000 +2023-12-05,EUR-EONIA,0.0398900000 +2023-12-06,EUR-EONIA,0.0399000000 +2023-12-07,EUR-EONIA,0.0398900000 +2023-12-08,EUR-EONIA,0.0398800000 +2023-12-11,EUR-EONIA,0.0398800000 +2023-12-12,EUR-EONIA,0.0398700000 +2023-12-13,EUR-EONIA,0.0399000000 +2023-12-14,EUR-EONIA,0.0399000000 +2023-12-15,EUR-EONIA,0.0399200000 +2023-12-18,EUR-EONIA,0.0398900000 +2023-12-19,EUR-EONIA,0.0398600000 +2023-12-20,EUR-EONIA,0.0398600000 +2023-12-21,EUR-EONIA,0.0398600000 +2023-12-22,EUR-EONIA,0.0398400000 +2023-12-25,EUR-EONIA,0.0398400000 +2023-12-26,EUR-EONIA,0.0398400000 +2023-12-27,EUR-EONIA,0.0398400000 +2023-12-28,EUR-EONIA,0.0398500000 +2023-12-29,EUR-EONIA,0.0398500000 +2024-01-01,EUR-EONIA,0.0398500000 +2024-01-02,EUR-EONIA,0.0396700000 +2024-01-03,EUR-EONIA,0.0399100000 +2024-01-04,EUR-EONIA,0.0398900000 +2024-01-05,EUR-EONIA,0.0398700000 +2024-01-08,EUR-EONIA,0.0399000000 +2024-01-09,EUR-EONIA,0.0398900000 +2024-01-10,EUR-EONIA,0.0398900000 +2024-01-11,EUR-EONIA,0.0399100000 +2024-01-12,EUR-EONIA,0.0399000000 +2024-01-15,EUR-EONIA,0.0398900000 +2024-01-16,EUR-EONIA,0.0398700000 +2024-01-17,EUR-EONIA,0.0399000000 +2024-01-18,EUR-EONIA,0.0398900000 +2024-01-19,EUR-EONIA,0.0399200000 +2024-01-22,EUR-EONIA,0.0398900000 +2024-01-23,EUR-EONIA,0.0398700000 +2024-01-24,EUR-EONIA,0.0398700000 +2024-01-25,EUR-EONIA,0.0399000000 +2024-01-26,EUR-EONIA,0.0399000000 +2024-01-29,EUR-EONIA,0.0398900000 +2024-01-30,EUR-EONIA,0.0399200000 +2024-01-31,EUR-EONIA,0.0399200000 +2024-02-01,EUR-EONIA,0.0397900000 +2024-02-02,EUR-EONIA,0.0399000000 +2024-02-05,EUR-EONIA,0.0399100000 +2024-02-06,EUR-EONIA,0.0399200000 +2024-02-07,EUR-EONIA,0.0399300000 +2024-02-08,EUR-EONIA,0.0399300000 +2024-02-09,EUR-EONIA,0.0399300000 +2024-02-12,EUR-EONIA,0.0399500000 +2024-02-13,EUR-EONIA,0.0399400000 +2024-02-14,EUR-EONIA,0.0399400000 +2024-02-15,EUR-EONIA,0.0399600000 +2024-02-16,EUR-EONIA,0.0399600000 +2024-02-19,EUR-EONIA,0.0399400000 +2024-02-20,EUR-EONIA,0.0399500000 +2024-02-21,EUR-EONIA,0.0399600000 +2024-02-22,EUR-EONIA,0.0399500000 +2024-02-23,EUR-EONIA,0.0399400000 +2024-02-26,EUR-EONIA,0.0399200000 +2024-02-27,EUR-EONIA,0.0398900000 +2024-02-28,EUR-EONIA,0.0399000000 +2024-02-29,EUR-EONIA,0.0399100000 +2024-03-01,EUR-EONIA,0.0397200000 +2024-03-04,EUR-EONIA,0.0398900000 +2024-03-05,EUR-EONIA,0.0398800000 +2023-09-28,EUR-ESTER,0.0390400000 +2023-09-29,EUR-ESTER,0.0390500000 +2023-10-02,EUR-ESTER,0.0390600000 +2023-10-03,EUR-ESTER,0.0388000000 +2023-10-04,EUR-ESTER,0.0389900000 +2023-10-05,EUR-ESTER,0.0390000000 +2023-10-06,EUR-ESTER,0.0390100000 +2023-10-09,EUR-ESTER,0.0390000000 +2023-10-10,EUR-ESTER,0.0389900000 +2023-10-11,EUR-ESTER,0.0390000000 +2023-10-12,EUR-ESTER,0.0389900000 +2023-10-13,EUR-ESTER,0.0390100000 +2023-10-16,EUR-ESTER,0.0390100000 +2023-10-17,EUR-ESTER,0.0390300000 +2023-10-18,EUR-ESTER,0.0390200000 +2023-10-19,EUR-ESTER,0.0390400000 +2023-10-20,EUR-ESTER,0.0390300000 +2023-10-23,EUR-ESTER,0.0390500000 +2023-10-24,EUR-ESTER,0.0390500000 +2023-10-25,EUR-ESTER,0.0390500000 +2023-10-26,EUR-ESTER,0.0390400000 +2023-10-27,EUR-ESTER,0.0390000000 +2023-10-30,EUR-ESTER,0.0390100000 +2023-10-31,EUR-ESTER,0.0390300000 +2023-11-01,EUR-ESTER,0.0389900000 +2023-11-02,EUR-ESTER,0.0388200000 +2023-11-03,EUR-ESTER,0.0390000000 +2023-11-06,EUR-ESTER,0.0390300000 +2023-11-07,EUR-ESTER,0.0390200000 +2023-11-08,EUR-ESTER,0.0390000000 +2023-11-09,EUR-ESTER,0.0390200000 +2023-11-10,EUR-ESTER,0.0390200000 +2023-11-13,EUR-ESTER,0.0390200000 +2023-11-14,EUR-ESTER,0.0390400000 +2023-11-15,EUR-ESTER,0.0390300000 +2023-11-16,EUR-ESTER,0.0390200000 +2023-11-17,EUR-ESTER,0.0389900000 +2023-11-20,EUR-ESTER,0.0390600000 +2023-11-21,EUR-ESTER,0.0390200000 +2023-11-22,EUR-ESTER,0.0390300000 +2023-11-23,EUR-ESTER,0.0390100000 +2023-11-24,EUR-ESTER,0.0390200000 +2023-11-27,EUR-ESTER,0.0390200000 +2023-11-28,EUR-ESTER,0.0390400000 +2023-11-29,EUR-ESTER,0.0390300000 +2023-11-30,EUR-ESTER,0.0390300000 +2023-12-01,EUR-ESTER,0.0390200000 +2023-12-04,EUR-ESTER,0.0389100000 +2023-12-05,EUR-ESTER,0.0389100000 +2023-12-06,EUR-ESTER,0.0390400000 +2023-12-07,EUR-ESTER,0.0390500000 +2023-12-08,EUR-ESTER,0.0390400000 +2023-12-11,EUR-ESTER,0.0390300000 +2023-12-12,EUR-ESTER,0.0390300000 +2023-12-13,EUR-ESTER,0.0390200000 +2023-12-14,EUR-ESTER,0.0390500000 +2023-12-15,EUR-ESTER,0.0390500000 +2023-12-18,EUR-ESTER,0.0390700000 +2023-12-19,EUR-ESTER,0.0390400000 +2023-12-20,EUR-ESTER,0.0390100000 +2023-12-21,EUR-ESTER,0.0390100000 +2023-12-22,EUR-ESTER,0.0389900000 +2023-12-25,EUR-ESTER,0.0389900000 +2023-12-26,EUR-ESTER,0.0389900000 +2023-12-27,EUR-ESTER,0.0389900000 +2023-12-28,EUR-ESTER,0.0389900000 +2023-12-29,EUR-ESTER,0.0390000000 +2024-01-01,EUR-ESTER,0.0390000000 +2024-01-02,EUR-ESTER,0.0390000000 +2024-01-03,EUR-ESTER,0.0388200000 +2024-01-04,EUR-ESTER,0.0390600000 +2024-01-05,EUR-ESTER,0.0390400000 +2024-01-08,EUR-ESTER,0.0390200000 +2024-01-09,EUR-ESTER,0.0390500000 +2024-01-10,EUR-ESTER,0.0390400000 +2024-01-11,EUR-ESTER,0.0390400000 +2024-01-12,EUR-ESTER,0.0390600000 +2024-01-15,EUR-ESTER,0.0390500000 +2024-01-16,EUR-ESTER,0.0390400000 +2024-01-17,EUR-ESTER,0.0390200000 +2024-01-18,EUR-ESTER,0.0390500000 +2024-01-19,EUR-ESTER,0.0390400000 +2024-01-22,EUR-ESTER,0.0390700000 +2024-01-23,EUR-ESTER,0.0390400000 +2024-01-24,EUR-ESTER,0.0390200000 +2024-01-25,EUR-ESTER,0.0390200000 +2024-01-26,EUR-ESTER,0.0390500000 +2024-01-29,EUR-ESTER,0.0390500000 +2024-01-30,EUR-ESTER,0.0390400000 +2024-01-31,EUR-ESTER,0.0390700000 +2024-02-01,EUR-ESTER,0.0390700000 +2024-02-02,EUR-ESTER,0.0389400000 +2024-02-05,EUR-ESTER,0.0390500000 +2024-02-06,EUR-ESTER,0.0390600000 +2024-02-07,EUR-ESTER,0.0390700000 +2024-02-08,EUR-ESTER,0.0390800000 +2024-02-09,EUR-ESTER,0.0390800000 +2024-02-12,EUR-ESTER,0.0390800000 +2024-02-13,EUR-ESTER,0.0391000000 +2024-02-14,EUR-ESTER,0.0390900000 +2024-02-15,EUR-ESTER,0.0390900000 +2024-02-16,EUR-ESTER,0.0391100000 +2024-02-19,EUR-ESTER,0.0391100000 +2024-02-20,EUR-ESTER,0.0390900000 +2024-02-21,EUR-ESTER,0.0391000000 +2024-02-22,EUR-ESTER,0.0391100000 +2024-02-23,EUR-ESTER,0.0391000000 +2024-02-26,EUR-ESTER,0.0390900000 +2024-02-27,EUR-ESTER,0.0390700000 +2024-02-28,EUR-ESTER,0.0390400000 +2024-02-29,EUR-ESTER,0.0390500000 +2024-03-01,EUR-ESTER,0.0390600000 +2024-03-04,EUR-ESTER,0.0388700000 +2024-03-05,EUR-ESTER,0.0390400000 +2023-11-06,USD-FedFunds,0.0533000000 +2023-11-07,USD-FedFunds,0.0533000000 +2023-11-08,USD-FedFunds,0.0533000000 +2023-11-09,USD-FedFunds,0.0533000000 +2023-11-10,USD-FedFunds,0.0533000000 +2023-11-13,USD-FedFunds,0.0533000000 +2023-11-14,USD-FedFunds,0.0533000000 +2023-11-15,USD-FedFunds,0.0533000000 +2023-11-16,USD-FedFunds,0.0533000000 +2023-11-17,USD-FedFunds,0.0533000000 +2023-11-20,USD-FedFunds,0.0533000000 +2023-11-21,USD-FedFunds,0.0533000000 +2023-11-22,USD-FedFunds,0.0533000000 +2023-11-23,USD-FedFunds,0.0533000000 +2023-11-24,USD-FedFunds,0.0533000000 +2023-11-27,USD-FedFunds,0.0533000000 +2023-11-28,USD-FedFunds,0.0533000000 +2023-11-29,USD-FedFunds,0.0533000000 +2023-11-30,USD-FedFunds,0.0533000000 +2023-12-01,USD-FedFunds,0.0533000000 +2023-12-04,USD-FedFunds,0.0533000000 +2023-12-05,USD-FedFunds,0.0533000000 +2023-12-06,USD-FedFunds,0.0533000000 +2023-12-07,USD-FedFunds,0.0533000000 +2023-12-08,USD-FedFunds,0.0533000000 +2023-12-11,USD-FedFunds,0.0533000000 +2023-12-12,USD-FedFunds,0.0533000000 +2023-12-13,USD-FedFunds,0.0533000000 +2023-12-14,USD-FedFunds,0.0533000000 +2023-12-15,USD-FedFunds,0.0533000000 +2023-12-18,USD-FedFunds,0.0533000000 +2023-12-19,USD-FedFunds,0.0533000000 +2023-12-20,USD-FedFunds,0.0533000000 +2023-12-21,USD-FedFunds,0.0533000000 +2023-12-22,USD-FedFunds,0.0533000000 +2023-12-25,USD-FedFunds,0.0533000000 +2023-12-26,USD-FedFunds,0.0533000000 +2023-12-27,USD-FedFunds,0.0533000000 +2023-12-28,USD-FedFunds,0.0533000000 +2023-12-29,USD-FedFunds,0.0533000000 +2024-01-01,USD-FedFunds,0.0533000000 +2024-01-02,USD-FedFunds,0.0533000000 +2024-01-03,USD-FedFunds,0.0533000000 +2024-01-04,USD-FedFunds,0.0533000000 +2024-01-05,USD-FedFunds,0.0533000000 +2024-01-08,USD-FedFunds,0.0533000000 +2024-01-09,USD-FedFunds,0.0533000000 +2024-01-10,USD-FedFunds,0.0533000000 +2024-01-11,USD-FedFunds,0.0533000000 +2024-01-12,USD-FedFunds,0.0533000000 +2024-01-15,USD-FedFunds,0.0533000000 +2024-01-16,USD-FedFunds,0.0533000000 +2024-01-17,USD-FedFunds,0.0533000000 +2024-01-18,USD-FedFunds,0.0533000000 +2024-01-19,USD-FedFunds,0.0533000000 +2024-01-22,USD-FedFunds,0.0533000000 +2024-01-23,USD-FedFunds,0.0533000000 +2024-01-24,USD-FedFunds,0.0533000000 +2024-01-25,USD-FedFunds,0.0533000000 +2024-01-26,USD-FedFunds,0.0533000000 +2024-01-29,USD-FedFunds,0.0533000000 +2024-01-30,USD-FedFunds,0.0533000000 +2024-01-31,USD-FedFunds,0.0533000000 +2024-02-01,USD-FedFunds,0.0533000000 +2024-02-02,USD-FedFunds,0.0533000000 +2024-02-05,USD-FedFunds,0.0533000000 +2024-02-06,USD-FedFunds,0.0533000000 +2024-02-07,USD-FedFunds,0.0533000000 +2024-02-08,USD-FedFunds,0.0533000000 +2024-02-09,USD-FedFunds,0.0533000000 +2024-02-12,USD-FedFunds,0.0533000000 +2024-02-13,USD-FedFunds,0.0533000000 +2024-02-14,USD-FedFunds,0.0533000000 +2024-02-15,USD-FedFunds,0.0533000000 +2024-02-16,USD-FedFunds,0.0533000000 +2024-02-19,USD-FedFunds,0.0533000000 +2024-02-20,USD-FedFunds,0.0533000000 +2024-02-21,USD-FedFunds,0.0533000000 +2024-02-22,USD-FedFunds,0.0533000000 +2024-02-23,USD-FedFunds,0.0533000000 +2024-02-26,USD-FedFunds,0.0533000000 +2024-02-27,USD-FedFunds,0.0533000000 +2024-02-28,USD-FedFunds,0.0533000000 +2024-02-29,USD-FedFunds,0.0533000000 +2024-03-01,USD-FedFunds,0.0533000000 +2024-03-04,USD-FedFunds,0.0533000000 +2024-03-05,USD-FedFunds,0.0533000000 +2023-09-28,USD-SOFR,0.0531000000 +2023-09-29,USD-SOFR,0.0531000000 +2023-10-02,USD-SOFR,0.0532000000 +2023-10-03,USD-SOFR,0.0533000000 +2023-10-04,USD-SOFR,0.0532000000 +2023-10-05,USD-SOFR,0.0532000000 +2023-10-06,USD-SOFR,0.0532000000 +2023-10-10,USD-SOFR,0.0532000000 +2023-10-11,USD-SOFR,0.0532000000 +2023-10-12,USD-SOFR,0.0532000000 +2023-10-13,USD-SOFR,0.0532000000 +2023-10-16,USD-SOFR,0.0532000000 +2023-10-17,USD-SOFR,0.0532000000 +2023-10-18,USD-SOFR,0.0532000000 +2023-10-19,USD-SOFR,0.0532000000 +2023-10-20,USD-SOFR,0.0530000000 +2023-10-23,USD-SOFR,0.0530000000 +2023-10-24,USD-SOFR,0.0530000000 +2023-10-25,USD-SOFR,0.0530000000 +2023-10-26,USD-SOFR,0.0531000000 +2023-10-27,USD-SOFR,0.0531000000 +2023-10-30,USD-SOFR,0.0531000000 +2023-10-31,USD-SOFR,0.0535000000 +2023-11-01,USD-SOFR,0.0532000000 +2023-11-02,USD-SOFR,0.0533000000 +2023-11-03,USD-SOFR,0.0532000000 +2023-11-06,USD-SOFR,0.0532000000 +2023-11-07,USD-SOFR,0.0532000000 +2023-11-08,USD-SOFR,0.0532000000 +2023-11-09,USD-SOFR,0.0532000000 +2023-11-10,USD-SOFR,0.0532000000 +2023-11-13,USD-SOFR,0.0532000000 +2023-11-14,USD-SOFR,0.0532000000 +2023-11-15,USD-SOFR,0.0532000000 +2023-11-16,USD-SOFR,0.0532000000 +2023-11-17,USD-SOFR,0.0532000000 +2023-11-20,USD-SOFR,0.0531000000 +2023-11-21,USD-SOFR,0.0531000000 +2023-11-22,USD-SOFR,0.0531000000 +2023-11-23,USD-SOFR,0.0531000000 +2023-11-24,USD-SOFR,0.0532000000 +2023-11-27,USD-SOFR,0.0532000000 +2023-11-28,USD-SOFR,0.0532000000 +2023-11-29,USD-SOFR,0.0531000000 +2023-11-30,USD-SOFR,0.0533000000 +2023-12-01,USD-SOFR,0.0539000000 +2023-12-04,USD-SOFR,0.0537000000 +2023-12-05,USD-SOFR,0.0533000000 +2023-12-06,USD-SOFR,0.0532000000 +2023-12-07,USD-SOFR,0.0532000000 +2023-12-08,USD-SOFR,0.0532000000 +2023-12-11,USD-SOFR,0.0532000000 +2023-12-12,USD-SOFR,0.0531000000 +2023-12-13,USD-SOFR,0.0531000000 +2023-12-14,USD-SOFR,0.0531000000 +2023-12-15,USD-SOFR,0.0532000000 +2023-12-18,USD-SOFR,0.0532000000 +2023-12-19,USD-SOFR,0.0531000000 +2023-12-20,USD-SOFR,0.0531000000 +2023-12-21,USD-SOFR,0.0531000000 +2023-12-22,USD-SOFR,0.0532000000 +2023-12-25,USD-SOFR,0.0532000000 +2023-12-26,USD-SOFR,0.0535000000 +2023-12-27,USD-SOFR,0.0539000000 +2023-12-28,USD-SOFR,0.0540000000 +2023-12-29,USD-SOFR,0.0538000000 +2024-01-01,USD-SOFR,0.0538000000 +2024-01-02,USD-SOFR,0.0540000000 +2024-01-03,USD-SOFR,0.0539000000 +2024-01-04,USD-SOFR,0.0532000000 +2024-01-05,USD-SOFR,0.0531000000 +2024-01-08,USD-SOFR,0.0531000000 +2024-01-09,USD-SOFR,0.0531000000 +2024-01-10,USD-SOFR,0.0531000000 +2024-01-11,USD-SOFR,0.0531000000 +2024-01-12,USD-SOFR,0.0531000000 +2024-01-15,USD-SOFR,0.0531000000 +2024-01-16,USD-SOFR,0.0532000000 +2024-01-17,USD-SOFR,0.0532000000 +2024-01-18,USD-SOFR,0.0531000000 +2024-01-19,USD-SOFR,0.0531000000 +2024-01-22,USD-SOFR,0.0531000000 +2024-01-23,USD-SOFR,0.0531000000 +2024-01-24,USD-SOFR,0.0531000000 +2024-01-25,USD-SOFR,0.0532000000 +2024-01-26,USD-SOFR,0.0532000000 +2024-01-29,USD-SOFR,0.0531000000 +2024-01-30,USD-SOFR,0.0531000000 +2024-01-31,USD-SOFR,0.0532000000 +2024-02-01,USD-SOFR,0.0532000000 +2024-02-02,USD-SOFR,0.0532000000 +2024-02-05,USD-SOFR,0.0531000000 +2024-02-06,USD-SOFR,0.0531000000 +2024-02-07,USD-SOFR,0.0531000000 +2024-02-08,USD-SOFR,0.0531000000 +2024-02-09,USD-SOFR,0.0531000000 +2024-02-12,USD-SOFR,0.0531000000 +2024-02-13,USD-SOFR,0.0531000000 +2024-02-14,USD-SOFR,0.0530000000 +2024-02-15,USD-SOFR,0.0531000000 +2024-02-16,USD-SOFR,0.0530000000 +2024-02-19,USD-SOFR,0.0530000000 +2024-02-20,USD-SOFR,0.0530000000 +2024-02-21,USD-SOFR,0.0530000000 +2024-02-22,USD-SOFR,0.0530000000 +2024-02-23,USD-SOFR,0.0531000000 +2024-02-26,USD-SOFR,0.0531000000 +2024-02-27,USD-SOFR,0.0531000000 +2024-02-28,USD-SOFR,0.0531000000 +2024-02-29,USD-SOFR,0.0532000000 +2024-03-01,USD-SOFR,0.0531000000 +2024-03-04,USD-SOFR,0.0531000000 +2024-03-05,USD-SOFR,0.0531000000 +2024-02-27,EUR-EURIBOR-3M,0.0395200000 +2024-02-28,EUR-EURIBOR-3M,0.0394200000 +2024-02-29,EUR-EURIBOR-3M,0.0393700000 +2024-03-01,EUR-EURIBOR-3M,0.0393800000 +2024-03-04,EUR-EURIBOR-3M,0.0393200000 +2024-03-05,EUR-EURIBOR-3M,0.0392600000 +2024-02-27,EUR-EURIBOR-6M,0.0391800000 +2024-02-28,EUR-EURIBOR-6M,0.0391500000 +2024-02-29,EUR-EURIBOR-6M,0.0390800000 +2024-03-01,EUR-EURIBOR-6M,0.0391200000 +2024-03-04,EUR-EURIBOR-6M,0.0391500000 +2024-03-05,EUR-EURIBOR-6M,0.0392100000 +2023-12-01,EUHICPXT,100. +2024-01-01,EUHICPXT,100.25 \ No newline at end of file diff --git a/EconomicStressAgentORE/oredata/Input/marketdata.csv b/EconomicStressAgentORE/oredata/Input/marketdata.csv new file mode 100644 index 0000000..6303345 --- /dev/null +++ b/EconomicStressAgentORE/oredata/Input/marketdata.csv @@ -0,0 +1,859 @@ +#datumDate,datumId, datumValue +2024-03-05,CC_BASIS_SWAP/BASIS_SPREAD/USD/1D/EUR/1D/10Y,-0.0018 +2024-03-05,CC_BASIS_SWAP/BASIS_SPREAD/USD/1D/EUR/1D/12Y,-0.0018 +2024-03-05,CC_BASIS_SWAP/BASIS_SPREAD/USD/1D/EUR/1D/15Y,-0.0019 +2024-03-05,CC_BASIS_SWAP/BASIS_SPREAD/USD/1D/EUR/1D/20Y,-0.0018 +2024-03-05,CC_BASIS_SWAP/BASIS_SPREAD/USD/1D/EUR/1D/25Y,-0.0014 +2024-03-05,CC_BASIS_SWAP/BASIS_SPREAD/USD/1D/EUR/1D/2Y,-0.0012 +2024-03-05,CC_BASIS_SWAP/BASIS_SPREAD/USD/1D/EUR/1D/30Y,-0.0011 +2024-03-05,CC_BASIS_SWAP/BASIS_SPREAD/USD/1D/EUR/1D/3Y,-0.0013 +2024-03-05,CC_BASIS_SWAP/BASIS_SPREAD/USD/1D/EUR/1D/40Y,-0.0006 +2024-03-05,CC_BASIS_SWAP/BASIS_SPREAD/USD/1D/EUR/1D/4Y,-0.0014 +2024-03-05,CC_BASIS_SWAP/BASIS_SPREAD/USD/1D/EUR/1D/50Y,-0.0001 +2024-03-05,CC_BASIS_SWAP/BASIS_SPREAD/USD/1D/EUR/1D/5Y,-0.0015 +2024-03-05,CC_BASIS_SWAP/BASIS_SPREAD/USD/1D/EUR/1D/6Y,-0.0015 +2024-03-05,CC_BASIS_SWAP/BASIS_SPREAD/USD/1D/EUR/1D/7Y,-0.0016 +2024-03-05,CC_BASIS_SWAP/BASIS_SPREAD/USD/1D/EUR/1D/8Y,-0.0017 +2024-03-05,CC_BASIS_SWAP/BASIS_SPREAD/USD/1D/EUR/1D/9Y,-0.0017 +2024-03-05,FX/RATE/EUR/USD,1.08 +2024-03-05,FXFWD/RATE/EUR/USD/10M,147.32 +2024-03-05,FXFWD/RATE/EUR/USD/11M,162.45 +2024-03-05,FXFWD/RATE/EUR/USD/15M,222.64 +2024-03-05,FXFWD/RATE/EUR/USD/18M,265.55 +2024-03-05,FXFWD/RATE/EUR/USD/1M,14.05 +2024-03-05,FXFWD/RATE/EUR/USD/1W,2.94 +2024-03-05,FXFWD/RATE/EUR/USD/1Y,176.2 +2024-03-05,FXFWD/RATE/EUR/USD/21M,308.54 +2024-03-05,FXFWD/RATE/EUR/USD/2M,27.01 +2024-03-05,FXFWD/RATE/EUR/USD/2W,5.89 +2024-03-05,FXFWD/RATE/EUR/USD/3M,40.74 +2024-03-05,FXFWD/RATE/EUR/USD/3W,8.86 +2024-03-05,FXFWD/RATE/EUR/USD/4M,55.18 +2024-03-05,FXFWD/RATE/EUR/USD/5M,69.2 +2024-03-05,FXFWD/RATE/EUR/USD/6M,84.4 +2024-03-05,FXFWD/RATE/EUR/USD/7M,98.35 +2024-03-05,FXFWD/RATE/EUR/USD/8M,113.45 +2024-03-05,FXFWD/RATE/EUR/USD/9M,129.05 +2024-03-05,FXFWD/RATE/EUR/USD/ON,0.43 +2024-03-05,FXFWD/RATE/EUR/USD/SN,0.42 +2024-03-05,FXFWD/RATE/EUR/USD/TN,0.42 +2024-03-05,IR_SWAP/RATE/EUR/ESTER/2D/1D/10M,0.036 +2024-03-05,IR_SWAP/RATE/EUR/ESTER/2D/1D/10Y,0.025 +2024-03-05,IR_SWAP/RATE/EUR/ESTER/2D/1D/11M,0.035 +2024-03-05,IR_SWAP/RATE/EUR/ESTER/2D/1D/11Y,0.025 +2024-03-05,IR_SWAP/RATE/EUR/ESTER/2D/1D/12Y,0.025 +2024-03-05,IR_SWAP/RATE/EUR/ESTER/2D/1D/15M,0.033 +2024-03-05,IR_SWAP/RATE/EUR/ESTER/2D/1D/15Y,0.026 +2024-03-05,IR_SWAP/RATE/EUR/ESTER/2D/1D/18M,0.032 +2024-03-05,IR_SWAP/RATE/EUR/ESTER/2D/1D/1M,0.039 +2024-03-05,IR_SWAP/RATE/EUR/ESTER/2D/1D/1W,0.039 +2024-03-05,IR_SWAP/RATE/EUR/ESTER/2D/1D/1Y,0.035 +2024-03-05,IR_SWAP/RATE/EUR/ESTER/2D/1D/20Y,0.025 +2024-03-05,IR_SWAP/RATE/EUR/ESTER/2D/1D/21M,0.031 +2024-03-05,IR_SWAP/RATE/EUR/ESTER/2D/1D/25Y,0.025 +2024-03-05,IR_SWAP/RATE/EUR/ESTER/2D/1D/2M,0.039 +2024-03-05,IR_SWAP/RATE/EUR/ESTER/2D/1D/2W,0.039 +2024-03-05,IR_SWAP/RATE/EUR/ESTER/2D/1D/2Y,0.03 +2024-03-05,IR_SWAP/RATE/EUR/ESTER/2D/1D/30Y,0.024 +2024-03-05,IR_SWAP/RATE/EUR/ESTER/2D/1D/3M,0.039 +2024-03-05,IR_SWAP/RATE/EUR/ESTER/2D/1D/3W,0.039 +2024-03-05,IR_SWAP/RATE/EUR/ESTER/2D/1D/3Y,0.027 +2024-03-05,IR_SWAP/RATE/EUR/ESTER/2D/1D/40Y,0.022 +2024-03-05,IR_SWAP/RATE/EUR/ESTER/2D/1D/4M,0.039 +2024-03-05,IR_SWAP/RATE/EUR/ESTER/2D/1D/4Y,0.026 +2024-03-05,IR_SWAP/RATE/EUR/ESTER/2D/1D/50Y,0.021 +2024-03-05,IR_SWAP/RATE/EUR/ESTER/2D/1D/5M,0.038 +2024-03-05,IR_SWAP/RATE/EUR/ESTER/2D/1D/5Y,0.025 +2024-03-05,IR_SWAP/RATE/EUR/ESTER/2D/1D/60Y,0.022 +2024-03-05,IR_SWAP/RATE/EUR/ESTER/2D/1D/6M,0.038 +2024-03-05,IR_SWAP/RATE/EUR/ESTER/2D/1D/6Y,0.025 +2024-03-05,IR_SWAP/RATE/EUR/ESTER/2D/1D/7M,0.038 +2024-03-05,IR_SWAP/RATE/EUR/ESTER/2D/1D/7Y,0.025 +2024-03-05,IR_SWAP/RATE/EUR/ESTER/2D/1D/8M,0.037 +2024-03-05,IR_SWAP/RATE/EUR/ESTER/2D/1D/8Y,0.025 +2024-03-05,IR_SWAP/RATE/EUR/ESTER/2D/1D/9M,0.036 +2024-03-05,IR_SWAP/RATE/EUR/ESTER/2D/1D/9Y,0.025 +2024-03-05,IR_SWAP/RATE/USD/2D/1D/1M,0.053 +2024-03-05,IR_SWAP/RATE/USD/2D/1D/2M,0.053 +2024-03-05,IR_SWAP/RATE/USD/2D/1D/2W,0.053 +2024-03-05,IR_SWAP/RATE/USD/2D/1D/3M,0.053 +2024-03-05,IR_SWAP/RATE/USD/2D/1D/4M,0.053 +2024-03-05,IR_SWAP/RATE/USD/2D/1D/5M,0.053 +2024-03-05,IR_SWAP/RATE/USD/SOFR/0D/1D/10Y,0.038 +2024-03-05,IR_SWAP/RATE/USD/SOFR/0D/1D/12Y,0.038 +2024-03-05,IR_SWAP/RATE/USD/SOFR/0D/1D/15Y,0.038 +2024-03-05,IR_SWAP/RATE/USD/SOFR/0D/1D/20Y,0.038 +2024-03-05,IR_SWAP/RATE/USD/SOFR/0D/1D/25Y,0.037 +2024-03-05,IR_SWAP/RATE/USD/SOFR/0D/1D/2Y,0.045 +2024-03-05,IR_SWAP/RATE/USD/SOFR/0D/1D/30Y,0.036 +2024-03-05,IR_SWAP/RATE/USD/SOFR/0D/1D/3Y,0.042 +2024-03-05,IR_SWAP/RATE/USD/SOFR/0D/1D/40Y,0.034 +2024-03-05,IR_SWAP/RATE/USD/SOFR/0D/1D/4Y,0.04 +2024-03-05,IR_SWAP/RATE/USD/SOFR/0D/1D/50Y,0.032 +2024-03-05,IR_SWAP/RATE/USD/SOFR/0D/1D/5Y,0.039 +2024-03-05,IR_SWAP/RATE/USD/SOFR/0D/1D/6Y,0.039 +2024-03-05,IR_SWAP/RATE/USD/SOFR/0D/1D/7Y,0.038 +2024-03-05,IR_SWAP/RATE/USD/SOFR/0D/1D/8Y,0.038 +2024-03-05,IR_SWAP/RATE/USD/SOFR/0D/1D/9Y,0.038 +2024-03-05,MM/RATE/EUR/ESTER/0D/1D,0.039 +2024-03-05,MM/RATE/USD/0D/1D,0.054 +2024-03-05,MM/RATE/USD/SOFR/0D/1D,0.053 +2024-03-05,OI_FUTURE/PRICE/USD/2024-04/XCME:SRA/3M,95.23 +2024-03-05,OI_FUTURE/PRICE/USD/2024-05/XCME:SRA/3M,93.86 +2024-03-05,OI_FUTURE/PRICE/USD/2024-06/XCME:SRA/3M,95.33 +2024-03-05,OI_FUTURE/PRICE/USD/2024-07/XCME:SRA/3M,93.94 +2024-03-05,OI_FUTURE/PRICE/USD/2024-08/XCME:SRA/3M,94.56 +2024-03-05,OI_FUTURE/PRICE/USD/2024-09/XCME:SRA/3M,95.6 +2024-03-05,OI_FUTURE/PRICE/USD/2024-10/XCME:SRA/3M,94.58 +2024-03-05,OI_FUTURE/PRICE/USD/2024-11/XCME:SRA/3M,94.28 +2024-03-05,OI_FUTURE/PRICE/USD/2024-12/XCME:SRA/3M,94.65 +2024-03-05,OI_FUTURE/PRICE/USD/2025-03/XCME:SRA/3M,96.5 +2024-03-05,OI_FUTURE/PRICE/USD/2025-06/XCME:SRA/3M,95.02 +2024-03-05,OI_FUTURE/PRICE/USD/2025-09/XCME:SRA/3M,96.6 +2024-03-05,CDS/CREDIT_SPREAD/Underlying1/SNRFOR/USD/10Y,0.03 +2024-03-05,CDS/CREDIT_SPREAD/Underlying1/SNRFOR/USD/3Y,0.008 +2024-03-05,CDS/CREDIT_SPREAD/Underlying1/SNRFOR/USD/5Y,0.017 +2024-03-05,CDS/CREDIT_SPREAD/Underlying1/SNRFOR/USD/7Y,0.022 +2024-03-05,RECOVERY_RATE/RATE/Underlying1/SNRFOR/USD,0.4 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/1Y/6M/0/0/-0.01,0.019 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/1Y/6M/0/0/0,0.017 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/1Y/6M/0/0/0.01,0.014 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/1Y/6M/0/0/0.02,0.011 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/1Y/6M/0/0/0.03,0.009 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/1Y/6M/0/0/0.04,0.008 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/1Y/6M/0/0/0.05,0.01 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/1Y/6M/0/0/0.06,0.012 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/1Y/6M/0/0/0.07,0.015 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/1Y/6M/0/0/0.1,0.022 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/2Y/6M/0/0/-0.01,0.015 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/2Y/6M/0/0/0,0.013 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/2Y/6M/0/0/0.01,0.012 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/2Y/6M/0/0/0.02,0.011 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/2Y/6M/0/0/0.03,0.01 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/2Y/6M/0/0/0.04,0.01 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/2Y/6M/0/0/0.05,0.012 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/2Y/6M/0/0/0.06,0.014 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/2Y/6M/0/0/0.07,0.016 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/2Y/6M/0/0/0.1,0.022 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/3Y/6M/0/0/-0.01,0.012 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/3Y/6M/0/0/0,0.012 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/3Y/6M/0/0/0.01,0.011 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/3Y/6M/0/0/0.02,0.011 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/3Y/6M/0/0/0.03,0.01 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/3Y/6M/0/0/0.04,0.011 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/3Y/6M/0/0/0.05,0.013 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/3Y/6M/0/0/0.06,0.014 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/3Y/6M/0/0/0.07,0.016 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/3Y/6M/0/0/0.1,0.02 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/4Y/6M/0/0/-0.01,0.011 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/4Y/6M/0/0/0,0.011 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/4Y/6M/0/0/0.01,0.01 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/4Y/6M/0/0/0.02,0.01 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/4Y/6M/0/0/0.03,0.01 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/4Y/6M/0/0/0.04,0.011 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/4Y/6M/0/0/0.05,0.013 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/4Y/6M/0/0/0.06,0.014 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/4Y/6M/0/0/0.07,0.015 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/4Y/6M/0/0/0.1,0.02 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/5Y/6M/0/0/-0.01,0.011 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/5Y/6M/0/0/0,0.01 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/5Y/6M/0/0/0.01,0.01 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/5Y/6M/0/0/0.02,0.01 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/5Y/6M/0/0/0.03,0.01 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/5Y/6M/0/0/0.04,0.011 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/5Y/6M/0/0/0.05,0.012 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/5Y/6M/0/0/0.06,0.014 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/5Y/6M/0/0/0.07,0.015 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/5Y/6M/0/0/0.1,0.019 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/6Y/6M/0/0/-0.01,0.011 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/6Y/6M/0/0/0,0.01 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/6Y/6M/0/0/0.01,0.01 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/6Y/6M/0/0/0.02,0.01 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/6Y/6M/0/0/0.03,0.01 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/6Y/6M/0/0/0.04,0.011 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/6Y/6M/0/0/0.05,0.012 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/6Y/6M/0/0/0.06,0.014 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/6Y/6M/0/0/0.07,0.015 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/6Y/6M/0/0/0.1,0.019 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/7Y/6M/0/0/-0.01,0.01 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/7Y/6M/0/0/0,0.01 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/7Y/6M/0/0/0.01,0.01 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/7Y/6M/0/0/0.02,0.01 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/7Y/6M/0/0/0.03,0.01 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/7Y/6M/0/0/0.04,0.011 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/7Y/6M/0/0/0.05,0.012 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/7Y/6M/0/0/0.06,0.013 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/7Y/6M/0/0/0.07,0.015 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/7Y/6M/0/0/0.1,0.019 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/8Y/6M/0/0/-0.01,0.01 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/8Y/6M/0/0/0,0.01 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/8Y/6M/0/0/0.01,0.01 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/8Y/6M/0/0/0.02,0.01 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/8Y/6M/0/0/0.03,0.01 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/8Y/6M/0/0/0.04,0.011 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/8Y/6M/0/0/0.05,0.012 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/8Y/6M/0/0/0.06,0.013 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/8Y/6M/0/0/0.07,0.014 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/8Y/6M/0/0/0.1,0.019 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/9Y/6M/0/0/-0.01,0.01 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/9Y/6M/0/0/0,0.009 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/9Y/6M/0/0/0.01,0.009 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/9Y/6M/0/0/0.02,0.009 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/9Y/6M/0/0/0.03,0.01 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/9Y/6M/0/0/0.04,0.011 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/9Y/6M/0/0/0.05,0.012 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/9Y/6M/0/0/0.06,0.013 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/9Y/6M/0/0/0.07,0.014 +2024-03-05,CAPFLOOR/RATE_NVOL/EUR/9Y/6M/0/0/0.1,0.018 +2024-03-05,MM/RATE/EUR/2D/6M,0.039 +2024-03-05,FRA/RATE/EUR/12M/6M,0.028 +2024-03-05,FRA/RATE/EUR/1M/6M,0.039 +2024-03-05,FRA/RATE/EUR/2M/6M,0.037 +2024-03-05,FRA/RATE/EUR/3M/6M,0.036 +2024-03-05,FRA/RATE/EUR/4M/6M,0.035 +2024-03-05,FRA/RATE/EUR/5M/6M,0.034 +2024-03-05,FRA/RATE/EUR/6M/6M,0.033 +2024-03-05,FRA/RATE/EUR/9M/6M,0.03 +2024-03-05,BASIS_SWAP/BASIS_SPREAD/3M/6M/EUR/10Y,0.0002 +2024-03-05,BASIS_SWAP/BASIS_SPREAD/3M/6M/EUR/12Y,0.00003 +2024-03-05,BASIS_SWAP/BASIS_SPREAD/3M/6M/EUR/15Y,-0.0002 +2024-03-05,BASIS_SWAP/BASIS_SPREAD/3M/6M/EUR/20Y,-0.0005 +2024-03-05,BASIS_SWAP/BASIS_SPREAD/3M/6M/EUR/25Y,-0.00062 +2024-03-05,BASIS_SWAP/BASIS_SPREAD/3M/6M/EUR/2Y,0.00085 +2024-03-05,BASIS_SWAP/BASIS_SPREAD/3M/6M/EUR/30Y,-0.0007 +2024-03-05,BASIS_SWAP/BASIS_SPREAD/3M/6M/EUR/3Y,0.00079 +2024-03-05,BASIS_SWAP/BASIS_SPREAD/3M/6M/EUR/40Y,-0.0009 +2024-03-05,BASIS_SWAP/BASIS_SPREAD/3M/6M/EUR/4Y,0.00072 +2024-03-05,BASIS_SWAP/BASIS_SPREAD/3M/6M/EUR/50Y,-0.00105 +2024-03-05,BASIS_SWAP/BASIS_SPREAD/3M/6M/EUR/5Y,0.00064 +2024-03-05,BASIS_SWAP/BASIS_SPREAD/3M/6M/EUR/60Y,-0.00108 +2024-03-05,BASIS_SWAP/BASIS_SPREAD/3M/6M/EUR/6Y,0.00056 +2024-03-05,BASIS_SWAP/BASIS_SPREAD/3M/6M/EUR/7Y,0.00048 +2024-03-05,BASIS_SWAP/BASIS_SPREAD/3M/6M/EUR/8Y,0.0004 +2024-03-05,BASIS_SWAP/BASIS_SPREAD/3M/6M/EUR/9Y,0.0003 +2024-03-05,MM/RATE/EUR/2D/3M,0.04 +2024-03-05,MM_FUTURE/PRICE/EUR/2024-04/XICE:FEI/3M,95.31 +2024-03-05,MM_FUTURE/PRICE/EUR/2024-05/XICE:FEI/3M,96.25 +2024-03-05,MM_FUTURE/PRICE/EUR/2024-06/XICE:FEI/3M,96.29 +2024-03-05,MM_FUTURE/PRICE/EUR/2024-07/XICE:FEI/3M,96.42 +2024-03-05,MM_FUTURE/PRICE/EUR/2024-08/XICE:FEI/3M,97.53 +2024-03-05,MM_FUTURE/PRICE/EUR/2024-09/XICE:FEI/3M,97.68 +2024-03-05,MM_FUTURE/PRICE/EUR/2024-12/XICE:FEI/3M,97.3 +2024-03-05,MM_FUTURE/PRICE/EUR/2025-03/XICE:FEI/3M,96.81 +2024-03-05,MM_FUTURE/PRICE/EUR/2025-06/XICE:FEI/3M,98.03 +2024-03-05,MM_FUTURE/PRICE/EUR/2025-09/XICE:FEI/3M,97.04 +2024-03-05,OI_FUTURE/PRICE/USD/2024-04/XCME:SRA/3M,95.23 +2024-03-05,OI_FUTURE/PRICE/USD/2024-05/XCME:SRA/3M,93.86 +2024-03-05,OI_FUTURE/PRICE/USD/2024-06/XCME:SRA/3M,95.33 +2024-03-05,OI_FUTURE/PRICE/USD/2024-07/XCME:SRA/3M,93.94 +2024-03-05,OI_FUTURE/PRICE/USD/2024-08/XCME:SRA/3M,94.56 +2024-03-05,OI_FUTURE/PRICE/USD/2024-09/XCME:SRA/3M,95.6 +2024-03-05,OI_FUTURE/PRICE/USD/2024-10/XCME:SRA/3M,94.58 +2024-03-05,OI_FUTURE/PRICE/USD/2024-11/XCME:SRA/3M,94.28 +2024-03-05,OI_FUTURE/PRICE/USD/2024-12/XCME:SRA/3M,94.65 +2024-03-05,OI_FUTURE/PRICE/USD/2025-03/XCME:SRA/3M,96.5 +2024-03-05,OI_FUTURE/PRICE/USD/2025-06/XCME:SRA/3M,95.02 +2024-03-05,OI_FUTURE/PRICE/USD/2025-09/XCME:SRA/3M,96.6 +2024-03-05,IR_SWAP/RATE/EUR/2D/3M/10Y,0.03 +2024-03-05,IR_SWAP/RATE/EUR/2D/3M/12Y,0.03 +2024-03-05,IR_SWAP/RATE/EUR/2D/3M/15Y,0.03 +2024-03-05,IR_SWAP/RATE/EUR/2D/3M/20Y,0.03 +2024-03-05,IR_SWAP/RATE/EUR/2D/3M/25Y,0.03 +2024-03-05,IR_SWAP/RATE/EUR/2D/3M/2Y,0.03 +2024-03-05,IR_SWAP/RATE/EUR/2D/3M/30Y,0.02 +2024-03-05,IR_SWAP/RATE/EUR/2D/3M/3Y,0.03 +2024-03-05,IR_SWAP/RATE/EUR/2D/3M/40Y,0.02 +2024-03-05,IR_SWAP/RATE/EUR/2D/3M/4Y,0.03 +2024-03-05,IR_SWAP/RATE/EUR/2D/3M/50Y,0.02 +2024-03-05,IR_SWAP/RATE/EUR/2D/3M/5Y,0.03 +2024-03-05,IR_SWAP/RATE/EUR/2D/3M/60Y,0.02 +2024-03-05,IR_SWAP/RATE/EUR/2D/3M/6Y,0.03 +2024-03-05,IR_SWAP/RATE/EUR/2D/3M/7Y,0.03 +2024-03-05,IR_SWAP/RATE/EUR/2D/3M/8Y,0.03 +2024-03-05,IR_SWAP/RATE/EUR/2D/3M/9Y,0.03 +2024-03-05,ZC_INFLATIONSWAP/RATE/EUHICPXT/10Y,0.01984317 +2024-03-05,ZC_INFLATIONSWAP/RATE/EUHICPXT/12Y,0.02019488 +2024-03-05,ZC_INFLATIONSWAP/RATE/EUHICPXT/15Y,0.02060033 +2024-03-05,ZC_INFLATIONSWAP/RATE/EUHICPXT/1Y,0.02195007 +2024-03-05,ZC_INFLATIONSWAP/RATE/EUHICPXT/20Y,0.02126171 +2024-03-05,ZC_INFLATIONSWAP/RATE/EUHICPXT/25Y,0.02182012 +2024-03-05,ZC_INFLATIONSWAP/RATE/EUHICPXT/2Y,0.02013430 +2024-03-05,ZC_INFLATIONSWAP/RATE/EUHICPXT/30Y,0.02220907 +2024-03-05,ZC_INFLATIONSWAP/RATE/EUHICPXT/35Y,0.02255919 +2024-03-05,ZC_INFLATIONSWAP/RATE/EUHICPXT/3Y,0.01962276 +2024-03-05,ZC_INFLATIONSWAP/RATE/EUHICPXT/40Y,0.02318439 +2024-03-05,ZC_INFLATIONSWAP/RATE/EUHICPXT/45Y,0.02362066 +2024-03-05,ZC_INFLATIONSWAP/RATE/EUHICPXT/4Y,0.01931579 +2024-03-05,ZC_INFLATIONSWAP/RATE/EUHICPXT/50Y,0.02413343 +2024-03-05,ZC_INFLATIONSWAP/RATE/EUHICPXT/5Y,0.01925836 +2024-03-05,ZC_INFLATIONSWAP/RATE/EUHICPXT/6Y,0.01938726 +2024-03-05,ZC_INFLATIONSWAP/RATE/EUHICPXT/7Y,0.01958277 +2024-03-05,ZC_INFLATIONSWAP/RATE/EUHICPXT/8Y,0.01973091 +2024-03-05,ZC_INFLATIONSWAP/RATE/EUHICPXT/9Y,0.01975486 +2024-03-05,EQUITY/PRICE/RIC:.SPX/USD,6082.97246883 +2024-03-05,EQUITY/PRICE/RIC:.STOXX50/EUR,4662.44403643 +2024-03-05,EQUITY_FWD/PRICE/RIC:.SPX/USD/1080D,6740.01708904 +2024-03-05,EQUITY_FWD/PRICE/RIC:.SPX/USD/120D,6151.32084033 +2024-03-05,EQUITY_FWD/PRICE/RIC:.SPX/USD/14D,6074.30623424 +2024-03-05,EQUITY_FWD/PRICE/RIC:.SPX/USD/150D,6184.86929616 +2024-03-05,EQUITY_FWD/PRICE/RIC:.SPX/USD/180D,6164.48338064 +2024-03-05,EQUITY_FWD/PRICE/RIC:.SPX/USD/21D,6079.22445552 +2024-03-05,EQUITY_FWD/PRICE/RIC:.SPX/USD/270D,6240.23324663 +2024-03-05,EQUITY_FWD/PRICE/RIC:.SPX/USD/30D,6102.98679037 +2024-03-05,EQUITY_FWD/PRICE/RIC:.SPX/USD/360D,6297.66612054 +2024-03-05,EQUITY_FWD/PRICE/RIC:.SPX/USD/60D,6069.86392566 +2024-03-05,EQUITY_FWD/PRICE/RIC:.SPX/USD/720D,6528.14213714 +2024-03-05,EQUITY_FWD/PRICE/RIC:.SPX/USD/7D,6066.03636276 +2024-03-05,EQUITY_FWD/PRICE/RIC:.SPX/USD/90D,6104.36640965 +2024-03-05,SEASONALITY/RATE/MULT/EUHICPXT/APR,1.00528739 +2024-03-05,SEASONALITY/RATE/MULT/EUHICPXT/AUG,1.00211507 +2024-03-05,SEASONALITY/RATE/MULT/EUHICPXT/DEC,0.99718925 +2024-03-05,SEASONALITY/RATE/MULT/EUHICPXT/FEB,0.98922387 +2024-03-05,SEASONALITY/RATE/MULT/EUHICPXT/JAN,0.98610447 +2024-03-05,SEASONALITY/RATE/MULT/EUHICPXT/JUL,0.99752192 +2024-03-05,SEASONALITY/RATE/MULT/EUHICPXT/JUN,1.00811576 +2024-03-05,SEASONALITY/RATE/MULT/EUHICPXT/MAR,1.00441990 +2024-03-05,SEASONALITY/RATE/MULT/EUHICPXT/MAY,1.00745949 +2024-03-05,SEASONALITY/RATE/MULT/EUHICPXT/NOV,0.99835510 +2024-03-05,SEASONALITY/RATE/MULT/EUHICPXT/OCT,1.00059361 +2024-03-05,SEASONALITY/RATE/MULT/EUHICPXT/SEP,1.00118437 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-03-16/4075/C,596.48356355 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-03-16/4075/P,1.10459328 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-03-16/4100/C,572.63795944 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-03-16/4100/P,1.20437051 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-03-16/4125/C,548.92304776 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-03-16/4125/P,1.30225859 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-03-16/4150/C,521.16111485 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-03-16/4150/P,1.40536293 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-03-16/4175/C,499.15688349 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-03-16/4175/P,1.50158177 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-03-16/4200/C,470.72974012 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-03-16/4200/P,1.59361211 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-03-16/4225/C,446.06986284 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-03-16/4225/P,1.79879553 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-03-16/4250/C,424.13611270 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-03-16/4250/P,1.99030062 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-03-16/4275/C,397.48434201 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-03-16/4275/P,2.19752007 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-03-16/4300/C,374.38279415 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-03-16/4300/P,2.40666773 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-03-16/4325/C,346.98703564 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-03-16/4325/P,2.69151399 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-03-16/4350/C,325.42579461 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-03-16/4350/P,3.01375166 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-03-16/4375/C,299.86645271 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-03-16/4375/P,3.40588954 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-03-16/4400/C,273.80636780 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-03-16/4400/P,4.00995540 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-03-16/4425/C,251.80019043 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-03-16/4425/P,4.58447502 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-03-16/4450/C,227.40402223 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-03-16/4450/P,5.41855932 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-03-16/4475/C,201.80717340 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-03-16/4475/P,6.48866539 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-03-16/4500/C,178.15159301 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-03-16/4500/P,7.78018912 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-03-16/4525/C,155.76266798 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-03-16/4525/P,9.57191373 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-03-16/4550/C,133.47421567 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-03-16/4550/P,11.89818358 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-03-16/4575/C,111.22110144 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-03-16/4575/P,15.01251531 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-03-16/4600/C,90.10971794 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-03-16/4600/P,19.03507674 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-03-16/4625/C,70.40959596 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-03-16/4625/P,24.71752951 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-03-16/4650/C,53.12541631 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-03-16/4650/P,31.75700916 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-03-16/4675/C,37.54283744 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-03-16/4675/P,41.39795233 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-03-16/4700/C,24.62519465 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-03-16/4700/P,53.70918132 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-03-16/4725/C,15.14545514 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-03-16/4725/P,68.95045593 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-03-16/4750/C,8.60287603 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-03-16/4750/P,87.22552100 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-03-16/4775/C,4.38866574 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-03-16/4775/P,107.81154538 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-03-16/4800/C,2.09325321 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-03-16/4800/P,131.17084539 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-03-16/4825/C,0.99757390 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-03-16/4825/P,154.38087488 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-04-13/4050/C,626.96894228 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-04-13/4050/P,5.18586500 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-04-13/4075/C,599.64995898 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-04-13/4075/P,5.48802752 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-04-13/4100/C,575.89713315 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-04-13/4100/P,5.92585079 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-04-13/4125/C,553.44687577 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-04-13/4125/P,6.38007554 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-04-13/4150/C,526.06598906 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-04-13/4150/P,6.92385564 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-04-13/4175/C,502.34034362 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-04-13/4175/P,7.39195692 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-04-13/4200/C,479.46434099 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-04-13/4200/P,8.10029505 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-04-13/4225/C,455.49829086 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-04-13/4225/P,8.82445172 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-04-13/4250/C,428.12954723 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-04-13/4250/P,9.66998778 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-04-13/4275/C,404.87584927 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-04-13/4275/P,10.65294024 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-04-13/4300/C,380.54262063 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-04-13/4300/P,11.66370071 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-04-13/4325/C,359.48581562 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-04-13/4325/P,12.91166422 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-04-13/4350/C,333.55342066 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-04-13/4350/P,14.41581568 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-04-13/4375/C,310.75522556 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-04-13/4375/P,16.02326495 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-04-13/4400/C,288.09386089 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-04-13/4400/P,18.00415583 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-04-13/4425/C,265.49778927 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-04-13/4425/P,20.10541189 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-04-13/4450/C,242.91299080 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-04-13/4450/P,22.79753826 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-04-13/4475/C,220.58091423 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-04-13/4475/P,25.76212031 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-04-13/4500/C,200.25443817 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-04-13/4500/P,29.36900313 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-04-13/4525/C,179.61004769 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-04-13/4525/P,33.38811345 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-04-13/4550/C,158.78466045 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-04-13/4550/P,38.11409330 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-04-13/4575/C,138.99785698 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-04-13/4575/P,43.93025010 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-04-13/4600/C,120.90406009 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-04-13/4600/P,50.39604006 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-04-13/4625/C,104.06472120 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-04-13/4625/P,57.76241045 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-04-13/4650/C,87.42969136 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-04-13/4650/P,66.54147835 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-04-13/4675/C,72.42249847 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-04-13/4675/P,76.19796823 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-04-13/4700/C,58.68943975 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-04-13/4700/P,87.53814951 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-04-13/4725/C,46.76798355 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-04-13/4725/P,100.69175642 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-04-13/4750/C,36.68192634 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-04-13/4750/P,115.30709300 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-04-13/4775/C,27.95105522 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-04-13/4775/P,131.33389671 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-04-13/4800/C,20.91095885 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-04-13/4800/P,149.63096439 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-04-13/4825/C,15.31325713 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-04-13/4825/P,168.29557962 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-05-10/4300/C,400.85046307 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-05-10/4300/P,21.05535641 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-05-10/4325/C,377.78665531 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-05-10/4325/P,23.11324210 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-05-10/4350/C,356.18908386 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-05-10/4350/P,25.15473079 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-05-10/4375/C,334.24169697 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-05-10/4375/P,27.53135416 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-05-10/4400/C,309.55184209 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-05-10/4400/P,30.16017415 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-05-10/4425/C,289.75414222 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-05-10/4425/P,33.35577124 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-05-10/4450/C,267.64130430 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-05-10/4450/P,36.87966761 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-05-10/4475/C,247.57884570 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-05-10/4475/P,40.79060413 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-05-10/4500/C,225.75504016 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-05-10/4500/P,45.18722482 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-05-10/4525/C,206.41799581 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-05-10/4525/P,49.69038442 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-05-10/4550/C,186.65672086 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-05-10/4550/P,55.30932363 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-05-10/4575/C,167.83590852 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-05-10/4575/P,61.67095246 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-05-10/4600/C,149.39924934 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-05-10/4600/P,68.63279029 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-05-10/4625/C,132.65062871 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-05-10/4625/P,76.28151628 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-05-10/4650/C,116.21403480 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-05-10/4650/P,84.74422388 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-05-10/4675/C,101.06142602 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-05-10/4675/P,93.99002049 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-05-10/4700/C,86.38994585 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-05-10/4700/P,104.52659669 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-05-10/4725/C,73.88536739 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-05-10/4725/P,116.22439606 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-05-10/4750/C,61.85743697 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-05-10/4750/P,130.31891221 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-05-10/4775/C,51.43458211 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-05-10/4775/P,144.15466249 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-05-10/4800/C,42.13268574 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-05-10/4800/P,160.53824406 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-05-10/4825/C,34.43075201 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-05-10/4825/P,176.56294694 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-07-13/2900/C,1720.40098386 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-07-13/2900/P,4.08385793 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-07-13/3000/C,1627.45115834 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-07-13/3000/P,4.71927717 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-07-13/3100/C,1529.63242474 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-07-13/3100/P,5.37461161 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-07-13/3200/C,1435.13128137 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-07-13/3200/P,6.22591482 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-07-13/3300/C,1329.53463865 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-07-13/3300/P,7.10046758 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-07-13/3400/C,1230.66549877 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-07-13/3400/P,8.18201478 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-07-13/3500/C,1133.67381635 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-07-13/3500/P,9.50266025 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-07-13/3600/C,1032.69257734 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-07-13/3600/P,11.14459783 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-07-13/3700/C,942.27625256 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-07-13/3700/P,13.32993698 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-07-13/3800/C,844.50950218 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-07-13/3800/P,15.99029682 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-07-13/3900/C,747.47065592 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-07-13/3900/P,19.48903838 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-07-13/4000/C,652.21790089 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-07-13/4000/P,24.31066751 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-07-13/4050/C,609.13752417 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-07-13/4050/P,27.10127470 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-07-13/4100/C,562.65091880 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-07-13/4100/P,30.46792600 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-07-13/4150/C,515.45768291 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-07-13/4150/P,34.70567347 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-07-13/4200/C,470.06147855 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-07-13/4200/P,39.47109304 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-07-13/4250/C,427.95628119 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-07-13/4250/P,44.75882865 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-07-13/4300/C,382.67093553 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-07-13/4300/P,51.42793803 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-07-13/4350/C,340.59922242 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-07-13/4350/P,58.75126839 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-07-13/4400/C,301.14764971 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-07-13/4400/P,67.95151430 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-07-13/4450/C,263.64113450 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-07-13/4450/P,78.79079596 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-07-13/4500/C,225.07081978 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-07-13/4500/P,91.39695123 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-07-13/4550/C,190.88011116 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-07-13/4550/P,105.66449927 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-07-13/4600/C,158.40185205 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-07-13/4600/P,122.43583663 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-07-13/4650/C,128.23082903 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-07-13/4650/P,142.94951374 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-07-13/4700/C,101.62102908 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-07-13/4700/P,165.24210084 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-07-13/4750/C,79.37893902 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-07-13/4750/P,193.75518261 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-07-13/4800/C,60.21763448 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-07-13/4800/P,222.56321095 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-07-13/4850/C,44.92863880 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-07-13/4850/P,257.35206649 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-07-13/4900/C,32.56991662 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-07-13/4900/P,294.37581696 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-07-13/5000/C,16.26861923 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-07-13/5000/P,377.33612070 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-10-12/4050/C,644.47197618 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-10-12/4050/P,50.45642242 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-10-12/4100/C,596.95620969 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-10-12/4100/P,55.54198473 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-10-12/4150/C,552.90323048 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-10-12/4150/P,60.74508213 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-10-12/4200/C,510.21389956 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-10-12/4200/P,66.82632433 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-10-12/4250/C,469.63353125 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-10-12/4250/P,73.73978152 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-10-12/4300/C,426.49802734 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-10-12/4300/P,82.66110795 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-10-12/4350/C,387.29721221 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-10-12/4350/P,92.21166094 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-10-12/4400/C,348.72977143 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-10-12/4400/P,102.90679821 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-10-12/4450/C,310.99761629 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-10-12/4450/P,115.28762273 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-10-12/4500/C,277.45950051 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-10-12/4500/P,128.35814983 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-10-12/4550/C,243.03131796 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-10-12/4550/P,144.16894008 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-10-12/4600/C,210.63150831 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-10-12/4600/P,162.77631174 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-10-12/4650/C,182.48158047 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-10-12/4650/P,183.33281489 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-10-12/4700/C,155.99495221 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-10-12/4700/P,205.09003973 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-10-12/4750/C,131.02861492 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-10-12/4750/P,231.13431195 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-10-12/4800/C,108.59551253 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-10-12/4800/P,258.28666734 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-10-12/4850/C,89.84914428 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2024-10-12/4850/P,287.93990515 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-01-11/2600/C,2035.52409086 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-01-11/2600/P,10.93979652 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-01-11/2700/C,1935.24455878 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-01-11/2700/P,12.08911311 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-01-11/2800/C,1840.30161594 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-01-11/2800/P,13.56201069 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-01-11/2900/C,1738.86089628 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-01-11/2900/P,14.97723340 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-01-11/3000/C,1653.24535969 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-01-11/3000/P,16.74956649 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-01-11/3100/C,1544.93488614 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-01-11/3100/P,18.72390032 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-01-11/3200/C,1460.07624702 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-01-11/3200/P,21.24138878 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-01-11/3300/C,1362.53328210 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-01-11/3300/P,23.96105442 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-01-11/3400/C,1269.70084793 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-01-11/3400/P,27.22896064 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-01-11/3500/C,1168.95873822 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-01-11/3500/P,31.00365062 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-01-11/3600/C,1077.11586316 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-01-11/3600/P,35.84717144 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-01-11/3700/C,982.09934140 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-01-11/3700/P,41.20000169 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-01-11/3800/C,896.03422510 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-01-11/3800/P,48.36626029 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-01-11/3900/C,801.08212360 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-01-11/3900/P,56.41483512 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-01-11/4000/C,714.05000808 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-01-11/4000/P,66.82234460 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-01-11/4050/C,672.42366466 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-01-11/4050/P,72.83979008 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-01-11/4100/C,631.72255136 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-01-11/4100/P,79.26220458 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-01-11/4150/C,589.08014819 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-01-11/4150/P,86.53628841 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-01-11/4200/C,547.85833984 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-01-11/4200/P,94.63782104 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-01-11/4250/C,504.88313375 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-01-11/4250/P,103.37979827 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-01-11/4300/C,469.22593173 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-01-11/4300/P,112.80868661 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-01-11/4350/C,429.07007375 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-01-11/4350/P,123.83278553 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-01-11/4400/C,391.02390304 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-01-11/4400/P,135.47619814 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-01-11/4450/C,355.90157372 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-01-11/4450/P,148.15957554 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-01-11/4500/C,323.28530119 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-01-11/4500/P,162.67339272 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-01-11/4550/C,290.62232232 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-01-11/4550/P,178.64864428 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-01-11/4600/C,256.36259782 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-01-11/4600/P,196.75347354 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-01-11/4650/C,226.68987042 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-01-11/4650/P,217.16844473 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-01-11/4700/C,200.19370950 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-01-11/4700/P,237.43581678 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-01-11/4750/C,174.35695616 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-01-11/4750/P,260.49896730 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-01-11/4800/C,150.41304765 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-01-11/4800/P,285.73735790 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-01-11/4850/C,129.49356189 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-01-11/4850/P,313.12496203 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-01-11/4900/C,110.41026232 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-01-11/4900/P,344.29116827 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-01-11/5000/C,77.75472964 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-01-11/5000/P,409.16800667 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-07-12/3400/C,1232.18093055 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-07-12/3400/P,49.52911915 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-07-12/3500/C,1133.21080961 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-07-12/3500/P,55.96203519 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-07-12/3600/C,1045.80414708 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-07-12/3600/P,63.94565791 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-07-12/3700/C,963.07582859 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-07-12/3700/P,73.09833492 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-07-12/3800/C,874.10969592 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-07-12/3800/P,83.39293672 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-07-12/3900/C,787.38983822 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-07-12/3900/P,96.81667647 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-07-12/4000/C,709.42466931 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-07-12/4000/P,110.89755886 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-07-12/4100/C,627.37281688 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-07-12/4100/P,128.97414488 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-07-12/4200/C,548.39265107 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-07-12/4200/P,148.82633224 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-07-12/4300/C,475.98632037 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-07-12/4300/P,172.32134434 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-07-12/4400/C,406.11281004 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-07-12/4400/P,201.15708415 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-07-12/4500/C,340.91792702 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-07-12/4500/P,234.20110207 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-07-12/4600/C,283.23486404 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-07-12/4600/P,271.98636578 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-07-12/4700/C,229.40318503 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-07-12/4700/P,315.25516295 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-07-12/4800/C,182.11002835 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-07-12/4800/P,367.15631033 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-07-12/4900/C,143.26658715 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-07-12/4900/P,424.90470462 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-07-12/5000/C,109.70478334 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-07-12/5000/P,487.91817882 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-07-12/5100/C,83.41047597 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2025-07-12/5100/P,559.35583284 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2026-01-10/2900/C,1690.26706075 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2026-01-10/2900/P,39.01207583 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2026-01-10/3000/C,1601.65193232 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2026-01-10/3000/P,43.60577363 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2026-01-10/3100/C,1509.63611323 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2026-01-10/3100/P,48.66920797 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2026-01-10/3200/C,1412.31557896 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2026-01-10/3200/P,54.04593479 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2026-01-10/3300/C,1327.08008917 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2026-01-10/3300/P,61.04315529 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2026-01-10/3400/C,1245.11404514 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2026-01-10/3400/P,67.96076800 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2026-01-10/3500/C,1152.58584056 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2026-01-10/3500/P,76.77995843 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2026-01-10/3600/C,1061.53963400 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2026-01-10/3600/P,86.45247370 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2026-01-10/3700/C,978.87500083 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2026-01-10/3700/P,97.70192796 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2026-01-10/3800/C,901.61217560 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2026-01-10/3800/P,111.41992723 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2026-01-10/3900/C,814.71138571 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2026-01-10/3900/P,125.72401577 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2026-01-10/4000/C,735.79707191 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2026-01-10/4000/P,143.86216682 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2026-01-10/4100/C,658.25371784 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2026-01-10/4100/P,163.89456254 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2026-01-10/4200/C,587.04304945 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2026-01-10/4200/P,185.49273980 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2026-01-10/4300/C,516.90175181 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2026-01-10/4300/P,213.18971696 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2026-01-10/4400/C,451.41131964 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2026-01-10/4400/P,240.99589873 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2026-01-10/4500/C,387.87005204 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2026-01-10/4500/P,274.44601137 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2026-01-10/4600/C,328.65375430 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2026-01-10/4600/P,313.64030197 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2026-01-10/4700/C,277.89683033 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2026-01-10/4700/P,356.71343528 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2026-01-10/4800/C,230.09621078 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2026-01-10/4800/P,404.82672123 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2026-01-10/4900/C,187.06450937 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2026-01-10/4900/P,461.13932331 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2026-01-10/5000/C,151.95095938 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2026-01-10/5000/P,519.02316743 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2026-01-10/5100/C,121.87792265 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2026-01-10/5100/P,586.43716038 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2026-07-11/3800/C,872.97042063 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2026-07-11/3800/P,146.91657830 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2026-07-11/3900/C,797.48506359 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2026-07-11/3900/P,165.14474597 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2026-07-11/4000/C,719.88920215 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2026-07-11/4000/P,186.71952026 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2026-07-11/4100/C,644.88730410 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2026-07-11/4100/P,209.34307943 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2026-07-11/4200/C,579.17376605 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2026-07-11/4200/P,236.40071886 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2026-07-11/4300/C,513.68689414 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2026-07-11/4300/P,264.37326212 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2026-07-11/4400/C,447.96819932 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2026-07-11/4400/P,298.44485943 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2026-07-11/4500/C,389.54460552 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2026-07-11/4500/P,332.71899194 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2026-07-11/4600/C,335.19286396 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2026-07-11/4600/P,375.94314404 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2026-07-11/4700/C,287.29585739 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2026-07-11/4700/P,422.21549883 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2026-07-11/4800/C,241.79798685 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2026-07-11/4800/P,469.32247016 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2026-07-11/4900/C,203.53920590 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2026-07-11/4900/P,525.56126530 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2026-07-11/5000/C,167.75371403 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2026-07-11/5000/P,588.46764789 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2026-07-11/5100/C,138.06672595 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2026-07-11/5100/P,653.17466621 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2027-01-09/3300/C,1294.20050705 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2027-01-09/3300/P,100.53773581 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2027-01-09/3400/C,1209.39594149 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2027-01-09/3400/P,111.88928950 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2027-01-09/3500/C,1128.46848128 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2027-01-09/3500/P,124.78575560 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2027-01-09/3600/C,1050.12858263 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2027-01-09/3600/P,138.81495951 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2027-01-09/3700/C,968.98875149 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2027-01-09/3700/P,153.84243453 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2027-01-09/3800/C,888.94057618 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2027-01-09/3800/P,172.22557056 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2027-01-09/3900/C,812.78834716 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2027-01-09/3900/P,191.42010365 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2027-01-09/4000/C,744.15051657 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2027-01-09/4000/P,213.69884154 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2027-01-09/4100/C,672.55987506 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2027-01-09/4100/P,238.77154345 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2027-01-09/4200/C,609.06878768 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2027-01-09/4200/P,266.03233935 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2027-01-09/4300/C,540.04903682 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2027-01-09/4300/P,296.13701416 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2027-01-09/4400/C,479.47621931 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2027-01-09/4400/P,330.32485222 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2027-01-09/4500/C,422.14887776 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2027-01-09/4500/P,366.05937126 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2027-01-09/4600/C,372.11702313 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2027-01-09/4600/P,407.49699782 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2027-01-09/4700/C,319.98573938 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2027-01-09/4700/P,452.67644311 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2027-01-09/4800/C,275.19651421 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2027-01-09/4800/P,498.52349744 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2027-01-09/4900/C,236.74816951 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2027-01-09/4900/P,552.18724415 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2027-01-09/5000/C,199.81128917 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2027-01-09/5000/P,616.44918670 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2027-01-09/5100/C,168.30574760 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2027-01-09/5100/P,676.33377453 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2028-01-08/3600/C,1050.21635048 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2028-01-08/3600/P,186.92522262 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2028-01-08/3700/C,974.01092595 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2028-01-08/3700/P,205.43447000 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2028-01-08/3800/C,905.53648788 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2028-01-08/3800/P,225.47943629 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2028-01-08/3900/C,835.36958107 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2028-01-08/3900/P,249.19649367 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2028-01-08/4000/C,764.84507102 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2028-01-08/4000/P,274.04091583 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2028-01-08/4100/C,698.50285410 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2028-01-08/4100/P,298.82516204 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2028-01-08/4200/C,636.93272336 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2028-01-08/4200/P,328.39082664 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2028-01-08/4300/C,579.00636975 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2028-01-08/4300/P,362.87028320 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2028-01-08/4400/C,521.23391499 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2028-01-08/4400/P,397.59368890 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2028-01-08/4500/C,463.39577379 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2028-01-08/4500/P,435.10930578 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2028-01-08/4600/C,413.96987786 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2028-01-08/4600/P,478.03811005 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2028-01-08/4700/C,365.96401851 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2028-01-08/4700/P,519.98687015 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2028-01-08/4800/C,322.39668087 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2028-01-08/4800/P,569.72081074 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2028-01-08/4900/C,283.91518617 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2028-01-08/4900/P,620.35276081 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2028-01-08/5000/C,247.68814878 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2028-01-08/5000/P,677.97746689 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2028-01-08/5100/C,216.18930959 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2028-01-08/5100/P,740.37186462 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2029-01-13/3900/C,935.76070252 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2029-01-13/3900/P,265.77847696 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2029-01-13/4000/C,867.32311819 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2029-01-13/4000/P,291.85924981 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2029-01-13/4100/C,805.27548443 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2029-01-13/4100/P,316.46979953 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2029-01-13/4200/C,743.58599646 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2029-01-13/4200/P,345.38147310 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2029-01-13/4300/C,678.67164710 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2029-01-13/4300/P,375.36805282 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2029-01-13/4400/C,620.31546169 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2029-01-13/4400/P,409.93624116 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2029-01-13/4500/C,569.21860264 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2029-01-13/4500/P,443.84887625 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2029-01-13/4600/C,518.27604336 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2029-01-13/4600/P,482.74722592 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2029-01-13/4700/C,466.17823359 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2029-01-13/4700/P,525.45678958 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2029-01-13/4800/C,418.63282772 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2029-01-13/4800/P,569.36320965 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2029-01-13/4900/C,378.70019795 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2029-01-13/4900/P,616.88077650 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2029-01-13/5000/C,338.69767858 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2029-01-13/5000/P,667.10148579 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2029-01-13/5100/C,302.73407740 +2024-03-05,EQUITY_OPTION/PRICE/RIC:.STOXX50/EUR/2029-01-13/5100/P,717.20671080 \ No newline at end of file diff --git a/EconomicStressAgentORE/oredata/Input/parstresstest.xml b/EconomicStressAgentORE/oredata/Input/parstresstest.xml new file mode 100644 index 0000000..ae02ff4 --- /dev/null +++ b/EconomicStressAgentORE/oredata/Input/parstresstest.xml @@ -0,0 +1,791 @@ + + true + + + false + false + false + + + + + + + + + + Absolute + + 0.01 + 0.01 + 0.01 + 0.01 + 0.01 + 0.01 + 0.01 + 0.01 + 0.01 + + 1Y, 2Y, 3Y, 4Y, 5Y, 6Y, 7Y, 8Y, 9Y + + + + + + + + + + + + false + false + false + + + + + + + + + + Absolute + + 0.01 + 0.01 + 0.01 + 0.01 + 0.01 + 0.01 + 0.01 + 0.01 + 0.01 + + 1Y, 2Y, 3Y, 4Y, 5Y, 6Y, 7Y, 8Y, 9Y + + + + + + + + + + + + false + false + + + + + Absolute + + + 0.00, + 0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00 + + 1D, + 1W,2W,3W,1M,2M,3M,4M,5M,6M,7M,8M,9M,10M,11M,1Y,15M,18M,21M,2Y,3Y,4Y,5Y,6Y,7Y,8Y,9Y,10Y,11Y,12Y,15Y,20Y,25Y,30Y,40Y,50Y,60Y + + + Absolute + + 0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01 + + + 1D,2D,3D,1W,2W,3W,1M,2M,3M,4M,5M,6M,7M,8M,9M,10M,11M,1Y,15M,18M,21M,2Y,3Y,4Y,5Y,6Y,7Y,8Y,9Y,10Y,12Y,15Y,20Y,25Y,30Y,40Y,50Y + + + + + + Absolute + + 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, + 0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00 + + 1D, + 1W,2W,3W,1M,2M,3M,4M,5M,6M,7M,8M,9M,10M,11M,1Y,15M,18M,21M,2Y,3Y,4Y,5Y,6Y,7Y,8Y,9Y,10Y,11Y,12Y,15Y,20Y,25Y,30Y,40Y,50Y,60Y + + + + Absolute + 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, + 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 + 1D, 1W, 2W, 1M, 2M, 3M, 4M, 5M, 6M, 7M, 8M, 9M, 10M, 11M, 1Y, 15M, 18M, 21M, + 2Y, 3Y, 5Y, 10Y, 15Y, 20Y, 30Y + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + false + false + + + + + + + + + + + + + + + Absolute + 0.01, 0.01, 0.01, 0.01, 0.01 + 1Y, 2Y, 3Y, 5Y, 10Y + + + + + + + + + + + + + + + + + + + Absolute + 0.01, 0.01, 0.01, 0.01, 0.01 + 1Y, 2Y, 3Y, 5Y, 10Y + + + + + + + Absolute + + + 0.01, + 0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01 + + 1D, + 1W,2W,3W,1M,2M,3M,4M,5M,6M,7M,8M,9M,10M,11M,1Y,15M,18M,21M,2Y,3Y,4Y,5Y,6Y,7Y,8Y,9Y,10Y,11Y,12Y,15Y,20Y,25Y,30Y,40Y,50Y,60Y + + + Absolute + + 0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00 + + 1D,2D,3D,1W,2W,3W,1M,2M,3M,4M,5M,6M,7M,8M,9M,10M,11M,1Y,15M,18M,21M,2Y,3Y,4Y,5Y,6Y,7Y,8Y,9Y,10Y,12Y,15Y,20Y,25Y,30Y,40Y,50Y + + + + + + Absolute + + 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, + 0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01 + + 1D, + 1W,2W,3W,1M,2M,3M,4M,5M,6M,7M,8M,9M,10M,11M,1Y,15M,18M,21M,2Y,3Y,4Y,5Y,6Y,7Y,8Y,9Y,10Y,11Y,12Y,15Y,20Y,25Y,30Y,40Y,50Y,60Y + + + + Absolute + 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, + 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 + 1D, 1W, 2W, 1M, 2M, 3M, 4M, 5M, 6M, 7M, 8M, 9M, 10M, 11M, 1Y, 15M, 18M, 21M, + 2Y, 3Y, 5Y, 10Y, 15Y, 20Y, 30Y + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + true + true + + + + + Absolute + + + 0.00, + 0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00 + + 1D, + 1W,2W,3W,1M,2M,3M,4M,5M,6M,7M,8M,9M,10M,11M,1Y,15M,18M,21M,2Y,3Y,4Y,5Y,6Y,7Y,8Y,9Y,10Y,11Y,12Y,15Y,20Y,25Y,30Y,40Y,50Y,60Y + + + Absolute + + 0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00 + + + 1D,2D,3D,1W,2W,3W,1M,2M,3M,4M,5M,6M,7M,8M,9M,10M,11M,1Y,15M,18M,21M,2Y,3Y,4Y,5Y,6Y,7Y,8Y,9Y,10Y,12Y,15Y,20Y,25Y,30Y,40Y,50Y + + + + + + Absolute + + 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, + 0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00 + + 1D, + 1W,2W,3W,1M,2M,3M,4M,5M,6M,7M,8M,9M,10M,11M,1Y,15M,18M,21M,2Y,3Y,4Y,5Y,6Y,7Y,8Y,9Y,10Y,11Y,12Y,15Y,20Y,25Y,30Y,40Y,50Y,60Y + + + + Absolute + 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, + 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01 + 6M, + 7M,8M,9M,10M,11M,12M,15M,18M,2Y,3Y,4Y,5Y,6Y,7Y,8Y,9Y,10Y,12Y,15Y,20Y,25Y,30Y,40Y,50Y,60Y + + + + Absolute + 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, + 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 + 1D, 1W, 2W, 1M, 2M, 3M, 4M, 5M, 6M, 7M, 8M, 9M, 10M, 11M, 1Y, 15M, 18M, 21M, + 2Y, 3Y, 5Y, 10Y, 15Y, 20Y, 30Y + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + false + false + false + + + + + Absolute + + + 0.00, + 0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00 + + 1D, + 1W,2W,3W,1M,2M,3M,4M,5M,6M,7M,8M,9M,10M,11M,1Y,15M,18M,21M,2Y,3Y,4Y,5Y,6Y,7Y,8Y,9Y,10Y,11Y,12Y,15Y,20Y,25Y,30Y,40Y,50Y,60Y + + + Absolute + + 0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00 + + + 1D,2D,3D,1W,2W,3W,1M,2M,3M,4M,5M,6M,7M,8M,9M,10M,11M,1Y,15M,18M,21M,2Y,3Y,4Y,5Y,6Y,7Y,8Y,9Y,10Y,12Y,15Y,20Y,25Y,30Y,40Y,50Y + + + + + + Absolute + + 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, + 0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00 + + 1D, + 1W,2W,3W,1M,2M,3M,4M,5M,6M,7M,8M,9M,10M,11M,1Y,15M,18M,21M,2Y,3Y,4Y,5Y,6Y,7Y,8Y,9Y,10Y,11Y,12Y,15Y,20Y,25Y,30Y,40Y,50Y,60Y + + + + Absolute + 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, + 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01 + 6M, + 7M,8M,9M,10M,11M,12M,15M,18M,2Y,3Y,4Y,5Y,6Y,7Y,8Y,9Y,10Y,12Y,15Y,20Y,25Y,30Y,40Y,50Y,60Y + + + + Absolute + 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, + 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 + 1D, 1W, 2W, 1M, 2M, 3M, 4M, 5M, 6M, 7M, 8M, 9M, 10M, 11M, 1Y, 15M, 18M, 21M, + 2Y, 3Y, 5Y, 10Y, 15Y, 20Y, 30Y + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + true + false + + + + + Absolute + + + 0.00, + 0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00 + + 1D, + 1W,2W,3W,1M,2M,3M,4M,5M,6M,7M,8M,9M,10M,11M,1Y,15M,18M,21M,2Y,3Y,4Y,5Y,6Y,7Y,8Y,9Y,10Y,11Y,12Y,15Y,20Y,25Y,30Y,40Y,50Y,60Y + + + Absolute + + 0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00 + + + 1D,2D,3D,1W,2W,3W,1M,2M,3M,4M,5M,6M,7M,8M,9M,10M,11M,1Y,15M,18M,21M,2Y,3Y,4Y,5Y,6Y,7Y,8Y,9Y,10Y,12Y,15Y,20Y,25Y,30Y,40Y,50Y + + + + + + Absolute + + 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, + 0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00 + + 1D, + 1W,2W,3W,1M,2M,3M,4M,5M,6M,7M,8M,9M,10M,11M,1Y,15M,18M,21M,2Y,3Y,4Y,5Y,6Y,7Y,8Y,9Y,10Y,11Y,12Y,15Y,20Y,25Y,30Y,40Y,50Y,60Y + + + + Absolute + 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, + 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01 + 6M, + 7M,8M,9M,10M,11M,12M,15M,18M,2Y,3Y,4Y,5Y,6Y,7Y,8Y,9Y,10Y,12Y,15Y,20Y,25Y,30Y,40Y,50Y,60Y + + + + Absolute + 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, + 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 + 1D, 1W, 2W, 1M, 2M, 3M, 4M, 5M, 6M, 7M, 8M, 9M, 10M, 11M, 1Y, 15M, 18M, 21M, + 2Y, 3Y, 5Y, 10Y, 15Y, 20Y, 30Y + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + false + false + + + + + Absolute + + + 0.00, + 0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00 + + 1D, + 1W,2W,3W,1M,2M,3M,4M,5M,6M,7M,8M,9M,10M,11M,1Y,15M,18M,21M,2Y,3Y,4Y,5Y,6Y,7Y,8Y,9Y,10Y,11Y,12Y,15Y,20Y,25Y,30Y,40Y,50Y,60Y + + + Absolute + + 0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01 + + + 1D,2D,3D,1W,2W,3W,1M,2M,3M,4M,5M,6M,7M,8M,9M,10M,11M,1Y,15M,18M,21M,2Y,3Y,4Y,5Y,6Y,7Y,8Y,9Y,10Y,12Y,15Y,20Y,25Y,30Y,40Y,50Y + + + + + + Absolute + + 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, + 0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00 + + 1D, + 1W,2W,3W,1M,2M,3M,4M,5M,6M,7M,8M,9M,10M,11M,1Y,15M,18M,21M,2Y,3Y,4Y,5Y,6Y,7Y,8Y,9Y,10Y,11Y,12Y,15Y,20Y,25Y,30Y,40Y,50Y,60Y + + + + Absolute + 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, + 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 + 1D, 1W, 2W, 1M, 2M, 3M, 4M, 5M, 6M, 7M, 8M, 9M, 10M, 11M, 1Y, 15M, 18M, 21M, + 2Y, 3Y, 5Y, 10Y, 15Y, 20Y, 30Y + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + false + false + false + + + + + Absolute + + + 0.01, + 0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01 + + 1D, + 1W,2W,3W,1M,2M,3M,4M,5M,6M,7M,8M,9M,10M,11M,1Y,15M,18M,21M,2Y,3Y,4Y,5Y,6Y,7Y,8Y,9Y,10Y,11Y,12Y,15Y,20Y,25Y,30Y,40Y,50Y,60Y + + + Absolute + + 0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00 + + 1D,2D,3D,1W,2W,3W,1M,2M,3M,4M,5M,6M,7M,8M,9M,10M,11M,1Y,15M,18M,21M,2Y,3Y,4Y,5Y,6Y,7Y,8Y,9Y,10Y,12Y,15Y,20Y,25Y,30Y,40Y,50Y + + + + + + Absolute + + 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, + 0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01 + + 1D, + 1W,2W,3W,1M,2M,3M,4M,5M,6M,7M,8M,9M,10M,11M,1Y,15M,18M,21M,2Y,3Y,4Y,5Y,6Y,7Y,8Y,9Y,10Y,11Y,12Y,15Y,20Y,25Y,30Y,40Y,50Y,60Y + + + + Absolute + 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, + 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 + 1D, 1W, 2W, 1M, 2M, 3M, 4M, 5M, 6M, 7M, 8M, 9M, 10M, 11M, 1Y, 15M, 18M, 21M, + 2Y, 3Y, 5Y, 10Y, 15Y, 20Y, 30Y + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + true + true + + + + + Absolute + + + 0.01, + 0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01 + + 1D, + 1W,2W,3W,1M,2M,3M,4M,5M,6M,7M,8M,9M,10M,11M,1Y,15M,18M,21M,2Y,3Y,4Y,5Y,6Y,7Y,8Y,9Y,10Y,11Y,12Y,15Y,20Y,25Y,30Y,40Y,50Y,60Y + + + Absolute + + 0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00 + + 1D,2D,3D,1W,2W,3W,1M,2M,3M,4M,5M,6M,7M,8M,9M,10M,11M,1Y,15M,18M,21M,2Y,3Y,4Y,5Y,6Y,7Y,8Y,9Y,10Y,12Y,15Y,20Y,25Y,30Y,40Y,50Y + + + + + + Absolute + + 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, + 0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01 + + 1D, + 1W,2W,3W,1M,2M,3M,4M,5M,6M,7M,8M,9M,10M,11M,1Y,15M,18M,21M,2Y,3Y,4Y,5Y,6Y,7Y,8Y,9Y,10Y,11Y,12Y,15Y,20Y,25Y,30Y,40Y,50Y,60Y + + + + Absolute + 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, + 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 + 1D, 1W, 2W, 1M, 2M, 3M, 4M, 5M, 6M, 7M, 8M, 9M, 10M, 11M, 1Y, 15M, 18M, 21M, + 2Y, 3Y, 5Y, 10Y, 15Y, 20Y, 30Y + + + + + + + + Relative + 0.01 + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/EconomicStressAgentORE/oredata/Input/portfolio.xml b/EconomicStressAgentORE/oredata/Input/portfolio.xml new file mode 100644 index 0000000..6cb58a4 --- /dev/null +++ b/EconomicStressAgentORE/oredata/Input/portfolio.xml @@ -0,0 +1,264 @@ + + + + Swap + + A + + + + + + Floating + true + USD + + 102120250.0 + + EUR + 95000000.0 + FX-ECB-EUR-USD + 2 + + + true + true + + + ACT/360 + ModifiedFollowing + 2 + + USD-SOFR + + 0.0 + + false + 2 + + + + 2024-01-02 + 2026-01-02 + 3M + US,TARGET + ModifiedFollowing + ModifiedFollowing + Forward + + + + + + + + Floating + false + EUR + + 95000000.0 + + true + true + + + ACT/360 + ModifiedFollowing + 2 + + EUR-ESTER + + -0.00255 + + false + 2 + + + + 2024-01-02 + 2026-01-02 + 3M + US,TARGET + ModifiedFollowing + ModifiedFollowing + Forward + + + + + + + + + + + Swap + + CPTY_A + CPTY_A + + + + + Floating + false + EUR + + 100000000 + + A360 + MF + + EUR-EURIBOR-6M + 2 + + 0.0 + + false + + + + 20240301 + 20260301 + 3M + TARGET + MF + MF + Backward + false + + + + + + + + + CreditDefaultSwap + + CP + NS + + + + Underlying1 + Y + Y + + Fixed + true + USD + + 100000000 + + A360 + F + + + 0.05 + + + + + 2021-09-21 + 2026-12-20 + 3M + WeekendsOnly + F + U + CDS2015 + + + + + + + + + + ContractForDifference + + CPTY + NS + + party + 2024-03-05 + + + + + + EquityPosition + + 1000 + + Equity + .STOXX50 + 1.0 + RIC + + + + + + false + EUR + + + + + 2021-05-29 + + 2025-02-11 + + + + 3399.20 + EUR + + + + + ContractForDifference + + CPTY + NS + + party + 2024-03-05 + + + + + + EquityPosition + + 1000 + + Equity + .SPX + 1.0 + RIC + + + + + + false + USD + + + + + 2021-05-29 + + 2025-02-11 + + + + 6000.20 + USD + + + + \ No newline at end of file diff --git a/EconomicStressAgentORE/oredata/Input/pricingengine.xml b/EconomicStressAgentORE/oredata/Input/pricingengine.xml new file mode 100644 index 0000000..61f9129 --- /dev/null +++ b/EconomicStressAgentORE/oredata/Input/pricingengine.xml @@ -0,0 +1,1006 @@ + + + + DiscountedCashflows + + DiscountingBondTRSEngine + + 6M + IR_Analytical + + + + DiscountedCashflows + + DiscountingForwardBondEngine + + 3M + IR_Analytical + + + + DiscountedCashflows + + DiscountingSwapEngine + + IR_Analytical + + + + DiscountedCashflows + + DiscountingCrossCurrencySwapEngine + + FX_Analytical + + + + DiscountedCashflows + + DiscountingFxForwardEngine + + FX_Analytical + + + + GarmanKohlhagen + + AnalyticEuropeanEngine + + FX_Analytical + + + + GarmanKohlhagen + + FdBlackScholesVanillaEngine + + Douglas + 100 + 100 + 0 + true + FX_Analytical + + + + BlackBachelier + + + BlackBachelierSwaptionEngine + + IR_Analytical + + + + LGM + + Bootstrap + CoterminalDealStrike + 400,3M + 0.0 + HullWhite + 0.01 + Hagan + + 0.5 + 0.20 + + Grid + + 5.0 + 30 + 5.0 + 30 + IR_FD + + + + IborCapModel + + IborCapEngine + + IR_Analytical + + + + YYCapModel + + YYCapEngine + + IR_Analytical + + + + CpiCapModel + + CpiCapEngine + + true + IR_Analytical + + + + BlackOrBachelier + + BlackIborCouponPricer + + + Black76 + + 1.0 + IR_Analytical + + + + BlackOrBachelier + + BlackOvernightIndexedCouponPricer + + IR_Analytical + + + + BlackOrBachelier + + BlackAverageONIndexedCouponPricer + + IR_Analytical + + + + Black + + BlackAnalytic + + true + IR_Analytical + + + + Black + + BlackAnalytic + + true + IR_Analytical + + + + BlackOrBachelier + + BlackAverageBMACouponPricer + + IR_Analytical + + + + DiscountedCashflows + + DiscountingEquityForwardEngine + + EQ_Analytical + + + + BlackScholesMerton + + AnalyticEuropeanEngine + + EQ_Analytical + + + + BlackScholes + + GENERIC + + AnalyticEuropeanEngine + + EQ_Analytical + + + + BlackScholesMerton + + FdBlackScholesVanillaEngine + + Douglas + 100 + 100 + 0 + true + EQ_FD + + + + BlackScholesMerton + + AnalyticOutperformanceOptionEngine + + 32 + EQ_Analytical + + + + DiscountedCashflows + + 50Y + + DiscountingRiskyBondEngine + + 6M + IR_Analytical + + + + DiscountedCashflows + + MidPointCdsEngine + + IR_Analytical + + + + + LinearTSR + + LinearTSRPricer + + 0.0 + + RateBound + + 0.0001 + 2.0000 + + -2.0000 + 2.0000 + + 0.01 + + 0.0000001 + + 3.0 + IR_Semianalytical + + + + LinearTSR + + LinearTSRPricer + + 0.0 + 0.0001 + 2.0000 + -2.0000 + 2.0000 + false + IR_Semianalytical + + + + + BrigoMercurio + + 0.8 + 0.75 + 0.72 + 0.7 + + Analytic + + 16 + IR_Semianalytical + + + + DiscountedCashflows + + DiscountingCommodityForwardEngine + + COMM_Analytical + + + + DiscountedCashflows + + CommoditySwapEngine + + COMM_Analytical + + + + Black + + AnalyticalApproximation + + 2.05 + COMM_Analytical + + + + BlackScholes + + AnalyticEuropeanEngine + + COMM_Analytical + + + + BlackScholes + + CommoditySpreadOptionEngine + + 2.05 + COMM_Analytical + + + + BlackScholes + + AnalyticEuropeanForwardEngine + + COMM_Analytical + + + + Black + + AnalyticalApproximation + + 0 + COMM_Analytical + + + + DiscountedCashflows + + MidPointIndexCdsEngine + + Underlying + + IR_Analytical + + + + Black + + BlackIndexCdsOptionEngine + + + + Underlying + IR_Semianalytical + + + + + LGM + + Bootstrap + CoterminalDealStrike + 400,3M + 0.0 + HullWhite + 0.01 + HullWhite + 0.02 + + Grid + + Automatic + 20.0 + 5.0 + 30 + 5.0 + 30 + IR_Semianalytical + + + + LGM-FlexiSwap + + 0.0 + 2.0 + Bootstrap + CoterminalDealStrike + 400,3M + 0.0 + HullWhite + 0.01 + HullWhite + 0.02 + + Grid + + Automatic + 20.0 + 5.0 + 30 + 5.0 + 30 + IR_Semianalytical + + + + SensiTrade + + SensiTradeEngine + + 1Y,2Y + 0.01 + 6M,1Y,2Y,3Y,5Y,10Y,15Y,20Y,30Y + SensiTrade + + + + GaussCopula + + 0.0 + -5.0 + 5.0 + 64 + + Y + + + + Markit2020 + + 0.35,0.3,0.35 + + Bucketing + + 124 + + DeltaWeighted + + + + N + + N + + N + 3Y,5Y + CR_Semianalytical + + + + + BrigoMercurio + + GENERIC + + MC + + 10000 + 42 + Y + Spectral + IR_MC + + + + BlackScholesMerton + + false + + ReplicatingVarianceSwapEngine + + Segment + PriceThreshold + 1E-5 + 1000 + 1000 + 1E-10 + 500 + 0.1 + -5.0 + 5.0 + FX_Semianalytical + + + + BlackScholesMerton + + ReplicatingVarianceSwapEngine + + Segment + PriceThreshold + 1E-5 + 1000 + 1000 + 1E-10 + 500 + 0.1 + -5.0 + 5.0 + EQ_Semianalytical + + + + BlackScholesMerton + + ReplicatingVarianceSwapEngine + + Segment + PriceThreshold + 1E-5 + 1000 + 1000 + 1E-10 + 500 + 0.1 + -5.0 + 5.0 + COMM_Semianalytical + + + + GarmanKohlhagen + + AnalyticEuropeanEngine + + FX_Analytical + + + + GarmanKohlhagen + + AnalyticCashSettledEuropeanEngine + + FX_Analytical + + + + GarmanKohlhagen + + AnalyticBarrierEngine + + FX_Analytical + + + + GarmanKohlhagen + + FdBlackScholesBarrierEngine + + Douglas + 100 + 100 + 0 + FX_Analytical + + + + GarmanKohlhagen + + AnalyticDoubleBarrierEngine + + FX_Analytical + + + + GarmanKohlhagen + + AnalyticDoubleBarrierBinaryEngine + + FX_Analytical + + + + + GarmanKohlhagen + + AnalyticDigitalAmericanEngine + + FX_Analytical + + + + DiscountedCashflows + + DiscountingCommodityForwardEngine + + COMM_Analytical + + + + DefaultableEquityJumpDiffusion + + 0.0 + 1.0 + true + false + false + true + true + true + + FD + + true + 6M,1Y,2Y,3Y,4Y,5Y,7Y,10Y,15Y,20Y,25Y,30Y,40Y,50Y + 24 + 400 + 1E-5 + 1.5 + Alternating + 24 + 100 + 1E-4 + 1.5 + 0.5,0.55,0.6,0.65,0.7,0.75,0.8,0.85,0.9,0.95,1.0,1.05,1.1,1.15,1.2,1.25,1.5,1.75,2.0 + EQ_FD + + + + Black + + 0.0 + true + + Analytic + + false + 400 + 20 + IR_Semianalytical + + + + Black + + Analytic + + false + 400 + 20 + FX_Semianalytical + + + + LGM + + Bootstrap + CoterminalDealStrike + 400,3M + 0.0 + HullWhite + 0.01 + Hagan + 0.5 + 0.02 + + Grid + + 5.0 + 30 + 5.0 + 30 + 400 + 20 + IR_FD + + + + LGM + + Bootstrap + CoterminalATM + 400,3M + 0.0 + HullWhite + 0.01 + Hagan + 0.5 + 0.02 + 3M + + Grid + + 5.0 + 30 + 5.0 + 30 + 24 + IR_FD + + + + Generic + + + USD + false + 3M(1W),1Y(1M),5Y(3M),10Y(1Y),50Y(5Y) + 0.0 + 0.0 + 0.0 + 0.0 + 0.0 + 0.0 + 0.0 + 0.0 + true + true + 400,3M + Deal + BlackScholes + DK + + GaussianCam + GaussianCam + GaussianCam + GaussianCam + GaussianCam + GaussianCam + + Generic + + + MC + 10000 + 200 + 1E-4 + 1.5 + 0.1 + 9999 + true + 2 + 24 + false + 999.9 + + 6 + 6 + 6 + FD + FD + FD + true + true + true + true + true + true + true + true + true + true + true + true + true + true + EQ_MC + FX_MC + COMM_MC + EQ_MC + FX_MC + COMM_MC + EQ_FD + FX_FD + COMM_FD + EQ_MC + FX_MC + COMM_MC + EQ_MC + FX_MC + COMM_MC + HYBRID_MC + EQ_MC + FX_MC + COMM_MC + HYBRID_MC + EQ_MC + FX_MC + COMM_MC + HYBRID_MC + IR_MC + IR_MC + HYBRID_MC + HYBRID_MC + HYBRID_MC + HYBRID_MC + + + + BlackScholesMerton + + AnalyticCashSettledEuropeanEngine + + EQ_Analytical + + + + BlackScholes + + AnalyticCashSettledEuropeanEngine + + COMM_Analytical + + + + BlackScholes + + FdBlackScholesVanillaEngine + + Douglas + 100 + 100 + 0 + true + COMM_FD + + + + GarmanKohlhagen + + AnalyticCashSettledEuropeanEngine + + FX_Analytical + + + + Accrual + + true + + AccrualRepoEngine + + IR_Analytical + + + + BlackScholes + + MCScript + + MC + 10000 + 6 + 24 + false + false + EQ_MC + + + + Black + + BlackBondOptionEngine + + 6M + IR_Analytical + + + + BlackScholesMerton + + AnalyticBarrierEngine + + EQ_Analytical + + + + BlackScholesMerton + + AnalyticDoubleBarrierEngine + + EQ_Analytical + + + + BlackScholesMerton + + AnalyticEuropeanEngine + + EQ_Analytical + + + + BlackScholesMerton + + AnalyticDigitalAmericanEngine + + EQ_Analytical + + + + BlackScholes + + Intrinsic + + 24 + EQ_FD + + + + BlackScholes + + AnalyticEuropeanEngine + + EQ_Analytical + + + + ScriptedTrade + + ScriptedTrade + + EQ_MC + + + + ScriptedTrade + + ScriptedTrade + + EQ_MC + + + + ScriptedTrade + + ScriptedTrade + + FX_MC + + + + ScriptedTrade + + ScriptedTrade + + FX_MC + + + + OneFactorCopula + + MonteCarloCBOEngine + + 1000 + 20 + 42 + + 0.2 + CR_MC + + + + Black + + MonteCarlo + + 0 + 10000 + 42 + COMM_MC + + + + + true + false + USD + GENERIC + PM:XAUUSD + PM:XAGUSD + PM:XPTUSD + PM:XPDUSD + ^RED:[0-9A-Z]{9}$ + + diff --git a/EconomicStressAgentORE/oredata/Input/sensitivity.xml b/EconomicStressAgentORE/oredata/Input/sensitivity.xml new file mode 100644 index 0000000..33e1b81 --- /dev/null +++ b/EconomicStressAgentORE/oredata/Input/sensitivity.xml @@ -0,0 +1,158 @@ + + + + Absolute + 0.0001 + Forward + + 1D, + 1W,2W,3W,1M,2M,3M,4M,5M,6M,7M,8M,9M,10M,11M,1Y,15M,18M,21M,2Y,3Y,4Y,5Y,6Y,7Y,8Y,9Y,10Y,11Y,12Y,15Y,20Y,25Y,30Y,40Y,50Y,60Y + + + DEP, + OIS,OIS,OIS,OIS,OIS,OIS,OIS,OIS,OIS,OIS,OIS,OIS,OIS,OIS,OIS,OIS,OIS,OIS,OIS,OIS,OIS,OIS,OIS,OIS,OIS,OIS,OIS,OIS,OIS,OIS,OIS,OIS,OIS,OIS,OIS,OIS + true + + EUR-ON-DEPOSIT-ESTER + EUR-ESTER-OIS + + + + + Absolute + 0.0001 + Forward + + 1D,2D,3D,1W,2W,3W,1M,2M,3M,4M,5M,6M,7M,8M,9M,10M,11M,1Y,15M,18M,21M,2Y,3Y,4Y,5Y,6Y,7Y,8Y,9Y,10Y,12Y,15Y,20Y,25Y,30Y,40Y,50Y + + + FXF,FXF,FXF,FXF,FXF,FXF,FXF,FXF,FXF,FXF,FXF,FXF,FXF,FXF,FXF,FXF,FXF,FXF,FXF,FXF,FXF,XBS,XBS,XBS,XBS,XBS,XBS,XBS,XBS,XBS,XBS,XBS,XBS,XBS,XBS,XBS,XBS + true + + EUR-USD-ON-XCCY-BASIS + USD-ON-SOFR-DEPOSIT + USD-SOFR-OIS + EUR-USD-FX + + + + + + + Absolute + 0.0001 + Forward + + 1D, + 1W,2W,3W,1M,2M,3M,4M,5M,6M,7M,8M,9M,10M,11M,1Y,15M,18M,21M,2Y,3Y,4Y,5Y,6Y,7Y,8Y,9Y,10Y,11Y,12Y,15Y,20Y,25Y,30Y,40Y,50Y,60Y + + + DEP, + OIS,OIS,OIS,OIS,OIS,OIS,OIS,OIS,OIS,OIS,OIS,OIS,OIS,OIS,OIS,OIS,OIS,OIS,OIS,OIS,OIS,OIS,OIS,OIS,OIS,OIS,OIS,OIS,OIS,OIS,OIS,OIS,OIS,OIS,OIS,OIS + true + + EUR-ON-DEPOSIT-ESTER + EUR-ESTER-OIS + + + + + Absolute + 0.0001 + Forward + 6M, 7M, 8M,9M,10M,11M,1Y,15M,18M, 2Y, 3Y, 4Y, 5Y, 6Y, 7Y, 8Y, 9Y, 10Y, 12Y, + 15Y, 20Y, 25Y, 30Y, 40Y, 50Y, 60Y + + DEP, FRA, FRA,FRA,FRA,FRA,FRA,FRA,FRA, IRS, IRS, IRS, IRS, IRS, IRS, + IRS, IRS, IRS, IRS, IRS, IRS, IRS, IRS, IRS, IRS, IRS + false + EUR-ESTER + + EUR-DEPOSIT + EUR-6M-FRA + EUR-EURIBOR-6M-SWAP + + + + + Absolute + 0.0001 + Forward + 1D, 1W, 2W, 1M, 2M, 3M, 4M, 5M, 6M, 7M, 8M, 9M, 10M, 11M, 1Y,15M, 18M, 21M, + 2Y, 3Y, 5Y, 10Y, 15Y, 20Y, 30Y + + DEP, OIS, OIS, OIS, OIS, OIS, OIS, OIS, OIS, OIS, OIS, OIS, OIS, OIS, + OIS, OIS, OIS, OIS, OIS, OIS, OIS, OIS, OIS, OIS, OIS + true + + USD-ON-SOFR-DEPOSIT + USD-SOFR-OIS + + + + + + + + Relative + 0.01 + + + + + USD + Absolute + 0.0001 + Forward + 1Y, 2Y, 3Y, 5Y, 10Y + + CDS, CDS, CDS, CDS, CDS + false + + CDS-STANDARD-CONVENTIONS + + + + + + + Absolute + 0.0001 + 1Y, 2Y, 3Y, 4Y, 5Y, 6Y, 7Y, 8Y, 9Y + -0.01, 0, 0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.1 + EUR-EURIBOR-6M + + CapFloor + EUR-ESTER + + + + + + Absolute + 0.0001 + 6M,1Y,2Y,3Y,5Y,7Y,10Y,15Y,20Y,30Y + + ZIS,ZIS,ZIS,ZIS,ZIS,ZIS,ZIS,ZIS,ZIS,ZIS + false + + EUHICPXT_INFLATIONSWAP + + + + + + + Relative + 0.01 + Forward + + + Relative + 0.01 + Forward + + + false + true + \ No newline at end of file diff --git a/EconomicStressAgentORE/oredata/Input/simulation.xml b/EconomicStressAgentORE/oredata/Input/simulation.xml new file mode 100644 index 0000000..a6ee241 --- /dev/null +++ b/EconomicStressAgentORE/oredata/Input/simulation.xml @@ -0,0 +1,79 @@ + + + EUR + + EUR + USD + + + + 1D, 1W, 1M, 1Y, 10Y + LogLinear + FlatZero + + + + + USDEUR + + + + EUR-ESTER + EUR-EURIBOR-3M + EUR-EURIBOR-6M + USD-SOFR + + + true + ForwardVariance + + EUR-EURIBOR-6M + + 1Y, 2Y, 3Y, 4Y, 5Y, 6Y, 7Y, 8Y, 9Y, 10Y, 12Y, 15Y, 20Y, + 25Y, 30Y + + -0.015, -0.01, 0, 0.0005 + true + false + StickyStrike + StickyStrike + + + + Underlying1 + + 1Y, 2Y, 3Y, 5Y, 10Y + true + false + + TARGET + + FlatZero + + + + + EUHICPXT + + 6M,1Y,2Y,3Y,5Y,7Y,10Y,15Y,20Y + + + + true + + RIC:.SPX + RIC:.STOXX50 + + 2W, 1M, 3M, 6M, 1Y, 2Y, 3Y, 5Y, 10Y, 15Y, 20Y, 30Y + + + 0 + + + 0 + + + \ No newline at end of file diff --git a/EconomicStressAgentORE/oredata/Input/todaysmarket.xml b/EconomicStressAgentORE/oredata/Input/todaysmarket.xml new file mode 100644 index 0000000..986e4f9 --- /dev/null +++ b/EconomicStressAgentORE/oredata/Input/todaysmarket.xml @@ -0,0 +1,80 @@ + + + default + inccy + default + default + default + default + default + default + default + default + default + default + default + default + default + default + default + default + default + default + default + default + + + default + default + default + default + default + default + default + default + default + default + default + default + default + default + default + default + default + default + default + default + default + default + + + Yield/EUR/EUR-ESTER + Yield/USD/USD-IN-EUR + + + Yield/EUR/EUR-ESTER + Yield/USD/USD-SOFR + + + Yield/EUR/EUR-ESTER + Yield/EUR/EUR-EURIBOR-6M + Yield/EUR/EUR-EURIBOR-3M + Yield/USD/USD-SOFR + + + FX/EUR/USD + + + CapFloorVolatility/EUR/EUR + + + Default/USD/Underlying1 + + + Equity/USD/RIC:.SPX + Equity/EUR/RIC:.STOXX50 + + + Inflation/EUHICPXT/EUHICPXT_ZC_Swaps + + \ No newline at end of file diff --git a/EconomicStressAgentORE/oredata/ore.xml b/EconomicStressAgentORE/oredata/ore.xml new file mode 100644 index 0000000..3810927 --- /dev/null +++ b/EconomicStressAgentORE/oredata/ore.xml @@ -0,0 +1,64 @@ + + + + 2024-03-05 + Input + Output + log.txt + 31 + marketdata.csv + fixings.csv + N + curveconfig.xml + conventions.xml + todaysmarket.xml + pricingengine.xml + portfolio.xml + None + + + inccy + default + default + default + default + + + + Y + EUR + npv.csv + + + Y + flows.csv + + + Y + simulation.xml + sensitivity.xml + pricingengine.xml + scenario.csv + sensitivity.csv + crossgamma.csv + parsensi.csv + 0.000001 + + + Y + default + 240,1M + curves.csv + + + Y + simulation.xml + parstresstest.xml + sensitivity.xml + pricingengine.xml + stresstest.csv + 0.000001 + zeroStressScenarioData.xml + + + \ No newline at end of file diff --git a/EconomicStressAgentORE/requirements.txt b/EconomicStressAgentORE/requirements.txt new file mode 100644 index 0000000..d0ab6b1 --- /dev/null +++ b/EconomicStressAgentORE/requirements.txt @@ -0,0 +1,5 @@ +openai>=1.0.0 +python-dotenv>=1.0.0 +pandas>=2.0.0 +click>=8.0.0 +open-source-risk-engine>=1.8 \ No newline at end of file diff --git a/EconomicStressAgentORE/scenario_analyzer.py b/EconomicStressAgentORE/scenario_analyzer.py new file mode 100644 index 0000000..c8e779a --- /dev/null +++ b/EconomicStressAgentORE/scenario_analyzer.py @@ -0,0 +1,166 @@ +""" +scenario_analyzer.py — Step 1: map a free-text economic scenario to concrete +market shifts using an LLM + an in-process historical knowledge base. +""" + +from __future__ import annotations + +import json +import re +from typing import Any + +from openai import OpenAI + +import config +from historical_scenarios import ScenarioKnowledgeBase + +# ── System prompt ───────────────────────────────────────────────────────────── +_SYSTEM_PROMPT = """\ +You are a quantitative risk analyst specialising in macro stress testing. + +You are given a knowledge base of historical economic crises and their +approximate market impacts, and a user-described economic scenario. + +Your task is to: +1. Identify which historical episodes best match the described scenario + (pick 1-3 episodes). +2. Derive a *weighted average* of the market shifts from those episodes that + best represents the described scenario. You may scale the shifts up or down + to reflect the described severity. +3. Return a JSON object (and nothing else) with this exact schema: + +{ + "matched_scenarios": ["", ...], + "reasoning": "", + "shifts": { + "rates": { + "": { "": , ... } + }, + "fx": { "": }, + "equity": { + "": + }, + "credit": { + "": { "": , ... } + } + } +} + +Keys: +- rates: keyed by ISO currency (EUR, USD, …). Values are absolute changes + in swap/yield rates in decimal (e.g. -0.015 = -150 bps, +0.010 = +100 bps). + Tenors: 1Y, 2Y, 3Y, 5Y, 10Y, 30Y (at minimum include 1Y, 2Y, 5Y, 10Y, 30Y). +- fx: keyed by pair (e.g. "EURUSD"). Value is the absolute change in the spot + rate (e.g. -0.08 means EUR falls 8 big figures vs USD). +- equity: keyed by Currency (e.g. "EUR", "USD") or sector override + (e.g. "Tech", "Index"). Values are relative (fractional) changes + (e.g. -0.25 = -25 %). Always include at least the currency-level keys. +- credit: keyed by Currency or sector (e.g. "EUR", "USD", + "SeniorUnsecured", "Sovereign"). Values are dicts of tenor → absolute + shift to hazard/CDS spread (positive = widening, e.g. 0.02 = +200 bps). + Tenors: 1Y, 2Y, 3Y, 5Y, 10Y. + +Return ONLY the JSON object — no markdown fences, no extra text. +""" + + +def _build_user_message( + scenario_description: str, + knowledge_base: ScenarioKnowledgeBase, +) -> str: + """Combine the historical knowledge base with the user's scenario.""" + kb = knowledge_base.get_scenarios_text() + return ( + f"## Historical Scenarios Knowledge Base\n\n{kb}\n\n" + f"## User-Described Scenario\n\n{scenario_description}\n\n" + "Analyse the described scenario and return the JSON object as instructed." + ) + + +def analyze( + scenario_description: str, + knowledge_base: ScenarioKnowledgeBase, +) -> dict[str, Any]: + """ + Analyse *scenario_description* and return a structured dict of market shifts. + + Returns + ------- + dict with keys: + matched_scenarios : list[str] + reasoning : str + shifts : dict (fx, equity, rates_eur, rates_usd) + """ + if not config.OPENAI_API_KEY: + raise EnvironmentError( + "OPENAI_API_KEY is not set. Please add it to your .env file." + ) + + client = OpenAI(api_key=config.OPENAI_API_KEY) + + response = client.chat.completions.create( + model=config.OPENAI_MODEL, + messages=[ + {"role": "system", "content": _SYSTEM_PROMPT}, + {"role": "user", "content": _build_user_message(scenario_description, knowledge_base)}, + ], + temperature=config.OPENAI_TEMPERATURE, + response_format={"type": "json_object"}, + ) + + raw = response.choices[0].message.content or "{}" + + # Strip accidental markdown fences if the model includes them + raw = re.sub(r"^```(?:json)?\s*", "", raw.strip()) + raw = re.sub(r"```\s*$", "", raw.strip()) + + result: dict[str, Any] = json.loads(raw) + _validate(result) + return result + + +def _validate(result: dict[str, Any]) -> None: + """Raise ValueError if the returned JSON is missing required keys.""" + required_top = {"matched_scenarios", "reasoning", "shifts"} + missing = required_top - result.keys() + if missing: + raise ValueError(f"LLM response missing keys: {missing}") + + shifts = result["shifts"] + required_shifts = {"rates", "fx", "equity", "credit"} + missing_shifts = required_shifts - shifts.keys() + if missing_shifts: + raise ValueError(f"shifts missing sub-keys: {missing_shifts}") + + +def format_shifts(result: dict[str, Any]) -> str: + """Return a human-readable string of the proposed shifts.""" + s = result["shifts"] + lines = [ + "Matched scenarios:", + *[f" • {name}" for name in result["matched_scenarios"]], + "", + f"Reasoning: {result['reasoning']}", + "", + "Proposed market shifts:", + ] + + # FX + for pair, v in s.get("fx", {}).items(): + lines.append(f" FX {pair}: {v:+.4f}") + + # Equity + for key, v in s.get("equity", {}).items(): + lines.append(f" Equity {key}: {v:+.1%}") + + # Rates + for ccy, tenors in s.get("rates", {}).items(): + parts = " ".join(f"{t} {v*10000:+.0f}bp" for t, v in tenors.items()) + lines.append(f" Rates {ccy}: {parts}") + + # Credit + for key, tenors in s.get("credit", {}).items(): + parts = " ".join(f"{t} {v*10000:+.0f}bp" for t, v in tenors.items()) + lines.append(f" Credit {key}: {parts}") + + return "\n".join(lines) diff --git a/EconomicStressAgentORE/stresstest_builder.py b/EconomicStressAgentORE/stresstest_builder.py new file mode 100644 index 0000000..bfdf745 --- /dev/null +++ b/EconomicStressAgentORE/stresstest_builder.py @@ -0,0 +1,371 @@ +""" +stresstest_builder.py — Step 2: convert structured market shifts into an +ORE-compatible par stress test XML file. + +This version is **market-driven**: it accepts a ``MarketStructure`` (from +``todaysmarket_analyzer.parse()``) and a sector mapping so that every curve +present in todaysmarket.xml is automatically stressed. +""" + +from __future__ import annotations + +from pathlib import Path +from typing import Any +from xml.dom import minidom +from xml.etree import ElementTree as ET + +import config +import ORE + +from todaysmarket_analyzer import ( + CurveInfo, + MarketStructure, + SectorEntry, + load_sector_mapping, + resolve_credit_shifts, + resolve_equity_shift, +) + +# ── Tenor helpers ───────────────────────────────────────────────────────────── + +def _tenor_to_year_fraction(tenor: str, today, day_counter) -> float: + """Convert an ORE tenor string to a year-fraction relative to *today*.""" + + return day_counter.yearFraction(today, today + ORE.Period(tenor.strip())) + + +def interpolate_shift( + tenors: list[str], scenario_shifts: dict[str, float] +) -> list[float]: + """ + Linear interpolation with flat extrapolation of scenario key-tenor + shifts onto an arbitrary ORE tenor grid, using ORE's own date/period + logic and ``LinearInterpolation``. + """ + if not scenario_shifts: + return [0.0] * len(tenors) + + today = ORE.Settings.instance().evaluationDate + dc = ORE.Actual365Fixed() + + # Build sorted anchor arrays from scenario shifts + anchors = sorted( + (_tenor_to_year_fraction(t, today, dc), v) + for t, v in scenario_shifts.items() + ) + xs = [a[0] for a in anchors] + ys = [a[1] for a in anchors] + + interp = ORE.LinearInterpolation(xs, ys) + + def _lookup(t_yf: float) -> float: + if t_yf <= xs[0]: + return ys[0] + if t_yf >= xs[-1]: + return ys[-1] + return interp(t_yf) + + return [ + _lookup(_tenor_to_year_fraction(t, today, dc)) + for t in tenors + ] + + +# ── XML helpers ─────────────────────────────────────────────────────────────── + +def _shifts_str(values: list[float]) -> str: + """Format a list of shift values as a comma-separated string.""" + return ", ".join(f"{v:.6f}" for v in values) + + +def _add_curve_element( + parent: ET.Element, + tag: str, + attr: dict[str, str], + tenors: list[str], + shifts: list[float], +) -> None: + """Append a or element with shifts.""" + el = ET.SubElement(parent, tag, attr) + ET.SubElement(el, "ShiftType").text = "Absolute" + ET.SubElement(el, "Shifts").text = _shifts_str(shifts) + ET.SubElement(el, "ShiftTenors").text = ", ".join(tenors) + + +def _prettify(element: ET.Element) -> str: + """Return a pretty-printed XML string (no blank lines).""" + rough = ET.tostring(element, encoding="unicode") + reparsed = minidom.parseString(rough) + xml = reparsed.toprettyxml(indent=" ", encoding=None) + # minidom inserts blank lines when the source already has whitespace nodes + return "\n".join(line for line in xml.splitlines() if line.strip()) + + +def _add_param(parent: ET.Element, name: str, value: str) -> ET.Element: + """Add a ``value`` child element.""" + p = ET.SubElement(parent, "Parameter", name=name) + p.text = value + return p + + +# ── Main builder ────────────────────────────────────────────────────────────── + +def _resolve_rate_shifts( + ccy: str, shifts: dict[str, Any] +) -> dict[str, float]: + """Return the rate tenor-shift dict for a currency (empty if missing).""" + rates: dict = shifts.get("rates", {}) + return rates.get(ccy, {}) + + +def build( + shifts: dict[str, Any], + market: MarketStructure | None = None, + sector_map: dict[tuple[str, str], SectorEntry] | None = None, + output_path: Path | None = None, + scenario_id: str = "agent_scenario", + scenario_label: str | None = None, +) -> Path: + """ + Build the ORE stress test XML from *shifts* (generic schema) and the + discovered *market* structure. + + Parameters + ---------- + shifts : generic schema ``{rates, fx, equity, credit}`` + market : MarketStructure — if None, parsed from todaysmarket.xml + sector_map : sector mapping — if None, loaded from config + output_path : where to write the XML + scenario_id : ``id`` attribute of the ```` element + scenario_label : optional human-readable label embedded as a comment + """ + from todaysmarket_analyzer import parse as tm_parse # local to avoid circular + + if market is None: + market = tm_parse() + if sector_map is None: + sector_map = load_sector_mapping() + if output_path is None: + output_path = config.AGENT_STRESS_XML + + output_path = Path(output_path) + output_path.parent.mkdir(parents=True, exist_ok=True) + + # Root + root = ET.Element("StressTesting") + ET.SubElement(root, "UseSpreadedTermStructures").text = "true" + + st = ET.SubElement(root, "StressTest", {"id": scenario_id}) + if scenario_label: + st.append(ET.Comment(f" {scenario_label} ")) + + par = ET.SubElement(st, "ParShifts") + ET.SubElement(par, "IRCurves").text = "false" + ET.SubElement(par, "SurvivalProbability").text = "false" + ET.SubElement(par, "CapFloorVolatilities").text = "false" + + # ── Discount curves ──────────────────────────────────────────────── + disc_el = ET.SubElement(st, "DiscountCurves") + for curve in market.discount_curves: + rate_shifts = _resolve_rate_shifts(curve.currency, shifts) + if not rate_shifts: + continue + tenors = config.STANDARD_RATE_TENORS + interp = interpolate_shift(tenors, rate_shifts) + _add_curve_element(disc_el, "DiscountCurve", + {"ccy": curve.currency}, tenors, interp) + + # ── Index curves ─────────────────────────────────────────────────── + idx_el = ET.SubElement(st, "IndexCurves") + for curve in market.index_curves: + rate_shifts = _resolve_rate_shifts(curve.currency, shifts) + if not rate_shifts: + continue + tenors = config.STANDARD_RATE_TENORS + interp = interpolate_shift(tenors, rate_shifts) + _add_curve_element(idx_el, "IndexCurve", + {"index": curve.name}, tenors, interp) + + # ── Yield curves ─────────────────────────────────────────────────── + yc_el = ET.SubElement(st, "YieldCurves") + for curve in market.yield_curves: + rate_shifts = _resolve_rate_shifts(curve.currency, shifts) + if not rate_shifts: + continue + tenors = config.STANDARD_RATE_TENORS + interp = interpolate_shift(tenors, rate_shifts) + _add_curve_element(yc_el, "YieldCurve", + {"name": curve.name}, tenors, interp) + + # ── FX spots ─────────────────────────────────────────────────────── + fx_el = ET.SubElement(st, "FxSpots") + fx_shifts: dict[str, float] = shifts.get("fx", {}) + for pair in market.fx_pairs: + foreign = pair[:3] + domestic = pair[3:] + # Try both conventions + raw_shift = fx_shifts.get(pair, fx_shifts.get(domestic + foreign, None)) + if raw_shift is None: + continue + # ORE uses inverted convention (USDEUR) + ore_pair = domestic + foreign + if pair == ore_pair: + relative_shift = raw_shift + else: + # EURUSD scenario → USDEUR in ORE: negate + relative_shift = -raw_shift + spot_el = ET.SubElement(fx_el, "FxSpot", {"ccypair": ore_pair}) + ET.SubElement(spot_el, "ShiftType").text = "Relative" + ET.SubElement(spot_el, "ShiftSize").text = f"{relative_shift:.6f}" + + # ── FxVolatilities (empty) ──────────────────────────────────────── + ET.SubElement(st, "FxVolatilities") + + # ── SwaptionVolatilities (empty) ────────────────────────────────── + ET.SubElement(st, "SwaptionVolatilities") + + # ── CapFloorVolatilities (empty) ────────────────────────────────── + ET.SubElement(st, "CapFloorVolatilities") + + # ── Equity spots ───────────────────────────────────────────────── + eq_el = ET.SubElement(st, "EquitySpots") + for curve in market.equity_curves: + rel_shift = resolve_equity_shift(curve, shifts, sector_map) + if rel_shift == 0.0: + continue + eq_spot = ET.SubElement(eq_el, "EquitySpot", {"equity": curve.name}) + ET.SubElement(eq_spot, "ShiftType").text = "Relative" + ET.SubElement(eq_spot, "ShiftSize").text = f"{rel_shift:.6f}" + + # ── EquityVolatilities (empty) ──────────────────────────────────── + ET.SubElement(st, "EquityVolatilities") + + # ── SecuritySpreads, RecoveryRates (empty) ──────────────────────── + ET.SubElement(st, "SecuritySpreads") + ET.SubElement(st, "RecoveryRates") + + # ── Survival probabilities ──────────────────────────────────────── + surv_el = ET.SubElement(st, "SurvivalProbabilities") + for curve in market.default_curves: + credit_tenor_shifts = resolve_credit_shifts(curve, shifts, sector_map) + if not credit_tenor_shifts: + continue + tenors = config.STANDARD_CREDIT_TENORS + interp = interpolate_shift(tenors, credit_tenor_shifts) + sp = ET.SubElement(surv_el, "SurvivalProbability", {"name": curve.name}) + ET.SubElement(sp, "ShiftType").text = "Absolute" + ET.SubElement(sp, "Shifts").text = _shifts_str(interp) + ET.SubElement(sp, "ShiftTenors").text = ", ".join(tenors) + + # ── Serialise ───────────────────────────────────────────────────── + xml_str = _prettify(root) + lines = xml_str.splitlines() + if lines and lines[0].startswith(" Path: + """ + Write a minimal ore_agent.xml that activates only the stress analytic and + points to the agent-generated stress test configuration. + + If *market* is provided, ``simulation_agent.xml`` and + ``sensitivity_agent.xml`` are generated from the market structure and + the stress analytic is pointed at them. This removes the dependency on + hand-maintained simulation.xml / sensitivity.xml files. + + Parameters + ---------- + base_ore_xml : source ore.xml to base settings on + (defaults to config.ORE_WORKSPACE / "ore.xml") + output_ore_xml : where to write the agent ore config + (defaults to config.AGENT_ORE_XML) + stress_config_file : filename (relative to Input/) of the stress XML + market : MarketStructure from todaysmarket_analyzer.parse(); + when provided, agent simulation & sensitivity XMLs + are auto-generated + + Returns + ------- + Path to the written file. + """ + from todaysmarket_analyzer import generate_simulation_xml, generate_sensitivity_xml + + if base_ore_xml is None: + base_ore_xml = config.ORE_WORKSPACE / "ore.xml" + if output_ore_xml is None: + output_ore_xml = config.AGENT_ORE_XML + + base_ore_xml = Path(base_ore_xml) + output_ore_xml = Path(output_ore_xml) + + # ── Generate simulation & sensitivity XMLs if market is available ── + sim_file = "simulation.xml" + sensi_file = "sensitivity.xml" + + if market is not None: + input_dir = output_ore_xml.parent / "Input" + sim_path = generate_simulation_xml(market, input_dir / "simulation_agent.xml") + sensi_path = generate_sensitivity_xml(market, input_dir / "sensitivity_agent.xml") + sim_file = sim_path.name + sensi_file = sensi_path.name + + tree = ET.parse(base_ore_xml) + root = tree.getroot() + + # Strip whitespace-only text/tail so _prettify produces clean output + for el in root.iter(): + if el.text and not el.text.strip(): + el.text = None + if el.tail and not el.tail.strip(): + el.tail = None + + # Disable every analytic except stress; update stress config file + analytics = root.find("Analytics") + if analytics is None: + analytics = ET.SubElement(root, "Analytics") + + has_stress = False + for analytic in analytics.findall("Analytic"): + atype = analytic.get("type", "") + if atype == "stress": + has_stress = True + for param in analytic.findall("Parameter"): + if param.get("name") == "stressConfigFile": + param.text = stress_config_file + if param.get("name") == "active": + param.text = "Y" + if param.get("name") == "marketConfigFile": + param.text = sim_file + if param.get("name") == "sensitivityConfigFile": + param.text = sensi_file + else: + for param in analytic.findall("Parameter"): + if param.get("name") == "active": + param.text = "N" + + # If no stress analytic exists in the source ore.xml, add one + if not has_stress: + stress_el = ET.SubElement(analytics, "Analytic", type="stress") + _add_param(stress_el, "active", "Y") + _add_param(stress_el, "marketConfigFile", sim_file) + _add_param(stress_el, "stressConfigFile", stress_config_file) + _add_param(stress_el, "sensitivityConfigFile", sensi_file) + _add_param(stress_el, "pricingEnginesFile", "pricingengine.xml") + _add_param(stress_el, "scenarioOutputFile", "stresstest.csv") + _add_param(stress_el, "outputThreshold", "0.000001") + + xml_str = _prettify(root) + lines = xml_str.splitlines() + if lines and lines[0].startswith("' + output_ore_xml.write_text("\n".join(lines), encoding="utf-8") + + return output_ore_xml diff --git a/EconomicStressAgentORE/test_integration.py b/EconomicStressAgentORE/test_integration.py new file mode 100644 index 0000000..3886556 --- /dev/null +++ b/EconomicStressAgentORE/test_integration.py @@ -0,0 +1,99 @@ +#!/usr/bin/env python3 +"""Quick integration test for the generic schema refactoring.""" + +import config +import todaysmarket_analyzer +import stresstest_builder +import ore_runner +from pathlib import Path +from historical_scenarios import ScenarioKnowledgeBase + +# 1. Test scenario loading +kb = ScenarioKnowledgeBase(config.DATA_DIR / "scenarios.json") +print(f"Loaded {len(kb)} scenarios") +print(f"First: {kb[0]['name']}") +print(f"Schema keys: {list(kb[0]['shifts'].keys())}") +print() + +# 2. Test market structure parsing +ms = todaysmarket_analyzer.parse() +print(todaysmarket_analyzer.format_market_structure(ms)) +print() + +# 3. Test sector mapping +sector_map = todaysmarket_analyzer.load_sector_mapping() +print(f"Sector map entries: {len(sector_map)}") +for k, v in sector_map.items(): + print(f" {k} -> {v}") +print() + +# 4. Test equity resolution with first scenario +shifts = kb[0]["shifts"] +for eq in ms.equity_curves: + s = todaysmarket_analyzer.resolve_equity_shift(eq, shifts, sector_map) + print(f"Equity {eq.name} ({eq.currency}): shift={s:+.0%}") + +# 5. Test credit resolution +for dc in ms.default_curves: + c = todaysmarket_analyzer.resolve_credit_shifts(dc, shifts, sector_map) + print(f"Credit {dc.name} ({dc.currency}): {c}") +print() + +# 6. Build the stress test XML +path = stresstest_builder.build(shifts=shifts, market=ms, sector_map=sector_map) +print(f"Stress XML written to: {path}") + +# 7. Validate XML +from xml.etree import ElementTree as ET +tree = ET.parse(path) +root = tree.getroot() +print(f"Root tag: {root.tag}") +stress_tests = root.findall("StressTest") +print(f"StressTests: {len(stress_tests)}") +for st in stress_tests: + disc = st.findall(".//DiscountCurve") + idx = st.findall(".//IndexCurve") + eq = st.findall(".//EquitySpot") + fx = st.findall(".//FxSpot") + surv = st.findall(".//SurvivalProbability") + print(f" Discount curves: {len(disc)}") + print(f" Index curves: {len(idx)}") + print(f" FX spots: {len(fx)}") + print(f" Equity spots: {len(eq)}") + print(f" Survival probs: {len(surv)}") + +print("\n✓ All imports and build OK!") + +# 8. Build ore_agent.xml (stress-only ORE config) +ore_workspace = config.ORE_WORKSPACE +ore_agent_xml = stresstest_builder.build_ore_config( + base_ore_xml=ore_workspace / "ore.xml", + stress_config_file="agent_stress.xml", + market=market, +) +print(f"\nORE agent config written to: {ore_agent_xml}") + +# 9. Run ORE via Python bindings +csv_path = ore_runner.run(ore_xml=ore_agent_xml, workspace=ore_workspace) +print(f"ORE completed — output: {csv_path}") + +# 10. Read and display stress test results +import pandas as pd +import io + +with csv_path.open() as f: + content = f.read().replace("#TradeId", "TradeId", 1) + +df = pd.read_csv(io.StringIO(content)) +df.columns = [c.strip() for c in df.columns] +df["PnL"] = df["Scenario NPV"] - df["Base NPV"] + +print(f"\nStress test results ({len(df)} rows):") +print(f" Scenarios: {df['ScenarioLabel'].unique().tolist()}") +print(f" Total Base NPV: {df['Base NPV'].sum():>14,.0f}") +print(f" Total Stressed NPV: {df['Scenario NPV'].sum():>14,.0f}") +print(f" Total P&L: {df['PnL'].sum():>+14,.0f}") +print() +print(df[["TradeId", "Base NPV", "Scenario NPV", "PnL"]].to_string(index=False)) + +print("\n✓ Full pipeline (build + ORE run + output) OK!") diff --git a/EconomicStressAgentORE/todaysmarket_analyzer.py b/EconomicStressAgentORE/todaysmarket_analyzer.py new file mode 100644 index 0000000..2e0e375 --- /dev/null +++ b/EconomicStressAgentORE/todaysmarket_analyzer.py @@ -0,0 +1,550 @@ +""" +todaysmarket_analyzer.py — Parse todaysmarket.xml to extract all market +entities (curves, FX pairs, equities, credit names, inflation indices). + +Returns a MarketStructure dataclass consumed by the stress test builder +and can generate a matching simulation.xml. +""" + +from __future__ import annotations + +import csv +from dataclasses import dataclass, field +from pathlib import Path +from xml.dom import minidom +from xml.etree import ElementTree as ET + +import config + + +# ── Data classes ────────────────────────────────────────────────────────────── + +@dataclass +class CurveInfo: + """A single market curve / entity extracted from todaysmarket.xml.""" + name: str # e.g. "EUR-ESTER", "Underlying1", "RIC:.SPX" + currency: str # e.g. "EUR", "USD" + curve_type: str # "discount", "index", "yield", "default", "equity", "inflation" + spec: str # full ORE spec, e.g. "Yield/EUR/EUR-ESTER" + + +@dataclass +class MarketStructure: + """Complete market topology derived from todaysmarket.xml.""" + base_currency: str = "EUR" + discount_curves: list[CurveInfo] = field(default_factory=list) + index_curves: list[CurveInfo] = field(default_factory=list) + yield_curves: list[CurveInfo] = field(default_factory=list) + default_curves: list[CurveInfo] = field(default_factory=list) + equity_curves: list[CurveInfo] = field(default_factory=list) + fx_pairs: list[str] = field(default_factory=list) + inflation_indices: list[CurveInfo] = field(default_factory=list) + capfloor_vols: list[CurveInfo] = field(default_factory=list) + + @property + def currencies(self) -> set[str]: + """Union of all currencies found across every curve.""" + ccys: set[str] = set() + for curves in (self.discount_curves, self.index_curves, + self.yield_curves, self.default_curves, + self.equity_curves, self.inflation_indices): + for c in curves: + ccys.add(c.currency) + # Also extract from FX pairs (first 3 and last 3 chars) + for pair in self.fx_pairs: + ccys.add(pair[:3]) + ccys.add(pair[3:]) + return ccys + + +# ── Sector mapping ──────────────────────────────────────────────────────────── + +@dataclass +class SectorEntry: + entity_type: str # "equity" | "credit" + name: str # ORE entity name + currency: str # optional override (empty → auto-detect) + sector: str # e.g. "Tech", "SeniorUnsecured" + + +def load_sector_mapping(csv_path: Path | None = None) -> dict[tuple[str, str], SectorEntry]: + """ + Load sector_mapping.csv and return a lookup dict keyed by (type, name). + + Parameters + ---------- + csv_path : path to CSV file; defaults to config.SECTOR_MAPPING_CSV + + Returns + ------- + dict mapping (entity_type, entity_name) → SectorEntry + """ + if csv_path is None: + csv_path = config.SECTOR_MAPPING_CSV + csv_path = Path(csv_path) + + mapping: dict[tuple[str, str], SectorEntry] = {} + if not csv_path.exists(): + return mapping + + with csv_path.open(newline="") as f: + reader = csv.DictReader(f) + for row in reader: + entry = SectorEntry( + entity_type=row["type"].strip(), + name=row["name"].strip(), + currency=row.get("currency", "").strip(), + sector=row["sector"].strip(), + ) + mapping[(entry.entity_type, entry.name)] = entry + return mapping + + +def resolve_equity_shift( + curve: CurveInfo, + shifts: dict, + sector_map: dict[tuple[str, str], SectorEntry], +) -> float: + """Resolve the equity shift for a given equity curve. + + Priority: sector override → currency default → 0. + """ + equity_shifts: dict = shifts.get("equity", {}) + entry = sector_map.get(("equity", curve.name)) + if entry and entry.sector in equity_shifts: + return equity_shifts[entry.sector] + if curve.currency in equity_shifts: + return equity_shifts[curve.currency] + return 0.0 + + +def resolve_credit_shifts( + curve: CurveInfo, + shifts: dict, + sector_map: dict[tuple[str, str], SectorEntry], +) -> dict[str, float]: + """Resolve the credit tenor shifts for a given default curve. + + Priority: sector override → currency default → empty dict. + """ + credit_shifts: dict = shifts.get("credit", {}) + entry = sector_map.get(("credit", curve.name)) + if entry and entry.sector in credit_shifts: + return credit_shifts[entry.sector] + if curve.currency in credit_shifts: + return credit_shifts[curve.currency] + return {} + + +# ── todaysmarket.xml parser ─────────────────────────────────────────────────── + +def _ccy_from_spec(spec: str) -> str: + """Extract currency from an ORE curve spec like 'Yield/EUR/EUR-ESTER'.""" + parts = spec.split("/") + if len(parts) >= 2: + return parts[1] + return "" + + +def _ccy_from_index_name(name: str) -> str: + """Extract currency from an index name like 'EUR-ESTER' or 'USD-SOFR'.""" + parts = name.split("-") + if parts and len(parts[0]) == 3 and parts[0].isalpha(): + return parts[0].upper() + return "" + + +def parse(todaysmarket_xml: Path | None = None) -> MarketStructure: + """ + Parse todaysmarket.xml and return the full market structure. + + Parameters + ---------- + todaysmarket_xml : path to todaysmarket.xml; defaults to + config.ORE_INPUT_DIR / "todaysmarket.xml" + """ + if todaysmarket_xml is None: + todaysmarket_xml = config.ORE_INPUT_DIR / "todaysmarket.xml" + todaysmarket_xml = Path(todaysmarket_xml) + + tree = ET.parse(todaysmarket_xml) + root = tree.getroot() + + ms = MarketStructure() + + # ── Discount curves ─────────────────────────────────────────────── + for dc_section in root.findall(".//DiscountingCurves[@id='default']"): + for dc in dc_section.findall("DiscountingCurve"): + ccy = dc.get("currency", "") + spec = (dc.text or "").strip() + name = spec.split("/")[-1] if spec else ccy + ms.discount_curves.append( + CurveInfo(name=name, currency=ccy, curve_type="discount", spec=spec) + ) + + # ── Index forwarding curves ─────────────────────────────────────── + for idx_section in root.findall(".//IndexForwardingCurves[@id='default']"): + for idx in idx_section.findall("Index"): + name = idx.get("name", "") + spec = (idx.text or "").strip() + ccy = _ccy_from_index_name(name) or _ccy_from_spec(spec) + ms.index_curves.append( + CurveInfo(name=name, currency=ccy, curve_type="index", spec=spec) + ) + + # ── Yield curves ────────────────────────────────────────────────── + for yc_section in root.findall(".//YieldCurves[@id='default']"): + for yc in yc_section.findall("YieldCurve"): + name = yc.get("name", "") + spec = (yc.text or "").strip() + ccy = _ccy_from_spec(spec) + ms.yield_curves.append( + CurveInfo(name=name, currency=ccy, curve_type="yield", spec=spec) + ) + + # ── Default curves ──────────────────────────────────────────────── + for dc_section in root.findall(".//DefaultCurves[@id='default']"): + for dc in dc_section.findall("DefaultCurve"): + name = dc.get("name", "") + spec = (dc.text or "").strip() + ccy = _ccy_from_spec(spec) + ms.default_curves.append( + CurveInfo(name=name, currency=ccy, curve_type="default", spec=spec) + ) + + # ── Equity curves ───────────────────────────────────────────────── + for eq_section in root.findall(".//EquityCurves[@id='default']"): + for eq in eq_section.findall("EquityCurve"): + name = eq.get("name", "") + spec = (eq.text or "").strip() + ccy = _ccy_from_spec(spec) + ms.equity_curves.append( + CurveInfo(name=name, currency=ccy, curve_type="equity", spec=spec) + ) + + # ── FX pairs ────────────────────────────────────────────────────── + for fx_section in root.findall(".//FxSpots[@id='default']"): + for fx in fx_section.findall("FxSpot"): + pair = fx.get("pair", "") + if pair: + ms.fx_pairs.append(pair) + + # ── Inflation indices ───────────────────────────────────────────── + for zi_section in root.findall(".//ZeroInflationIndexCurves[@id='default']"): + for zi in zi_section.findall("ZeroInflationIndexCurve"): + name = zi.get("name", "") + spec = (zi.text or "").strip() + # Inflation specs: Inflation/EUHICPXT/... → ccy heuristic from name prefix + ccy = name[:2] + "R" if name[:2] in ("EU", "US", "GB") else "" + if name.startswith("EU"): + ccy = "EUR" + elif name.startswith("US"): + ccy = "USD" + elif name.startswith("GB"): + ccy = "GBP" + else: + ccy = _ccy_from_spec(spec) + ms.inflation_indices.append( + CurveInfo(name=name, currency=ccy, curve_type="inflation", spec=spec) + ) + + # ── CapFloor volatilities ───────────────────────────────────────── + for cf_section in root.findall(".//CapFloorVolatilities[@id='default']"): + for cf in cf_section.findall("CapFloorVolatility"): + key = cf.get("key", "") + spec = (cf.text or "").strip() + ccy = _ccy_from_index_name(key) or _ccy_from_spec(spec) + ms.capfloor_vols.append( + CurveInfo(name=key, currency=ccy, curve_type="capfloor_vol", spec=spec) + ) + + # Derive base currency from first discount curve or default to EUR + if ms.discount_curves: + ms.base_currency = ms.discount_curves[0].currency + else: + ms.base_currency = "EUR" + + return ms + + +# ── Simulation XML generation ───────────────────────────────────────────────── + +def _prettify(element: ET.Element) -> str: + """Return a pretty-printed XML string (no XML declaration).""" + rough = ET.tostring(element, encoding="unicode") + reparsed = minidom.parseString(rough) + pretty = reparsed.toprettyxml(indent=" ") + # Remove the XML declaration added by minidom + lines = pretty.splitlines() + if lines and lines[0].startswith(" Path: + """ + Generate a simulation.xml from the discovered MarketStructure. + + Uses standard tenor grids from config for each curve type. + + Parameters + ---------- + market : MarketStructure from parse() + output_path : where to write; defaults to config.ORE_INPUT_DIR / "simulation.xml" + """ + if output_path is None: + output_path = config.ORE_INPUT_DIR / "simulation.xml" + output_path = Path(output_path) + + root = ET.Element("Simulation") + mkt = ET.SubElement(root, "Market") + + # ── BaseCurrency ────────────────────────────────────────────────── + ET.SubElement(mkt, "BaseCurrency").text = market.base_currency + + # ── Currencies ──────────────────────────────────────────────────── + ccys_el = ET.SubElement(mkt, "Currencies") + for ccy in sorted(market.currencies): + ET.SubElement(ccys_el, "Currency").text = ccy + + # ── YieldCurves (global config) ─────────────────────────────────── + yc_el = ET.SubElement(mkt, "YieldCurves") + cfg = ET.SubElement(yc_el, "Configuration", {"curve": ""}) + ET.SubElement(cfg, "Tenors").text = ", ".join(config.STANDARD_RATE_TENORS) + ET.SubElement(cfg, "Interpolation").text = "LogLinear" + ET.SubElement(cfg, "Extrapolation").text = "FlatZero" + + # ── FxRates ─────────────────────────────────────────────────────── + fx_el = ET.SubElement(mkt, "FxRates") + pairs_el = ET.SubElement(fx_el, "CurrencyPairs") + for pair in market.fx_pairs: + # ORE simulation uses inverted convention (USDEUR instead of EURUSD) + foreign = pair[:3] + domestic = pair[3:] + sim_pair = domestic + foreign # e.g. EURUSD → USDEUR + ET.SubElement(pairs_el, "CurrencyPair").text = sim_pair + + # ── Indices ─────────────────────────────────────────────────────── + indices_el = ET.SubElement(mkt, "Indices") + for idx in market.index_curves: + ET.SubElement(indices_el, "Index").text = idx.name + + # ── BenchmarkCurves (empty) ─────────────────────────────────────── + ET.SubElement(mkt, "BenchmarkCurves") + + # ── CapFloorVolatilities ────────────────────────────────────────── + if market.capfloor_vols: + cf_el = ET.SubElement(mkt, "CapFloorVolatilities") + ET.SubElement(cf_el, "Simulate").text = "true" + ET.SubElement(cf_el, "ReactionToTimeDecay").text = "ForwardVariance" + keys_el = ET.SubElement(cf_el, "Keys") + for cv in market.capfloor_vols: + ET.SubElement(keys_el, "Key").text = cv.name + ET.SubElement(cf_el, "Expiries", {"key": cv.name}).text = ( + "1Y, 2Y, 3Y, 4Y, 5Y, 6Y, 7Y, 8Y, 9Y, 10Y, 12Y, 15Y, 20Y, 25Y, 30Y" + ) + ET.SubElement(cf_el, "Strikes", {"key": cv.name}).text = ( + "-0.015, -0.01, 0, 0.0005" + ) + ET.SubElement(cf_el, "AdjustOptionletPillars").text = "true" + ET.SubElement(cf_el, "UseCapAtm").text = "false" + ET.SubElement(cf_el, "SmileDynamics", {"key": ""}).text = "StickyStrike" + for cv in market.capfloor_vols: + ET.SubElement(cf_el, "SmileDynamics", {"key": cv.name}).text = "StickyStrike" + + # ── DefaultCurves ───────────────────────────────────────────────── + if market.default_curves: + dc_el = ET.SubElement(mkt, "DefaultCurves") + names_el = ET.SubElement(dc_el, "Names") + for dc in market.default_curves: + ET.SubElement(names_el, "Name").text = dc.name + ET.SubElement(dc_el, "Tenors").text = ", ".join(config.STANDARD_CREDIT_TENORS) + ET.SubElement(dc_el, "SimulateSurvivalProbabilities").text = "true" + ET.SubElement(dc_el, "SimulateRecoveryRates").text = "false" + cals = ET.SubElement(dc_el, "Calendars") + ET.SubElement(cals, "Calendar", {"name": ""}).text = "TARGET" + ET.SubElement(dc_el, "Extrapolation").text = "FlatZero" + + # ── ZeroInflationIndexCurves ────────────────────────────────────── + if market.inflation_indices: + zi_el = ET.SubElement(mkt, "ZeroInflationIndexCurves") + names_el = ET.SubElement(zi_el, "Names") + for zi in market.inflation_indices: + ET.SubElement(names_el, "Name").text = zi.name + ET.SubElement(zi_el, "Tenors").text = ", ".join(config.STANDARD_INFLATION_TENORS) + + # ── Equities ────────────────────────────────────────────────────── + if market.equity_curves: + eq_el = ET.SubElement(mkt, "Equities") + ET.SubElement(eq_el, "SimulateDividendYield").text = "true" + names_el = ET.SubElement(eq_el, "Names") + for eq in market.equity_curves: + ET.SubElement(names_el, "Name").text = eq.name + ET.SubElement(eq_el, "DividendTenors").text = ", ".join( + config.STANDARD_EQUITY_DIV_TENORS + ) + + # ── CreditStates (empty) ───────────────────────────────────────── + cs = ET.SubElement(mkt, "CreditStates") + ET.SubElement(cs, "NumberOfFactors").text = "0" + acs = ET.SubElement(mkt, "AggregationScenarioDataCreditStates") + ET.SubElement(acs, "NumberOfFactors").text = "0" + + # ── Write ───────────────────────────────────────────────────────── + xml_str = _prettify(root) + output_path.write_text(xml_str, encoding="utf-8") + return output_path + + +# ── Sensitivity XML generation ──────────────────────────────────────────────── + +def generate_sensitivity_xml( + market: MarketStructure, + output_path: Path | None = None, +) -> Path: + """ + Generate a minimal sensitivity.xml from the discovered MarketStructure. + + This produces a zero-shift sensitivity config (ShiftSize = 0.0001) that + covers all market entities required by the stress test analytic. + No ParConversion blocks are emitted — this is a simplified "zero" config + sufficient for the stress test engine to resolve all risk factors. + + Parameters + ---------- + market : MarketStructure from parse() + output_path : where to write; defaults to + config.ORE_INPUT_DIR / "sensitivity_agent.xml" + """ + if output_path is None: + output_path = config.ORE_INPUT_DIR / "sensitivity_agent.xml" + output_path = Path(output_path) + + rate_tenors = ", ".join(config.STANDARD_RATE_TENORS) + credit_tenors = ", ".join(config.STANDARD_CREDIT_TENORS) + inflation_tenors = ", ".join(config.STANDARD_INFLATION_TENORS) + + root = ET.Element("SensitivityAnalysis") + + # ── Discount curves ─────────────────────────────────────────────── + dc_el = ET.SubElement(root, "DiscountCurves") + for dc in market.discount_curves: + curve = ET.SubElement(dc_el, "DiscountCurve", ccy=dc.currency) + ET.SubElement(curve, "ShiftType").text = "Absolute" + ET.SubElement(curve, "ShiftSize").text = "0.0001" + ET.SubElement(curve, "ShiftScheme").text = "Forward" + ET.SubElement(curve, "ShiftTenors").text = rate_tenors + + # ── Index curves ────────────────────────────────────────────────── + ic_el = ET.SubElement(root, "IndexCurves") + for idx in market.index_curves: + curve = ET.SubElement(ic_el, "IndexCurve", index=idx.name) + ET.SubElement(curve, "ShiftType").text = "Absolute" + ET.SubElement(curve, "ShiftSize").text = "0.0001" + ET.SubElement(curve, "ShiftScheme").text = "Forward" + ET.SubElement(curve, "ShiftTenors").text = rate_tenors + + # ── Yield curves (empty) ────────────────────────────────────────── + ET.SubElement(root, "YieldCurves") + + # ── FX spots ────────────────────────────────────────────────────── + fx_el = ET.SubElement(root, "FxSpots") + for pair in market.fx_pairs: + foreign = pair[:3] + domestic = pair[3:] + sim_pair = domestic + foreign # ORE convention + spot = ET.SubElement(fx_el, "FxSpot", ccypair=sim_pair) + ET.SubElement(spot, "ShiftType").text = "Relative" + ET.SubElement(spot, "ShiftSize").text = "0.01" + + # ── Credit curves ───────────────────────────────────────────────── + if market.default_curves: + cc_el = ET.SubElement(root, "CreditCurves") + for dc in market.default_curves: + curve = ET.SubElement(cc_el, "CreditCurve", name=dc.name) + ET.SubElement(curve, "Currency").text = dc.currency + ET.SubElement(curve, "ShiftType").text = "Absolute" + ET.SubElement(curve, "ShiftSize").text = "0.0001" + ET.SubElement(curve, "ShiftScheme").text = "Forward" + ET.SubElement(curve, "ShiftTenors").text = credit_tenors + + # ── CapFloor volatilities ───────────────────────────────────────── + if market.capfloor_vols: + cfv_el = ET.SubElement(root, "CapFloorVolatilities") + for cv in market.capfloor_vols: + vol = ET.SubElement(cfv_el, "CapFloorVolatility", key=cv.name) + ET.SubElement(vol, "ShiftType").text = "Absolute" + ET.SubElement(vol, "ShiftSize").text = "0.0001" + ET.SubElement(vol, "ShiftExpiries").text = ( + "1Y, 2Y, 3Y, 5Y, 7Y, 10Y, 15Y, 20Y" + ) + ET.SubElement(vol, "ShiftStrikes").text = ( + "-0.01, 0, 0.01, 0.02, 0.03, 0.04, 0.05" + ) + ET.SubElement(vol, "Index").text = cv.name + + # ── Zero inflation index curves ─────────────────────────────────── + if market.inflation_indices: + zi_el = ET.SubElement(root, "ZeroInflationIndexCurves") + for zi in market.inflation_indices: + curve = ET.SubElement(zi_el, "ZeroInflationIndexCurve", index=zi.name) + ET.SubElement(curve, "ShiftType").text = "Absolute" + ET.SubElement(curve, "ShiftSize").text = "0.0001" + ET.SubElement(curve, "ShiftTenors").text = inflation_tenors + + # ── Equity spots ────────────────────────────────────────────────── + if market.equity_curves: + eq_el = ET.SubElement(root, "EquitySpots") + for eq in market.equity_curves: + spot = ET.SubElement(eq_el, "EquitySpot", equity=eq.name) + ET.SubElement(spot, "ShiftType").text = "Relative" + ET.SubElement(spot, "ShiftSize").text = "0.01" + ET.SubElement(spot, "ShiftScheme").text = "Forward" + + # ── Global flags ────────────────────────────────────────────────── + ET.SubElement(root, "ComputeGamma").text = "false" + ET.SubElement(root, "UseSpreadedTermStructures").text = "true" + + xml_str = _prettify(root) + output_path.write_text(xml_str, encoding="utf-8") + return output_path + + +# ── Pretty-print MarketStructure ────────────────────────────────────────────── + +def format_market_structure(ms: MarketStructure) -> str: + """Return a human-readable summary of the discovered market structure.""" + lines = [ + f"Base currency: {ms.base_currency}", + f"Currencies: {', '.join(sorted(ms.currencies))}", + "", + f"Discount curves ({len(ms.discount_curves)}):", + ] + for c in ms.discount_curves: + lines.append(f" {c.currency:4s} {c.name:30s} {c.spec}") + lines.append(f"\nIndex curves ({len(ms.index_curves)}):") + for c in ms.index_curves: + lines.append(f" {c.currency:4s} {c.name:30s} {c.spec}") + if ms.yield_curves: + lines.append(f"\nYield curves ({len(ms.yield_curves)}):") + for c in ms.yield_curves: + lines.append(f" {c.currency:4s} {c.name:30s} {c.spec}") + lines.append(f"\nFX pairs ({len(ms.fx_pairs)}):") + for p in ms.fx_pairs: + lines.append(f" {p}") + if ms.equity_curves: + lines.append(f"\nEquity curves ({len(ms.equity_curves)}):") + for c in ms.equity_curves: + lines.append(f" {c.currency:4s} {c.name:30s} {c.spec}") + if ms.default_curves: + lines.append(f"\nDefault curves ({len(ms.default_curves)}):") + for c in ms.default_curves: + lines.append(f" {c.currency:4s} {c.name:30s} {c.spec}") + if ms.inflation_indices: + lines.append(f"\nInflation indices ({len(ms.inflation_indices)}):") + for c in ms.inflation_indices: + lines.append(f" {c.currency:4s} {c.name:30s} {c.spec}") + return "\n".join(lines)