diff --git a/PR_DESCRIPTION_ISSUE_26.md b/PR_DESCRIPTION_ISSUE_26.md new file mode 100644 index 0000000..ef74acf --- /dev/null +++ b/PR_DESCRIPTION_ISSUE_26.md @@ -0,0 +1,133 @@ +## Summary + +Options GPS can now **autonomously trade options** on Deribit and Aevo directly from the CLI. This adds a full execution engine with order placement, order lifecycle management (place → monitor → cancel), slippage protection, position sizing, and safety guardrails — transforming the tool from analysis-only to end-to-end autonomous execution. + +**Before:** CLI showed recommended venue/price per leg but could not place orders. No `--execute` or Screen 5. + +**After:** `--dry-run` simulates execution (no credentials needed); `--execute best` (or `safer`/`upside`) submits live orders to Deribit/Aevo. Each leg is auto-routed to its best venue. Orders are monitored with configurable timeout, protected by slippage limits, and partially-filled multi-leg strategies are automatically unwound on failure. + +## Related Issues + +Closes #26 + +## Type of Change + +- [ ] Bug fix +- [x] Improvement to existing tool +- [ ] Documentation +- [ ] Other (describe below) + +## What Changed + +### `executor.py` — New execution engine (719 lines) + +**Data model:** +- `OrderRequest` / `OrderResult` / `ExecutionPlan` / `ExecutionReport` dataclasses +- `OrderResult` tracks `timestamp` (ISO 8601), `slippage_pct`, and `latency_ms` per fill +- `ExecutionPlan` supports `max_slippage_pct`, `timeout_seconds`, `quantity_override` +- `ExecutionReport` includes `started_at`, `finished_at`, `cancelled_orders` + +**Executors (abstract `BaseExecutor` with full order lifecycle):** +- `DryRunExecutor` — simulates fills from quote data; tracks orders for status/cancel +- `DeribitExecutor` — POST + JSON-RPC 2.0 with OAuth token caching, USD↔BTC price conversion, live order book pricing, tick-size alignment +- `AevoExecutor` — REST with EIP-712 L2 order signing (Ethereum private key), instrument ID resolution via `/markets`, 6-decimal price/amount scaling + +**Order lifecycle:** `place_order()` → `get_order_status()` → `cancel_order()` on all executors + +**Execution engine:** +- `build_execution_plan()` — auto-routes per leg via `leg_divergences`, builds exchange-specific instrument names (Deribit: `BTC-27MAR26-71000-C`, Aevo: `BTC-71000-C`), applies quantity override +- `validate_plan()` — pre-flight checks (instruments, prices, quantities, actions) +- `execute_plan()` — sequential execution with: + - **Order monitoring:** polls `get_order_status()` until filled or timeout, then cancels + - **Slippage protection:** rejects fills exceeding `--max-slippage` threshold + - **Auto-cancel on partial failure:** cancels already-filled legs when a later leg fails +- `get_executor()` factory — reads credentials from env vars, supports testnet + +### `main.py` — CLI integration + +**New flags:** +| Flag | Purpose | +|------|---------| +| `--execute best\|safer\|upside` | Which strategy card to trade | +| `--dry-run` | Simulate without placing real orders | +| `--force` | Override no-trade guardrail for live execution | +| `--exchange deribit\|aevo` | Force all legs to one venue (default: auto-route) | +| `--max-slippage N` | Max allowed slippage % per fill (0=off) | +| `--quantity N` | Override contract quantity for all legs (0=default) | +| `--timeout N` | Seconds to wait for order fill before cancel (0=fire-and-forget) | +| `--screen none` | Skip analysis screens 1-4, show only execution (Screen 5) | + +**Screen 5 (Execution):** order plan display, live confirmation prompt, per-leg results with slippage/latency metrics, auto-cancelled orders, execution timestamps. + +**Decision log:** `execution` block now includes `started_at`, `finished_at`, per-fill `slippage_pct`/`latency_ms`/`timestamp`, `cancelled_orders`, `max_slippage_pct`, `timeout_seconds`, `quantity_override`. + +### `README.md` — Updated documentation + +- Exchange integration architecture (Synth → pipeline → quotes → routing → execution → lifecycle → safety) +- All CLI flags and env vars documented +- Test coverage description updated + +## Testing + +- [x] Tested against Synth API +- [x] Manually tested +- [x] Tests added/updated + +### Test breakdown + +**`test_executor.py`** — 54 tests: +- `TestInstrumentNames` (7) — Deribit/Aevo name builders, roundtrip parsing, edge cases +- `TestBuildPlan` (6) — single/multi-leg, exchange override, aevo names, auto-route, estimated cost +- `TestValidatePlan` (5) — valid plan, empty orders, zero price, zero quantity, empty instrument +- `TestDryRunExecutor` (12) — authenticate, buy/sell fills, missing strike, no-match fallback, **get_order_status, status not found, cancel_order, cancel not found, timestamp on result, slippage tracked** +- `TestExecuteFlow` (7) — single/multi-leg, net cost, auto-routing factory, **summary message, report timestamps** +- `TestGetExecutor` (5) — dry-run, dry-run ignores exchange, missing creds (Deribit/Aevo), unknown exchange +- `TestSlippage` (8) — buy worse/better, sell worse/better, zero expected, **slippage protection rejects, slippage protection allows** +- `TestQuantityOverride` (3) — **default quantity, override applied (single-leg), override applied (multi-leg)** + +**`test_executor_e2e.py`** — 8 tests: +- Full pipeline → dry-run execution +- Guardrail: refuse live when no-trade, allow with force, allow dry-run, allow when no guardrail +- **Multi-leg execution pipeline** (spread → rank → build → dry-run → verify all legs + timestamps) +- **Non-crypto symbol skips execution** (SPY returns no exchange quotes) +- **Slippage protection E2E** (full pipeline with slippage guard → all pass) + +**Verify:** `python3 -m pytest tools/options-gps/tests/ -v` → **178 passed** (119 existing + 59 new). + +## Edge Cases Handled + +| # | Scenario | Behavior | +|---|----------|----------| +| E1 | No API credentials | `get_executor` raises with clear env var message | +| E2 | Non-crypto symbol + execute | Exit 1: "Execution only supported for crypto assets" | +| E3 | No exchange quotes available | Exit 1: "exchange data not available" | +| E4 | Multi-leg partial failure | Auto-cancel filled legs; report which were cancelled | +| E5 | Instrument names per exchange | Deribit: `BTC-27MAR26-71000-C`; Aevo: `BTC-71000-C` | +| E6 | No-trade guardrail active | Refuse live execution unless `--force`; dry-run always allowed | +| E7 | Dry-run mode | No HTTP calls to exchange; simulates from quote data | +| E8 | Default CLI (no execute flags) | Unchanged — analysis screens only | +| E9 | Slippage exceeds threshold | Order rejected + cancelled; partial fills unwound | +| E10 | Order timeout | Polls status; cancels if still open after deadline | +| E11 | Negative sleep on monitor deadline | Clamped to 0 — no `ValueError` crash | +| E12 | Quantity override = 0 | Uses strategy default leg quantities | + +## Environment Variables (live execution) + +| Variable | Purpose | +|----------|---------| +| `DERIBIT_CLIENT_ID` / `DERIBIT_CLIENT_SECRET` | Deribit API credentials | +| `DERIBIT_TESTNET=1` | Use Deribit testnet | +| `AEVO_API_KEY` / `AEVO_API_SECRET` | Aevo REST API credentials | +| `AEVO_SIGNING_KEY` | Ethereum private key for EIP-712 order signing | +| `AEVO_WALLET_ADDRESS` | Maker wallet address (Ethereum) | +| `AEVO_TESTNET=1` | Use Aevo testnet | + +## Checklist + +- [x] Code follows project style guidelines +- [x] Self-review completed +- [x] Changes are documented (if applicable) + +## Demo Video + +https://screenrec.com/share/xM8Ibk2COs \ No newline at end of file diff --git a/mock_data/exchange_options/aevo_BTC.json b/mock_data/exchange_options/aevo_BTC.json index 9b9721f..ad5e3b0 100644 --- a/mock_data/exchange_options/aevo_BTC.json +++ b/mock_data/exchange_options/aevo_BTC.json @@ -15,27 +15,40 @@ {"instrument_name": "BTC-69000-C", "strike": 69000, "option_type": "call"}, {"instrument_name": "BTC-69000-P", "strike": 69000, "option_type": "put"}, {"instrument_name": "BTC-70000-C", "strike": 70000, "option_type": "call"}, - {"instrument_name": "BTC-70000-P", "strike": 70000, "option_type": "put"} + {"instrument_name": "BTC-70000-P", "strike": 70000, "option_type": "put"}, + {"instrument_name": "BTC-71000-C", "strike": 71000, "option_type": "call"}, + {"instrument_name": "BTC-71000-P", "strike": 71000, "option_type": "put"}, + {"instrument_name": "BTC-72000-C", "strike": 72000, "option_type": "call"}, + {"instrument_name": "BTC-72000-P", "strike": 72000, "option_type": "put"}, + {"instrument_name": "BTC-73000-C", "strike": 73000, "option_type": "call"}, + {"instrument_name": "BTC-73000-P", "strike": 73000, "option_type": "put"}, + {"instrument_name": "BTC-74000-C", "strike": 74000, "option_type": "call"}, + {"instrument_name": "BTC-74000-P", "strike": 74000, "option_type": "put"} ], "order_books": { - "BTC-65000-C": {"bids": [[2800.0, 1.5, 52.5]], "asks": [[2900.0, 1.2, 54.0]]}, - "BTC-65000-P": {"bids": [[0.85, 2.0, 51.5]], "asks": [[1.15, 1.8, 54.2]]}, - "BTC-66000-C": {"bids": [[1830.0, 1.0, 51.8]], "asks": [[1900.0, 0.8, 53.2]]}, - "BTC-66000-P": {"bids": [[16.00, 1.5, 51.0]], "asks": [[19.80, 1.2, 53.0]]}, - "BTC-67000-C": {"bids": [[960.0, 2.0, 51.0]], "asks": [[1010.0, 1.5, 52.5]]}, - "BTC-67000-P": {"bids": [[135.0, 1.0, 50.8]], "asks": [[148.0, 0.8, 52.2]]}, - "BTC-67500-C": {"bids": [[620.0, 1.5, 50.5]], "asks": [[655.0, 1.0, 52.0]]}, - "BTC-67500-P": {"bids": [[280.0, 1.2, 50.2]], "asks": [[305.0, 1.0, 51.8]]}, - "BTC-68000-C": {"bids": [[360.0, 1.0, 50.0]], "asks": [[385.0, 0.8, 51.5]]}, - "BTC-68000-P": {"bids": [[510.0, 1.5, 49.8]], "asks": [[542.0, 1.2, 51.2]]}, - "BTC-68500-C": {"bids": [[190.0, 0.8, 49.5]], "asks": [[205.0, 0.5, 51.0]]}, - "BTC-68500-P": {"bids": [[830.0, 1.0, 49.2]], "asks": [[870.0, 0.8, 50.8]]}, - "BTC-69000-C": {"bids": [[88.0, 1.0, 49.0]], "asks": [[98.0, 0.8, 50.5]]}, - "BTC-69000-P": {"bids": [[1210.0, 0.8, 48.8]], "asks": [[1280.0, 0.5, 50.2]]}, - "BTC-70000-C": {"bids": [[14.0, 0.5, 48.2]], "asks": [[16.80, 0.3, 49.8]]}, - "BTC-70000-P": {"bids": [[2120.0, 0.8, 48.0]], "asks": [[2220.0, 0.5, 49.5]]}, - - "BTC-65500-C": {"bids": [[2300.0, 1.0, 52.0]], "asks": [[2410.0, 0.8, 53.5]]}, - "BTC-65500-P": {"bids": [[3.80, 1.5, 51.5]], "asks": [[5.00, 1.0, 53.5]]} + "BTC-65000-C": {"bids": [[5820.0, 1.5, 56.2]], "asks": [[5960.0, 1.2, 58.2]]}, + "BTC-65000-P": {"bids": [[0.45, 2.0, 55.8]], "asks": [[1.60, 1.8, 57.8]]}, + "BTC-66000-C": {"bids": [[4920.0, 1.0, 55.8]], "asks": [[5060.0, 0.8, 57.8]]}, + "BTC-66000-P": {"bids": [[9.0, 1.5, 55.2]], "asks": [[26.0, 1.2, 57.2]]}, + "BTC-67000-C": {"bids": [[4070.0, 2.0, 55.0]], "asks": [[4220.0, 1.5, 57.0]]}, + "BTC-67000-P": {"bids": [[125.0, 1.0, 55.0]], "asks": [[155.0, 0.8, 56.8]]}, + "BTC-67500-C": {"bids": [[3670.0, 1.5, 54.8]], "asks": [[3820.0, 1.0, 56.8]]}, + "BTC-67500-P": {"bids": [[270.0, 1.2, 54.5]], "asks": [[315.0, 1.0, 56.2]]}, + "BTC-68000-C": {"bids": [[4820.0, 1.5, 55.0]], "asks": [[4920.0, 1.2, 57.0]]}, + "BTC-68000-P": {"bids": [[1610.0, 1.0, 55.2]], "asks": [[1680.0, 0.8, 56.8]]}, + "BTC-68500-C": {"bids": [[4420.0, 0.8, 54.8]], "asks": [[4570.0, 0.5, 56.8]]}, + "BTC-68500-P": {"bids": [[800.0, 1.0, 54.5]], "asks": [[910.0, 0.8, 56.2]]}, + "BTC-69000-C": {"bids": [[4180.0, 2.0, 54.5]], "asks": [[4250.0, 1.5, 55.9]]}, + "BTC-69000-P": {"bids": [[1935.0, 1.2, 54.1]], "asks": [[2005.0, 1.0, 55.5]]}, + "BTC-70000-C": {"bids": [[3540.0, 1.5, 53.2]], "asks": [[3610.0, 1.0, 54.6]]}, + "BTC-70000-P": {"bids": [[2325.0, 1.0, 53.5]], "asks": [[2360.0, 0.8, 54.2]]}, + "BTC-71000-C": {"bids": [[2970.0, 2.0, 52.3]], "asks": [[3040.0, 1.5, 53.6]]}, + "BTC-71000-P": {"bids": [[2750.0, 1.5, 52.5]], "asks": [[2790.0, 1.0, 53.2]]}, + "BTC-72000-C": {"bids": [[2470.0, 1.0, 51.7]], "asks": [[2540.0, 0.8, 53.0]]}, + "BTC-72000-P": {"bids": [[3215.0, 1.2, 51.8]], "asks": [[3290.0, 1.0, 52.5]]}, + "BTC-73000-C": {"bids": [[2040.0, 1.5, 51.4]], "asks": [[2080.0, 1.0, 52.0]]}, + "BTC-73000-P": {"bids": [[3785.0, 1.0, 50.8]], "asks": [[3860.0, 0.8, 52.1]]}, + "BTC-74000-C": {"bids": [[1645.0, 0.8, 50.7]], "asks": [[1685.0, 0.5, 51.4]]}, + "BTC-74000-P": {"bids": [[4360.0, 1.0, 49.3]], "asks": [[4530.0, 0.8, 52.8]]} } } diff --git a/mock_data/exchange_options/deribit_BTC.json b/mock_data/exchange_options/deribit_BTC.json index b6f1c3d..0a11699 100644 --- a/mock_data/exchange_options/deribit_BTC.json +++ b/mock_data/exchange_options/deribit_BTC.json @@ -1,38 +1,54 @@ { "instruments": [ - {"instrument_name": "BTC-26FEB26-65000-C", "strike": 65000, "option_type": "call"}, - {"instrument_name": "BTC-26FEB26-65000-P", "strike": 65000, "option_type": "put"}, - {"instrument_name": "BTC-26FEB26-66000-C", "strike": 66000, "option_type": "call"}, - {"instrument_name": "BTC-26FEB26-66000-P", "strike": 66000, "option_type": "put"}, - {"instrument_name": "BTC-26FEB26-67000-C", "strike": 67000, "option_type": "call"}, - {"instrument_name": "BTC-26FEB26-67000-P", "strike": 67000, "option_type": "put"}, - {"instrument_name": "BTC-26FEB26-67500-C", "strike": 67500, "option_type": "call"}, - {"instrument_name": "BTC-26FEB26-67500-P", "strike": 67500, "option_type": "put"}, - {"instrument_name": "BTC-26FEB26-68000-C", "strike": 68000, "option_type": "call"}, - {"instrument_name": "BTC-26FEB26-68000-P", "strike": 68000, "option_type": "put"}, - {"instrument_name": "BTC-26FEB26-68500-C", "strike": 68500, "option_type": "call"}, - {"instrument_name": "BTC-26FEB26-68500-P", "strike": 68500, "option_type": "put"}, - {"instrument_name": "BTC-26FEB26-69000-C", "strike": 69000, "option_type": "call"}, - {"instrument_name": "BTC-26FEB26-69000-P", "strike": 69000, "option_type": "put"}, - {"instrument_name": "BTC-26FEB26-70000-C", "strike": 70000, "option_type": "call"}, - {"instrument_name": "BTC-26FEB26-70000-P", "strike": 70000, "option_type": "put"} + {"instrument_name": "BTC-27MAR26-65000-C", "strike": 65000, "option_type": "call"}, + {"instrument_name": "BTC-27MAR26-65000-P", "strike": 65000, "option_type": "put"}, + {"instrument_name": "BTC-27MAR26-66000-C", "strike": 66000, "option_type": "call"}, + {"instrument_name": "BTC-27MAR26-66000-P", "strike": 66000, "option_type": "put"}, + {"instrument_name": "BTC-27MAR26-67000-C", "strike": 67000, "option_type": "call"}, + {"instrument_name": "BTC-27MAR26-67000-P", "strike": 67000, "option_type": "put"}, + {"instrument_name": "BTC-27MAR26-67500-C", "strike": 67500, "option_type": "call"}, + {"instrument_name": "BTC-27MAR26-67500-P", "strike": 67500, "option_type": "put"}, + {"instrument_name": "BTC-27MAR26-68000-C", "strike": 68000, "option_type": "call"}, + {"instrument_name": "BTC-27MAR26-68000-P", "strike": 68000, "option_type": "put"}, + {"instrument_name": "BTC-27MAR26-68500-C", "strike": 68500, "option_type": "call"}, + {"instrument_name": "BTC-27MAR26-68500-P", "strike": 68500, "option_type": "put"}, + {"instrument_name": "BTC-27MAR26-69000-C", "strike": 69000, "option_type": "call"}, + {"instrument_name": "BTC-27MAR26-69000-P", "strike": 69000, "option_type": "put"}, + {"instrument_name": "BTC-27MAR26-70000-C", "strike": 70000, "option_type": "call"}, + {"instrument_name": "BTC-27MAR26-70000-P", "strike": 70000, "option_type": "put"}, + {"instrument_name": "BTC-27MAR26-71000-C", "strike": 71000, "option_type": "call"}, + {"instrument_name": "BTC-27MAR26-71000-P", "strike": 71000, "option_type": "put"}, + {"instrument_name": "BTC-27MAR26-72000-C", "strike": 72000, "option_type": "call"}, + {"instrument_name": "BTC-27MAR26-72000-P", "strike": 72000, "option_type": "put"}, + {"instrument_name": "BTC-27MAR26-73000-C", "strike": 73000, "option_type": "call"}, + {"instrument_name": "BTC-27MAR26-73000-P", "strike": 73000, "option_type": "put"}, + {"instrument_name": "BTC-27MAR26-74000-C", "strike": 74000, "option_type": "call"}, + {"instrument_name": "BTC-27MAR26-74000-P", "strike": 74000, "option_type": "put"} ], "order_books": { - "BTC-26FEB26-65000-C": {"bid": 2780.0, "ask": 2920.0, "mark_price": 2847.68, "bid_iv": 52.1, "ask_iv": 54.3}, - "BTC-26FEB26-65000-P": {"bid": 0.90, "ask": 1.10, "mark_price": 0.99, "bid_iv": 51.8, "ask_iv": 53.9}, - "BTC-26FEB26-66000-C": {"bid": 1810.0, "ask": 1920.0, "mark_price": 1864.60, "bid_iv": 51.5, "ask_iv": 53.5}, - "BTC-26FEB26-66000-P": {"bid": 15.50, "ask": 20.30, "mark_price": 17.91, "bid_iv": 51.2, "ask_iv": 53.2}, - "BTC-26FEB26-67000-C": {"bid": 950.0, "ask": 1025.0, "mark_price": 987.04, "bid_iv": 50.8, "ask_iv": 52.8}, - "BTC-26FEB26-67000-P": {"bid": 130.0, "ask": 152.0, "mark_price": 140.36, "bid_iv": 50.5, "ask_iv": 52.5}, - "BTC-26FEB26-67500-C": {"bid": 610.0, "ask": 660.0, "mark_price": 638.43, "bid_iv": 50.2, "ask_iv": 52.2}, - "BTC-26FEB26-67500-P": {"bid": 275.0, "ask": 310.0, "mark_price": 291.75, "bid_iv": 50.0, "ask_iv": 52.0}, - "BTC-26FEB26-68000-C": {"bid": 355.0, "ask": 390.0, "mark_price": 373.27, "bid_iv": 49.8, "ask_iv": 51.8}, - "BTC-26FEB26-68000-P": {"bid": 505.0, "ask": 548.0, "mark_price": 526.59, "bid_iv": 49.5, "ask_iv": 51.5}, - "BTC-26FEB26-68500-C": {"bid": 185.0, "ask": 210.0, "mark_price": 197.11, "bid_iv": 49.2, "ask_iv": 51.2}, - "BTC-26FEB26-68500-P": {"bid": 820.0, "ask": 880.0, "mark_price": 850.42, "bid_iv": 49.0, "ask_iv": 51.0}, - "BTC-26FEB26-69000-C": {"bid": 85.0, "ask": 102.0, "mark_price": 93.43, "bid_iv": 48.8, "ask_iv": 50.8}, - "BTC-26FEB26-69000-P": {"bid": 1200.0, "ask": 1295.0, "mark_price": 1246.74, "bid_iv": 48.5, "ask_iv": 50.5}, - "BTC-26FEB26-70000-C": {"bid": 13.0, "ask": 17.50, "mark_price": 15.13, "bid_iv": 48.0, "ask_iv": 50.0}, - "BTC-26FEB26-70000-P": {"bid": 2100.0, "ask": 2240.0, "mark_price": 2168.44, "bid_iv": 47.8, "ask_iv": 49.8} + "BTC-27MAR26-65000-C": {"bid": 5800.0, "ask": 5950.0, "mark_price": 5870.0, "bid_iv": 56.0, "ask_iv": 58.0}, + "BTC-27MAR26-65000-P": {"bid": 0.50, "ask": 1.50, "mark_price": 0.99, "bid_iv": 55.5, "ask_iv": 57.5}, + "BTC-27MAR26-66000-C": {"bid": 4900.0, "ask": 5050.0, "mark_price": 4970.0, "bid_iv": 55.5, "ask_iv": 57.5}, + "BTC-27MAR26-66000-P": {"bid": 10.0, "ask": 25.0, "mark_price": 17.91, "bid_iv": 55.0, "ask_iv": 57.0}, + "BTC-27MAR26-67000-C": {"bid": 4050.0, "ask": 4200.0, "mark_price": 4120.0, "bid_iv": 54.8, "ask_iv": 56.8}, + "BTC-27MAR26-67000-P": {"bid": 120.0, "ask": 160.0, "mark_price": 140.36, "bid_iv": 54.5, "ask_iv": 56.5}, + "BTC-27MAR26-67500-C": {"bid": 3650.0, "ask": 3800.0, "mark_price": 3720.0, "bid_iv": 54.5, "ask_iv": 56.5}, + "BTC-27MAR26-67500-P": {"bid": 260.0, "ask": 320.0, "mark_price": 291.75, "bid_iv": 54.2, "ask_iv": 56.2}, + "BTC-27MAR26-68000-C": {"bid": 4805.0, "ask": 4910.0, "mark_price": 4890.0, "bid_iv": 54.7, "ask_iv": 56.9}, + "BTC-27MAR26-68000-P": {"bid": 1602.0, "ask": 1673.0, "mark_price": 1673.0, "bid_iv": 55.0, "ask_iv": 56.5}, + "BTC-27MAR26-68500-C": {"bid": 4400.0, "ask": 4550.0, "mark_price": 4480.0, "bid_iv": 54.5, "ask_iv": 56.5}, + "BTC-27MAR26-68500-P": {"bid": 780.0, "ask": 920.0, "mark_price": 850.42, "bid_iv": 54.2, "ask_iv": 56.2}, + "BTC-27MAR26-69000-C": {"bid": 4165.0, "ask": 4235.0, "mark_price": 4214.0, "bid_iv": 54.3, "ask_iv": 55.7}, + "BTC-27MAR26-69000-P": {"bid": 1922.0, "ask": 1993.0, "mark_price": 1993.0, "bid_iv": 53.9, "ask_iv": 55.3}, + "BTC-27MAR26-70000-C": {"bid": 3523.0, "ask": 3594.0, "mark_price": 3573.0, "bid_iv": 53.0, "ask_iv": 54.4}, + "BTC-27MAR26-70000-P": {"bid": 2314.0, "ask": 2349.0, "mark_price": 2349.0, "bid_iv": 53.3, "ask_iv": 54.0}, + "BTC-27MAR26-71000-C": {"bid": 2954.0, "ask": 3025.0, "mark_price": 2982.0, "bid_iv": 52.1, "ask_iv": 53.4}, + "BTC-27MAR26-71000-P": {"bid": 2741.0, "ask": 2776.0, "mark_price": 2762.0, "bid_iv": 52.3, "ask_iv": 53.0}, + "BTC-27MAR26-72000-C": {"bid": 2455.0, "ask": 2527.0, "mark_price": 2498.0, "bid_iv": 51.5, "ask_iv": 52.8}, + "BTC-27MAR26-72000-P": {"bid": 3202.0, "ask": 3274.0, "mark_price": 3274.0, "bid_iv": 51.6, "ask_iv": 52.3}, + "BTC-27MAR26-73000-C": {"bid": 2029.0, "ask": 2064.0, "mark_price": 2064.0, "bid_iv": 51.2, "ask_iv": 51.8}, + "BTC-27MAR26-73000-P": {"bid": 3772.0, "ask": 3844.0, "mark_price": 3837.0, "bid_iv": 50.6, "ask_iv": 51.9}, + "BTC-27MAR26-74000-C": {"bid": 1637.0, "ask": 1673.0, "mark_price": 1673.0, "bid_iv": 50.5, "ask_iv": 51.2}, + "BTC-27MAR26-74000-P": {"bid": 4342.0, "ask": 4520.0, "mark_price": 4449.0, "bid_iv": 49.1, "ask_iv": 52.6} } } diff --git a/mock_data/option_pricing/BTC.json b/mock_data/option_pricing/BTC.json index f5f5622..7559123 100644 --- a/mock_data/option_pricing/BTC.json +++ b/mock_data/option_pricing/BTC.json @@ -1,50 +1,22 @@ { - "expiry_time": "2026-02-26 08:00:00Z", + "expiry_time": "2026-03-27 08:00:00Z", "put_options": { - "62500": 0.0, - "63000": 0.0, - "63500": 0.0, - "64000": 0.10795190000000221, - "64500": 0.4592322000000022, - "65000": 0.992654400000006, - "65500": 4.376132700000007, - "66000": 17.907833700000005, - "66500": 57.31372180000003, - "67000": 140.35670930000003, - "67500": 291.7476201, - "68000": 526.5873039999999, - "68500": 850.4206995, - "69000": 1246.7398028999999, - "69500": 1692.7661696000002, - "70000": 2168.4426052999997, - "70500": 2658.4494644, - "71000": 3154.7213807999997, - "71500": 3653.5146249000004, - "72000": 4153.312754800001, - "72500": 4653.312754800001 + "68000": 1673.0, + "69000": 1993.0, + "70000": 2349.0, + "71000": 2762.0, + "72000": 3274.0, + "73000": 3837.0, + "74000": 4449.0 }, "call_options": { - "62500": 5346.687245199999, - "63000": 4846.687245199999, - "63500": 4346.687245199999, - "64000": 3846.7951970999993, - "64500": 3347.1464774, - "65000": 2847.6798995999998, - "65500": 2351.0633779, - "66000": 1864.5950789, - "66500": 1404.0009670000002, - "67000": 987.0439545, - "67500": 638.4348653, - "68000": 373.2745492, - "68500": 197.1079447, - "69000": 93.42704809999996, - "69500": 39.45341479999998, - "70000": 15.129850500000007, - "70500": 5.1367096000000005, - "71000": 1.408625999999995, - "71500": 0.20187010000000155, - "72000": 0.0, - "72500": 0.0 + "68000": 4890.0, + "69000": 4214.0, + "70000": 3573.0, + "71000": 2982.0, + "72000": 2498.0, + "73000": 2064.0, + "74000": 1673.0 }, - "current_price": 67723.5 + "current_price": 71181.0 } \ No newline at end of file diff --git a/mock_data/prediction_percentiles/BTC_1h.json b/mock_data/prediction_percentiles/BTC_1h.json index 6375e01..c037d16 100644 --- a/mock_data/prediction_percentiles/BTC_1h.json +++ b/mock_data/prediction_percentiles/BTC_1h.json @@ -1,677 +1,677 @@ { - "current_price": 67665.23054866, + "current_price": 71210.12, "forecast_future": { "percentiles": [ { - "0.2": 67665.23, - "0.5": 67665.23, - "0.8": 67665.23, - "0.05": 67665.23, - "0.35": 67665.23, - "0.65": 67665.23, - "0.95": 67665.23, - "0.005": 67665.23, - "0.995": 67665.23 - }, - { - "0.2": 67628.23, - "0.5": 67665.62, - "0.8": 67704.68, - "0.05": 67586.24, - "0.35": 67647.81, - "0.65": 67681.68, - "0.95": 67756.17, - "0.005": 67537.41, - "0.995": 67793.87 - }, - { - "0.2": 67612.26, - "0.5": 67665.9, - "0.8": 67722.87, - "0.05": 67553.61, - "0.35": 67642.42, - "0.65": 67690.74, - "0.95": 67786.31, - "0.005": 67480.18, - "0.995": 67875.81 - }, - { - "0.2": 67602.09, - "0.5": 67666.14, - "0.8": 67736.87, - "0.05": 67529.41, - "0.35": 67636.7, - "0.65": 67696.45, - "0.95": 67817.28, - "0.005": 67440.63, - "0.995": 67930.39 - }, - { - "0.2": 67588.54, - "0.5": 67665.81, - "0.8": 67746.44, - "0.05": 67511.8, - "0.35": 67631.74, - "0.65": 67700.68, - "0.95": 67842.44, - "0.005": 67419.56, - "0.995": 67973.72 - }, - { - "0.2": 67579.0, - "0.5": 67666.39, - "0.8": 67755.76, - "0.05": 67492.06, - "0.35": 67626.58, - "0.65": 67704.65, - "0.95": 67863.51, - "0.005": 67381.22, - "0.995": 68006.54 - }, - { - "0.2": 67571.58, - "0.5": 67668.81, - "0.8": 67765.91, - "0.05": 67477.34, - "0.35": 67624.78, - "0.65": 67710.63, - "0.95": 67876.04, - "0.005": 67353.52, - "0.995": 68023.06 - }, - { - "0.2": 67563.64, - "0.5": 67668.06, - "0.8": 67776.13, - "0.05": 67460.61, - "0.35": 67621.63, - "0.65": 67717.06, - "0.95": 67892.27, - "0.005": 67325.32, - "0.995": 68056.69 - }, - { - "0.2": 67556.54, - "0.5": 67670.18, - "0.8": 67783.08, - "0.05": 67447.56, - "0.35": 67618.53, - "0.65": 67719.92, - "0.95": 67906.81, - "0.005": 67299.57, - "0.995": 68090.88 - }, - { - "0.2": 67548.7, - "0.5": 67669.4, - "0.8": 67789.06, - "0.05": 67434.17, - "0.35": 67613.81, - "0.65": 67723.79, - "0.95": 67925.62, - "0.005": 67282.76, - "0.995": 68097.21 - }, - { - "0.2": 67544.3, - "0.5": 67672.08, - "0.8": 67797.17, - "0.05": 67424.08, - "0.35": 67612.14, - "0.65": 67727.95, - "0.95": 67935.37, - "0.005": 67264.88, - "0.995": 68117.71 - }, - { - "0.2": 67540.57, - "0.5": 67672.36, - "0.8": 67804.05, - "0.05": 67411.71, - "0.35": 67610.54, - "0.65": 67731.47, - "0.95": 67944.72, - "0.005": 67249.65, - "0.995": 68131.14 - }, - { - "0.2": 67534.48, - "0.5": 67671.67, - "0.8": 67809.79, - "0.05": 67404.88, - "0.35": 67609.89, - "0.65": 67734.57, - "0.95": 67960.23, - "0.005": 67225.69, - "0.995": 68153.0 - }, - { - "0.2": 67528.36, - "0.5": 67671.61, - "0.8": 67815.72, - "0.05": 67393.54, - "0.35": 67605.57, - "0.65": 67737.25, - "0.95": 67968.03, - "0.005": 67218.4, - "0.995": 68181.25 - }, - { - "0.2": 67525.73, - "0.5": 67671.46, - "0.8": 67822.59, - "0.05": 67381.11, - "0.35": 67604.04, - "0.65": 67739.02, - "0.95": 67978.68, - "0.005": 67189.7, - "0.995": 68197.69 - }, - { - "0.2": 67522.09, - "0.5": 67673.2, - "0.8": 67828.56, - "0.05": 67370.9, - "0.35": 67601.07, - "0.65": 67742.77, - "0.95": 67988.57, - "0.005": 67179.3, - "0.995": 68191.46 - }, - { - "0.2": 67517.06, - "0.5": 67673.47, - "0.8": 67836.47, - "0.05": 67362.62, - "0.35": 67601.25, - "0.65": 67746.82, - "0.95": 67998.87, - "0.005": 67168.33, - "0.995": 68214.65 - }, - { - "0.2": 67511.66, - "0.5": 67672.96, - "0.8": 67841.54, - "0.05": 67350.39, - "0.35": 67599.79, - "0.65": 67748.71, - "0.95": 68010.75, - "0.005": 67142.84, - "0.995": 68236.01 - }, - { - "0.2": 67505.97, - "0.5": 67674.72, - "0.8": 67848.12, - "0.05": 67344.94, - "0.35": 67597.01, - "0.65": 67753.25, - "0.95": 68022.93, - "0.005": 67135.72, - "0.995": 68257.75 - }, - { - "0.2": 67502.43, - "0.5": 67676.29, - "0.8": 67852.39, - "0.05": 67335.23, - "0.35": 67595.62, - "0.65": 67754.55, - "0.95": 68035.22, - "0.005": 67115.18, - "0.995": 68268.1 - }, - { - "0.2": 67500.49, - "0.5": 67675.83, - "0.8": 67858.64, - "0.05": 67328.97, - "0.35": 67594.44, - "0.65": 67754.77, - "0.95": 68047.46, - "0.005": 67093.67, - "0.995": 68289.46 - }, - { - "0.2": 67496.55, - "0.5": 67675.64, - "0.8": 67864.99, - "0.05": 67321.7, - "0.35": 67593.53, - "0.65": 67760.18, - "0.95": 68060.57, - "0.005": 67085.23, - "0.995": 68302.17 - }, - { - "0.2": 67490.88, - "0.5": 67675.95, - "0.8": 67869.07, - "0.05": 67312.22, - "0.35": 67591.34, - "0.65": 67761.96, - "0.95": 68064.1, - "0.005": 67068.72, - "0.995": 68314.73 - }, - { - "0.2": 67489.24, - "0.5": 67676.86, - "0.8": 67872.15, - "0.05": 67303.3, - "0.35": 67590.15, - "0.65": 67765.75, - "0.95": 68070.27, - "0.005": 67051.35, - "0.995": 68332.89 - }, - { - "0.2": 67485.09, - "0.5": 67677.92, - "0.8": 67876.83, - "0.05": 67294.87, - "0.35": 67588.14, - "0.65": 67768.78, - "0.95": 68082.89, - "0.005": 67041.56, - "0.995": 68353.34 - }, - { - "0.2": 67483.19, - "0.5": 67678.63, - "0.8": 67883.23, - "0.05": 67286.85, - "0.35": 67587.9, - "0.65": 67771.02, - "0.95": 68089.28, - "0.005": 67027.0, - "0.995": 68358.46 - }, - { - "0.2": 67479.53, - "0.5": 67679.26, - "0.8": 67886.85, - "0.05": 67283.84, - "0.35": 67587.07, - "0.65": 67774.07, - "0.95": 68100.13, - "0.005": 67007.15, - "0.995": 68367.91 - }, - { - "0.2": 67475.8, - "0.5": 67681.38, - "0.8": 67894.32, - "0.05": 67274.92, - "0.35": 67584.9, - "0.65": 67775.26, - "0.95": 68105.4, - "0.005": 67007.23, - "0.995": 68377.87 - }, - { - "0.2": 67473.13, - "0.5": 67679.03, - "0.8": 67896.4, - "0.05": 67272.22, - "0.35": 67584.62, - "0.65": 67776.86, - "0.95": 68115.62, - "0.005": 66991.46, - "0.995": 68395.16 - }, - { - "0.2": 67468.67, - "0.5": 67680.92, - "0.8": 67897.8, - "0.05": 67263.01, - "0.35": 67582.27, - "0.65": 67780.49, - "0.95": 68122.7, - "0.005": 66982.79, - "0.995": 68411.98 - }, - { - "0.2": 67463.74, - "0.5": 67681.33, - "0.8": 67903.23, - "0.05": 67251.12, - "0.35": 67581.04, - "0.65": 67782.28, - "0.95": 68130.79, - "0.005": 66968.06, - "0.995": 68436.4 - }, - { - "0.2": 67462.53, - "0.5": 67680.65, - "0.8": 67907.99, - "0.05": 67249.16, - "0.35": 67578.38, - "0.65": 67786.47, - "0.95": 68144.18, - "0.005": 66955.36, - "0.995": 68446.56 - }, - { - "0.2": 67460.67, - "0.5": 67682.23, - "0.8": 67913.71, - "0.05": 67241.38, - "0.35": 67578.89, - "0.65": 67788.82, - "0.95": 68154.12, - "0.005": 66948.27, - "0.995": 68454.35 - }, - { - "0.2": 67457.4, - "0.5": 67684.16, - "0.8": 67915.19, - "0.05": 67232.25, - "0.35": 67576.8, - "0.65": 67790.0, - "0.95": 68161.79, - "0.005": 66946.18, - "0.995": 68477.6 - }, - { - "0.2": 67454.35, - "0.5": 67682.25, - "0.8": 67918.78, - "0.05": 67220.35, - "0.35": 67578.53, - "0.65": 67792.84, - "0.95": 68166.4, - "0.005": 66944.59, - "0.995": 68505.6 - }, - { - "0.2": 67453.77, - "0.5": 67682.11, - "0.8": 67923.21, - "0.05": 67213.93, - "0.35": 67576.74, - "0.65": 67792.88, - "0.95": 68175.83, - "0.005": 66924.63, - "0.995": 68512.52 - }, - { - "0.2": 67447.96, - "0.5": 67686.02, - "0.8": 67927.74, - "0.05": 67216.42, - "0.35": 67575.73, - "0.65": 67795.36, - "0.95": 68182.77, - "0.005": 66922.7, - "0.995": 68534.77 - }, - { - "0.2": 67450.65, - "0.5": 67684.84, - "0.8": 67930.19, - "0.05": 67209.62, - "0.35": 67577.07, - "0.65": 67796.34, - "0.95": 68186.57, - "0.005": 66910.07, - "0.995": 68539.0 - }, - { - "0.2": 67446.71, - "0.5": 67684.62, - "0.8": 67933.06, - "0.05": 67201.44, - "0.35": 67578.49, - "0.65": 67799.0, - "0.95": 68193.62, - "0.005": 66898.85, - "0.995": 68557.32 - }, - { - "0.2": 67442.65, - "0.5": 67684.69, - "0.8": 67937.28, - "0.05": 67198.28, - "0.35": 67578.63, - "0.65": 67799.81, - "0.95": 68202.76, - "0.005": 66887.4, - "0.995": 68559.65 - }, - { - "0.2": 67441.72, - "0.5": 67685.04, - "0.8": 67939.9, - "0.05": 67193.33, - "0.35": 67578.03, - "0.65": 67801.68, - "0.95": 68205.21, - "0.005": 66883.15, - "0.995": 68569.17 - }, - { - "0.2": 67437.71, - "0.5": 67686.95, - "0.8": 67943.92, - "0.05": 67189.54, - "0.35": 67576.96, - "0.65": 67804.04, - "0.95": 68215.95, - "0.005": 66857.25, - "0.995": 68574.8 - }, - { - "0.2": 67435.26, - "0.5": 67687.48, - "0.8": 67949.15, - "0.05": 67186.35, - "0.35": 67573.76, - "0.65": 67802.4, - "0.95": 68223.22, - "0.005": 66855.24, - "0.995": 68596.18 - }, - { - "0.2": 67435.37, - "0.5": 67686.15, - "0.8": 67952.39, - "0.05": 67176.61, - "0.35": 67572.9, - "0.65": 67805.49, - "0.95": 68231.32, - "0.005": 66834.77, - "0.995": 68627.06 - }, - { - "0.2": 67430.14, - "0.5": 67686.13, - "0.8": 67955.81, - "0.05": 67169.05, - "0.35": 67571.6, - "0.65": 67806.56, - "0.95": 68238.78, - "0.005": 66816.81, - "0.995": 68654.51 - }, - { - "0.2": 67428.91, - "0.5": 67686.96, - "0.8": 67957.23, - "0.05": 67163.49, - "0.35": 67571.63, - "0.65": 67809.02, - "0.95": 68248.89, - "0.005": 66810.88, - "0.995": 68620.26 - }, - { - "0.2": 67427.1, - "0.5": 67688.66, - "0.8": 67958.97, - "0.05": 67154.01, - "0.35": 67572.44, - "0.65": 67809.44, - "0.95": 68259.22, - "0.005": 66791.02, - "0.995": 68637.03 - }, - { - "0.2": 67425.07, - "0.5": 67688.81, - "0.8": 67964.89, - "0.05": 67149.61, - "0.35": 67569.12, - "0.65": 67811.39, - "0.95": 68263.26, - "0.005": 66767.87, - "0.995": 68664.27 - }, - { - "0.2": 67420.9, - "0.5": 67689.67, - "0.8": 67968.18, - "0.05": 67149.55, - "0.35": 67565.83, - "0.65": 67814.21, - "0.95": 68261.51, - "0.005": 66772.56, - "0.995": 68659.75 - }, - { - "0.2": 67416.93, - "0.5": 67689.12, - "0.8": 67969.62, - "0.05": 67150.25, - "0.35": 67565.85, - "0.65": 67814.29, - "0.95": 68269.24, - "0.005": 66748.03, - "0.995": 68666.25 - }, - { - "0.2": 67414.82, - "0.5": 67689.15, - "0.8": 67974.49, - "0.05": 67136.44, - "0.35": 67565.33, - "0.65": 67815.9, - "0.95": 68274.69, - "0.005": 66746.4, - "0.995": 68688.94 - }, - { - "0.2": 67417.13, - "0.5": 67690.77, - "0.8": 67976.19, - "0.05": 67137.19, - "0.35": 67566.13, - "0.65": 67818.7, - "0.95": 68287.83, - "0.005": 66743.16, - "0.995": 68721.25 - }, - { - "0.2": 67411.66, - "0.5": 67692.25, - "0.8": 67980.38, - "0.05": 67132.24, - "0.35": 67567.82, - "0.65": 67822.33, - "0.95": 68290.63, - "0.005": 66731.19, - "0.995": 68704.57 - }, - { - "0.2": 67410.9, - "0.5": 67694.57, - "0.8": 67984.8, - "0.05": 67127.94, - "0.35": 67566.69, - "0.65": 67822.14, - "0.95": 68299.88, - "0.005": 66723.32, - "0.995": 68711.79 - }, - { - "0.2": 67409.08, - "0.5": 67693.76, - "0.8": 67988.83, - "0.05": 67125.03, - "0.35": 67565.38, - "0.65": 67824.28, - "0.95": 68294.93, - "0.005": 66718.86, - "0.995": 68712.56 - }, - { - "0.2": 67407.1, - "0.5": 67693.02, - "0.8": 67989.85, - "0.05": 67115.74, - "0.35": 67564.41, - "0.65": 67828.68, - "0.95": 68307.05, - "0.005": 66734.75, - "0.995": 68711.34 - }, - { - "0.2": 67404.68, - "0.5": 67692.13, - "0.8": 67991.48, - "0.05": 67102.69, - "0.35": 67562.52, - "0.65": 67830.57, - "0.95": 68316.05, - "0.005": 66722.34, - "0.995": 68715.66 - }, - { - "0.2": 67401.34, - "0.5": 67691.7, - "0.8": 67994.44, - "0.05": 67093.25, - "0.35": 67562.17, - "0.65": 67833.07, - "0.95": 68322.98, - "0.005": 66715.64, - "0.995": 68725.02 - }, - { - "0.2": 67398.59, - "0.5": 67692.32, - "0.8": 67999.57, - "0.05": 67092.63, - "0.35": 67561.03, - "0.65": 67837.93, - "0.95": 68325.64, - "0.005": 66692.43, - "0.995": 68732.25 - }, - { - "0.2": 67397.33, - "0.5": 67697.29, - "0.8": 68000.41, - "0.05": 67089.27, - "0.35": 67558.17, - "0.65": 67836.1, - "0.95": 68331.33, - "0.005": 66695.34, - "0.995": 68766.72 - }, - { - "0.2": 67395.74, - "0.5": 67698.01, - "0.8": 68006.93, - "0.05": 67084.35, - "0.35": 67557.27, - "0.65": 67838.25, - "0.95": 68337.71, - "0.005": 66676.6, - "0.995": 68780.94 + "0.2": 71210.12, + "0.5": 71210.12, + "0.8": 71210.12, + "0.05": 71210.12, + "0.35": 71210.12, + "0.65": 71210.12, + "0.95": 71210.12, + "0.005": 71210.12, + "0.995": 71210.12 + }, + { + "0.2": 71171.18, + "0.5": 71210.53, + "0.8": 71251.64, + "0.05": 71126.99, + "0.35": 71191.79, + "0.65": 71227.43, + "0.95": 71305.82, + "0.005": 71075.6, + "0.995": 71345.5 + }, + { + "0.2": 71154.37, + "0.5": 71210.82, + "0.8": 71270.78, + "0.05": 71092.65, + "0.35": 71186.11, + "0.65": 71236.97, + "0.95": 71337.54, + "0.005": 71015.38, + "0.995": 71431.73 + }, + { + "0.2": 71143.67, + "0.5": 71211.08, + "0.8": 71285.51, + "0.05": 71067.18, + "0.35": 71180.09, + "0.65": 71242.98, + "0.95": 71370.14, + "0.005": 70973.75, + "0.995": 71489.17 + }, + { + "0.2": 71129.41, + "0.5": 71210.73, + "0.8": 71295.58, + "0.05": 71048.65, + "0.35": 71174.88, + "0.65": 71247.43, + "0.95": 71396.61, + "0.005": 70951.58, + "0.995": 71534.77 + }, + { + "0.2": 71119.37, + "0.5": 71211.34, + "0.8": 71305.39, + "0.05": 71027.88, + "0.35": 71169.44, + "0.65": 71251.6, + "0.95": 71418.79, + "0.005": 70911.23, + "0.995": 71569.31 + }, + { + "0.2": 71111.56, + "0.5": 71213.89, + "0.8": 71316.07, + "0.05": 71012.39, + "0.35": 71167.55, + "0.65": 71257.9, + "0.95": 71431.97, + "0.005": 70882.08, + "0.995": 71586.7 + }, + { + "0.2": 71103.21, + "0.5": 71213.1, + "0.8": 71326.83, + "0.05": 70994.78, + "0.35": 71164.24, + "0.65": 71264.66, + "0.95": 71449.05, + "0.005": 70852.4, + "0.995": 71622.09 + }, + { + "0.2": 71095.74, + "0.5": 71215.33, + "0.8": 71334.14, + "0.05": 70981.05, + "0.35": 71160.97, + "0.65": 71267.67, + "0.95": 71464.36, + "0.005": 70825.3, + "0.995": 71658.07 + }, + { + "0.2": 71087.48, + "0.5": 71214.51, + "0.8": 71340.44, + "0.05": 70966.95, + "0.35": 71156.01, + "0.65": 71271.75, + "0.95": 71484.15, + "0.005": 70807.61, + "0.995": 71664.73 + }, + { + "0.2": 71082.85, + "0.5": 71217.33, + "0.8": 71348.97, + "0.05": 70956.34, + "0.35": 71154.25, + "0.65": 71276.13, + "0.95": 71494.41, + "0.005": 70788.8, + "0.995": 71686.3 + }, + { + "0.2": 71078.93, + "0.5": 71217.62, + "0.8": 71356.21, + "0.05": 70943.32, + "0.35": 71152.56, + "0.65": 71279.83, + "0.95": 71504.25, + "0.005": 70772.77, + "0.995": 71700.44 + }, + { + "0.2": 71072.52, + "0.5": 71216.9, + "0.8": 71362.25, + "0.05": 70936.13, + "0.35": 71151.88, + "0.65": 71283.09, + "0.95": 71520.57, + "0.005": 70747.55, + "0.995": 71723.44 + }, + { + "0.2": 71066.08, + "0.5": 71216.83, + "0.8": 71368.49, + "0.05": 70924.2, + "0.35": 71147.33, + "0.65": 71285.91, + "0.95": 71528.78, + "0.005": 70739.88, + "0.995": 71753.17 + }, + { + "0.2": 71063.31, + "0.5": 71216.68, + "0.8": 71375.72, + "0.05": 70911.11, + "0.35": 71145.72, + "0.65": 71287.78, + "0.95": 71539.99, + "0.005": 70709.68, + "0.995": 71770.47 + }, + { + "0.2": 71059.48, + "0.5": 71218.51, + "0.8": 71382.01, + "0.05": 70900.37, + "0.35": 71142.6, + "0.65": 71291.72, + "0.95": 71550.4, + "0.005": 70698.73, + "0.995": 71763.92 + }, + { + "0.2": 71054.19, + "0.5": 71218.79, + "0.8": 71390.33, + "0.05": 70891.66, + "0.35": 71142.79, + "0.65": 71295.98, + "0.95": 71561.24, + "0.005": 70687.19, + "0.995": 71788.32 + }, + { + "0.2": 71048.5, + "0.5": 71218.25, + "0.8": 71395.67, + "0.05": 70878.79, + "0.35": 71141.25, + "0.65": 71297.97, + "0.95": 71573.74, + "0.005": 70660.36, + "0.995": 71810.8 + }, + { + "0.2": 71042.52, + "0.5": 71220.11, + "0.8": 71402.59, + "0.05": 70873.05, + "0.35": 71138.33, + "0.65": 71302.75, + "0.95": 71586.56, + "0.005": 70652.87, + "0.995": 71833.68 + }, + { + "0.2": 71038.79, + "0.5": 71221.76, + "0.8": 71407.08, + "0.05": 70862.83, + "0.35": 71136.86, + "0.65": 71304.12, + "0.95": 71599.49, + "0.005": 70631.25, + "0.995": 71844.57 + }, + { + "0.2": 71036.75, + "0.5": 71221.27, + "0.8": 71413.66, + "0.05": 70856.24, + "0.35": 71135.62, + "0.65": 71304.35, + "0.95": 71612.37, + "0.005": 70608.62, + "0.995": 71867.05 + }, + { + "0.2": 71032.6, + "0.5": 71221.07, + "0.8": 71420.34, + "0.05": 70848.59, + "0.35": 71134.66, + "0.65": 71310.04, + "0.95": 71626.17, + "0.005": 70599.73, + "0.995": 71880.43 + }, + { + "0.2": 71026.64, + "0.5": 71221.4, + "0.8": 71424.64, + "0.05": 70838.62, + "0.35": 71132.36, + "0.65": 71311.92, + "0.95": 71629.89, + "0.005": 70582.36, + "0.995": 71893.65 + }, + { + "0.2": 71024.91, + "0.5": 71222.36, + "0.8": 71427.88, + "0.05": 70829.23, + "0.35": 71131.11, + "0.65": 71315.91, + "0.95": 71636.38, + "0.005": 70564.08, + "0.995": 71912.76 + }, + { + "0.2": 71020.54, + "0.5": 71223.47, + "0.8": 71432.81, + "0.05": 70820.36, + "0.35": 71128.99, + "0.65": 71319.09, + "0.95": 71649.66, + "0.005": 70553.78, + "0.995": 71934.28 + }, + { + "0.2": 71018.54, + "0.5": 71224.22, + "0.8": 71439.54, + "0.05": 70811.92, + "0.35": 71128.74, + "0.65": 71321.45, + "0.95": 71656.38, + "0.005": 70538.45, + "0.995": 71939.67 + }, + { + "0.2": 71014.69, + "0.5": 71224.88, + "0.8": 71443.35, + "0.05": 70808.75, + "0.35": 71127.86, + "0.65": 71324.66, + "0.95": 71667.8, + "0.005": 70517.56, + "0.995": 71949.61 + }, + { + "0.2": 71010.77, + "0.5": 71227.12, + "0.8": 71451.21, + "0.05": 70799.36, + "0.35": 71125.58, + "0.65": 71325.91, + "0.95": 71673.35, + "0.005": 70517.65, + "0.995": 71960.09 + }, + { + "0.2": 71007.96, + "0.5": 71224.64, + "0.8": 71453.4, + "0.05": 70796.52, + "0.35": 71125.29, + "0.65": 71327.6, + "0.95": 71684.1, + "0.005": 70501.05, + "0.995": 71978.29 + }, + { + "0.2": 71003.26, + "0.5": 71226.63, + "0.8": 71454.87, + "0.05": 70786.83, + "0.35": 71122.81, + "0.65": 71331.42, + "0.95": 71691.56, + "0.005": 70491.93, + "0.995": 71995.99 + }, + { + "0.2": 70998.07, + "0.5": 71227.06, + "0.8": 71460.59, + "0.05": 70774.31, + "0.35": 71121.52, + "0.65": 71333.3, + "0.95": 71700.07, + "0.005": 70476.43, + "0.995": 72021.69 + }, + { + "0.2": 70996.8, + "0.5": 71226.35, + "0.8": 71465.6, + "0.05": 70772.25, + "0.35": 71118.72, + "0.65": 71337.71, + "0.95": 71714.16, + "0.005": 70463.06, + "0.995": 72032.38 + }, + { + "0.2": 70994.84, + "0.5": 71228.01, + "0.8": 71471.62, + "0.05": 70764.06, + "0.35": 71119.26, + "0.65": 71340.18, + "0.95": 71724.62, + "0.005": 70455.6, + "0.995": 72040.58 + }, + { + "0.2": 70991.4, + "0.5": 71230.04, + "0.8": 71473.17, + "0.05": 70754.46, + "0.35": 71117.06, + "0.65": 71341.43, + "0.95": 71732.69, + "0.005": 70453.4, + "0.995": 72065.05 + }, + { + "0.2": 70988.19, + "0.5": 71228.03, + "0.8": 71476.95, + "0.05": 70741.93, + "0.35": 71118.88, + "0.65": 71344.41, + "0.95": 71737.55, + "0.005": 70451.73, + "0.995": 72094.52 + }, + { + "0.2": 70987.58, + "0.5": 71227.88, + "0.8": 71481.61, + "0.05": 70735.18, + "0.35": 71116.99, + "0.65": 71344.46, + "0.95": 71747.47, + "0.005": 70430.72, + "0.995": 72101.8 + }, + { + "0.2": 70981.47, + "0.5": 71232.0, + "0.8": 71486.38, + "0.05": 70737.8, + "0.35": 71115.93, + "0.65": 71347.07, + "0.95": 71754.77, + "0.005": 70428.69, + "0.995": 72125.21 + }, + { + "0.2": 70984.3, + "0.5": 71230.76, + "0.8": 71488.96, + "0.05": 70730.64, + "0.35": 71117.34, + "0.65": 71348.1, + "0.95": 71758.77, + "0.005": 70415.4, + "0.995": 72129.67 + }, + { + "0.2": 70980.15, + "0.5": 71230.53, + "0.8": 71491.98, + "0.05": 70722.03, + "0.35": 71118.84, + "0.65": 71350.9, + "0.95": 71766.19, + "0.005": 70403.59, + "0.995": 72148.94 + }, + { + "0.2": 70975.88, + "0.5": 71230.6, + "0.8": 71496.42, + "0.05": 70718.71, + "0.35": 71118.98, + "0.65": 71351.75, + "0.95": 71775.81, + "0.005": 70391.54, + "0.995": 72151.4 + }, + { + "0.2": 70974.9, + "0.5": 71230.97, + "0.8": 71499.18, + "0.05": 70713.5, + "0.35": 71118.35, + "0.65": 71353.72, + "0.95": 71778.39, + "0.005": 70387.07, + "0.995": 72161.42 + }, + { + "0.2": 70970.68, + "0.5": 71232.98, + "0.8": 71503.41, + "0.05": 70709.51, + "0.35": 71117.23, + "0.65": 71356.2, + "0.95": 71789.69, + "0.005": 70359.81, + "0.995": 72167.34 + }, + { + "0.2": 70968.1, + "0.5": 71233.54, + "0.8": 71508.91, + "0.05": 70706.15, + "0.35": 71113.86, + "0.65": 71354.48, + "0.95": 71797.34, + "0.005": 70357.7, + "0.995": 72189.84 + }, + { + "0.2": 70968.22, + "0.5": 71232.14, + "0.8": 71512.32, + "0.05": 70695.9, + "0.35": 71112.95, + "0.65": 71357.73, + "0.95": 71805.87, + "0.005": 70336.15, + "0.995": 72222.34 + }, + { + "0.2": 70962.71, + "0.5": 71232.11, + "0.8": 71515.92, + "0.05": 70687.95, + "0.35": 71111.58, + "0.65": 71358.85, + "0.95": 71813.72, + "0.005": 70317.25, + "0.995": 72251.23 + }, + { + "0.2": 70961.42, + "0.5": 71232.99, + "0.8": 71517.42, + "0.05": 70682.09, + "0.35": 71111.62, + "0.65": 71361.44, + "0.95": 71824.36, + "0.005": 70311.01, + "0.995": 72215.18 + }, + { + "0.2": 70959.51, + "0.5": 71234.78, + "0.8": 71519.25, + "0.05": 70672.12, + "0.35": 71112.47, + "0.65": 71361.88, + "0.95": 71835.23, + "0.005": 70290.11, + "0.995": 72232.83 + }, + { + "0.2": 70957.38, + "0.5": 71234.93, + "0.8": 71525.48, + "0.05": 70667.49, + "0.35": 71108.97, + "0.65": 71363.94, + "0.95": 71839.48, + "0.005": 70265.75, + "0.995": 72261.5 + }, + { + "0.2": 70952.99, + "0.5": 71235.84, + "0.8": 71528.94, + "0.05": 70667.42, + "0.35": 71105.51, + "0.65": 71366.9, + "0.95": 71837.64, + "0.005": 70270.68, + "0.995": 72256.74 + }, + { + "0.2": 70948.81, + "0.5": 71235.26, + "0.8": 71530.46, + "0.05": 70668.16, + "0.35": 71105.53, + "0.65": 71366.99, + "0.95": 71845.77, + "0.005": 70244.87, + "0.995": 72263.58 + }, + { + "0.2": 70946.59, + "0.5": 71235.29, + "0.8": 71535.58, + "0.05": 70653.63, + "0.35": 71104.99, + "0.65": 71368.68, + "0.95": 71851.51, + "0.005": 70243.15, + "0.995": 72287.46 + }, + { + "0.2": 70949.02, + "0.5": 71237.0, + "0.8": 71537.37, + "0.05": 70654.42, + "0.35": 71105.83, + "0.65": 71371.63, + "0.95": 71865.34, + "0.005": 70239.74, + "0.995": 72321.46 + }, + { + "0.2": 70943.27, + "0.5": 71238.56, + "0.8": 71541.78, + "0.05": 70649.21, + "0.35": 71107.61, + "0.65": 71375.45, + "0.95": 71868.28, + "0.005": 70227.15, + "0.995": 72303.91 + }, + { + "0.2": 70942.47, + "0.5": 71241.0, + "0.8": 71546.43, + "0.05": 70644.68, + "0.35": 71106.42, + "0.65": 71375.25, + "0.95": 71878.02, + "0.005": 70218.86, + "0.995": 72311.51 + }, + { + "0.2": 70940.55, + "0.5": 71240.14, + "0.8": 71550.67, + "0.05": 70641.62, + "0.35": 71105.04, + "0.65": 71377.5, + "0.95": 71872.81, + "0.005": 70214.17, + "0.995": 72312.32 + }, + { + "0.2": 70938.47, + "0.5": 71239.37, + "0.8": 71551.75, + "0.05": 70631.84, + "0.35": 71104.02, + "0.65": 71382.13, + "0.95": 71885.56, + "0.005": 70230.89, + "0.995": 72311.03 + }, + { + "0.2": 70935.92, + "0.5": 71238.43, + "0.8": 71553.46, + "0.05": 70618.11, + "0.35": 71102.03, + "0.65": 71384.12, + "0.95": 71895.04, + "0.005": 70217.83, + "0.995": 72315.58 + }, + { + "0.2": 70932.4, + "0.5": 71237.98, + "0.8": 71556.58, + "0.05": 70608.17, + "0.35": 71101.66, + "0.65": 71386.75, + "0.95": 71902.33, + "0.005": 70210.78, + "0.995": 72325.43 + }, + { + "0.2": 70929.51, + "0.5": 71238.63, + "0.8": 71561.98, + "0.05": 70607.52, + "0.35": 71100.46, + "0.65": 71391.87, + "0.95": 71905.13, + "0.005": 70186.36, + "0.995": 72333.04 + }, + { + "0.2": 70928.18, + "0.5": 71243.86, + "0.8": 71562.86, + "0.05": 70603.99, + "0.35": 71097.45, + "0.65": 71389.94, + "0.95": 71911.12, + "0.005": 70189.42, + "0.995": 72369.32 + }, + { + "0.2": 70926.51, + "0.5": 71244.62, + "0.8": 71569.72, + "0.05": 70598.81, + "0.35": 71096.5, + "0.65": 71392.2, + "0.95": 71917.83, + "0.005": 70169.7, + "0.995": 72384.28 } ] } diff --git a/mock_data/prediction_percentiles/BTC_24h.json b/mock_data/prediction_percentiles/BTC_24h.json index 12c92c1..5e39a6a 100644 --- a/mock_data/prediction_percentiles/BTC_24h.json +++ b/mock_data/prediction_percentiles/BTC_24h.json @@ -1,3185 +1,3185 @@ { - "current_price": 67637.56, + "current_price": 71181.0, "forecast_future": { "percentiles": [ { - "0.2": 67637.56, - "0.5": 67637.56, - "0.8": 67637.56, - "0.05": 67637.56, - "0.35": 67637.56, - "0.65": 67637.56, - "0.95": 67637.56, - "0.005": 67637.56, - "0.995": 67637.56 - }, - { - "0.2": 67551.31, - "0.5": 67631.46, - "0.8": 67718.49, - "0.05": 67450.73, - "0.35": 67595.24, - "0.65": 67667.75, - "0.95": 67831.54, - "0.005": 67225.05, - "0.995": 68103.29 - }, - { - "0.2": 67503.3, - "0.5": 67638.08, - "0.8": 67770.3, - "0.05": 67348.23, - "0.35": 67576.28, - "0.65": 67695.1, - "0.95": 67932.25, - "0.005": 67007.11, - "0.995": 68231.11 - }, - { - "0.2": 67465.41, - "0.5": 67641.16, - "0.8": 67809.4, - "0.05": 67280.6, - "0.35": 67563.88, - "0.65": 67714.61, - "0.95": 67986.14, - "0.005": 66917.26, - "0.995": 68305.44 - }, - { - "0.2": 67446.69, - "0.5": 67641.61, - "0.8": 67832.01, - "0.05": 67241.89, - "0.35": 67555.99, - "0.65": 67731.54, - "0.95": 68023.68, - "0.005": 66834.44, - "0.995": 68409.41 - }, - { - "0.2": 67427.19, - "0.5": 67648.11, - "0.8": 67853.06, - "0.05": 67190.43, - "0.35": 67552.96, - "0.65": 67743.33, - "0.95": 68077.52, - "0.005": 66817.97, - "0.995": 68494.9 - }, - { - "0.2": 67409.71, - "0.5": 67650.04, - "0.8": 67880.77, - "0.05": 67163.6, - "0.35": 67546.15, - "0.65": 67749.53, - "0.95": 68132.45, - "0.005": 66753.75, - "0.995": 68499.93 - }, - { - "0.2": 67393.93, - "0.5": 67636.5, - "0.8": 67902.12, - "0.05": 67125.18, - "0.35": 67525.23, - "0.65": 67757.65, - "0.95": 68169.31, - "0.005": 66712.51, - "0.995": 68580.18 - }, - { - "0.2": 67369.84, - "0.5": 67632.62, - "0.8": 67917.19, - "0.05": 67106.01, - "0.35": 67518.24, - "0.65": 67760.32, - "0.95": 68199.25, - "0.005": 66693.77, - "0.995": 68595.14 - }, - { - "0.2": 67352.12, - "0.5": 67634.16, - "0.8": 67933.97, - "0.05": 67076.33, - "0.35": 67525.64, - "0.65": 67760.62, - "0.95": 68225.34, - "0.005": 66619.15, - "0.995": 68656.97 - }, - { - "0.2": 67339.34, - "0.5": 67626.11, - "0.8": 67940.56, - "0.05": 67040.93, - "0.35": 67510.57, - "0.65": 67769.68, - "0.95": 68262.46, - "0.005": 66553.15, - "0.995": 68669.69 - }, - { - "0.2": 67331.6, - "0.5": 67631.67, - "0.8": 67948.27, - "0.05": 67006.31, - "0.35": 67496.5, - "0.65": 67770.44, - "0.95": 68273.23, - "0.005": 66544.61, - "0.995": 68755.1 - }, - { - "0.2": 67319.0, - "0.5": 67632.09, - "0.8": 67972.02, - "0.05": 66951.29, - "0.35": 67492.37, - "0.65": 67775.73, - "0.95": 68291.83, - "0.005": 66499.5, - "0.995": 68780.68 - }, - { - "0.2": 67314.35, - "0.5": 67630.55, - "0.8": 67993.97, - "0.05": 66931.78, - "0.35": 67492.4, - "0.65": 67795.44, - "0.95": 68317.75, - "0.005": 66458.73, - "0.995": 68822.43 - }, - { - "0.2": 67293.04, - "0.5": 67632.75, - "0.8": 68011.29, - "0.05": 66925.5, - "0.35": 67483.41, - "0.65": 67811.11, - "0.95": 68372.04, - "0.005": 66456.02, - "0.995": 68791.87 - }, - { - "0.2": 67269.36, - "0.5": 67636.68, - "0.8": 68026.85, - "0.05": 66901.86, - "0.35": 67475.75, - "0.65": 67816.38, - "0.95": 68387.94, - "0.005": 66432.18, - "0.995": 68881.56 - }, - { - "0.2": 67261.68, - "0.5": 67641.51, - "0.8": 68047.57, - "0.05": 66884.21, - "0.35": 67468.99, - "0.65": 67829.67, - "0.95": 68429.28, - "0.005": 66428.04, - "0.995": 68858.23 - }, - { - "0.2": 67252.81, - "0.5": 67644.06, - "0.8": 68055.84, - "0.05": 66884.94, - "0.35": 67470.47, - "0.65": 67840.33, - "0.95": 68458.38, - "0.005": 66459.54, - "0.995": 68867.84 - }, - { - "0.2": 67247.69, - "0.5": 67660.13, - "0.8": 68066.34, - "0.05": 66857.1, - "0.35": 67472.18, - "0.65": 67850.1, - "0.95": 68475.04, - "0.005": 66436.43, - "0.995": 68900.01 - }, - { - "0.2": 67245.87, - "0.5": 67681.49, - "0.8": 68086.47, - "0.05": 66823.33, - "0.35": 67476.82, - "0.65": 67862.61, - "0.95": 68497.11, - "0.005": 66403.61, - "0.995": 68977.51 - }, - { - "0.2": 67224.1, - "0.5": 67665.25, - "0.8": 68103.04, - "0.05": 66826.42, - "0.35": 67466.36, - "0.65": 67872.93, - "0.95": 68510.51, - "0.005": 66310.8, - "0.995": 69006.8 - }, - { - "0.2": 67230.9, - "0.5": 67671.1, - "0.8": 68113.0, - "0.05": 66806.76, - "0.35": 67463.73, - "0.65": 67871.91, - "0.95": 68539.91, - "0.005": 66224.7, - "0.995": 69107.11 - }, - { - "0.2": 67227.33, - "0.5": 67663.97, - "0.8": 68136.92, - "0.05": 66789.7, - "0.35": 67451.12, - "0.65": 67885.29, - "0.95": 68539.27, - "0.005": 66237.71, - "0.995": 69196.58 - }, - { - "0.2": 67220.52, - "0.5": 67670.82, - "0.8": 68150.55, - "0.05": 66760.89, - "0.35": 67462.44, - "0.65": 67880.71, - "0.95": 68559.12, - "0.005": 66209.03, - "0.995": 69141.62 - }, - { - "0.2": 67209.55, - "0.5": 67666.81, - "0.8": 68157.02, - "0.05": 66754.11, - "0.35": 67452.87, - "0.65": 67893.09, - "0.95": 68615.3, - "0.005": 66220.85, - "0.995": 69251.05 - }, - { - "0.2": 67206.78, - "0.5": 67673.16, - "0.8": 68175.3, - "0.05": 66731.54, - "0.35": 67459.13, - "0.65": 67898.56, - "0.95": 68624.92, - "0.005": 66190.26, - "0.995": 69261.3 - }, - { - "0.2": 67195.46, - "0.5": 67677.21, - "0.8": 68177.52, - "0.05": 66717.41, - "0.35": 67451.82, - "0.65": 67915.02, - "0.95": 68647.25, - "0.005": 66103.74, - "0.995": 69329.54 - }, - { - "0.2": 67199.69, - "0.5": 67674.19, - "0.8": 68187.32, - "0.05": 66723.0, - "0.35": 67440.21, - "0.65": 67920.09, - "0.95": 68660.83, - "0.005": 66109.09, - "0.995": 69340.0 - }, - { - "0.2": 67188.6, - "0.5": 67666.42, - "0.8": 68211.68, - "0.05": 66718.18, - "0.35": 67441.34, - "0.65": 67928.19, - "0.95": 68694.22, - "0.005": 66152.25, - "0.995": 69347.4 - }, - { - "0.2": 67162.19, - "0.5": 67688.9, - "0.8": 68236.59, - "0.05": 66659.49, - "0.35": 67456.03, - "0.65": 67934.69, - "0.95": 68721.7, - "0.005": 66068.08, - "0.995": 69328.18 - }, - { - "0.2": 67171.51, - "0.5": 67699.89, - "0.8": 68241.67, - "0.05": 66636.88, - "0.35": 67453.43, - "0.65": 67932.64, - "0.95": 68816.84, - "0.005": 66109.0, - "0.995": 69445.17 - }, - { - "0.2": 67139.38, - "0.5": 67696.65, - "0.8": 68246.18, - "0.05": 66599.47, - "0.35": 67449.97, - "0.65": 67930.14, - "0.95": 68833.51, - "0.005": 66035.65, - "0.995": 69538.49 - }, - { - "0.2": 67140.81, - "0.5": 67686.9, - "0.8": 68241.8, - "0.05": 66576.85, - "0.35": 67447.24, - "0.65": 67928.26, - "0.95": 68866.67, - "0.005": 65988.04, - "0.995": 69619.16 - }, - { - "0.2": 67140.99, - "0.5": 67707.67, - "0.8": 68250.63, - "0.05": 66583.46, - "0.35": 67439.72, - "0.65": 67928.6, - "0.95": 68835.89, - "0.005": 65974.5, - "0.995": 69650.24 - }, - { - "0.2": 67114.91, - "0.5": 67699.2, - "0.8": 68256.94, - "0.05": 66538.16, - "0.35": 67437.27, - "0.65": 67947.72, - "0.95": 68837.08, - "0.005": 65859.73, - "0.995": 69594.19 - }, - { - "0.2": 67111.47, - "0.5": 67708.26, - "0.8": 68267.03, - "0.05": 66503.16, - "0.35": 67447.1, - "0.65": 67941.28, - "0.95": 68873.32, - "0.005": 65796.34, - "0.995": 69699.47 - }, - { - "0.2": 67104.85, - "0.5": 67695.82, - "0.8": 68285.5, - "0.05": 66479.41, - "0.35": 67439.04, - "0.65": 67963.65, - "0.95": 68910.79, - "0.005": 65758.63, - "0.995": 69778.16 - }, - { - "0.2": 67097.27, - "0.5": 67702.77, - "0.8": 68296.89, - "0.05": 66494.55, - "0.35": 67429.38, - "0.65": 67972.51, - "0.95": 68940.12, - "0.005": 65764.47, - "0.995": 69847.43 - }, - { - "0.2": 67073.43, - "0.5": 67691.23, - "0.8": 68305.13, - "0.05": 66490.72, - "0.35": 67408.67, - "0.65": 67960.35, - "0.95": 68937.45, - "0.005": 65660.4, - "0.995": 69863.62 - }, - { - "0.2": 67079.47, - "0.5": 67694.47, - "0.8": 68306.28, - "0.05": 66481.91, - "0.35": 67409.14, - "0.65": 67959.56, - "0.95": 68975.44, - "0.005": 65667.07, - "0.995": 69782.4 - }, - { - "0.2": 67067.3, - "0.5": 67688.05, - "0.8": 68326.54, - "0.05": 66441.73, - "0.35": 67402.0, - "0.65": 67971.6, - "0.95": 68990.32, - "0.005": 65649.49, - "0.995": 69905.6 - }, - { - "0.2": 67063.15, - "0.5": 67698.81, - "0.8": 68331.87, - "0.05": 66423.84, - "0.35": 67395.95, - "0.65": 67989.08, - "0.95": 68989.46, - "0.005": 65663.38, - "0.995": 69944.86 - }, - { - "0.2": 67059.08, - "0.5": 67699.95, - "0.8": 68352.95, - "0.05": 66400.89, - "0.35": 67400.73, - "0.65": 67991.98, - "0.95": 68973.92, - "0.005": 65679.33, - "0.995": 70005.22 - }, - { - "0.2": 67044.77, - "0.5": 67693.99, - "0.8": 68349.95, - "0.05": 66376.72, - "0.35": 67404.48, - "0.65": 68012.04, - "0.95": 69009.38, - "0.005": 65591.7, - "0.995": 69988.34 - }, - { - "0.2": 67024.07, - "0.5": 67681.77, - "0.8": 68354.81, - "0.05": 66387.71, - "0.35": 67393.65, - "0.65": 68010.24, - "0.95": 69027.31, - "0.005": 65666.82, - "0.995": 70027.67 - }, - { - "0.2": 67022.83, - "0.5": 67687.63, - "0.8": 68363.07, - "0.05": 66356.02, - "0.35": 67393.78, - "0.65": 68007.38, - "0.95": 69024.68, - "0.005": 65520.08, - "0.995": 70037.39 - }, - { - "0.2": 66990.83, - "0.5": 67693.77, - "0.8": 68361.31, - "0.05": 66338.68, - "0.35": 67383.83, - "0.65": 68019.19, - "0.95": 69044.03, - "0.005": 65453.95, - "0.995": 70011.15 - }, - { - "0.2": 67003.1, - "0.5": 67692.39, - "0.8": 68395.04, - "0.05": 66325.75, - "0.35": 67378.27, - "0.65": 68020.34, - "0.95": 69066.01, - "0.005": 65441.55, - "0.995": 70025.55 - }, - { - "0.2": 66994.41, - "0.5": 67693.19, - "0.8": 68383.22, - "0.05": 66312.11, - "0.35": 67383.36, - "0.65": 68010.31, - "0.95": 69060.49, - "0.005": 65374.95, - "0.995": 69990.34 - }, - { - "0.2": 66979.89, - "0.5": 67693.95, - "0.8": 68381.71, - "0.05": 66268.49, - "0.35": 67384.64, - "0.65": 68011.84, - "0.95": 69077.58, - "0.005": 65392.64, - "0.995": 70127.77 - }, - { - "0.2": 66977.05, - "0.5": 67698.33, - "0.8": 68396.49, - "0.05": 66275.1, - "0.35": 67375.07, - "0.65": 68022.36, - "0.95": 69075.37, - "0.005": 65353.32, - "0.995": 70070.72 - }, - { - "0.2": 66977.27, - "0.5": 67698.7, - "0.8": 68388.79, - "0.05": 66254.43, - "0.35": 67368.95, - "0.65": 68030.15, - "0.95": 69085.69, - "0.005": 65352.5, - "0.995": 70074.04 - }, - { - "0.2": 66950.13, - "0.5": 67696.48, - "0.8": 68405.21, - "0.05": 66245.13, - "0.35": 67385.39, - "0.65": 68046.8, - "0.95": 69103.0, - "0.005": 65384.08, - "0.995": 70138.28 - }, - { - "0.2": 66956.36, - "0.5": 67708.58, - "0.8": 68416.73, - "0.05": 66237.99, - "0.35": 67373.74, - "0.65": 68043.23, - "0.95": 69107.79, - "0.005": 65266.05, - "0.995": 70142.45 - }, - { - "0.2": 66951.67, - "0.5": 67706.12, - "0.8": 68434.88, - "0.05": 66252.28, - "0.35": 67383.26, - "0.65": 68040.97, - "0.95": 69129.89, - "0.005": 65298.07, - "0.995": 70109.53 - }, - { - "0.2": 66929.59, - "0.5": 67700.48, - "0.8": 68442.9, - "0.05": 66212.0, - "0.35": 67374.95, - "0.65": 68038.32, - "0.95": 69166.15, - "0.005": 65268.25, - "0.995": 70092.37 - }, - { - "0.2": 66922.46, - "0.5": 67702.8, - "0.8": 68458.18, - "0.05": 66233.55, - "0.35": 67365.37, - "0.65": 68056.15, - "0.95": 69187.96, - "0.005": 65255.2, - "0.995": 70170.42 - }, - { - "0.2": 66906.82, - "0.5": 67697.91, - "0.8": 68471.62, - "0.05": 66227.82, - "0.35": 67356.4, - "0.65": 68062.99, - "0.95": 69218.86, - "0.005": 65303.44, - "0.995": 70221.71 - }, - { - "0.2": 66922.26, - "0.5": 67682.72, - "0.8": 68478.14, - "0.05": 66217.92, - "0.35": 67335.94, - "0.65": 68059.71, - "0.95": 69215.36, - "0.005": 65293.7, - "0.995": 70236.25 - }, - { - "0.2": 66922.97, - "0.5": 67692.95, - "0.8": 68471.04, - "0.05": 66195.8, - "0.35": 67345.79, - "0.65": 68056.47, - "0.95": 69224.05, - "0.005": 65298.87, - "0.995": 70214.37 - }, - { - "0.2": 66932.75, - "0.5": 67703.87, - "0.8": 68495.44, - "0.05": 66184.88, - "0.35": 67352.46, - "0.65": 68067.88, - "0.95": 69253.89, - "0.005": 65338.94, - "0.995": 70267.97 - }, - { - "0.2": 66911.41, - "0.5": 67696.5, - "0.8": 68495.52, - "0.05": 66157.61, - "0.35": 67350.13, - "0.65": 68063.97, - "0.95": 69255.52, - "0.005": 65253.45, - "0.995": 70275.91 - }, - { - "0.2": 66931.38, - "0.5": 67695.99, - "0.8": 68519.84, - "0.05": 66180.53, - "0.35": 67352.99, - "0.65": 68081.97, - "0.95": 69268.08, - "0.005": 65229.11, - "0.995": 70446.45 - }, - { - "0.2": 66930.46, - "0.5": 67721.38, - "0.8": 68526.47, - "0.05": 66165.54, - "0.35": 67344.15, - "0.65": 68089.25, - "0.95": 69276.67, - "0.005": 65242.8, - "0.995": 70413.27 - }, - { - "0.2": 66916.76, - "0.5": 67708.14, - "0.8": 68536.08, - "0.05": 66122.68, - "0.35": 67342.99, - "0.65": 68076.59, - "0.95": 69278.58, - "0.005": 65146.5, - "0.995": 70367.69 - }, - { - "0.2": 66915.64, - "0.5": 67707.18, - "0.8": 68554.43, - "0.05": 66130.16, - "0.35": 67339.41, - "0.65": 68089.49, - "0.95": 69249.5, - "0.005": 65173.09, - "0.995": 70324.22 - }, - { - "0.2": 66908.74, - "0.5": 67704.48, - "0.8": 68548.25, - "0.05": 66109.57, - "0.35": 67330.54, - "0.65": 68089.42, - "0.95": 69304.27, - "0.005": 65131.89, - "0.995": 70383.48 - }, - { - "0.2": 66895.84, - "0.5": 67698.71, - "0.8": 68547.31, - "0.05": 66086.9, - "0.35": 67320.56, - "0.65": 68085.85, - "0.95": 69320.17, - "0.005": 65134.28, - "0.995": 70391.06 - }, - { - "0.2": 66893.66, - "0.5": 67703.67, - "0.8": 68549.0, - "0.05": 66063.23, - "0.35": 67312.09, - "0.65": 68099.45, - "0.95": 69304.56, - "0.005": 65157.88, - "0.995": 70483.31 - }, - { - "0.2": 66871.86, - "0.5": 67714.43, - "0.8": 68544.26, - "0.05": 66067.36, - "0.35": 67295.72, - "0.65": 68097.78, - "0.95": 69328.89, - "0.005": 65134.04, - "0.995": 70398.47 - }, - { - "0.2": 66855.55, - "0.5": 67712.43, - "0.8": 68550.8, - "0.05": 66032.13, - "0.35": 67300.48, - "0.65": 68099.76, - "0.95": 69336.22, - "0.005": 65081.42, - "0.995": 70439.44 - }, - { - "0.2": 66873.91, - "0.5": 67698.35, - "0.8": 68548.13, - "0.05": 66024.46, - "0.35": 67309.08, - "0.65": 68095.56, - "0.95": 69357.27, - "0.005": 65027.5, - "0.995": 70428.21 - }, - { - "0.2": 66861.86, - "0.5": 67714.84, - "0.8": 68555.26, - "0.05": 66042.94, - "0.35": 67300.26, - "0.65": 68107.24, - "0.95": 69378.32, - "0.005": 65073.14, - "0.995": 70447.1 - }, - { - "0.2": 66884.83, - "0.5": 67718.26, - "0.8": 68567.16, - "0.05": 66017.53, - "0.35": 67304.99, - "0.65": 68131.41, - "0.95": 69374.32, - "0.005": 65132.23, - "0.995": 70386.11 - }, - { - "0.2": 66883.06, - "0.5": 67739.84, - "0.8": 68569.33, - "0.05": 66025.56, - "0.35": 67305.58, - "0.65": 68130.81, - "0.95": 69368.13, - "0.005": 65148.01, - "0.995": 70373.21 - }, - { - "0.2": 66882.39, - "0.5": 67724.5, - "0.8": 68551.77, - "0.05": 66020.35, - "0.35": 67295.88, - "0.65": 68128.1, - "0.95": 69354.94, - "0.005": 65178.48, - "0.995": 70357.06 - }, - { - "0.2": 66862.02, - "0.5": 67710.56, - "0.8": 68560.88, - "0.05": 65993.19, - "0.35": 67304.14, - "0.65": 68135.59, - "0.95": 69355.89, - "0.005": 65139.93, - "0.995": 70409.72 - }, - { - "0.2": 66859.41, - "0.5": 67700.64, - "0.8": 68562.63, - "0.05": 65992.95, - "0.35": 67296.12, - "0.65": 68137.53, - "0.95": 69355.5, - "0.005": 65216.36, - "0.995": 70387.32 - }, - { - "0.2": 66856.84, - "0.5": 67707.75, - "0.8": 68585.04, - "0.05": 65982.69, - "0.35": 67312.44, - "0.65": 68152.64, - "0.95": 69404.93, - "0.005": 65210.61, - "0.995": 70471.2 - }, - { - "0.2": 66854.75, - "0.5": 67715.62, - "0.8": 68577.64, - "0.05": 65971.01, - "0.35": 67317.07, - "0.65": 68140.83, - "0.95": 69400.93, - "0.005": 65238.85, - "0.995": 70522.57 - }, - { - "0.2": 66842.57, - "0.5": 67724.69, - "0.8": 68590.73, - "0.05": 65982.04, - "0.35": 67314.75, - "0.65": 68143.52, - "0.95": 69406.64, - "0.005": 65222.83, - "0.995": 70454.79 - }, - { - "0.2": 66843.18, - "0.5": 67719.39, - "0.8": 68608.87, - "0.05": 65970.11, - "0.35": 67301.63, - "0.65": 68146.62, - "0.95": 69412.08, - "0.005": 65118.26, - "0.995": 70507.23 - }, - { - "0.2": 66865.83, - "0.5": 67712.45, - "0.8": 68628.21, - "0.05": 65956.77, - "0.35": 67299.66, - "0.65": 68133.19, - "0.95": 69429.45, - "0.005": 65207.57, - "0.995": 70534.06 - }, - { - "0.2": 66851.13, - "0.5": 67704.86, - "0.8": 68621.08, - "0.05": 65940.0, - "0.35": 67314.76, - "0.65": 68142.91, - "0.95": 69466.67, - "0.005": 65119.18, - "0.995": 70613.39 - }, - { - "0.2": 66845.7, - "0.5": 67708.57, - "0.8": 68628.79, - "0.05": 65918.51, - "0.35": 67298.96, - "0.65": 68136.51, - "0.95": 69489.27, - "0.005": 65234.81, - "0.995": 70602.18 - }, - { - "0.2": 66843.12, - "0.5": 67713.22, - "0.8": 68630.88, - "0.05": 65938.78, - "0.35": 67299.38, - "0.65": 68145.66, - "0.95": 69495.04, - "0.005": 65184.34, - "0.995": 70591.47 - }, - { - "0.2": 66844.87, - "0.5": 67721.34, - "0.8": 68636.14, - "0.05": 65947.79, - "0.35": 67312.43, - "0.65": 68154.08, - "0.95": 69491.76, - "0.005": 65162.24, - "0.995": 70669.84 - }, - { - "0.2": 66825.01, - "0.5": 67712.19, - "0.8": 68617.15, - "0.05": 65931.94, - "0.35": 67313.81, - "0.65": 68156.19, - "0.95": 69479.49, - "0.005": 65077.22, - "0.995": 70712.37 - }, - { - "0.2": 66809.73, - "0.5": 67729.6, - "0.8": 68634.68, - "0.05": 65933.62, - "0.35": 67319.16, - "0.65": 68143.58, - "0.95": 69462.0, - "0.005": 65116.73, - "0.995": 70661.05 - }, - { - "0.2": 66811.73, - "0.5": 67724.81, - "0.8": 68625.56, - "0.05": 65903.36, - "0.35": 67303.91, - "0.65": 68147.25, - "0.95": 69484.91, - "0.005": 65133.68, - "0.995": 70648.69 - }, - { - "0.2": 66804.92, - "0.5": 67703.3, - "0.8": 68638.83, - "0.05": 65912.75, - "0.35": 67295.12, - "0.65": 68138.37, - "0.95": 69496.66, - "0.005": 65074.34, - "0.995": 70676.29 - }, - { - "0.2": 66808.04, - "0.5": 67698.98, - "0.8": 68622.95, - "0.05": 65915.67, - "0.35": 67292.11, - "0.65": 68149.41, - "0.95": 69521.35, - "0.005": 65036.88, - "0.995": 70677.68 - }, - { - "0.2": 66815.89, - "0.5": 67716.28, - "0.8": 68646.1, - "0.05": 65898.58, - "0.35": 67318.93, - "0.65": 68154.44, - "0.95": 69539.06, - "0.005": 64985.21, - "0.995": 70678.07 - }, - { - "0.2": 66784.68, - "0.5": 67711.8, - "0.8": 68649.26, - "0.05": 65927.33, - "0.35": 67308.0, - "0.65": 68146.93, - "0.95": 69532.76, - "0.005": 64982.62, - "0.995": 70704.36 - }, - { - "0.2": 66815.67, - "0.5": 67713.67, - "0.8": 68649.5, - "0.05": 65886.09, - "0.35": 67293.55, - "0.65": 68148.55, - "0.95": 69562.07, - "0.005": 64953.75, - "0.995": 70763.35 - }, - { - "0.2": 66809.94, - "0.5": 67714.14, - "0.8": 68641.24, - "0.05": 65934.31, - "0.35": 67303.7, - "0.65": 68155.32, - "0.95": 69585.97, - "0.005": 64942.0, - "0.995": 70737.57 - }, - { - "0.2": 66809.16, - "0.5": 67721.38, - "0.8": 68656.66, - "0.05": 65891.48, - "0.35": 67291.7, - "0.65": 68164.2, - "0.95": 69571.59, - "0.005": 64930.3, - "0.995": 70738.7 - }, - { - "0.2": 66797.04, - "0.5": 67717.65, - "0.8": 68684.13, - "0.05": 65870.11, - "0.35": 67286.67, - "0.65": 68157.69, - "0.95": 69590.82, - "0.005": 64870.02, - "0.995": 70825.15 - }, - { - "0.2": 66791.83, - "0.5": 67714.49, - "0.8": 68685.67, - "0.05": 65873.93, - "0.35": 67276.37, - "0.65": 68167.93, - "0.95": 69577.55, - "0.005": 64933.91, - "0.995": 70901.59 - }, - { - "0.2": 66778.76, - "0.5": 67727.74, - "0.8": 68709.41, - "0.05": 65876.52, - "0.35": 67279.11, - "0.65": 68165.76, - "0.95": 69596.41, - "0.005": 64891.77, - "0.995": 70985.77 - }, - { - "0.2": 66781.37, - "0.5": 67729.72, - "0.8": 68702.96, - "0.05": 65869.34, - "0.35": 67275.14, - "0.65": 68160.62, - "0.95": 69603.66, - "0.005": 64863.08, - "0.995": 70981.5 - }, - { - "0.2": 66769.54, - "0.5": 67723.76, - "0.8": 68706.24, - "0.05": 65846.09, - "0.35": 67280.85, - "0.65": 68164.18, - "0.95": 69617.09, - "0.005": 64868.9, - "0.995": 71019.34 - }, - { - "0.2": 66784.59, - "0.5": 67731.73, - "0.8": 68707.34, - "0.05": 65835.57, - "0.35": 67294.07, - "0.65": 68173.94, - "0.95": 69652.39, - "0.005": 64932.13, - "0.995": 71060.02 - }, - { - "0.2": 66781.13, - "0.5": 67728.86, - "0.8": 68720.99, - "0.05": 65839.28, - "0.35": 67290.78, - "0.65": 68180.8, - "0.95": 69658.16, - "0.005": 64885.8, - "0.995": 71060.44 - }, - { - "0.2": 66783.82, - "0.5": 67732.29, - "0.8": 68719.82, - "0.05": 65841.76, - "0.35": 67301.42, - "0.65": 68174.55, - "0.95": 69668.07, - "0.005": 64971.37, - "0.995": 71102.8 - }, - { - "0.2": 66776.04, - "0.5": 67740.34, - "0.8": 68725.4, - "0.05": 65872.47, - "0.35": 67295.75, - "0.65": 68179.79, - "0.95": 69723.4, - "0.005": 64957.74, - "0.995": 71147.41 - }, - { - "0.2": 66772.13, - "0.5": 67748.59, - "0.8": 68750.39, - "0.05": 65829.52, - "0.35": 67298.26, - "0.65": 68185.89, - "0.95": 69722.18, - "0.005": 64915.91, - "0.995": 71156.42 - }, - { - "0.2": 66754.34, - "0.5": 67752.51, - "0.8": 68734.89, - "0.05": 65829.47, - "0.35": 67291.63, - "0.65": 68193.87, - "0.95": 69732.1, - "0.005": 64852.2, - "0.995": 71192.65 - }, - { - "0.2": 66761.92, - "0.5": 67751.97, - "0.8": 68744.91, - "0.05": 65791.28, - "0.35": 67302.4, - "0.65": 68205.51, - "0.95": 69701.77, - "0.005": 64905.91, - "0.995": 71151.69 - }, - { - "0.2": 66762.3, - "0.5": 67762.29, - "0.8": 68751.99, - "0.05": 65786.35, - "0.35": 67309.92, - "0.65": 68209.81, - "0.95": 69703.73, - "0.005": 64900.12, - "0.995": 71139.22 - }, - { - "0.2": 66753.87, - "0.5": 67762.76, - "0.8": 68758.58, - "0.05": 65790.94, - "0.35": 67307.85, - "0.65": 68206.2, - "0.95": 69701.98, - "0.005": 64900.73, - "0.995": 71030.24 - }, - { - "0.2": 66756.9, - "0.5": 67764.01, - "0.8": 68756.78, - "0.05": 65771.98, - "0.35": 67302.22, - "0.65": 68209.13, - "0.95": 69729.86, - "0.005": 64907.83, - "0.995": 71027.55 - }, - { - "0.2": 66752.4, - "0.5": 67759.56, - "0.8": 68760.42, - "0.05": 65763.56, - "0.35": 67304.12, - "0.65": 68211.9, - "0.95": 69744.15, - "0.005": 64869.48, - "0.995": 71066.32 - }, - { - "0.2": 66747.58, - "0.5": 67766.0, - "0.8": 68765.31, - "0.05": 65775.73, - "0.35": 67291.92, - "0.65": 68220.75, - "0.95": 69757.78, - "0.005": 64851.21, - "0.995": 71116.69 - }, - { - "0.2": 66736.88, - "0.5": 67760.94, - "0.8": 68762.29, - "0.05": 65766.79, - "0.35": 67283.85, - "0.65": 68213.48, - "0.95": 69776.86, - "0.005": 64898.41, - "0.995": 71099.52 - }, - { - "0.2": 66726.24, - "0.5": 67770.23, - "0.8": 68749.75, - "0.05": 65776.62, - "0.35": 67285.83, - "0.65": 68221.8, - "0.95": 69762.81, - "0.005": 64903.2, - "0.995": 71133.45 - }, - { - "0.2": 66738.77, - "0.5": 67772.3, - "0.8": 68757.54, - "0.05": 65808.89, - "0.35": 67284.4, - "0.65": 68219.55, - "0.95": 69782.76, - "0.005": 64837.96, - "0.995": 71226.37 - }, - { - "0.2": 66747.14, - "0.5": 67774.59, - "0.8": 68772.08, - "0.05": 65789.37, - "0.35": 67291.99, - "0.65": 68227.22, - "0.95": 69816.47, - "0.005": 64843.1, - "0.995": 71267.5 - }, - { - "0.2": 66754.68, - "0.5": 67781.9, - "0.8": 68778.08, - "0.05": 65807.44, - "0.35": 67297.8, - "0.65": 68222.41, - "0.95": 69817.07, - "0.005": 64810.14, - "0.995": 71357.77 - }, - { - "0.2": 66744.05, - "0.5": 67776.79, - "0.8": 68790.09, - "0.05": 65785.15, - "0.35": 67302.43, - "0.65": 68226.3, - "0.95": 69808.19, - "0.005": 64776.12, - "0.995": 71320.02 - }, - { - "0.2": 66746.96, - "0.5": 67768.04, - "0.8": 68776.88, - "0.05": 65805.28, - "0.35": 67318.12, - "0.65": 68216.76, - "0.95": 69848.97, - "0.005": 64722.65, - "0.995": 71326.38 - }, - { - "0.2": 66738.44, - "0.5": 67774.95, - "0.8": 68797.82, - "0.05": 65786.16, - "0.35": 67317.05, - "0.65": 68235.5, - "0.95": 69844.2, - "0.005": 64756.89, - "0.995": 71388.22 - }, - { - "0.2": 66753.9, - "0.5": 67762.09, - "0.8": 68782.72, - "0.05": 65786.39, - "0.35": 67321.26, - "0.65": 68253.43, - "0.95": 69842.99, - "0.005": 64733.83, - "0.995": 71337.24 - }, - { - "0.2": 66736.07, - "0.5": 67760.88, - "0.8": 68764.86, - "0.05": 65784.46, - "0.35": 67303.68, - "0.65": 68236.79, - "0.95": 69841.89, - "0.005": 64730.74, - "0.995": 71440.89 - }, - { - "0.2": 66727.56, - "0.5": 67764.67, - "0.8": 68774.89, - "0.05": 65803.59, - "0.35": 67311.42, - "0.65": 68241.22, - "0.95": 69866.91, - "0.005": 64801.1, - "0.995": 71430.21 - }, - { - "0.2": 66742.71, - "0.5": 67759.85, - "0.8": 68771.49, - "0.05": 65782.9, - "0.35": 67305.08, - "0.65": 68237.84, - "0.95": 69848.55, - "0.005": 64734.08, - "0.995": 71469.61 - }, - { - "0.2": 66740.08, - "0.5": 67746.18, - "0.8": 68779.77, - "0.05": 65790.49, - "0.35": 67288.03, - "0.65": 68228.09, - "0.95": 69860.46, - "0.005": 64793.19, - "0.995": 71386.13 - }, - { - "0.2": 66725.82, - "0.5": 67743.39, - "0.8": 68768.51, - "0.05": 65762.66, - "0.35": 67285.89, - "0.65": 68245.74, - "0.95": 69888.15, - "0.005": 64805.48, - "0.995": 71393.01 - }, - { - "0.2": 66720.98, - "0.5": 67732.34, - "0.8": 68777.69, - "0.05": 65784.49, - "0.35": 67292.42, - "0.65": 68251.78, - "0.95": 69867.89, - "0.005": 64772.0, - "0.995": 71458.04 - }, - { - "0.2": 66717.53, - "0.5": 67718.79, - "0.8": 68802.54, - "0.05": 65801.9, - "0.35": 67286.14, - "0.65": 68260.93, - "0.95": 69894.76, - "0.005": 64720.0, - "0.995": 71417.19 - }, - { - "0.2": 66716.19, - "0.5": 67729.33, - "0.8": 68799.33, - "0.05": 65796.64, - "0.35": 67278.01, - "0.65": 68263.68, - "0.95": 69875.12, - "0.005": 64746.08, - "0.995": 71394.22 - }, - { - "0.2": 66726.19, - "0.5": 67744.22, - "0.8": 68803.62, - "0.05": 65780.11, - "0.35": 67276.89, - "0.65": 68263.03, - "0.95": 69888.81, - "0.005": 64711.68, - "0.995": 71370.84 - }, - { - "0.2": 66722.83, - "0.5": 67746.66, - "0.8": 68810.7, - "0.05": 65763.89, - "0.35": 67272.35, - "0.65": 68254.58, - "0.95": 69921.65, - "0.005": 64752.17, - "0.995": 71395.44 - }, - { - "0.2": 66723.22, - "0.5": 67751.56, - "0.8": 68808.82, - "0.05": 65762.74, - "0.35": 67257.88, - "0.65": 68246.67, - "0.95": 69913.31, - "0.005": 64733.82, - "0.995": 71399.09 - }, - { - "0.2": 66724.68, - "0.5": 67746.14, - "0.8": 68792.28, - "0.05": 65781.18, - "0.35": 67249.85, - "0.65": 68240.82, - "0.95": 69901.9, - "0.005": 64744.47, - "0.995": 71357.57 - }, - { - "0.2": 66719.15, - "0.5": 67745.76, - "0.8": 68815.64, - "0.05": 65769.11, - "0.35": 67244.65, - "0.65": 68260.84, - "0.95": 69895.07, - "0.005": 64755.68, - "0.995": 71388.35 - }, - { - "0.2": 66710.96, - "0.5": 67754.55, - "0.8": 68830.43, - "0.05": 65783.81, - "0.35": 67235.71, - "0.65": 68248.24, - "0.95": 69906.24, - "0.005": 64737.55, - "0.995": 71367.26 - }, - { - "0.2": 66706.33, - "0.5": 67758.13, - "0.8": 68823.82, - "0.05": 65763.06, - "0.35": 67242.14, - "0.65": 68257.07, - "0.95": 69915.75, - "0.005": 64661.08, - "0.995": 71354.77 - }, - { - "0.2": 66716.83, - "0.5": 67757.96, - "0.8": 68826.62, - "0.05": 65762.68, - "0.35": 67243.2, - "0.65": 68265.15, - "0.95": 69923.92, - "0.005": 64655.43, - "0.995": 71375.99 - }, - { - "0.2": 66725.51, - "0.5": 67754.06, - "0.8": 68840.56, - "0.05": 65780.3, - "0.35": 67249.49, - "0.65": 68265.77, - "0.95": 69931.78, - "0.005": 64681.79, - "0.995": 71390.61 - }, - { - "0.2": 66720.91, - "0.5": 67747.93, - "0.8": 68832.74, - "0.05": 65755.83, - "0.35": 67254.24, - "0.65": 68251.44, - "0.95": 69950.98, - "0.005": 64618.66, - "0.995": 71391.97 - }, - { - "0.2": 66714.36, - "0.5": 67748.43, - "0.8": 68832.87, - "0.05": 65714.49, - "0.35": 67259.04, - "0.65": 68262.75, - "0.95": 69936.35, - "0.005": 64638.29, - "0.995": 71413.86 - }, - { - "0.2": 66714.72, - "0.5": 67757.44, - "0.8": 68852.1, - "0.05": 65729.27, - "0.35": 67273.46, - "0.65": 68257.01, - "0.95": 69955.27, - "0.005": 64598.08, - "0.995": 71494.36 - }, - { - "0.2": 66716.87, - "0.5": 67749.92, - "0.8": 68855.8, - "0.05": 65733.82, - "0.35": 67266.86, - "0.65": 68263.65, - "0.95": 69978.64, - "0.005": 64671.45, - "0.995": 71590.66 - }, - { - "0.2": 66713.22, - "0.5": 67747.18, - "0.8": 68862.77, - "0.05": 65726.62, - "0.35": 67266.49, - "0.65": 68274.94, - "0.95": 69969.79, - "0.005": 64650.41, - "0.995": 71616.06 - }, - { - "0.2": 66698.27, - "0.5": 67753.92, - "0.8": 68865.91, - "0.05": 65717.22, - "0.35": 67262.43, - "0.65": 68281.58, - "0.95": 70004.26, - "0.005": 64608.99, - "0.995": 71582.95 - }, - { - "0.2": 66688.29, - "0.5": 67769.28, - "0.8": 68853.92, - "0.05": 65710.47, - "0.35": 67263.91, - "0.65": 68278.25, - "0.95": 70004.97, - "0.005": 64612.55, - "0.995": 71520.81 - }, - { - "0.2": 66690.77, - "0.5": 67770.34, - "0.8": 68856.66, - "0.05": 65713.75, - "0.35": 67275.33, - "0.65": 68292.26, - "0.95": 70018.28, - "0.005": 64624.75, - "0.995": 71548.75 - }, - { - "0.2": 66694.56, - "0.5": 67785.3, - "0.8": 68864.0, - "0.05": 65717.08, - "0.35": 67254.95, - "0.65": 68287.48, - "0.95": 70000.92, - "0.005": 64611.17, - "0.995": 71588.83 - }, - { - "0.2": 66691.7, - "0.5": 67773.26, - "0.8": 68864.31, - "0.05": 65705.91, - "0.35": 67262.81, - "0.65": 68287.51, - "0.95": 69987.93, - "0.005": 64632.78, - "0.995": 71545.38 - }, - { - "0.2": 66672.0, - "0.5": 67777.34, - "0.8": 68878.37, - "0.05": 65698.64, - "0.35": 67258.18, - "0.65": 68305.97, - "0.95": 70005.76, - "0.005": 64636.3, - "0.995": 71489.97 - }, - { - "0.2": 66683.37, - "0.5": 67771.38, - "0.8": 68890.27, - "0.05": 65701.59, - "0.35": 67274.73, - "0.65": 68313.6, - "0.95": 70022.16, - "0.005": 64596.54, - "0.995": 71598.91 - }, - { - "0.2": 66696.71, - "0.5": 67767.21, - "0.8": 68891.49, - "0.05": 65663.51, - "0.35": 67269.84, - "0.65": 68310.63, - "0.95": 70030.78, - "0.005": 64585.41, - "0.995": 71651.6 - }, - { - "0.2": 66688.08, - "0.5": 67769.62, - "0.8": 68896.27, - "0.05": 65647.24, - "0.35": 67267.93, - "0.65": 68304.87, - "0.95": 69998.95, - "0.005": 64615.11, - "0.995": 71609.92 - }, - { - "0.2": 66697.42, - "0.5": 67771.4, - "0.8": 68913.8, - "0.05": 65652.89, - "0.35": 67274.43, - "0.65": 68301.15, - "0.95": 70008.21, - "0.005": 64575.83, - "0.995": 71692.29 - }, - { - "0.2": 66712.15, - "0.5": 67767.5, - "0.8": 68926.23, - "0.05": 65634.72, - "0.35": 67252.72, - "0.65": 68315.08, - "0.95": 70032.6, - "0.005": 64508.92, - "0.995": 71729.97 - }, - { - "0.2": 66720.96, - "0.5": 67782.12, - "0.8": 68936.16, - "0.05": 65678.43, - "0.35": 67276.52, - "0.65": 68307.33, - "0.95": 70082.14, - "0.005": 64534.31, - "0.995": 71694.76 - }, - { - "0.2": 66701.49, - "0.5": 67792.68, - "0.8": 68939.79, - "0.05": 65680.29, - "0.35": 67256.49, - "0.65": 68333.38, - "0.95": 70091.68, - "0.005": 64590.85, - "0.995": 71738.23 - }, - { - "0.2": 66696.58, - "0.5": 67795.98, - "0.8": 68949.22, - "0.05": 65696.63, - "0.35": 67265.99, - "0.65": 68332.34, - "0.95": 70138.29, - "0.005": 64545.89, - "0.995": 71720.14 - }, - { - "0.2": 66710.04, - "0.5": 67790.59, - "0.8": 68963.66, - "0.05": 65673.8, - "0.35": 67259.92, - "0.65": 68318.27, - "0.95": 70116.82, - "0.005": 64518.44, - "0.995": 71680.95 - }, - { - "0.2": 66696.1, - "0.5": 67790.73, - "0.8": 68958.33, - "0.05": 65684.52, - "0.35": 67247.31, - "0.65": 68325.5, - "0.95": 70129.46, - "0.005": 64447.84, - "0.995": 71742.58 - }, - { - "0.2": 66701.14, - "0.5": 67772.62, - "0.8": 68958.69, - "0.05": 65686.23, - "0.35": 67241.48, - "0.65": 68328.94, - "0.95": 70131.03, - "0.005": 64455.66, - "0.995": 71843.15 - }, - { - "0.2": 66685.03, - "0.5": 67768.03, - "0.8": 68957.56, - "0.05": 65672.64, - "0.35": 67242.15, - "0.65": 68357.98, - "0.95": 70119.41, - "0.005": 64368.41, - "0.995": 71913.73 - }, - { - "0.2": 66674.5, - "0.5": 67790.48, - "0.8": 68980.89, - "0.05": 65645.6, - "0.35": 67247.84, - "0.65": 68356.55, - "0.95": 70130.89, - "0.005": 64391.1, - "0.995": 71871.33 - }, - { - "0.2": 66684.71, - "0.5": 67765.83, - "0.8": 68954.92, - "0.05": 65618.46, - "0.35": 67251.85, - "0.65": 68347.36, - "0.95": 70154.97, - "0.005": 64398.61, - "0.995": 71789.88 - }, - { - "0.2": 66650.3, - "0.5": 67789.08, - "0.8": 68962.83, - "0.05": 65633.9, - "0.35": 67227.29, - "0.65": 68333.55, - "0.95": 70160.22, - "0.005": 64398.43, - "0.995": 71818.76 - }, - { - "0.2": 66654.96, - "0.5": 67784.47, - "0.8": 68990.16, - "0.05": 65620.63, - "0.35": 67222.57, - "0.65": 68360.78, - "0.95": 70177.48, - "0.005": 64417.98, - "0.995": 71930.12 - }, - { - "0.2": 66645.43, - "0.5": 67776.62, - "0.8": 68998.39, - "0.05": 65564.59, - "0.35": 67220.5, - "0.65": 68353.51, - "0.95": 70114.7, - "0.005": 64420.02, - "0.995": 71834.57 - }, - { - "0.2": 66623.19, - "0.5": 67789.49, - "0.8": 69020.39, - "0.05": 65596.73, - "0.35": 67236.02, - "0.65": 68357.25, - "0.95": 70146.21, - "0.005": 64377.39, - "0.995": 71871.1 - }, - { - "0.2": 66602.85, - "0.5": 67804.76, - "0.8": 69039.53, - "0.05": 65601.68, - "0.35": 67238.51, - "0.65": 68360.99, - "0.95": 70159.53, - "0.005": 64293.09, - "0.995": 71881.27 - }, - { - "0.2": 66607.91, - "0.5": 67803.02, - "0.8": 69021.61, - "0.05": 65575.58, - "0.35": 67248.61, - "0.65": 68359.32, - "0.95": 70236.26, - "0.005": 64276.16, - "0.995": 71838.75 - }, - { - "0.2": 66599.38, - "0.5": 67786.83, - "0.8": 69019.78, - "0.05": 65579.48, - "0.35": 67245.21, - "0.65": 68372.44, - "0.95": 70233.61, - "0.005": 64223.29, - "0.995": 71884.4 - }, - { - "0.2": 66594.51, - "0.5": 67814.12, - "0.8": 69045.01, - "0.05": 65573.77, - "0.35": 67236.34, - "0.65": 68360.06, - "0.95": 70259.93, - "0.005": 64165.06, - "0.995": 71903.72 - }, - { - "0.2": 66590.36, - "0.5": 67816.18, - "0.8": 69050.08, - "0.05": 65605.5, - "0.35": 67248.94, - "0.65": 68389.13, - "0.95": 70289.76, - "0.005": 64216.3, - "0.995": 71765.51 - }, - { - "0.2": 66592.9, - "0.5": 67798.99, - "0.8": 69052.22, - "0.05": 65574.23, - "0.35": 67223.42, - "0.65": 68389.44, - "0.95": 70269.85, - "0.005": 64133.6, - "0.995": 71922.71 - }, - { - "0.2": 66589.29, - "0.5": 67791.97, - "0.8": 69047.13, - "0.05": 65501.25, - "0.35": 67224.62, - "0.65": 68392.27, - "0.95": 70226.54, - "0.005": 64046.8, - "0.995": 71864.81 - }, - { - "0.2": 66571.86, - "0.5": 67769.43, - "0.8": 69066.95, - "0.05": 65496.42, - "0.35": 67224.21, - "0.65": 68382.8, - "0.95": 70257.93, - "0.005": 64017.9, - "0.995": 71971.25 - }, - { - "0.2": 66554.56, - "0.5": 67774.45, - "0.8": 69060.16, - "0.05": 65504.23, - "0.35": 67212.49, - "0.65": 68401.73, - "0.95": 70352.59, - "0.005": 64104.47, - "0.995": 71979.62 - }, - { - "0.2": 66582.71, - "0.5": 67783.77, - "0.8": 69086.04, - "0.05": 65497.28, - "0.35": 67235.25, - "0.65": 68410.09, - "0.95": 70296.11, - "0.005": 64129.24, - "0.995": 72065.34 - }, - { - "0.2": 66580.56, - "0.5": 67810.13, - "0.8": 69073.13, - "0.05": 65482.44, - "0.35": 67245.66, - "0.65": 68389.13, - "0.95": 70285.38, - "0.005": 64039.7, - "0.995": 72001.33 - }, - { - "0.2": 66581.55, - "0.5": 67807.54, - "0.8": 69070.42, - "0.05": 65438.47, - "0.35": 67243.99, - "0.65": 68376.32, - "0.95": 70314.2, - "0.005": 64031.01, - "0.995": 72076.13 - }, - { - "0.2": 66557.34, - "0.5": 67808.08, - "0.8": 69058.17, - "0.05": 65420.34, - "0.35": 67229.74, - "0.65": 68388.02, - "0.95": 70336.42, - "0.005": 63992.54, - "0.995": 72087.35 - }, - { - "0.2": 66573.79, - "0.5": 67779.69, - "0.8": 69094.05, - "0.05": 65391.41, - "0.35": 67233.62, - "0.65": 68374.34, - "0.95": 70310.33, - "0.005": 64021.16, - "0.995": 72033.26 - }, - { - "0.2": 66575.5, - "0.5": 67785.06, - "0.8": 69157.02, - "0.05": 65366.93, - "0.35": 67228.14, - "0.65": 68379.85, - "0.95": 70352.08, - "0.005": 63925.96, - "0.995": 71996.78 - }, - { - "0.2": 66584.94, - "0.5": 67796.87, - "0.8": 69145.08, - "0.05": 65378.25, - "0.35": 67219.08, - "0.65": 68397.1, - "0.95": 70341.59, - "0.005": 63954.93, - "0.995": 72098.52 - }, - { - "0.2": 66561.12, - "0.5": 67793.83, - "0.8": 69151.4, - "0.05": 65324.11, - "0.35": 67228.98, - "0.65": 68409.98, - "0.95": 70388.36, - "0.005": 63932.44, - "0.995": 71971.64 - }, - { - "0.2": 66526.77, - "0.5": 67814.08, - "0.8": 69152.48, - "0.05": 65301.78, - "0.35": 67238.1, - "0.65": 68422.58, - "0.95": 70443.26, - "0.005": 63820.1, - "0.995": 72206.19 - }, - { - "0.2": 66535.98, - "0.5": 67828.86, - "0.8": 69150.52, - "0.05": 65290.4, - "0.35": 67233.28, - "0.65": 68423.36, - "0.95": 70486.6, - "0.005": 63814.8, - "0.995": 72282.16 - }, - { - "0.2": 66511.91, - "0.5": 67847.06, - "0.8": 69161.21, - "0.05": 65314.19, - "0.35": 67207.52, - "0.65": 68424.98, - "0.95": 70531.69, - "0.005": 63744.16, - "0.995": 72378.34 - }, - { - "0.2": 66492.35, - "0.5": 67847.98, - "0.8": 69183.47, - "0.05": 65304.77, - "0.35": 67214.1, - "0.65": 68435.52, - "0.95": 70568.54, - "0.005": 63736.76, - "0.995": 72475.21 - }, - { - "0.2": 66477.57, - "0.5": 67853.07, - "0.8": 69195.36, - "0.05": 65256.29, - "0.35": 67217.3, - "0.65": 68439.13, - "0.95": 70613.27, - "0.005": 63724.09, - "0.995": 72409.87 - }, - { - "0.2": 66466.01, - "0.5": 67843.73, - "0.8": 69225.91, - "0.05": 65206.37, - "0.35": 67213.3, - "0.65": 68433.89, - "0.95": 70655.38, - "0.005": 63573.07, - "0.995": 72445.36 - }, - { - "0.2": 66486.62, - "0.5": 67849.79, - "0.8": 69243.47, - "0.05": 65230.94, - "0.35": 67189.43, - "0.65": 68454.65, - "0.95": 70667.12, - "0.005": 63792.08, - "0.995": 72486.65 - }, - { - "0.2": 66468.74, - "0.5": 67842.63, - "0.8": 69260.76, - "0.05": 65209.86, - "0.35": 67184.63, - "0.65": 68468.72, - "0.95": 70680.28, - "0.005": 63782.57, - "0.995": 72517.67 - }, - { - "0.2": 66453.93, - "0.5": 67879.8, - "0.8": 69252.61, - "0.05": 65147.04, - "0.35": 67202.42, - "0.65": 68485.56, - "0.95": 70712.35, - "0.005": 63863.22, - "0.995": 72600.22 - }, - { - "0.2": 66455.6, - "0.5": 67848.72, - "0.8": 69224.57, - "0.05": 65200.61, - "0.35": 67223.0, - "0.65": 68487.94, - "0.95": 70717.72, - "0.005": 63781.18, - "0.995": 72576.4 - }, - { - "0.2": 66458.5, - "0.5": 67851.13, - "0.8": 69271.73, - "0.05": 65146.09, - "0.35": 67235.96, - "0.65": 68472.26, - "0.95": 70757.57, - "0.005": 63773.74, - "0.995": 72626.68 - }, - { - "0.2": 66473.01, - "0.5": 67844.22, - "0.8": 69257.58, - "0.05": 65101.19, - "0.35": 67245.44, - "0.65": 68516.06, - "0.95": 70726.47, - "0.005": 63704.89, - "0.995": 72665.91 - }, - { - "0.2": 66452.6, - "0.5": 67858.03, - "0.8": 69282.53, - "0.05": 65136.79, - "0.35": 67238.93, - "0.65": 68485.97, - "0.95": 70725.76, - "0.005": 63496.92, - "0.995": 72807.9 - }, - { - "0.2": 66455.41, - "0.5": 67866.48, - "0.8": 69255.54, - "0.05": 65102.32, - "0.35": 67221.36, - "0.65": 68510.02, - "0.95": 70746.88, - "0.005": 63491.15, - "0.995": 72655.69 - }, - { - "0.2": 66455.62, - "0.5": 67869.04, - "0.8": 69257.71, - "0.05": 65097.53, - "0.35": 67260.38, - "0.65": 68529.33, - "0.95": 70768.09, - "0.005": 63395.16, - "0.995": 72630.99 - }, - { - "0.2": 66446.25, - "0.5": 67877.13, - "0.8": 69278.23, - "0.05": 65032.82, - "0.35": 67240.54, - "0.65": 68533.03, - "0.95": 70837.65, - "0.005": 63310.72, - "0.995": 72606.5 - }, - { - "0.2": 66464.14, - "0.5": 67870.1, - "0.8": 69326.97, - "0.05": 65014.59, - "0.35": 67240.63, - "0.65": 68502.15, - "0.95": 70865.95, - "0.005": 63347.66, - "0.995": 72737.06 - }, - { - "0.2": 66448.28, - "0.5": 67887.99, - "0.8": 69340.94, - "0.05": 65018.97, - "0.35": 67202.0, - "0.65": 68520.86, - "0.95": 70869.29, - "0.005": 63387.86, - "0.995": 72758.69 - }, - { - "0.2": 66428.51, - "0.5": 67886.85, - "0.8": 69334.6, - "0.05": 65011.09, - "0.35": 67219.17, - "0.65": 68497.62, - "0.95": 70916.59, - "0.005": 63323.96, - "0.995": 72776.38 - }, - { - "0.2": 66411.74, - "0.5": 67869.78, - "0.8": 69324.78, - "0.05": 65002.91, - "0.35": 67230.84, - "0.65": 68519.19, - "0.95": 70960.06, - "0.005": 63355.32, - "0.995": 72923.88 - }, - { - "0.2": 66419.54, - "0.5": 67852.75, - "0.8": 69312.68, - "0.05": 65003.03, - "0.35": 67216.91, - "0.65": 68515.65, - "0.95": 70945.12, - "0.005": 63292.34, - "0.995": 72753.72 - }, - { - "0.2": 66413.39, - "0.5": 67849.8, - "0.8": 69312.16, - "0.05": 64941.03, - "0.35": 67210.96, - "0.65": 68521.73, - "0.95": 70980.95, - "0.005": 63235.07, - "0.995": 72718.37 - }, - { - "0.2": 66420.97, - "0.5": 67847.91, - "0.8": 69306.32, - "0.05": 64900.59, - "0.35": 67200.97, - "0.65": 68506.31, - "0.95": 70951.55, - "0.005": 63311.24, - "0.995": 72732.89 - }, - { - "0.2": 66398.9, - "0.5": 67854.0, - "0.8": 69338.81, - "0.05": 64888.77, - "0.35": 67203.47, - "0.65": 68502.71, - "0.95": 70997.87, - "0.005": 63171.48, - "0.995": 72736.68 - }, - { - "0.2": 66379.77, - "0.5": 67861.39, - "0.8": 69347.59, - "0.05": 64898.21, - "0.35": 67182.09, - "0.65": 68495.9, - "0.95": 71052.29, - "0.005": 63122.26, - "0.995": 72950.53 - }, - { - "0.2": 66373.14, - "0.5": 67848.52, - "0.8": 69369.52, - "0.05": 64821.24, - "0.35": 67164.82, - "0.65": 68513.84, - "0.95": 71096.0, - "0.005": 63054.38, - "0.995": 73049.73 - }, - { - "0.2": 66331.75, - "0.5": 67861.69, - "0.8": 69404.22, - "0.05": 64793.81, - "0.35": 67162.76, - "0.65": 68505.36, - "0.95": 71001.64, - "0.005": 63008.51, - "0.995": 72920.81 - }, - { - "0.2": 66354.74, - "0.5": 67870.28, - "0.8": 69411.3, - "0.05": 64826.33, - "0.35": 67146.42, - "0.65": 68492.04, - "0.95": 70973.46, - "0.005": 63077.63, - "0.995": 72934.67 - }, - { - "0.2": 66325.22, - "0.5": 67848.44, - "0.8": 69407.33, - "0.05": 64804.78, - "0.35": 67174.45, - "0.65": 68497.09, - "0.95": 71016.48, - "0.005": 63035.2, - "0.995": 72850.09 - }, - { - "0.2": 66310.07, - "0.5": 67840.04, - "0.8": 69370.21, - "0.05": 64805.54, - "0.35": 67125.88, - "0.65": 68482.15, - "0.95": 71115.16, - "0.005": 62994.83, - "0.995": 72908.77 - }, - { - "0.2": 66294.33, - "0.5": 67845.75, - "0.8": 69395.1, - "0.05": 64807.07, - "0.35": 67134.09, - "0.65": 68469.89, - "0.95": 71086.16, - "0.005": 63080.68, - "0.995": 72893.83 - }, - { - "0.2": 66280.73, - "0.5": 67843.26, - "0.8": 69403.69, - "0.05": 64773.06, - "0.35": 67132.05, - "0.65": 68514.08, - "0.95": 71075.29, - "0.005": 63030.65, - "0.995": 72924.34 - }, - { - "0.2": 66275.49, - "0.5": 67844.26, - "0.8": 69425.19, - "0.05": 64757.92, - "0.35": 67169.88, - "0.65": 68529.5, - "0.95": 71100.09, - "0.005": 63125.5, - "0.995": 72796.04 - }, - { - "0.2": 66279.02, - "0.5": 67816.24, - "0.8": 69427.1, - "0.05": 64779.68, - "0.35": 67149.29, - "0.65": 68526.01, - "0.95": 71114.86, - "0.005": 63204.29, - "0.995": 72989.08 - }, - { - "0.2": 66250.29, - "0.5": 67848.66, - "0.8": 69464.57, - "0.05": 64753.7, - "0.35": 67141.72, - "0.65": 68538.52, - "0.95": 71180.35, - "0.005": 63209.63, - "0.995": 72955.21 - }, - { - "0.2": 66215.66, - "0.5": 67839.58, - "0.8": 69487.64, - "0.05": 64706.89, - "0.35": 67144.76, - "0.65": 68511.47, - "0.95": 71209.44, - "0.005": 63178.5, - "0.995": 72953.99 - }, - { - "0.2": 66225.9, - "0.5": 67835.71, - "0.8": 69487.91, - "0.05": 64661.41, - "0.35": 67157.3, - "0.65": 68534.26, - "0.95": 71251.6, - "0.005": 63139.96, - "0.995": 73007.04 - }, - { - "0.2": 66200.8, - "0.5": 67813.35, - "0.8": 69470.94, - "0.05": 64644.44, - "0.35": 67140.52, - "0.65": 68539.16, - "0.95": 71199.8, - "0.005": 63034.02, - "0.995": 73047.58 - }, - { - "0.2": 66220.24, - "0.5": 67821.76, - "0.8": 69439.13, - "0.05": 64632.4, - "0.35": 67093.04, - "0.65": 68561.13, - "0.95": 71244.16, - "0.005": 62950.25, - "0.995": 73129.79 - }, - { - "0.2": 66204.5, - "0.5": 67810.13, - "0.8": 69440.45, - "0.05": 64613.17, - "0.35": 67093.96, - "0.65": 68553.95, - "0.95": 71308.18, - "0.005": 62889.13, - "0.995": 73151.74 - }, - { - "0.2": 66194.13, - "0.5": 67843.02, - "0.8": 69453.16, - "0.05": 64621.74, - "0.35": 67113.78, - "0.65": 68582.6, - "0.95": 71291.48, - "0.005": 62885.75, - "0.995": 73099.46 - }, - { - "0.2": 66178.48, - "0.5": 67818.17, - "0.8": 69467.65, - "0.05": 64625.64, - "0.35": 67126.82, - "0.65": 68572.24, - "0.95": 71257.46, - "0.005": 62887.57, - "0.995": 73169.78 - }, - { - "0.2": 66166.78, - "0.5": 67835.01, - "0.8": 69495.64, - "0.05": 64608.33, - "0.35": 67114.45, - "0.65": 68583.74, - "0.95": 71244.51, - "0.005": 62765.26, - "0.995": 73082.72 - }, - { - "0.2": 66187.66, - "0.5": 67827.8, - "0.8": 69505.51, - "0.05": 64590.98, - "0.35": 67109.26, - "0.65": 68570.27, - "0.95": 71232.96, - "0.005": 62795.85, - "0.995": 73170.08 - }, - { - "0.2": 66167.19, - "0.5": 67818.95, - "0.8": 69516.34, - "0.05": 64556.64, - "0.35": 67127.82, - "0.65": 68562.55, - "0.95": 71274.53, - "0.005": 62767.41, - "0.995": 73189.18 - }, - { - "0.2": 66156.07, - "0.5": 67827.08, - "0.8": 69553.4, - "0.05": 64591.7, - "0.35": 67125.13, - "0.65": 68567.08, - "0.95": 71301.79, - "0.005": 62958.07, - "0.995": 73444.8 - }, - { - "0.2": 66173.23, - "0.5": 67841.66, - "0.8": 69588.17, - "0.05": 64570.66, - "0.35": 67094.14, - "0.65": 68589.4, - "0.95": 71321.85, - "0.005": 62949.01, - "0.995": 73345.35 - }, - { - "0.2": 66145.37, - "0.5": 67862.95, - "0.8": 69555.51, - "0.05": 64553.53, - "0.35": 67094.08, - "0.65": 68565.35, - "0.95": 71348.66, - "0.005": 62819.68, - "0.995": 73374.66 - }, - { - "0.2": 66125.77, - "0.5": 67831.46, - "0.8": 69614.95, - "0.05": 64547.05, - "0.35": 67073.22, - "0.65": 68517.89, - "0.95": 71368.65, - "0.005": 62948.5, - "0.995": 73413.17 - }, - { - "0.2": 66119.3, - "0.5": 67806.29, - "0.8": 69614.47, - "0.05": 64536.84, - "0.35": 67083.8, - "0.65": 68536.04, - "0.95": 71364.77, - "0.005": 62935.12, - "0.995": 73461.98 - }, - { - "0.2": 66153.32, - "0.5": 67826.06, - "0.8": 69628.61, - "0.05": 64533.53, - "0.35": 67075.75, - "0.65": 68580.96, - "0.95": 71388.31, - "0.005": 62998.07, - "0.995": 73496.8 - }, - { - "0.2": 66138.3, - "0.5": 67857.15, - "0.8": 69667.33, - "0.05": 64618.88, - "0.35": 67072.8, - "0.65": 68572.92, - "0.95": 71403.15, - "0.005": 62946.26, - "0.995": 73465.96 - }, - { - "0.2": 66140.9, - "0.5": 67850.1, - "0.8": 69666.03, - "0.05": 64651.23, - "0.35": 67056.68, - "0.65": 68580.62, - "0.95": 71421.01, - "0.005": 62947.58, - "0.995": 73507.86 - }, - { - "0.2": 66129.31, - "0.5": 67838.84, - "0.8": 69635.98, - "0.05": 64537.29, - "0.35": 67061.95, - "0.65": 68596.68, - "0.95": 71405.02, - "0.005": 62837.68, - "0.995": 73546.22 - }, - { - "0.2": 66138.18, - "0.5": 67821.55, - "0.8": 69672.45, - "0.05": 64503.01, - "0.35": 67060.16, - "0.65": 68588.78, - "0.95": 71408.26, - "0.005": 62895.46, - "0.995": 73681.92 - }, - { - "0.2": 66177.45, - "0.5": 67810.82, - "0.8": 69672.19, - "0.05": 64489.57, - "0.35": 67066.3, - "0.65": 68617.81, - "0.95": 71486.14, - "0.005": 62830.77, - "0.995": 73632.4 - }, - { - "0.2": 66159.33, - "0.5": 67814.12, - "0.8": 69671.41, - "0.05": 64528.82, - "0.35": 67059.61, - "0.65": 68602.14, - "0.95": 71547.62, - "0.005": 62812.61, - "0.995": 73750.44 - }, - { - "0.2": 66170.15, - "0.5": 67825.4, - "0.8": 69672.38, - "0.05": 64484.46, - "0.35": 67071.66, - "0.65": 68628.22, - "0.95": 71541.77, - "0.005": 62784.06, - "0.995": 73673.28 - }, - { - "0.2": 66136.0, - "0.5": 67829.73, - "0.8": 69661.18, - "0.05": 64463.19, - "0.35": 67081.1, - "0.65": 68643.62, - "0.95": 71540.08, - "0.005": 62809.31, - "0.995": 73698.89 - }, - { - "0.2": 66119.33, - "0.5": 67843.88, - "0.8": 69684.21, - "0.05": 64425.35, - "0.35": 67069.82, - "0.65": 68633.83, - "0.95": 71560.67, - "0.005": 62701.7, - "0.995": 73624.79 - }, - { - "0.2": 66128.83, - "0.5": 67827.67, - "0.8": 69696.35, - "0.05": 64422.79, - "0.35": 67091.87, - "0.65": 68594.79, - "0.95": 71583.87, - "0.005": 62748.61, - "0.995": 73713.64 - }, - { - "0.2": 66085.66, - "0.5": 67822.05, - "0.8": 69667.95, - "0.05": 64409.89, - "0.35": 67075.99, - "0.65": 68626.43, - "0.95": 71614.3, - "0.005": 62663.69, - "0.995": 73764.11 - }, - { - "0.2": 66074.97, - "0.5": 67820.95, - "0.8": 69692.18, - "0.05": 64452.96, - "0.35": 67064.53, - "0.65": 68599.19, - "0.95": 71571.85, - "0.005": 62656.8, - "0.995": 73883.25 - }, - { - "0.2": 66112.66, - "0.5": 67803.21, - "0.8": 69695.86, - "0.05": 64434.03, - "0.35": 67068.19, - "0.65": 68604.3, - "0.95": 71657.41, - "0.005": 62606.91, - "0.995": 73929.92 - }, - { - "0.2": 66102.09, - "0.5": 67829.04, - "0.8": 69691.13, - "0.05": 64469.24, - "0.35": 67101.54, - "0.65": 68609.1, - "0.95": 71666.1, - "0.005": 62641.43, - "0.995": 73933.9 - }, - { - "0.2": 66068.22, - "0.5": 67830.12, - "0.8": 69700.36, - "0.05": 64437.25, - "0.35": 67084.64, - "0.65": 68615.87, - "0.95": 71661.64, - "0.005": 62644.6, - "0.995": 74191.02 - }, - { - "0.2": 66074.92, - "0.5": 67831.8, - "0.8": 69721.95, - "0.05": 64463.46, - "0.35": 67086.4, - "0.65": 68638.49, - "0.95": 71667.94, - "0.005": 62516.82, - "0.995": 74236.85 - }, - { - "0.2": 66087.32, - "0.5": 67836.72, - "0.8": 69698.31, - "0.05": 64477.62, - "0.35": 67089.05, - "0.65": 68638.7, - "0.95": 71763.86, - "0.005": 62521.35, - "0.995": 74199.52 - }, - { - "0.2": 66086.27, - "0.5": 67841.25, - "0.8": 69710.41, - "0.05": 64468.44, - "0.35": 67066.85, - "0.65": 68646.8, - "0.95": 71687.49, - "0.005": 62473.97, - "0.995": 74081.94 - }, - { - "0.2": 66098.66, - "0.5": 67845.04, - "0.8": 69715.07, - "0.05": 64435.0, - "0.35": 67040.74, - "0.65": 68643.34, - "0.95": 71665.84, - "0.005": 62419.78, - "0.995": 74185.54 - }, - { - "0.2": 66106.39, - "0.5": 67853.1, - "0.8": 69744.88, - "0.05": 64397.81, - "0.35": 66998.89, - "0.65": 68656.29, - "0.95": 71744.51, - "0.005": 62362.09, - "0.995": 74045.5 - }, - { - "0.2": 66079.02, - "0.5": 67848.64, - "0.8": 69758.24, - "0.05": 64370.61, - "0.35": 67003.34, - "0.65": 68665.27, - "0.95": 71764.27, - "0.005": 62307.74, - "0.995": 74054.25 - }, - { - "0.2": 66093.86, - "0.5": 67852.32, - "0.8": 69756.73, - "0.05": 64392.11, - "0.35": 67024.3, - "0.65": 68678.54, - "0.95": 71715.66, - "0.005": 62381.5, - "0.995": 74010.82 - }, - { - "0.2": 66120.97, - "0.5": 67862.54, - "0.8": 69770.94, - "0.05": 64431.99, - "0.35": 67002.53, - "0.65": 68681.89, - "0.95": 71830.41, - "0.005": 62311.11, - "0.995": 73967.06 - }, - { - "0.2": 66122.7, - "0.5": 67846.14, - "0.8": 69765.33, - "0.05": 64414.33, - "0.35": 67028.77, - "0.65": 68687.63, - "0.95": 71816.99, - "0.005": 62131.07, - "0.995": 73978.35 - }, - { - "0.2": 66117.25, - "0.5": 67851.02, - "0.8": 69781.0, - "0.05": 64387.95, - "0.35": 67024.54, - "0.65": 68701.52, - "0.95": 71780.76, - "0.005": 62184.23, - "0.995": 74106.45 - }, - { - "0.2": 66127.86, - "0.5": 67833.4, - "0.8": 69786.72, - "0.05": 64347.2, - "0.35": 67036.22, - "0.65": 68710.31, - "0.95": 71782.66, - "0.005": 62327.43, - "0.995": 74146.46 - }, - { - "0.2": 66108.44, - "0.5": 67847.18, - "0.8": 69767.89, - "0.05": 64351.95, - "0.35": 67008.2, - "0.65": 68702.3, - "0.95": 71739.41, - "0.005": 62113.52, - "0.995": 74107.07 - }, - { - "0.2": 66102.44, - "0.5": 67861.62, - "0.8": 69793.25, - "0.05": 64377.35, - "0.35": 67030.37, - "0.65": 68703.85, - "0.95": 71739.06, - "0.005": 62084.08, - "0.995": 74121.03 - }, - { - "0.2": 66117.46, - "0.5": 67837.49, - "0.8": 69805.47, - "0.05": 64390.69, - "0.35": 67011.26, - "0.65": 68710.0, - "0.95": 71792.76, - "0.005": 62054.12, - "0.995": 73890.32 - }, - { - "0.2": 66098.0, - "0.5": 67834.94, - "0.8": 69809.65, - "0.05": 64378.86, - "0.35": 67020.3, - "0.65": 68712.47, - "0.95": 71829.52, - "0.005": 61996.99, - "0.995": 73966.35 - }, - { - "0.2": 66114.19, - "0.5": 67843.49, - "0.8": 69809.63, - "0.05": 64389.61, - "0.35": 67003.31, - "0.65": 68709.3, - "0.95": 71874.14, - "0.005": 62104.23, - "0.995": 74023.65 - }, - { - "0.2": 66137.01, - "0.5": 67830.11, - "0.8": 69824.97, - "0.05": 64417.54, - "0.35": 67029.01, - "0.65": 68687.24, - "0.95": 71882.73, - "0.005": 62042.05, - "0.995": 74191.02 - }, - { - "0.2": 66112.43, - "0.5": 67842.94, - "0.8": 69851.22, - "0.05": 64405.83, - "0.35": 67025.02, - "0.65": 68684.2, - "0.95": 71892.25, - "0.005": 61908.81, - "0.995": 74169.75 - }, - { - "0.2": 66088.42, - "0.5": 67851.34, - "0.8": 69848.5, - "0.05": 64409.92, - "0.35": 67031.16, - "0.65": 68696.97, - "0.95": 71839.39, - "0.005": 62001.89, - "0.995": 74165.06 - }, - { - "0.2": 66095.15, - "0.5": 67859.72, - "0.8": 69841.92, - "0.05": 64413.5, - "0.35": 67007.02, - "0.65": 68698.68, - "0.95": 71866.57, - "0.005": 62067.5, - "0.995": 74109.85 - }, - { - "0.2": 66094.14, - "0.5": 67849.65, - "0.8": 69837.11, - "0.05": 64414.12, - "0.35": 67009.85, - "0.65": 68702.37, - "0.95": 71866.78, - "0.005": 62146.74, - "0.995": 74073.56 - }, - { - "0.2": 66071.92, - "0.5": 67874.62, - "0.8": 69842.86, - "0.05": 64415.24, - "0.35": 67014.55, - "0.65": 68726.1, - "0.95": 71851.19, - "0.005": 62159.15, - "0.995": 74076.14 - }, - { - "0.2": 66077.98, - "0.5": 67872.29, - "0.8": 69875.55, - "0.05": 64413.83, - "0.35": 67032.87, - "0.65": 68718.03, - "0.95": 71857.9, - "0.005": 62164.2, - "0.995": 73912.71 - }, - { - "0.2": 66054.97, - "0.5": 67905.76, - "0.8": 69851.91, - "0.05": 64425.2, - "0.35": 67018.56, - "0.65": 68729.6, - "0.95": 71898.79, - "0.005": 62138.44, - "0.995": 74022.36 - }, - { - "0.2": 66049.68, - "0.5": 67903.73, - "0.8": 69867.36, - "0.05": 64432.49, - "0.35": 67023.58, - "0.65": 68723.42, - "0.95": 71946.67, - "0.005": 62211.31, - "0.995": 74080.8 - }, - { - "0.2": 66068.95, - "0.5": 67896.79, - "0.8": 69883.54, - "0.05": 64408.26, - "0.35": 67015.68, - "0.65": 68715.14, - "0.95": 71946.58, - "0.005": 62270.31, - "0.995": 74139.99 - }, - { - "0.2": 66065.96, - "0.5": 67900.64, - "0.8": 69880.5, - "0.05": 64386.77, - "0.35": 67034.13, - "0.65": 68754.72, - "0.95": 71920.65, - "0.005": 62122.26, - "0.995": 74185.08 - }, - { - "0.2": 66066.91, - "0.5": 67877.49, - "0.8": 69879.99, - "0.05": 64374.97, - "0.35": 67030.34, - "0.65": 68744.5, - "0.95": 71920.75, - "0.005": 62124.3, - "0.995": 74168.85 - }, - { - "0.2": 66075.44, - "0.5": 67876.86, - "0.8": 69882.45, - "0.05": 64409.81, - "0.35": 67019.92, - "0.65": 68770.44, - "0.95": 71952.29, - "0.005": 62183.1, - "0.995": 74107.0 - }, - { - "0.2": 66078.86, - "0.5": 67875.17, - "0.8": 69902.05, - "0.05": 64384.99, - "0.35": 67021.82, - "0.65": 68785.79, - "0.95": 72014.16, - "0.005": 62165.08, - "0.995": 74077.4 - }, - { - "0.2": 66079.72, - "0.5": 67868.7, - "0.8": 69892.36, - "0.05": 64385.71, - "0.35": 67033.2, - "0.65": 68811.31, - "0.95": 72003.43, - "0.005": 62028.25, - "0.995": 74108.23 - }, - { - "0.2": 66076.33, - "0.5": 67879.05, - "0.8": 69892.94, - "0.05": 64386.81, - "0.35": 67023.45, - "0.65": 68789.82, - "0.95": 72001.7, - "0.005": 61942.97, - "0.995": 74110.76 - }, - { - "0.2": 66097.65, - "0.5": 67868.57, - "0.8": 69885.7, - "0.05": 64361.72, - "0.35": 67019.98, - "0.65": 68786.47, - "0.95": 72046.68, - "0.005": 61973.86, - "0.995": 74067.73 - }, - { - "0.2": 66081.85, - "0.5": 67891.35, - "0.8": 69901.22, - "0.05": 64411.95, - "0.35": 67003.52, - "0.65": 68784.43, - "0.95": 72025.06, - "0.005": 62060.28, - "0.995": 74184.73 - }, - { - "0.2": 66084.75, - "0.5": 67913.77, - "0.8": 69912.71, - "0.05": 64387.96, - "0.35": 66993.61, - "0.65": 68797.84, - "0.95": 72048.06, - "0.005": 61967.28, - "0.995": 74128.2 - }, - { - "0.2": 66079.3, - "0.5": 67904.73, - "0.8": 69907.86, - "0.05": 64379.44, - "0.35": 67010.45, - "0.65": 68822.82, - "0.95": 72026.87, - "0.005": 61804.24, - "0.995": 74213.38 - }, - { - "0.2": 66069.6, - "0.5": 67898.49, - "0.8": 69900.3, - "0.05": 64410.3, - "0.35": 67018.16, - "0.65": 68810.22, - "0.95": 72009.51, - "0.005": 61736.41, - "0.995": 74266.79 + "0.2": 71181.0, + "0.5": 71181.0, + "0.8": 71181.0, + "0.05": 71181.0, + "0.35": 71181.0, + "0.65": 71181.0, + "0.95": 71181.0, + "0.005": 71181.0, + "0.995": 71181.0 + }, + { + "0.2": 71090.23, + "0.5": 71174.58, + "0.8": 71266.17, + "0.05": 70984.38, + "0.35": 71136.46, + "0.65": 71212.77, + "0.95": 71385.14, + "0.005": 70746.88, + "0.995": 71671.13 + }, + { + "0.2": 71039.71, + "0.5": 71181.55, + "0.8": 71320.69, + "0.05": 70876.51, + "0.35": 71116.51, + "0.65": 71241.55, + "0.95": 71491.13, + "0.005": 70517.52, + "0.995": 71805.65 + }, + { + "0.2": 70999.83, + "0.5": 71184.79, + "0.8": 71361.84, + "0.05": 70805.34, + "0.35": 71103.46, + "0.65": 71262.09, + "0.95": 71547.84, + "0.005": 70422.96, + "0.995": 71883.87 + }, + { + "0.2": 70980.13, + "0.5": 71185.26, + "0.8": 71385.64, + "0.05": 70764.6, + "0.35": 71095.16, + "0.65": 71279.9, + "0.95": 71587.35, + "0.005": 70335.81, + "0.995": 71993.29 + }, + { + "0.2": 70959.61, + "0.5": 71192.1, + "0.8": 71407.79, + "0.05": 70710.45, + "0.35": 71091.97, + "0.65": 71292.31, + "0.95": 71644.01, + "0.005": 70318.47, + "0.995": 72083.25 + }, + { + "0.2": 70941.21, + "0.5": 71194.13, + "0.8": 71436.95, + "0.05": 70682.21, + "0.35": 71084.8, + "0.65": 71298.84, + "0.95": 71701.82, + "0.005": 70250.89, + "0.995": 72088.55 + }, + { + "0.2": 70924.61, + "0.5": 71179.88, + "0.8": 71459.42, + "0.05": 70641.78, + "0.35": 71062.79, + "0.65": 71307.38, + "0.95": 71740.61, + "0.005": 70207.49, + "0.995": 72173.0 + }, + { + "0.2": 70899.25, + "0.5": 71175.8, + "0.8": 71475.28, + "0.05": 70621.6, + "0.35": 71055.43, + "0.65": 71310.19, + "0.95": 71772.12, + "0.005": 70187.77, + "0.995": 72188.75 + }, + { + "0.2": 70880.61, + "0.5": 71177.42, + "0.8": 71492.94, + "0.05": 70590.37, + "0.35": 71063.22, + "0.65": 71310.51, + "0.95": 71799.57, + "0.005": 70109.24, + "0.995": 72253.82 + }, + { + "0.2": 70867.16, + "0.5": 71168.95, + "0.8": 71499.87, + "0.05": 70553.11, + "0.35": 71047.36, + "0.65": 71320.04, + "0.95": 71838.64, + "0.005": 70039.78, + "0.995": 72267.2 + }, + { + "0.2": 70859.01, + "0.5": 71174.8, + "0.8": 71507.99, + "0.05": 70516.68, + "0.35": 71032.55, + "0.65": 71320.84, + "0.95": 71849.97, + "0.005": 70030.79, + "0.995": 72357.09 + }, + { + "0.2": 70845.75, + "0.5": 71175.24, + "0.8": 71532.98, + "0.05": 70458.78, + "0.35": 71028.2, + "0.65": 71326.41, + "0.95": 71869.55, + "0.005": 69983.32, + "0.995": 72384.01 + }, + { + "0.2": 70840.86, + "0.5": 71173.62, + "0.8": 71556.08, + "0.05": 70438.25, + "0.35": 71028.24, + "0.65": 71347.15, + "0.95": 71896.82, + "0.005": 69940.41, + "0.995": 72427.94 + }, + { + "0.2": 70818.43, + "0.5": 71175.94, + "0.8": 71574.31, + "0.05": 70431.64, + "0.35": 71018.77, + "0.65": 71363.64, + "0.95": 71953.96, + "0.005": 69937.56, + "0.995": 72395.78 + }, + { + "0.2": 70793.51, + "0.5": 71180.07, + "0.8": 71590.68, + "0.05": 70406.76, + "0.35": 71010.71, + "0.65": 71369.19, + "0.95": 71970.69, + "0.005": 69912.47, + "0.995": 72490.17 + }, + { + "0.2": 70785.43, + "0.5": 71185.16, + "0.8": 71612.49, + "0.05": 70388.18, + "0.35": 71003.6, + "0.65": 71383.17, + "0.95": 72014.2, + "0.005": 69908.11, + "0.995": 72465.62 + }, + { + "0.2": 70776.09, + "0.5": 71187.84, + "0.8": 71621.19, + "0.05": 70388.95, + "0.35": 71005.16, + "0.65": 71394.39, + "0.95": 72044.82, + "0.005": 69941.27, + "0.995": 72475.73 + }, + { + "0.2": 70770.71, + "0.5": 71204.75, + "0.8": 71632.24, + "0.05": 70359.65, + "0.35": 71006.96, + "0.65": 71404.67, + "0.95": 72062.35, + "0.005": 69916.94, + "0.995": 72509.59 + }, + { + "0.2": 70768.79, + "0.5": 71227.23, + "0.8": 71653.43, + "0.05": 70324.11, + "0.35": 71011.84, + "0.65": 71417.84, + "0.95": 72085.58, + "0.005": 69882.41, + "0.995": 72591.15 + }, + { + "0.2": 70745.88, + "0.5": 71210.14, + "0.8": 71670.87, + "0.05": 70327.37, + "0.35": 71000.83, + "0.65": 71428.7, + "0.95": 72099.68, + "0.005": 69784.73, + "0.995": 72621.97 + }, + { + "0.2": 70753.04, + "0.5": 71216.3, + "0.8": 71681.35, + "0.05": 70306.68, + "0.35": 70998.06, + "0.65": 71427.63, + "0.95": 72130.62, + "0.005": 69694.12, + "0.995": 72727.54 + }, + { + "0.2": 70749.28, + "0.5": 71208.79, + "0.8": 71706.52, + "0.05": 70288.72, + "0.35": 70984.79, + "0.65": 71441.71, + "0.95": 72129.95, + "0.005": 69707.81, + "0.995": 72821.69 + }, + { + "0.2": 70742.11, + "0.5": 71216.0, + "0.8": 71720.86, + "0.05": 70258.4, + "0.35": 70996.71, + "0.65": 71436.89, + "0.95": 72150.84, + "0.005": 69677.63, + "0.995": 72763.86 + }, + { + "0.2": 70730.57, + "0.5": 71211.78, + "0.8": 71727.67, + "0.05": 70251.27, + "0.35": 70986.63, + "0.65": 71449.92, + "0.95": 72209.96, + "0.005": 69690.07, + "0.995": 72879.02 + }, + { + "0.2": 70727.65, + "0.5": 71218.47, + "0.8": 71746.91, + "0.05": 70227.51, + "0.35": 70993.22, + "0.65": 71455.67, + "0.95": 72220.09, + "0.005": 69657.88, + "0.995": 72889.81 + }, + { + "0.2": 70715.74, + "0.5": 71222.73, + "0.8": 71749.25, + "0.05": 70212.64, + "0.35": 70985.53, + "0.65": 71473.0, + "0.95": 72243.59, + "0.005": 69566.83, + "0.995": 72961.62 + }, + { + "0.2": 70720.19, + "0.5": 71219.55, + "0.8": 71759.56, + "0.05": 70218.53, + "0.35": 70973.31, + "0.65": 71478.33, + "0.95": 72257.88, + "0.005": 69572.46, + "0.995": 72972.63 + }, + { + "0.2": 70708.52, + "0.5": 71211.37, + "0.8": 71785.2, + "0.05": 70213.45, + "0.35": 70974.5, + "0.65": 71486.86, + "0.95": 72293.02, + "0.005": 69617.88, + "0.995": 72980.42 + }, + { + "0.2": 70680.73, + "0.5": 71235.03, + "0.8": 71811.41, + "0.05": 70151.69, + "0.35": 70989.96, + "0.65": 71493.7, + "0.95": 72321.94, + "0.005": 69529.3, + "0.995": 72960.19 + }, + { + "0.2": 70690.53, + "0.5": 71246.6, + "0.8": 71816.76, + "0.05": 70127.9, + "0.35": 70987.22, + "0.65": 71491.54, + "0.95": 72422.06, + "0.005": 69572.36, + "0.995": 73083.31 + }, + { + "0.2": 70656.72, + "0.5": 71243.19, + "0.8": 71821.5, + "0.05": 70088.53, + "0.35": 70983.58, + "0.65": 71488.91, + "0.95": 72439.6, + "0.005": 69495.17, + "0.995": 73181.52 + }, + { + "0.2": 70658.23, + "0.5": 71232.92, + "0.8": 71816.9, + "0.05": 70064.72, + "0.35": 70980.71, + "0.65": 71486.93, + "0.95": 72474.5, + "0.005": 69445.06, + "0.995": 73266.41 + }, + { + "0.2": 70658.42, + "0.5": 71254.78, + "0.8": 71826.19, + "0.05": 70071.68, + "0.35": 70972.8, + "0.65": 71487.29, + "0.95": 72442.11, + "0.005": 69430.81, + "0.995": 73299.12 + }, + { + "0.2": 70630.97, + "0.5": 71245.87, + "0.8": 71832.83, + "0.05": 70024.0, + "0.35": 70970.22, + "0.65": 71507.41, + "0.95": 72443.36, + "0.005": 69310.03, + "0.995": 73240.14 + }, + { + "0.2": 70627.35, + "0.5": 71255.4, + "0.8": 71843.45, + "0.05": 69987.17, + "0.35": 70980.56, + "0.65": 71500.63, + "0.95": 72481.5, + "0.005": 69243.32, + "0.995": 73350.93 + }, + { + "0.2": 70620.38, + "0.5": 71242.31, + "0.8": 71862.88, + "0.05": 69962.18, + "0.35": 70972.08, + "0.65": 71524.17, + "0.95": 72520.93, + "0.005": 69203.64, + "0.995": 73433.74 + }, + { + "0.2": 70612.4, + "0.5": 71249.63, + "0.8": 71874.87, + "0.05": 69978.11, + "0.35": 70961.91, + "0.65": 71533.5, + "0.95": 72551.8, + "0.005": 69209.78, + "0.995": 73506.64 + }, + { + "0.2": 70587.32, + "0.5": 71237.48, + "0.8": 71883.54, + "0.05": 69974.08, + "0.35": 70940.12, + "0.65": 71520.7, + "0.95": 72548.99, + "0.005": 69100.26, + "0.995": 73523.68 + }, + { + "0.2": 70593.67, + "0.5": 71240.89, + "0.8": 71884.75, + "0.05": 69964.81, + "0.35": 70940.61, + "0.65": 71519.87, + "0.95": 72588.97, + "0.005": 69107.28, + "0.995": 73438.21 + }, + { + "0.2": 70580.86, + "0.5": 71234.14, + "0.8": 71906.07, + "0.05": 69922.52, + "0.35": 70933.1, + "0.65": 71532.54, + "0.95": 72604.63, + "0.005": 69088.78, + "0.995": 73567.86 + }, + { + "0.2": 70576.5, + "0.5": 71245.46, + "0.8": 71911.68, + "0.05": 69903.69, + "0.35": 70926.73, + "0.65": 71550.94, + "0.95": 72603.72, + "0.005": 69103.4, + "0.995": 73609.18 + }, + { + "0.2": 70572.21, + "0.5": 71246.66, + "0.8": 71933.87, + "0.05": 69879.54, + "0.35": 70931.76, + "0.65": 71553.99, + "0.95": 72587.37, + "0.005": 69120.18, + "0.995": 73672.7 + }, + { + "0.2": 70557.15, + "0.5": 71240.39, + "0.8": 71930.71, + "0.05": 69854.11, + "0.35": 70935.71, + "0.65": 71575.1, + "0.95": 72624.69, + "0.005": 69027.96, + "0.995": 73654.93 + }, + { + "0.2": 70535.37, + "0.5": 71227.53, + "0.8": 71935.83, + "0.05": 69865.67, + "0.35": 70924.31, + "0.65": 71573.2, + "0.95": 72643.56, + "0.005": 69107.02, + "0.995": 73696.32 + }, + { + "0.2": 70534.07, + "0.5": 71233.69, + "0.8": 71944.52, + "0.05": 69832.32, + "0.35": 70924.45, + "0.65": 71570.19, + "0.95": 72640.79, + "0.005": 68952.59, + "0.995": 73706.55 + }, + { + "0.2": 70500.39, + "0.5": 71240.15, + "0.8": 71942.67, + "0.05": 69814.07, + "0.35": 70913.98, + "0.65": 71582.62, + "0.95": 72661.15, + "0.005": 68882.99, + "0.995": 73678.94 + }, + { + "0.2": 70513.3, + "0.5": 71238.7, + "0.8": 71978.16, + "0.05": 69800.47, + "0.35": 70908.13, + "0.65": 71583.83, + "0.95": 72684.28, + "0.005": 68869.94, + "0.995": 73694.09 + }, + { + "0.2": 70504.16, + "0.5": 71239.54, + "0.8": 71965.72, + "0.05": 69786.11, + "0.35": 70913.48, + "0.65": 71573.28, + "0.95": 72678.48, + "0.005": 68799.85, + "0.995": 73657.04 + }, + { + "0.2": 70488.88, + "0.5": 71240.34, + "0.8": 71964.14, + "0.05": 69740.21, + "0.35": 70914.83, + "0.65": 71574.89, + "0.95": 72696.46, + "0.005": 68818.47, + "0.995": 73801.67 + }, + { + "0.2": 70485.89, + "0.5": 71244.95, + "0.8": 71979.69, + "0.05": 69747.16, + "0.35": 70904.76, + "0.65": 71585.96, + "0.95": 72694.13, + "0.005": 68777.09, + "0.995": 73741.63 + }, + { + "0.2": 70486.12, + "0.5": 71245.34, + "0.8": 71971.59, + "0.05": 69725.41, + "0.35": 70898.32, + "0.65": 71594.16, + "0.95": 72705.0, + "0.005": 68776.23, + "0.995": 73745.12 + }, + { + "0.2": 70457.56, + "0.5": 71243.01, + "0.8": 71988.87, + "0.05": 69715.62, + "0.35": 70915.62, + "0.65": 71611.68, + "0.95": 72723.21, + "0.005": 68809.46, + "0.995": 73812.73 + }, + { + "0.2": 70464.11, + "0.5": 71255.74, + "0.8": 72000.99, + "0.05": 69708.11, + "0.35": 70903.36, + "0.65": 71607.92, + "0.95": 72728.25, + "0.005": 68685.25, + "0.995": 73817.12 + }, + { + "0.2": 70459.18, + "0.5": 71253.15, + "0.8": 72020.09, + "0.05": 69723.15, + "0.35": 70913.38, + "0.65": 71605.54, + "0.95": 72751.51, + "0.005": 68718.95, + "0.995": 73782.47 + }, + { + "0.2": 70435.94, + "0.5": 71247.22, + "0.8": 72028.53, + "0.05": 69680.76, + "0.35": 70904.63, + "0.65": 71602.76, + "0.95": 72789.67, + "0.005": 68687.57, + "0.995": 73764.41 + }, + { + "0.2": 70428.44, + "0.5": 71249.66, + "0.8": 72044.61, + "0.05": 69703.44, + "0.35": 70894.55, + "0.65": 71621.52, + "0.95": 72812.62, + "0.005": 68673.83, + "0.995": 73846.55 + }, + { + "0.2": 70411.98, + "0.5": 71244.51, + "0.8": 72058.76, + "0.05": 69697.41, + "0.35": 70885.11, + "0.65": 71628.72, + "0.95": 72845.14, + "0.005": 68724.6, + "0.995": 73900.53 + }, + { + "0.2": 70428.23, + "0.5": 71228.53, + "0.8": 72065.62, + "0.05": 69686.99, + "0.35": 70863.58, + "0.65": 71625.27, + "0.95": 72841.46, + "0.005": 68714.35, + "0.995": 73915.83 + }, + { + "0.2": 70428.97, + "0.5": 71239.29, + "0.8": 72058.14, + "0.05": 69663.71, + "0.35": 70873.94, + "0.65": 71621.86, + "0.95": 72850.6, + "0.005": 68719.79, + "0.995": 73892.81 + }, + { + "0.2": 70439.27, + "0.5": 71250.78, + "0.8": 72083.82, + "0.05": 69652.22, + "0.35": 70880.96, + "0.65": 71633.86, + "0.95": 72882.01, + "0.005": 68761.96, + "0.995": 73949.21 + }, + { + "0.2": 70416.81, + "0.5": 71243.03, + "0.8": 72083.91, + "0.05": 69623.52, + "0.35": 70878.51, + "0.65": 71629.75, + "0.95": 72883.72, + "0.005": 68671.99, + "0.995": 73957.57 + }, + { + "0.2": 70437.82, + "0.5": 71242.49, + "0.8": 72109.5, + "0.05": 69647.64, + "0.35": 70881.52, + "0.65": 71648.69, + "0.95": 72896.94, + "0.005": 68646.37, + "0.995": 74137.04 + }, + { + "0.2": 70436.86, + "0.5": 71269.21, + "0.8": 72116.48, + "0.05": 69631.86, + "0.35": 70872.22, + "0.65": 71656.35, + "0.95": 72905.98, + "0.005": 68660.78, + "0.995": 74102.13 + }, + { + "0.2": 70422.44, + "0.5": 71255.28, + "0.8": 72126.59, + "0.05": 69586.76, + "0.35": 70871.0, + "0.65": 71643.03, + "0.95": 72907.99, + "0.005": 68559.44, + "0.995": 74054.16 + }, + { + "0.2": 70421.26, + "0.5": 71254.27, + "0.8": 72145.9, + "0.05": 69594.63, + "0.35": 70867.23, + "0.65": 71656.61, + "0.95": 72877.39, + "0.005": 68587.42, + "0.995": 74008.41 + }, + { + "0.2": 70414.0, + "0.5": 71251.43, + "0.8": 72139.4, + "0.05": 69572.96, + "0.35": 70857.9, + "0.65": 71656.53, + "0.95": 72935.03, + "0.005": 68544.06, + "0.995": 74070.78 + }, + { + "0.2": 70400.42, + "0.5": 71245.35, + "0.8": 72138.41, + "0.05": 69549.1, + "0.35": 70847.39, + "0.65": 71652.78, + "0.95": 72951.76, + "0.005": 68546.58, + "0.995": 74078.75 + }, + { + "0.2": 70398.13, + "0.5": 71250.57, + "0.8": 72140.19, + "0.05": 69524.19, + "0.35": 70838.48, + "0.65": 71667.09, + "0.95": 72935.33, + "0.005": 68571.41, + "0.995": 74175.83 + }, + { + "0.2": 70375.19, + "0.5": 71261.9, + "0.8": 72135.2, + "0.05": 69528.54, + "0.35": 70821.25, + "0.65": 71665.33, + "0.95": 72960.94, + "0.005": 68546.32, + "0.995": 74086.55 + }, + { + "0.2": 70358.02, + "0.5": 71259.79, + "0.8": 72142.08, + "0.05": 69491.46, + "0.35": 70826.26, + "0.65": 71667.41, + "0.95": 72968.65, + "0.005": 68490.95, + "0.995": 74129.67 + }, + { + "0.2": 70377.34, + "0.5": 71244.97, + "0.8": 72139.27, + "0.05": 69483.39, + "0.35": 70835.31, + "0.65": 71662.99, + "0.95": 72990.8, + "0.005": 68434.2, + "0.995": 74117.85 + }, + { + "0.2": 70364.66, + "0.5": 71262.33, + "0.8": 72146.78, + "0.05": 69502.84, + "0.35": 70826.03, + "0.65": 71675.29, + "0.95": 73012.96, + "0.005": 68482.23, + "0.995": 74137.73 + }, + { + "0.2": 70388.84, + "0.5": 71265.93, + "0.8": 72159.3, + "0.05": 69476.1, + "0.35": 70831.01, + "0.65": 71700.72, + "0.95": 73008.75, + "0.005": 68544.42, + "0.995": 74073.54 + }, + { + "0.2": 70386.97, + "0.5": 71288.64, + "0.8": 72161.58, + "0.05": 69484.55, + "0.35": 70831.63, + "0.65": 71700.09, + "0.95": 73002.23, + "0.005": 68561.03, + "0.995": 74059.97 + }, + { + "0.2": 70386.27, + "0.5": 71272.49, + "0.8": 72143.1, + "0.05": 69479.07, + "0.35": 70821.42, + "0.65": 71697.24, + "0.95": 72988.35, + "0.005": 68593.09, + "0.995": 74042.97 + }, + { + "0.2": 70364.83, + "0.5": 71257.82, + "0.8": 72152.69, + "0.05": 69450.48, + "0.35": 70830.11, + "0.65": 71705.12, + "0.95": 72989.35, + "0.005": 68552.52, + "0.995": 74098.39 + }, + { + "0.2": 70362.08, + "0.5": 71247.38, + "0.8": 72154.53, + "0.05": 69450.23, + "0.35": 70821.67, + "0.65": 71707.16, + "0.95": 72988.94, + "0.005": 68632.96, + "0.995": 74074.82 + }, + { + "0.2": 70359.38, + "0.5": 71254.87, + "0.8": 72178.12, + "0.05": 69439.43, + "0.35": 70838.85, + "0.65": 71723.06, + "0.95": 73040.96, + "0.005": 68626.91, + "0.995": 74163.09 + }, + { + "0.2": 70357.18, + "0.5": 71263.15, + "0.8": 72170.33, + "0.05": 69427.14, + "0.35": 70843.72, + "0.65": 71710.64, + "0.95": 73036.75, + "0.005": 68656.62, + "0.995": 74217.15 + }, + { + "0.2": 70344.36, + "0.5": 71272.69, + "0.8": 72184.11, + "0.05": 69438.75, + "0.35": 70841.28, + "0.65": 71713.47, + "0.95": 73042.76, + "0.005": 68639.77, + "0.995": 74145.82 + }, + { + "0.2": 70345.0, + "0.5": 71267.12, + "0.8": 72203.2, + "0.05": 69426.19, + "0.35": 70827.47, + "0.65": 71716.73, + "0.95": 73048.48, + "0.005": 68529.72, + "0.995": 74201.01 + }, + { + "0.2": 70368.84, + "0.5": 71259.81, + "0.8": 72223.55, + "0.05": 69412.16, + "0.35": 70825.4, + "0.65": 71702.6, + "0.95": 73066.76, + "0.005": 68623.71, + "0.995": 74229.24 + }, + { + "0.2": 70353.37, + "0.5": 71251.83, + "0.8": 72216.05, + "0.05": 69394.51, + "0.35": 70841.29, + "0.65": 71712.82, + "0.95": 73105.93, + "0.005": 68530.69, + "0.995": 74312.73 + }, + { + "0.2": 70347.66, + "0.5": 71255.73, + "0.8": 72224.16, + "0.05": 69371.89, + "0.35": 70824.66, + "0.65": 71706.09, + "0.95": 73129.72, + "0.005": 68652.37, + "0.995": 74300.93 + }, + { + "0.2": 70344.94, + "0.5": 71260.62, + "0.8": 72226.36, + "0.05": 69393.22, + "0.35": 70825.1, + "0.65": 71715.72, + "0.95": 73135.79, + "0.005": 68599.26, + "0.995": 74289.66 + }, + { + "0.2": 70346.78, + "0.5": 71269.17, + "0.8": 72231.89, + "0.05": 69402.71, + "0.35": 70838.84, + "0.65": 71724.58, + "0.95": 73132.34, + "0.005": 68576.0, + "0.995": 74372.14 + }, + { + "0.2": 70325.88, + "0.5": 71259.54, + "0.8": 72211.91, + "0.05": 69386.02, + "0.35": 70840.29, + "0.65": 71726.8, + "0.95": 73119.43, + "0.005": 68486.53, + "0.995": 74416.9 + }, + { + "0.2": 70309.8, + "0.5": 71277.86, + "0.8": 72230.36, + "0.05": 69387.79, + "0.35": 70845.92, + "0.65": 71713.53, + "0.95": 73101.02, + "0.005": 68528.11, + "0.995": 74362.89 + }, + { + "0.2": 70311.91, + "0.5": 71272.82, + "0.8": 72220.76, + "0.05": 69355.95, + "0.35": 70829.87, + "0.65": 71717.39, + "0.95": 73125.13, + "0.005": 68545.95, + "0.995": 74349.88 + }, + { + "0.2": 70304.74, + "0.5": 71250.18, + "0.8": 72234.73, + "0.05": 69365.83, + "0.35": 70820.62, + "0.65": 71708.05, + "0.95": 73137.5, + "0.005": 68483.5, + "0.995": 74378.92 + }, + { + "0.2": 70308.02, + "0.5": 71245.64, + "0.8": 72218.01, + "0.05": 69368.9, + "0.35": 70817.45, + "0.65": 71719.67, + "0.95": 73163.48, + "0.005": 68444.07, + "0.995": 74380.39 + }, + { + "0.2": 70316.28, + "0.5": 71263.84, + "0.8": 72242.38, + "0.05": 69350.92, + "0.35": 70845.68, + "0.65": 71724.96, + "0.95": 73182.12, + "0.005": 68389.7, + "0.995": 74380.8 + }, + { + "0.2": 70283.44, + "0.5": 71259.13, + "0.8": 72245.7, + "0.05": 69381.17, + "0.35": 70834.17, + "0.65": 71717.06, + "0.95": 73175.49, + "0.005": 68386.97, + "0.995": 74408.47 + }, + { + "0.2": 70316.05, + "0.5": 71261.1, + "0.8": 72245.95, + "0.05": 69337.77, + "0.35": 70818.97, + "0.65": 71718.76, + "0.95": 73206.33, + "0.005": 68356.59, + "0.995": 74470.55 + }, + { + "0.2": 70310.02, + "0.5": 71261.59, + "0.8": 72237.26, + "0.05": 69388.52, + "0.35": 70829.65, + "0.65": 71725.88, + "0.95": 73231.48, + "0.005": 68344.22, + "0.995": 74443.42 + }, + { + "0.2": 70309.2, + "0.5": 71269.21, + "0.8": 72253.49, + "0.05": 69343.45, + "0.35": 70817.02, + "0.65": 71735.23, + "0.95": 73216.35, + "0.005": 68331.91, + "0.995": 74444.6 + }, + { + "0.2": 70296.45, + "0.5": 71265.29, + "0.8": 72282.4, + "0.05": 69320.96, + "0.35": 70811.73, + "0.65": 71728.38, + "0.95": 73236.59, + "0.005": 68268.47, + "0.995": 74535.58 + }, + { + "0.2": 70290.96, + "0.5": 71261.96, + "0.8": 72284.02, + "0.05": 69324.98, + "0.35": 70800.89, + "0.65": 71739.16, + "0.95": 73222.62, + "0.005": 68335.71, + "0.995": 74616.03 + }, + { + "0.2": 70277.21, + "0.5": 71275.9, + "0.8": 72309.0, + "0.05": 69327.7, + "0.35": 70803.77, + "0.65": 71736.87, + "0.95": 73242.47, + "0.005": 68291.36, + "0.995": 74704.62 + }, + { + "0.2": 70279.96, + "0.5": 71277.99, + "0.8": 72302.21, + "0.05": 69320.15, + "0.35": 70799.59, + "0.65": 71731.46, + "0.95": 73250.1, + "0.005": 68261.17, + "0.995": 74700.12 + }, + { + "0.2": 70267.51, + "0.5": 71271.72, + "0.8": 72305.67, + "0.05": 69295.68, + "0.35": 70805.6, + "0.65": 71735.21, + "0.95": 73264.23, + "0.005": 68267.29, + "0.995": 74739.95 + }, + { + "0.2": 70283.34, + "0.5": 71280.1, + "0.8": 72306.82, + "0.05": 69284.61, + "0.35": 70819.52, + "0.65": 71745.48, + "0.95": 73301.38, + "0.005": 68333.84, + "0.995": 74782.76 + }, + { + "0.2": 70279.7, + "0.5": 71277.08, + "0.8": 72321.19, + "0.05": 69288.51, + "0.35": 70816.05, + "0.65": 71752.7, + "0.95": 73307.46, + "0.005": 68285.08, + "0.995": 74783.2 + }, + { + "0.2": 70282.53, + "0.5": 71280.69, + "0.8": 72319.96, + "0.05": 69291.12, + "0.35": 70827.25, + "0.65": 71746.12, + "0.95": 73317.89, + "0.005": 68375.13, + "0.995": 74827.78 + }, + { + "0.2": 70274.35, + "0.5": 71289.16, + "0.8": 72325.83, + "0.05": 69323.44, + "0.35": 70821.28, + "0.65": 71751.64, + "0.95": 73376.11, + "0.005": 68360.79, + "0.995": 74874.73 + }, + { + "0.2": 70270.23, + "0.5": 71297.85, + "0.8": 72352.13, + "0.05": 69278.24, + "0.35": 70823.92, + "0.65": 71758.06, + "0.95": 73374.83, + "0.005": 68316.77, + "0.995": 74884.21 + }, + { + "0.2": 70251.51, + "0.5": 71301.97, + "0.8": 72335.82, + "0.05": 69278.19, + "0.35": 70816.95, + "0.65": 71766.45, + "0.95": 73385.27, + "0.005": 68249.72, + "0.995": 74922.34 + }, + { + "0.2": 70259.49, + "0.5": 71301.4, + "0.8": 72346.36, + "0.05": 69238.0, + "0.35": 70828.28, + "0.65": 71778.7, + "0.95": 73353.35, + "0.005": 68306.24, + "0.995": 74879.23 + }, + { + "0.2": 70259.89, + "0.5": 71312.26, + "0.8": 72353.81, + "0.05": 69232.81, + "0.35": 70836.2, + "0.65": 71783.23, + "0.95": 73355.41, + "0.005": 68300.15, + "0.995": 74866.11 + }, + { + "0.2": 70251.01, + "0.5": 71312.76, + "0.8": 72360.75, + "0.05": 69237.64, + "0.35": 70834.02, + "0.65": 71779.43, + "0.95": 73353.57, + "0.005": 68300.79, + "0.995": 74751.42 + }, + { + "0.2": 70254.2, + "0.5": 71314.07, + "0.8": 72358.85, + "0.05": 69217.68, + "0.35": 70828.09, + "0.65": 71782.51, + "0.95": 73382.91, + "0.005": 68308.26, + "0.995": 74748.59 + }, + { + "0.2": 70249.47, + "0.5": 71309.39, + "0.8": 72362.69, + "0.05": 69208.82, + "0.35": 70830.09, + "0.65": 71785.43, + "0.95": 73397.95, + "0.005": 68267.9, + "0.995": 74789.39 + }, + { + "0.2": 70244.4, + "0.5": 71316.17, + "0.8": 72367.83, + "0.05": 69221.63, + "0.35": 70817.25, + "0.65": 71794.74, + "0.95": 73412.3, + "0.005": 68248.68, + "0.995": 74842.4 + }, + { + "0.2": 70233.13, + "0.5": 71310.84, + "0.8": 72364.65, + "0.05": 69212.22, + "0.35": 70808.76, + "0.65": 71787.09, + "0.95": 73432.38, + "0.005": 68298.35, + "0.995": 74824.33 + }, + { + "0.2": 70221.94, + "0.5": 71320.62, + "0.8": 72351.46, + "0.05": 69222.57, + "0.35": 70810.84, + "0.65": 71795.85, + "0.95": 73417.59, + "0.005": 68303.39, + "0.995": 74860.03 + }, + { + "0.2": 70235.12, + "0.5": 71322.8, + "0.8": 72359.65, + "0.05": 69256.53, + "0.35": 70809.34, + "0.65": 71793.48, + "0.95": 73438.58, + "0.005": 68234.73, + "0.995": 74957.82 + }, + { + "0.2": 70243.93, + "0.5": 71325.21, + "0.8": 72374.96, + "0.05": 69235.99, + "0.35": 70817.33, + "0.65": 71801.55, + "0.95": 73474.06, + "0.005": 68240.14, + "0.995": 75001.11 + }, + { + "0.2": 70251.87, + "0.5": 71332.9, + "0.8": 72381.27, + "0.05": 69255.0, + "0.35": 70823.44, + "0.65": 71796.49, + "0.95": 73474.69, + "0.005": 68205.46, + "0.995": 75096.11 + }, + { + "0.2": 70240.68, + "0.5": 71327.52, + "0.8": 72393.91, + "0.05": 69231.54, + "0.35": 70828.31, + "0.65": 71800.58, + "0.95": 73465.35, + "0.005": 68169.65, + "0.995": 75056.38 + }, + { + "0.2": 70243.74, + "0.5": 71318.32, + "0.8": 72380.01, + "0.05": 69252.73, + "0.35": 70844.82, + "0.65": 71790.54, + "0.95": 73508.26, + "0.005": 68113.38, + "0.995": 75063.07 + }, + { + "0.2": 70234.78, + "0.5": 71325.59, + "0.8": 72402.04, + "0.05": 69232.61, + "0.35": 70843.7, + "0.65": 71810.27, + "0.95": 73503.24, + "0.005": 68149.42, + "0.995": 75128.15 + }, + { + "0.2": 70251.05, + "0.5": 71312.05, + "0.8": 72386.15, + "0.05": 69232.85, + "0.35": 70848.13, + "0.65": 71829.13, + "0.95": 73501.97, + "0.005": 68125.15, + "0.995": 75074.5 + }, + { + "0.2": 70232.28, + "0.5": 71310.78, + "0.8": 72367.36, + "0.05": 69230.82, + "0.35": 70829.63, + "0.65": 71811.62, + "0.95": 73500.81, + "0.005": 68121.9, + "0.995": 75183.58 + }, + { + "0.2": 70223.33, + "0.5": 71314.77, + "0.8": 72377.91, + "0.05": 69250.95, + "0.35": 70837.77, + "0.65": 71816.28, + "0.95": 73527.14, + "0.005": 68195.94, + "0.995": 75172.34 + }, + { + "0.2": 70239.27, + "0.5": 71309.7, + "0.8": 72374.34, + "0.05": 69229.18, + "0.35": 70831.1, + "0.65": 71812.73, + "0.95": 73507.82, + "0.005": 68125.41, + "0.995": 75213.81 + }, + { + "0.2": 70236.5, + "0.5": 71295.31, + "0.8": 72383.05, + "0.05": 69237.16, + "0.35": 70813.16, + "0.65": 71802.47, + "0.95": 73520.35, + "0.005": 68187.62, + "0.995": 75125.95 + }, + { + "0.2": 70221.5, + "0.5": 71292.37, + "0.8": 72371.2, + "0.05": 69207.88, + "0.35": 70810.91, + "0.65": 71821.04, + "0.95": 73549.5, + "0.005": 68200.55, + "0.995": 75133.19 + }, + { + "0.2": 70216.4, + "0.5": 71280.75, + "0.8": 72380.86, + "0.05": 69230.85, + "0.35": 70817.78, + "0.65": 71827.4, + "0.95": 73528.17, + "0.005": 68165.32, + "0.995": 75201.63 + }, + { + "0.2": 70212.77, + "0.5": 71266.49, + "0.8": 72407.01, + "0.05": 69249.17, + "0.35": 70811.17, + "0.65": 71837.03, + "0.95": 73556.45, + "0.005": 68110.59, + "0.995": 75158.64 + }, + { + "0.2": 70211.36, + "0.5": 71277.58, + "0.8": 72403.63, + "0.05": 69243.64, + "0.35": 70802.61, + "0.65": 71839.92, + "0.95": 73535.78, + "0.005": 68138.04, + "0.995": 75134.47 + }, + { + "0.2": 70221.88, + "0.5": 71293.25, + "0.8": 72408.15, + "0.05": 69226.24, + "0.35": 70801.43, + "0.65": 71839.24, + "0.95": 73550.19, + "0.005": 68101.84, + "0.995": 75109.86 + }, + { + "0.2": 70218.35, + "0.5": 71295.82, + "0.8": 72415.6, + "0.05": 69209.17, + "0.35": 70796.66, + "0.65": 71830.34, + "0.95": 73584.75, + "0.005": 68144.45, + "0.995": 75135.75 + }, + { + "0.2": 70218.76, + "0.5": 71300.97, + "0.8": 72413.62, + "0.05": 69207.96, + "0.35": 70781.43, + "0.65": 71822.02, + "0.95": 73575.97, + "0.005": 68125.14, + "0.995": 75139.59 + }, + { + "0.2": 70220.3, + "0.5": 71295.27, + "0.8": 72396.21, + "0.05": 69227.37, + "0.35": 70772.98, + "0.65": 71815.86, + "0.95": 73563.97, + "0.005": 68136.34, + "0.995": 75095.9 + }, + { + "0.2": 70214.48, + "0.5": 71294.87, + "0.8": 72420.8, + "0.05": 69214.66, + "0.35": 70767.51, + "0.65": 71836.93, + "0.95": 73556.78, + "0.005": 68148.14, + "0.995": 75128.29 + }, + { + "0.2": 70205.86, + "0.5": 71304.12, + "0.8": 72436.36, + "0.05": 69230.13, + "0.35": 70758.1, + "0.65": 71823.67, + "0.95": 73568.53, + "0.005": 68129.06, + "0.995": 75106.09 + }, + { + "0.2": 70200.98, + "0.5": 71307.89, + "0.8": 72429.41, + "0.05": 69208.3, + "0.35": 70764.86, + "0.65": 71832.97, + "0.95": 73578.54, + "0.005": 68048.59, + "0.995": 75092.95 + }, + { + "0.2": 70212.03, + "0.5": 71307.71, + "0.8": 72432.35, + "0.05": 69207.9, + "0.35": 70765.98, + "0.65": 71841.47, + "0.95": 73587.14, + "0.005": 68042.64, + "0.995": 75115.28 + }, + { + "0.2": 70221.17, + "0.5": 71303.6, + "0.8": 72447.02, + "0.05": 69226.44, + "0.35": 70772.6, + "0.65": 71842.12, + "0.95": 73595.41, + "0.005": 68070.38, + "0.995": 75130.67 + }, + { + "0.2": 70216.33, + "0.5": 71297.15, + "0.8": 72438.79, + "0.05": 69200.69, + "0.35": 70777.6, + "0.65": 71827.04, + "0.95": 73615.62, + "0.005": 68003.94, + "0.995": 75132.1 + }, + { + "0.2": 70209.43, + "0.5": 71297.68, + "0.8": 72438.93, + "0.05": 69157.18, + "0.35": 70782.65, + "0.65": 71838.94, + "0.95": 73600.22, + "0.005": 68024.6, + "0.995": 75155.14 + }, + { + "0.2": 70209.81, + "0.5": 71307.16, + "0.8": 72459.17, + "0.05": 69172.74, + "0.35": 70797.83, + "0.65": 71832.9, + "0.95": 73620.13, + "0.005": 67982.29, + "0.995": 75239.85 + }, + { + "0.2": 70212.08, + "0.5": 71299.25, + "0.8": 72463.06, + "0.05": 69177.53, + "0.35": 70790.88, + "0.65": 71839.89, + "0.95": 73644.73, + "0.005": 68059.5, + "0.995": 75341.2 + }, + { + "0.2": 70208.24, + "0.5": 71296.36, + "0.8": 72470.4, + "0.05": 69169.95, + "0.35": 70790.49, + "0.65": 71851.77, + "0.95": 73635.41, + "0.005": 68037.36, + "0.995": 75367.93 + }, + { + "0.2": 70192.5, + "0.5": 71303.46, + "0.8": 72473.7, + "0.05": 69160.06, + "0.35": 70786.22, + "0.65": 71858.76, + "0.95": 73671.69, + "0.005": 67993.77, + "0.995": 75333.08 + }, + { + "0.2": 70182.0, + "0.5": 71319.62, + "0.8": 72461.08, + "0.05": 69152.95, + "0.35": 70787.77, + "0.65": 71855.25, + "0.95": 73672.44, + "0.005": 67997.51, + "0.995": 75267.69 + }, + { + "0.2": 70184.61, + "0.5": 71320.74, + "0.8": 72463.97, + "0.05": 69156.4, + "0.35": 70799.79, + "0.65": 71870.0, + "0.95": 73686.44, + "0.005": 68010.35, + "0.995": 75297.09 + }, + { + "0.2": 70188.6, + "0.5": 71336.48, + "0.8": 72471.69, + "0.05": 69159.91, + "0.35": 70778.35, + "0.65": 71864.97, + "0.95": 73668.17, + "0.005": 67996.06, + "0.995": 75339.27 + }, + { + "0.2": 70185.59, + "0.5": 71323.81, + "0.8": 72472.02, + "0.05": 69148.15, + "0.35": 70786.62, + "0.65": 71865.0, + "0.95": 73654.5, + "0.005": 68018.8, + "0.995": 75293.55 + }, + { + "0.2": 70164.86, + "0.5": 71328.1, + "0.8": 72486.81, + "0.05": 69140.5, + "0.35": 70781.74, + "0.65": 71884.43, + "0.95": 73673.27, + "0.005": 68022.51, + "0.995": 75235.23 + }, + { + "0.2": 70176.82, + "0.5": 71321.83, + "0.8": 72499.34, + "0.05": 69143.61, + "0.35": 70799.16, + "0.65": 71892.46, + "0.95": 73690.53, + "0.005": 67980.67, + "0.995": 75349.88 + }, + { + "0.2": 70190.86, + "0.5": 71317.44, + "0.8": 72500.62, + "0.05": 69103.53, + "0.35": 70794.02, + "0.65": 71889.33, + "0.95": 73699.6, + "0.005": 67968.95, + "0.995": 75405.33 + }, + { + "0.2": 70181.78, + "0.5": 71319.98, + "0.8": 72505.65, + "0.05": 69086.41, + "0.35": 70792.01, + "0.65": 71883.27, + "0.95": 73666.1, + "0.005": 68000.21, + "0.995": 75361.47 + }, + { + "0.2": 70191.61, + "0.5": 71321.85, + "0.8": 72524.1, + "0.05": 69092.36, + "0.35": 70798.85, + "0.65": 71879.35, + "0.95": 73675.85, + "0.005": 67958.87, + "0.995": 75448.15 + }, + { + "0.2": 70207.11, + "0.5": 71317.75, + "0.8": 72537.18, + "0.05": 69073.23, + "0.35": 70776.0, + "0.65": 71894.01, + "0.95": 73701.51, + "0.005": 67888.45, + "0.995": 75487.81 + }, + { + "0.2": 70216.38, + "0.5": 71333.13, + "0.8": 72547.63, + "0.05": 69119.23, + "0.35": 70801.05, + "0.65": 71885.86, + "0.95": 73753.65, + "0.005": 67915.17, + "0.995": 75450.75 + }, + { + "0.2": 70195.89, + "0.5": 71344.25, + "0.8": 72551.45, + "0.05": 69121.19, + "0.35": 70779.97, + "0.65": 71913.27, + "0.95": 73763.69, + "0.005": 67974.68, + "0.995": 75496.5 + }, + { + "0.2": 70190.72, + "0.5": 71347.72, + "0.8": 72561.38, + "0.05": 69138.39, + "0.35": 70789.96, + "0.65": 71912.18, + "0.95": 73812.74, + "0.005": 67927.36, + "0.995": 75477.46 + }, + { + "0.2": 70204.89, + "0.5": 71342.05, + "0.8": 72576.57, + "0.05": 69114.36, + "0.35": 70783.58, + "0.65": 71897.37, + "0.95": 73790.15, + "0.005": 67898.47, + "0.995": 75436.22 + }, + { + "0.2": 70190.22, + "0.5": 71342.19, + "0.8": 72570.96, + "0.05": 69125.64, + "0.35": 70770.31, + "0.65": 71904.98, + "0.95": 73803.45, + "0.005": 67824.17, + "0.995": 75501.08 + }, + { + "0.2": 70195.52, + "0.5": 71323.14, + "0.8": 72571.34, + "0.05": 69127.44, + "0.35": 70764.17, + "0.65": 71908.6, + "0.95": 73805.1, + "0.005": 67832.4, + "0.995": 75606.92 + }, + { + "0.2": 70178.57, + "0.5": 71318.31, + "0.8": 72570.15, + "0.05": 69113.14, + "0.35": 70764.88, + "0.65": 71939.16, + "0.95": 73792.87, + "0.005": 67740.58, + "0.995": 75681.19 + }, + { + "0.2": 70167.49, + "0.5": 71341.93, + "0.8": 72594.71, + "0.05": 69084.68, + "0.35": 70770.86, + "0.65": 71937.66, + "0.95": 73804.95, + "0.005": 67764.46, + "0.995": 75636.57 + }, + { + "0.2": 70178.23, + "0.5": 71315.99, + "0.8": 72567.37, + "0.05": 69056.12, + "0.35": 70775.08, + "0.65": 71927.99, + "0.95": 73830.29, + "0.005": 67772.37, + "0.995": 75550.85 + }, + { + "0.2": 70142.02, + "0.5": 71340.46, + "0.8": 72575.7, + "0.05": 69072.37, + "0.35": 70749.24, + "0.65": 71913.45, + "0.95": 73835.82, + "0.005": 67772.18, + "0.995": 75581.25 + }, + { + "0.2": 70146.92, + "0.5": 71335.61, + "0.8": 72604.46, + "0.05": 69058.41, + "0.35": 70744.27, + "0.65": 71942.11, + "0.95": 73853.98, + "0.005": 67792.75, + "0.995": 75698.44 + }, + { + "0.2": 70136.89, + "0.5": 71327.35, + "0.8": 72613.12, + "0.05": 68999.43, + "0.35": 70742.09, + "0.65": 71934.46, + "0.95": 73787.91, + "0.005": 67794.9, + "0.995": 75597.89 + }, + { + "0.2": 70113.49, + "0.5": 71340.89, + "0.8": 72636.27, + "0.05": 69033.25, + "0.35": 70758.42, + "0.65": 71938.39, + "0.95": 73821.07, + "0.005": 67750.03, + "0.995": 75636.33 + }, + { + "0.2": 70092.08, + "0.5": 71356.96, + "0.8": 72656.42, + "0.05": 69038.46, + "0.35": 70761.04, + "0.65": 71942.33, + "0.95": 73835.09, + "0.005": 67661.32, + "0.995": 75647.03 + }, + { + "0.2": 70097.41, + "0.5": 71355.13, + "0.8": 72637.56, + "0.05": 69011.0, + "0.35": 70771.67, + "0.65": 71940.57, + "0.95": 73915.84, + "0.005": 67643.5, + "0.995": 75602.28 + }, + { + "0.2": 70088.43, + "0.5": 71338.09, + "0.8": 72635.63, + "0.05": 69015.1, + "0.35": 70768.1, + "0.65": 71954.38, + "0.95": 73913.05, + "0.005": 67587.86, + "0.995": 75650.33 + }, + { + "0.2": 70083.31, + "0.5": 71366.81, + "0.8": 72662.18, + "0.05": 69009.09, + "0.35": 70758.76, + "0.65": 71941.35, + "0.95": 73940.75, + "0.005": 67526.58, + "0.995": 75670.66 + }, + { + "0.2": 70078.94, + "0.5": 71368.98, + "0.8": 72667.52, + "0.05": 69042.48, + "0.35": 70772.02, + "0.65": 71971.94, + "0.95": 73972.15, + "0.005": 67580.5, + "0.995": 75525.21 + }, + { + "0.2": 70081.61, + "0.5": 71350.89, + "0.8": 72669.77, + "0.05": 69009.57, + "0.35": 70745.16, + "0.65": 71972.27, + "0.95": 73951.19, + "0.005": 67493.47, + "0.995": 75690.64 + }, + { + "0.2": 70077.81, + "0.5": 71343.5, + "0.8": 72664.42, + "0.05": 68932.77, + "0.35": 70746.43, + "0.65": 71975.25, + "0.95": 73905.61, + "0.005": 67402.12, + "0.995": 75629.71 + }, + { + "0.2": 70059.47, + "0.5": 71319.78, + "0.8": 72685.27, + "0.05": 68927.69, + "0.35": 70746.0, + "0.65": 71965.28, + "0.95": 73938.65, + "0.005": 67371.71, + "0.995": 75741.73 + }, + { + "0.2": 70041.26, + "0.5": 71325.06, + "0.8": 72678.13, + "0.05": 68935.91, + "0.35": 70733.66, + "0.65": 71985.2, + "0.95": 74038.27, + "0.005": 67462.82, + "0.995": 75750.53 + }, + { + "0.2": 70070.89, + "0.5": 71334.87, + "0.8": 72705.36, + "0.05": 68928.59, + "0.35": 70757.61, + "0.65": 71994.0, + "0.95": 73978.83, + "0.005": 67488.88, + "0.995": 75840.75 + }, + { + "0.2": 70068.63, + "0.5": 71362.61, + "0.8": 72691.78, + "0.05": 68912.98, + "0.35": 70768.57, + "0.65": 71971.94, + "0.95": 73967.54, + "0.005": 67394.65, + "0.995": 75773.38 + }, + { + "0.2": 70069.67, + "0.5": 71359.89, + "0.8": 72688.93, + "0.05": 68866.7, + "0.35": 70766.81, + "0.65": 71958.46, + "0.95": 73997.87, + "0.005": 67385.51, + "0.995": 75852.1 + }, + { + "0.2": 70044.19, + "0.5": 71360.45, + "0.8": 72676.03, + "0.05": 68847.62, + "0.35": 70751.81, + "0.65": 71970.78, + "0.95": 74021.25, + "0.005": 67345.02, + "0.995": 75863.91 + }, + { + "0.2": 70061.5, + "0.5": 71330.58, + "0.8": 72713.79, + "0.05": 68817.18, + "0.35": 70755.9, + "0.65": 71956.38, + "0.95": 73993.79, + "0.005": 67375.14, + "0.995": 75806.98 + }, + { + "0.2": 70063.3, + "0.5": 71336.23, + "0.8": 72780.06, + "0.05": 68791.41, + "0.35": 70750.13, + "0.65": 71962.18, + "0.95": 74037.73, + "0.005": 67274.95, + "0.995": 75768.59 + }, + { + "0.2": 70073.23, + "0.5": 71348.66, + "0.8": 72767.5, + "0.05": 68803.33, + "0.35": 70740.6, + "0.65": 71980.33, + "0.95": 74026.69, + "0.005": 67305.44, + "0.995": 75875.66 + }, + { + "0.2": 70048.17, + "0.5": 71345.46, + "0.8": 72774.15, + "0.05": 68746.35, + "0.35": 70751.02, + "0.65": 71993.89, + "0.95": 74075.91, + "0.005": 67281.77, + "0.995": 75742.14 + }, + { + "0.2": 70012.02, + "0.5": 71366.77, + "0.8": 72775.28, + "0.05": 68722.85, + "0.35": 70760.61, + "0.65": 72007.15, + "0.95": 74133.69, + "0.005": 67163.55, + "0.995": 75988.97 + }, + { + "0.2": 70021.71, + "0.5": 71382.32, + "0.8": 72773.22, + "0.05": 68710.88, + "0.35": 70755.54, + "0.65": 72007.97, + "0.95": 74179.3, + "0.005": 67157.97, + "0.995": 76068.92 + }, + { + "0.2": 69996.38, + "0.5": 71401.48, + "0.8": 72784.47, + "0.05": 68735.91, + "0.35": 70728.43, + "0.65": 72009.67, + "0.95": 74226.75, + "0.005": 67083.63, + "0.995": 76170.14 + }, + { + "0.2": 69975.79, + "0.5": 71402.44, + "0.8": 72807.9, + "0.05": 68726.0, + "0.35": 70735.36, + "0.65": 72020.76, + "0.95": 74265.53, + "0.005": 67075.84, + "0.995": 76272.09 + }, + { + "0.2": 69960.24, + "0.5": 71407.8, + "0.8": 72820.41, + "0.05": 68674.98, + "0.35": 70738.72, + "0.65": 72024.56, + "0.95": 74312.6, + "0.005": 67062.51, + "0.995": 76203.32 + }, + { + "0.2": 69948.07, + "0.5": 71397.97, + "0.8": 72852.56, + "0.05": 68622.44, + "0.35": 70734.51, + "0.65": 72019.05, + "0.95": 74356.92, + "0.005": 66903.58, + "0.995": 76240.67 + }, + { + "0.2": 69969.76, + "0.5": 71404.35, + "0.8": 72871.04, + "0.05": 68648.3, + "0.35": 70709.39, + "0.65": 72040.9, + "0.95": 74369.27, + "0.005": 67134.06, + "0.995": 76284.13 + }, + { + "0.2": 69950.95, + "0.5": 71396.81, + "0.8": 72889.24, + "0.05": 68626.12, + "0.35": 70704.34, + "0.65": 72055.7, + "0.95": 74383.12, + "0.005": 67124.05, + "0.995": 76316.77 + }, + { + "0.2": 69935.36, + "0.5": 71435.93, + "0.8": 72880.66, + "0.05": 68560.01, + "0.35": 70723.06, + "0.65": 72073.43, + "0.95": 74416.87, + "0.005": 67208.93, + "0.995": 76403.65 + }, + { + "0.2": 69937.12, + "0.5": 71403.22, + "0.8": 72851.15, + "0.05": 68616.38, + "0.35": 70744.72, + "0.65": 72075.93, + "0.95": 74422.53, + "0.005": 67122.59, + "0.995": 76378.58 + }, + { + "0.2": 69940.17, + "0.5": 71405.76, + "0.8": 72900.78, + "0.05": 68559.01, + "0.35": 70758.36, + "0.65": 72059.43, + "0.95": 74464.46, + "0.005": 67114.76, + "0.995": 76431.49 + }, + { + "0.2": 69955.44, + "0.5": 71398.49, + "0.8": 72885.89, + "0.05": 68511.75, + "0.35": 70768.34, + "0.65": 72105.52, + "0.95": 74431.73, + "0.005": 67042.3, + "0.995": 76472.78 + }, + { + "0.2": 69933.96, + "0.5": 71413.02, + "0.8": 72912.15, + "0.05": 68549.22, + "0.35": 70761.49, + "0.65": 72073.86, + "0.95": 74430.99, + "0.005": 66823.44, + "0.995": 76622.21 + }, + { + "0.2": 69936.92, + "0.5": 71421.91, + "0.8": 72883.74, + "0.05": 68512.94, + "0.35": 70743.0, + "0.65": 72099.17, + "0.95": 74453.21, + "0.005": 66817.37, + "0.995": 76462.02 + }, + { + "0.2": 69937.14, + "0.5": 71424.61, + "0.8": 72886.03, + "0.05": 68507.9, + "0.35": 70784.06, + "0.65": 72119.49, + "0.95": 74475.53, + "0.005": 66716.35, + "0.995": 76436.03 + }, + { + "0.2": 69927.28, + "0.5": 71433.12, + "0.8": 72907.62, + "0.05": 68439.8, + "0.35": 70763.18, + "0.65": 72123.38, + "0.95": 74548.74, + "0.005": 66627.48, + "0.995": 76410.26 + }, + { + "0.2": 69946.11, + "0.5": 71425.72, + "0.8": 72958.92, + "0.05": 68420.62, + "0.35": 70763.28, + "0.65": 72090.88, + "0.95": 74578.52, + "0.005": 66666.36, + "0.995": 76547.66 + }, + { + "0.2": 69929.42, + "0.5": 71444.55, + "0.8": 72973.62, + "0.05": 68425.23, + "0.35": 70722.62, + "0.65": 72110.57, + "0.95": 74582.04, + "0.005": 66708.66, + "0.995": 76570.42 + }, + { + "0.2": 69908.61, + "0.5": 71443.35, + "0.8": 72966.95, + "0.05": 68416.93, + "0.35": 70740.69, + "0.65": 72086.12, + "0.95": 74631.81, + "0.005": 66641.42, + "0.995": 76589.04 + }, + { + "0.2": 69890.96, + "0.5": 71425.39, + "0.8": 72956.61, + "0.05": 68408.32, + "0.35": 70752.97, + "0.65": 72108.82, + "0.95": 74677.56, + "0.005": 66674.42, + "0.995": 76744.26 + }, + { + "0.2": 69899.17, + "0.5": 71407.46, + "0.8": 72943.88, + "0.05": 68408.45, + "0.35": 70738.31, + "0.65": 72105.09, + "0.95": 74661.84, + "0.005": 66608.14, + "0.995": 76565.19 + }, + { + "0.2": 69892.7, + "0.5": 71404.36, + "0.8": 72943.33, + "0.05": 68343.2, + "0.35": 70732.05, + "0.65": 72111.49, + "0.95": 74699.55, + "0.005": 66547.87, + "0.995": 76527.99 + }, + { + "0.2": 69900.67, + "0.5": 71402.37, + "0.8": 72937.18, + "0.05": 68300.64, + "0.35": 70721.54, + "0.65": 72095.26, + "0.95": 74668.61, + "0.005": 66628.03, + "0.995": 76543.27 + }, + { + "0.2": 69877.45, + "0.5": 71408.78, + "0.8": 72971.38, + "0.05": 68288.2, + "0.35": 70724.17, + "0.65": 72091.47, + "0.95": 74717.35, + "0.005": 66480.95, + "0.995": 76547.26 + }, + { + "0.2": 69857.32, + "0.5": 71416.56, + "0.8": 72980.62, + "0.05": 68298.14, + "0.35": 70701.67, + "0.65": 72084.31, + "0.95": 74774.62, + "0.005": 66429.15, + "0.995": 76772.31 + }, + { + "0.2": 69850.34, + "0.5": 71403.01, + "0.8": 73003.7, + "0.05": 68217.14, + "0.35": 70683.49, + "0.65": 72103.19, + "0.95": 74820.62, + "0.005": 66357.71, + "0.995": 76876.71 + }, + { + "0.2": 69806.78, + "0.5": 71416.87, + "0.8": 73040.21, + "0.05": 68188.27, + "0.35": 70681.33, + "0.65": 72094.26, + "0.95": 74721.32, + "0.005": 66309.44, + "0.995": 76741.03 + }, + { + "0.2": 69830.97, + "0.5": 71425.91, + "0.8": 73047.66, + "0.05": 68222.49, + "0.35": 70664.13, + "0.65": 72080.25, + "0.95": 74691.66, + "0.005": 66382.18, + "0.995": 76755.62 + }, + { + "0.2": 69799.91, + "0.5": 71402.93, + "0.8": 73043.49, + "0.05": 68199.81, + "0.35": 70693.63, + "0.65": 72085.56, + "0.95": 74736.94, + "0.005": 66337.53, + "0.995": 76666.61 + }, + { + "0.2": 69783.96, + "0.5": 71394.09, + "0.8": 73004.42, + "0.05": 68200.61, + "0.35": 70642.51, + "0.65": 72069.84, + "0.95": 74840.79, + "0.005": 66295.04, + "0.995": 76728.36 + }, + { + "0.2": 69767.4, + "0.5": 71400.1, + "0.8": 73030.62, + "0.05": 68202.22, + "0.35": 70651.15, + "0.65": 72056.93, + "0.95": 74810.27, + "0.005": 66385.39, + "0.995": 76712.64 + }, + { + "0.2": 69753.09, + "0.5": 71397.48, + "0.8": 73039.66, + "0.05": 68166.43, + "0.35": 70649.01, + "0.65": 72103.44, + "0.95": 74798.83, + "0.005": 66332.74, + "0.995": 76744.75 + }, + { + "0.2": 69747.57, + "0.5": 71398.53, + "0.8": 73062.28, + "0.05": 68150.5, + "0.35": 70688.82, + "0.65": 72119.67, + "0.95": 74824.93, + "0.005": 66432.56, + "0.995": 76609.73 + }, + { + "0.2": 69751.29, + "0.5": 71369.04, + "0.8": 73064.29, + "0.05": 68173.4, + "0.35": 70667.15, + "0.65": 72115.99, + "0.95": 74840.47, + "0.005": 66515.48, + "0.995": 76812.88 + }, + { + "0.2": 69721.05, + "0.5": 71403.16, + "0.8": 73103.72, + "0.05": 68146.06, + "0.35": 70659.18, + "0.65": 72129.16, + "0.95": 74909.39, + "0.005": 66521.1, + "0.995": 76777.23 + }, + { + "0.2": 69684.61, + "0.5": 71393.6, + "0.8": 73128.0, + "0.05": 68096.8, + "0.35": 70662.38, + "0.65": 72100.69, + "0.95": 74940.01, + "0.005": 66488.34, + "0.995": 76775.95 + }, + { + "0.2": 69695.39, + "0.5": 71389.53, + "0.8": 73128.29, + "0.05": 68048.93, + "0.35": 70675.58, + "0.65": 72124.68, + "0.95": 74984.37, + "0.005": 66447.78, + "0.995": 76831.78 + }, + { + "0.2": 69668.97, + "0.5": 71366.0, + "0.8": 73110.43, + "0.05": 68031.07, + "0.35": 70657.92, + "0.65": 72129.83, + "0.95": 74929.86, + "0.005": 66336.29, + "0.995": 76874.44 + }, + { + "0.2": 69689.43, + "0.5": 71374.85, + "0.8": 73076.95, + "0.05": 68018.4, + "0.35": 70607.95, + "0.65": 72152.95, + "0.95": 74976.54, + "0.005": 66248.13, + "0.995": 76960.96 + }, + { + "0.2": 69672.86, + "0.5": 71362.61, + "0.8": 73078.34, + "0.05": 67998.17, + "0.35": 70608.92, + "0.65": 72145.4, + "0.95": 75043.92, + "0.005": 66183.81, + "0.995": 76984.06 + }, + { + "0.2": 69661.95, + "0.5": 71397.22, + "0.8": 73091.72, + "0.05": 68007.19, + "0.35": 70629.78, + "0.65": 72175.55, + "0.95": 75026.34, + "0.005": 66180.25, + "0.995": 76929.04 + }, + { + "0.2": 69645.48, + "0.5": 71371.07, + "0.8": 73106.97, + "0.05": 68011.29, + "0.35": 70643.5, + "0.65": 72164.65, + "0.95": 74990.54, + "0.005": 66182.16, + "0.995": 77003.05 + }, + { + "0.2": 69633.17, + "0.5": 71388.79, + "0.8": 73136.42, + "0.05": 67993.07, + "0.35": 70630.48, + "0.65": 72176.75, + "0.95": 74976.91, + "0.005": 66053.45, + "0.995": 76911.42 + }, + { + "0.2": 69655.14, + "0.5": 71381.21, + "0.8": 73146.81, + "0.05": 67974.81, + "0.35": 70625.02, + "0.65": 72162.57, + "0.95": 74964.76, + "0.005": 66085.64, + "0.995": 77003.36 + }, + { + "0.2": 69633.6, + "0.5": 71371.89, + "0.8": 73158.21, + "0.05": 67938.67, + "0.35": 70644.56, + "0.65": 72154.45, + "0.95": 75008.51, + "0.005": 66055.71, + "0.995": 77023.46 + }, + { + "0.2": 69621.9, + "0.5": 71380.45, + "0.8": 73197.21, + "0.05": 67975.57, + "0.35": 70641.72, + "0.65": 72159.22, + "0.95": 75037.19, + "0.005": 66256.36, + "0.995": 77292.47 + }, + { + "0.2": 69639.96, + "0.5": 71395.79, + "0.8": 73233.8, + "0.05": 67953.43, + "0.35": 70609.11, + "0.65": 72182.71, + "0.95": 75058.3, + "0.005": 66246.82, + "0.995": 77187.81 + }, + { + "0.2": 69610.64, + "0.5": 71418.2, + "0.8": 73199.43, + "0.05": 67935.4, + "0.35": 70609.05, + "0.65": 72157.4, + "0.95": 75086.52, + "0.005": 66110.72, + "0.995": 77218.66 + }, + { + "0.2": 69590.01, + "0.5": 71385.06, + "0.8": 73261.98, + "0.05": 67928.58, + "0.35": 70587.09, + "0.65": 72107.45, + "0.95": 75107.56, + "0.005": 66246.29, + "0.995": 77259.19 + }, + { + "0.2": 69583.2, + "0.5": 71358.57, + "0.8": 73261.48, + "0.05": 67917.84, + "0.35": 70598.23, + "0.65": 72126.55, + "0.95": 75103.47, + "0.005": 66232.21, + "0.995": 77310.55 + }, + { + "0.2": 69619.0, + "0.5": 71379.38, + "0.8": 73276.36, + "0.05": 67914.35, + "0.35": 70589.76, + "0.65": 72173.82, + "0.95": 75128.25, + "0.005": 66298.45, + "0.995": 77347.2 + }, + { + "0.2": 69603.2, + "0.5": 71412.09, + "0.8": 73317.11, + "0.05": 68004.18, + "0.35": 70586.65, + "0.65": 72165.36, + "0.95": 75143.86, + "0.005": 66243.93, + "0.995": 77314.74 + }, + { + "0.2": 69605.93, + "0.5": 71404.67, + "0.8": 73315.74, + "0.05": 68038.22, + "0.35": 70569.69, + "0.65": 72173.47, + "0.95": 75162.66, + "0.005": 66245.32, + "0.995": 77358.84 + }, + { + "0.2": 69593.73, + "0.5": 71392.82, + "0.8": 73284.11, + "0.05": 67918.31, + "0.35": 70575.23, + "0.65": 72190.37, + "0.95": 75145.83, + "0.005": 66129.66, + "0.995": 77399.21 + }, + { + "0.2": 69603.07, + "0.5": 71374.63, + "0.8": 73322.5, + "0.05": 67882.24, + "0.35": 70573.35, + "0.65": 72182.05, + "0.95": 75149.24, + "0.005": 66190.47, + "0.995": 77542.02 + }, + { + "0.2": 69644.4, + "0.5": 71363.34, + "0.8": 73322.22, + "0.05": 67868.09, + "0.35": 70579.81, + "0.65": 72212.6, + "0.95": 75231.2, + "0.005": 66122.39, + "0.995": 77489.9 + }, + { + "0.2": 69625.33, + "0.5": 71366.81, + "0.8": 73321.4, + "0.05": 67909.4, + "0.35": 70572.77, + "0.65": 72196.11, + "0.95": 75295.9, + "0.005": 66103.28, + "0.995": 77614.13 + }, + { + "0.2": 69636.71, + "0.5": 71378.68, + "0.8": 73322.42, + "0.05": 67862.71, + "0.35": 70585.45, + "0.65": 72223.56, + "0.95": 75289.75, + "0.005": 66073.23, + "0.995": 77532.92 + }, + { + "0.2": 69600.78, + "0.5": 71383.24, + "0.8": 73310.63, + "0.05": 67840.33, + "0.35": 70595.39, + "0.65": 72239.77, + "0.95": 75287.97, + "0.005": 66099.8, + "0.995": 77559.87 + }, + { + "0.2": 69583.23, + "0.5": 71398.13, + "0.8": 73334.87, + "0.05": 67800.51, + "0.35": 70583.52, + "0.65": 72229.46, + "0.95": 75309.64, + "0.005": 65986.56, + "0.995": 77481.89 + }, + { + "0.2": 69593.23, + "0.5": 71381.07, + "0.8": 73347.65, + "0.05": 67797.81, + "0.35": 70606.72, + "0.65": 72188.38, + "0.95": 75334.05, + "0.005": 66035.92, + "0.995": 77575.4 + }, + { + "0.2": 69547.8, + "0.5": 71375.16, + "0.8": 73317.76, + "0.05": 67784.24, + "0.35": 70590.01, + "0.65": 72221.68, + "0.95": 75366.08, + "0.005": 65946.56, + "0.995": 77628.51 + }, + { + "0.2": 69536.55, + "0.5": 71374.0, + "0.8": 73343.26, + "0.05": 67829.56, + "0.35": 70577.95, + "0.65": 72193.01, + "0.95": 75321.4, + "0.005": 65939.3, + "0.995": 77753.89 + }, + { + "0.2": 69576.21, + "0.5": 71355.33, + "0.8": 73347.13, + "0.05": 67809.64, + "0.35": 70581.8, + "0.65": 72198.39, + "0.95": 75411.44, + "0.005": 65886.8, + "0.995": 77803.01 + }, + { + "0.2": 69565.09, + "0.5": 71382.51, + "0.8": 73342.15, + "0.05": 67846.7, + "0.35": 70616.9, + "0.65": 72203.44, + "0.95": 75420.59, + "0.005": 65923.13, + "0.995": 77807.2 + }, + { + "0.2": 69529.44, + "0.5": 71383.65, + "0.8": 73351.87, + "0.05": 67813.03, + "0.35": 70599.11, + "0.65": 72210.56, + "0.95": 75415.9, + "0.005": 65926.47, + "0.995": 78077.79 + }, + { + "0.2": 69536.5, + "0.5": 71385.42, + "0.8": 73374.59, + "0.05": 67840.61, + "0.35": 70600.97, + "0.65": 72234.37, + "0.95": 75422.53, + "0.005": 65791.99, + "0.995": 78126.02 + }, + { + "0.2": 69549.55, + "0.5": 71390.59, + "0.8": 73349.71, + "0.05": 67855.52, + "0.35": 70603.75, + "0.65": 72234.59, + "0.95": 75523.47, + "0.005": 65796.76, + "0.995": 78086.73 + }, + { + "0.2": 69548.44, + "0.5": 71395.36, + "0.8": 73362.44, + "0.05": 67845.85, + "0.35": 70580.39, + "0.65": 72243.11, + "0.95": 75443.1, + "0.005": 65746.9, + "0.995": 77962.99 + }, + { + "0.2": 69561.48, + "0.5": 71399.35, + "0.8": 73367.35, + "0.05": 67810.66, + "0.35": 70552.91, + "0.65": 72239.47, + "0.95": 75420.32, + "0.005": 65689.87, + "0.995": 78072.02 + }, + { + "0.2": 69569.61, + "0.5": 71407.83, + "0.8": 73398.72, + "0.05": 67771.52, + "0.35": 70508.87, + "0.65": 72253.1, + "0.95": 75503.11, + "0.005": 65629.16, + "0.995": 77924.64 + }, + { + "0.2": 69540.81, + "0.5": 71403.14, + "0.8": 73412.78, + "0.05": 67742.9, + "0.35": 70513.55, + "0.65": 72262.55, + "0.95": 75523.9, + "0.005": 65571.96, + "0.995": 77933.85 + }, + { + "0.2": 69556.43, + "0.5": 71407.01, + "0.8": 73411.19, + "0.05": 67765.53, + "0.35": 70535.61, + "0.65": 72276.52, + "0.95": 75472.75, + "0.005": 65649.58, + "0.995": 77888.15 + }, + { + "0.2": 69584.96, + "0.5": 71417.77, + "0.8": 73426.14, + "0.05": 67807.49, + "0.35": 70512.7, + "0.65": 72280.04, + "0.95": 75593.51, + "0.005": 65575.5, + "0.995": 77842.09 + }, + { + "0.2": 69586.78, + "0.5": 71400.51, + "0.8": 73420.24, + "0.05": 67788.91, + "0.35": 70540.32, + "0.65": 72286.08, + "0.95": 75579.38, + "0.005": 65386.03, + "0.995": 77853.98 + }, + { + "0.2": 69581.04, + "0.5": 71405.64, + "0.8": 73436.73, + "0.05": 67761.15, + "0.35": 70535.86, + "0.65": 72300.7, + "0.95": 75541.26, + "0.005": 65441.98, + "0.995": 77988.79 + }, + { + "0.2": 69592.21, + "0.5": 71387.1, + "0.8": 73442.75, + "0.05": 67718.26, + "0.35": 70548.16, + "0.65": 72309.95, + "0.95": 75543.26, + "0.005": 65592.68, + "0.995": 78030.89 + }, + { + "0.2": 69571.77, + "0.5": 71401.6, + "0.8": 73422.94, + "0.05": 67723.26, + "0.35": 70518.67, + "0.65": 72301.52, + "0.95": 75497.74, + "0.005": 65367.56, + "0.995": 77989.44 + }, + { + "0.2": 69565.46, + "0.5": 71416.8, + "0.8": 73449.62, + "0.05": 67749.99, + "0.35": 70542.0, + "0.65": 72303.15, + "0.95": 75497.37, + "0.005": 65336.58, + "0.995": 78004.13 + }, + { + "0.2": 69581.26, + "0.5": 71391.4, + "0.8": 73462.48, + "0.05": 67764.03, + "0.35": 70521.89, + "0.65": 72309.62, + "0.95": 75553.89, + "0.005": 65305.05, + "0.995": 77761.33 + }, + { + "0.2": 69560.78, + "0.5": 71388.72, + "0.8": 73466.88, + "0.05": 67751.58, + "0.35": 70531.4, + "0.65": 72312.22, + "0.95": 75592.57, + "0.005": 65244.93, + "0.995": 77841.35 + }, + { + "0.2": 69577.82, + "0.5": 71397.72, + "0.8": 73466.86, + "0.05": 67762.89, + "0.35": 70513.52, + "0.65": 72308.89, + "0.95": 75639.53, + "0.005": 65357.79, + "0.995": 77901.65 + }, + { + "0.2": 69601.84, + "0.5": 71383.64, + "0.8": 73483.01, + "0.05": 67792.29, + "0.35": 70540.57, + "0.65": 72285.67, + "0.95": 75648.57, + "0.005": 65292.35, + "0.995": 78077.79 + }, + { + "0.2": 69575.97, + "0.5": 71397.14, + "0.8": 73510.63, + "0.05": 67779.96, + "0.35": 70536.37, + "0.65": 72282.47, + "0.95": 75658.59, + "0.005": 65152.13, + "0.995": 78055.4 + }, + { + "0.2": 69550.7, + "0.5": 71405.98, + "0.8": 73507.77, + "0.05": 67784.27, + "0.35": 70542.83, + "0.65": 72295.91, + "0.95": 75602.96, + "0.005": 65250.08, + "0.995": 78050.47 + }, + { + "0.2": 69557.79, + "0.5": 71414.8, + "0.8": 73500.84, + "0.05": 67788.04, + "0.35": 70517.43, + "0.65": 72297.71, + "0.95": 75631.56, + "0.005": 65319.13, + "0.995": 77992.36 + }, + { + "0.2": 69556.72, + "0.5": 71404.2, + "0.8": 73495.78, + "0.05": 67788.69, + "0.35": 70520.41, + "0.65": 72301.59, + "0.95": 75631.78, + "0.005": 65402.52, + "0.995": 77954.17 + }, + { + "0.2": 69533.34, + "0.5": 71430.48, + "0.8": 73501.83, + "0.05": 67789.87, + "0.35": 70525.35, + "0.65": 72326.57, + "0.95": 75615.38, + "0.005": 65415.58, + "0.995": 77956.89 + }, + { + "0.2": 69539.72, + "0.5": 71428.03, + "0.8": 73536.24, + "0.05": 67788.38, + "0.35": 70544.63, + "0.65": 72318.07, + "0.95": 75622.44, + "0.005": 65420.9, + "0.995": 77784.9 + }, + { + "0.2": 69515.5, + "0.5": 71463.25, + "0.8": 73511.36, + "0.05": 67800.35, + "0.35": 70529.57, + "0.65": 72330.25, + "0.95": 75665.47, + "0.005": 65393.79, + "0.995": 77900.29 + }, + { + "0.2": 69509.93, + "0.5": 71461.11, + "0.8": 73527.62, + "0.05": 67808.02, + "0.35": 70534.85, + "0.65": 72323.75, + "0.95": 75715.86, + "0.005": 65470.48, + "0.995": 77961.79 + }, + { + "0.2": 69530.21, + "0.5": 71453.81, + "0.8": 73544.64, + "0.05": 67782.52, + "0.35": 70526.54, + "0.65": 72315.03, + "0.95": 75715.76, + "0.005": 65532.57, + "0.995": 78024.08 + }, + { + "0.2": 69527.07, + "0.5": 71457.86, + "0.8": 73541.44, + "0.05": 67759.91, + "0.35": 70545.96, + "0.65": 72356.69, + "0.95": 75688.48, + "0.005": 65376.76, + "0.995": 78071.54 + }, + { + "0.2": 69528.07, + "0.5": 71433.5, + "0.8": 73540.91, + "0.05": 67747.49, + "0.35": 70541.97, + "0.65": 72345.93, + "0.95": 75688.58, + "0.005": 65378.91, + "0.995": 78054.46 + }, + { + "0.2": 69537.04, + "0.5": 71432.84, + "0.8": 73543.5, + "0.05": 67784.15, + "0.35": 70531.0, + "0.65": 72373.23, + "0.95": 75721.77, + "0.005": 65440.79, + "0.995": 77989.37 + }, + { + "0.2": 69540.64, + "0.5": 71431.06, + "0.8": 73564.12, + "0.05": 67758.03, + "0.35": 70533.0, + "0.65": 72389.38, + "0.95": 75786.88, + "0.005": 65421.82, + "0.995": 77958.21 + }, + { + "0.2": 69541.55, + "0.5": 71424.25, + "0.8": 73553.93, + "0.05": 67758.79, + "0.35": 70544.98, + "0.65": 72416.24, + "0.95": 75775.59, + "0.005": 65277.83, + "0.995": 77990.66 + }, + { + "0.2": 69537.98, + "0.5": 71435.14, + "0.8": 73554.54, + "0.05": 67759.95, + "0.35": 70534.72, + "0.65": 72393.63, + "0.95": 75773.77, + "0.005": 65188.08, + "0.995": 77993.32 + }, + { + "0.2": 69560.42, + "0.5": 71424.11, + "0.8": 73546.92, + "0.05": 67733.54, + "0.35": 70531.07, + "0.65": 72390.1, + "0.95": 75821.11, + "0.005": 65220.59, + "0.995": 77948.04 + }, + { + "0.2": 69543.79, + "0.5": 71448.09, + "0.8": 73563.25, + "0.05": 67786.4, + "0.35": 70513.74, + "0.65": 72387.95, + "0.95": 75798.36, + "0.005": 65311.53, + "0.995": 78071.17 + }, + { + "0.2": 69546.84, + "0.5": 71471.68, + "0.8": 73575.34, + "0.05": 67761.16, + "0.35": 70503.31, + "0.65": 72402.07, + "0.95": 75822.56, + "0.005": 65213.66, + "0.995": 78011.68 + }, + { + "0.2": 69541.1, + "0.5": 71462.17, + "0.8": 73570.24, + "0.05": 67752.19, + "0.35": 70521.04, + "0.65": 72428.35, + "0.95": 75800.26, + "0.005": 65042.08, + "0.995": 78101.32 + }, + { + "0.2": 69530.9, + "0.5": 71455.6, + "0.8": 73562.28, + "0.05": 67784.67, + "0.35": 70529.15, + "0.65": 72415.09, + "0.95": 75781.99, + "0.005": 64970.7, + "0.995": 78157.53 } ] } diff --git a/tools/options-gps/README.md b/tools/options-gps/README.md index a6bd8f8..a091661 100644 --- a/tools/options-gps/README.md +++ b/tools/options-gps/README.md @@ -9,6 +9,7 @@ Turn a trader's view into one clear options decision. Inputs: **symbol**, **mark - **Screen 2 (Top Plays):** Three ranked cards: Best Match (highest score for view), Safer Alternative (higher win probability), Higher Upside (higher expected payoff). Each shows why it fits, chance of profit, max loss, "Review again at" time. - **Screen 3 (Why This Works):** Distribution view and plain-English explanation for the best match (Synth 1h + 24h fusion state, required market behavior). - **Screen 4 (If Wrong):** Exit rule, convert/roll rule, time-based reassessment rule. +- **Screen 5 (Execution):** When `--execute` or `--dry-run` is used, shows order plan, optional confirmation (live only), per-leg fill results with slippage and latency metrics, net cost, and execution timestamps. **Guardrails:** No-trade state when confidence is low, signals conflict (e.g. 1h vs 24h countermove), volatility is very high (directional views), or no vol edge exists (vol view with similar Synth/market IV). @@ -28,6 +29,44 @@ Turn a trader's view into one clear options decision. Inputs: **symbol**, **mark 7. **Guardrails:** Filters no-trade when fusion is countermove/unclear with directional view, volatility exceeds threshold (directional views), confidence is too low, or vol bias is neutral (vol view — no exploitable divergence between Synth and market IV). 8. **Risk Management:** Each strategy type has a specific risk plan (invalidation trigger, adjustment/reroute rule, review schedule). Short straddle/strangle are labeled "unlimited risk" with hard stops at 2x credit loss; they are risk-gated (high-only for short straddle, medium+ for short strangle). +## Exchange integration architecture + +Data flow for crypto assets (BTC, ETH, SOL): + +1. **Synth** → forecast percentiles, option pricing, volatility (via `SynthClient`). +2. **Pipeline** → strategy generation, payoff/EV, ranking (with optional exchange divergence bonus). +3. **Exchange (read)** → `exchange.py` fetches live or mock quotes from Deribit and Aevo; `leg_divergences()` computes per-leg best venue and price (lowest ask for BUY, highest bid for SELL). +4. **Execution** → `executor.py` builds an `ExecutionPlan` from the chosen strategy card, resolves instrument names per exchange (Deribit: `BTC-DDMonYY-STRIKE-C|P`; Aevo: `BTC-STRIKE-C|P`), and either simulates (dry-run) or submits orders. Deribit uses **JSON-RPC 2.0 over HTTP (POST)**; Aevo uses REST with HMAC-SHA256 signing (method + path + body in signature). When `--exchange` is not set, each leg is auto-routed to its best venue (per `leg_divergences`); live execution uses one executor per leg when routing is mixed. +5. **Order lifecycle** → Full lifecycle management: place → poll status → cancel. After placement, orders can be monitored with `--timeout` (poll until filled or cancel on expiry). Partial failures trigger automatic cancellation of already-filled legs. +6. **Safety controls** → Slippage protection (`--max-slippage`) rejects fills that deviate beyond threshold. Quantity override (`--quantity`) sets contract count for all legs. + +Credentials are read from the environment (no secrets in code). Dry-run requires no credentials. + +## Execution (autonomous trading) + +Execution is supported only for **crypto assets** (BTC, ETH, SOL). Use `--execute` to submit live orders or `--dry-run` to simulate without placing orders. + +**CLI flags:** + +- **`--execute best|safer|upside`** — Which strategy card to execute (default: best). Omit to run analysis only. +- **`--dry-run`** — Simulate execution using current exchange quotes; no API keys needed and no real orders. +- **`--force`** — Allow live execution when the guardrail recommends no trade (e.g. signals unclear). Without `--force`, the CLI exits with an error in that case. +- **`--exchange deribit|aevo`** — Force all legs to one exchange. Default: auto-route each leg to the best venue. +- **`--max-slippage N`** — Max allowed slippage % per fill (reject and cancel if exceeded, 0=off). +- **`--quantity N`** — Override contract quantity for all legs (0=use strategy default). +- **`--timeout N`** — Seconds to wait for each order fill before cancelling (0=fire-and-forget). + +**Environment variables (live execution only):** + +| Variable | Purpose | +|----------|---------| +| `DERIBIT_CLIENT_ID` / `DERIBIT_CLIENT_SECRET` | Deribit API credentials | +| `DERIBIT_TESTNET=1` | Use Deribit testnet | +| `AEVO_API_KEY` / `AEVO_API_SECRET` | Aevo API credentials | +| `AEVO_TESTNET=1` | Use Aevo testnet | + +**Safety:** When the pipeline sets a no-trade reason (e.g. low confidence, conflicting signals), live execution is refused unless `--force` is set. Dry-run is always allowed for testing. Slippage protection rejects fills exceeding `--max-slippage` threshold and auto-cancels the order. On partial multi-leg failure, already-filled legs are automatically cancelled (best-effort) to avoid dangling positions. The decision log JSON includes an `execution` block with mode, fills (including per-leg slippage %, latency ms, timestamps), cancelled orders, and net cost. + ## Synth API usage - **`get_prediction_percentiles(asset, horizon)`** — 1h and 24h probabilistic price forecasts; used for fusion state and for payoff/EV (outcome distribution at expiry). @@ -43,6 +82,12 @@ python tools/options-gps/main.py # Vol view directly from CLI python tools/options-gps/main.py --symbol BTC --view vol --risk medium --no-prompt + +# Simulate execution (no API keys, no real orders) +python tools/options-gps/main.py --symbol BTC --view bullish --risk medium --dry-run --no-prompt + +# Execute best strategy on exchange (requires credentials) +python tools/options-gps/main.py --symbol BTC --view bullish --risk medium --execute best --no-prompt ``` Prompts: symbol (default BTC), view (bullish/bearish/neutral/vol), risk (low/medium/high). Uses mock data when no `SYNTH_API_KEY` is set. @@ -51,4 +96,4 @@ Prompts: symbol (default BTC), view (bullish/bearish/neutral/vol), risk (low/med From repo root: `python -m pytest tools/options-gps/tests/ -v`. No API key required (mock data). -Test coverage includes: forecast fusion, strategy generation (all views including vol), PnL calculations for all strategy types, CDF-weighted PoP/EV, ranking with vol bias, vol-specific guardrails, IV estimation, vol comparison, risk plans, hard filters, exchange data fetching/parsing, divergence computation, line shopping ranking integration, and end-to-end scripted tests. +Test coverage includes: forecast fusion, strategy generation (all views including vol), PnL calculations for all strategy types, CDF-weighted PoP/EV, ranking with vol bias, vol-specific guardrails, IV estimation, vol comparison, risk plans, hard filters, exchange data fetching/parsing, divergence computation, line shopping ranking integration, end-to-end scripted tests, **execution** (instrument names, plan build/validate, dry-run executor, order lifecycle — get_order_status/cancel_order, slippage computation and protection, execution timestamps and latency, summary message verification, quantity override, auto-routing, get_executor factory, guardrail refusal when no-trade and no --force), full-pipeline-to-dry-run E2E, multi-leg execution E2E, non-crypto skip E2E, and slippage protection E2E. diff --git a/tools/options-gps/executor.py b/tools/options-gps/executor.py new file mode 100644 index 0000000..74231a8 --- /dev/null +++ b/tools/options-gps/executor.py @@ -0,0 +1,928 @@ +"""Autonomous execution engine for Options GPS. +Consumes pipeline data classes and exchange pricing. Supports Deribit (JSON-RPC), +Aevo (REST + EIP-712 L2 signing), and dry-run simulation. Auto-routing uses leg_divergences per leg. +Features: order lifecycle (place/status/cancel), slippage protection, order monitoring +with timeout, retry on transient errors, partial-fill cancellation.""" + +import json +import os +import time +import uuid +from abc import ABC, abstractmethod +from dataclasses import dataclass, field +from datetime import datetime, timezone +from typing import Callable + +import requests + +from exchange import best_execution_price, leg_divergences + + +@dataclass +class OrderRequest: + """Single order to send to an exchange.""" + instrument: str + action: str # "BUY" | "SELL" + quantity: int + order_type: str # "limit" | "market" + price: float + exchange: str # "deribit" | "aevo" | "dry_run" + leg_index: int + strike: float = 0.0 + option_type: str = "" + + +@dataclass +class OrderResult: + """Result of placing one order.""" + order_id: str + status: str # "filled" | "open" | "rejected" | "error" | "simulated" | "cancelled" + fill_price: float + fill_quantity: int + instrument: str + action: str + exchange: str + error: str | None = None + timestamp: str = "" # ISO 8601 when fill/status was recorded + slippage_pct: float = 0.0 # (fill_price - expected_price) / expected_price * 100 + latency_ms: int = 0 # round-trip latency in milliseconds + + +@dataclass +class ExecutionPlan: + """Plan of orders to execute for one strategy.""" + strategy_description: str + strategy_type: str + exchange: str # "deribit" | "aevo" | "auto" + asset: str + expiry: str + orders: list[OrderRequest] = field(default_factory=list) + estimated_cost: float = 0.0 + estimated_max_loss: float = 0.0 + dry_run: bool = False + max_slippage_pct: float = 0.0 # 0 = no slippage check + timeout_seconds: int = 0 # 0 = no monitoring (fire-and-forget) + quantity_override: int = 0 # 0 = use strategy quantity + + +@dataclass +class ExecutionReport: + """Result of executing a plan.""" + plan: ExecutionPlan + results: list[OrderResult] = field(default_factory=list) + all_filled: bool = False + net_cost: float = 0.0 + summary: str = "" + started_at: str = "" # ISO 8601 + finished_at: str = "" # ISO 8601 + cancelled_orders: list[str] = field(default_factory=list) # order_ids cancelled on failure + + +def deribit_instrument_name(asset: str, expiry: str, strike: float, option_type: str) -> str: + """Build Deribit instrument name e.g. BTC-26FEB26-67500-C.""" + strike_str = str(int(strike)) if strike == int(strike) else str(strike) + ot = "C" if option_type.lower() == "call" else "P" + date_part = _format_deribit_date(expiry) + return f"{asset}-{date_part}-{strike_str}-{ot}" + + +def aevo_instrument_name(asset: str, strike: float, option_type: str) -> str: + """Build Aevo instrument name e.g. BTC-67500-C (no date).""" + strike_str = str(int(strike)) if strike == int(strike) else str(strike) + ot = "C" if option_type.lower() == "call" else "P" + return f"{asset}-{strike_str}-{ot}" + + +def _format_deribit_date(expiry: str) -> str: + """Parse ISO 8601 expiry to Deribit DDMonYY e.g. 26FEB26.""" + if not expiry: + return "UNKNOWN" + try: + expiry = expiry.replace("Z", "+00:00") + dt = datetime.fromisoformat(expiry) + return dt.strftime("%d%b%y").upper() + except (ValueError, TypeError): + return "UNKNOWN" + + +def _now_iso() -> str: + """Current UTC time in ISO 8601.""" + return datetime.now(timezone.utc).isoformat() + + +def _slippage_pct(expected: float, actual: float, action: str) -> float: + """Compute slippage as a percentage. Positive = worse than expected. + For BUY: paying more is positive slippage. For SELL: receiving less is positive.""" + if expected <= 0: + return 0.0 + if action == "BUY": + return (actual - expected) / expected * 100 + return (expected - actual) / expected * 100 + + +class BaseExecutor(ABC): + """Abstract executor for one exchange (or dry-run). + Full order lifecycle: authenticate → place → status → cancel.""" + + @abstractmethod + def authenticate(self) -> bool: + pass + + @abstractmethod + def place_order(self, order: OrderRequest) -> OrderResult: + pass + + @abstractmethod + def get_order_status(self, order_id: str) -> OrderResult: + """Poll current status of a previously placed order.""" + + @abstractmethod + def cancel_order(self, order_id: str) -> bool: + """Cancel an open order. Returns True if successfully cancelled.""" + + +class DryRunExecutor(BaseExecutor): + """Simulates execution using quote data. No network calls.""" + + def __init__(self, exchange_quotes: list): + self.exchange_quotes = exchange_quotes + self._orders: dict[str, OrderResult] = {} # track placed orders for status queries + + def authenticate(self) -> bool: + return True + + def place_order(self, order: OrderRequest) -> OrderResult: + ts = _now_iso() + if not order.strike or not order.option_type: + return OrderResult( + order_id=f"dry-{uuid.uuid4().hex[:8]}", + status="error", fill_price=0.0, fill_quantity=0, + instrument=order.instrument, action=order.action, + exchange="dry_run", error="Missing strike or option_type on order", + timestamp=ts, + ) + quote = best_execution_price( + self.exchange_quotes, order.strike, order.option_type, order.action, + ) + if quote is None: + fill_price = order.price + else: + fill_price = quote.ask if order.action == "BUY" else quote.bid + slip = _slippage_pct(order.price, fill_price, order.action) + result = OrderResult( + order_id=f"dry-{uuid.uuid4().hex[:8]}", + status="simulated", + fill_price=fill_price, + fill_quantity=order.quantity, + instrument=order.instrument, + action=order.action, + exchange="dry_run", + timestamp=ts, + slippage_pct=round(slip, 4), + ) + self._orders[result.order_id] = result + return result + + def get_order_status(self, order_id: str) -> OrderResult: + if order_id in self._orders: + return self._orders[order_id] + return OrderResult( + order_id=order_id, status="error", fill_price=0.0, fill_quantity=0, + instrument="", action="", exchange="dry_run", + error="Order not found", timestamp=_now_iso(), + ) + + def cancel_order(self, order_id: str) -> bool: + if order_id in self._orders: + old = self._orders[order_id] + self._orders[order_id] = OrderResult( + order_id=order_id, status="cancelled", + fill_price=old.fill_price, fill_quantity=0, + instrument=old.instrument, action=old.action, + exchange="dry_run", timestamp=_now_iso(), + ) + return True + return False + + +def _is_retryable(err: Exception) -> bool: + """True for transient errors worth retrying.""" + if isinstance(err, (requests.Timeout, requests.ConnectionError)): + return True + if isinstance(err, requests.HTTPError) and err.response is not None: + return err.response.status_code in (429, 502, 503) + return False + + +def _deribit_rpc(base_url: str, method: str, params: dict, token: str | None) -> dict: + """Send one JSON-RPC 2.0 request to Deribit. POST to base_url/method with JSON-RPC body. Retries on transient errors.""" + url = f"{base_url.rstrip('/')}/{method}" + payload = {"jsonrpc": "2.0", "method": method, "params": params, "id": int(time.time() * 1000)} + headers = {"Content-Type": "application/json", "Accept": "application/json"} + if token: + headers["Authorization"] = f"Bearer {token}" + for attempt in range(3): + try: + resp = requests.post( + url, + data=json.dumps(payload), + headers=headers, + timeout=10, + ) + data = resp.json() if resp.content else {} + if "error" in data: + raise RuntimeError(data["error"].get("message", str(data["error"]))) + resp.raise_for_status() + return data.get("result", {}) + except Exception as e: + if _is_retryable(e) and attempt < 2: + time.sleep(0.5 * (attempt + 1)) + continue + raise + + +class DeribitExecutor(BaseExecutor): + """Executes orders on Deribit via JSON-RPC over HTTP (POST).""" + + def __init__(self, client_id: str, client_secret: str, testnet: bool = False): + self.client_id = client_id + self.client_secret = client_secret + self.base_url = ( + "https://test.deribit.com/api/v2" if testnet else "https://www.deribit.com/api/v2" + ) + self.token: str | None = None + self._index_prices: dict[str, float] = {} # cache: "btc_usd" -> price + + def _get_index_price(self, asset: str) -> float: + """Fetch and cache the underlying index price (e.g. BTC/USD) for price conversion.""" + index_name = f"{asset.lower()}_usd" + if index_name in self._index_prices: + return self._index_prices[index_name] + try: + result = _deribit_rpc( + self.base_url, "public/get_index_price", + {"index_name": index_name}, token=None, + ) + price = float(result.get("index_price", 0)) + if price > 0: + self._index_prices[index_name] = price + return price + except Exception: + return 0.0 + + def authenticate(self) -> bool: + if self.token: + return True + try: + result = _deribit_rpc( + self.base_url, + "public/auth", + { + "grant_type": "client_credentials", + "client_id": self.client_id, + "client_secret": self.client_secret, + }, + token=None, + ) + self.token = result.get("access_token") + return self.token is not None + except Exception: + return False + + def _get_book_price(self, instrument: str, action: str) -> float | None: + """Fetch best ask (BUY) or bid (SELL) in BTC from the live order book. + Falls back to mark_price. Snaps to tick size to avoid rejection.""" + try: + result = _deribit_rpc( + self.base_url, "public/get_order_book", + {"instrument_name": instrument}, token=None, + ) + if action == "BUY": + price = result.get("best_ask_price", 0) + if not price: + price = result.get("mark_price", 0) + else: + price = result.get("best_bid_price", 0) + if not price: + price = result.get("mark_price", 0) + if price: + tick = 0.0005 # Deribit option tick size + return round(round(float(price) / tick) * tick, 4) + return None + except Exception: + return None + + def place_order(self, order: OrderRequest) -> OrderResult: + method = "private/buy" if order.action == "BUY" else "private/sell" + # Deribit options: amount in contracts (1 contract = 1 BTC), price in BTC. + # For live orders, use the exchange's current order book price to ensure + # the limit price is valid. Fall back to converted pipeline price. + asset = order.instrument.split("-")[0] if "-" in order.instrument else "BTC" + index_price = self._get_index_price(asset) + params = { + "instrument_name": order.instrument, + "amount": order.quantity, + "type": order.order_type, + } + if order.order_type == "limit": + book_price = self._get_book_price(order.instrument, order.action) + if book_price and book_price > 0: + params["price"] = book_price + elif index_price > 0: + params["price"] = round(order.price / index_price, 4) + else: + params["price"] = order.price # fallback: send as-is + t0 = time.monotonic() + try: + result = _deribit_rpc(self.base_url, method, params, self.token) + latency = int((time.monotonic() - t0) * 1000) + order_data = result.get("order", {}) + fill_price_btc = float(order_data.get("average_price", 0)) + # Convert BTC fill price back to USD for pipeline consistency + fill_price_usd = fill_price_btc * index_price if index_price > 0 else fill_price_btc + slip = _slippage_pct(order.price, fill_price_usd, order.action) if fill_price_usd > 0 else 0.0 + return OrderResult( + order_id=order_data.get("order_id", ""), + status=order_data.get("order_state", "error"), + fill_price=round(fill_price_usd, 2), + fill_quantity=int(order_data.get("filled_amount", 0)), + instrument=order.instrument, + action=order.action, + exchange="deribit", + timestamp=_now_iso(), + slippage_pct=round(slip, 4), + latency_ms=latency, + ) + except Exception as e: + return OrderResult( + order_id="", status="error", fill_price=0.0, fill_quantity=0, + instrument=order.instrument, action=order.action, exchange="deribit", + error=str(e), timestamp=_now_iso(), + ) + + def get_order_status(self, order_id: str) -> OrderResult: + try: + result = _deribit_rpc( + self.base_url, "private/get_order_state", + {"order_id": order_id}, self.token, + ) + fill_price_btc = float(result.get("average_price", 0)) + # Convert BTC fill price to USD for pipeline consistency + instrument = result.get("instrument_name", "") + asset = instrument.split("-")[0] if "-" in instrument else "BTC" + index_price = self._get_index_price(asset) + fill_price_usd = fill_price_btc * index_price if index_price > 0 else fill_price_btc + return OrderResult( + order_id=result.get("order_id", order_id), + status=result.get("order_state", "error"), + fill_price=round(fill_price_usd, 2), + fill_quantity=int(result.get("filled_amount", 0)), + instrument=instrument, + action="BUY" if result.get("direction") == "buy" else "SELL", + exchange="deribit", + timestamp=_now_iso(), + ) + except Exception as e: + return OrderResult( + order_id=order_id, status="error", fill_price=0.0, fill_quantity=0, + instrument="", action="", exchange="deribit", + error=str(e), timestamp=_now_iso(), + ) + + def cancel_order(self, order_id: str) -> bool: + try: + _deribit_rpc( + self.base_url, "private/cancel", + {"order_id": order_id}, self.token, + ) + return True + except Exception: + return False + + +def _aevo_eip712_domain_separator(name: str, version: str, chain_id: int) -> bytes: + """Compute EIP-712 domain separator for Aevo (no verifyingContract/salt).""" + from eth_abi import encode as abi_encode + from eth_hash.auto import keccak + domain_type_hash = keccak( + b"EIP712Domain(string name,string version,uint256 chainId)" + ) + return keccak( + domain_type_hash + + keccak(name.encode()) + + keccak(version.encode()) + + abi_encode(["uint256"], [chain_id]) + ) + + +def _aevo_order_struct_hash( + maker: str, is_buy: bool, limit_price: int, amount: int, + salt: int, instrument_id: int, timestamp: int, +) -> bytes: + """Compute EIP-712 struct hash for an Aevo Order.""" + from eth_abi import encode as abi_encode + from eth_hash.auto import keccak + order_type_hash = keccak( + b"Order(address maker,bool isBuy,uint256 limitPrice,uint256 amount," + b"uint256 salt,uint256 instrument,uint256 timestamp)" + ) + return keccak( + order_type_hash + + abi_encode( + ["address", "bool", "uint256", "uint256", "uint256", "uint256", "uint256"], + [maker, is_buy, limit_price, amount, salt, instrument_id, timestamp], + ) + ) + + +_AEVO_SIGNING_DOMAINS = { + "testnet": {"name": "Aevo Testnet", "version": "1", "chain_id": 11155111}, + "mainnet": {"name": "Aevo Mainnet", "version": "1", "chain_id": 1}, +} + +_AEVO_DECIMALS = 10**6 + + +class AevoExecutor(BaseExecutor): + """Executes orders on Aevo via REST with EIP-712 L2 order signing. + Requires: api_key, api_secret (for REST auth headers), signing_key (Ethereum + private key for EIP-712 order signatures), and wallet_address (maker address).""" + + def __init__( + self, api_key: str, api_secret: str, signing_key: str, + wallet_address: str, testnet: bool = False, + ): + self.api_key = api_key + self.api_secret = api_secret + self.signing_key = signing_key + self.wallet_address = wallet_address + self.testnet = testnet + self.base_url = ( + "https://api-testnet.aevo.xyz" if testnet else "https://api.aevo.xyz" + ) + env = "testnet" if testnet else "mainnet" + domain_cfg = _AEVO_SIGNING_DOMAINS[env] + self._domain_separator = _aevo_eip712_domain_separator( + domain_cfg["name"], domain_cfg["version"], domain_cfg["chain_id"], + ) + self._instrument_cache: dict[str, int] = {} # "BTC-71000-C" -> numeric id + + def _headers(self) -> dict: + return { + "AEVO-KEY": self.api_key, + "AEVO-SECRET": self.api_secret, + "Content-Type": "application/json", + } + + def _resolve_instrument_id(self, instrument_name: str, asset: str = "BTC") -> int | None: + """Resolve instrument name to numeric Aevo instrument ID via /markets. + Our names (e.g. BTC-71000-C) omit the expiry date that Aevo includes + (e.g. BTC-27MAR26-71000-C), so we fall back to matching by strike + type.""" + if instrument_name in self._instrument_cache: + return self._instrument_cache[instrument_name] + try: + resp = requests.get( + f"{self.base_url}/markets?asset={asset}&instrument_type=OPTION", + timeout=10, + ) + resp.raise_for_status() + for market in resp.json(): + mname = market.get("instrument_name", "") + mid = market.get("instrument_id") + if mid is not None: + self._instrument_cache[mname] = int(mid) + except Exception: + pass # fall through to fuzzy match on whatever's already cached + # Exact match (works if names happen to align) + if instrument_name in self._instrument_cache: + return self._instrument_cache[instrument_name] + # Fuzzy match: our name is "BTC-71000-C", Aevo's is "BTC-27MAR26-71000-C" + # Match by strike + option type suffix (last two segments) + parts = instrument_name.rsplit("-", 2) + if len(parts) >= 3: + target_suffix = f"-{parts[-2]}-{parts[-1]}" # "-71000-C" + elif len(parts) == 2: + target_suffix = f"-{parts[-1]}" + else: + return None + for mname, mid in self._instrument_cache.items(): + if mname.startswith(asset) and mname.endswith(target_suffix): + self._instrument_cache[instrument_name] = mid # cache alias + return mid + return None + + def _sign_order( + self, is_buy: bool, limit_price: float, quantity: int, + instrument_id: int, timestamp: int, + ) -> tuple[int, str]: + """EIP-712 sign an order. Returns (salt, signature_hex).""" + import random + from eth_account import Account + from eth_hash.auto import keccak + salt = random.randint(0, 10**10) + price_scaled = int(round(limit_price * _AEVO_DECIMALS)) + amount_scaled = int(round(quantity * _AEVO_DECIMALS)) + struct_hash = _aevo_order_struct_hash( + maker=self.wallet_address, + is_buy=is_buy, + limit_price=price_scaled, + amount=amount_scaled, + salt=salt, + instrument_id=instrument_id, + timestamp=timestamp, + ) + digest = keccak(b"\x19\x01" + self._domain_separator + struct_hash) + sig = Account._sign_hash(digest, self.signing_key) + return salt, f"0x{sig.signature.hex()}" + + def authenticate(self) -> bool: + return bool(self.api_key and self.api_secret and self.signing_key and self.wallet_address) + + def place_order(self, order: OrderRequest) -> OrderResult: + asset = order.instrument.split("-")[0] if "-" in order.instrument else "BTC" + instrument_id = self._resolve_instrument_id(order.instrument, asset) + if instrument_id is None: + return OrderResult( + order_id="", status="error", fill_price=0.0, fill_quantity=0, + instrument=order.instrument, action=order.action, exchange="aevo", + error=f"Cannot resolve instrument ID for '{order.instrument}'", + timestamp=_now_iso(), + ) + is_buy = order.action == "BUY" + timestamp = int(time.time()) + salt, signature = self._sign_order( + is_buy=is_buy, + limit_price=order.price, + quantity=order.quantity, + instrument_id=instrument_id, + timestamp=timestamp, + ) + payload = { + "maker": self.wallet_address, + "is_buy": is_buy, + "instrument": instrument_id, + "limit_price": str(int(round(order.price * _AEVO_DECIMALS))), + "amount": str(int(round(order.quantity * _AEVO_DECIMALS))), + "salt": str(salt), + "signature": signature, + "timestamp": timestamp, + "post_only": False, + "reduce_only": False, + "close_position": False, + } + body = json.dumps(payload) + last_err = None + t0 = time.monotonic() + for attempt in range(3): + try: + resp = requests.post( + f"{self.base_url}/orders", + data=body, + headers=self._headers(), + timeout=10, + ) + if resp.status_code >= 400: + try: + err_body = resp.json() + raise RuntimeError(err_body.get("error", resp.text)) + except (ValueError, KeyError): + resp.raise_for_status() + latency = int((time.monotonic() - t0) * 1000) + data = resp.json() + # Aevo returns prices/amounts as scaled integers (×10^6) + raw_price = float(data.get("avg_price") or data.get("price", "0")) + fill_price = raw_price / _AEVO_DECIMALS + raw_filled = float(data.get("filled", "0")) + fill_qty = max(1, int(raw_filled / _AEVO_DECIMALS)) if raw_filled > 0 else 0 + slip = _slippage_pct(order.price, fill_price, order.action) if fill_price > 0 else 0.0 + return OrderResult( + order_id=data.get("order_id", ""), + status=data.get("order_status", data.get("status", "error")), + fill_price=fill_price, + fill_quantity=fill_qty or order.quantity, + instrument=order.instrument, + action=order.action, + exchange="aevo", + timestamp=_now_iso(), + slippage_pct=round(slip, 4), + latency_ms=latency, + ) + except Exception as e: + last_err = e + if _is_retryable(e) and attempt < 2: + time.sleep(0.5 * (attempt + 1)) + continue + return OrderResult( + order_id="", status="error", fill_price=0.0, fill_quantity=0, + instrument=order.instrument, action=order.action, exchange="aevo", + error=str(e), timestamp=_now_iso(), + ) + return OrderResult( + order_id="", status="error", fill_price=0.0, fill_quantity=0, + instrument=order.instrument, action=order.action, exchange="aevo", + error=str(last_err), timestamp=_now_iso(), + ) + + def get_order_status(self, order_id: str) -> OrderResult: + try: + resp = requests.get( + f"{self.base_url}/orders/{order_id}", + headers=self._headers(), + timeout=10, + ) + resp.raise_for_status() + data = resp.json() + return OrderResult( + order_id=data.get("order_id", order_id), + status=data.get("order_status", data.get("status", "error")), + fill_price=float(data.get("avg_price", 0)), + fill_quantity=int(data.get("filled", 0)), + instrument=data.get("instrument_name", ""), + action="BUY" if data.get("side") == "buy" or data.get("is_buy") else "SELL", + exchange="aevo", + timestamp=_now_iso(), + ) + except Exception as e: + return OrderResult( + order_id=order_id, status="error", fill_price=0.0, fill_quantity=0, + instrument="", action="", exchange="aevo", + error=str(e), timestamp=_now_iso(), + ) + + def cancel_order(self, order_id: str) -> bool: + try: + resp = requests.delete( + f"{self.base_url}/orders/{order_id}", + headers=self._headers(), + timeout=10, + ) + resp.raise_for_status() + return True + except Exception: + return False + + +def build_execution_plan( + scored, + asset: str, + exchange: str | None, + exchange_quotes: list, + synth_options: dict, + quantity_override: int = 0, + max_slippage_pct: float = 0.0, + timeout_seconds: int = 0, +) -> ExecutionPlan: + """Build ExecutionPlan from a ScoredStrategy. When exchange is None, auto-route per leg.""" + strategy = scored.strategy + plan = ExecutionPlan( + strategy_description=strategy.description, + strategy_type=strategy.strategy_type, + exchange=exchange or "auto", + asset=asset, + expiry=strategy.expiry or "", + dry_run=False, + quantity_override=quantity_override, + max_slippage_pct=max_slippage_pct, + timeout_seconds=timeout_seconds, + ) + leg_routes = {} + if exchange is None: + leg_routes = leg_divergences(strategy, exchange_quotes, synth_options) + + for i, leg in enumerate(strategy.legs): + if exchange is not None: + leg_exchange = exchange + elif i in leg_routes: + leg_exchange = leg_routes[i]["best_exchange"] + else: + quote = best_execution_price( + exchange_quotes, leg.strike, leg.option_type.lower(), leg.action, + ) + leg_exchange = quote.exchange if quote else "deribit" + + if leg_exchange == "aevo": + instrument = aevo_instrument_name(asset, leg.strike, leg.option_type) + else: + instrument = deribit_instrument_name( + asset, strategy.expiry or "", leg.strike, leg.option_type, + ) + quote = best_execution_price( + exchange_quotes, leg.strike, leg.option_type.lower(), leg.action, + ) + if quote is not None: + price = quote.ask if leg.action == "BUY" else quote.bid + else: + price = leg.premium + + qty = plan.quantity_override if plan.quantity_override > 0 else leg.quantity + plan.orders.append(OrderRequest( + instrument=instrument, + action=leg.action, + quantity=qty, + order_type="limit", + price=price, + exchange=leg_exchange, + leg_index=i, + strike=leg.strike, + option_type=leg.option_type.lower(), + )) + + buy_total = sum(o.price * o.quantity for o in plan.orders if o.action == "BUY") + sell_total = sum(o.price * o.quantity for o in plan.orders if o.action == "SELL") + plan.estimated_cost = buy_total - sell_total + plan.estimated_max_loss = strategy.max_loss + return plan + + +def validate_plan(plan: ExecutionPlan) -> tuple[bool, str]: + """Validate plan before submission. Returns (is_valid, error_message).""" + if not plan.orders: + return False, "No orders in plan" + for i, order in enumerate(plan.orders): + if not order.instrument: + return False, f"Order {i}: empty instrument name" + if order.price <= 0: + return False, f"Order {i}: price must be > 0 (got {order.price})" + if order.quantity <= 0: + return False, f"Order {i}: quantity must be > 0 (got {order.quantity})" + if order.action not in ("BUY", "SELL"): + return False, f"Order {i}: invalid action '{order.action}'" + return True, "" + + +def _monitor_order( + executor: BaseExecutor, + order_id: str, + timeout_seconds: int, + poll_interval: float = 1.0, +) -> OrderResult: + """Poll order status until filled, rejected, or timeout.""" + deadline = time.monotonic() + timeout_seconds + last_result = None + while time.monotonic() < deadline: + last_result = executor.get_order_status(order_id) + if last_result.status in ("filled", "rejected", "error", "cancelled", "simulated"): + return last_result + time.sleep(max(0, min(poll_interval, deadline - time.monotonic()))) + if last_result and last_result.status == "open": + last_result.error = f"Timeout after {timeout_seconds}s — order still open" + return last_result or OrderResult( + order_id=order_id, status="error", fill_price=0.0, fill_quantity=0, + instrument="", action="", exchange="", + error=f"Timeout after {timeout_seconds}s", timestamp=_now_iso(), + ) + + +def _cancel_filled_orders( + filled_results: list[OrderResult], + get_exec: Callable[[str], BaseExecutor], +) -> list[str]: + """Best-effort cancel of previously filled orders. Returns list of cancelled order_ids.""" + cancelled = [] + for r in filled_results: + if r.order_id and r.status in ("filled", "simulated", "open"): + executor = get_exec(r.exchange) + if executor.cancel_order(r.order_id): + cancelled.append(r.order_id) + return cancelled + + +def execute_plan( + plan: ExecutionPlan, + executor_or_factory: BaseExecutor | Callable[[str], BaseExecutor], +) -> ExecutionReport: + """Execute all orders. Supports slippage protection, order monitoring with timeout, + and automatic cancellation of filled legs on partial failure. + If executor_or_factory is callable, call it with order.exchange per order (for auto).""" + report = ExecutionReport(plan=plan, started_at=_now_iso()) + get_executor: Callable[[str], BaseExecutor] = ( + executor_or_factory if callable(executor_or_factory) else lambda _: executor_or_factory + ) + + for order in plan.orders: + executor = get_executor(order.exchange) + if not executor.authenticate(): + report.summary = "Authentication failed" + report.all_filled = False + report.net_cost = _compute_net_cost(report.results) + report.finished_at = _now_iso() + return report + result = executor.place_order(order) + + # Order monitoring: if timeout is set and order is open, poll until filled or timeout + if plan.timeout_seconds > 0 and result.status == "open" and result.order_id: + result = _monitor_order(executor, result.order_id, plan.timeout_seconds) + # If still open after timeout, cancel it + if result.status == "open": + executor.cancel_order(result.order_id) + result.status = "cancelled" + result.error = f"Cancelled after {plan.timeout_seconds}s timeout" + + # Slippage protection: reject if fill slippage exceeds threshold + if (plan.max_slippage_pct > 0 + and result.status in ("filled", "simulated") + and result.slippage_pct > plan.max_slippage_pct): + # Cancel this order if possible + if result.order_id: + executor.cancel_order(result.order_id) + result = OrderResult( + order_id=result.order_id, + status="rejected", + fill_price=result.fill_price, + fill_quantity=result.fill_quantity, + instrument=result.instrument, + action=result.action, + exchange=result.exchange, + error=f"Slippage {result.slippage_pct:.2f}% exceeds max {plan.max_slippage_pct:.2f}%", + timestamp=_now_iso(), + slippage_pct=result.slippage_pct, + latency_ms=result.latency_ms, + ) + + report.results.append(result) + if result.status in ("error", "rejected", "cancelled"): + filled = [r for r in report.results if r.status in ("filled", "simulated")] + if filled: + # Auto-cancel previously filled legs on partial failure + report.cancelled_orders = _cancel_filled_orders(filled, get_executor) + instruments = ", ".join(r.instrument for r in filled) + cancel_note = ( + f" Auto-cancelled {len(report.cancelled_orders)} filled legs." + if report.cancelled_orders + else f" WARNING: manually close filled legs: {instruments}" + ) + report.summary = ( + f"Partial fill — order {order.leg_index} failed: " + f"{result.error or result.status}.{cancel_note}" + ) + else: + report.summary = f"Order {order.leg_index} failed: {result.error or result.status}" + report.all_filled = False + report.net_cost = _compute_net_cost(report.results) + report.finished_at = _now_iso() + return report + + report.all_filled = all( + r.status in ("filled", "simulated") for r in report.results + ) + report.net_cost = _compute_net_cost(report.results) + report.finished_at = _now_iso() + if report.all_filled: + mode = "simulated" if plan.dry_run else "live" + report.summary = ( + f"All {len(report.results)} legs {mode} successfully. Net cost: ${report.net_cost:,.2f}" + ) + else: + report.summary = f"Execution completed with {len(report.results)} orders" + return report + + +def _compute_net_cost(results: list[OrderResult]) -> float: + cost = 0.0 + for r in results: + if r.status in ("filled", "simulated"): + if r.action == "BUY": + cost += r.fill_price * r.fill_quantity + else: + cost -= r.fill_price * r.fill_quantity + return cost + + +def get_executor( + exchange: str, + exchange_quotes: list, + dry_run: bool = False, +) -> BaseExecutor: + """Factory: return executor for the given exchange. For auto, pass per-order exchange via execute_plan's callable.""" + if dry_run: + return DryRunExecutor(exchange_quotes) + if exchange == "deribit": + client_id = os.environ.get("DERIBIT_CLIENT_ID", "") + client_secret = os.environ.get("DERIBIT_CLIENT_SECRET", "") + if not client_id or not client_secret: + raise ValueError( + "Deribit credentials required: set DERIBIT_CLIENT_ID and " + "DERIBIT_CLIENT_SECRET environment variables" + ) + testnet = os.environ.get("DERIBIT_TESTNET", "").strip() == "1" + return DeribitExecutor(client_id, client_secret, testnet) + if exchange == "aevo": + api_key = os.environ.get("AEVO_API_KEY", "") + api_secret = os.environ.get("AEVO_API_SECRET", "") + signing_key = os.environ.get("AEVO_SIGNING_KEY", "") + wallet_address = os.environ.get("AEVO_WALLET_ADDRESS", "") + if not api_key or not api_secret: + raise ValueError( + "Aevo credentials required: set AEVO_API_KEY and " + "AEVO_API_SECRET environment variables" + ) + if not signing_key or not wallet_address: + raise ValueError( + "Aevo L2 signing credentials required: set AEVO_SIGNING_KEY " + "(Ethereum private key) and AEVO_WALLET_ADDRESS environment variables" + ) + testnet = os.environ.get("AEVO_TESTNET", "").strip() == "1" + return AevoExecutor(api_key, api_secret, signing_key, wallet_address, testnet) + raise ValueError( + f"Unknown exchange '{exchange}'. Use --exchange deribit or --exchange aevo" + ) diff --git a/tools/options-gps/main.py b/tools/options-gps/main.py index 6fd9936..b2d8a8f 100644 --- a/tools/options-gps/main.py +++ b/tools/options-gps/main.py @@ -40,6 +40,12 @@ compute_divergence, compute_edge, ) +from executor import ( + build_execution_plan, + validate_plan, + execute_plan, + get_executor, +) SUPPORTED_ASSETS = ["BTC", "ETH", "SOL", "XAU", "SPY", "NVDA", "TSLA", "AAPL", "GOOGL"] @@ -671,6 +677,92 @@ def screen_if_wrong(best: ScoredStrategy | None, no_trade_reason: str | None, print(_footer()) +def screen_execution( + card: ScoredStrategy, + asset: str, + exchange: str | None, + exchange_quotes: list, + synth_options: dict, + dry_run: bool = False, + no_prompt: bool = False, + max_slippage: float = 0.0, + quantity: int = 0, + timeout: int = 0, +): + """Screen 5: build plan, confirm (if live), execute, report. Returns ExecutionReport or None.""" + print(_header("Screen 5: Execution")) + mode_label = "DRY RUN" if dry_run else "LIVE" + print(f"{BAR} Mode: {mode_label}") + plan = build_execution_plan( + card, asset, exchange, exchange_quotes, synth_options, + quantity_override=quantity, + max_slippage_pct=max_slippage, + timeout_seconds=timeout, + ) + plan.dry_run = dry_run + valid, err = validate_plan(plan) + if not valid: + print(f"{BAR} Pre-flight FAILED: {err}") + print(_footer()) + return None + print(f"{BAR} Exchange: {plan.exchange.upper()}") + print(f"{BAR} Asset: {plan.asset}") + print(f"{BAR} Strategy: {plan.strategy_description}") + if max_slippage > 0: + print(f"{BAR} Slippage Guard: max {max_slippage:.2f}%") + if timeout > 0: + print(f"{BAR} Order Timeout: {timeout}s") + if quantity > 0: + print(f"{BAR} Quantity Override: {quantity} contracts") + print(f"{BAR}") + print(_section("ORDER PLAN")) + for order in plan.orders: + print(f"{BAR} Leg {order.leg_index}: {order.action} {order.quantity}x " + f"{order.instrument} @ ${order.price:,.2f} ({order.order_type}) [{order.exchange}]") + print(f"{BAR}") + print(_kv("Est. Cost", f"${plan.estimated_cost:,.2f}")) + print(_kv("Est. Max Loss", f"${plan.estimated_max_loss:,.2f}")) + if not dry_run: + print(f"{BAR}") + print(f"{BAR} WARNING: This will submit LIVE orders.") + _pause("confirm execution", no_prompt) + if plan.exchange == "auto" and plan.orders: + def executor_factory(ex: str): + return get_executor(ex, exchange_quotes, dry_run) + report = execute_plan(plan, executor_factory) + else: + effective_exchange = plan.orders[0].exchange if plan.orders else "deribit" + try: + executor = get_executor(effective_exchange, exchange_quotes, dry_run) + except ValueError as e: + print(f"{BAR} {e}") + print(_footer()) + return None + report = execute_plan(plan, executor) + print(f"{BAR}") + print(_section("RESULTS")) + for result in report.results: + status_icon = "\u2713" if result.status in ("filled", "simulated") else "\u2717" + err_suffix = f" [{result.error}]" if result.error else "" + slip_suffix = f" slip:{result.slippage_pct:+.2f}%" if result.slippage_pct else "" + latency_suffix = f" {result.latency_ms}ms" if result.latency_ms else "" + print(f"{BAR} {status_icon} {result.action} {result.instrument}: " + f"{result.status} @ ${result.fill_price:,.2f} x{result.fill_quantity}" + f"{slip_suffix}{latency_suffix}{err_suffix}") + if report.cancelled_orders: + print(f"{BAR}") + print(f"{BAR} Auto-cancelled: {', '.join(report.cancelled_orders)}") + print(f"{BAR}") + print(_kv("All Filled", "Yes" if report.all_filled else "No")) + print(_kv("Net Cost", f"${report.net_cost:,.2f}")) + if report.started_at and report.finished_at: + print(_kv("Started", report.started_at)) + print(_kv("Finished", report.finished_at)) + print(f"{BAR} {report.summary}") + print(_footer()) + return report + + def _card_to_log(card: ScoredStrategy | None, exchange_divergence: float | None = None) -> dict | None: """Serialize a strategy card for the decision log with full trade construction.""" if card is None: @@ -705,10 +797,19 @@ def _card_to_log(card: ScoredStrategy | None, exchange_divergence: float | None return result +def _refuse_execution(no_trade_reason: str | None, force: bool, doing_live: bool) -> bool: + """True when we should refuse execution: guardrail active, no --force, and live (not dry-run).""" + return bool(doing_live and no_trade_reason and not force) + + def _parse_screen_arg(screen_arg: str) -> set[int]: - """Parse --screen flag into set of screen numbers (1-4).""" - if screen_arg.strip().lower() == "all": + """Parse --screen flag into set of screen numbers (1-4). + Use 'none' to skip all analysis screens (useful with --execute to show only execution).""" + val = screen_arg.strip().lower() + if val == "all": return {1, 2, 3, 4} + if val in ("none", "0"): + return set() screens: set[int] = set() for part in screen_arg.split(","): part = part.strip() @@ -725,9 +826,23 @@ def main(): parser.add_argument("--view", default=None, choices=["bullish", "bearish", "neutral", "vol"]) parser.add_argument("--risk", default=None, choices=["low", "medium", "high"]) parser.add_argument("--screen", default="all", - help="Screens to show: comma-separated 1,2,3,4 or 'all' (default: all)") + help="Screens to show: comma-separated 1,2,3,4, 'all', or 'none' (default: all)") parser.add_argument("--no-prompt", action="store_true", dest="no_prompt", help="Skip pause between screens (dump all at once)") + parser.add_argument("--execute", default=None, choices=["best", "safer", "upside"], + help="Execute this strategy on an exchange (default: best)") + parser.add_argument("--dry-run", action="store_true", dest="dry_run", + help="Simulate execution without placing real orders") + parser.add_argument("--force", action="store_true", + help="Allow execution when guardrail recommends no trade") + parser.add_argument("--exchange", default=None, choices=["deribit", "aevo"], + help="Force exchange (default: auto-route per leg)") + parser.add_argument("--max-slippage", type=float, default=0.0, dest="max_slippage", + help="Max allowed slippage %% (reject fill if exceeded, 0=off)") + parser.add_argument("--quantity", type=int, default=0, + help="Override contract quantity for all legs (0=use strategy default)") + parser.add_argument("--timeout", type=int, default=0, + help="Seconds to wait for order fill before cancelling (0=fire-and-forget)") args = parser.parse_args() screens = _parse_screen_arg(args.screen) with warnings.catch_warnings(): @@ -806,6 +921,36 @@ def main(): _pause("Screen 4: If Wrong", args.no_prompt) screen_if_wrong(best, no_trade_reason, outcome_prices, current_price, asset=symbol) shown_any = True + execution_report = None + if args.execute is not None or args.dry_run: + if symbol not in ("BTC", "ETH", "SOL"): + print("\nExecution only supported for crypto assets (BTC, ETH, SOL).", file=sys.stderr) + return 1 + if not exchange_quotes: + print("\nCannot execute: exchange data not available (crypto assets only).", file=sys.stderr) + return 1 + doing_live = args.execute is not None and not args.dry_run + if _refuse_execution(no_trade_reason, args.force, doing_live): + print(f"\nGuardrail active: {no_trade_reason}", file=sys.stderr) + print("Use --force to override and execute anyway.", file=sys.stderr) + return 1 + card = best if (args.execute in (None, "best")) else (safer if args.execute == "safer" else upside) + if card is None: + print("\nCannot execute: no strategy recommendation available.", file=sys.stderr) + return 1 + if shown_any: + _pause("Screen 5: Execution", args.no_prompt) + execution_report = screen_execution( + card, symbol, args.exchange, exchange_quotes, options, + dry_run=args.dry_run or not args.execute, + no_prompt=args.no_prompt, + max_slippage=args.max_slippage, + quantity=args.quantity, + timeout=args.timeout, + ) + shown_any = True + if execution_report is None: + return 1 if shown_any: _pause("Decision Log", args.no_prompt) decision_log = { @@ -829,6 +974,37 @@ def main(): "safer_alt": _card_to_log(safer, divergence_by_strategy.get(id(safer.strategy)) if divergence_by_strategy and safer else None), "higher_upside": _card_to_log(upside, divergence_by_strategy.get(id(upside.strategy)) if divergence_by_strategy and upside else None), } + if execution_report is not None: + testnet = ( + os.environ.get("DERIBIT_TESTNET", "").strip() == "1" + or os.environ.get("AEVO_TESTNET", "").strip() == "1" + ) + decision_log["execution"] = { + "mode": "dry_run" if execution_report.plan.dry_run else "live", + "exchange": execution_report.plan.exchange, + "testnet": testnet, + "all_filled": execution_report.all_filled, + "net_cost": round(execution_report.net_cost, 2), + "started_at": execution_report.started_at, + "finished_at": execution_report.finished_at, + "max_slippage_pct": execution_report.plan.max_slippage_pct or None, + "timeout_seconds": execution_report.plan.timeout_seconds or None, + "quantity_override": execution_report.plan.quantity_override or None, + "cancelled_orders": execution_report.cancelled_orders or None, + "fills": [ + { + "instrument": r.instrument, + "action": r.action, + "status": r.status, + "fill_price": round(r.fill_price, 2), + "fill_quantity": r.fill_quantity, + "slippage_pct": round(r.slippage_pct, 4) if r.slippage_pct else None, + "latency_ms": r.latency_ms or None, + "timestamp": r.timestamp or None, + } + for r in execution_report.results + ], + } print(_header("Decision Log (JSON)")) for line in json.dumps(decision_log, indent=2, ensure_ascii=False).split("\n"): print(f"{BAR} {line}") diff --git a/tools/options-gps/requirements.txt b/tools/options-gps/requirements.txt index 9a7fc84..fa652c3 100644 --- a/tools/options-gps/requirements.txt +++ b/tools/options-gps/requirements.txt @@ -2,3 +2,6 @@ # The synth_client package is included in the repo — no need to list it. # requests is needed if you want to use live API mode. requests>=2.28.0 +eth-account>=0.13.0 +eth-abi>=5.0.0 +eth-hash[pycryptodome]>=0.7.0 diff --git a/tools/options-gps/tests/test_executor.py b/tools/options-gps/tests/test_executor.py new file mode 100644 index 0000000..5bc44ee --- /dev/null +++ b/tools/options-gps/tests/test_executor.py @@ -0,0 +1,453 @@ +"""Tests for executor.py: instrument names, plan build/validate, dry-run, execution flow, +order lifecycle (status/cancel), slippage protection, quantity override, factory.""" + +import os +import sys + +sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..")) + +import pytest +from executor import ( + OrderRequest, + OrderResult, + ExecutionPlan, + DryRunExecutor, + deribit_instrument_name, + aevo_instrument_name, + build_execution_plan, + validate_plan, + execute_plan, + get_executor, + _slippage_pct, +) +from exchange import _parse_instrument_key +from pipeline import ScoredStrategy + + +def _make_scored(strategy): + """Wrap a StrategyCandidate into a ScoredStrategy for testing.""" + return ScoredStrategy( + strategy=strategy, + probability_of_profit=0.55, + expected_value=100.0, + tail_risk=50.0, + loss_profile="premium at risk", + invalidation_trigger="Close on break", + reroute_rule="Roll out", + review_again_at="Review at 50%", + score=0.8, + rationale="Test", + ) + + +class TestInstrumentNames: + def test_deribit_instrument_name(self): + name = deribit_instrument_name("BTC", "2026-02-26T08:00:00Z", 67500, "Call") + assert name == "BTC-26FEB26-67500-C" + + def test_deribit_instrument_name_put(self): + name = deribit_instrument_name("ETH", "2026-03-15T08:00:00Z", 4000, "Put") + assert name == "ETH-15MAR26-4000-P" + + def test_aevo_instrument_name(self): + name = aevo_instrument_name("BTC", 67500, "Call") + assert name == "BTC-67500-C" + + def test_aevo_instrument_name_put(self): + name = aevo_instrument_name("SOL", 150, "Put") + assert name == "SOL-150-P" + + def test_deribit_roundtrip(self): + name = deribit_instrument_name("BTC", "2026-02-26T08:00:00Z", 67500, "Call") + parsed = _parse_instrument_key(name) + assert parsed is not None + strike, opt_type = parsed + assert strike == 67500 + assert opt_type == "call" + + def test_aevo_roundtrip(self): + name = aevo_instrument_name("BTC", 68000, "Put") + parsed = _parse_instrument_key(name) + assert parsed is not None + strike, opt_type = parsed + assert strike == 68000 + assert opt_type == "put" + + def test_deribit_empty_expiry(self): + name = deribit_instrument_name("BTC", "", 67500, "Call") + assert "UNKNOWN" in name + + +class TestBuildPlan: + def test_single_leg(self, sample_strategy, sample_exchange_quotes, btc_option_data): + scored = _make_scored(sample_strategy) + plan = build_execution_plan(scored, "BTC", "deribit", sample_exchange_quotes, btc_option_data) + assert len(plan.orders) == 1 + assert plan.orders[0].action == "BUY" + assert plan.orders[0].exchange == "deribit" + assert plan.orders[0].strike == 67500 + assert plan.orders[0].option_type == "call" + assert "67500" in plan.orders[0].instrument + assert plan.estimated_cost > 0 + + def test_multi_leg(self, multi_leg_strategy, sample_exchange_quotes, btc_option_data): + scored = _make_scored(multi_leg_strategy) + plan = build_execution_plan(scored, "BTC", "deribit", sample_exchange_quotes, btc_option_data) + assert len(plan.orders) == 2 + actions = [o.action for o in plan.orders] + assert "BUY" in actions + assert "SELL" in actions + + def test_exchange_override(self, multi_leg_strategy, sample_exchange_quotes, btc_option_data): + scored = _make_scored(multi_leg_strategy) + plan = build_execution_plan(scored, "BTC", "deribit", sample_exchange_quotes, btc_option_data) + for order in plan.orders: + assert order.exchange == "deribit" + assert "BTC-" in order.instrument + + def test_aevo_names(self, sample_strategy, sample_exchange_quotes, btc_option_data): + scored = _make_scored(sample_strategy) + plan = build_execution_plan(scored, "BTC", "aevo", sample_exchange_quotes, btc_option_data) + assert len(plan.orders) == 1 + assert plan.orders[0].instrument == "BTC-67500-C" + + def test_auto_route(self, sample_strategy, sample_exchange_quotes, btc_option_data): + scored = _make_scored(sample_strategy) + plan = build_execution_plan(scored, "BTC", None, sample_exchange_quotes, btc_option_data) + assert plan.exchange == "auto" + assert len(plan.orders) == 1 + assert plan.orders[0].exchange in ("deribit", "aevo") + + def test_estimated_cost_multi_leg(self, multi_leg_strategy, sample_exchange_quotes, btc_option_data): + scored = _make_scored(multi_leg_strategy) + plan = build_execution_plan(scored, "BTC", "deribit", sample_exchange_quotes, btc_option_data) + buy_total = sum(o.price * o.quantity for o in plan.orders if o.action == "BUY") + sell_total = sum(o.price * o.quantity for o in plan.orders if o.action == "SELL") + assert plan.estimated_cost == pytest.approx(buy_total - sell_total) + + +class TestValidatePlan: + def test_valid(self): + plan = ExecutionPlan( + strategy_description="Test", strategy_type="long_call", + exchange="deribit", asset="BTC", expiry="", + orders=[ + OrderRequest("BTC-26FEB26-67500-C", "BUY", 1, "limit", 660.0, "deribit", 0, + strike=67500, option_type="call"), + ], + ) + valid, err = validate_plan(plan) + assert valid is True + assert err == "" + + def test_empty_orders(self): + plan = ExecutionPlan( + strategy_description="Test", strategy_type="long_call", + exchange="deribit", asset="BTC", expiry="", + ) + valid, err = validate_plan(plan) + assert valid is False + assert "No orders" in err + + def test_zero_price(self): + plan = ExecutionPlan( + strategy_description="Test", strategy_type="long_call", + exchange="deribit", asset="BTC", expiry="", + orders=[ + OrderRequest("BTC-26FEB26-67500-C", "BUY", 1, "limit", 0.0, "deribit", 0, + strike=67500, option_type="call"), + ], + ) + valid, err = validate_plan(plan) + assert valid is False + assert "price" in err.lower() + + def test_zero_quantity(self): + plan = ExecutionPlan( + strategy_description="Test", strategy_type="long_call", + exchange="deribit", asset="BTC", expiry="", + orders=[ + OrderRequest("BTC-26FEB26-67500-C", "BUY", 0, "limit", 660.0, "deribit", 0, + strike=67500, option_type="call"), + ], + ) + valid, err = validate_plan(plan) + assert valid is False + assert "quantity" in err.lower() + + def test_empty_instrument(self): + plan = ExecutionPlan( + strategy_description="Test", strategy_type="long_call", + exchange="deribit", asset="BTC", expiry="", + orders=[ + OrderRequest("", "BUY", 1, "limit", 660.0, "deribit", 0, + strike=67500, option_type="call"), + ], + ) + valid, err = validate_plan(plan) + assert valid is False + assert "instrument" in err.lower() + + +class TestDryRunExecutor: + def test_authenticate(self, sample_exchange_quotes): + executor = DryRunExecutor(sample_exchange_quotes) + assert executor.authenticate() is True + + def test_place_buy(self, sample_exchange_quotes): + executor = DryRunExecutor(sample_exchange_quotes) + order = OrderRequest("BTC-67500-C", "BUY", 1, "limit", 660.0, "dry_run", 0, + strike=67500, option_type="call") + result = executor.place_order(order) + assert result.status == "simulated" + assert result.fill_quantity == 1 + assert result.fill_price == 655.0 + + def test_place_sell(self, sample_exchange_quotes): + executor = DryRunExecutor(sample_exchange_quotes) + order = OrderRequest("BTC-67500-C", "SELL", 1, "limit", 620.0, "dry_run", 0, + strike=67500, option_type="call") + result = executor.place_order(order) + assert result.status == "simulated" + assert result.fill_quantity == 1 + assert result.fill_price == 620.0 + + def test_missing_strike(self, sample_exchange_quotes): + executor = DryRunExecutor(sample_exchange_quotes) + order = OrderRequest("INVALID", "BUY", 1, "limit", 100.0, "dry_run", 0) + result = executor.place_order(order) + assert result.status == "error" + + def test_no_matching_quote_uses_order_price(self, sample_exchange_quotes): + executor = DryRunExecutor(sample_exchange_quotes) + order = OrderRequest("BTC-99999-C", "BUY", 1, "limit", 100.0, "dry_run", 0, + strike=99999, option_type="call") + result = executor.place_order(order) + assert result.status == "simulated" + assert result.fill_price == 100.0 + + def test_get_order_status(self, sample_exchange_quotes): + executor = DryRunExecutor(sample_exchange_quotes) + order = OrderRequest("BTC-67500-C", "BUY", 1, "limit", 660.0, "dry_run", 0, + strike=67500, option_type="call") + result = executor.place_order(order) + status = executor.get_order_status(result.order_id) + assert status.status == "simulated" + assert status.order_id == result.order_id + assert status.fill_price == result.fill_price + + def test_get_order_status_not_found(self, sample_exchange_quotes): + executor = DryRunExecutor(sample_exchange_quotes) + status = executor.get_order_status("nonexistent-id") + assert status.status == "error" + assert "not found" in status.error.lower() + + def test_cancel_order(self, sample_exchange_quotes): + executor = DryRunExecutor(sample_exchange_quotes) + order = OrderRequest("BTC-67500-C", "BUY", 1, "limit", 660.0, "dry_run", 0, + strike=67500, option_type="call") + result = executor.place_order(order) + assert executor.cancel_order(result.order_id) is True + status = executor.get_order_status(result.order_id) + assert status.status == "cancelled" + + def test_cancel_order_not_found(self, sample_exchange_quotes): + executor = DryRunExecutor(sample_exchange_quotes) + assert executor.cancel_order("nonexistent-id") is False + + def test_timestamp_on_result(self, sample_exchange_quotes): + executor = DryRunExecutor(sample_exchange_quotes) + order = OrderRequest("BTC-67500-C", "BUY", 1, "limit", 660.0, "dry_run", 0, + strike=67500, option_type="call") + result = executor.place_order(order) + assert result.timestamp != "" + assert "T" in result.timestamp # ISO 8601 + + def test_slippage_tracked(self, sample_exchange_quotes): + executor = DryRunExecutor(sample_exchange_quotes) + order = OrderRequest("BTC-67500-C", "BUY", 1, "limit", 660.0, "dry_run", 0, + strike=67500, option_type="call") + result = executor.place_order(order) + # Fill at 655 (ask), expected 660 -> slippage is (655-660)/660 = negative (favorable) + assert result.slippage_pct < 0 # got cheaper than expected + + +class TestExecuteFlow: + def test_single_leg(self, sample_strategy, sample_exchange_quotes, btc_option_data): + scored = _make_scored(sample_strategy) + plan = build_execution_plan(scored, "BTC", "deribit", sample_exchange_quotes, btc_option_data) + plan.dry_run = True + executor = DryRunExecutor(sample_exchange_quotes) + report = execute_plan(plan, executor) + assert report.all_filled is True + assert len(report.results) == 1 + assert report.results[0].status == "simulated" + + def test_multi_leg(self, multi_leg_strategy, sample_exchange_quotes, btc_option_data): + scored = _make_scored(multi_leg_strategy) + plan = build_execution_plan(scored, "BTC", "deribit", sample_exchange_quotes, btc_option_data) + plan.dry_run = True + executor = DryRunExecutor(sample_exchange_quotes) + report = execute_plan(plan, executor) + assert report.all_filled is True + assert len(report.results) == 2 + + def test_net_cost(self, multi_leg_strategy, sample_exchange_quotes, btc_option_data): + scored = _make_scored(multi_leg_strategy) + plan = build_execution_plan(scored, "BTC", "deribit", sample_exchange_quotes, btc_option_data) + plan.dry_run = True + executor = DryRunExecutor(sample_exchange_quotes) + report = execute_plan(plan, executor) + buy_total = sum(r.fill_price * r.fill_quantity for r in report.results if r.action == "BUY") + sell_total = sum(r.fill_price * r.fill_quantity for r in report.results if r.action == "SELL") + assert report.net_cost == pytest.approx(buy_total - sell_total) + + def test_auto_routing_uses_factory(self, sample_strategy, sample_exchange_quotes, btc_option_data): + """When plan.exchange is 'auto', execute_plan with callable factory uses per-order executor.""" + scored = _make_scored(sample_strategy) + plan = build_execution_plan(scored, "BTC", None, sample_exchange_quotes, btc_option_data) + plan.dry_run = True + def factory(ex): + return get_executor(ex, sample_exchange_quotes, dry_run=True) + report = execute_plan(plan, factory) + assert report.all_filled is True + assert len(report.results) == 1 + assert report.results[0].status == "simulated" + + def test_summary_message_simulated(self, sample_strategy, sample_exchange_quotes, btc_option_data): + scored = _make_scored(sample_strategy) + plan = build_execution_plan(scored, "BTC", "deribit", sample_exchange_quotes, btc_option_data) + plan.dry_run = True + executor = DryRunExecutor(sample_exchange_quotes) + report = execute_plan(plan, executor) + assert "simulated successfully" in report.summary + assert "Net cost: $" in report.summary + + def test_report_has_timestamps(self, sample_strategy, sample_exchange_quotes, btc_option_data): + scored = _make_scored(sample_strategy) + plan = build_execution_plan(scored, "BTC", "deribit", sample_exchange_quotes, btc_option_data) + plan.dry_run = True + executor = DryRunExecutor(sample_exchange_quotes) + report = execute_plan(plan, executor) + assert report.started_at != "" + assert report.finished_at != "" + assert "T" in report.started_at + + +class TestGetExecutor: + def test_dry_run(self, sample_exchange_quotes): + executor = get_executor("deribit", sample_exchange_quotes, dry_run=True) + assert isinstance(executor, DryRunExecutor) + + def test_dry_run_ignores_exchange(self, sample_exchange_quotes): + executor = get_executor("aevo", sample_exchange_quotes, dry_run=True) + assert isinstance(executor, DryRunExecutor) + + def test_missing_deribit_creds(self, sample_exchange_quotes, monkeypatch): + monkeypatch.delenv("DERIBIT_CLIENT_ID", raising=False) + monkeypatch.delenv("DERIBIT_CLIENT_SECRET", raising=False) + with pytest.raises(ValueError, match="DERIBIT_CLIENT_ID"): + get_executor("deribit", sample_exchange_quotes, dry_run=False) + + def test_missing_aevo_creds(self, sample_exchange_quotes, monkeypatch): + monkeypatch.delenv("AEVO_API_KEY", raising=False) + monkeypatch.delenv("AEVO_API_SECRET", raising=False) + monkeypatch.delenv("AEVO_SIGNING_KEY", raising=False) + monkeypatch.delenv("AEVO_WALLET_ADDRESS", raising=False) + with pytest.raises(ValueError, match="AEVO_API_KEY"): + get_executor("aevo", sample_exchange_quotes, dry_run=False) + + def test_missing_aevo_signing_creds(self, sample_exchange_quotes, monkeypatch): + monkeypatch.setenv("AEVO_API_KEY", "test-key") + monkeypatch.setenv("AEVO_API_SECRET", "test-secret") + monkeypatch.delenv("AEVO_SIGNING_KEY", raising=False) + monkeypatch.delenv("AEVO_WALLET_ADDRESS", raising=False) + with pytest.raises(ValueError, match="AEVO_SIGNING_KEY"): + get_executor("aevo", sample_exchange_quotes, dry_run=False) + + def test_unknown_exchange(self, sample_exchange_quotes): + with pytest.raises(ValueError, match="Unknown exchange"): + get_executor("binance", sample_exchange_quotes, dry_run=False) + + +class TestSlippage: + def test_slippage_buy_worse(self): + # Paid more than expected + assert _slippage_pct(100.0, 105.0, "BUY") == pytest.approx(5.0) + + def test_slippage_buy_better(self): + # Paid less than expected + assert _slippage_pct(100.0, 95.0, "BUY") == pytest.approx(-5.0) + + def test_slippage_sell_worse(self): + # Received less than expected + assert _slippage_pct(100.0, 95.0, "SELL") == pytest.approx(5.0) + + def test_slippage_sell_better(self): + # Received more than expected + assert _slippage_pct(100.0, 105.0, "SELL") == pytest.approx(-5.0) + + def test_slippage_zero_expected(self): + assert _slippage_pct(0.0, 100.0, "BUY") == 0.0 + + def test_slippage_protection_rejects(self, sample_exchange_quotes): + """When max_slippage_pct is set and fill slippage exceeds it, order is rejected.""" + plan = ExecutionPlan( + strategy_description="Test", strategy_type="long_call", + exchange="deribit", asset="BTC", expiry="", + dry_run=True, max_slippage_pct=0.01, + orders=[ + OrderRequest("BTC-67500-C", "BUY", 1, "limit", 620.0, "dry_run", 0, + strike=67500, option_type="call"), + ], + ) + # Order price 620, ask is 655 → slippage = (655-620)/620 = 5.6%, exceeds 0.01% + executor = DryRunExecutor(sample_exchange_quotes) + report = execute_plan(plan, executor) + assert report.results[0].status == "rejected" + assert "Slippage" in report.results[0].error + assert report.all_filled is False + + def test_slippage_protection_allows(self, sample_exchange_quotes): + """When slippage is within threshold, order proceeds normally.""" + plan = ExecutionPlan( + strategy_description="Test", strategy_type="long_call", + exchange="deribit", asset="BTC", expiry="", + dry_run=True, max_slippage_pct=50.0, + orders=[ + OrderRequest("BTC-67500-C", "BUY", 1, "limit", 620.0, "dry_run", 0, + strike=67500, option_type="call"), + ], + ) + executor = DryRunExecutor(sample_exchange_quotes) + report = execute_plan(plan, executor) + assert report.results[0].status == "simulated" + assert report.all_filled is True + + +class TestQuantityOverride: + def test_default_quantity(self, sample_strategy, sample_exchange_quotes, btc_option_data): + """Without quantity_override, orders use the strategy leg quantity.""" + scored = _make_scored(sample_strategy) + plan = build_execution_plan(scored, "BTC", "deribit", sample_exchange_quotes, btc_option_data) + assert plan.quantity_override == 0 + assert plan.orders[0].quantity == 1 # default from strategy leg + + def test_quantity_override_applied(self, sample_strategy, sample_exchange_quotes, btc_option_data): + """When quantity_override > 0, build_execution_plan uses it for all legs.""" + scored = _make_scored(sample_strategy) + plan = build_execution_plan( + scored, "BTC", "deribit", sample_exchange_quotes, btc_option_data, + quantity_override=5, + ) + assert plan.quantity_override == 5 + assert plan.orders[0].quantity == 5 + + def test_quantity_override_multi_leg(self, multi_leg_strategy, sample_exchange_quotes, btc_option_data): + """Quantity override applies to every leg in a multi-leg strategy.""" + scored = _make_scored(multi_leg_strategy) + plan = build_execution_plan( + scored, "BTC", "deribit", sample_exchange_quotes, btc_option_data, + quantity_override=3, + ) + assert all(o.quantity == 3 for o in plan.orders) diff --git a/tools/options-gps/tests/test_executor_e2e.py b/tools/options-gps/tests/test_executor_e2e.py new file mode 100644 index 0000000..438d044 --- /dev/null +++ b/tools/options-gps/tests/test_executor_e2e.py @@ -0,0 +1,151 @@ +"""E2E tests: full pipeline to execution, guardrail refusal, multi-leg, non-crypto, slippage.""" + +import os +import sys + +sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..")) + +from pipeline import ( + generate_strategies, + rank_strategies, + select_three_cards, + run_forecast_fusion, + forecast_confidence, +) +from exchange import fetch_all_exchanges, strategy_divergence +from executor import build_execution_plan, execute_plan, get_executor +from main import _refuse_execution + +MOCK_DIR = os.path.join(os.path.dirname(__file__), "..", "..", "..", "mock_data", "exchange_options") +BTC_OPTION_DATA = { + "current_price": 67723.50, + "call_options": { + "67000": 987.04, "67500": 638.43, "68000": 373.27, + }, + "put_options": { + "67000": 140.36, "67500": 291.75, "68000": 526.59, + }, + "expiry_time": "2026-02-26T08:00:00Z", +} +P24H = { + "0.05": 66000, "0.5": 67800, "0.95": 70000, +} + + +def test_full_pipeline_dry_run(): + """Pipeline -> rank -> select best -> build plan -> dry-run execute -> verify report.""" + candidates = generate_strategies(BTC_OPTION_DATA, "bullish", "medium", asset="BTC", expiry="2026-02-26T08:00:00Z") + assert len(candidates) > 0 + exchange_quotes = fetch_all_exchanges("BTC", mock_dir=MOCK_DIR) + assert len(exchange_quotes) > 0 + divergence_by_strategy = {} + for c in candidates: + div = strategy_divergence(c, exchange_quotes, BTC_OPTION_DATA) + if div is not None: + divergence_by_strategy[id(c)] = div + outcome_prices = [66000, 67000, 67800, 68200, 70000] + fusion = run_forecast_fusion(None, P24H, 67723.50) + confidence = forecast_confidence(P24H, 67723.50) + scored = rank_strategies( + candidates, fusion, "bullish", outcome_prices, "medium", + 67723.50, confidence, 1.0, cdf_values=None, divergence_by_strategy=divergence_by_strategy, + ) + best, _, _ = select_three_cards(scored) + assert best is not None + plan = build_execution_plan(best, "BTC", None, exchange_quotes, BTC_OPTION_DATA) + plan.dry_run = True + def factory(ex): + return get_executor(ex, exchange_quotes, dry_run=True) + report = execute_plan(plan, factory) + assert report.all_filled is True + assert len(report.results) == len(plan.orders) + assert all(r.status == "simulated" for r in report.results) + + +def test_refuse_execution_guardrail_active_no_force(): + """When guardrail is active and --force not set, we refuse live execution.""" + assert _refuse_execution("Signals unclear", force=False, doing_live=True) is True + + +def test_allow_execution_guardrail_active_with_force(): + """When guardrail is active but --force is set, we allow execution.""" + assert _refuse_execution("Signals unclear", force=True, doing_live=True) is False + + +def test_allow_execution_dry_run_ignores_guardrail(): + """Dry-run is allowed even when guardrail is active (no real orders).""" + assert _refuse_execution("Signals unclear", force=False, doing_live=False) is False + + +def test_allow_execution_no_guardrail(): + """When no guardrail, we allow execution.""" + assert _refuse_execution(None, force=False, doing_live=True) is False + + +def test_multi_leg_execution_pipeline(): + """Multi-leg strategy (spread) → rank → build plan → dry-run → verify all legs filled.""" + candidates = generate_strategies(BTC_OPTION_DATA, "bullish", "medium", asset="BTC", expiry="2026-02-26T08:00:00Z") + # Find a multi-leg candidate (spread) + multi_leg = [c for c in candidates if len(c.legs) >= 2] + assert len(multi_leg) > 0, "Expected at least one multi-leg strategy" + exchange_quotes = fetch_all_exchanges("BTC", mock_dir=MOCK_DIR) + divergence_by_strategy = {} + for c in candidates: + div = strategy_divergence(c, exchange_quotes, BTC_OPTION_DATA) + if div is not None: + divergence_by_strategy[id(c)] = div + outcome_prices = [66000, 67000, 67800, 68200, 70000] + fusion = run_forecast_fusion(None, P24H, 67723.50) + confidence = forecast_confidence(P24H, 67723.50) + scored = rank_strategies( + candidates, fusion, "bullish", outcome_prices, "medium", + 67723.50, confidence, 1.0, cdf_values=None, divergence_by_strategy=divergence_by_strategy, + ) + # Pick a multi-leg scored strategy + multi_scored = [s for s in scored if len(s.strategy.legs) >= 2] + assert len(multi_scored) > 0 + card = multi_scored[0] + plan = build_execution_plan(card, "BTC", None, exchange_quotes, BTC_OPTION_DATA) + plan.dry_run = True + assert len(plan.orders) >= 2 + def factory(ex): + return get_executor(ex, exchange_quotes, dry_run=True) + report = execute_plan(plan, factory) + assert report.all_filled is True + assert len(report.results) == len(plan.orders) + assert all(r.status == "simulated" for r in report.results) + # Verify timestamps on all results + assert all(r.timestamp != "" for r in report.results) + assert report.started_at != "" + assert report.finished_at != "" + + +def test_non_crypto_skips_execution(): + """Non-crypto symbols should not have exchange quotes; execution should not proceed.""" + from exchange import fetch_all_exchanges as _fetch + quotes = _fetch("SPY", mock_dir=MOCK_DIR) + assert quotes == [], "Non-crypto asset should return no exchange quotes" + + +def test_slippage_protection_e2e(): + """Full pipeline with tight slippage → order rejected or passes depending on fill.""" + candidates = generate_strategies(BTC_OPTION_DATA, "bullish", "medium", asset="BTC", expiry="2026-02-26T08:00:00Z") + exchange_quotes = fetch_all_exchanges("BTC", mock_dir=MOCK_DIR) + outcome_prices = [66000, 67000, 67800, 68200, 70000] + fusion = run_forecast_fusion(None, P24H, 67723.50) + confidence = forecast_confidence(P24H, 67723.50) + scored = rank_strategies( + candidates, fusion, "bullish", outcome_prices, "medium", + 67723.50, confidence, 1.0, cdf_values=None, + ) + from pipeline import select_three_cards + best, _, _ = select_three_cards(scored) + assert best is not None + plan = build_execution_plan(best, "BTC", None, exchange_quotes, BTC_OPTION_DATA) + plan.dry_run = True + plan.max_slippage_pct = 50.0 # generous threshold — should pass + def factory(ex): + return get_executor(ex, exchange_quotes, dry_run=True) + report = execute_plan(plan, factory) + assert report.all_filled is True + assert all(r.status == "simulated" for r in report.results)