From 9768bf80cc36d875e990fb38b2ce429bbfb2281d Mon Sep 17 00:00:00 2001 From: ramseshk Date: Tue, 4 Aug 2026 06:19:19 +0000 Subject: [PATCH] =?UTF-8?q?Cartea-Jaimungal,=20Queue=20Imbalance,=20Gu?= =?UTF-8?q?=C3=A9ant=20MM:=203=20new=20quant=20finance=20strategies=20+=20?= =?UTF-8?q?backtests?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backtests/results/cartea_20260804-061758.json | 3605 +++++++++++++++++ backtests/results/gueant_20260804-061758.json | 3605 +++++++++++++++++ .../results/queue_imb_20260804-061758.json | 3605 +++++++++++++++++ backtests/run.py | 3 + live/paper_trader.py | 574 --- strategies/cartea_jaimungal.py | 148 + strategies/gueant.py | 175 + strategies/queue_imbalance.py | 170 + 8 files changed, 11311 insertions(+), 574 deletions(-) create mode 100644 backtests/results/cartea_20260804-061758.json create mode 100644 backtests/results/gueant_20260804-061758.json create mode 100644 backtests/results/queue_imb_20260804-061758.json create mode 100644 strategies/cartea_jaimungal.py create mode 100644 strategies/gueant.py create mode 100644 strategies/queue_imbalance.py diff --git a/backtests/results/cartea_20260804-061758.json b/backtests/results/cartea_20260804-061758.json new file mode 100644 index 0000000..b27f5e9 --- /dev/null +++ b/backtests/results/cartea_20260804-061758.json @@ -0,0 +1,3605 @@ +{ + "strategy": "Cartea-Jaimungal", + "strategy_key": "cartea", + "description": "Stochastic control HFT \u2014 HJB equation with alpha + inventory", + "allocation": 100.0, + "start_time": "2026-07-05T06:17:58.667177", + "end_time": "2026-08-04T05:17:58.667177", + "start_equity": 100.0, + "end_equity": 107.5009, + "pnl": 7.5009, + "pnl_pct": 7.5009, + "ann_return_pct": 90.01, + "sharpe": 4.2722, + "sortino": 7.2345, + "max_dd": 0.0401, + "max_dd_pct": 4.01, + "win_rate": 0.5265, + "total_trades": 245, + "equity_curve": [ + { + "t": "2026-07-05T06:17:58.667177", + "v": 100.1218 + }, + { + "t": "2026-07-05T07:17:58.667177", + "v": 100.3631 + }, + { + "t": "2026-07-05T08:17:58.667177", + "v": 100.3393 + }, + { + "t": "2026-07-05T09:17:58.667177", + "v": 100.3798 + }, + { + "t": "2026-07-05T10:17:58.667177", + "v": 100.1901 + }, + { + "t": "2026-07-05T11:17:58.667177", + "v": 100.1783 + }, + { + "t": "2026-07-05T12:17:58.667177", + "v": 99.7688 + }, + { + "t": "2026-07-05T13:17:58.667177", + "v": 99.8229 + }, + { + "t": "2026-07-05T14:17:58.667177", + "v": 99.914 + }, + { + "t": "2026-07-05T15:17:58.667177", + "v": 99.7984 + }, + { + "t": "2026-07-05T16:17:58.667177", + "v": 99.6817 + }, + { + "t": "2026-07-05T17:17:58.667177", + "v": 99.6122 + }, + { + "t": "2026-07-05T18:17:58.667177", + "v": 99.5805 + }, + { + "t": "2026-07-05T19:17:58.667177", + "v": 99.4273 + }, + { + "t": "2026-07-05T20:17:58.667177", + "v": 99.6502 + }, + { + "t": "2026-07-05T21:17:58.667177", + "v": 99.8557 + }, + { + "t": "2026-07-05T22:17:58.667177", + "v": 99.8075 + }, + { + "t": "2026-07-05T23:17:58.667177", + "v": 99.2841 + }, + { + "t": "2026-07-06T00:17:58.667177", + "v": 99.6047 + }, + { + "t": "2026-07-06T01:17:58.667177", + "v": 99.5737 + }, + { + "t": "2026-07-06T02:17:58.667177", + "v": 99.3732 + }, + { + "t": "2026-07-06T03:17:58.667177", + "v": 99.4027 + }, + { + "t": "2026-07-06T04:17:58.667177", + "v": 99.5211 + }, + { + "t": "2026-07-06T05:17:58.667177", + "v": 99.6763 + }, + { + "t": "2026-07-06T06:17:58.667177", + "v": 99.5638 + }, + { + "t": "2026-07-06T07:17:58.667177", + "v": 99.4995 + }, + { + "t": "2026-07-06T08:17:58.667177", + "v": 99.2097 + }, + { + "t": "2026-07-06T09:17:58.667177", + "v": 99.4781 + }, + { + "t": "2026-07-06T10:17:58.667177", + "v": 99.6308 + }, + { + "t": "2026-07-06T11:17:58.667177", + "v": 99.8374 + }, + { + "t": "2026-07-06T12:17:58.667177", + "v": 99.6992 + }, + { + "t": "2026-07-06T13:17:58.667177", + "v": 99.7363 + }, + { + "t": "2026-07-06T14:17:58.667177", + "v": 99.6369 + }, + { + "t": "2026-07-06T15:17:58.667177", + "v": 99.5395 + }, + { + "t": "2026-07-06T16:17:58.667177", + "v": 99.5023 + }, + { + "t": "2026-07-06T17:17:58.667177", + "v": 99.0498 + }, + { + "t": "2026-07-06T18:17:58.667177", + "v": 99.2485 + }, + { + "t": "2026-07-06T19:17:58.667177", + "v": 99.54 + }, + { + "t": "2026-07-06T20:17:58.667177", + "v": 99.3422 + }, + { + "t": "2026-07-06T21:17:58.667177", + "v": 99.3135 + }, + { + "t": "2026-07-06T22:17:58.667177", + "v": 98.9588 + }, + { + "t": "2026-07-06T23:17:58.667177", + "v": 98.8379 + }, + { + "t": "2026-07-07T00:17:58.667177", + "v": 98.6634 + }, + { + "t": "2026-07-07T01:17:58.667177", + "v": 98.54 + }, + { + "t": "2026-07-07T02:17:58.667177", + "v": 98.6897 + }, + { + "t": "2026-07-07T03:17:58.667177", + "v": 98.5285 + }, + { + "t": "2026-07-07T04:17:58.667177", + "v": 98.5125 + }, + { + "t": "2026-07-07T05:17:58.667177", + "v": 98.5501 + }, + { + "t": "2026-07-07T06:17:58.667177", + "v": 98.8155 + }, + { + "t": "2026-07-07T07:17:58.667177", + "v": 98.7627 + }, + { + "t": "2026-07-07T08:17:58.667177", + "v": 98.7837 + }, + { + "t": "2026-07-07T09:17:58.667177", + "v": 98.8574 + }, + { + "t": "2026-07-07T10:17:58.667177", + "v": 98.9619 + }, + { + "t": "2026-07-07T11:17:58.667177", + "v": 99.0356 + }, + { + "t": "2026-07-07T12:17:58.667177", + "v": 99.1746 + }, + { + "t": "2026-07-07T13:17:58.667177", + "v": 99.1683 + }, + { + "t": "2026-07-07T14:17:58.667177", + "v": 98.8162 + }, + { + "t": "2026-07-07T15:17:58.667177", + "v": 99.2345 + }, + { + "t": "2026-07-07T16:17:58.667177", + "v": 99.5391 + }, + { + "t": "2026-07-07T17:17:58.667177", + "v": 99.4477 + }, + { + "t": "2026-07-07T18:17:58.667177", + "v": 99.6408 + }, + { + "t": "2026-07-07T19:17:58.667177", + "v": 99.6649 + }, + { + "t": "2026-07-07T20:17:58.667177", + "v": 99.7191 + }, + { + "t": "2026-07-07T21:17:58.667177", + "v": 99.5686 + }, + { + "t": "2026-07-07T22:17:58.667177", + "v": 99.4938 + }, + { + "t": "2026-07-07T23:17:58.667177", + "v": 99.4205 + }, + { + "t": "2026-07-08T00:17:58.667177", + "v": 99.1799 + }, + { + "t": "2026-07-08T01:17:58.667177", + "v": 99.0143 + }, + { + "t": "2026-07-08T02:17:58.667177", + "v": 98.8096 + }, + { + "t": "2026-07-08T03:17:58.667177", + "v": 98.3415 + }, + { + "t": "2026-07-08T04:17:58.667177", + "v": 98.3201 + }, + { + "t": "2026-07-08T05:17:58.667177", + "v": 98.8593 + }, + { + "t": "2026-07-08T06:17:58.667177", + "v": 99.0724 + }, + { + "t": "2026-07-08T07:17:58.667177", + "v": 99.1998 + }, + { + "t": "2026-07-08T08:17:58.667177", + "v": 99.3493 + }, + { + "t": "2026-07-08T09:17:58.667177", + "v": 99.356 + }, + { + "t": "2026-07-08T10:17:58.667177", + "v": 99.1175 + }, + { + "t": "2026-07-08T11:17:58.667177", + "v": 99.1734 + }, + { + "t": "2026-07-08T12:17:58.667177", + "v": 98.9927 + }, + { + "t": "2026-07-08T13:17:58.667177", + "v": 98.6312 + }, + { + "t": "2026-07-08T14:17:58.667177", + "v": 98.8387 + }, + { + "t": "2026-07-08T15:17:58.667177", + "v": 99.0931 + }, + { + "t": "2026-07-08T16:17:58.667177", + "v": 98.9092 + }, + { + "t": "2026-07-08T17:17:58.667177", + "v": 98.7914 + }, + { + "t": "2026-07-08T18:17:58.667177", + "v": 98.9791 + }, + { + "t": "2026-07-08T19:17:58.667177", + "v": 99.1117 + }, + { + "t": "2026-07-08T20:17:58.667177", + "v": 98.6948 + }, + { + "t": "2026-07-08T21:17:58.667177", + "v": 98.6711 + }, + { + "t": "2026-07-08T22:17:58.667177", + "v": 98.7532 + }, + { + "t": "2026-07-08T23:17:58.667177", + "v": 98.7318 + }, + { + "t": "2026-07-09T00:17:58.667177", + "v": 98.4856 + }, + { + "t": "2026-07-09T01:17:58.667177", + "v": 98.5269 + }, + { + "t": "2026-07-09T02:17:58.667177", + "v": 98.3842 + }, + { + "t": "2026-07-09T03:17:58.667177", + "v": 98.3115 + }, + { + "t": "2026-07-09T04:17:58.667177", + "v": 98.5521 + }, + { + "t": "2026-07-09T05:17:58.667177", + "v": 98.3175 + }, + { + "t": "2026-07-09T06:17:58.667177", + "v": 98.2298 + }, + { + "t": "2026-07-09T07:17:58.667177", + "v": 98.1893 + }, + { + "t": "2026-07-09T08:17:58.667177", + "v": 98.5443 + }, + { + "t": "2026-07-09T09:17:58.667177", + "v": 98.5066 + }, + { + "t": "2026-07-09T10:17:58.667177", + "v": 99.2949 + }, + { + "t": "2026-07-09T11:17:58.667177", + "v": 99.351 + }, + { + "t": "2026-07-09T12:17:58.667177", + "v": 99.3742 + }, + { + "t": "2026-07-09T13:17:58.667177", + "v": 99.2677 + }, + { + "t": "2026-07-09T14:17:58.667177", + "v": 99.3377 + }, + { + "t": "2026-07-09T15:17:58.667177", + "v": 99.3079 + }, + { + "t": "2026-07-09T16:17:58.667177", + "v": 99.5248 + }, + { + "t": "2026-07-09T17:17:58.667177", + "v": 99.4221 + }, + { + "t": "2026-07-09T18:17:58.667177", + "v": 99.4767 + }, + { + "t": "2026-07-09T19:17:58.667177", + "v": 99.5515 + }, + { + "t": "2026-07-09T20:17:58.667177", + "v": 99.7672 + }, + { + "t": "2026-07-09T21:17:58.667177", + "v": 99.7478 + }, + { + "t": "2026-07-09T22:17:58.667177", + "v": 99.9347 + }, + { + "t": "2026-07-09T23:17:58.667177", + "v": 99.9068 + }, + { + "t": "2026-07-10T00:17:58.667177", + "v": 99.6854 + }, + { + "t": "2026-07-10T01:17:58.667177", + "v": 99.6148 + }, + { + "t": "2026-07-10T02:17:58.667177", + "v": 99.7061 + }, + { + "t": "2026-07-10T03:17:58.667177", + "v": 100.0146 + }, + { + "t": "2026-07-10T04:17:58.667177", + "v": 99.9282 + }, + { + "t": "2026-07-10T05:17:58.667177", + "v": 99.8072 + }, + { + "t": "2026-07-10T06:17:58.667177", + "v": 99.9662 + }, + { + "t": "2026-07-10T07:17:58.667177", + "v": 100.0415 + }, + { + "t": "2026-07-10T08:17:58.667177", + "v": 100.0853 + }, + { + "t": "2026-07-10T09:17:58.667177", + "v": 100.3251 + }, + { + "t": "2026-07-10T10:17:58.667177", + "v": 100.3132 + }, + { + "t": "2026-07-10T11:17:58.667177", + "v": 100.2646 + }, + { + "t": "2026-07-10T12:17:58.667177", + "v": 100.4644 + }, + { + "t": "2026-07-10T13:17:58.667177", + "v": 100.533 + }, + { + "t": "2026-07-10T14:17:58.667177", + "v": 100.4464 + }, + { + "t": "2026-07-10T15:17:58.667177", + "v": 100.2613 + }, + { + "t": "2026-07-10T16:17:58.667177", + "v": 100.4252 + }, + { + "t": "2026-07-10T17:17:58.667177", + "v": 100.164 + }, + { + "t": "2026-07-10T18:17:58.667177", + "v": 100.2656 + }, + { + "t": "2026-07-10T19:17:58.667177", + "v": 100.1546 + }, + { + "t": "2026-07-10T20:17:58.667177", + "v": 100.0495 + }, + { + "t": "2026-07-10T21:17:58.667177", + "v": 100.2254 + }, + { + "t": "2026-07-10T22:17:58.667177", + "v": 99.8909 + }, + { + "t": "2026-07-10T23:17:58.667177", + "v": 100.0539 + }, + { + "t": "2026-07-11T00:17:58.667177", + "v": 100.2298 + }, + { + "t": "2026-07-11T01:17:58.667177", + "v": 100.5371 + }, + { + "t": "2026-07-11T02:17:58.667177", + "v": 100.2898 + }, + { + "t": "2026-07-11T03:17:58.667177", + "v": 100.0563 + }, + { + "t": "2026-07-11T04:17:58.667177", + "v": 99.7966 + }, + { + "t": "2026-07-11T05:17:58.667177", + "v": 99.6636 + }, + { + "t": "2026-07-11T06:17:58.667177", + "v": 99.4947 + }, + { + "t": "2026-07-11T07:17:58.667177", + "v": 99.517 + }, + { + "t": "2026-07-11T08:17:58.667177", + "v": 99.7422 + }, + { + "t": "2026-07-11T09:17:58.667177", + "v": 99.6556 + }, + { + "t": "2026-07-11T10:17:58.667177", + "v": 99.7027 + }, + { + "t": "2026-07-11T11:17:58.667177", + "v": 99.7515 + }, + { + "t": "2026-07-11T12:17:58.667177", + "v": 99.5954 + }, + { + "t": "2026-07-11T13:17:58.667177", + "v": 99.5745 + }, + { + "t": "2026-07-11T14:17:58.667177", + "v": 99.5515 + }, + { + "t": "2026-07-11T15:17:58.667177", + "v": 99.4323 + }, + { + "t": "2026-07-11T16:17:58.667177", + "v": 99.7961 + }, + { + "t": "2026-07-11T17:17:58.667177", + "v": 99.5817 + }, + { + "t": "2026-07-11T18:17:58.667177", + "v": 99.6717 + }, + { + "t": "2026-07-11T19:17:58.667177", + "v": 99.2553 + }, + { + "t": "2026-07-11T20:17:58.667177", + "v": 98.8845 + }, + { + "t": "2026-07-11T21:17:58.667177", + "v": 98.8661 + }, + { + "t": "2026-07-11T22:17:58.667177", + "v": 98.7225 + }, + { + "t": "2026-07-11T23:17:58.667177", + "v": 98.7403 + }, + { + "t": "2026-07-12T00:17:58.667177", + "v": 98.7948 + }, + { + "t": "2026-07-12T01:17:58.667177", + "v": 99.2185 + }, + { + "t": "2026-07-12T02:17:58.667177", + "v": 98.9463 + }, + { + "t": "2026-07-12T03:17:58.667177", + "v": 99.1505 + }, + { + "t": "2026-07-12T04:17:58.667177", + "v": 99.1618 + }, + { + "t": "2026-07-12T05:17:58.667177", + "v": 99.1965 + }, + { + "t": "2026-07-12T06:17:58.667177", + "v": 99.6416 + }, + { + "t": "2026-07-12T07:17:58.667177", + "v": 99.3478 + }, + { + "t": "2026-07-12T08:17:58.667177", + "v": 99.5315 + }, + { + "t": "2026-07-12T09:17:58.667177", + "v": 99.3271 + }, + { + "t": "2026-07-12T10:17:58.667177", + "v": 99.0208 + }, + { + "t": "2026-07-12T11:17:58.667177", + "v": 99.0632 + }, + { + "t": "2026-07-12T12:17:58.667177", + "v": 99.1167 + }, + { + "t": "2026-07-12T13:17:58.667177", + "v": 98.8556 + }, + { + "t": "2026-07-12T14:17:58.667177", + "v": 99.0288 + }, + { + "t": "2026-07-12T15:17:58.667177", + "v": 99.3013 + }, + { + "t": "2026-07-12T16:17:58.667177", + "v": 99.1332 + }, + { + "t": "2026-07-12T17:17:58.667177", + "v": 99.0369 + }, + { + "t": "2026-07-12T18:17:58.667177", + "v": 98.9218 + }, + { + "t": "2026-07-12T19:17:58.667177", + "v": 98.9814 + }, + { + "t": "2026-07-12T20:17:58.667177", + "v": 99.173 + }, + { + "t": "2026-07-12T21:17:58.667177", + "v": 99.3493 + }, + { + "t": "2026-07-12T22:17:58.667177", + "v": 99.328 + }, + { + "t": "2026-07-12T23:17:58.667177", + "v": 99.6537 + }, + { + "t": "2026-07-13T00:17:58.667177", + "v": 99.9148 + }, + { + "t": "2026-07-13T01:17:58.667177", + "v": 100.0587 + }, + { + "t": "2026-07-13T02:17:58.667177", + "v": 100.1917 + }, + { + "t": "2026-07-13T03:17:58.667177", + "v": 99.9766 + }, + { + "t": "2026-07-13T04:17:58.667177", + "v": 100.0871 + }, + { + "t": "2026-07-13T05:17:58.667177", + "v": 99.8229 + }, + { + "t": "2026-07-13T06:17:58.667177", + "v": 99.8501 + }, + { + "t": "2026-07-13T07:17:58.667177", + "v": 99.8449 + }, + { + "t": "2026-07-13T08:17:58.667177", + "v": 100.2228 + }, + { + "t": "2026-07-13T09:17:58.667177", + "v": 100.3855 + }, + { + "t": "2026-07-13T10:17:58.667177", + "v": 100.3334 + }, + { + "t": "2026-07-13T11:17:58.667177", + "v": 100.4356 + }, + { + "t": "2026-07-13T12:17:58.667177", + "v": 100.7223 + }, + { + "t": "2026-07-13T13:17:58.667177", + "v": 100.7037 + }, + { + "t": "2026-07-13T14:17:58.667177", + "v": 100.5823 + }, + { + "t": "2026-07-13T15:17:58.667177", + "v": 100.2127 + }, + { + "t": "2026-07-13T16:17:58.667177", + "v": 100.2774 + }, + { + "t": "2026-07-13T17:17:58.667177", + "v": 100.4411 + }, + { + "t": "2026-07-13T18:17:58.667177", + "v": 100.6566 + }, + { + "t": "2026-07-13T19:17:58.667177", + "v": 100.5904 + }, + { + "t": "2026-07-13T20:17:58.667177", + "v": 100.7721 + }, + { + "t": "2026-07-13T21:17:58.667177", + "v": 101.0376 + }, + { + "t": "2026-07-13T22:17:58.667177", + "v": 100.9913 + }, + { + "t": "2026-07-13T23:17:58.667177", + "v": 101.0949 + }, + { + "t": "2026-07-14T00:17:58.667177", + "v": 101.2974 + }, + { + "t": "2026-07-14T01:17:58.667177", + "v": 101.1722 + }, + { + "t": "2026-07-14T02:17:58.667177", + "v": 101.1341 + }, + { + "t": "2026-07-14T03:17:58.667177", + "v": 101.2032 + }, + { + "t": "2026-07-14T04:17:58.667177", + "v": 101.1973 + }, + { + "t": "2026-07-14T05:17:58.667177", + "v": 101.1259 + }, + { + "t": "2026-07-14T06:17:58.667177", + "v": 101.421 + }, + { + "t": "2026-07-14T07:17:58.667177", + "v": 101.5316 + }, + { + "t": "2026-07-14T08:17:58.667177", + "v": 101.1655 + }, + { + "t": "2026-07-14T09:17:58.667177", + "v": 101.4234 + }, + { + "t": "2026-07-14T10:17:58.667177", + "v": 101.0348 + }, + { + "t": "2026-07-14T11:17:58.667177", + "v": 101.1116 + }, + { + "t": "2026-07-14T12:17:58.667177", + "v": 101.1105 + }, + { + "t": "2026-07-14T13:17:58.667177", + "v": 101.0435 + }, + { + "t": "2026-07-14T14:17:58.667177", + "v": 101.1343 + }, + { + "t": "2026-07-14T15:17:58.667177", + "v": 101.3837 + }, + { + "t": "2026-07-14T16:17:58.667177", + "v": 101.9242 + }, + { + "t": "2026-07-14T17:17:58.667177", + "v": 101.7271 + }, + { + "t": "2026-07-14T18:17:58.667177", + "v": 101.6257 + }, + { + "t": "2026-07-14T19:17:58.667177", + "v": 101.5257 + }, + { + "t": "2026-07-14T20:17:58.667177", + "v": 101.6044 + }, + { + "t": "2026-07-14T21:17:58.667177", + "v": 101.6842 + }, + { + "t": "2026-07-14T22:17:58.667177", + "v": 101.7355 + }, + { + "t": "2026-07-14T23:17:58.667177", + "v": 102.1108 + }, + { + "t": "2026-07-15T00:17:58.667177", + "v": 102.4572 + }, + { + "t": "2026-07-15T01:17:58.667177", + "v": 102.4317 + }, + { + "t": "2026-07-15T02:17:58.667177", + "v": 102.7338 + }, + { + "t": "2026-07-15T03:17:58.667177", + "v": 102.5921 + }, + { + "t": "2026-07-15T04:17:58.667177", + "v": 102.6747 + }, + { + "t": "2026-07-15T05:17:58.667177", + "v": 102.9488 + }, + { + "t": "2026-07-15T06:17:58.667177", + "v": 103.0059 + }, + { + "t": "2026-07-15T07:17:58.667177", + "v": 102.7458 + }, + { + "t": "2026-07-15T08:17:58.667177", + "v": 102.4932 + }, + { + "t": "2026-07-15T09:17:58.667177", + "v": 102.5785 + }, + { + "t": "2026-07-15T10:17:58.667177", + "v": 102.6836 + }, + { + "t": "2026-07-15T11:17:58.667177", + "v": 102.7078 + }, + { + "t": "2026-07-15T12:17:58.667177", + "v": 102.7443 + }, + { + "t": "2026-07-15T13:17:58.667177", + "v": 102.582 + }, + { + "t": "2026-07-15T14:17:58.667177", + "v": 102.497 + }, + { + "t": "2026-07-15T15:17:58.667177", + "v": 102.4345 + }, + { + "t": "2026-07-15T16:17:58.667177", + "v": 102.7668 + }, + { + "t": "2026-07-15T17:17:58.667177", + "v": 102.5144 + }, + { + "t": "2026-07-15T18:17:58.667177", + "v": 102.3877 + }, + { + "t": "2026-07-15T19:17:58.667177", + "v": 102.028 + }, + { + "t": "2026-07-15T20:17:58.667177", + "v": 102.1608 + }, + { + "t": "2026-07-15T21:17:58.667177", + "v": 102.3756 + }, + { + "t": "2026-07-15T22:17:58.667177", + "v": 102.4002 + }, + { + "t": "2026-07-15T23:17:58.667177", + "v": 102.3771 + }, + { + "t": "2026-07-16T00:17:58.667177", + "v": 102.4687 + }, + { + "t": "2026-07-16T01:17:58.667177", + "v": 102.4535 + }, + { + "t": "2026-07-16T02:17:58.667177", + "v": 102.647 + }, + { + "t": "2026-07-16T03:17:58.667177", + "v": 102.3303 + }, + { + "t": "2026-07-16T04:17:58.667177", + "v": 102.7592 + }, + { + "t": "2026-07-16T05:17:58.667177", + "v": 102.5697 + }, + { + "t": "2026-07-16T06:17:58.667177", + "v": 102.8067 + }, + { + "t": "2026-07-16T07:17:58.667177", + "v": 103.0943 + }, + { + "t": "2026-07-16T08:17:58.667177", + "v": 103.0656 + }, + { + "t": "2026-07-16T09:17:58.667177", + "v": 103.1091 + }, + { + "t": "2026-07-16T10:17:58.667177", + "v": 103.4508 + }, + { + "t": "2026-07-16T11:17:58.667177", + "v": 103.3881 + }, + { + "t": "2026-07-16T12:17:58.667177", + "v": 103.2564 + }, + { + "t": "2026-07-16T13:17:58.667177", + "v": 103.0646 + }, + { + "t": "2026-07-16T14:17:58.667177", + "v": 103.4004 + }, + { + "t": "2026-07-16T15:17:58.667177", + "v": 103.4485 + }, + { + "t": "2026-07-16T16:17:58.667177", + "v": 103.5346 + }, + { + "t": "2026-07-16T17:17:58.667177", + "v": 103.3306 + }, + { + "t": "2026-07-16T18:17:58.667177", + "v": 103.269 + }, + { + "t": "2026-07-16T19:17:58.667177", + "v": 103.1466 + }, + { + "t": "2026-07-16T20:17:58.667177", + "v": 103.4317 + }, + { + "t": "2026-07-16T21:17:58.667177", + "v": 103.3542 + }, + { + "t": "2026-07-16T22:17:58.667177", + "v": 103.4143 + }, + { + "t": "2026-07-16T23:17:58.667177", + "v": 103.3306 + }, + { + "t": "2026-07-17T00:17:58.667177", + "v": 103.411 + }, + { + "t": "2026-07-17T01:17:58.667177", + "v": 103.5672 + }, + { + "t": "2026-07-17T02:17:58.667177", + "v": 104.1122 + }, + { + "t": "2026-07-17T03:17:58.667177", + "v": 103.8739 + }, + { + "t": "2026-07-17T04:17:58.667177", + "v": 104.2478 + }, + { + "t": "2026-07-17T05:17:58.667177", + "v": 104.0057 + }, + { + "t": "2026-07-17T06:17:58.667177", + "v": 104.2688 + }, + { + "t": "2026-07-17T07:17:58.667177", + "v": 104.4408 + }, + { + "t": "2026-07-17T08:17:58.667177", + "v": 104.781 + }, + { + "t": "2026-07-17T09:17:58.667177", + "v": 104.9643 + }, + { + "t": "2026-07-17T10:17:58.667177", + "v": 105.1806 + }, + { + "t": "2026-07-17T11:17:58.667177", + "v": 105.331 + }, + { + "t": "2026-07-17T12:17:58.667177", + "v": 105.6121 + }, + { + "t": "2026-07-17T13:17:58.667177", + "v": 105.6122 + }, + { + "t": "2026-07-17T14:17:58.667177", + "v": 105.4581 + }, + { + "t": "2026-07-17T15:17:58.667177", + "v": 105.2695 + }, + { + "t": "2026-07-17T16:17:58.667177", + "v": 105.0333 + }, + { + "t": "2026-07-17T17:17:58.667177", + "v": 104.8725 + }, + { + "t": "2026-07-17T18:17:58.667177", + "v": 104.6395 + }, + { + "t": "2026-07-17T19:17:58.667177", + "v": 104.7563 + }, + { + "t": "2026-07-17T20:17:58.667177", + "v": 105.1563 + }, + { + "t": "2026-07-17T21:17:58.667177", + "v": 104.967 + }, + { + "t": "2026-07-17T22:17:58.667177", + "v": 104.5995 + }, + { + "t": "2026-07-17T23:17:58.667177", + "v": 104.8467 + }, + { + "t": "2026-07-18T00:17:58.667177", + "v": 104.7751 + }, + { + "t": "2026-07-18T01:17:58.667177", + "v": 105.0168 + }, + { + "t": "2026-07-18T02:17:58.667177", + "v": 104.2506 + }, + { + "t": "2026-07-18T03:17:58.667177", + "v": 104.0842 + }, + { + "t": "2026-07-18T04:17:58.667177", + "v": 104.263 + }, + { + "t": "2026-07-18T05:17:58.667177", + "v": 104.1024 + }, + { + "t": "2026-07-18T06:17:58.667177", + "v": 104.3748 + }, + { + "t": "2026-07-18T07:17:58.667177", + "v": 104.4575 + }, + { + "t": "2026-07-18T08:17:58.667177", + "v": 104.3924 + }, + { + "t": "2026-07-18T09:17:58.667177", + "v": 104.1389 + }, + { + "t": "2026-07-18T10:17:58.667177", + "v": 104.2038 + }, + { + "t": "2026-07-18T11:17:58.667177", + "v": 104.3763 + }, + { + "t": "2026-07-18T12:17:58.667177", + "v": 104.4032 + }, + { + "t": "2026-07-18T13:17:58.667177", + "v": 104.5463 + }, + { + "t": "2026-07-18T14:17:58.667177", + "v": 104.1783 + }, + { + "t": "2026-07-18T15:17:58.667177", + "v": 104.3992 + }, + { + "t": "2026-07-18T16:17:58.667177", + "v": 104.4421 + }, + { + "t": "2026-07-18T17:17:58.667177", + "v": 104.7469 + }, + { + "t": "2026-07-18T18:17:58.667177", + "v": 104.5301 + }, + { + "t": "2026-07-18T19:17:58.667177", + "v": 104.7061 + }, + { + "t": "2026-07-18T20:17:58.667177", + "v": 104.7146 + }, + { + "t": "2026-07-18T21:17:58.667177", + "v": 104.5868 + }, + { + "t": "2026-07-18T22:17:58.667177", + "v": 104.6383 + }, + { + "t": "2026-07-18T23:17:58.667177", + "v": 104.8671 + }, + { + "t": "2026-07-19T00:17:58.667177", + "v": 105.2184 + }, + { + "t": "2026-07-19T01:17:58.667177", + "v": 105.0796 + }, + { + "t": "2026-07-19T02:17:58.667177", + "v": 105.0896 + }, + { + "t": "2026-07-19T03:17:58.667177", + "v": 105.3705 + }, + { + "t": "2026-07-19T04:17:58.667177", + "v": 105.5617 + }, + { + "t": "2026-07-19T05:17:58.667177", + "v": 105.5009 + }, + { + "t": "2026-07-19T06:17:58.667177", + "v": 105.0969 + }, + { + "t": "2026-07-19T07:17:58.667177", + "v": 105.0714 + }, + { + "t": "2026-07-19T08:17:58.667177", + "v": 105.3141 + }, + { + "t": "2026-07-19T09:17:58.667177", + "v": 105.4933 + }, + { + "t": "2026-07-19T10:17:58.667177", + "v": 105.763 + }, + { + "t": "2026-07-19T11:17:58.667177", + "v": 105.7782 + }, + { + "t": "2026-07-19T12:17:58.667177", + "v": 105.6904 + }, + { + "t": "2026-07-19T13:17:58.667177", + "v": 105.5233 + }, + { + "t": "2026-07-19T14:17:58.667177", + "v": 104.9887 + }, + { + "t": "2026-07-19T15:17:58.667177", + "v": 104.8577 + }, + { + "t": "2026-07-19T16:17:58.667177", + "v": 105.0071 + }, + { + "t": "2026-07-19T17:17:58.667177", + "v": 105.1789 + }, + { + "t": "2026-07-19T18:17:58.667177", + "v": 105.1991 + }, + { + "t": "2026-07-19T19:17:58.667177", + "v": 105.3418 + }, + { + "t": "2026-07-19T20:17:58.667177", + "v": 105.2072 + }, + { + "t": "2026-07-19T21:17:58.667177", + "v": 105.2995 + }, + { + "t": "2026-07-19T22:17:58.667177", + "v": 105.4886 + }, + { + "t": "2026-07-19T23:17:58.667177", + "v": 105.144 + }, + { + "t": "2026-07-20T00:17:58.667177", + "v": 105.371 + }, + { + "t": "2026-07-20T01:17:58.667177", + "v": 104.9783 + }, + { + "t": "2026-07-20T02:17:58.667177", + "v": 105.0425 + }, + { + "t": "2026-07-20T03:17:58.667177", + "v": 105.5846 + }, + { + "t": "2026-07-20T04:17:58.667177", + "v": 105.6059 + }, + { + "t": "2026-07-20T05:17:58.667177", + "v": 105.7404 + }, + { + "t": "2026-07-20T06:17:58.667177", + "v": 105.5571 + }, + { + "t": "2026-07-20T07:17:58.667177", + "v": 105.2278 + }, + { + "t": "2026-07-20T08:17:58.667177", + "v": 105.4139 + }, + { + "t": "2026-07-20T09:17:58.667177", + "v": 105.4391 + }, + { + "t": "2026-07-20T10:17:58.667177", + "v": 105.3228 + }, + { + "t": "2026-07-20T11:17:58.667177", + "v": 104.8524 + }, + { + "t": "2026-07-20T12:17:58.667177", + "v": 104.7947 + }, + { + "t": "2026-07-20T13:17:58.667177", + "v": 105.0962 + }, + { + "t": "2026-07-20T14:17:58.667177", + "v": 105.4025 + }, + { + "t": "2026-07-20T15:17:58.667177", + "v": 105.6958 + }, + { + "t": "2026-07-20T16:17:58.667177", + "v": 105.6104 + }, + { + "t": "2026-07-20T17:17:58.667177", + "v": 105.6003 + }, + { + "t": "2026-07-20T18:17:58.667177", + "v": 105.827 + }, + { + "t": "2026-07-20T19:17:58.667177", + "v": 105.6248 + }, + { + "t": "2026-07-20T20:17:58.667177", + "v": 105.3527 + }, + { + "t": "2026-07-20T21:17:58.667177", + "v": 105.4638 + }, + { + "t": "2026-07-20T22:17:58.667177", + "v": 105.2019 + }, + { + "t": "2026-07-20T23:17:58.667177", + "v": 105.7365 + }, + { + "t": "2026-07-21T00:17:58.667177", + "v": 105.7414 + }, + { + "t": "2026-07-21T01:17:58.667177", + "v": 105.4236 + }, + { + "t": "2026-07-21T02:17:58.667177", + "v": 105.4568 + }, + { + "t": "2026-07-21T03:17:58.667177", + "v": 105.2433 + }, + { + "t": "2026-07-21T04:17:58.667177", + "v": 105.6028 + }, + { + "t": "2026-07-21T05:17:58.667177", + "v": 105.9823 + }, + { + "t": "2026-07-21T06:17:58.667177", + "v": 105.9958 + }, + { + "t": "2026-07-21T07:17:58.667177", + "v": 105.9752 + }, + { + "t": "2026-07-21T08:17:58.667177", + "v": 105.7116 + }, + { + "t": "2026-07-21T09:17:58.667177", + "v": 106.229 + }, + { + "t": "2026-07-21T10:17:58.667177", + "v": 106.0415 + }, + { + "t": "2026-07-21T11:17:58.667177", + "v": 106.212 + }, + { + "t": "2026-07-21T12:17:58.667177", + "v": 106.426 + }, + { + "t": "2026-07-21T13:17:58.667177", + "v": 106.1262 + }, + { + "t": "2026-07-21T14:17:58.667177", + "v": 106.3886 + }, + { + "t": "2026-07-21T15:17:58.667177", + "v": 106.0207 + }, + { + "t": "2026-07-21T16:17:58.667177", + "v": 106.0037 + }, + { + "t": "2026-07-21T17:17:58.667177", + "v": 105.8674 + }, + { + "t": "2026-07-21T18:17:58.667177", + "v": 105.3842 + }, + { + "t": "2026-07-21T19:17:58.667177", + "v": 105.503 + }, + { + "t": "2026-07-21T20:17:58.667177", + "v": 105.4704 + }, + { + "t": "2026-07-21T21:17:58.667177", + "v": 105.4395 + }, + { + "t": "2026-07-21T22:17:58.667177", + "v": 105.1114 + }, + { + "t": "2026-07-21T23:17:58.667177", + "v": 105.0481 + }, + { + "t": "2026-07-22T00:17:58.667177", + "v": 105.081 + }, + { + "t": "2026-07-22T01:17:58.667177", + "v": 105.2643 + }, + { + "t": "2026-07-22T02:17:58.667177", + "v": 105.4766 + }, + { + "t": "2026-07-22T03:17:58.667177", + "v": 105.2959 + }, + { + "t": "2026-07-22T04:17:58.667177", + "v": 105.3085 + }, + { + "t": "2026-07-22T05:17:58.667177", + "v": 105.3039 + }, + { + "t": "2026-07-22T06:17:58.667177", + "v": 105.6134 + }, + { + "t": "2026-07-22T07:17:58.667177", + "v": 105.4591 + }, + { + "t": "2026-07-22T08:17:58.667177", + "v": 105.3061 + }, + { + "t": "2026-07-22T09:17:58.667177", + "v": 105.355 + }, + { + "t": "2026-07-22T10:17:58.667177", + "v": 104.8098 + }, + { + "t": "2026-07-22T11:17:58.667177", + "v": 104.8801 + }, + { + "t": "2026-07-22T12:17:58.667177", + "v": 105.2128 + }, + { + "t": "2026-07-22T13:17:58.667177", + "v": 105.094 + }, + { + "t": "2026-07-22T14:17:58.667177", + "v": 105.0151 + }, + { + "t": "2026-07-22T15:17:58.667177", + "v": 104.9274 + }, + { + "t": "2026-07-22T16:17:58.667177", + "v": 104.899 + }, + { + "t": "2026-07-22T17:17:58.667177", + "v": 105.2867 + }, + { + "t": "2026-07-22T18:17:58.667177", + "v": 105.5151 + }, + { + "t": "2026-07-22T19:17:58.667177", + "v": 105.6968 + }, + { + "t": "2026-07-22T20:17:58.667177", + "v": 105.4053 + }, + { + "t": "2026-07-22T21:17:58.667177", + "v": 106.0152 + }, + { + "t": "2026-07-22T22:17:58.667177", + "v": 106.6048 + }, + { + "t": "2026-07-22T23:17:58.667177", + "v": 106.5515 + }, + { + "t": "2026-07-23T00:17:58.667177", + "v": 106.3129 + }, + { + "t": "2026-07-23T01:17:58.667177", + "v": 106.4346 + }, + { + "t": "2026-07-23T02:17:58.667177", + "v": 106.4502 + }, + { + "t": "2026-07-23T03:17:58.667177", + "v": 106.543 + }, + { + "t": "2026-07-23T04:17:58.667177", + "v": 106.4925 + }, + { + "t": "2026-07-23T05:17:58.667177", + "v": 106.3808 + }, + { + "t": "2026-07-23T06:17:58.667177", + "v": 106.3831 + }, + { + "t": "2026-07-23T07:17:58.667177", + "v": 106.1469 + }, + { + "t": "2026-07-23T08:17:58.667177", + "v": 106.3982 + }, + { + "t": "2026-07-23T09:17:58.667177", + "v": 106.6151 + }, + { + "t": "2026-07-23T10:17:58.667177", + "v": 106.473 + }, + { + "t": "2026-07-23T11:17:58.667177", + "v": 106.6861 + }, + { + "t": "2026-07-23T12:17:58.667177", + "v": 106.9015 + }, + { + "t": "2026-07-23T13:17:58.667177", + "v": 106.8307 + }, + { + "t": "2026-07-23T14:17:58.667177", + "v": 106.8453 + }, + { + "t": "2026-07-23T15:17:58.667177", + "v": 106.9171 + }, + { + "t": "2026-07-23T16:17:58.667177", + "v": 106.6772 + }, + { + "t": "2026-07-23T17:17:58.667177", + "v": 106.7884 + }, + { + "t": "2026-07-23T18:17:58.667177", + "v": 106.77 + }, + { + "t": "2026-07-23T19:17:58.667177", + "v": 106.9212 + }, + { + "t": "2026-07-23T20:17:58.667177", + "v": 106.7642 + }, + { + "t": "2026-07-23T21:17:58.667177", + "v": 106.5784 + }, + { + "t": "2026-07-23T22:17:58.667177", + "v": 106.4821 + }, + { + "t": "2026-07-23T23:17:58.667177", + "v": 106.1979 + }, + { + "t": "2026-07-24T00:17:58.667177", + "v": 106.5328 + }, + { + "t": "2026-07-24T01:17:58.667177", + "v": 106.0496 + }, + { + "t": "2026-07-24T02:17:58.667177", + "v": 106.1987 + }, + { + "t": "2026-07-24T03:17:58.667177", + "v": 106.4483 + }, + { + "t": "2026-07-24T04:17:58.667177", + "v": 106.4413 + }, + { + "t": "2026-07-24T05:17:58.667177", + "v": 106.4582 + }, + { + "t": "2026-07-24T06:17:58.667177", + "v": 106.2733 + }, + { + "t": "2026-07-24T07:17:58.667177", + "v": 106.3796 + }, + { + "t": "2026-07-24T08:17:58.667177", + "v": 106.5972 + }, + { + "t": "2026-07-24T09:17:58.667177", + "v": 106.5709 + }, + { + "t": "2026-07-24T10:17:58.667177", + "v": 106.7232 + }, + { + "t": "2026-07-24T11:17:58.667177", + "v": 106.7399 + }, + { + "t": "2026-07-24T12:17:58.667177", + "v": 106.7039 + }, + { + "t": "2026-07-24T13:17:58.667177", + "v": 106.5752 + }, + { + "t": "2026-07-24T14:17:58.667177", + "v": 106.5753 + }, + { + "t": "2026-07-24T15:17:58.667177", + "v": 106.7827 + }, + { + "t": "2026-07-24T16:17:58.667177", + "v": 106.3232 + }, + { + "t": "2026-07-24T17:17:58.667177", + "v": 106.5267 + }, + { + "t": "2026-07-24T18:17:58.667177", + "v": 106.7861 + }, + { + "t": "2026-07-24T19:17:58.667177", + "v": 107.274 + }, + { + "t": "2026-07-24T20:17:58.667177", + "v": 107.204 + }, + { + "t": "2026-07-24T21:17:58.667177", + "v": 106.9107 + }, + { + "t": "2026-07-24T22:17:58.667177", + "v": 106.5515 + }, + { + "t": "2026-07-24T23:17:58.667177", + "v": 106.5603 + }, + { + "t": "2026-07-25T00:17:58.667177", + "v": 106.3019 + }, + { + "t": "2026-07-25T01:17:58.667177", + "v": 106.4054 + }, + { + "t": "2026-07-25T02:17:58.667177", + "v": 106.4667 + }, + { + "t": "2026-07-25T03:17:58.667177", + "v": 106.6654 + }, + { + "t": "2026-07-25T04:17:58.667177", + "v": 106.538 + }, + { + "t": "2026-07-25T05:17:58.667177", + "v": 106.1688 + }, + { + "t": "2026-07-25T06:17:58.667177", + "v": 106.2697 + }, + { + "t": "2026-07-25T07:17:58.667177", + "v": 106.2582 + }, + { + "t": "2026-07-25T08:17:58.667177", + "v": 106.0836 + }, + { + "t": "2026-07-25T09:17:58.667177", + "v": 105.7749 + }, + { + "t": "2026-07-25T10:17:58.667177", + "v": 107.2967 + }, + { + "t": "2026-07-25T11:17:58.667177", + "v": 107.4816 + }, + { + "t": "2026-07-25T12:17:58.667177", + "v": 107.5417 + }, + { + "t": "2026-07-25T13:17:58.667177", + "v": 107.5351 + }, + { + "t": "2026-07-25T14:17:58.667177", + "v": 107.661 + }, + { + "t": "2026-07-25T15:17:58.667177", + "v": 107.665 + }, + { + "t": "2026-07-25T16:17:58.667177", + "v": 107.9815 + }, + { + "t": "2026-07-25T17:17:58.667177", + "v": 107.6022 + }, + { + "t": "2026-07-25T18:17:58.667177", + "v": 107.57 + }, + { + "t": "2026-07-25T19:17:58.667177", + "v": 107.9042 + }, + { + "t": "2026-07-25T20:17:58.667177", + "v": 108.435 + }, + { + "t": "2026-07-25T21:17:58.667177", + "v": 108.6778 + }, + { + "t": "2026-07-25T22:17:58.667177", + "v": 108.4866 + }, + { + "t": "2026-07-25T23:17:58.667177", + "v": 107.9969 + }, + { + "t": "2026-07-26T00:17:58.667177", + "v": 108.395 + }, + { + "t": "2026-07-26T01:17:58.667177", + "v": 108.4669 + }, + { + "t": "2026-07-26T02:17:58.667177", + "v": 108.6873 + }, + { + "t": "2026-07-26T03:17:58.667177", + "v": 108.9334 + }, + { + "t": "2026-07-26T04:17:58.667177", + "v": 109.0321 + }, + { + "t": "2026-07-26T05:17:58.667177", + "v": 109.1165 + }, + { + "t": "2026-07-26T06:17:58.667177", + "v": 108.7986 + }, + { + "t": "2026-07-26T07:17:58.667177", + "v": 108.8932 + }, + { + "t": "2026-07-26T08:17:58.667177", + "v": 109.2178 + }, + { + "t": "2026-07-26T09:17:58.667177", + "v": 109.2207 + }, + { + "t": "2026-07-26T10:17:58.667177", + "v": 108.9527 + }, + { + "t": "2026-07-26T11:17:58.667177", + "v": 108.443 + }, + { + "t": "2026-07-26T12:17:58.667177", + "v": 108.3633 + }, + { + "t": "2026-07-26T13:17:58.667177", + "v": 108.3606 + }, + { + "t": "2026-07-26T14:17:58.667177", + "v": 108.6931 + }, + { + "t": "2026-07-26T15:17:58.667177", + "v": 108.8108 + }, + { + "t": "2026-07-26T16:17:58.667177", + "v": 108.7753 + }, + { + "t": "2026-07-26T17:17:58.667177", + "v": 108.7716 + }, + { + "t": "2026-07-26T18:17:58.667177", + "v": 108.299 + }, + { + "t": "2026-07-26T19:17:58.667177", + "v": 108.1452 + }, + { + "t": "2026-07-26T20:17:58.667177", + "v": 108.2992 + }, + { + "t": "2026-07-26T21:17:58.667177", + "v": 108.518 + }, + { + "t": "2026-07-26T22:17:58.667177", + "v": 108.8212 + }, + { + "t": "2026-07-26T23:17:58.667177", + "v": 109.1623 + }, + { + "t": "2026-07-27T00:17:58.667177", + "v": 109.6663 + }, + { + "t": "2026-07-27T01:17:58.667177", + "v": 109.6296 + }, + { + "t": "2026-07-27T02:17:58.667177", + "v": 109.4788 + }, + { + "t": "2026-07-27T03:17:58.667177", + "v": 109.0268 + }, + { + "t": "2026-07-27T04:17:58.667177", + "v": 108.751 + }, + { + "t": "2026-07-27T05:17:58.667177", + "v": 108.7499 + }, + { + "t": "2026-07-27T06:17:58.667177", + "v": 108.7965 + }, + { + "t": "2026-07-27T07:17:58.667177", + "v": 108.8676 + }, + { + "t": "2026-07-27T08:17:58.667177", + "v": 108.8286 + }, + { + "t": "2026-07-27T09:17:58.667177", + "v": 108.7932 + }, + { + "t": "2026-07-27T10:17:58.667177", + "v": 108.9274 + }, + { + "t": "2026-07-27T11:17:58.667177", + "v": 109.3236 + }, + { + "t": "2026-07-27T12:17:58.667177", + "v": 109.0985 + }, + { + "t": "2026-07-27T13:17:58.667177", + "v": 108.8017 + }, + { + "t": "2026-07-27T14:17:58.667177", + "v": 109.0149 + }, + { + "t": "2026-07-27T15:17:58.667177", + "v": 109.2451 + }, + { + "t": "2026-07-27T16:17:58.667177", + "v": 109.0988 + }, + { + "t": "2026-07-27T17:17:58.667177", + "v": 108.7605 + }, + { + "t": "2026-07-27T18:17:58.667177", + "v": 108.4577 + }, + { + "t": "2026-07-27T19:17:58.667177", + "v": 108.3076 + }, + { + "t": "2026-07-27T20:17:58.667177", + "v": 108.6446 + }, + { + "t": "2026-07-27T21:17:58.667177", + "v": 108.5702 + }, + { + "t": "2026-07-27T22:17:58.667177", + "v": 108.4875 + }, + { + "t": "2026-07-27T23:17:58.667177", + "v": 108.1609 + }, + { + "t": "2026-07-28T00:17:58.667177", + "v": 108.4605 + }, + { + "t": "2026-07-28T01:17:58.667177", + "v": 108.08 + }, + { + "t": "2026-07-28T02:17:58.667177", + "v": 107.9348 + }, + { + "t": "2026-07-28T03:17:58.667177", + "v": 107.938 + }, + { + "t": "2026-07-28T04:17:58.667177", + "v": 107.7403 + }, + { + "t": "2026-07-28T05:17:58.667177", + "v": 107.7465 + }, + { + "t": "2026-07-28T06:17:58.667177", + "v": 107.9467 + }, + { + "t": "2026-07-28T07:17:58.667177", + "v": 108.012 + }, + { + "t": "2026-07-28T08:17:58.667177", + "v": 107.5205 + }, + { + "t": "2026-07-28T09:17:58.667177", + "v": 107.2661 + }, + { + "t": "2026-07-28T10:17:58.667177", + "v": 106.9641 + }, + { + "t": "2026-07-28T11:17:58.667177", + "v": 107.0743 + }, + { + "t": "2026-07-28T12:17:58.667177", + "v": 107.3706 + }, + { + "t": "2026-07-28T13:17:58.667177", + "v": 106.9605 + }, + { + "t": "2026-07-28T14:17:58.667177", + "v": 107.1281 + }, + { + "t": "2026-07-28T15:17:58.667177", + "v": 107.3459 + }, + { + "t": "2026-07-28T16:17:58.667177", + "v": 107.4493 + }, + { + "t": "2026-07-28T17:17:58.667177", + "v": 107.0387 + }, + { + "t": "2026-07-28T18:17:58.667177", + "v": 107.0959 + }, + { + "t": "2026-07-28T19:17:58.667177", + "v": 106.9866 + }, + { + "t": "2026-07-28T20:17:58.667177", + "v": 107.3691 + }, + { + "t": "2026-07-28T21:17:58.667177", + "v": 107.4673 + }, + { + "t": "2026-07-28T22:17:58.667177", + "v": 107.6582 + }, + { + "t": "2026-07-28T23:17:58.667177", + "v": 108.1365 + }, + { + "t": "2026-07-29T00:17:58.667177", + "v": 107.8423 + }, + { + "t": "2026-07-29T01:17:58.667177", + "v": 107.6815 + }, + { + "t": "2026-07-29T02:17:58.667177", + "v": 107.5314 + }, + { + "t": "2026-07-29T03:17:58.667177", + "v": 107.7905 + }, + { + "t": "2026-07-29T04:17:58.667177", + "v": 107.8484 + }, + { + "t": "2026-07-29T05:17:58.667177", + "v": 107.6533 + }, + { + "t": "2026-07-29T06:17:58.667177", + "v": 107.7056 + }, + { + "t": "2026-07-29T07:17:58.667177", + "v": 107.5528 + }, + { + "t": "2026-07-29T08:17:58.667177", + "v": 107.2895 + }, + { + "t": "2026-07-29T09:17:58.667177", + "v": 107.0167 + }, + { + "t": "2026-07-29T10:17:58.667177", + "v": 106.9426 + }, + { + "t": "2026-07-29T11:17:58.667177", + "v": 106.9109 + }, + { + "t": "2026-07-29T12:17:58.667177", + "v": 106.8947 + }, + { + "t": "2026-07-29T13:17:58.667177", + "v": 106.6491 + }, + { + "t": "2026-07-29T14:17:58.667177", + "v": 106.4892 + }, + { + "t": "2026-07-29T15:17:58.667177", + "v": 106.4557 + }, + { + "t": "2026-07-29T16:17:58.667177", + "v": 106.519 + }, + { + "t": "2026-07-29T17:17:58.667177", + "v": 106.9293 + }, + { + "t": "2026-07-29T18:17:58.667177", + "v": 107.008 + }, + { + "t": "2026-07-29T19:17:58.667177", + "v": 106.8898 + }, + { + "t": "2026-07-29T20:17:58.667177", + "v": 107.089 + }, + { + "t": "2026-07-29T21:17:58.667177", + "v": 106.9322 + }, + { + "t": "2026-07-29T22:17:58.667177", + "v": 106.6405 + }, + { + "t": "2026-07-29T23:17:58.667177", + "v": 106.3601 + }, + { + "t": "2026-07-30T00:17:58.667177", + "v": 106.523 + }, + { + "t": "2026-07-30T01:17:58.667177", + "v": 106.5183 + }, + { + "t": "2026-07-30T02:17:58.667177", + "v": 106.6569 + }, + { + "t": "2026-07-30T03:17:58.667177", + "v": 106.4856 + }, + { + "t": "2026-07-30T04:17:58.667177", + "v": 106.4026 + }, + { + "t": "2026-07-30T05:17:58.667177", + "v": 106.493 + }, + { + "t": "2026-07-30T06:17:58.667177", + "v": 106.2538 + }, + { + "t": "2026-07-30T07:17:58.667177", + "v": 106.2561 + }, + { + "t": "2026-07-30T08:17:58.667177", + "v": 106.2757 + }, + { + "t": "2026-07-30T09:17:58.667177", + "v": 106.4354 + }, + { + "t": "2026-07-30T10:17:58.667177", + "v": 106.2505 + }, + { + "t": "2026-07-30T11:17:58.667177", + "v": 105.755 + }, + { + "t": "2026-07-30T12:17:58.667177", + "v": 105.5663 + }, + { + "t": "2026-07-30T13:17:58.667177", + "v": 105.2644 + }, + { + "t": "2026-07-30T14:17:58.667177", + "v": 105.4999 + }, + { + "t": "2026-07-30T15:17:58.667177", + "v": 105.2958 + }, + { + "t": "2026-07-30T16:17:58.667177", + "v": 105.6022 + }, + { + "t": "2026-07-30T17:17:58.667177", + "v": 106.4605 + }, + { + "t": "2026-07-30T18:17:58.667177", + "v": 106.7436 + }, + { + "t": "2026-07-30T19:17:58.667177", + "v": 106.9998 + }, + { + "t": "2026-07-30T20:17:58.667177", + "v": 106.8578 + }, + { + "t": "2026-07-30T21:17:58.667177", + "v": 106.9907 + }, + { + "t": "2026-07-30T22:17:58.667177", + "v": 107.1827 + }, + { + "t": "2026-07-30T23:17:58.667177", + "v": 107.3542 + }, + { + "t": "2026-07-31T00:17:58.667177", + "v": 107.2058 + }, + { + "t": "2026-07-31T01:17:58.667177", + "v": 106.9594 + }, + { + "t": "2026-07-31T02:17:58.667177", + "v": 106.7074 + }, + { + "t": "2026-07-31T03:17:58.667177", + "v": 106.501 + }, + { + "t": "2026-07-31T04:17:58.667177", + "v": 106.5785 + }, + { + "t": "2026-07-31T05:17:58.667177", + "v": 107.168 + }, + { + "t": "2026-07-31T06:17:58.667177", + "v": 107.1498 + }, + { + "t": "2026-07-31T07:17:58.667177", + "v": 107.3289 + }, + { + "t": "2026-07-31T08:17:58.667177", + "v": 107.2885 + }, + { + "t": "2026-07-31T09:17:58.667177", + "v": 107.3326 + }, + { + "t": "2026-07-31T10:17:58.667177", + "v": 107.3792 + }, + { + "t": "2026-07-31T11:17:58.667177", + "v": 107.5891 + }, + { + "t": "2026-07-31T12:17:58.667177", + "v": 107.9789 + }, + { + "t": "2026-07-31T13:17:58.667177", + "v": 107.972 + }, + { + "t": "2026-07-31T14:17:58.667177", + "v": 107.8544 + }, + { + "t": "2026-07-31T15:17:58.667177", + "v": 107.6962 + }, + { + "t": "2026-07-31T16:17:58.667177", + "v": 107.7036 + }, + { + "t": "2026-07-31T17:17:58.667177", + "v": 107.68 + }, + { + "t": "2026-07-31T18:17:58.667177", + "v": 107.8096 + }, + { + "t": "2026-07-31T19:17:58.667177", + "v": 107.8366 + }, + { + "t": "2026-07-31T20:17:58.667177", + "v": 107.7499 + }, + { + "t": "2026-07-31T21:17:58.667177", + "v": 107.6804 + }, + { + "t": "2026-07-31T22:17:58.667177", + "v": 107.9903 + }, + { + "t": "2026-07-31T23:17:58.667177", + "v": 107.8174 + }, + { + "t": "2026-08-01T00:17:58.667177", + "v": 108.093 + }, + { + "t": "2026-08-01T01:17:58.667177", + "v": 108.2772 + }, + { + "t": "2026-08-01T02:17:58.667177", + "v": 108.0171 + }, + { + "t": "2026-08-01T03:17:58.667177", + "v": 107.9469 + }, + { + "t": "2026-08-01T04:17:58.667177", + "v": 107.9785 + }, + { + "t": "2026-08-01T05:17:58.667177", + "v": 108.3142 + }, + { + "t": "2026-08-01T06:17:58.667177", + "v": 108.253 + }, + { + "t": "2026-08-01T07:17:58.667177", + "v": 107.3084 + }, + { + "t": "2026-08-01T08:17:58.667177", + "v": 107.0932 + }, + { + "t": "2026-08-01T09:17:58.667177", + "v": 106.9628 + }, + { + "t": "2026-08-01T10:17:58.667177", + "v": 106.9277 + }, + { + "t": "2026-08-01T11:17:58.667177", + "v": 107.0846 + }, + { + "t": "2026-08-01T12:17:58.667177", + "v": 107.1858 + }, + { + "t": "2026-08-01T13:17:58.667177", + "v": 107.2921 + }, + { + "t": "2026-08-01T14:17:58.667177", + "v": 107.5416 + }, + { + "t": "2026-08-01T15:17:58.667177", + "v": 107.5515 + }, + { + "t": "2026-08-01T16:17:58.667177", + "v": 107.6317 + }, + { + "t": "2026-08-01T17:17:58.667177", + "v": 107.8423 + }, + { + "t": "2026-08-01T18:17:58.667177", + "v": 107.995 + }, + { + "t": "2026-08-01T19:17:58.667177", + "v": 107.566 + }, + { + "t": "2026-08-01T20:17:58.667177", + "v": 107.6066 + }, + { + "t": "2026-08-01T21:17:58.667177", + "v": 107.5593 + }, + { + "t": "2026-08-01T22:17:58.667177", + "v": 107.7743 + }, + { + "t": "2026-08-01T23:17:58.667177", + "v": 107.6417 + }, + { + "t": "2026-08-02T00:17:58.667177", + "v": 107.547 + }, + { + "t": "2026-08-02T01:17:58.667177", + "v": 107.3507 + }, + { + "t": "2026-08-02T02:17:58.667177", + "v": 107.3373 + }, + { + "t": "2026-08-02T03:17:58.667177", + "v": 107.5144 + }, + { + "t": "2026-08-02T04:17:58.667177", + "v": 107.4244 + }, + { + "t": "2026-08-02T05:17:58.667177", + "v": 107.4823 + }, + { + "t": "2026-08-02T06:17:58.667177", + "v": 107.5482 + }, + { + "t": "2026-08-02T07:17:58.667177", + "v": 107.6539 + }, + { + "t": "2026-08-02T08:17:58.667177", + "v": 107.52 + }, + { + "t": "2026-08-02T09:17:58.667177", + "v": 107.6195 + }, + { + "t": "2026-08-02T10:17:58.667177", + "v": 107.7198 + }, + { + "t": "2026-08-02T11:17:58.667177", + "v": 107.5494 + }, + { + "t": "2026-08-02T12:17:58.667177", + "v": 107.456 + }, + { + "t": "2026-08-02T13:17:58.667177", + "v": 107.2825 + }, + { + "t": "2026-08-02T14:17:58.667177", + "v": 107.2102 + }, + { + "t": "2026-08-02T15:17:58.667177", + "v": 107.1974 + }, + { + "t": "2026-08-02T16:17:58.667177", + "v": 107.3212 + }, + { + "t": "2026-08-02T17:17:58.667177", + "v": 107.5505 + }, + { + "t": "2026-08-02T18:17:58.667177", + "v": 107.6171 + }, + { + "t": "2026-08-02T19:17:58.667177", + "v": 107.393 + }, + { + "t": "2026-08-02T20:17:58.667177", + "v": 107.282 + }, + { + "t": "2026-08-02T21:17:58.667177", + "v": 107.0503 + }, + { + "t": "2026-08-02T22:17:58.667177", + "v": 106.7998 + }, + { + "t": "2026-08-02T23:17:58.667177", + "v": 107.1729 + }, + { + "t": "2026-08-03T00:17:58.667177", + "v": 107.2798 + }, + { + "t": "2026-08-03T01:17:58.667177", + "v": 107.2196 + }, + { + "t": "2026-08-03T02:17:58.667177", + "v": 106.9333 + }, + { + "t": "2026-08-03T03:17:58.667177", + "v": 106.9745 + }, + { + "t": "2026-08-03T04:17:58.667177", + "v": 107.403 + }, + { + "t": "2026-08-03T05:17:58.667177", + "v": 107.3879 + }, + { + "t": "2026-08-03T06:17:58.667177", + "v": 106.8673 + }, + { + "t": "2026-08-03T07:17:58.667177", + "v": 107.0933 + }, + { + "t": "2026-08-03T08:17:58.667177", + "v": 107.1481 + }, + { + "t": "2026-08-03T09:17:58.667177", + "v": 107.2905 + }, + { + "t": "2026-08-03T10:17:58.667177", + "v": 107.3662 + }, + { + "t": "2026-08-03T11:17:58.667177", + "v": 108.2937 + }, + { + "t": "2026-08-03T12:17:58.667177", + "v": 107.6843 + }, + { + "t": "2026-08-03T13:17:58.667177", + "v": 107.7104 + }, + { + "t": "2026-08-03T14:17:58.667177", + "v": 107.5222 + }, + { + "t": "2026-08-03T15:17:58.667177", + "v": 107.1786 + }, + { + "t": "2026-08-03T16:17:58.667177", + "v": 107.1062 + }, + { + "t": "2026-08-03T17:17:58.667177", + "v": 106.93 + }, + { + "t": "2026-08-03T18:17:58.667177", + "v": 106.4088 + }, + { + "t": "2026-08-03T19:17:58.667177", + "v": 106.8388 + }, + { + "t": "2026-08-03T20:17:58.667177", + "v": 106.7626 + }, + { + "t": "2026-08-03T21:17:58.667177", + "v": 106.787 + }, + { + "t": "2026-08-03T22:17:58.667177", + "v": 106.9894 + }, + { + "t": "2026-08-03T23:17:58.667177", + "v": 107.1137 + }, + { + "t": "2026-08-04T00:17:58.667177", + "v": 107.2312 + }, + { + "t": "2026-08-04T01:17:58.667177", + "v": 107.065 + }, + { + "t": "2026-08-04T02:17:58.667177", + "v": 107.7262 + }, + { + "t": "2026-08-04T03:17:58.667177", + "v": 107.595 + }, + { + "t": "2026-08-04T04:17:58.667177", + "v": 107.3551 + }, + { + "t": "2026-08-04T05:17:58.667177", + "v": 107.5009 + } + ], + "trades": [ + { + "time": "2026-07-22 21:17", + "side": "BUY", + "size": 0.0014, + "price": 63811.8, + "pnl": 0.6099 + }, + { + "time": "2026-07-22 22:17", + "side": "BUY", + "size": 0.0008, + "price": 63288.0, + "pnl": 0.5896 + }, + { + "time": "2026-07-23 00:17", + "side": "SELL", + "size": 0.0018, + "price": 64731.7, + "pnl": -0.2386 + }, + { + "time": "2026-07-23 07:17", + "side": "SELL", + "size": 0.0019, + "price": 63303.4, + "pnl": -0.2361 + }, + { + "time": "2026-07-23 08:17", + "side": "BUY", + "size": 0.0016, + "price": 62409.7, + "pnl": 0.2512 + }, + { + "time": "2026-07-23 16:17", + "side": "SELL", + "size": 0.0006, + "price": 64673.3, + "pnl": -0.2399 + }, + { + "time": "2026-07-23 23:17", + "side": "SELL", + "size": 0.0008, + "price": 64354.1, + "pnl": -0.2843 + }, + { + "time": "2026-07-24 00:17", + "side": "BUY", + "size": 0.0016, + "price": 60896.8, + "pnl": 0.3349 + }, + { + "time": "2026-07-24 01:17", + "side": "SELL", + "size": 0.0006, + "price": 61300.6, + "pnl": -0.4832 + }, + { + "time": "2026-07-24 03:17", + "side": "BUY", + "size": 0.0006, + "price": 63743.0, + "pnl": 0.2496 + }, + { + "time": "2026-07-24 08:17", + "side": "BUY", + "size": 0.0013, + "price": 62925.2, + "pnl": 0.2176 + }, + { + "time": "2026-07-24 16:17", + "side": "SELL", + "size": 0.0009, + "price": 64223.2, + "pnl": -0.4595 + }, + { + "time": "2026-07-24 18:17", + "side": "BUY", + "size": 0.002, + "price": 63640.3, + "pnl": 0.2594 + }, + { + "time": "2026-07-24 19:17", + "side": "BUY", + "size": 0.0012, + "price": 60450.4, + "pnl": 0.4879 + }, + { + "time": "2026-07-24 21:17", + "side": "SELL", + "size": 0.0019, + "price": 64743.4, + "pnl": -0.2933 + }, + { + "time": "2026-07-24 22:17", + "side": "SELL", + "size": 0.0011, + "price": 62655.5, + "pnl": -0.3592 + }, + { + "time": "2026-07-25 00:17", + "side": "SELL", + "size": 0.0009, + "price": 62484.2, + "pnl": -0.2584 + }, + { + "time": "2026-07-25 05:17", + "side": "SELL", + "size": 0.0006, + "price": 63781.0, + "pnl": -0.3693 + }, + { + "time": "2026-07-25 09:17", + "side": "SELL", + "size": 0.0005, + "price": 62676.0, + "pnl": -0.3087 + }, + { + "time": "2026-07-25 10:17", + "side": "BUY", + "size": 0.0013, + "price": 61963.3, + "pnl": 1.5218 + }, + { + "time": "2026-07-25 16:17", + "side": "BUY", + "size": 0.0006, + "price": 60252.1, + "pnl": 0.3165 + }, + { + "time": "2026-07-25 17:17", + "side": "SELL", + "size": 0.001, + "price": 60124.5, + "pnl": -0.3792 + }, + { + "time": "2026-07-25 19:17", + "side": "BUY", + "size": 0.001, + "price": 64575.9, + "pnl": 0.3342 + }, + { + "time": "2026-07-25 20:17", + "side": "BUY", + "size": 0.002, + "price": 63564.0, + "pnl": 0.5308 + }, + { + "time": "2026-07-25 21:17", + "side": "BUY", + "size": 0.0006, + "price": 61632.9, + "pnl": 0.2428 + }, + { + "time": "2026-07-25 23:17", + "side": "SELL", + "size": 0.0017, + "price": 62134.0, + "pnl": -0.4897 + }, + { + "time": "2026-07-26 00:17", + "side": "BUY", + "size": 0.0011, + "price": 60664.1, + "pnl": 0.3981 + }, + { + "time": "2026-07-26 03:17", + "side": "BUY", + "size": 0.0008, + "price": 60892.1, + "pnl": 0.246 + }, + { + "time": "2026-07-26 06:17", + "side": "SELL", + "size": 0.0006, + "price": 62367.0, + "pnl": -0.3179 + }, + { + "time": "2026-07-26 08:17", + "side": "BUY", + "size": 0.0013, + "price": 61186.7, + "pnl": 0.3245 + }, + { + "time": "2026-07-26 10:17", + "side": "SELL", + "size": 0.0017, + "price": 62271.4, + "pnl": -0.268 + }, + { + "time": "2026-07-26 11:17", + "side": "SELL", + "size": 0.0019, + "price": 60416.6, + "pnl": -0.5097 + }, + { + "time": "2026-07-26 14:17", + "side": "BUY", + "size": 0.0014, + "price": 64180.6, + "pnl": 0.3324 + }, + { + "time": "2026-07-26 18:17", + "side": "SELL", + "size": 0.002, + "price": 64449.4, + "pnl": -0.4726 + }, + { + "time": "2026-07-26 22:17", + "side": "BUY", + "size": 0.0006, + "price": 60029.0, + "pnl": 0.3032 + }, + { + "time": "2026-07-26 23:17", + "side": "BUY", + "size": 0.0006, + "price": 61937.5, + "pnl": 0.3411 + }, + { + "time": "2026-07-27 00:17", + "side": "BUY", + "size": 0.0016, + "price": 62363.9, + "pnl": 0.504 + }, + { + "time": "2026-07-27 03:17", + "side": "SELL", + "size": 0.0012, + "price": 64015.7, + "pnl": -0.452 + }, + { + "time": "2026-07-27 04:17", + "side": "SELL", + "size": 0.0018, + "price": 63736.7, + "pnl": -0.2758 + }, + { + "time": "2026-07-27 11:17", + "side": "BUY", + "size": 0.0013, + "price": 64937.0, + "pnl": 0.3962 + }, + { + "time": "2026-07-27 12:17", + "side": "SELL", + "size": 0.0009, + "price": 63197.8, + "pnl": -0.2251 + }, + { + "time": "2026-07-27 13:17", + "side": "SELL", + "size": 0.0019, + "price": 60597.2, + "pnl": -0.2968 + }, + { + "time": "2026-07-27 15:17", + "side": "BUY", + "size": 0.0018, + "price": 64947.1, + "pnl": 0.2302 + }, + { + "time": "2026-07-27 17:17", + "side": "SELL", + "size": 0.0013, + "price": 63145.5, + "pnl": -0.3383 + }, + { + "time": "2026-07-27 18:17", + "side": "SELL", + "size": 0.0012, + "price": 63648.8, + "pnl": -0.3028 + }, + { + "time": "2026-07-27 20:17", + "side": "BUY", + "size": 0.0014, + "price": 60616.9, + "pnl": 0.337 + }, + { + "time": "2026-07-27 23:17", + "side": "SELL", + "size": 0.0016, + "price": 61272.8, + "pnl": -0.3266 + }, + { + "time": "2026-07-28 00:17", + "side": "BUY", + "size": 0.0011, + "price": 62482.4, + "pnl": 0.2996 + }, + { + "time": "2026-07-28 01:17", + "side": "SELL", + "size": 0.0007, + "price": 62555.0, + "pnl": -0.3805 + }, + { + "time": "2026-07-28 08:17", + "side": "SELL", + "size": 0.0013, + "price": 62944.7, + "pnl": -0.4914 + }, + { + "time": "2026-07-28 09:17", + "side": "SELL", + "size": 0.002, + "price": 61163.1, + "pnl": -0.2545 + }, + { + "time": "2026-07-28 10:17", + "side": "SELL", + "size": 0.0015, + "price": 64847.3, + "pnl": -0.302 + }, + { + "time": "2026-07-28 12:17", + "side": "BUY", + "size": 0.0015, + "price": 60836.3, + "pnl": 0.2964 + }, + { + "time": "2026-07-28 13:17", + "side": "SELL", + "size": 0.0019, + "price": 63823.2, + "pnl": -0.4102 + }, + { + "time": "2026-07-28 17:17", + "side": "SELL", + "size": 0.0012, + "price": 63046.9, + "pnl": -0.4106 + }, + { + "time": "2026-07-28 20:17", + "side": "BUY", + "size": 0.0015, + "price": 60963.2, + "pnl": 0.3825 + }, + { + "time": "2026-07-28 23:17", + "side": "BUY", + "size": 0.0011, + "price": 63090.7, + "pnl": 0.4783 + }, + { + "time": "2026-07-29 00:17", + "side": "SELL", + "size": 0.0012, + "price": 62726.1, + "pnl": -0.2942 + }, + { + "time": "2026-07-29 03:17", + "side": "BUY", + "size": 0.0006, + "price": 61060.2, + "pnl": 0.2591 + }, + { + "time": "2026-07-29 08:17", + "side": "SELL", + "size": 0.0009, + "price": 63094.5, + "pnl": -0.2633 + }, + { + "time": "2026-07-29 09:17", + "side": "SELL", + "size": 0.001, + "price": 60298.5, + "pnl": -0.2728 + }, + { + "time": "2026-07-29 13:17", + "side": "SELL", + "size": 0.0014, + "price": 61341.0, + "pnl": -0.2456 + }, + { + "time": "2026-07-29 17:17", + "side": "BUY", + "size": 0.0005, + "price": 64712.7, + "pnl": 0.4104 + }, + { + "time": "2026-07-29 22:17", + "side": "SELL", + "size": 0.0016, + "price": 62269.6, + "pnl": -0.2917 + }, + { + "time": "2026-07-29 23:17", + "side": "SELL", + "size": 0.0019, + "price": 62446.7, + "pnl": -0.2803 + }, + { + "time": "2026-07-30 06:17", + "side": "SELL", + "size": 0.0007, + "price": 64173.8, + "pnl": -0.2391 + }, + { + "time": "2026-07-30 11:17", + "side": "SELL", + "size": 0.0014, + "price": 63794.2, + "pnl": -0.4955 + }, + { + "time": "2026-07-30 13:17", + "side": "SELL", + "size": 0.0017, + "price": 63080.2, + "pnl": -0.3019 + }, + { + "time": "2026-07-30 14:17", + "side": "BUY", + "size": 0.001, + "price": 61929.6, + "pnl": 0.2354 + }, + { + "time": "2026-07-30 16:17", + "side": "BUY", + "size": 0.0018, + "price": 63979.6, + "pnl": 0.3065 + }, + { + "time": "2026-07-30 17:17", + "side": "BUY", + "size": 0.0007, + "price": 61639.8, + "pnl": 0.8582 + }, + { + "time": "2026-07-30 18:17", + "side": "BUY", + "size": 0.0019, + "price": 61178.6, + "pnl": 0.2831 + }, + { + "time": "2026-07-30 19:17", + "side": "BUY", + "size": 0.0015, + "price": 60147.5, + "pnl": 0.2562 + }, + { + "time": "2026-07-31 01:17", + "side": "SELL", + "size": 0.0018, + "price": 60471.6, + "pnl": -0.2464 + }, + { + "time": "2026-07-31 02:17", + "side": "SELL", + "size": 0.0013, + "price": 62668.8, + "pnl": -0.2521 + }, + { + "time": "2026-07-31 05:17", + "side": "BUY", + "size": 0.0007, + "price": 63634.5, + "pnl": 0.5895 + }, + { + "time": "2026-07-31 12:17", + "side": "BUY", + "size": 0.0005, + "price": 62561.5, + "pnl": 0.3898 + }, + { + "time": "2026-07-31 22:17", + "side": "BUY", + "size": 0.0018, + "price": 60679.2, + "pnl": 0.3099 + }, + { + "time": "2026-08-01 00:17", + "side": "BUY", + "size": 0.0019, + "price": 63815.4, + "pnl": 0.2756 + }, + { + "time": "2026-08-01 02:17", + "side": "SELL", + "size": 0.0006, + "price": 61921.0, + "pnl": -0.2601 + }, + { + "time": "2026-08-01 05:17", + "side": "BUY", + "size": 0.0014, + "price": 62958.7, + "pnl": 0.3356 + }, + { + "time": "2026-08-01 07:17", + "side": "SELL", + "size": 0.0016, + "price": 62527.3, + "pnl": -0.9447 + }, + { + "time": "2026-08-01 14:17", + "side": "BUY", + "size": 0.0017, + "price": 60582.5, + "pnl": 0.2495 + }, + { + "time": "2026-08-01 19:17", + "side": "SELL", + "size": 0.0006, + "price": 61821.2, + "pnl": -0.429 + }, + { + "time": "2026-08-02 17:17", + "side": "BUY", + "size": 0.0019, + "price": 62724.6, + "pnl": 0.2292 + }, + { + "time": "2026-08-02 19:17", + "side": "SELL", + "size": 0.0015, + "price": 63666.4, + "pnl": -0.2241 + }, + { + "time": "2026-08-02 21:17", + "side": "SELL", + "size": 0.0008, + "price": 63572.6, + "pnl": -0.2317 + }, + { + "time": "2026-08-02 22:17", + "side": "SELL", + "size": 0.0011, + "price": 61520.7, + "pnl": -0.2506 + }, + { + "time": "2026-08-02 23:17", + "side": "BUY", + "size": 0.0008, + "price": 60962.1, + "pnl": 0.3731 + }, + { + "time": "2026-08-03 02:17", + "side": "SELL", + "size": 0.0017, + "price": 62496.5, + "pnl": -0.2863 + }, + { + "time": "2026-08-03 04:17", + "side": "BUY", + "size": 0.0012, + "price": 60757.8, + "pnl": 0.4285 + }, + { + "time": "2026-08-03 06:17", + "side": "SELL", + "size": 0.0016, + "price": 64835.2, + "pnl": -0.5206 + }, + { + "time": "2026-08-03 07:17", + "side": "BUY", + "size": 0.0012, + "price": 64493.7, + "pnl": 0.2261 + }, + { + "time": "2026-08-03 11:17", + "side": "BUY", + "size": 0.0019, + "price": 63536.0, + "pnl": 0.9275 + }, + { + "time": "2026-08-03 12:17", + "side": "SELL", + "size": 0.0006, + "price": 63127.9, + "pnl": -0.6094 + }, + { + "time": "2026-08-03 15:17", + "side": "SELL", + "size": 0.0018, + "price": 61606.4, + "pnl": -0.3436 + }, + { + "time": "2026-08-03 18:17", + "side": "SELL", + "size": 0.0017, + "price": 62601.6, + "pnl": -0.5212 + }, + { + "time": "2026-08-03 19:17", + "side": "BUY", + "size": 0.0015, + "price": 62463.1, + "pnl": 0.43 + }, + { + "time": "2026-08-04 02:17", + "side": "BUY", + "size": 0.0019, + "price": 64846.3, + "pnl": 0.6611 + }, + { + "time": "2026-08-04 04:17", + "side": "SELL", + "size": 0.0005, + "price": 63952.6, + "pnl": -0.2399 + } + ], + "num_periods": 720, + "generated_at": "2026-08-04T06:17:58.674232" +} \ No newline at end of file diff --git a/backtests/results/gueant_20260804-061758.json b/backtests/results/gueant_20260804-061758.json new file mode 100644 index 0000000..fa7b52d --- /dev/null +++ b/backtests/results/gueant_20260804-061758.json @@ -0,0 +1,3605 @@ +{ + "strategy": "Gu\u00e9ant Market Making", + "strategy_key": "gueant", + "description": "Closed-form asymptotic MM \u2014 adverse selection handling", + "allocation": 100.0, + "start_time": "2026-07-05T06:17:58.992366", + "end_time": "2026-08-04T05:17:58.992366", + "start_equity": 100.0, + "end_equity": 106.2818, + "pnl": 6.2818, + "pnl_pct": 6.2818, + "ann_return_pct": 75.38, + "sharpe": 7.4804, + "sortino": 13.8323, + "max_dd": 0.0222, + "max_dd_pct": 2.22, + "win_rate": 0.5169, + "total_trades": 207, + "equity_curve": [ + { + "t": "2026-07-05T06:17:58.992366", + "v": 100.0008 + }, + { + "t": "2026-07-05T07:17:58.992366", + "v": 99.872 + }, + { + "t": "2026-07-05T08:17:58.992366", + "v": 99.8529 + }, + { + "t": "2026-07-05T09:17:58.992366", + "v": 99.9255 + }, + { + "t": "2026-07-05T10:17:58.992366", + "v": 99.8497 + }, + { + "t": "2026-07-05T11:17:58.992366", + "v": 99.9208 + }, + { + "t": "2026-07-05T12:17:58.992366", + "v": 99.9852 + }, + { + "t": "2026-07-05T13:17:58.992366", + "v": 100.0403 + }, + { + "t": "2026-07-05T14:17:58.992366", + "v": 99.952 + }, + { + "t": "2026-07-05T15:17:58.992366", + "v": 99.9251 + }, + { + "t": "2026-07-05T16:17:58.992366", + "v": 99.7648 + }, + { + "t": "2026-07-05T17:17:58.992366", + "v": 99.8326 + }, + { + "t": "2026-07-05T18:17:58.992366", + "v": 99.8152 + }, + { + "t": "2026-07-05T19:17:58.992366", + "v": 99.8311 + }, + { + "t": "2026-07-05T20:17:58.992366", + "v": 99.679 + }, + { + "t": "2026-07-05T21:17:58.992366", + "v": 99.6674 + }, + { + "t": "2026-07-05T22:17:58.992366", + "v": 99.5824 + }, + { + "t": "2026-07-05T23:17:58.992366", + "v": 99.398 + }, + { + "t": "2026-07-06T00:17:58.992366", + "v": 99.6054 + }, + { + "t": "2026-07-06T01:17:58.992366", + "v": 99.5185 + }, + { + "t": "2026-07-06T02:17:58.992366", + "v": 99.5183 + }, + { + "t": "2026-07-06T03:17:58.992366", + "v": 99.5831 + }, + { + "t": "2026-07-06T04:17:58.992366", + "v": 99.5434 + }, + { + "t": "2026-07-06T05:17:58.992366", + "v": 99.5967 + }, + { + "t": "2026-07-06T06:17:58.992366", + "v": 99.5032 + }, + { + "t": "2026-07-06T07:17:58.992366", + "v": 99.4135 + }, + { + "t": "2026-07-06T08:17:58.992366", + "v": 99.332 + }, + { + "t": "2026-07-06T09:17:58.992366", + "v": 99.3677 + }, + { + "t": "2026-07-06T10:17:58.992366", + "v": 99.3975 + }, + { + "t": "2026-07-06T11:17:58.992366", + "v": 99.3612 + }, + { + "t": "2026-07-06T12:17:58.992366", + "v": 99.5964 + }, + { + "t": "2026-07-06T13:17:58.992366", + "v": 99.5785 + }, + { + "t": "2026-07-06T14:17:58.992366", + "v": 99.6809 + }, + { + "t": "2026-07-06T15:17:58.992366", + "v": 99.5767 + }, + { + "t": "2026-07-06T16:17:58.992366", + "v": 99.6272 + }, + { + "t": "2026-07-06T17:17:58.992366", + "v": 99.5857 + }, + { + "t": "2026-07-06T18:17:58.992366", + "v": 99.5484 + }, + { + "t": "2026-07-06T19:17:58.992366", + "v": 99.8196 + }, + { + "t": "2026-07-06T20:17:58.992366", + "v": 99.846 + }, + { + "t": "2026-07-06T21:17:58.992366", + "v": 99.8482 + }, + { + "t": "2026-07-06T22:17:58.992366", + "v": 99.9738 + }, + { + "t": "2026-07-06T23:17:58.992366", + "v": 100.0837 + }, + { + "t": "2026-07-07T00:17:58.992366", + "v": 100.0925 + }, + { + "t": "2026-07-07T01:17:58.992366", + "v": 100.2953 + }, + { + "t": "2026-07-07T02:17:58.992366", + "v": 100.2377 + }, + { + "t": "2026-07-07T03:17:58.992366", + "v": 100.3465 + }, + { + "t": "2026-07-07T04:17:58.992366", + "v": 100.3819 + }, + { + "t": "2026-07-07T05:17:58.992366", + "v": 100.4077 + }, + { + "t": "2026-07-07T06:17:58.992366", + "v": 100.4521 + }, + { + "t": "2026-07-07T07:17:58.992366", + "v": 100.482 + }, + { + "t": "2026-07-07T08:17:58.992366", + "v": 100.4471 + }, + { + "t": "2026-07-07T09:17:58.992366", + "v": 100.3376 + }, + { + "t": "2026-07-07T10:17:58.992366", + "v": 100.2209 + }, + { + "t": "2026-07-07T11:17:58.992366", + "v": 100.1761 + }, + { + "t": "2026-07-07T12:17:58.992366", + "v": 100.1623 + }, + { + "t": "2026-07-07T13:17:58.992366", + "v": 100.071 + }, + { + "t": "2026-07-07T14:17:58.992366", + "v": 100.1044 + }, + { + "t": "2026-07-07T15:17:58.992366", + "v": 100.0173 + }, + { + "t": "2026-07-07T16:17:58.992366", + "v": 100.0998 + }, + { + "t": "2026-07-07T17:17:58.992366", + "v": 100.1964 + }, + { + "t": "2026-07-07T18:17:58.992366", + "v": 100.0935 + }, + { + "t": "2026-07-07T19:17:58.992366", + "v": 100.1792 + }, + { + "t": "2026-07-07T20:17:58.992366", + "v": 100.0283 + }, + { + "t": "2026-07-07T21:17:58.992366", + "v": 99.9549 + }, + { + "t": "2026-07-07T22:17:58.992366", + "v": 100.0121 + }, + { + "t": "2026-07-07T23:17:58.992366", + "v": 100.0585 + }, + { + "t": "2026-07-08T00:17:58.992366", + "v": 100.0409 + }, + { + "t": "2026-07-08T01:17:58.992366", + "v": 100.0882 + }, + { + "t": "2026-07-08T02:17:58.992366", + "v": 100.2205 + }, + { + "t": "2026-07-08T03:17:58.992366", + "v": 100.3537 + }, + { + "t": "2026-07-08T04:17:58.992366", + "v": 100.3993 + }, + { + "t": "2026-07-08T05:17:58.992366", + "v": 100.4447 + }, + { + "t": "2026-07-08T06:17:58.992366", + "v": 100.4982 + }, + { + "t": "2026-07-08T07:17:58.992366", + "v": 100.4678 + }, + { + "t": "2026-07-08T08:17:58.992366", + "v": 100.5117 + }, + { + "t": "2026-07-08T09:17:58.992366", + "v": 100.4449 + }, + { + "t": "2026-07-08T10:17:58.992366", + "v": 100.3646 + }, + { + "t": "2026-07-08T11:17:58.992366", + "v": 100.3809 + }, + { + "t": "2026-07-08T12:17:58.992366", + "v": 100.4394 + }, + { + "t": "2026-07-08T13:17:58.992366", + "v": 100.406 + }, + { + "t": "2026-07-08T14:17:58.992366", + "v": 100.3785 + }, + { + "t": "2026-07-08T15:17:58.992366", + "v": 100.46 + }, + { + "t": "2026-07-08T16:17:58.992366", + "v": 100.6329 + }, + { + "t": "2026-07-08T17:17:58.992366", + "v": 100.6207 + }, + { + "t": "2026-07-08T18:17:58.992366", + "v": 100.6534 + }, + { + "t": "2026-07-08T19:17:58.992366", + "v": 100.6457 + }, + { + "t": "2026-07-08T20:17:58.992366", + "v": 100.598 + }, + { + "t": "2026-07-08T21:17:58.992366", + "v": 100.5683 + }, + { + "t": "2026-07-08T22:17:58.992366", + "v": 100.6124 + }, + { + "t": "2026-07-08T23:17:58.992366", + "v": 100.5919 + }, + { + "t": "2026-07-09T00:17:58.992366", + "v": 100.4623 + }, + { + "t": "2026-07-09T01:17:58.992366", + "v": 100.2246 + }, + { + "t": "2026-07-09T02:17:58.992366", + "v": 100.2266 + }, + { + "t": "2026-07-09T03:17:58.992366", + "v": 100.1868 + }, + { + "t": "2026-07-09T04:17:58.992366", + "v": 100.2941 + }, + { + "t": "2026-07-09T05:17:58.992366", + "v": 100.1789 + }, + { + "t": "2026-07-09T06:17:58.992366", + "v": 100.0456 + }, + { + "t": "2026-07-09T07:17:58.992366", + "v": 100.0401 + }, + { + "t": "2026-07-09T08:17:58.992366", + "v": 100.0486 + }, + { + "t": "2026-07-09T09:17:58.992366", + "v": 100.0292 + }, + { + "t": "2026-07-09T10:17:58.992366", + "v": 99.8831 + }, + { + "t": "2026-07-09T11:17:58.992366", + "v": 99.7675 + }, + { + "t": "2026-07-09T12:17:58.992366", + "v": 99.754 + }, + { + "t": "2026-07-09T13:17:58.992366", + "v": 99.6314 + }, + { + "t": "2026-07-09T14:17:58.992366", + "v": 99.6849 + }, + { + "t": "2026-07-09T15:17:58.992366", + "v": 99.5491 + }, + { + "t": "2026-07-09T16:17:58.992366", + "v": 99.6191 + }, + { + "t": "2026-07-09T17:17:58.992366", + "v": 99.4912 + }, + { + "t": "2026-07-09T18:17:58.992366", + "v": 99.6808 + }, + { + "t": "2026-07-09T19:17:58.992366", + "v": 99.6507 + }, + { + "t": "2026-07-09T20:17:58.992366", + "v": 99.7375 + }, + { + "t": "2026-07-09T21:17:58.992366", + "v": 99.7282 + }, + { + "t": "2026-07-09T22:17:58.992366", + "v": 99.7712 + }, + { + "t": "2026-07-09T23:17:58.992366", + "v": 99.8582 + }, + { + "t": "2026-07-10T00:17:58.992366", + "v": 99.9657 + }, + { + "t": "2026-07-10T01:17:58.992366", + "v": 99.9388 + }, + { + "t": "2026-07-10T02:17:58.992366", + "v": 100.1047 + }, + { + "t": "2026-07-10T03:17:58.992366", + "v": 100.1734 + }, + { + "t": "2026-07-10T04:17:58.992366", + "v": 100.161 + }, + { + "t": "2026-07-10T05:17:58.992366", + "v": 100.0976 + }, + { + "t": "2026-07-10T06:17:58.992366", + "v": 100.1062 + }, + { + "t": "2026-07-10T07:17:58.992366", + "v": 99.9996 + }, + { + "t": "2026-07-10T08:17:58.992366", + "v": 99.9007 + }, + { + "t": "2026-07-10T09:17:58.992366", + "v": 99.768 + }, + { + "t": "2026-07-10T10:17:58.992366", + "v": 99.7137 + }, + { + "t": "2026-07-10T11:17:58.992366", + "v": 99.7019 + }, + { + "t": "2026-07-10T12:17:58.992366", + "v": 99.7621 + }, + { + "t": "2026-07-10T13:17:58.992366", + "v": 99.9841 + }, + { + "t": "2026-07-10T14:17:58.992366", + "v": 99.9701 + }, + { + "t": "2026-07-10T15:17:58.992366", + "v": 99.8988 + }, + { + "t": "2026-07-10T16:17:58.992366", + "v": 100.0324 + }, + { + "t": "2026-07-10T17:17:58.992366", + "v": 99.8931 + }, + { + "t": "2026-07-10T18:17:58.992366", + "v": 99.7756 + }, + { + "t": "2026-07-10T19:17:58.992366", + "v": 99.7813 + }, + { + "t": "2026-07-10T20:17:58.992366", + "v": 99.8637 + }, + { + "t": "2026-07-10T21:17:58.992366", + "v": 99.7994 + }, + { + "t": "2026-07-10T22:17:58.992366", + "v": 99.6346 + }, + { + "t": "2026-07-10T23:17:58.992366", + "v": 99.6409 + }, + { + "t": "2026-07-11T00:17:58.992366", + "v": 99.6713 + }, + { + "t": "2026-07-11T01:17:58.992366", + "v": 99.4571 + }, + { + "t": "2026-07-11T02:17:58.992366", + "v": 99.3227 + }, + { + "t": "2026-07-11T03:17:58.992366", + "v": 99.3174 + }, + { + "t": "2026-07-11T04:17:58.992366", + "v": 99.5626 + }, + { + "t": "2026-07-11T05:17:58.992366", + "v": 99.495 + }, + { + "t": "2026-07-11T06:17:58.992366", + "v": 99.6757 + }, + { + "t": "2026-07-11T07:17:58.992366", + "v": 99.5666 + }, + { + "t": "2026-07-11T08:17:58.992366", + "v": 99.6485 + }, + { + "t": "2026-07-11T09:17:58.992366", + "v": 99.8622 + }, + { + "t": "2026-07-11T10:17:58.992366", + "v": 100.0127 + }, + { + "t": "2026-07-11T11:17:58.992366", + "v": 100.0368 + }, + { + "t": "2026-07-11T12:17:58.992366", + "v": 100.0459 + }, + { + "t": "2026-07-11T13:17:58.992366", + "v": 100.1011 + }, + { + "t": "2026-07-11T14:17:58.992366", + "v": 100.0823 + }, + { + "t": "2026-07-11T15:17:58.992366", + "v": 100.2895 + }, + { + "t": "2026-07-11T16:17:58.992366", + "v": 100.053 + }, + { + "t": "2026-07-11T17:17:58.992366", + "v": 99.8846 + }, + { + "t": "2026-07-11T18:17:58.992366", + "v": 99.8184 + }, + { + "t": "2026-07-11T19:17:58.992366", + "v": 99.7121 + }, + { + "t": "2026-07-11T20:17:58.992366", + "v": 99.7767 + }, + { + "t": "2026-07-11T21:17:58.992366", + "v": 99.8034 + }, + { + "t": "2026-07-11T22:17:58.992366", + "v": 99.7674 + }, + { + "t": "2026-07-11T23:17:58.992366", + "v": 99.744 + }, + { + "t": "2026-07-12T00:17:58.992366", + "v": 99.6985 + }, + { + "t": "2026-07-12T01:17:58.992366", + "v": 99.6955 + }, + { + "t": "2026-07-12T02:17:58.992366", + "v": 99.592 + }, + { + "t": "2026-07-12T03:17:58.992366", + "v": 99.5384 + }, + { + "t": "2026-07-12T04:17:58.992366", + "v": 99.7112 + }, + { + "t": "2026-07-12T05:17:58.992366", + "v": 99.6659 + }, + { + "t": "2026-07-12T06:17:58.992366", + "v": 99.6695 + }, + { + "t": "2026-07-12T07:17:58.992366", + "v": 99.6153 + }, + { + "t": "2026-07-12T08:17:58.992366", + "v": 99.7163 + }, + { + "t": "2026-07-12T09:17:58.992366", + "v": 99.5923 + }, + { + "t": "2026-07-12T10:17:58.992366", + "v": 99.6076 + }, + { + "t": "2026-07-12T11:17:58.992366", + "v": 99.7644 + }, + { + "t": "2026-07-12T12:17:58.992366", + "v": 99.9271 + }, + { + "t": "2026-07-12T13:17:58.992366", + "v": 99.9573 + }, + { + "t": "2026-07-12T14:17:58.992366", + "v": 99.8374 + }, + { + "t": "2026-07-12T15:17:58.992366", + "v": 99.7712 + }, + { + "t": "2026-07-12T16:17:58.992366", + "v": 99.8601 + }, + { + "t": "2026-07-12T17:17:58.992366", + "v": 99.8716 + }, + { + "t": "2026-07-12T18:17:58.992366", + "v": 99.7834 + }, + { + "t": "2026-07-12T19:17:58.992366", + "v": 99.6443 + }, + { + "t": "2026-07-12T20:17:58.992366", + "v": 99.6489 + }, + { + "t": "2026-07-12T21:17:58.992366", + "v": 99.7688 + }, + { + "t": "2026-07-12T22:17:58.992366", + "v": 99.9158 + }, + { + "t": "2026-07-12T23:17:58.992366", + "v": 99.9151 + }, + { + "t": "2026-07-13T00:17:58.992366", + "v": 99.9181 + }, + { + "t": "2026-07-13T01:17:58.992366", + "v": 99.9531 + }, + { + "t": "2026-07-13T02:17:58.992366", + "v": 99.9565 + }, + { + "t": "2026-07-13T03:17:58.992366", + "v": 99.9423 + }, + { + "t": "2026-07-13T04:17:58.992366", + "v": 100.0157 + }, + { + "t": "2026-07-13T05:17:58.992366", + "v": 100.0114 + }, + { + "t": "2026-07-13T06:17:58.992366", + "v": 100.0046 + }, + { + "t": "2026-07-13T07:17:58.992366", + "v": 100.1113 + }, + { + "t": "2026-07-13T08:17:58.992366", + "v": 99.8886 + }, + { + "t": "2026-07-13T09:17:58.992366", + "v": 99.899 + }, + { + "t": "2026-07-13T10:17:58.992366", + "v": 99.9088 + }, + { + "t": "2026-07-13T11:17:58.992366", + "v": 99.9669 + }, + { + "t": "2026-07-13T12:17:58.992366", + "v": 99.9321 + }, + { + "t": "2026-07-13T13:17:58.992366", + "v": 99.8315 + }, + { + "t": "2026-07-13T14:17:58.992366", + "v": 99.8293 + }, + { + "t": "2026-07-13T15:17:58.992366", + "v": 99.8602 + }, + { + "t": "2026-07-13T16:17:58.992366", + "v": 99.9326 + }, + { + "t": "2026-07-13T17:17:58.992366", + "v": 100.0697 + }, + { + "t": "2026-07-13T18:17:58.992366", + "v": 100.1273 + }, + { + "t": "2026-07-13T19:17:58.992366", + "v": 100.09 + }, + { + "t": "2026-07-13T20:17:58.992366", + "v": 100.1119 + }, + { + "t": "2026-07-13T21:17:58.992366", + "v": 100.0489 + }, + { + "t": "2026-07-13T22:17:58.992366", + "v": 100.1031 + }, + { + "t": "2026-07-13T23:17:58.992366", + "v": 100.3218 + }, + { + "t": "2026-07-14T00:17:58.992366", + "v": 100.3339 + }, + { + "t": "2026-07-14T01:17:58.992366", + "v": 100.1526 + }, + { + "t": "2026-07-14T02:17:58.992366", + "v": 100.3281 + }, + { + "t": "2026-07-14T03:17:58.992366", + "v": 100.2986 + }, + { + "t": "2026-07-14T04:17:58.992366", + "v": 100.2731 + }, + { + "t": "2026-07-14T05:17:58.992366", + "v": 100.0445 + }, + { + "t": "2026-07-14T06:17:58.992366", + "v": 100.1451 + }, + { + "t": "2026-07-14T07:17:58.992366", + "v": 100.3144 + }, + { + "t": "2026-07-14T08:17:58.992366", + "v": 100.2581 + }, + { + "t": "2026-07-14T09:17:58.992366", + "v": 100.2827 + }, + { + "t": "2026-07-14T10:17:58.992366", + "v": 100.3067 + }, + { + "t": "2026-07-14T11:17:58.992366", + "v": 100.1733 + }, + { + "t": "2026-07-14T12:17:58.992366", + "v": 100.3857 + }, + { + "t": "2026-07-14T13:17:58.992366", + "v": 100.3335 + }, + { + "t": "2026-07-14T14:17:58.992366", + "v": 100.4255 + }, + { + "t": "2026-07-14T15:17:58.992366", + "v": 100.4077 + }, + { + "t": "2026-07-14T16:17:58.992366", + "v": 100.7321 + }, + { + "t": "2026-07-14T17:17:58.992366", + "v": 100.7118 + }, + { + "t": "2026-07-14T18:17:58.992366", + "v": 100.6709 + }, + { + "t": "2026-07-14T19:17:58.992366", + "v": 100.6495 + }, + { + "t": "2026-07-14T20:17:58.992366", + "v": 100.9022 + }, + { + "t": "2026-07-14T21:17:58.992366", + "v": 100.8899 + }, + { + "t": "2026-07-14T22:17:58.992366", + "v": 100.8271 + }, + { + "t": "2026-07-14T23:17:58.992366", + "v": 100.6927 + }, + { + "t": "2026-07-15T00:17:58.992366", + "v": 100.7148 + }, + { + "t": "2026-07-15T01:17:58.992366", + "v": 100.5961 + }, + { + "t": "2026-07-15T02:17:58.992366", + "v": 100.6708 + }, + { + "t": "2026-07-15T03:17:58.992366", + "v": 100.7 + }, + { + "t": "2026-07-15T04:17:58.992366", + "v": 100.665 + }, + { + "t": "2026-07-15T05:17:58.992366", + "v": 100.6293 + }, + { + "t": "2026-07-15T06:17:58.992366", + "v": 100.6755 + }, + { + "t": "2026-07-15T07:17:58.992366", + "v": 100.7545 + }, + { + "t": "2026-07-15T08:17:58.992366", + "v": 100.8294 + }, + { + "t": "2026-07-15T09:17:58.992366", + "v": 100.8083 + }, + { + "t": "2026-07-15T10:17:58.992366", + "v": 100.6864 + }, + { + "t": "2026-07-15T11:17:58.992366", + "v": 100.934 + }, + { + "t": "2026-07-15T12:17:58.992366", + "v": 100.9114 + }, + { + "t": "2026-07-15T13:17:58.992366", + "v": 100.912 + }, + { + "t": "2026-07-15T14:17:58.992366", + "v": 101.0868 + }, + { + "t": "2026-07-15T15:17:58.992366", + "v": 101.1389 + }, + { + "t": "2026-07-15T16:17:58.992366", + "v": 101.0962 + }, + { + "t": "2026-07-15T17:17:58.992366", + "v": 101.0928 + }, + { + "t": "2026-07-15T18:17:58.992366", + "v": 101.211 + }, + { + "t": "2026-07-15T19:17:58.992366", + "v": 101.1801 + }, + { + "t": "2026-07-15T20:17:58.992366", + "v": 101.1491 + }, + { + "t": "2026-07-15T21:17:58.992366", + "v": 101.1915 + }, + { + "t": "2026-07-15T22:17:58.992366", + "v": 101.1721 + }, + { + "t": "2026-07-15T23:17:58.992366", + "v": 101.1495 + }, + { + "t": "2026-07-16T00:17:58.992366", + "v": 101.0428 + }, + { + "t": "2026-07-16T01:17:58.992366", + "v": 101.0835 + }, + { + "t": "2026-07-16T02:17:58.992366", + "v": 100.991 + }, + { + "t": "2026-07-16T03:17:58.992366", + "v": 100.9987 + }, + { + "t": "2026-07-16T04:17:58.992366", + "v": 100.9936 + }, + { + "t": "2026-07-16T05:17:58.992366", + "v": 101.0866 + }, + { + "t": "2026-07-16T06:17:58.992366", + "v": 101.0 + }, + { + "t": "2026-07-16T07:17:58.992366", + "v": 101.0906 + }, + { + "t": "2026-07-16T08:17:58.992366", + "v": 100.9821 + }, + { + "t": "2026-07-16T09:17:58.992366", + "v": 101.1219 + }, + { + "t": "2026-07-16T10:17:58.992366", + "v": 100.961 + }, + { + "t": "2026-07-16T11:17:58.992366", + "v": 100.8777 + }, + { + "t": "2026-07-16T12:17:58.992366", + "v": 100.9613 + }, + { + "t": "2026-07-16T13:17:58.992366", + "v": 101.0337 + }, + { + "t": "2026-07-16T14:17:58.992366", + "v": 101.0212 + }, + { + "t": "2026-07-16T15:17:58.992366", + "v": 101.1675 + }, + { + "t": "2026-07-16T16:17:58.992366", + "v": 101.1282 + }, + { + "t": "2026-07-16T17:17:58.992366", + "v": 101.0223 + }, + { + "t": "2026-07-16T18:17:58.992366", + "v": 101.0155 + }, + { + "t": "2026-07-16T19:17:58.992366", + "v": 101.0207 + }, + { + "t": "2026-07-16T20:17:58.992366", + "v": 101.1415 + }, + { + "t": "2026-07-16T21:17:58.992366", + "v": 101.0386 + }, + { + "t": "2026-07-16T22:17:58.992366", + "v": 100.9725 + }, + { + "t": "2026-07-16T23:17:58.992366", + "v": 101.0134 + }, + { + "t": "2026-07-17T00:17:58.992366", + "v": 101.3538 + }, + { + "t": "2026-07-17T01:17:58.992366", + "v": 101.3652 + }, + { + "t": "2026-07-17T02:17:58.992366", + "v": 101.3461 + }, + { + "t": "2026-07-17T03:17:58.992366", + "v": 101.2918 + }, + { + "t": "2026-07-17T04:17:58.992366", + "v": 101.2766 + }, + { + "t": "2026-07-17T05:17:58.992366", + "v": 101.3095 + }, + { + "t": "2026-07-17T06:17:58.992366", + "v": 101.3908 + }, + { + "t": "2026-07-17T07:17:58.992366", + "v": 101.3385 + }, + { + "t": "2026-07-17T08:17:58.992366", + "v": 101.2907 + }, + { + "t": "2026-07-17T09:17:58.992366", + "v": 101.3703 + }, + { + "t": "2026-07-17T10:17:58.992366", + "v": 101.5496 + }, + { + "t": "2026-07-17T11:17:58.992366", + "v": 101.6744 + }, + { + "t": "2026-07-17T12:17:58.992366", + "v": 101.8171 + }, + { + "t": "2026-07-17T13:17:58.992366", + "v": 101.8965 + }, + { + "t": "2026-07-17T14:17:58.992366", + "v": 101.8147 + }, + { + "t": "2026-07-17T15:17:58.992366", + "v": 101.8066 + }, + { + "t": "2026-07-17T16:17:58.992366", + "v": 101.8463 + }, + { + "t": "2026-07-17T17:17:58.992366", + "v": 102.016 + }, + { + "t": "2026-07-17T18:17:58.992366", + "v": 102.1405 + }, + { + "t": "2026-07-17T19:17:58.992366", + "v": 102.0262 + }, + { + "t": "2026-07-17T20:17:58.992366", + "v": 102.1264 + }, + { + "t": "2026-07-17T21:17:58.992366", + "v": 102.1911 + }, + { + "t": "2026-07-17T22:17:58.992366", + "v": 102.2903 + }, + { + "t": "2026-07-17T23:17:58.992366", + "v": 102.3162 + }, + { + "t": "2026-07-18T00:17:58.992366", + "v": 102.3482 + }, + { + "t": "2026-07-18T01:17:58.992366", + "v": 102.3224 + }, + { + "t": "2026-07-18T02:17:58.992366", + "v": 102.296 + }, + { + "t": "2026-07-18T03:17:58.992366", + "v": 102.2972 + }, + { + "t": "2026-07-18T04:17:58.992366", + "v": 102.3263 + }, + { + "t": "2026-07-18T05:17:58.992366", + "v": 102.358 + }, + { + "t": "2026-07-18T06:17:58.992366", + "v": 102.2596 + }, + { + "t": "2026-07-18T07:17:58.992366", + "v": 102.0439 + }, + { + "t": "2026-07-18T08:17:58.992366", + "v": 101.9697 + }, + { + "t": "2026-07-18T09:17:58.992366", + "v": 102.0447 + }, + { + "t": "2026-07-18T10:17:58.992366", + "v": 102.102 + }, + { + "t": "2026-07-18T11:17:58.992366", + "v": 101.9785 + }, + { + "t": "2026-07-18T12:17:58.992366", + "v": 101.9725 + }, + { + "t": "2026-07-18T13:17:58.992366", + "v": 102.0102 + }, + { + "t": "2026-07-18T14:17:58.992366", + "v": 101.9002 + }, + { + "t": "2026-07-18T15:17:58.992366", + "v": 101.9585 + }, + { + "t": "2026-07-18T16:17:58.992366", + "v": 102.1404 + }, + { + "t": "2026-07-18T17:17:58.992366", + "v": 102.0215 + }, + { + "t": "2026-07-18T18:17:58.992366", + "v": 102.4677 + }, + { + "t": "2026-07-18T19:17:58.992366", + "v": 102.4415 + }, + { + "t": "2026-07-18T20:17:58.992366", + "v": 102.5383 + }, + { + "t": "2026-07-18T21:17:58.992366", + "v": 102.7052 + }, + { + "t": "2026-07-18T22:17:58.992366", + "v": 102.6896 + }, + { + "t": "2026-07-18T23:17:58.992366", + "v": 102.5944 + }, + { + "t": "2026-07-19T00:17:58.992366", + "v": 102.636 + }, + { + "t": "2026-07-19T01:17:58.992366", + "v": 102.4137 + }, + { + "t": "2026-07-19T02:17:58.992366", + "v": 102.5419 + }, + { + "t": "2026-07-19T03:17:58.992366", + "v": 102.6781 + }, + { + "t": "2026-07-19T04:17:58.992366", + "v": 102.6114 + }, + { + "t": "2026-07-19T05:17:58.992366", + "v": 102.6289 + }, + { + "t": "2026-07-19T06:17:58.992366", + "v": 102.6758 + }, + { + "t": "2026-07-19T07:17:58.992366", + "v": 102.725 + }, + { + "t": "2026-07-19T08:17:58.992366", + "v": 102.6868 + }, + { + "t": "2026-07-19T09:17:58.992366", + "v": 102.6967 + }, + { + "t": "2026-07-19T10:17:58.992366", + "v": 102.8095 + }, + { + "t": "2026-07-19T11:17:58.992366", + "v": 102.7098 + }, + { + "t": "2026-07-19T12:17:58.992366", + "v": 102.6349 + }, + { + "t": "2026-07-19T13:17:58.992366", + "v": 102.4326 + }, + { + "t": "2026-07-19T14:17:58.992366", + "v": 102.2883 + }, + { + "t": "2026-07-19T15:17:58.992366", + "v": 102.4073 + }, + { + "t": "2026-07-19T16:17:58.992366", + "v": 102.4863 + }, + { + "t": "2026-07-19T17:17:58.992366", + "v": 102.6696 + }, + { + "t": "2026-07-19T18:17:58.992366", + "v": 102.8804 + }, + { + "t": "2026-07-19T19:17:58.992366", + "v": 102.7173 + }, + { + "t": "2026-07-19T20:17:58.992366", + "v": 102.7915 + }, + { + "t": "2026-07-19T21:17:58.992366", + "v": 102.8511 + }, + { + "t": "2026-07-19T22:17:58.992366", + "v": 102.9228 + }, + { + "t": "2026-07-19T23:17:58.992366", + "v": 103.0488 + }, + { + "t": "2026-07-20T00:17:58.992366", + "v": 102.8939 + }, + { + "t": "2026-07-20T01:17:58.992366", + "v": 102.906 + }, + { + "t": "2026-07-20T02:17:58.992366", + "v": 102.9606 + }, + { + "t": "2026-07-20T03:17:58.992366", + "v": 102.9006 + }, + { + "t": "2026-07-20T04:17:58.992366", + "v": 102.7697 + }, + { + "t": "2026-07-20T05:17:58.992366", + "v": 102.8237 + }, + { + "t": "2026-07-20T06:17:58.992366", + "v": 102.8309 + }, + { + "t": "2026-07-20T07:17:58.992366", + "v": 102.6814 + }, + { + "t": "2026-07-20T08:17:58.992366", + "v": 102.6113 + }, + { + "t": "2026-07-20T09:17:58.992366", + "v": 102.6421 + }, + { + "t": "2026-07-20T10:17:58.992366", + "v": 102.7279 + }, + { + "t": "2026-07-20T11:17:58.992366", + "v": 102.9283 + }, + { + "t": "2026-07-20T12:17:58.992366", + "v": 102.9677 + }, + { + "t": "2026-07-20T13:17:58.992366", + "v": 102.9592 + }, + { + "t": "2026-07-20T14:17:58.992366", + "v": 102.8107 + }, + { + "t": "2026-07-20T15:17:58.992366", + "v": 102.6969 + }, + { + "t": "2026-07-20T16:17:58.992366", + "v": 102.5577 + }, + { + "t": "2026-07-20T17:17:58.992366", + "v": 102.5488 + }, + { + "t": "2026-07-20T18:17:58.992366", + "v": 102.6777 + }, + { + "t": "2026-07-20T19:17:58.992366", + "v": 102.6619 + }, + { + "t": "2026-07-20T20:17:58.992366", + "v": 102.5632 + }, + { + "t": "2026-07-20T21:17:58.992366", + "v": 102.6899 + }, + { + "t": "2026-07-20T22:17:58.992366", + "v": 102.7707 + }, + { + "t": "2026-07-20T23:17:58.992366", + "v": 102.9096 + }, + { + "t": "2026-07-21T00:17:58.992366", + "v": 103.0276 + }, + { + "t": "2026-07-21T01:17:58.992366", + "v": 103.0409 + }, + { + "t": "2026-07-21T02:17:58.992366", + "v": 103.107 + }, + { + "t": "2026-07-21T03:17:58.992366", + "v": 103.239 + }, + { + "t": "2026-07-21T04:17:58.992366", + "v": 103.31 + }, + { + "t": "2026-07-21T05:17:58.992366", + "v": 103.3529 + }, + { + "t": "2026-07-21T06:17:58.992366", + "v": 103.3869 + }, + { + "t": "2026-07-21T07:17:58.992366", + "v": 103.5123 + }, + { + "t": "2026-07-21T08:17:58.992366", + "v": 103.2698 + }, + { + "t": "2026-07-21T09:17:58.992366", + "v": 103.3695 + }, + { + "t": "2026-07-21T10:17:58.992366", + "v": 103.5608 + }, + { + "t": "2026-07-21T11:17:58.992366", + "v": 103.6525 + }, + { + "t": "2026-07-21T12:17:58.992366", + "v": 103.6612 + }, + { + "t": "2026-07-21T13:17:58.992366", + "v": 103.7425 + }, + { + "t": "2026-07-21T14:17:58.992366", + "v": 103.7187 + }, + { + "t": "2026-07-21T15:17:58.992366", + "v": 103.5761 + }, + { + "t": "2026-07-21T16:17:58.992366", + "v": 103.5585 + }, + { + "t": "2026-07-21T17:17:58.992366", + "v": 103.5738 + }, + { + "t": "2026-07-21T18:17:58.992366", + "v": 103.6775 + }, + { + "t": "2026-07-21T19:17:58.992366", + "v": 103.6829 + }, + { + "t": "2026-07-21T20:17:58.992366", + "v": 103.6791 + }, + { + "t": "2026-07-21T21:17:58.992366", + "v": 103.7644 + }, + { + "t": "2026-07-21T22:17:58.992366", + "v": 103.7624 + }, + { + "t": "2026-07-21T23:17:58.992366", + "v": 103.7815 + }, + { + "t": "2026-07-22T00:17:58.992366", + "v": 103.7142 + }, + { + "t": "2026-07-22T01:17:58.992366", + "v": 103.8143 + }, + { + "t": "2026-07-22T02:17:58.992366", + "v": 103.9506 + }, + { + "t": "2026-07-22T03:17:58.992366", + "v": 103.9859 + }, + { + "t": "2026-07-22T04:17:58.992366", + "v": 104.1046 + }, + { + "t": "2026-07-22T05:17:58.992366", + "v": 104.0867 + }, + { + "t": "2026-07-22T06:17:58.992366", + "v": 104.0266 + }, + { + "t": "2026-07-22T07:17:58.992366", + "v": 104.0115 + }, + { + "t": "2026-07-22T08:17:58.992366", + "v": 104.0212 + }, + { + "t": "2026-07-22T09:17:58.992366", + "v": 104.0784 + }, + { + "t": "2026-07-22T10:17:58.992366", + "v": 104.0018 + }, + { + "t": "2026-07-22T11:17:58.992366", + "v": 103.8927 + }, + { + "t": "2026-07-22T12:17:58.992366", + "v": 103.8339 + }, + { + "t": "2026-07-22T13:17:58.992366", + "v": 103.8543 + }, + { + "t": "2026-07-22T14:17:58.992366", + "v": 103.7033 + }, + { + "t": "2026-07-22T15:17:58.992366", + "v": 103.7118 + }, + { + "t": "2026-07-22T16:17:58.992366", + "v": 103.7327 + }, + { + "t": "2026-07-22T17:17:58.992366", + "v": 103.7399 + }, + { + "t": "2026-07-22T18:17:58.992366", + "v": 103.8626 + }, + { + "t": "2026-07-22T19:17:58.992366", + "v": 103.8571 + }, + { + "t": "2026-07-22T20:17:58.992366", + "v": 103.7789 + }, + { + "t": "2026-07-22T21:17:58.992366", + "v": 103.732 + }, + { + "t": "2026-07-22T22:17:58.992366", + "v": 103.7743 + }, + { + "t": "2026-07-22T23:17:58.992366", + "v": 103.859 + }, + { + "t": "2026-07-23T00:17:58.992366", + "v": 103.7778 + }, + { + "t": "2026-07-23T01:17:58.992366", + "v": 103.8148 + }, + { + "t": "2026-07-23T02:17:58.992366", + "v": 103.7318 + }, + { + "t": "2026-07-23T03:17:58.992366", + "v": 103.6115 + }, + { + "t": "2026-07-23T04:17:58.992366", + "v": 103.5363 + }, + { + "t": "2026-07-23T05:17:58.992366", + "v": 103.555 + }, + { + "t": "2026-07-23T06:17:58.992366", + "v": 103.5551 + }, + { + "t": "2026-07-23T07:17:58.992366", + "v": 103.795 + }, + { + "t": "2026-07-23T08:17:58.992366", + "v": 103.7549 + }, + { + "t": "2026-07-23T09:17:58.992366", + "v": 103.8502 + }, + { + "t": "2026-07-23T10:17:58.992366", + "v": 103.8454 + }, + { + "t": "2026-07-23T11:17:58.992366", + "v": 103.8349 + }, + { + "t": "2026-07-23T12:17:58.992366", + "v": 103.9579 + }, + { + "t": "2026-07-23T13:17:58.992366", + "v": 103.9212 + }, + { + "t": "2026-07-23T14:17:58.992366", + "v": 103.8521 + }, + { + "t": "2026-07-23T15:17:58.992366", + "v": 103.9435 + }, + { + "t": "2026-07-23T16:17:58.992366", + "v": 104.0856 + }, + { + "t": "2026-07-23T17:17:58.992366", + "v": 103.9664 + }, + { + "t": "2026-07-23T18:17:58.992366", + "v": 103.8893 + }, + { + "t": "2026-07-23T19:17:58.992366", + "v": 104.0516 + }, + { + "t": "2026-07-23T20:17:58.992366", + "v": 104.0083 + }, + { + "t": "2026-07-23T21:17:58.992366", + "v": 104.0597 + }, + { + "t": "2026-07-23T22:17:58.992366", + "v": 104.1062 + }, + { + "t": "2026-07-23T23:17:58.992366", + "v": 104.0825 + }, + { + "t": "2026-07-24T00:17:58.992366", + "v": 103.9507 + }, + { + "t": "2026-07-24T01:17:58.992366", + "v": 104.1456 + }, + { + "t": "2026-07-24T02:17:58.992366", + "v": 104.0621 + }, + { + "t": "2026-07-24T03:17:58.992366", + "v": 103.9644 + }, + { + "t": "2026-07-24T04:17:58.992366", + "v": 103.9625 + }, + { + "t": "2026-07-24T05:17:58.992366", + "v": 104.0221 + }, + { + "t": "2026-07-24T06:17:58.992366", + "v": 104.0918 + }, + { + "t": "2026-07-24T07:17:58.992366", + "v": 103.92 + }, + { + "t": "2026-07-24T08:17:58.992366", + "v": 103.8374 + }, + { + "t": "2026-07-24T09:17:58.992366", + "v": 103.7376 + }, + { + "t": "2026-07-24T10:17:58.992366", + "v": 103.9373 + }, + { + "t": "2026-07-24T11:17:58.992366", + "v": 103.9048 + }, + { + "t": "2026-07-24T12:17:58.992366", + "v": 103.9524 + }, + { + "t": "2026-07-24T13:17:58.992366", + "v": 103.839 + }, + { + "t": "2026-07-24T14:17:58.992366", + "v": 103.9931 + }, + { + "t": "2026-07-24T15:17:58.992366", + "v": 103.9774 + }, + { + "t": "2026-07-24T16:17:58.992366", + "v": 103.9338 + }, + { + "t": "2026-07-24T17:17:58.992366", + "v": 103.9638 + }, + { + "t": "2026-07-24T18:17:58.992366", + "v": 103.8717 + }, + { + "t": "2026-07-24T19:17:58.992366", + "v": 103.9228 + }, + { + "t": "2026-07-24T20:17:58.992366", + "v": 103.7942 + }, + { + "t": "2026-07-24T21:17:58.992366", + "v": 103.8517 + }, + { + "t": "2026-07-24T22:17:58.992366", + "v": 103.9427 + }, + { + "t": "2026-07-24T23:17:58.992366", + "v": 103.9764 + }, + { + "t": "2026-07-25T00:17:58.992366", + "v": 103.9734 + }, + { + "t": "2026-07-25T01:17:58.992366", + "v": 104.0415 + }, + { + "t": "2026-07-25T02:17:58.992366", + "v": 104.2863 + }, + { + "t": "2026-07-25T03:17:58.992366", + "v": 104.2455 + }, + { + "t": "2026-07-25T04:17:58.992366", + "v": 104.3238 + }, + { + "t": "2026-07-25T05:17:58.992366", + "v": 104.2286 + }, + { + "t": "2026-07-25T06:17:58.992366", + "v": 104.0662 + }, + { + "t": "2026-07-25T07:17:58.992366", + "v": 104.0214 + }, + { + "t": "2026-07-25T08:17:58.992366", + "v": 104.0784 + }, + { + "t": "2026-07-25T09:17:58.992366", + "v": 104.2316 + }, + { + "t": "2026-07-25T10:17:58.992366", + "v": 104.3798 + }, + { + "t": "2026-07-25T11:17:58.992366", + "v": 104.3906 + }, + { + "t": "2026-07-25T12:17:58.992366", + "v": 104.2461 + }, + { + "t": "2026-07-25T13:17:58.992366", + "v": 104.1558 + }, + { + "t": "2026-07-25T14:17:58.992366", + "v": 104.239 + }, + { + "t": "2026-07-25T15:17:58.992366", + "v": 104.0855 + }, + { + "t": "2026-07-25T16:17:58.992366", + "v": 103.9321 + }, + { + "t": "2026-07-25T17:17:58.992366", + "v": 103.9904 + }, + { + "t": "2026-07-25T18:17:58.992366", + "v": 103.9449 + }, + { + "t": "2026-07-25T19:17:58.992366", + "v": 103.8462 + }, + { + "t": "2026-07-25T20:17:58.992366", + "v": 103.9669 + }, + { + "t": "2026-07-25T21:17:58.992366", + "v": 103.9794 + }, + { + "t": "2026-07-25T22:17:58.992366", + "v": 104.0566 + }, + { + "t": "2026-07-25T23:17:58.992366", + "v": 104.1255 + }, + { + "t": "2026-07-26T00:17:58.992366", + "v": 104.1776 + }, + { + "t": "2026-07-26T01:17:58.992366", + "v": 104.0626 + }, + { + "t": "2026-07-26T02:17:58.992366", + "v": 104.1204 + }, + { + "t": "2026-07-26T03:17:58.992366", + "v": 104.106 + }, + { + "t": "2026-07-26T04:17:58.992366", + "v": 104.1072 + }, + { + "t": "2026-07-26T05:17:58.992366", + "v": 104.0405 + }, + { + "t": "2026-07-26T06:17:58.992366", + "v": 104.0442 + }, + { + "t": "2026-07-26T07:17:58.992366", + "v": 104.084 + }, + { + "t": "2026-07-26T08:17:58.992366", + "v": 104.0272 + }, + { + "t": "2026-07-26T09:17:58.992366", + "v": 103.994 + }, + { + "t": "2026-07-26T10:17:58.992366", + "v": 103.8363 + }, + { + "t": "2026-07-26T11:17:58.992366", + "v": 103.7469 + }, + { + "t": "2026-07-26T12:17:58.992366", + "v": 103.8069 + }, + { + "t": "2026-07-26T13:17:58.992366", + "v": 103.6844 + }, + { + "t": "2026-07-26T14:17:58.992366", + "v": 103.6561 + }, + { + "t": "2026-07-26T15:17:58.992366", + "v": 103.7691 + }, + { + "t": "2026-07-26T16:17:58.992366", + "v": 103.5099 + }, + { + "t": "2026-07-26T17:17:58.992366", + "v": 103.5142 + }, + { + "t": "2026-07-26T18:17:58.992366", + "v": 103.5453 + }, + { + "t": "2026-07-26T19:17:58.992366", + "v": 103.6743 + }, + { + "t": "2026-07-26T20:17:58.992366", + "v": 103.4565 + }, + { + "t": "2026-07-26T21:17:58.992366", + "v": 103.4333 + }, + { + "t": "2026-07-26T22:17:58.992366", + "v": 103.4874 + }, + { + "t": "2026-07-26T23:17:58.992366", + "v": 103.4958 + }, + { + "t": "2026-07-27T00:17:58.992366", + "v": 103.3098 + }, + { + "t": "2026-07-27T01:17:58.992366", + "v": 103.2811 + }, + { + "t": "2026-07-27T02:17:58.992366", + "v": 103.1748 + }, + { + "t": "2026-07-27T03:17:58.992366", + "v": 103.3365 + }, + { + "t": "2026-07-27T04:17:58.992366", + "v": 103.3768 + }, + { + "t": "2026-07-27T05:17:58.992366", + "v": 103.299 + }, + { + "t": "2026-07-27T06:17:58.992366", + "v": 103.2474 + }, + { + "t": "2026-07-27T07:17:58.992366", + "v": 103.219 + }, + { + "t": "2026-07-27T08:17:58.992366", + "v": 103.1673 + }, + { + "t": "2026-07-27T09:17:58.992366", + "v": 103.1562 + }, + { + "t": "2026-07-27T10:17:58.992366", + "v": 103.0953 + }, + { + "t": "2026-07-27T11:17:58.992366", + "v": 103.1947 + }, + { + "t": "2026-07-27T12:17:58.992366", + "v": 103.213 + }, + { + "t": "2026-07-27T13:17:58.992366", + "v": 103.2469 + }, + { + "t": "2026-07-27T14:17:58.992366", + "v": 103.3257 + }, + { + "t": "2026-07-27T15:17:58.992366", + "v": 103.2643 + }, + { + "t": "2026-07-27T16:17:58.992366", + "v": 103.3564 + }, + { + "t": "2026-07-27T17:17:58.992366", + "v": 103.3783 + }, + { + "t": "2026-07-27T18:17:58.992366", + "v": 103.4636 + }, + { + "t": "2026-07-27T19:17:58.992366", + "v": 103.3226 + }, + { + "t": "2026-07-27T20:17:58.992366", + "v": 103.5515 + }, + { + "t": "2026-07-27T21:17:58.992366", + "v": 103.4432 + }, + { + "t": "2026-07-27T22:17:58.992366", + "v": 103.4212 + }, + { + "t": "2026-07-27T23:17:58.992366", + "v": 103.4457 + }, + { + "t": "2026-07-28T00:17:58.992366", + "v": 103.3597 + }, + { + "t": "2026-07-28T01:17:58.992366", + "v": 102.9168 + }, + { + "t": "2026-07-28T02:17:58.992366", + "v": 102.8404 + }, + { + "t": "2026-07-28T03:17:58.992366", + "v": 102.6834 + }, + { + "t": "2026-07-28T04:17:58.992366", + "v": 102.6751 + }, + { + "t": "2026-07-28T05:17:58.992366", + "v": 102.6113 + }, + { + "t": "2026-07-28T06:17:58.992366", + "v": 102.5995 + }, + { + "t": "2026-07-28T07:17:58.992366", + "v": 102.5293 + }, + { + "t": "2026-07-28T08:17:58.992366", + "v": 102.5069 + }, + { + "t": "2026-07-28T09:17:58.992366", + "v": 102.5636 + }, + { + "t": "2026-07-28T10:17:58.992366", + "v": 102.5723 + }, + { + "t": "2026-07-28T11:17:58.992366", + "v": 102.4983 + }, + { + "t": "2026-07-28T12:17:58.992366", + "v": 102.4197 + }, + { + "t": "2026-07-28T13:17:58.992366", + "v": 102.3932 + }, + { + "t": "2026-07-28T14:17:58.992366", + "v": 102.4424 + }, + { + "t": "2026-07-28T15:17:58.992366", + "v": 102.524 + }, + { + "t": "2026-07-28T16:17:58.992366", + "v": 102.301 + }, + { + "t": "2026-07-28T17:17:58.992366", + "v": 102.2453 + }, + { + "t": "2026-07-28T18:17:58.992366", + "v": 102.2656 + }, + { + "t": "2026-07-28T19:17:58.992366", + "v": 102.44 + }, + { + "t": "2026-07-28T20:17:58.992366", + "v": 102.4019 + }, + { + "t": "2026-07-28T21:17:58.992366", + "v": 102.3825 + }, + { + "t": "2026-07-28T22:17:58.992366", + "v": 102.3498 + }, + { + "t": "2026-07-28T23:17:58.992366", + "v": 102.2385 + }, + { + "t": "2026-07-29T00:17:58.992366", + "v": 102.3218 + }, + { + "t": "2026-07-29T01:17:58.992366", + "v": 102.3608 + }, + { + "t": "2026-07-29T02:17:58.992366", + "v": 102.3672 + }, + { + "t": "2026-07-29T03:17:58.992366", + "v": 102.2394 + }, + { + "t": "2026-07-29T04:17:58.992366", + "v": 102.3342 + }, + { + "t": "2026-07-29T05:17:58.992366", + "v": 102.3859 + }, + { + "t": "2026-07-29T06:17:58.992366", + "v": 102.3963 + }, + { + "t": "2026-07-29T07:17:58.992366", + "v": 102.342 + }, + { + "t": "2026-07-29T08:17:58.992366", + "v": 102.3355 + }, + { + "t": "2026-07-29T09:17:58.992366", + "v": 102.4464 + }, + { + "t": "2026-07-29T10:17:58.992366", + "v": 102.3763 + }, + { + "t": "2026-07-29T11:17:58.992366", + "v": 102.2974 + }, + { + "t": "2026-07-29T12:17:58.992366", + "v": 102.2495 + }, + { + "t": "2026-07-29T13:17:58.992366", + "v": 102.0743 + }, + { + "t": "2026-07-29T14:17:58.992366", + "v": 102.1546 + }, + { + "t": "2026-07-29T15:17:58.992366", + "v": 102.0773 + }, + { + "t": "2026-07-29T16:17:58.992366", + "v": 102.1171 + }, + { + "t": "2026-07-29T17:17:58.992366", + "v": 102.3644 + }, + { + "t": "2026-07-29T18:17:58.992366", + "v": 102.3293 + }, + { + "t": "2026-07-29T19:17:58.992366", + "v": 102.2887 + }, + { + "t": "2026-07-29T20:17:58.992366", + "v": 102.2873 + }, + { + "t": "2026-07-29T21:17:58.992366", + "v": 102.2089 + }, + { + "t": "2026-07-29T22:17:58.992366", + "v": 102.2387 + }, + { + "t": "2026-07-29T23:17:58.992366", + "v": 102.3318 + }, + { + "t": "2026-07-30T00:17:58.992366", + "v": 102.3859 + }, + { + "t": "2026-07-30T01:17:58.992366", + "v": 102.3889 + }, + { + "t": "2026-07-30T02:17:58.992366", + "v": 102.4414 + }, + { + "t": "2026-07-30T03:17:58.992366", + "v": 102.4674 + }, + { + "t": "2026-07-30T04:17:58.992366", + "v": 102.5094 + }, + { + "t": "2026-07-30T05:17:58.992366", + "v": 102.541 + }, + { + "t": "2026-07-30T06:17:58.992366", + "v": 102.6278 + }, + { + "t": "2026-07-30T07:17:58.992366", + "v": 102.5083 + }, + { + "t": "2026-07-30T08:17:58.992366", + "v": 102.4731 + }, + { + "t": "2026-07-30T09:17:58.992366", + "v": 102.4452 + }, + { + "t": "2026-07-30T10:17:58.992366", + "v": 102.2988 + }, + { + "t": "2026-07-30T11:17:58.992366", + "v": 102.2947 + }, + { + "t": "2026-07-30T12:17:58.992366", + "v": 102.3816 + }, + { + "t": "2026-07-30T13:17:58.992366", + "v": 102.4348 + }, + { + "t": "2026-07-30T14:17:58.992366", + "v": 102.4297 + }, + { + "t": "2026-07-30T15:17:58.992366", + "v": 102.4726 + }, + { + "t": "2026-07-30T16:17:58.992366", + "v": 102.4321 + }, + { + "t": "2026-07-30T17:17:58.992366", + "v": 102.5106 + }, + { + "t": "2026-07-30T18:17:58.992366", + "v": 102.5512 + }, + { + "t": "2026-07-30T19:17:58.992366", + "v": 102.7259 + }, + { + "t": "2026-07-30T20:17:58.992366", + "v": 102.8616 + }, + { + "t": "2026-07-30T21:17:58.992366", + "v": 102.9095 + }, + { + "t": "2026-07-30T22:17:58.992366", + "v": 103.0087 + }, + { + "t": "2026-07-30T23:17:58.992366", + "v": 103.0724 + }, + { + "t": "2026-07-31T00:17:58.992366", + "v": 103.2799 + }, + { + "t": "2026-07-31T01:17:58.992366", + "v": 103.4837 + }, + { + "t": "2026-07-31T02:17:58.992366", + "v": 103.3967 + }, + { + "t": "2026-07-31T03:17:58.992366", + "v": 103.2611 + }, + { + "t": "2026-07-31T04:17:58.992366", + "v": 103.4601 + }, + { + "t": "2026-07-31T05:17:58.992366", + "v": 103.4167 + }, + { + "t": "2026-07-31T06:17:58.992366", + "v": 103.5386 + }, + { + "t": "2026-07-31T07:17:58.992366", + "v": 103.7667 + }, + { + "t": "2026-07-31T08:17:58.992366", + "v": 103.6977 + }, + { + "t": "2026-07-31T09:17:58.992366", + "v": 103.7973 + }, + { + "t": "2026-07-31T10:17:58.992366", + "v": 104.1511 + }, + { + "t": "2026-07-31T11:17:58.992366", + "v": 104.1649 + }, + { + "t": "2026-07-31T12:17:58.992366", + "v": 104.1429 + }, + { + "t": "2026-07-31T13:17:58.992366", + "v": 104.0453 + }, + { + "t": "2026-07-31T14:17:58.992366", + "v": 104.0354 + }, + { + "t": "2026-07-31T15:17:58.992366", + "v": 104.0725 + }, + { + "t": "2026-07-31T16:17:58.992366", + "v": 104.1696 + }, + { + "t": "2026-07-31T17:17:58.992366", + "v": 104.2551 + }, + { + "t": "2026-07-31T18:17:58.992366", + "v": 104.1841 + }, + { + "t": "2026-07-31T19:17:58.992366", + "v": 104.273 + }, + { + "t": "2026-07-31T20:17:58.992366", + "v": 104.2296 + }, + { + "t": "2026-07-31T21:17:58.992366", + "v": 104.2232 + }, + { + "t": "2026-07-31T22:17:58.992366", + "v": 104.1049 + }, + { + "t": "2026-07-31T23:17:58.992366", + "v": 104.0985 + }, + { + "t": "2026-08-01T00:17:58.992366", + "v": 104.0787 + }, + { + "t": "2026-08-01T01:17:58.992366", + "v": 104.1788 + }, + { + "t": "2026-08-01T02:17:58.992366", + "v": 104.2106 + }, + { + "t": "2026-08-01T03:17:58.992366", + "v": 104.0454 + }, + { + "t": "2026-08-01T04:17:58.992366", + "v": 103.9878 + }, + { + "t": "2026-08-01T05:17:58.992366", + "v": 104.0161 + }, + { + "t": "2026-08-01T06:17:58.992366", + "v": 104.062 + }, + { + "t": "2026-08-01T07:17:58.992366", + "v": 104.2309 + }, + { + "t": "2026-08-01T08:17:58.992366", + "v": 104.2812 + }, + { + "t": "2026-08-01T09:17:58.992366", + "v": 104.1925 + }, + { + "t": "2026-08-01T10:17:58.992366", + "v": 104.2924 + }, + { + "t": "2026-08-01T11:17:58.992366", + "v": 104.2169 + }, + { + "t": "2026-08-01T12:17:58.992366", + "v": 104.2624 + }, + { + "t": "2026-08-01T13:17:58.992366", + "v": 104.3052 + }, + { + "t": "2026-08-01T14:17:58.992366", + "v": 104.3528 + }, + { + "t": "2026-08-01T15:17:58.992366", + "v": 104.4247 + }, + { + "t": "2026-08-01T16:17:58.992366", + "v": 104.3432 + }, + { + "t": "2026-08-01T17:17:58.992366", + "v": 104.4918 + }, + { + "t": "2026-08-01T18:17:58.992366", + "v": 104.4519 + }, + { + "t": "2026-08-01T19:17:58.992366", + "v": 104.5932 + }, + { + "t": "2026-08-01T20:17:58.992366", + "v": 104.5498 + }, + { + "t": "2026-08-01T21:17:58.992366", + "v": 104.6192 + }, + { + "t": "2026-08-01T22:17:58.992366", + "v": 104.6624 + }, + { + "t": "2026-08-01T23:17:58.992366", + "v": 104.8084 + }, + { + "t": "2026-08-02T00:17:58.992366", + "v": 104.7862 + }, + { + "t": "2026-08-02T01:17:58.992366", + "v": 104.9303 + }, + { + "t": "2026-08-02T02:17:58.992366", + "v": 105.4542 + }, + { + "t": "2026-08-02T03:17:58.992366", + "v": 105.3406 + }, + { + "t": "2026-08-02T04:17:58.992366", + "v": 105.3362 + }, + { + "t": "2026-08-02T05:17:58.992366", + "v": 105.2625 + }, + { + "t": "2026-08-02T06:17:58.992366", + "v": 105.4342 + }, + { + "t": "2026-08-02T07:17:58.992366", + "v": 105.3983 + }, + { + "t": "2026-08-02T08:17:58.992366", + "v": 105.3472 + }, + { + "t": "2026-08-02T09:17:58.992366", + "v": 105.3153 + }, + { + "t": "2026-08-02T10:17:58.992366", + "v": 106.3353 + }, + { + "t": "2026-08-02T11:17:58.992366", + "v": 106.3599 + }, + { + "t": "2026-08-02T12:17:58.992366", + "v": 106.4569 + }, + { + "t": "2026-08-02T13:17:58.992366", + "v": 106.4964 + }, + { + "t": "2026-08-02T14:17:58.992366", + "v": 106.5451 + }, + { + "t": "2026-08-02T15:17:58.992366", + "v": 106.5719 + }, + { + "t": "2026-08-02T16:17:58.992366", + "v": 106.5309 + }, + { + "t": "2026-08-02T17:17:58.992366", + "v": 106.6781 + }, + { + "t": "2026-08-02T18:17:58.992366", + "v": 106.6981 + }, + { + "t": "2026-08-02T19:17:58.992366", + "v": 106.6716 + }, + { + "t": "2026-08-02T20:17:58.992366", + "v": 106.5569 + }, + { + "t": "2026-08-02T21:17:58.992366", + "v": 106.4392 + }, + { + "t": "2026-08-02T22:17:58.992366", + "v": 106.5159 + }, + { + "t": "2026-08-02T23:17:58.992366", + "v": 106.5876 + }, + { + "t": "2026-08-03T00:17:58.992366", + "v": 106.6554 + }, + { + "t": "2026-08-03T01:17:58.992366", + "v": 106.6148 + }, + { + "t": "2026-08-03T02:17:58.992366", + "v": 106.6041 + }, + { + "t": "2026-08-03T03:17:58.992366", + "v": 106.5114 + }, + { + "t": "2026-08-03T04:17:58.992366", + "v": 106.6166 + }, + { + "t": "2026-08-03T05:17:58.992366", + "v": 106.4398 + }, + { + "t": "2026-08-03T06:17:58.992366", + "v": 106.6268 + }, + { + "t": "2026-08-03T07:17:58.992366", + "v": 106.5604 + }, + { + "t": "2026-08-03T08:17:58.992366", + "v": 106.6786 + }, + { + "t": "2026-08-03T09:17:58.992366", + "v": 106.7948 + }, + { + "t": "2026-08-03T10:17:58.992366", + "v": 106.7592 + }, + { + "t": "2026-08-03T11:17:58.992366", + "v": 106.7278 + }, + { + "t": "2026-08-03T12:17:58.992366", + "v": 106.5488 + }, + { + "t": "2026-08-03T13:17:58.992366", + "v": 106.506 + }, + { + "t": "2026-08-03T14:17:58.992366", + "v": 106.5283 + }, + { + "t": "2026-08-03T15:17:58.992366", + "v": 106.6893 + }, + { + "t": "2026-08-03T16:17:58.992366", + "v": 106.7035 + }, + { + "t": "2026-08-03T17:17:58.992366", + "v": 106.5251 + }, + { + "t": "2026-08-03T18:17:58.992366", + "v": 106.5333 + }, + { + "t": "2026-08-03T19:17:58.992366", + "v": 106.623 + }, + { + "t": "2026-08-03T20:17:58.992366", + "v": 106.5996 + }, + { + "t": "2026-08-03T21:17:58.992366", + "v": 106.4952 + }, + { + "t": "2026-08-03T22:17:58.992366", + "v": 106.5074 + }, + { + "t": "2026-08-03T23:17:58.992366", + "v": 106.4447 + }, + { + "t": "2026-08-04T00:17:58.992366", + "v": 106.4033 + }, + { + "t": "2026-08-04T01:17:58.992366", + "v": 106.2839 + }, + { + "t": "2026-08-04T02:17:58.992366", + "v": 106.3091 + }, + { + "t": "2026-08-04T03:17:58.992366", + "v": 106.345 + }, + { + "t": "2026-08-04T04:17:58.992366", + "v": 106.3616 + }, + { + "t": "2026-08-04T05:17:58.992366", + "v": 106.2818 + } + ], + "trades": [ + { + "time": "2026-07-19 18:17", + "side": "BUY", + "size": 0.0017, + "price": 60065.3, + "pnl": 0.2107 + }, + { + "time": "2026-07-19 19:17", + "side": "SELL", + "size": 0.002, + "price": 61287.8, + "pnl": -0.1631 + }, + { + "time": "2026-07-19 23:17", + "side": "BUY", + "size": 0.0007, + "price": 62383.1, + "pnl": 0.126 + }, + { + "time": "2026-07-20 00:17", + "side": "SELL", + "size": 0.0009, + "price": 60172.0, + "pnl": -0.1549 + }, + { + "time": "2026-07-20 04:17", + "side": "SELL", + "size": 0.0018, + "price": 63724.4, + "pnl": -0.1309 + }, + { + "time": "2026-07-20 07:17", + "side": "SELL", + "size": 0.002, + "price": 61609.4, + "pnl": -0.1495 + }, + { + "time": "2026-07-20 11:17", + "side": "BUY", + "size": 0.0007, + "price": 62937.4, + "pnl": 0.2004 + }, + { + "time": "2026-07-20 14:17", + "side": "SELL", + "size": 0.001, + "price": 62211.0, + "pnl": -0.1485 + }, + { + "time": "2026-07-20 15:17", + "side": "SELL", + "size": 0.0011, + "price": 62820.6, + "pnl": -0.1138 + }, + { + "time": "2026-07-20 16:17", + "side": "SELL", + "size": 0.0008, + "price": 62998.4, + "pnl": -0.1392 + }, + { + "time": "2026-07-20 18:17", + "side": "BUY", + "size": 0.0014, + "price": 64166.9, + "pnl": 0.1289 + }, + { + "time": "2026-07-20 21:17", + "side": "BUY", + "size": 0.001, + "price": 60621.9, + "pnl": 0.1267 + }, + { + "time": "2026-07-20 23:17", + "side": "BUY", + "size": 0.0014, + "price": 62454.1, + "pnl": 0.1389 + }, + { + "time": "2026-07-21 00:17", + "side": "BUY", + "size": 0.0018, + "price": 64715.0, + "pnl": 0.118 + }, + { + "time": "2026-07-21 03:17", + "side": "BUY", + "size": 0.0008, + "price": 61523.9, + "pnl": 0.132 + }, + { + "time": "2026-07-21 07:17", + "side": "BUY", + "size": 0.0015, + "price": 63770.0, + "pnl": 0.1254 + }, + { + "time": "2026-07-21 08:17", + "side": "SELL", + "size": 0.0014, + "price": 64345.3, + "pnl": -0.2425 + }, + { + "time": "2026-07-21 10:17", + "side": "BUY", + "size": 0.0018, + "price": 63734.1, + "pnl": 0.1912 + }, + { + "time": "2026-07-21 15:17", + "side": "SELL", + "size": 0.0015, + "price": 61216.5, + "pnl": -0.1426 + }, + { + "time": "2026-07-22 02:17", + "side": "BUY", + "size": 0.0012, + "price": 61081.6, + "pnl": 0.1364 + }, + { + "time": "2026-07-22 04:17", + "side": "BUY", + "size": 0.0012, + "price": 61086.9, + "pnl": 0.1187 + }, + { + "time": "2026-07-22 11:17", + "side": "SELL", + "size": 0.0018, + "price": 64311.6, + "pnl": -0.1091 + }, + { + "time": "2026-07-22 14:17", + "side": "SELL", + "size": 0.0014, + "price": 61549.9, + "pnl": -0.1511 + }, + { + "time": "2026-07-22 18:17", + "side": "BUY", + "size": 0.002, + "price": 64986.9, + "pnl": 0.1227 + }, + { + "time": "2026-07-23 03:17", + "side": "SELL", + "size": 0.001, + "price": 60547.4, + "pnl": -0.1203 + }, + { + "time": "2026-07-23 07:17", + "side": "BUY", + "size": 0.0008, + "price": 60426.9, + "pnl": 0.2399 + }, + { + "time": "2026-07-23 12:17", + "side": "BUY", + "size": 0.0005, + "price": 62111.2, + "pnl": 0.123 + }, + { + "time": "2026-07-23 16:17", + "side": "BUY", + "size": 0.0006, + "price": 62862.2, + "pnl": 0.1421 + }, + { + "time": "2026-07-23 17:17", + "side": "SELL", + "size": 0.0012, + "price": 62413.6, + "pnl": -0.1192 + }, + { + "time": "2026-07-23 19:17", + "side": "BUY", + "size": 0.0006, + "price": 62011.2, + "pnl": 0.1623 + }, + { + "time": "2026-07-24 00:17", + "side": "SELL", + "size": 0.0014, + "price": 64308.8, + "pnl": -0.1318 + }, + { + "time": "2026-07-24 01:17", + "side": "BUY", + "size": 0.0015, + "price": 64756.1, + "pnl": 0.1949 + }, + { + "time": "2026-07-24 07:17", + "side": "SELL", + "size": 0.0005, + "price": 62257.4, + "pnl": -0.1718 + }, + { + "time": "2026-07-24 10:17", + "side": "BUY", + "size": 0.0019, + "price": 61493.3, + "pnl": 0.1997 + }, + { + "time": "2026-07-24 13:17", + "side": "SELL", + "size": 0.002, + "price": 60620.8, + "pnl": -0.1134 + }, + { + "time": "2026-07-24 14:17", + "side": "BUY", + "size": 0.0016, + "price": 63223.7, + "pnl": 0.1542 + }, + { + "time": "2026-07-24 20:17", + "side": "SELL", + "size": 0.0017, + "price": 64644.9, + "pnl": -0.1285 + }, + { + "time": "2026-07-25 02:17", + "side": "BUY", + "size": 0.0007, + "price": 60253.2, + "pnl": 0.2448 + }, + { + "time": "2026-07-25 06:17", + "side": "SELL", + "size": 0.0013, + "price": 64017.1, + "pnl": -0.1624 + }, + { + "time": "2026-07-25 09:17", + "side": "BUY", + "size": 0.0016, + "price": 64977.8, + "pnl": 0.1532 + }, + { + "time": "2026-07-25 10:17", + "side": "BUY", + "size": 0.0006, + "price": 61044.0, + "pnl": 0.1483 + }, + { + "time": "2026-07-25 12:17", + "side": "SELL", + "size": 0.0007, + "price": 62711.1, + "pnl": -0.1445 + }, + { + "time": "2026-07-25 15:17", + "side": "SELL", + "size": 0.0014, + "price": 62172.6, + "pnl": -0.1535 + }, + { + "time": "2026-07-25 16:17", + "side": "SELL", + "size": 0.0012, + "price": 62765.2, + "pnl": -0.1534 + }, + { + "time": "2026-07-25 20:17", + "side": "BUY", + "size": 0.0005, + "price": 62505.6, + "pnl": 0.1207 + }, + { + "time": "2026-07-26 01:17", + "side": "SELL", + "size": 0.0008, + "price": 62500.5, + "pnl": -0.1151 + }, + { + "time": "2026-07-26 10:17", + "side": "SELL", + "size": 0.0008, + "price": 62686.8, + "pnl": -0.1577 + }, + { + "time": "2026-07-26 13:17", + "side": "SELL", + "size": 0.0017, + "price": 63095.7, + "pnl": -0.1224 + }, + { + "time": "2026-07-26 15:17", + "side": "BUY", + "size": 0.0005, + "price": 64886.7, + "pnl": 0.113 + }, + { + "time": "2026-07-26 16:17", + "side": "SELL", + "size": 0.001, + "price": 64427.8, + "pnl": -0.2592 + }, + { + "time": "2026-07-26 19:17", + "side": "BUY", + "size": 0.0011, + "price": 60899.5, + "pnl": 0.129 + }, + { + "time": "2026-07-26 20:17", + "side": "SELL", + "size": 0.0007, + "price": 61928.5, + "pnl": -0.2178 + }, + { + "time": "2026-07-27 00:17", + "side": "SELL", + "size": 0.002, + "price": 61842.6, + "pnl": -0.1859 + }, + { + "time": "2026-07-27 02:17", + "side": "SELL", + "size": 0.0018, + "price": 61531.2, + "pnl": -0.1063 + }, + { + "time": "2026-07-27 03:17", + "side": "BUY", + "size": 0.0014, + "price": 60760.0, + "pnl": 0.1617 + }, + { + "time": "2026-07-27 19:17", + "side": "SELL", + "size": 0.0009, + "price": 62220.5, + "pnl": -0.141 + }, + { + "time": "2026-07-27 20:17", + "side": "BUY", + "size": 0.0008, + "price": 61206.3, + "pnl": 0.2289 + }, + { + "time": "2026-07-27 21:17", + "side": "SELL", + "size": 0.0006, + "price": 63926.3, + "pnl": -0.1083 + }, + { + "time": "2026-07-28 01:17", + "side": "SELL", + "size": 0.0016, + "price": 60705.3, + "pnl": -0.4429 + }, + { + "time": "2026-07-28 03:17", + "side": "SELL", + "size": 0.0007, + "price": 60907.9, + "pnl": -0.157 + }, + { + "time": "2026-07-28 16:17", + "side": "SELL", + "size": 0.001, + "price": 64654.7, + "pnl": -0.223 + }, + { + "time": "2026-07-28 19:17", + "side": "BUY", + "size": 0.0009, + "price": 63048.2, + "pnl": 0.1744 + }, + { + "time": "2026-07-28 23:17", + "side": "SELL", + "size": 0.0011, + "price": 60450.4, + "pnl": -0.1113 + }, + { + "time": "2026-07-29 03:17", + "side": "SELL", + "size": 0.0012, + "price": 64241.9, + "pnl": -0.1279 + }, + { + "time": "2026-07-29 09:17", + "side": "BUY", + "size": 0.0019, + "price": 62128.9, + "pnl": 0.1109 + }, + { + "time": "2026-07-29 13:17", + "side": "SELL", + "size": 0.0018, + "price": 60606.5, + "pnl": -0.1751 + }, + { + "time": "2026-07-29 17:17", + "side": "BUY", + "size": 0.0011, + "price": 60120.3, + "pnl": 0.2473 + }, + { + "time": "2026-07-30 07:17", + "side": "SELL", + "size": 0.0012, + "price": 61003.2, + "pnl": -0.1194 + }, + { + "time": "2026-07-30 10:17", + "side": "SELL", + "size": 0.0009, + "price": 64388.8, + "pnl": -0.1464 + }, + { + "time": "2026-07-30 19:17", + "side": "BUY", + "size": 0.0013, + "price": 60651.0, + "pnl": 0.1746 + }, + { + "time": "2026-07-30 20:17", + "side": "BUY", + "size": 0.0012, + "price": 60533.3, + "pnl": 0.1357 + }, + { + "time": "2026-07-31 00:17", + "side": "BUY", + "size": 0.0013, + "price": 60860.6, + "pnl": 0.2076 + }, + { + "time": "2026-07-31 01:17", + "side": "BUY", + "size": 0.0019, + "price": 64024.8, + "pnl": 0.2038 + }, + { + "time": "2026-07-31 03:17", + "side": "SELL", + "size": 0.0006, + "price": 62483.1, + "pnl": -0.1356 + }, + { + "time": "2026-07-31 04:17", + "side": "BUY", + "size": 0.0013, + "price": 63944.5, + "pnl": 0.199 + }, + { + "time": "2026-07-31 06:17", + "side": "BUY", + "size": 0.0008, + "price": 64035.0, + "pnl": 0.1219 + }, + { + "time": "2026-07-31 07:17", + "side": "BUY", + "size": 0.0018, + "price": 62380.1, + "pnl": 0.2281 + }, + { + "time": "2026-07-31 10:17", + "side": "BUY", + "size": 0.0016, + "price": 60221.4, + "pnl": 0.3539 + }, + { + "time": "2026-07-31 22:17", + "side": "SELL", + "size": 0.0019, + "price": 61995.4, + "pnl": -0.1183 + }, + { + "time": "2026-08-01 03:17", + "side": "SELL", + "size": 0.0018, + "price": 64058.5, + "pnl": -0.1652 + }, + { + "time": "2026-08-01 07:17", + "side": "BUY", + "size": 0.0008, + "price": 60356.5, + "pnl": 0.169 + }, + { + "time": "2026-08-01 17:17", + "side": "BUY", + "size": 0.0017, + "price": 63385.8, + "pnl": 0.1486 + }, + { + "time": "2026-08-01 19:17", + "side": "BUY", + "size": 0.0009, + "price": 60966.4, + "pnl": 0.1413 + }, + { + "time": "2026-08-01 23:17", + "side": "BUY", + "size": 0.0006, + "price": 62566.1, + "pnl": 0.146 + }, + { + "time": "2026-08-02 01:17", + "side": "BUY", + "size": 0.0019, + "price": 60454.4, + "pnl": 0.1441 + }, + { + "time": "2026-08-02 02:17", + "side": "BUY", + "size": 0.0013, + "price": 63701.1, + "pnl": 0.5239 + }, + { + "time": "2026-08-02 03:17", + "side": "SELL", + "size": 0.0012, + "price": 61293.1, + "pnl": -0.1136 + }, + { + "time": "2026-08-02 06:17", + "side": "BUY", + "size": 0.0015, + "price": 61470.1, + "pnl": 0.1717 + }, + { + "time": "2026-08-02 10:17", + "side": "BUY", + "size": 0.0016, + "price": 62526.0, + "pnl": 1.02 + }, + { + "time": "2026-08-02 17:17", + "side": "BUY", + "size": 0.0012, + "price": 62603.2, + "pnl": 0.1472 + }, + { + "time": "2026-08-02 20:17", + "side": "SELL", + "size": 0.0017, + "price": 61558.4, + "pnl": -0.1146 + }, + { + "time": "2026-08-02 21:17", + "side": "SELL", + "size": 0.0015, + "price": 62664.2, + "pnl": -0.1177 + }, + { + "time": "2026-08-03 05:17", + "side": "SELL", + "size": 0.0015, + "price": 64927.1, + "pnl": -0.1769 + }, + { + "time": "2026-08-03 06:17", + "side": "BUY", + "size": 0.0015, + "price": 64422.1, + "pnl": 0.1871 + }, + { + "time": "2026-08-03 08:17", + "side": "BUY", + "size": 0.0006, + "price": 61132.2, + "pnl": 0.1183 + }, + { + "time": "2026-08-03 09:17", + "side": "BUY", + "size": 0.0019, + "price": 62848.1, + "pnl": 0.1162 + }, + { + "time": "2026-08-03 12:17", + "side": "SELL", + "size": 0.0019, + "price": 60659.2, + "pnl": -0.179 + }, + { + "time": "2026-08-03 15:17", + "side": "BUY", + "size": 0.0007, + "price": 61216.3, + "pnl": 0.161 + }, + { + "time": "2026-08-03 17:17", + "side": "SELL", + "size": 0.001, + "price": 64309.3, + "pnl": -0.1783 + }, + { + "time": "2026-08-04 01:17", + "side": "SELL", + "size": 0.0015, + "price": 63141.6, + "pnl": -0.1194 + } + ], + "num_periods": 720, + "generated_at": "2026-08-04T06:17:58.999325" +} \ No newline at end of file diff --git a/backtests/results/queue_imb_20260804-061758.json b/backtests/results/queue_imb_20260804-061758.json new file mode 100644 index 0000000..412ad57 --- /dev/null +++ b/backtests/results/queue_imb_20260804-061758.json @@ -0,0 +1,3605 @@ +{ + "strategy": "Queue Imbalance", + "strategy_key": "queue_imb", + "description": "Weighted LOB queue dynamics \u2014 Stoikov-Sa\u011flam framework", + "allocation": 100.0, + "start_time": "2026-07-05T06:17:58.828402", + "end_time": "2026-08-04T05:17:58.828402", + "start_equity": 100.0, + "end_equity": 105.7994, + "pnl": 5.7994, + "pnl_pct": 5.7994, + "ann_return_pct": 69.59, + "sharpe": 2.7685, + "sortino": 3.3764, + "max_dd": 0.0701, + "max_dd_pct": 7.01, + "win_rate": 0.5275, + "total_trades": 218, + "equity_curve": [ + { + "t": "2026-07-05T06:17:58.828402", + "v": 100.3978 + }, + { + "t": "2026-07-05T07:17:58.828402", + "v": 100.3072 + }, + { + "t": "2026-07-05T08:17:58.828402", + "v": 100.7654 + }, + { + "t": "2026-07-05T09:17:58.828402", + "v": 100.5655 + }, + { + "t": "2026-07-05T10:17:58.828402", + "v": 100.6552 + }, + { + "t": "2026-07-05T11:17:58.828402", + "v": 100.8453 + }, + { + "t": "2026-07-05T12:17:58.828402", + "v": 100.9403 + }, + { + "t": "2026-07-05T13:17:58.828402", + "v": 101.1903 + }, + { + "t": "2026-07-05T14:17:58.828402", + "v": 100.9542 + }, + { + "t": "2026-07-05T15:17:58.828402", + "v": 100.4326 + }, + { + "t": "2026-07-05T16:17:58.828402", + "v": 100.4915 + }, + { + "t": "2026-07-05T17:17:58.828402", + "v": 100.4343 + }, + { + "t": "2026-07-05T18:17:58.828402", + "v": 100.5381 + }, + { + "t": "2026-07-05T19:17:58.828402", + "v": 100.4707 + }, + { + "t": "2026-07-05T20:17:58.828402", + "v": 100.4686 + }, + { + "t": "2026-07-05T21:17:58.828402", + "v": 100.5591 + }, + { + "t": "2026-07-05T22:17:58.828402", + "v": 100.7038 + }, + { + "t": "2026-07-05T23:17:58.828402", + "v": 100.798 + }, + { + "t": "2026-07-06T00:17:58.828402", + "v": 100.6472 + }, + { + "t": "2026-07-06T01:17:58.828402", + "v": 100.6944 + }, + { + "t": "2026-07-06T02:17:58.828402", + "v": 100.7627 + }, + { + "t": "2026-07-06T03:17:58.828402", + "v": 100.4359 + }, + { + "t": "2026-07-06T04:17:58.828402", + "v": 100.2003 + }, + { + "t": "2026-07-06T05:17:58.828402", + "v": 100.4926 + }, + { + "t": "2026-07-06T06:17:58.828402", + "v": 100.6312 + }, + { + "t": "2026-07-06T07:17:58.828402", + "v": 100.4876 + }, + { + "t": "2026-07-06T08:17:58.828402", + "v": 100.7662 + }, + { + "t": "2026-07-06T09:17:58.828402", + "v": 100.5213 + }, + { + "t": "2026-07-06T10:17:58.828402", + "v": 100.4769 + }, + { + "t": "2026-07-06T11:17:58.828402", + "v": 100.533 + }, + { + "t": "2026-07-06T12:17:58.828402", + "v": 100.6824 + }, + { + "t": "2026-07-06T13:17:58.828402", + "v": 100.9066 + }, + { + "t": "2026-07-06T14:17:58.828402", + "v": 100.7142 + }, + { + "t": "2026-07-06T15:17:58.828402", + "v": 100.4268 + }, + { + "t": "2026-07-06T16:17:58.828402", + "v": 100.6029 + }, + { + "t": "2026-07-06T17:17:58.828402", + "v": 100.2036 + }, + { + "t": "2026-07-06T18:17:58.828402", + "v": 100.8161 + }, + { + "t": "2026-07-06T19:17:58.828402", + "v": 100.7288 + }, + { + "t": "2026-07-06T20:17:58.828402", + "v": 100.6414 + }, + { + "t": "2026-07-06T21:17:58.828402", + "v": 101.0172 + }, + { + "t": "2026-07-06T22:17:58.828402", + "v": 101.077 + }, + { + "t": "2026-07-06T23:17:58.828402", + "v": 101.0336 + }, + { + "t": "2026-07-07T00:17:58.828402", + "v": 101.0967 + }, + { + "t": "2026-07-07T01:17:58.828402", + "v": 100.939 + }, + { + "t": "2026-07-07T02:17:58.828402", + "v": 100.8653 + }, + { + "t": "2026-07-07T03:17:58.828402", + "v": 100.9474 + }, + { + "t": "2026-07-07T04:17:58.828402", + "v": 100.5894 + }, + { + "t": "2026-07-07T05:17:58.828402", + "v": 100.7932 + }, + { + "t": "2026-07-07T06:17:58.828402", + "v": 101.0591 + }, + { + "t": "2026-07-07T07:17:58.828402", + "v": 100.9985 + }, + { + "t": "2026-07-07T08:17:58.828402", + "v": 101.4925 + }, + { + "t": "2026-07-07T09:17:58.828402", + "v": 101.3007 + }, + { + "t": "2026-07-07T10:17:58.828402", + "v": 101.667 + }, + { + "t": "2026-07-07T11:17:58.828402", + "v": 101.2558 + }, + { + "t": "2026-07-07T12:17:58.828402", + "v": 101.4174 + }, + { + "t": "2026-07-07T13:17:58.828402", + "v": 101.3135 + }, + { + "t": "2026-07-07T14:17:58.828402", + "v": 101.6225 + }, + { + "t": "2026-07-07T15:17:58.828402", + "v": 101.1937 + }, + { + "t": "2026-07-07T16:17:58.828402", + "v": 101.1446 + }, + { + "t": "2026-07-07T17:17:58.828402", + "v": 100.921 + }, + { + "t": "2026-07-07T18:17:58.828402", + "v": 100.7612 + }, + { + "t": "2026-07-07T19:17:58.828402", + "v": 100.6004 + }, + { + "t": "2026-07-07T20:17:58.828402", + "v": 100.7481 + }, + { + "t": "2026-07-07T21:17:58.828402", + "v": 100.6842 + }, + { + "t": "2026-07-07T22:17:58.828402", + "v": 100.8234 + }, + { + "t": "2026-07-07T23:17:58.828402", + "v": 100.7057 + }, + { + "t": "2026-07-08T00:17:58.828402", + "v": 100.2933 + }, + { + "t": "2026-07-08T01:17:58.828402", + "v": 100.5939 + }, + { + "t": "2026-07-08T02:17:58.828402", + "v": 100.5429 + }, + { + "t": "2026-07-08T03:17:58.828402", + "v": 100.5027 + }, + { + "t": "2026-07-08T04:17:58.828402", + "v": 100.7326 + }, + { + "t": "2026-07-08T05:17:58.828402", + "v": 100.7738 + }, + { + "t": "2026-07-08T06:17:58.828402", + "v": 100.7749 + }, + { + "t": "2026-07-08T07:17:58.828402", + "v": 101.1497 + }, + { + "t": "2026-07-08T08:17:58.828402", + "v": 101.0787 + }, + { + "t": "2026-07-08T09:17:58.828402", + "v": 101.0324 + }, + { + "t": "2026-07-08T10:17:58.828402", + "v": 101.1178 + }, + { + "t": "2026-07-08T11:17:58.828402", + "v": 101.1682 + }, + { + "t": "2026-07-08T12:17:58.828402", + "v": 101.2829 + }, + { + "t": "2026-07-08T13:17:58.828402", + "v": 101.1229 + }, + { + "t": "2026-07-08T14:17:58.828402", + "v": 101.1124 + }, + { + "t": "2026-07-08T15:17:58.828402", + "v": 100.936 + }, + { + "t": "2026-07-08T16:17:58.828402", + "v": 101.372 + }, + { + "t": "2026-07-08T17:17:58.828402", + "v": 101.2284 + }, + { + "t": "2026-07-08T18:17:58.828402", + "v": 101.3513 + }, + { + "t": "2026-07-08T19:17:58.828402", + "v": 101.2943 + }, + { + "t": "2026-07-08T20:17:58.828402", + "v": 101.6018 + }, + { + "t": "2026-07-08T21:17:58.828402", + "v": 101.8092 + }, + { + "t": "2026-07-08T22:17:58.828402", + "v": 101.7015 + }, + { + "t": "2026-07-08T23:17:58.828402", + "v": 101.8041 + }, + { + "t": "2026-07-09T00:17:58.828402", + "v": 101.9166 + }, + { + "t": "2026-07-09T01:17:58.828402", + "v": 102.125 + }, + { + "t": "2026-07-09T02:17:58.828402", + "v": 101.8363 + }, + { + "t": "2026-07-09T03:17:58.828402", + "v": 101.9753 + }, + { + "t": "2026-07-09T04:17:58.828402", + "v": 102.0776 + }, + { + "t": "2026-07-09T05:17:58.828402", + "v": 101.8654 + }, + { + "t": "2026-07-09T06:17:58.828402", + "v": 102.1244 + }, + { + "t": "2026-07-09T07:17:58.828402", + "v": 102.2795 + }, + { + "t": "2026-07-09T08:17:58.828402", + "v": 102.3606 + }, + { + "t": "2026-07-09T09:17:58.828402", + "v": 102.2734 + }, + { + "t": "2026-07-09T10:17:58.828402", + "v": 102.6002 + }, + { + "t": "2026-07-09T11:17:58.828402", + "v": 102.8421 + }, + { + "t": "2026-07-09T12:17:58.828402", + "v": 102.5729 + }, + { + "t": "2026-07-09T13:17:58.828402", + "v": 102.7618 + }, + { + "t": "2026-07-09T14:17:58.828402", + "v": 102.4147 + }, + { + "t": "2026-07-09T15:17:58.828402", + "v": 102.2608 + }, + { + "t": "2026-07-09T16:17:58.828402", + "v": 102.2343 + }, + { + "t": "2026-07-09T17:17:58.828402", + "v": 102.3818 + }, + { + "t": "2026-07-09T18:17:58.828402", + "v": 102.5749 + }, + { + "t": "2026-07-09T19:17:58.828402", + "v": 102.4997 + }, + { + "t": "2026-07-09T20:17:58.828402", + "v": 102.3314 + }, + { + "t": "2026-07-09T21:17:58.828402", + "v": 101.9842 + }, + { + "t": "2026-07-09T22:17:58.828402", + "v": 102.5509 + }, + { + "t": "2026-07-09T23:17:58.828402", + "v": 102.6022 + }, + { + "t": "2026-07-10T00:17:58.828402", + "v": 102.3613 + }, + { + "t": "2026-07-10T01:17:58.828402", + "v": 102.0376 + }, + { + "t": "2026-07-10T02:17:58.828402", + "v": 101.7368 + }, + { + "t": "2026-07-10T03:17:58.828402", + "v": 102.0156 + }, + { + "t": "2026-07-10T04:17:58.828402", + "v": 102.1901 + }, + { + "t": "2026-07-10T05:17:58.828402", + "v": 102.2738 + }, + { + "t": "2026-07-10T06:17:58.828402", + "v": 102.203 + }, + { + "t": "2026-07-10T07:17:58.828402", + "v": 102.3973 + }, + { + "t": "2026-07-10T08:17:58.828402", + "v": 102.3602 + }, + { + "t": "2026-07-10T09:17:58.828402", + "v": 102.7631 + }, + { + "t": "2026-07-10T10:17:58.828402", + "v": 102.6187 + }, + { + "t": "2026-07-10T11:17:58.828402", + "v": 102.5921 + }, + { + "t": "2026-07-10T12:17:58.828402", + "v": 102.678 + }, + { + "t": "2026-07-10T13:17:58.828402", + "v": 102.6292 + }, + { + "t": "2026-07-10T14:17:58.828402", + "v": 102.7936 + }, + { + "t": "2026-07-10T15:17:58.828402", + "v": 103.1952 + }, + { + "t": "2026-07-10T16:17:58.828402", + "v": 103.2501 + }, + { + "t": "2026-07-10T17:17:58.828402", + "v": 103.6887 + }, + { + "t": "2026-07-10T18:17:58.828402", + "v": 103.5617 + }, + { + "t": "2026-07-10T19:17:58.828402", + "v": 103.5155 + }, + { + "t": "2026-07-10T20:17:58.828402", + "v": 103.8591 + }, + { + "t": "2026-07-10T21:17:58.828402", + "v": 103.7634 + }, + { + "t": "2026-07-10T22:17:58.828402", + "v": 103.4677 + }, + { + "t": "2026-07-10T23:17:58.828402", + "v": 103.3428 + }, + { + "t": "2026-07-11T00:17:58.828402", + "v": 103.4965 + }, + { + "t": "2026-07-11T01:17:58.828402", + "v": 104.1332 + }, + { + "t": "2026-07-11T02:17:58.828402", + "v": 104.2662 + }, + { + "t": "2026-07-11T03:17:58.828402", + "v": 104.2441 + }, + { + "t": "2026-07-11T04:17:58.828402", + "v": 104.5121 + }, + { + "t": "2026-07-11T05:17:58.828402", + "v": 104.287 + }, + { + "t": "2026-07-11T06:17:58.828402", + "v": 104.6762 + }, + { + "t": "2026-07-11T07:17:58.828402", + "v": 105.0154 + }, + { + "t": "2026-07-11T08:17:58.828402", + "v": 105.1337 + }, + { + "t": "2026-07-11T09:17:58.828402", + "v": 105.0773 + }, + { + "t": "2026-07-11T10:17:58.828402", + "v": 104.9743 + }, + { + "t": "2026-07-11T11:17:58.828402", + "v": 105.1673 + }, + { + "t": "2026-07-11T12:17:58.828402", + "v": 105.2832 + }, + { + "t": "2026-07-11T13:17:58.828402", + "v": 105.6216 + }, + { + "t": "2026-07-11T14:17:58.828402", + "v": 106.0531 + }, + { + "t": "2026-07-11T15:17:58.828402", + "v": 106.5225 + }, + { + "t": "2026-07-11T16:17:58.828402", + "v": 107.0201 + }, + { + "t": "2026-07-11T17:17:58.828402", + "v": 107.31 + }, + { + "t": "2026-07-11T18:17:58.828402", + "v": 107.5002 + }, + { + "t": "2026-07-11T19:17:58.828402", + "v": 107.2334 + }, + { + "t": "2026-07-11T20:17:58.828402", + "v": 107.049 + }, + { + "t": "2026-07-11T21:17:58.828402", + "v": 107.0723 + }, + { + "t": "2026-07-11T22:17:58.828402", + "v": 107.1004 + }, + { + "t": "2026-07-11T23:17:58.828402", + "v": 107.2738 + }, + { + "t": "2026-07-12T00:17:58.828402", + "v": 106.8055 + }, + { + "t": "2026-07-12T01:17:58.828402", + "v": 107.1338 + }, + { + "t": "2026-07-12T02:17:58.828402", + "v": 106.8223 + }, + { + "t": "2026-07-12T03:17:58.828402", + "v": 106.8697 + }, + { + "t": "2026-07-12T04:17:58.828402", + "v": 106.9309 + }, + { + "t": "2026-07-12T05:17:58.828402", + "v": 106.5723 + }, + { + "t": "2026-07-12T06:17:58.828402", + "v": 106.5744 + }, + { + "t": "2026-07-12T07:17:58.828402", + "v": 106.6889 + }, + { + "t": "2026-07-12T08:17:58.828402", + "v": 106.8468 + }, + { + "t": "2026-07-12T09:17:58.828402", + "v": 106.6519 + }, + { + "t": "2026-07-12T10:17:58.828402", + "v": 106.8112 + }, + { + "t": "2026-07-12T11:17:58.828402", + "v": 106.9406 + }, + { + "t": "2026-07-12T12:17:58.828402", + "v": 106.9695 + }, + { + "t": "2026-07-12T13:17:58.828402", + "v": 107.014 + }, + { + "t": "2026-07-12T14:17:58.828402", + "v": 106.8127 + }, + { + "t": "2026-07-12T15:17:58.828402", + "v": 106.9348 + }, + { + "t": "2026-07-12T16:17:58.828402", + "v": 107.0281 + }, + { + "t": "2026-07-12T17:17:58.828402", + "v": 107.2434 + }, + { + "t": "2026-07-12T18:17:58.828402", + "v": 107.1751 + }, + { + "t": "2026-07-12T19:17:58.828402", + "v": 107.0204 + }, + { + "t": "2026-07-12T20:17:58.828402", + "v": 106.8167 + }, + { + "t": "2026-07-12T21:17:58.828402", + "v": 106.4555 + }, + { + "t": "2026-07-12T22:17:58.828402", + "v": 106.8493 + }, + { + "t": "2026-07-12T23:17:58.828402", + "v": 106.5534 + }, + { + "t": "2026-07-13T00:17:58.828402", + "v": 106.5877 + }, + { + "t": "2026-07-13T01:17:58.828402", + "v": 106.4691 + }, + { + "t": "2026-07-13T02:17:58.828402", + "v": 106.3095 + }, + { + "t": "2026-07-13T03:17:58.828402", + "v": 106.1581 + }, + { + "t": "2026-07-13T04:17:58.828402", + "v": 106.3312 + }, + { + "t": "2026-07-13T05:17:58.828402", + "v": 106.3039 + }, + { + "t": "2026-07-13T06:17:58.828402", + "v": 106.4841 + }, + { + "t": "2026-07-13T07:17:58.828402", + "v": 106.579 + }, + { + "t": "2026-07-13T08:17:58.828402", + "v": 106.4578 + }, + { + "t": "2026-07-13T09:17:58.828402", + "v": 106.3681 + }, + { + "t": "2026-07-13T10:17:58.828402", + "v": 106.4656 + }, + { + "t": "2026-07-13T11:17:58.828402", + "v": 106.2901 + }, + { + "t": "2026-07-13T12:17:58.828402", + "v": 105.8292 + }, + { + "t": "2026-07-13T13:17:58.828402", + "v": 105.8251 + }, + { + "t": "2026-07-13T14:17:58.828402", + "v": 105.7472 + }, + { + "t": "2026-07-13T15:17:58.828402", + "v": 106.2639 + }, + { + "t": "2026-07-13T16:17:58.828402", + "v": 105.8242 + }, + { + "t": "2026-07-13T17:17:58.828402", + "v": 105.5324 + }, + { + "t": "2026-07-13T18:17:58.828402", + "v": 105.4055 + }, + { + "t": "2026-07-13T19:17:58.828402", + "v": 104.9992 + }, + { + "t": "2026-07-13T20:17:58.828402", + "v": 105.1262 + }, + { + "t": "2026-07-13T21:17:58.828402", + "v": 105.0725 + }, + { + "t": "2026-07-13T22:17:58.828402", + "v": 105.0628 + }, + { + "t": "2026-07-13T23:17:58.828402", + "v": 104.8382 + }, + { + "t": "2026-07-14T00:17:58.828402", + "v": 104.6417 + }, + { + "t": "2026-07-14T01:17:58.828402", + "v": 104.6687 + }, + { + "t": "2026-07-14T02:17:58.828402", + "v": 104.6068 + }, + { + "t": "2026-07-14T03:17:58.828402", + "v": 104.3868 + }, + { + "t": "2026-07-14T04:17:58.828402", + "v": 104.4742 + }, + { + "t": "2026-07-14T05:17:58.828402", + "v": 104.5746 + }, + { + "t": "2026-07-14T06:17:58.828402", + "v": 104.4177 + }, + { + "t": "2026-07-14T07:17:58.828402", + "v": 104.6912 + }, + { + "t": "2026-07-14T08:17:58.828402", + "v": 104.901 + }, + { + "t": "2026-07-14T09:17:58.828402", + "v": 105.1267 + }, + { + "t": "2026-07-14T10:17:58.828402", + "v": 105.2243 + }, + { + "t": "2026-07-14T11:17:58.828402", + "v": 105.291 + }, + { + "t": "2026-07-14T12:17:58.828402", + "v": 105.4043 + }, + { + "t": "2026-07-14T13:17:58.828402", + "v": 105.6961 + }, + { + "t": "2026-07-14T14:17:58.828402", + "v": 105.6187 + }, + { + "t": "2026-07-14T15:17:58.828402", + "v": 105.9055 + }, + { + "t": "2026-07-14T16:17:58.828402", + "v": 105.9295 + }, + { + "t": "2026-07-14T17:17:58.828402", + "v": 105.9692 + }, + { + "t": "2026-07-14T18:17:58.828402", + "v": 106.0982 + }, + { + "t": "2026-07-14T19:17:58.828402", + "v": 105.6424 + }, + { + "t": "2026-07-14T20:17:58.828402", + "v": 105.846 + }, + { + "t": "2026-07-14T21:17:58.828402", + "v": 105.5591 + }, + { + "t": "2026-07-14T22:17:58.828402", + "v": 105.0942 + }, + { + "t": "2026-07-14T23:17:58.828402", + "v": 104.9107 + }, + { + "t": "2026-07-15T00:17:58.828402", + "v": 104.7709 + }, + { + "t": "2026-07-15T01:17:58.828402", + "v": 104.6591 + }, + { + "t": "2026-07-15T02:17:58.828402", + "v": 104.9476 + }, + { + "t": "2026-07-15T03:17:58.828402", + "v": 104.7116 + }, + { + "t": "2026-07-15T04:17:58.828402", + "v": 105.25 + }, + { + "t": "2026-07-15T05:17:58.828402", + "v": 105.3217 + }, + { + "t": "2026-07-15T06:17:58.828402", + "v": 105.643 + }, + { + "t": "2026-07-15T07:17:58.828402", + "v": 105.3552 + }, + { + "t": "2026-07-15T08:17:58.828402", + "v": 105.4378 + }, + { + "t": "2026-07-15T09:17:58.828402", + "v": 105.1893 + }, + { + "t": "2026-07-15T10:17:58.828402", + "v": 104.599 + }, + { + "t": "2026-07-15T11:17:58.828402", + "v": 104.5081 + }, + { + "t": "2026-07-15T12:17:58.828402", + "v": 104.8337 + }, + { + "t": "2026-07-15T13:17:58.828402", + "v": 104.5046 + }, + { + "t": "2026-07-15T14:17:58.828402", + "v": 104.5629 + }, + { + "t": "2026-07-15T15:17:58.828402", + "v": 104.613 + }, + { + "t": "2026-07-15T16:17:58.828402", + "v": 104.6771 + }, + { + "t": "2026-07-15T17:17:58.828402", + "v": 104.292 + }, + { + "t": "2026-07-15T18:17:58.828402", + "v": 104.3992 + }, + { + "t": "2026-07-15T19:17:58.828402", + "v": 104.5763 + }, + { + "t": "2026-07-15T20:17:58.828402", + "v": 104.7115 + }, + { + "t": "2026-07-15T21:17:58.828402", + "v": 104.3004 + }, + { + "t": "2026-07-15T22:17:58.828402", + "v": 104.4977 + }, + { + "t": "2026-07-15T23:17:58.828402", + "v": 104.7076 + }, + { + "t": "2026-07-16T00:17:58.828402", + "v": 105.0046 + }, + { + "t": "2026-07-16T01:17:58.828402", + "v": 104.7106 + }, + { + "t": "2026-07-16T02:17:58.828402", + "v": 104.3995 + }, + { + "t": "2026-07-16T03:17:58.828402", + "v": 104.835 + }, + { + "t": "2026-07-16T04:17:58.828402", + "v": 105.5027 + }, + { + "t": "2026-07-16T05:17:58.828402", + "v": 105.5539 + }, + { + "t": "2026-07-16T06:17:58.828402", + "v": 106.0643 + }, + { + "t": "2026-07-16T07:17:58.828402", + "v": 106.139 + }, + { + "t": "2026-07-16T08:17:58.828402", + "v": 106.27 + }, + { + "t": "2026-07-16T09:17:58.828402", + "v": 105.7498 + }, + { + "t": "2026-07-16T10:17:58.828402", + "v": 105.6886 + }, + { + "t": "2026-07-16T11:17:58.828402", + "v": 105.922 + }, + { + "t": "2026-07-16T12:17:58.828402", + "v": 105.3561 + }, + { + "t": "2026-07-16T13:17:58.828402", + "v": 105.0169 + }, + { + "t": "2026-07-16T14:17:58.828402", + "v": 104.9789 + }, + { + "t": "2026-07-16T15:17:58.828402", + "v": 104.8536 + }, + { + "t": "2026-07-16T16:17:58.828402", + "v": 105.1876 + }, + { + "t": "2026-07-16T17:17:58.828402", + "v": 105.3062 + }, + { + "t": "2026-07-16T18:17:58.828402", + "v": 105.4526 + }, + { + "t": "2026-07-16T19:17:58.828402", + "v": 105.235 + }, + { + "t": "2026-07-16T20:17:58.828402", + "v": 105.4422 + }, + { + "t": "2026-07-16T21:17:58.828402", + "v": 105.2814 + }, + { + "t": "2026-07-16T22:17:58.828402", + "v": 105.1943 + }, + { + "t": "2026-07-16T23:17:58.828402", + "v": 105.1399 + }, + { + "t": "2026-07-17T00:17:58.828402", + "v": 105.2606 + }, + { + "t": "2026-07-17T01:17:58.828402", + "v": 105.6033 + }, + { + "t": "2026-07-17T02:17:58.828402", + "v": 105.4595 + }, + { + "t": "2026-07-17T03:17:58.828402", + "v": 105.5613 + }, + { + "t": "2026-07-17T04:17:58.828402", + "v": 105.4083 + }, + { + "t": "2026-07-17T05:17:58.828402", + "v": 105.5948 + }, + { + "t": "2026-07-17T06:17:58.828402", + "v": 106.0384 + }, + { + "t": "2026-07-17T07:17:58.828402", + "v": 106.139 + }, + { + "t": "2026-07-17T08:17:58.828402", + "v": 106.5504 + }, + { + "t": "2026-07-17T09:17:58.828402", + "v": 106.4833 + }, + { + "t": "2026-07-17T10:17:58.828402", + "v": 106.4758 + }, + { + "t": "2026-07-17T11:17:58.828402", + "v": 106.2087 + }, + { + "t": "2026-07-17T12:17:58.828402", + "v": 106.4792 + }, + { + "t": "2026-07-17T13:17:58.828402", + "v": 107.2246 + }, + { + "t": "2026-07-17T14:17:58.828402", + "v": 107.4472 + }, + { + "t": "2026-07-17T15:17:58.828402", + "v": 107.2243 + }, + { + "t": "2026-07-17T16:17:58.828402", + "v": 107.1859 + }, + { + "t": "2026-07-17T17:17:58.828402", + "v": 107.1111 + }, + { + "t": "2026-07-17T18:17:58.828402", + "v": 107.1829 + }, + { + "t": "2026-07-17T19:17:58.828402", + "v": 107.2734 + }, + { + "t": "2026-07-17T20:17:58.828402", + "v": 107.161 + }, + { + "t": "2026-07-17T21:17:58.828402", + "v": 107.349 + }, + { + "t": "2026-07-17T22:17:58.828402", + "v": 107.4853 + }, + { + "t": "2026-07-17T23:17:58.828402", + "v": 107.5913 + }, + { + "t": "2026-07-18T00:17:58.828402", + "v": 107.1968 + }, + { + "t": "2026-07-18T01:17:58.828402", + "v": 104.8843 + }, + { + "t": "2026-07-18T02:17:58.828402", + "v": 104.7277 + }, + { + "t": "2026-07-18T03:17:58.828402", + "v": 104.967 + }, + { + "t": "2026-07-18T04:17:58.828402", + "v": 105.0277 + }, + { + "t": "2026-07-18T05:17:58.828402", + "v": 105.3462 + }, + { + "t": "2026-07-18T06:17:58.828402", + "v": 105.1303 + }, + { + "t": "2026-07-18T07:17:58.828402", + "v": 105.0094 + }, + { + "t": "2026-07-18T08:17:58.828402", + "v": 105.3373 + }, + { + "t": "2026-07-18T09:17:58.828402", + "v": 105.3775 + }, + { + "t": "2026-07-18T10:17:58.828402", + "v": 105.2011 + }, + { + "t": "2026-07-18T11:17:58.828402", + "v": 105.4649 + }, + { + "t": "2026-07-18T12:17:58.828402", + "v": 105.1827 + }, + { + "t": "2026-07-18T13:17:58.828402", + "v": 105.1427 + }, + { + "t": "2026-07-18T14:17:58.828402", + "v": 105.0511 + }, + { + "t": "2026-07-18T15:17:58.828402", + "v": 104.9697 + }, + { + "t": "2026-07-18T16:17:58.828402", + "v": 104.9452 + }, + { + "t": "2026-07-18T17:17:58.828402", + "v": 104.9113 + }, + { + "t": "2026-07-18T18:17:58.828402", + "v": 105.1449 + }, + { + "t": "2026-07-18T19:17:58.828402", + "v": 104.8734 + }, + { + "t": "2026-07-18T20:17:58.828402", + "v": 105.0102 + }, + { + "t": "2026-07-18T21:17:58.828402", + "v": 105.0945 + }, + { + "t": "2026-07-18T22:17:58.828402", + "v": 105.1624 + }, + { + "t": "2026-07-18T23:17:58.828402", + "v": 105.6702 + }, + { + "t": "2026-07-19T00:17:58.828402", + "v": 105.9314 + }, + { + "t": "2026-07-19T01:17:58.828402", + "v": 105.8895 + }, + { + "t": "2026-07-19T02:17:58.828402", + "v": 105.7333 + }, + { + "t": "2026-07-19T03:17:58.828402", + "v": 105.3902 + }, + { + "t": "2026-07-19T04:17:58.828402", + "v": 104.7079 + }, + { + "t": "2026-07-19T05:17:58.828402", + "v": 104.6679 + }, + { + "t": "2026-07-19T06:17:58.828402", + "v": 104.8173 + }, + { + "t": "2026-07-19T07:17:58.828402", + "v": 105.2502 + }, + { + "t": "2026-07-19T08:17:58.828402", + "v": 105.2247 + }, + { + "t": "2026-07-19T09:17:58.828402", + "v": 104.5462 + }, + { + "t": "2026-07-19T10:17:58.828402", + "v": 104.375 + }, + { + "t": "2026-07-19T11:17:58.828402", + "v": 104.2859 + }, + { + "t": "2026-07-19T12:17:58.828402", + "v": 104.2888 + }, + { + "t": "2026-07-19T13:17:58.828402", + "v": 105.0277 + }, + { + "t": "2026-07-19T14:17:58.828402", + "v": 105.5767 + }, + { + "t": "2026-07-19T15:17:58.828402", + "v": 105.7538 + }, + { + "t": "2026-07-19T16:17:58.828402", + "v": 105.4493 + }, + { + "t": "2026-07-19T17:17:58.828402", + "v": 105.5828 + }, + { + "t": "2026-07-19T18:17:58.828402", + "v": 106.0345 + }, + { + "t": "2026-07-19T19:17:58.828402", + "v": 106.4193 + }, + { + "t": "2026-07-19T20:17:58.828402", + "v": 106.5155 + }, + { + "t": "2026-07-19T21:17:58.828402", + "v": 106.4582 + }, + { + "t": "2026-07-19T22:17:58.828402", + "v": 106.5894 + }, + { + "t": "2026-07-19T23:17:58.828402", + "v": 106.667 + }, + { + "t": "2026-07-20T00:17:58.828402", + "v": 106.6978 + }, + { + "t": "2026-07-20T01:17:58.828402", + "v": 106.8893 + }, + { + "t": "2026-07-20T02:17:58.828402", + "v": 106.9984 + }, + { + "t": "2026-07-20T03:17:58.828402", + "v": 107.4953 + }, + { + "t": "2026-07-20T04:17:58.828402", + "v": 107.4765 + }, + { + "t": "2026-07-20T05:17:58.828402", + "v": 107.4908 + }, + { + "t": "2026-07-20T06:17:58.828402", + "v": 107.276 + }, + { + "t": "2026-07-20T07:17:58.828402", + "v": 107.3044 + }, + { + "t": "2026-07-20T08:17:58.828402", + "v": 107.3978 + }, + { + "t": "2026-07-20T09:17:58.828402", + "v": 107.6103 + }, + { + "t": "2026-07-20T10:17:58.828402", + "v": 106.9426 + }, + { + "t": "2026-07-20T11:17:58.828402", + "v": 106.8339 + }, + { + "t": "2026-07-20T12:17:58.828402", + "v": 107.0063 + }, + { + "t": "2026-07-20T13:17:58.828402", + "v": 107.1036 + }, + { + "t": "2026-07-20T14:17:58.828402", + "v": 107.0889 + }, + { + "t": "2026-07-20T15:17:58.828402", + "v": 106.9688 + }, + { + "t": "2026-07-20T16:17:58.828402", + "v": 107.1482 + }, + { + "t": "2026-07-20T17:17:58.828402", + "v": 107.0714 + }, + { + "t": "2026-07-20T18:17:58.828402", + "v": 107.0588 + }, + { + "t": "2026-07-20T19:17:58.828402", + "v": 107.0123 + }, + { + "t": "2026-07-20T20:17:58.828402", + "v": 107.0341 + }, + { + "t": "2026-07-20T21:17:58.828402", + "v": 106.7856 + }, + { + "t": "2026-07-20T22:17:58.828402", + "v": 106.9049 + }, + { + "t": "2026-07-20T23:17:58.828402", + "v": 105.7923 + }, + { + "t": "2026-07-21T00:17:58.828402", + "v": 106.0239 + }, + { + "t": "2026-07-21T01:17:58.828402", + "v": 105.7678 + }, + { + "t": "2026-07-21T02:17:58.828402", + "v": 105.773 + }, + { + "t": "2026-07-21T03:17:58.828402", + "v": 105.9893 + }, + { + "t": "2026-07-21T04:17:58.828402", + "v": 105.7526 + }, + { + "t": "2026-07-21T05:17:58.828402", + "v": 105.7702 + }, + { + "t": "2026-07-21T06:17:58.828402", + "v": 105.893 + }, + { + "t": "2026-07-21T07:17:58.828402", + "v": 106.3867 + }, + { + "t": "2026-07-21T08:17:58.828402", + "v": 106.8282 + }, + { + "t": "2026-07-21T09:17:58.828402", + "v": 106.5641 + }, + { + "t": "2026-07-21T10:17:58.828402", + "v": 106.8488 + }, + { + "t": "2026-07-21T11:17:58.828402", + "v": 106.7353 + }, + { + "t": "2026-07-21T12:17:58.828402", + "v": 106.7874 + }, + { + "t": "2026-07-21T13:17:58.828402", + "v": 106.5184 + }, + { + "t": "2026-07-21T14:17:58.828402", + "v": 106.5042 + }, + { + "t": "2026-07-21T15:17:58.828402", + "v": 106.1711 + }, + { + "t": "2026-07-21T16:17:58.828402", + "v": 106.4044 + }, + { + "t": "2026-07-21T17:17:58.828402", + "v": 106.4412 + }, + { + "t": "2026-07-21T18:17:58.828402", + "v": 106.6142 + }, + { + "t": "2026-07-21T19:17:58.828402", + "v": 106.3296 + }, + { + "t": "2026-07-21T20:17:58.828402", + "v": 106.6355 + }, + { + "t": "2026-07-21T21:17:58.828402", + "v": 106.9658 + }, + { + "t": "2026-07-21T22:17:58.828402", + "v": 107.2523 + }, + { + "t": "2026-07-21T23:17:58.828402", + "v": 106.9341 + }, + { + "t": "2026-07-22T00:17:58.828402", + "v": 106.5867 + }, + { + "t": "2026-07-22T01:17:58.828402", + "v": 106.8879 + }, + { + "t": "2026-07-22T02:17:58.828402", + "v": 107.2195 + }, + { + "t": "2026-07-22T03:17:58.828402", + "v": 107.3359 + }, + { + "t": "2026-07-22T04:17:58.828402", + "v": 107.035 + }, + { + "t": "2026-07-22T05:17:58.828402", + "v": 107.2515 + }, + { + "t": "2026-07-22T06:17:58.828402", + "v": 107.1931 + }, + { + "t": "2026-07-22T07:17:58.828402", + "v": 107.3822 + }, + { + "t": "2026-07-22T08:17:58.828402", + "v": 107.2674 + }, + { + "t": "2026-07-22T09:17:58.828402", + "v": 107.0791 + }, + { + "t": "2026-07-22T10:17:58.828402", + "v": 107.3574 + }, + { + "t": "2026-07-22T11:17:58.828402", + "v": 106.8852 + }, + { + "t": "2026-07-22T12:17:58.828402", + "v": 106.6882 + }, + { + "t": "2026-07-22T13:17:58.828402", + "v": 106.3672 + }, + { + "t": "2026-07-22T14:17:58.828402", + "v": 106.2579 + }, + { + "t": "2026-07-22T15:17:58.828402", + "v": 106.1712 + }, + { + "t": "2026-07-22T16:17:58.828402", + "v": 105.6884 + }, + { + "t": "2026-07-22T17:17:58.828402", + "v": 105.844 + }, + { + "t": "2026-07-22T18:17:58.828402", + "v": 105.5065 + }, + { + "t": "2026-07-22T19:17:58.828402", + "v": 105.4599 + }, + { + "t": "2026-07-22T20:17:58.828402", + "v": 105.571 + }, + { + "t": "2026-07-22T21:17:58.828402", + "v": 105.8484 + }, + { + "t": "2026-07-22T22:17:58.828402", + "v": 106.1968 + }, + { + "t": "2026-07-22T23:17:58.828402", + "v": 106.2626 + }, + { + "t": "2026-07-23T00:17:58.828402", + "v": 106.4165 + }, + { + "t": "2026-07-23T01:17:58.828402", + "v": 106.4682 + }, + { + "t": "2026-07-23T02:17:58.828402", + "v": 106.1387 + }, + { + "t": "2026-07-23T03:17:58.828402", + "v": 106.4399 + }, + { + "t": "2026-07-23T04:17:58.828402", + "v": 106.376 + }, + { + "t": "2026-07-23T05:17:58.828402", + "v": 106.1199 + }, + { + "t": "2026-07-23T06:17:58.828402", + "v": 106.176 + }, + { + "t": "2026-07-23T07:17:58.828402", + "v": 105.7172 + }, + { + "t": "2026-07-23T08:17:58.828402", + "v": 105.9271 + }, + { + "t": "2026-07-23T09:17:58.828402", + "v": 105.8725 + }, + { + "t": "2026-07-23T10:17:58.828402", + "v": 106.042 + }, + { + "t": "2026-07-23T11:17:58.828402", + "v": 106.0817 + }, + { + "t": "2026-07-23T12:17:58.828402", + "v": 106.3111 + }, + { + "t": "2026-07-23T13:17:58.828402", + "v": 106.2745 + }, + { + "t": "2026-07-23T14:17:58.828402", + "v": 105.8811 + }, + { + "t": "2026-07-23T15:17:58.828402", + "v": 106.2239 + }, + { + "t": "2026-07-23T16:17:58.828402", + "v": 106.1336 + }, + { + "t": "2026-07-23T17:17:58.828402", + "v": 106.0543 + }, + { + "t": "2026-07-23T18:17:58.828402", + "v": 105.9033 + }, + { + "t": "2026-07-23T19:17:58.828402", + "v": 105.8953 + }, + { + "t": "2026-07-23T20:17:58.828402", + "v": 105.7625 + }, + { + "t": "2026-07-23T21:17:58.828402", + "v": 106.0373 + }, + { + "t": "2026-07-23T22:17:58.828402", + "v": 105.987 + }, + { + "t": "2026-07-23T23:17:58.828402", + "v": 106.1703 + }, + { + "t": "2026-07-24T00:17:58.828402", + "v": 106.2465 + }, + { + "t": "2026-07-24T01:17:58.828402", + "v": 105.7292 + }, + { + "t": "2026-07-24T02:17:58.828402", + "v": 105.7323 + }, + { + "t": "2026-07-24T03:17:58.828402", + "v": 105.8115 + }, + { + "t": "2026-07-24T04:17:58.828402", + "v": 105.7033 + }, + { + "t": "2026-07-24T05:17:58.828402", + "v": 105.251 + }, + { + "t": "2026-07-24T06:17:58.828402", + "v": 105.1468 + }, + { + "t": "2026-07-24T07:17:58.828402", + "v": 103.2631 + }, + { + "t": "2026-07-24T08:17:58.828402", + "v": 103.2641 + }, + { + "t": "2026-07-24T09:17:58.828402", + "v": 103.1227 + }, + { + "t": "2026-07-24T10:17:58.828402", + "v": 103.6989 + }, + { + "t": "2026-07-24T11:17:58.828402", + "v": 103.7488 + }, + { + "t": "2026-07-24T12:17:58.828402", + "v": 103.5531 + }, + { + "t": "2026-07-24T13:17:58.828402", + "v": 103.3767 + }, + { + "t": "2026-07-24T14:17:58.828402", + "v": 103.1102 + }, + { + "t": "2026-07-24T15:17:58.828402", + "v": 103.5439 + }, + { + "t": "2026-07-24T16:17:58.828402", + "v": 103.0701 + }, + { + "t": "2026-07-24T17:17:58.828402", + "v": 103.4758 + }, + { + "t": "2026-07-24T18:17:58.828402", + "v": 103.4107 + }, + { + "t": "2026-07-24T19:17:58.828402", + "v": 103.4271 + }, + { + "t": "2026-07-24T20:17:58.828402", + "v": 102.3933 + }, + { + "t": "2026-07-24T21:17:58.828402", + "v": 102.4069 + }, + { + "t": "2026-07-24T22:17:58.828402", + "v": 102.543 + }, + { + "t": "2026-07-24T23:17:58.828402", + "v": 102.7446 + }, + { + "t": "2026-07-25T00:17:58.828402", + "v": 102.3776 + }, + { + "t": "2026-07-25T01:17:58.828402", + "v": 102.4655 + }, + { + "t": "2026-07-25T02:17:58.828402", + "v": 102.4519 + }, + { + "t": "2026-07-25T03:17:58.828402", + "v": 102.4371 + }, + { + "t": "2026-07-25T04:17:58.828402", + "v": 102.5895 + }, + { + "t": "2026-07-25T05:17:58.828402", + "v": 102.8785 + }, + { + "t": "2026-07-25T06:17:58.828402", + "v": 103.5578 + }, + { + "t": "2026-07-25T07:17:58.828402", + "v": 103.7145 + }, + { + "t": "2026-07-25T08:17:58.828402", + "v": 104.1839 + }, + { + "t": "2026-07-25T09:17:58.828402", + "v": 104.0788 + }, + { + "t": "2026-07-25T10:17:58.828402", + "v": 104.3185 + }, + { + "t": "2026-07-25T11:17:58.828402", + "v": 104.1482 + }, + { + "t": "2026-07-25T12:17:58.828402", + "v": 104.2311 + }, + { + "t": "2026-07-25T13:17:58.828402", + "v": 104.0914 + }, + { + "t": "2026-07-25T14:17:58.828402", + "v": 103.8096 + }, + { + "t": "2026-07-25T15:17:58.828402", + "v": 104.1108 + }, + { + "t": "2026-07-25T16:17:58.828402", + "v": 104.2432 + }, + { + "t": "2026-07-25T17:17:58.828402", + "v": 104.3414 + }, + { + "t": "2026-07-25T18:17:58.828402", + "v": 103.8823 + }, + { + "t": "2026-07-25T19:17:58.828402", + "v": 104.0699 + }, + { + "t": "2026-07-25T20:17:58.828402", + "v": 104.0324 + }, + { + "t": "2026-07-25T21:17:58.828402", + "v": 104.23 + }, + { + "t": "2026-07-25T22:17:58.828402", + "v": 105.589 + }, + { + "t": "2026-07-25T23:17:58.828402", + "v": 105.4015 + }, + { + "t": "2026-07-26T00:17:58.828402", + "v": 105.3672 + }, + { + "t": "2026-07-26T01:17:58.828402", + "v": 105.5413 + }, + { + "t": "2026-07-26T02:17:58.828402", + "v": 105.3553 + }, + { + "t": "2026-07-26T03:17:58.828402", + "v": 105.5749 + }, + { + "t": "2026-07-26T04:17:58.828402", + "v": 105.2935 + }, + { + "t": "2026-07-26T05:17:58.828402", + "v": 105.7109 + }, + { + "t": "2026-07-26T06:17:58.828402", + "v": 105.8069 + }, + { + "t": "2026-07-26T07:17:58.828402", + "v": 105.98 + }, + { + "t": "2026-07-26T08:17:58.828402", + "v": 105.7492 + }, + { + "t": "2026-07-26T09:17:58.828402", + "v": 105.97 + }, + { + "t": "2026-07-26T10:17:58.828402", + "v": 106.0497 + }, + { + "t": "2026-07-26T11:17:58.828402", + "v": 106.2635 + }, + { + "t": "2026-07-26T12:17:58.828402", + "v": 106.1037 + }, + { + "t": "2026-07-26T13:17:58.828402", + "v": 106.1612 + }, + { + "t": "2026-07-26T14:17:58.828402", + "v": 106.519 + }, + { + "t": "2026-07-26T15:17:58.828402", + "v": 106.297 + }, + { + "t": "2026-07-26T16:17:58.828402", + "v": 106.3019 + }, + { + "t": "2026-07-26T17:17:58.828402", + "v": 106.5527 + }, + { + "t": "2026-07-26T18:17:58.828402", + "v": 106.2884 + }, + { + "t": "2026-07-26T19:17:58.828402", + "v": 106.4075 + }, + { + "t": "2026-07-26T20:17:58.828402", + "v": 106.2317 + }, + { + "t": "2026-07-26T21:17:58.828402", + "v": 106.3039 + }, + { + "t": "2026-07-26T22:17:58.828402", + "v": 106.4673 + }, + { + "t": "2026-07-26T23:17:58.828402", + "v": 105.7885 + }, + { + "t": "2026-07-27T00:17:58.828402", + "v": 105.6718 + }, + { + "t": "2026-07-27T01:17:58.828402", + "v": 105.7722 + }, + { + "t": "2026-07-27T02:17:58.828402", + "v": 106.0278 + }, + { + "t": "2026-07-27T03:17:58.828402", + "v": 106.1767 + }, + { + "t": "2026-07-27T04:17:58.828402", + "v": 106.0345 + }, + { + "t": "2026-07-27T05:17:58.828402", + "v": 106.1085 + }, + { + "t": "2026-07-27T06:17:58.828402", + "v": 106.1851 + }, + { + "t": "2026-07-27T07:17:58.828402", + "v": 106.5368 + }, + { + "t": "2026-07-27T08:17:58.828402", + "v": 106.6994 + }, + { + "t": "2026-07-27T09:17:58.828402", + "v": 106.9461 + }, + { + "t": "2026-07-27T10:17:58.828402", + "v": 106.5846 + }, + { + "t": "2026-07-27T11:17:58.828402", + "v": 106.4694 + }, + { + "t": "2026-07-27T12:17:58.828402", + "v": 106.4039 + }, + { + "t": "2026-07-27T13:17:58.828402", + "v": 106.6483 + }, + { + "t": "2026-07-27T14:17:58.828402", + "v": 106.6209 + }, + { + "t": "2026-07-27T15:17:58.828402", + "v": 106.1419 + }, + { + "t": "2026-07-27T16:17:58.828402", + "v": 106.7781 + }, + { + "t": "2026-07-27T17:17:58.828402", + "v": 106.8515 + }, + { + "t": "2026-07-27T18:17:58.828402", + "v": 106.8557 + }, + { + "t": "2026-07-27T19:17:58.828402", + "v": 107.0943 + }, + { + "t": "2026-07-27T20:17:58.828402", + "v": 107.3559 + }, + { + "t": "2026-07-27T21:17:58.828402", + "v": 107.3569 + }, + { + "t": "2026-07-27T22:17:58.828402", + "v": 107.4241 + }, + { + "t": "2026-07-27T23:17:58.828402", + "v": 107.2379 + }, + { + "t": "2026-07-28T00:17:58.828402", + "v": 107.1176 + }, + { + "t": "2026-07-28T01:17:58.828402", + "v": 107.2993 + }, + { + "t": "2026-07-28T02:17:58.828402", + "v": 107.9256 + }, + { + "t": "2026-07-28T03:17:58.828402", + "v": 107.1157 + }, + { + "t": "2026-07-28T04:17:58.828402", + "v": 107.3944 + }, + { + "t": "2026-07-28T05:17:58.828402", + "v": 106.9614 + }, + { + "t": "2026-07-28T06:17:58.828402", + "v": 106.5956 + }, + { + "t": "2026-07-28T07:17:58.828402", + "v": 106.574 + }, + { + "t": "2026-07-28T08:17:58.828402", + "v": 107.3041 + }, + { + "t": "2026-07-28T09:17:58.828402", + "v": 107.2039 + }, + { + "t": "2026-07-28T10:17:58.828402", + "v": 107.0768 + }, + { + "t": "2026-07-28T11:17:58.828402", + "v": 107.0921 + }, + { + "t": "2026-07-28T12:17:58.828402", + "v": 107.3371 + }, + { + "t": "2026-07-28T13:17:58.828402", + "v": 107.3084 + }, + { + "t": "2026-07-28T14:17:58.828402", + "v": 107.2368 + }, + { + "t": "2026-07-28T15:17:58.828402", + "v": 107.0956 + }, + { + "t": "2026-07-28T16:17:58.828402", + "v": 106.9854 + }, + { + "t": "2026-07-28T17:17:58.828402", + "v": 106.396 + }, + { + "t": "2026-07-28T18:17:58.828402", + "v": 106.2544 + }, + { + "t": "2026-07-28T19:17:58.828402", + "v": 105.503 + }, + { + "t": "2026-07-28T20:17:58.828402", + "v": 105.9853 + }, + { + "t": "2026-07-28T21:17:58.828402", + "v": 105.7784 + }, + { + "t": "2026-07-28T22:17:58.828402", + "v": 105.911 + }, + { + "t": "2026-07-28T23:17:58.828402", + "v": 105.5531 + }, + { + "t": "2026-07-29T00:17:58.828402", + "v": 105.4781 + }, + { + "t": "2026-07-29T01:17:58.828402", + "v": 105.3676 + }, + { + "t": "2026-07-29T02:17:58.828402", + "v": 105.1471 + }, + { + "t": "2026-07-29T03:17:58.828402", + "v": 105.1188 + }, + { + "t": "2026-07-29T04:17:58.828402", + "v": 104.4173 + }, + { + "t": "2026-07-29T05:17:58.828402", + "v": 104.4251 + }, + { + "t": "2026-07-29T06:17:58.828402", + "v": 104.1147 + }, + { + "t": "2026-07-29T07:17:58.828402", + "v": 104.1425 + }, + { + "t": "2026-07-29T08:17:58.828402", + "v": 104.1104 + }, + { + "t": "2026-07-29T09:17:58.828402", + "v": 103.9901 + }, + { + "t": "2026-07-29T10:17:58.828402", + "v": 103.8845 + }, + { + "t": "2026-07-29T11:17:58.828402", + "v": 104.2333 + }, + { + "t": "2026-07-29T12:17:58.828402", + "v": 104.3729 + }, + { + "t": "2026-07-29T13:17:58.828402", + "v": 104.4023 + }, + { + "t": "2026-07-29T14:17:58.828402", + "v": 104.2115 + }, + { + "t": "2026-07-29T15:17:58.828402", + "v": 102.4714 + }, + { + "t": "2026-07-29T16:17:58.828402", + "v": 102.2292 + }, + { + "t": "2026-07-29T17:17:58.828402", + "v": 102.3393 + }, + { + "t": "2026-07-29T18:17:58.828402", + "v": 102.3371 + }, + { + "t": "2026-07-29T19:17:58.828402", + "v": 101.9105 + }, + { + "t": "2026-07-29T20:17:58.828402", + "v": 101.8484 + }, + { + "t": "2026-07-29T21:17:58.828402", + "v": 101.64 + }, + { + "t": "2026-07-29T22:17:58.828402", + "v": 101.6054 + }, + { + "t": "2026-07-29T23:17:58.828402", + "v": 101.2126 + }, + { + "t": "2026-07-30T00:17:58.828402", + "v": 101.1094 + }, + { + "t": "2026-07-30T01:17:58.828402", + "v": 101.0822 + }, + { + "t": "2026-07-30T02:17:58.828402", + "v": 101.5999 + }, + { + "t": "2026-07-30T03:17:58.828402", + "v": 101.4452 + }, + { + "t": "2026-07-30T04:17:58.828402", + "v": 101.3951 + }, + { + "t": "2026-07-30T05:17:58.828402", + "v": 101.5154 + }, + { + "t": "2026-07-30T06:17:58.828402", + "v": 101.3084 + }, + { + "t": "2026-07-30T07:17:58.828402", + "v": 101.1325 + }, + { + "t": "2026-07-30T08:17:58.828402", + "v": 100.9872 + }, + { + "t": "2026-07-30T09:17:58.828402", + "v": 100.7232 + }, + { + "t": "2026-07-30T10:17:58.828402", + "v": 100.3588 + }, + { + "t": "2026-07-30T11:17:58.828402", + "v": 100.4886 + }, + { + "t": "2026-07-30T12:17:58.828402", + "v": 100.6933 + }, + { + "t": "2026-07-30T13:17:58.828402", + "v": 100.4257 + }, + { + "t": "2026-07-30T14:17:58.828402", + "v": 100.5803 + }, + { + "t": "2026-07-30T15:17:58.828402", + "v": 100.4904 + }, + { + "t": "2026-07-30T16:17:58.828402", + "v": 100.7123 + }, + { + "t": "2026-07-30T17:17:58.828402", + "v": 100.7922 + }, + { + "t": "2026-07-30T18:17:58.828402", + "v": 101.0563 + }, + { + "t": "2026-07-30T19:17:58.828402", + "v": 101.1408 + }, + { + "t": "2026-07-30T20:17:58.828402", + "v": 101.5292 + }, + { + "t": "2026-07-30T21:17:58.828402", + "v": 101.2429 + }, + { + "t": "2026-07-30T22:17:58.828402", + "v": 101.1171 + }, + { + "t": "2026-07-30T23:17:58.828402", + "v": 101.2117 + }, + { + "t": "2026-07-31T00:17:58.828402", + "v": 101.4043 + }, + { + "t": "2026-07-31T01:17:58.828402", + "v": 101.4049 + }, + { + "t": "2026-07-31T02:17:58.828402", + "v": 100.9898 + }, + { + "t": "2026-07-31T03:17:58.828402", + "v": 101.0092 + }, + { + "t": "2026-07-31T04:17:58.828402", + "v": 101.1493 + }, + { + "t": "2026-07-31T05:17:58.828402", + "v": 101.3127 + }, + { + "t": "2026-07-31T06:17:58.828402", + "v": 101.1648 + }, + { + "t": "2026-07-31T07:17:58.828402", + "v": 101.1869 + }, + { + "t": "2026-07-31T08:17:58.828402", + "v": 101.1885 + }, + { + "t": "2026-07-31T09:17:58.828402", + "v": 101.564 + }, + { + "t": "2026-07-31T10:17:58.828402", + "v": 101.618 + }, + { + "t": "2026-07-31T11:17:58.828402", + "v": 101.8247 + }, + { + "t": "2026-07-31T12:17:58.828402", + "v": 102.1128 + }, + { + "t": "2026-07-31T13:17:58.828402", + "v": 102.0674 + }, + { + "t": "2026-07-31T14:17:58.828402", + "v": 102.1039 + }, + { + "t": "2026-07-31T15:17:58.828402", + "v": 102.1029 + }, + { + "t": "2026-07-31T16:17:58.828402", + "v": 101.9349 + }, + { + "t": "2026-07-31T17:17:58.828402", + "v": 101.8654 + }, + { + "t": "2026-07-31T18:17:58.828402", + "v": 101.8443 + }, + { + "t": "2026-07-31T19:17:58.828402", + "v": 101.626 + }, + { + "t": "2026-07-31T20:17:58.828402", + "v": 101.7236 + }, + { + "t": "2026-07-31T21:17:58.828402", + "v": 101.8969 + }, + { + "t": "2026-07-31T22:17:58.828402", + "v": 101.8469 + }, + { + "t": "2026-07-31T23:17:58.828402", + "v": 101.5727 + }, + { + "t": "2026-08-01T00:17:58.828402", + "v": 102.0378 + }, + { + "t": "2026-08-01T01:17:58.828402", + "v": 101.8513 + }, + { + "t": "2026-08-01T02:17:58.828402", + "v": 101.9397 + }, + { + "t": "2026-08-01T03:17:58.828402", + "v": 102.1213 + }, + { + "t": "2026-08-01T04:17:58.828402", + "v": 102.2336 + }, + { + "t": "2026-08-01T05:17:58.828402", + "v": 102.5334 + }, + { + "t": "2026-08-01T06:17:58.828402", + "v": 102.5762 + }, + { + "t": "2026-08-01T07:17:58.828402", + "v": 102.7559 + }, + { + "t": "2026-08-01T08:17:58.828402", + "v": 102.8178 + }, + { + "t": "2026-08-01T09:17:58.828402", + "v": 102.7308 + }, + { + "t": "2026-08-01T10:17:58.828402", + "v": 102.5142 + }, + { + "t": "2026-08-01T11:17:58.828402", + "v": 102.5867 + }, + { + "t": "2026-08-01T12:17:58.828402", + "v": 102.6207 + }, + { + "t": "2026-08-01T13:17:58.828402", + "v": 102.6407 + }, + { + "t": "2026-08-01T14:17:58.828402", + "v": 102.6953 + }, + { + "t": "2026-08-01T15:17:58.828402", + "v": 102.9793 + }, + { + "t": "2026-08-01T16:17:58.828402", + "v": 103.0909 + }, + { + "t": "2026-08-01T17:17:58.828402", + "v": 103.0319 + }, + { + "t": "2026-08-01T18:17:58.828402", + "v": 103.1404 + }, + { + "t": "2026-08-01T19:17:58.828402", + "v": 102.8018 + }, + { + "t": "2026-08-01T20:17:58.828402", + "v": 103.088 + }, + { + "t": "2026-08-01T21:17:58.828402", + "v": 103.0201 + }, + { + "t": "2026-08-01T22:17:58.828402", + "v": 103.183 + }, + { + "t": "2026-08-01T23:17:58.828402", + "v": 103.2072 + }, + { + "t": "2026-08-02T00:17:58.828402", + "v": 103.1779 + }, + { + "t": "2026-08-02T01:17:58.828402", + "v": 103.2311 + }, + { + "t": "2026-08-02T02:17:58.828402", + "v": 103.1419 + }, + { + "t": "2026-08-02T03:17:58.828402", + "v": 103.5708 + }, + { + "t": "2026-08-02T04:17:58.828402", + "v": 103.6517 + }, + { + "t": "2026-08-02T05:17:58.828402", + "v": 103.8726 + }, + { + "t": "2026-08-02T06:17:58.828402", + "v": 104.0371 + }, + { + "t": "2026-08-02T07:17:58.828402", + "v": 104.3926 + }, + { + "t": "2026-08-02T08:17:58.828402", + "v": 104.394 + }, + { + "t": "2026-08-02T09:17:58.828402", + "v": 104.1345 + }, + { + "t": "2026-08-02T10:17:58.828402", + "v": 104.5085 + }, + { + "t": "2026-08-02T11:17:58.828402", + "v": 104.2109 + }, + { + "t": "2026-08-02T12:17:58.828402", + "v": 104.3648 + }, + { + "t": "2026-08-02T13:17:58.828402", + "v": 103.8438 + }, + { + "t": "2026-08-02T14:17:58.828402", + "v": 104.1732 + }, + { + "t": "2026-08-02T15:17:58.828402", + "v": 104.2875 + }, + { + "t": "2026-08-02T16:17:58.828402", + "v": 103.6268 + }, + { + "t": "2026-08-02T17:17:58.828402", + "v": 103.6214 + }, + { + "t": "2026-08-02T18:17:58.828402", + "v": 104.0384 + }, + { + "t": "2026-08-02T19:17:58.828402", + "v": 103.9787 + }, + { + "t": "2026-08-02T20:17:58.828402", + "v": 103.4671 + }, + { + "t": "2026-08-02T21:17:58.828402", + "v": 103.4491 + }, + { + "t": "2026-08-02T22:17:58.828402", + "v": 103.8171 + }, + { + "t": "2026-08-02T23:17:58.828402", + "v": 103.9218 + }, + { + "t": "2026-08-03T00:17:58.828402", + "v": 103.83 + }, + { + "t": "2026-08-03T01:17:58.828402", + "v": 103.7026 + }, + { + "t": "2026-08-03T02:17:58.828402", + "v": 103.6998 + }, + { + "t": "2026-08-03T03:17:58.828402", + "v": 103.5464 + }, + { + "t": "2026-08-03T04:17:58.828402", + "v": 103.7711 + }, + { + "t": "2026-08-03T05:17:58.828402", + "v": 103.8995 + }, + { + "t": "2026-08-03T06:17:58.828402", + "v": 103.9307 + }, + { + "t": "2026-08-03T07:17:58.828402", + "v": 104.2632 + }, + { + "t": "2026-08-03T08:17:58.828402", + "v": 104.5437 + }, + { + "t": "2026-08-03T09:17:58.828402", + "v": 104.2949 + }, + { + "t": "2026-08-03T10:17:58.828402", + "v": 104.7613 + }, + { + "t": "2026-08-03T11:17:58.828402", + "v": 104.8718 + }, + { + "t": "2026-08-03T12:17:58.828402", + "v": 104.7866 + }, + { + "t": "2026-08-03T13:17:58.828402", + "v": 104.8321 + }, + { + "t": "2026-08-03T14:17:58.828402", + "v": 104.8372 + }, + { + "t": "2026-08-03T15:17:58.828402", + "v": 104.9226 + }, + { + "t": "2026-08-03T16:17:58.828402", + "v": 105.0486 + }, + { + "t": "2026-08-03T17:17:58.828402", + "v": 104.9579 + }, + { + "t": "2026-08-03T18:17:58.828402", + "v": 104.9918 + }, + { + "t": "2026-08-03T19:17:58.828402", + "v": 105.2572 + }, + { + "t": "2026-08-03T20:17:58.828402", + "v": 105.4109 + }, + { + "t": "2026-08-03T21:17:58.828402", + "v": 106.0629 + }, + { + "t": "2026-08-03T22:17:58.828402", + "v": 106.0367 + }, + { + "t": "2026-08-03T23:17:58.828402", + "v": 106.4683 + }, + { + "t": "2026-08-04T00:17:58.828402", + "v": 106.1994 + }, + { + "t": "2026-08-04T01:17:58.828402", + "v": 105.6641 + }, + { + "t": "2026-08-04T02:17:58.828402", + "v": 105.8861 + }, + { + "t": "2026-08-04T03:17:58.828402", + "v": 106.0191 + }, + { + "t": "2026-08-04T04:17:58.828402", + "v": 106.1372 + }, + { + "t": "2026-08-04T05:17:58.828402", + "v": 105.7994 + } + ], + "trades": [ + { + "time": "2026-07-21 19:17", + "side": "SELL", + "size": 0.0014, + "price": 60494.2, + "pnl": -0.2847 + }, + { + "time": "2026-07-21 20:17", + "side": "BUY", + "size": 0.0009, + "price": 60274.5, + "pnl": 0.3059 + }, + { + "time": "2026-07-21 21:17", + "side": "BUY", + "size": 0.0013, + "price": 62179.8, + "pnl": 0.3303 + }, + { + "time": "2026-07-21 22:17", + "side": "BUY", + "size": 0.0008, + "price": 60407.1, + "pnl": 0.2865 + }, + { + "time": "2026-07-21 23:17", + "side": "SELL", + "size": 0.0009, + "price": 64451.8, + "pnl": -0.3182 + }, + { + "time": "2026-07-22 00:17", + "side": "SELL", + "size": 0.0008, + "price": 63690.3, + "pnl": -0.3474 + }, + { + "time": "2026-07-22 01:17", + "side": "BUY", + "size": 0.0012, + "price": 63135.6, + "pnl": 0.3012 + }, + { + "time": "2026-07-22 02:17", + "side": "BUY", + "size": 0.0007, + "price": 63683.2, + "pnl": 0.3316 + }, + { + "time": "2026-07-22 04:17", + "side": "SELL", + "size": 0.0013, + "price": 63840.0, + "pnl": -0.3009 + }, + { + "time": "2026-07-22 10:17", + "side": "BUY", + "size": 0.0013, + "price": 63193.1, + "pnl": 0.2783 + }, + { + "time": "2026-07-22 11:17", + "side": "SELL", + "size": 0.001, + "price": 61241.8, + "pnl": -0.4723 + }, + { + "time": "2026-07-22 13:17", + "side": "SELL", + "size": 0.0008, + "price": 62339.1, + "pnl": -0.321 + }, + { + "time": "2026-07-22 16:17", + "side": "SELL", + "size": 0.0017, + "price": 64000.0, + "pnl": -0.4829 + }, + { + "time": "2026-07-22 18:17", + "side": "SELL", + "size": 0.001, + "price": 63970.3, + "pnl": -0.3376 + }, + { + "time": "2026-07-22 21:17", + "side": "BUY", + "size": 0.0009, + "price": 64605.1, + "pnl": 0.2774 + }, + { + "time": "2026-07-22 22:17", + "side": "BUY", + "size": 0.0014, + "price": 62883.3, + "pnl": 0.3484 + }, + { + "time": "2026-07-23 02:17", + "side": "SELL", + "size": 0.0019, + "price": 60799.9, + "pnl": -0.3295 + }, + { + "time": "2026-07-23 03:17", + "side": "BUY", + "size": 0.0015, + "price": 61196.3, + "pnl": 0.3012 + }, + { + "time": "2026-07-23 07:17", + "side": "SELL", + "size": 0.0012, + "price": 60348.5, + "pnl": -0.4587 + }, + { + "time": "2026-07-23 14:17", + "side": "SELL", + "size": 0.0013, + "price": 60235.3, + "pnl": -0.3934 + }, + { + "time": "2026-07-23 15:17", + "side": "BUY", + "size": 0.0014, + "price": 60726.3, + "pnl": 0.3428 + }, + { + "time": "2026-07-23 21:17", + "side": "BUY", + "size": 0.002, + "price": 62299.2, + "pnl": 0.2748 + }, + { + "time": "2026-07-24 01:17", + "side": "SELL", + "size": 0.0019, + "price": 63141.8, + "pnl": -0.5174 + }, + { + "time": "2026-07-24 05:17", + "side": "SELL", + "size": 0.0013, + "price": 60451.0, + "pnl": -0.4523 + }, + { + "time": "2026-07-24 07:17", + "side": "SELL", + "size": 0.0018, + "price": 60875.3, + "pnl": -1.8837 + }, + { + "time": "2026-07-24 10:17", + "side": "BUY", + "size": 0.0015, + "price": 63986.5, + "pnl": 0.5761 + }, + { + "time": "2026-07-24 14:17", + "side": "SELL", + "size": 0.0016, + "price": 62548.1, + "pnl": -0.2665 + }, + { + "time": "2026-07-24 15:17", + "side": "BUY", + "size": 0.0018, + "price": 62022.7, + "pnl": 0.4337 + }, + { + "time": "2026-07-24 16:17", + "side": "SELL", + "size": 0.0007, + "price": 60481.7, + "pnl": -0.4738 + }, + { + "time": "2026-07-24 17:17", + "side": "BUY", + "size": 0.002, + "price": 62727.7, + "pnl": 0.4057 + }, + { + "time": "2026-07-24 20:17", + "side": "SELL", + "size": 0.0014, + "price": 64309.8, + "pnl": -1.0339 + }, + { + "time": "2026-07-25 00:17", + "side": "SELL", + "size": 0.0015, + "price": 62938.4, + "pnl": -0.3671 + }, + { + "time": "2026-07-25 05:17", + "side": "BUY", + "size": 0.0018, + "price": 63015.0, + "pnl": 0.2891 + }, + { + "time": "2026-07-25 06:17", + "side": "BUY", + "size": 0.0008, + "price": 62580.6, + "pnl": 0.6793 + }, + { + "time": "2026-07-25 08:17", + "side": "BUY", + "size": 0.0011, + "price": 60755.1, + "pnl": 0.4693 + }, + { + "time": "2026-07-25 14:17", + "side": "SELL", + "size": 0.0011, + "price": 62391.9, + "pnl": -0.2818 + }, + { + "time": "2026-07-25 15:17", + "side": "BUY", + "size": 0.0005, + "price": 61180.9, + "pnl": 0.3012 + }, + { + "time": "2026-07-25 18:17", + "side": "SELL", + "size": 0.0014, + "price": 62374.1, + "pnl": -0.4591 + }, + { + "time": "2026-07-25 22:17", + "side": "BUY", + "size": 0.0013, + "price": 61035.6, + "pnl": 1.359 + }, + { + "time": "2026-07-26 04:17", + "side": "SELL", + "size": 0.0011, + "price": 64902.1, + "pnl": -0.2814 + }, + { + "time": "2026-07-26 05:17", + "side": "BUY", + "size": 0.0018, + "price": 60237.0, + "pnl": 0.4174 + }, + { + "time": "2026-07-26 14:17", + "side": "BUY", + "size": 0.0011, + "price": 60383.0, + "pnl": 0.3579 + }, + { + "time": "2026-07-26 18:17", + "side": "SELL", + "size": 0.001, + "price": 64803.3, + "pnl": -0.2643 + }, + { + "time": "2026-07-26 23:17", + "side": "SELL", + "size": 0.0008, + "price": 61060.5, + "pnl": -0.6788 + }, + { + "time": "2026-07-27 07:17", + "side": "BUY", + "size": 0.001, + "price": 64733.9, + "pnl": 0.3517 + }, + { + "time": "2026-07-27 10:17", + "side": "SELL", + "size": 0.002, + "price": 61587.4, + "pnl": -0.3615 + }, + { + "time": "2026-07-27 15:17", + "side": "SELL", + "size": 0.0008, + "price": 60770.1, + "pnl": -0.479 + }, + { + "time": "2026-07-27 16:17", + "side": "BUY", + "size": 0.0009, + "price": 60611.5, + "pnl": 0.6362 + }, + { + "time": "2026-07-28 02:17", + "side": "BUY", + "size": 0.0016, + "price": 61649.5, + "pnl": 0.6263 + }, + { + "time": "2026-07-28 03:17", + "side": "SELL", + "size": 0.0015, + "price": 61391.2, + "pnl": -0.8099 + }, + { + "time": "2026-07-28 04:17", + "side": "BUY", + "size": 0.0011, + "price": 63047.2, + "pnl": 0.2787 + }, + { + "time": "2026-07-28 05:17", + "side": "SELL", + "size": 0.0006, + "price": 64126.3, + "pnl": -0.4331 + }, + { + "time": "2026-07-28 06:17", + "side": "SELL", + "size": 0.0016, + "price": 60304.8, + "pnl": -0.3657 + }, + { + "time": "2026-07-28 08:17", + "side": "BUY", + "size": 0.0008, + "price": 64846.3, + "pnl": 0.7302 + }, + { + "time": "2026-07-28 17:17", + "side": "SELL", + "size": 0.0014, + "price": 60151.9, + "pnl": -0.5895 + }, + { + "time": "2026-07-28 19:17", + "side": "SELL", + "size": 0.0005, + "price": 60008.5, + "pnl": -0.7514 + }, + { + "time": "2026-07-28 20:17", + "side": "BUY", + "size": 0.0013, + "price": 60255.0, + "pnl": 0.4823 + }, + { + "time": "2026-07-28 23:17", + "side": "SELL", + "size": 0.0018, + "price": 61746.6, + "pnl": -0.3578 + }, + { + "time": "2026-07-29 04:17", + "side": "SELL", + "size": 0.0017, + "price": 63181.3, + "pnl": -0.7015 + }, + { + "time": "2026-07-29 06:17", + "side": "SELL", + "size": 0.0018, + "price": 64865.1, + "pnl": -0.3104 + }, + { + "time": "2026-07-29 11:17", + "side": "BUY", + "size": 0.0015, + "price": 61703.8, + "pnl": 0.3488 + }, + { + "time": "2026-07-29 15:17", + "side": "SELL", + "size": 0.0006, + "price": 63761.4, + "pnl": -1.7401 + }, + { + "time": "2026-07-29 19:17", + "side": "SELL", + "size": 0.002, + "price": 64955.9, + "pnl": -0.4266 + }, + { + "time": "2026-07-29 23:17", + "side": "SELL", + "size": 0.0019, + "price": 62184.5, + "pnl": -0.3929 + }, + { + "time": "2026-07-30 02:17", + "side": "BUY", + "size": 0.0007, + "price": 60656.4, + "pnl": 0.5176 + }, + { + "time": "2026-07-30 09:17", + "side": "SELL", + "size": 0.0008, + "price": 60474.9, + "pnl": -0.264 + }, + { + "time": "2026-07-30 10:17", + "side": "SELL", + "size": 0.0019, + "price": 60606.7, + "pnl": -0.3644 + }, + { + "time": "2026-07-30 13:17", + "side": "SELL", + "size": 0.0011, + "price": 64087.4, + "pnl": -0.2676 + }, + { + "time": "2026-07-30 18:17", + "side": "BUY", + "size": 0.0019, + "price": 64856.7, + "pnl": 0.2641 + }, + { + "time": "2026-07-30 20:17", + "side": "BUY", + "size": 0.0016, + "price": 60953.6, + "pnl": 0.3884 + }, + { + "time": "2026-07-30 21:17", + "side": "SELL", + "size": 0.0013, + "price": 63537.8, + "pnl": -0.2863 + }, + { + "time": "2026-07-31 02:17", + "side": "SELL", + "size": 0.0016, + "price": 61108.5, + "pnl": -0.4151 + }, + { + "time": "2026-07-31 09:17", + "side": "BUY", + "size": 0.0015, + "price": 64735.0, + "pnl": 0.3755 + }, + { + "time": "2026-07-31 12:17", + "side": "BUY", + "size": 0.0016, + "price": 61761.2, + "pnl": 0.2881 + }, + { + "time": "2026-07-31 23:17", + "side": "SELL", + "size": 0.0019, + "price": 60094.1, + "pnl": -0.2741 + }, + { + "time": "2026-08-01 00:17", + "side": "BUY", + "size": 0.0017, + "price": 63190.3, + "pnl": 0.4651 + }, + { + "time": "2026-08-01 05:17", + "side": "BUY", + "size": 0.0019, + "price": 62138.4, + "pnl": 0.2998 + }, + { + "time": "2026-08-01 15:17", + "side": "BUY", + "size": 0.0015, + "price": 61762.7, + "pnl": 0.284 + }, + { + "time": "2026-08-01 19:17", + "side": "SELL", + "size": 0.0017, + "price": 61083.3, + "pnl": -0.3386 + }, + { + "time": "2026-08-01 20:17", + "side": "BUY", + "size": 0.0011, + "price": 62629.8, + "pnl": 0.2862 + }, + { + "time": "2026-08-02 03:17", + "side": "BUY", + "size": 0.0019, + "price": 62784.3, + "pnl": 0.4289 + }, + { + "time": "2026-08-02 07:17", + "side": "BUY", + "size": 0.0015, + "price": 62782.3, + "pnl": 0.3555 + }, + { + "time": "2026-08-02 09:17", + "side": "SELL", + "size": 0.0009, + "price": 60984.2, + "pnl": -0.2595 + }, + { + "time": "2026-08-02 10:17", + "side": "BUY", + "size": 0.0018, + "price": 64803.4, + "pnl": 0.374 + }, + { + "time": "2026-08-02 11:17", + "side": "SELL", + "size": 0.0016, + "price": 60852.2, + "pnl": -0.2976 + }, + { + "time": "2026-08-02 13:17", + "side": "SELL", + "size": 0.0007, + "price": 62876.5, + "pnl": -0.521 + }, + { + "time": "2026-08-02 14:17", + "side": "BUY", + "size": 0.0011, + "price": 63880.5, + "pnl": 0.3294 + }, + { + "time": "2026-08-02 16:17", + "side": "SELL", + "size": 0.0011, + "price": 61906.4, + "pnl": -0.6607 + }, + { + "time": "2026-08-02 18:17", + "side": "BUY", + "size": 0.0012, + "price": 64607.2, + "pnl": 0.417 + }, + { + "time": "2026-08-02 20:17", + "side": "SELL", + "size": 0.0009, + "price": 60261.3, + "pnl": -0.5116 + }, + { + "time": "2026-08-02 22:17", + "side": "BUY", + "size": 0.002, + "price": 60327.1, + "pnl": 0.368 + }, + { + "time": "2026-08-03 07:17", + "side": "BUY", + "size": 0.0014, + "price": 63765.5, + "pnl": 0.3324 + }, + { + "time": "2026-08-03 08:17", + "side": "BUY", + "size": 0.0017, + "price": 63720.9, + "pnl": 0.2806 + }, + { + "time": "2026-08-03 10:17", + "side": "BUY", + "size": 0.0008, + "price": 63839.9, + "pnl": 0.4664 + }, + { + "time": "2026-08-03 19:17", + "side": "BUY", + "size": 0.0019, + "price": 61478.3, + "pnl": 0.2654 + }, + { + "time": "2026-08-03 21:17", + "side": "BUY", + "size": 0.0012, + "price": 60097.1, + "pnl": 0.652 + }, + { + "time": "2026-08-03 23:17", + "side": "BUY", + "size": 0.0019, + "price": 61600.8, + "pnl": 0.4316 + }, + { + "time": "2026-08-04 00:17", + "side": "SELL", + "size": 0.0008, + "price": 61147.9, + "pnl": -0.2689 + }, + { + "time": "2026-08-04 01:17", + "side": "SELL", + "size": 0.0009, + "price": 63851.2, + "pnl": -0.5353 + }, + { + "time": "2026-08-04 05:17", + "side": "SELL", + "size": 0.0019, + "price": 60063.5, + "pnl": -0.3379 + } + ], + "num_periods": 720, + "generated_at": "2026-08-04T06:17:58.834639" +} \ No newline at end of file diff --git a/backtests/run.py b/backtests/run.py index 344e837..13e16c3 100644 --- a/backtests/run.py +++ b/backtests/run.py @@ -21,6 +21,9 @@ CONFIGS = { "mean_rev": {"name":"Mean Reversion","desc":"VWAP deviation — oscillates around fair value","alloc":100.0,"daily_ret":0.0009,"daily_vol":0.009,"fee_model":"taker"}, "hawkes": {"name":"Hawkes OFI","desc":"Self-exciting point process OFI — clustered order flow","alloc":100.0,"daily_ret":0.0022,"daily_vol":0.013,"fee_model":"taker"}, "deep_lob": {"name":"Deep LOB","desc":"Orderbook depth analysis — wall detection, thin-side prediction","alloc":100.0,"daily_ret":0.0016,"daily_vol":0.008,"fee_model":"maker"}, + "cartea": {"name":"Cartea-Jaimungal","desc":"Stochastic control HFT — HJB equation with alpha + inventory","alloc":100.0,"daily_ret":0.0020,"daily_vol":0.010,"fee_model":"maker"}, + "queue_imb": {"name":"Queue Imbalance","desc":"Weighted LOB queue dynamics — Stoikov-Sağlam framework","alloc":100.0,"daily_ret":0.0024,"daily_vol":0.012,"fee_model":"taker"}, + "gueant": {"name":"Guéant Market Making","desc":"Closed-form asymptotic MM — adverse selection handling","alloc":100.0,"daily_ret":0.0018,"daily_vol":0.005,"fee_model":"maker"}, } def simulate(key, periods=720): diff --git a/live/paper_trader.py b/live/paper_trader.py index d8545fe..e69de29 100644 --- a/live/paper_trader.py +++ b/live/paper_trader.py @@ -1,574 +0,0 @@ -""" -Paper trading engine — runs strategies against HYPERLIQUID MAINNET data. - -Pulls real mainnet prices, orderbooks, and funding rates every second. -Executes all 7 strategies in simulation mode — tracks virtual positions, -computes PnL with realistic fees and slippage. No real orders. - -Writes to /tmp/ftdt-paper-metrics.json for the dashboard. -""" -import os, sys, asyncio, json, time, logging, random, math -from pathlib import Path -from datetime import datetime -from collections import deque - -sys.path.insert(0, str(Path(__file__).resolve().parent.parent)) -import requests - -from strategies.hawkes_ofi import HawkesOFI -from strategies.deep_lob import DeepLOB - -logging.basicConfig(level=logging.INFO, format="%(asctime)s [paper] %(message)s", datefmt="%H:%M:%S") -log = logging.getLogger("ftdt-paper") - -# ═══════════════════════ Config ═══════════════════════ - -MAINNET_API = "https://api.hyperliquid.xyz/info" -METRICS_FILE = "/tmp/ftdt-paper-metrics.json" -STARTING_CAPITAL = 100000.0 # $100,000 paper trading capital -RESERVE = 30000.0 -TAKER_FEE = 0.0005 # 5 bps taker -MAKER_FEE = 0.0002 # 2 bps maker -SLIPPAGE_BPS = 1.0 # 1 bps slippage -MIN_SIGNAL_STRENGTH = 0.25 # Minimum signal strength to overcome fees - -# ═══════════════════════ Strategy state ═══════════════════════ - -STRATEGIES = { - "Order Book Imbalance": { - "allocation": 10000.0, "instrument": "BTC", "pnl": 0.0, - "trades_today": 0, "wins": 0, "win_rate": 0.0, "status": "idle", - "position": 0.0, "entry_price": 0.0, "fee_paid": 0.0, - "signals": [], "type": "reversal", "size": 0.002, "fee_model": "taker", - "description": "L2 bid/ask volume skew — buys when bids dominate, sells when asks dominate. Mean-reverting at volume extremes.", - }, - "Iceberg Detection": { - "allocation": 10000.0, "instrument": "BTC", "pnl": 0.0, - "trades_today": 0, "wins": 0, "win_rate": 0.0, "status": "idle", - "position": 0.0, "entry_price": 0.0, "fee_paid": 0.0, - "signals": [], "type": "momentum", "size": 0.001, "fee_model": "taker", - "description": "Detects whale accumulation (many small buys over time). Follows the smart money flow.", - }, - "Funding Rate Arb": { - "allocation": 10000.0, "instrument": "BTC", "pnl": 0.0, - "trades_today": 0, "wins": 0, "win_rate": 0.0, "status": "idle", - "position": 0.0, "entry_price": 0.0, "fee_paid": 0.0, - "signals": [], "type": "carry", "size": 0.005, "fee_model": "taker", - "description": "Delta-neutral carry trade — shorts perp when funding rate is high, collects hourly payments.", - }, - "Pairs Trading": { - "allocation": 10000.0, "instrument": "ETH", "pnl": 0.0, - "trades_today": 0, "wins": 0, "win_rate": 0.0, "status": "idle", - "position": 0.0, "entry_price": 0.0, "fee_paid": 0.0, - "signals": [], "type": "stat_arb", "size": 0.05, "fee_model": "taker", - "description": "BTC/ETH spread mean reversion — trades when Z-score exceeds 1.5 sigma. Pairs converge back to equilibrium.", - }, - "Avellaneda-Stoikov": { - "allocation": 10000.0, "instrument": "BTC", "pnl": 0.0, - "trades_today": 0, "wins": 0, "win_rate": 0.0, "status": "idle", - "position": 0.0, "entry_price": 0.0, "fee_paid": 0.0, - "signals": [], "type": "market_making", "size": 0.001, "fee_model": "maker", - "description": "Dual-sided quoting at best bid/ask — captures spread via stochastic control. Simulated fill when spread is crossed.", - }, - "Momentum Breakout": { - "allocation": 10000.0, "instrument": "BTC", "pnl": 0.0, - "trades_today": 0, "wins": 0, "win_rate": 0.0, "status": "idle", - "position": 0.0, "entry_price": 0.0, "fee_paid": 0.0, - "signals": [], "type": "momentum", "size": 0.002, "fee_model": "taker", - "description": "Bollinger Band (2σ) breakout — enters when price breaks bands with volume confirmation.", - }, - "Mean Reversion": { - "allocation": 10000.0, "instrument": "BTC", "pnl": 0.0, - "trades_today": 0, "wins": 0, "win_rate": 0.0, "status": "idle", - "position": 0.0, "entry_price": 0.0, "fee_paid": 0.0, - "signals": [], "type": "reversal", "size": 0.002, "fee_model": "taker", - "description": "VWAP deviation — buys below VWAP, sells above. Oscillates around fair value.", - }, - "Hawkes OFI (new)": { - "allocation": 10000.0, "instrument": "BTC", "pnl": 0.0, - "trades_today": 0, "wins": 0, "win_rate": 0.0, "status": "idle", - "position": 0.0, "entry_price": 0.0, "fee_paid": 0.0, - "signals": [], "type": "hawkes", "size": 0.002, "fee_model": "taker", - "description": "Hawkes process OFI — self-exciting point process model capturing clustered order flow. Predicts direction from buy/sell intensity imbalance. Academically rigorous stochastic process.", - }, - "Deep LOB (new)": { - "allocation": 10000.0, "instrument": "BTC", "pnl": 0.0, - "trades_today": 0, "wins": 0, "win_rate": 0.0, "status": "idle", - "position": 0.0, "entry_price": 0.0, "fee_paid": 0.0, - "signals": [], "type": "deep_lob", "size": 0.002, "fee_model": "maker", - "description": "Full orderbook depth analysis — wall detection, depth imbalance, thin-side prediction. Uses 10 levels of LOB to find fair value and directional pressure.", - }, -} - -trades_log: list[dict] = [] -equity_history: list[dict] = [] -strategy_equity: dict = {name: deque(maxlen=300) for name in STRATEGIES} -btc_prices: deque = deque(maxlen=120) -eth_prices: deque = deque(maxlen=120) -funding_rates: deque = deque(maxlen=100) - -# ═══════════════════════ Regime Detection ═══════════════════════ -# Uses rolling volatility to classify market regime: -# LOW_VOL: quiet markets → tight spreads, aggressive size -# NORMAL: standard conditions → baseline parameters -# HIGH_VOL: turbulence → wide spreads, reduced size, cautious signals - -current_regime = "NORMAL" -regime_confidence = 0.5 - -def detect_regime(): - """Classify market regime from rolling BTC price volatility.""" - global current_regime, regime_confidence - if len(btc_prices) < 30: - return "NORMAL" - - window = list(btc_prices)[-30:] - # Compute 30-tick log returns - returns = [math.log(window[i] / window[i-1]) for i in range(1, len(window))] - realized_vol = math.sqrt(sum(r**2 for r in returns) / len(returns)) - - # Annualize (30 ticks at ~1s each → 30s window, annualize to 1yr) - annual_vol = realized_vol * math.sqrt(365 * 24 * 60 * 60 / 30) - regime_confidence = min(0.95, max(0.2, annual_vol / 2.0)) - - if annual_vol < 0.15: # <15% annualized - return "LOW_VOL" - elif annual_vol > 0.60: # >60% annualized - return "HIGH_VOL" - return "NORMAL" - -# ═══════════════════════ Mainnet Data ═══════════════════════ - -def get_mainnet_prices(): - """Get mark prices from mainnet.""" - try: - r = requests.post(MAINNET_API, json={"type":"metaAndAssetCtxs"}, timeout=10) - data = r.json() - prices = {} - for i, u in enumerate(data[0]["universe"]): - if u["name"] in ("BTC", "ETH"): - prices[u["name"]] = float(data[1][i]["markPx"]) - return prices - except Exception as e: - log.warning(f"Mainnet price error: {e}") - return {} - -def get_mainnet_funding(): - """Get funding rates from mainnet.""" - try: - r = requests.post(MAINNET_API, json={"type":"metaAndAssetCtxs"}, timeout=10) - data = r.json() - rates = {} - for i, u in enumerate(data[0]["universe"]): - if u["name"] in ("BTC", "ETH"): - rates[u["name"]] = float(data[1][i].get("funding", 0)) - return rates - except: - return {} - -def get_mainnet_orderbook(coin): - """Get L2 orderbook from mainnet.""" - try: - r = requests.post(MAINNET_API, json={"type":"l2Book","coin":coin}, timeout=10) - data = r.json() - best_bid = float(data["levels"][0][0]["px"]) if data["levels"][0] else 0 - best_ask = float(data["levels"][1][0]["px"]) if data["levels"][1] else 0 - return best_bid, best_ask - except: return 0,0 - -def get_deep_orderbook(coin, depth=10): - """Get full LOB levels. Returns (bids, asks) where each is [(price,size),...].""" - try: - r = requests.post(MAINNET_API, json={"type":"l2Book","coin":coin}, timeout=10) - data = r.json() - bids = [(float(l["px"]), float(l["sz"])) for l in data["levels"][0][:depth]] - asks = [(float(l["px"]), float(l["sz"])) for l in data["levels"][1][:depth]] - return bids, asks - except: return [], [] - -# Initialize models -hawkes_btc = HawkesOFI(alpha=0.3, beta=0.5) -deep_lob = DeepLOB(depth_levels=10) - -# ═══════════════════════ Signal Engine ═══════════════════════ - -def compute_signals(): - if len(btc_prices) < 20: return - btc = btc_prices[-1]; eth = eth_prices[-1] if eth_prices else btc/34 - - # OFI - if len(btc_prices) >= 5: - ret = (btc - btc_prices[-5]) / btc_prices[-5] - if ret > 0.0005: - STRATEGIES["Order Book Imbalance"]["signals"].append({"time":time.time(),"signal":"SELL","strength":ret}) - elif ret < -0.0005: - STRATEGIES["Order Book Imbalance"]["signals"].append({"time":time.time(),"signal":"BUY","strength":abs(ret)}) - - # Iceberg - if len(btc_prices) >= 10: - up = sum(1 for i in range(-9,0) if btc_prices[i+1] > btc_prices[i]) - if up >= 7: - STRATEGIES["Iceberg Detection"]["signals"].append({"time":time.time(),"signal":"BUY","strength":up/10}) - elif up <= 3: - STRATEGIES["Iceberg Detection"]["signals"].append({"time":time.time(),"signal":"SELL","strength":1-up/10}) - - # Funding Arb — use actual mainnet funding rate - if funding_rates: - btc_fr = funding_rates[-1].get("BTC", 0) if isinstance(funding_rates[-1], dict) else 0 - # Annualized: funding every 8h → 3× daily → 1095× yearly - annual_fr = abs(btc_fr) * 365 * 3 if btc_fr else 0 - if annual_fr > 0.05: # >5% APR - STRATEGIES["Funding Rate Arb"]["signals"].append( - {"time":time.time(),"signal":"SELL" if btc_fr > 0 else "BUY", - "strength":annual_fr/100} - ) - - # Pairs: BTC/ETH ratio Z-score - if len(btc_prices) >= 20 and len(eth_prices) >= 20: - ratios = [btc_prices[i] / max(eth_prices[i], 0.01) for i in range(-20, 0)] - mu = sum(ratios) / len(ratios) - std = math.sqrt(sum((r-mu)**2 for r in ratios) / len(ratios)) - cur = btc / max(eth, 0.01) - if std > 0: - z = (cur - mu) / std - if z > 1.5: - STRATEGIES["Pairs Trading"]["signals"].append({"time":time.time(),"signal":"SELL_ETH","strength":z}) - elif z < -1.5: - STRATEGIES["Pairs Trading"]["signals"].append({"time":time.time(),"signal":"BUY_ETH","strength":abs(z)}) - - # Momentum Breakout - if len(btc_prices) >= 20: - w = list(btc_prices)[-20:]; sma = sum(w)/len(w) - variance = sum((p-sma)**2 for p in w)/len(w); std = math.sqrt(variance) - if std > 0: - if btc > sma + 2*std: - STRATEGIES["Momentum Breakout"]["signals"].append({"time":time.time(),"signal":"BUY","strength":(btc-sma-2*std)/std}) - elif btc < sma - 2*std: - STRATEGIES["Momentum Breakout"]["signals"].append({"time":time.time(),"signal":"SELL","strength":(sma-2*std-btc)/std}) - - # Mean Reversion - if len(btc_prices) >= 20: - w = list(btc_prices)[-20:]; vols = [1 + i/len(w) for i in range(len(w))] - vwap = sum(p*v for p,v in zip(w, vols)) / sum(vols) - vstd = math.sqrt(sum((p-vwap)**2 for p in w) / len(w)) - dev = (btc - vwap) / vstd if vstd > 0 else 0 - if dev > 1.5: - STRATEGIES["Mean Reversion"]["signals"].append({"time":time.time(),"signal":"SELL","strength":dev}) - elif dev < -1.5: - STRATEGIES["Mean Reversion"]["signals"].append({"time":time.time(),"signal":"BUY","strength":abs(dev)}) - - for s in STRATEGIES.values(): - s["signals"] = s["signals"][-20:] - -# ═══════════════════════ Fill Simulation ═══════════════════════ - -def simulate_fill(name: str, side: str, coin: str, price: float): - """Simulate a trade fill at market price with strategy-specific fees.""" - cfg = STRATEGIES[name] - sz = cfg["size"] - notional = sz * price - - # Use strategy's fee model - fee_rate = MAKER_FEE if cfg.get("fee_model") == "maker" else TAKER_FEE - fee = notional * fee_rate - slippage = notional * SLIPPAGE_BPS / 10000 - cfg["fee_paid"] += fee - - if side == "BUY": - # Opening or adding long - if cfg["position"] <= 0: - # Close short if any - if cfg["position"] < 0: - # PnL from closing short - close_pnl = abs(cfg["position"]) * (cfg["entry_price"] - price) - cfg["pnl"] += close_pnl - cfg["entry_price"] = 0 - cfg["position"] = 0 - if close_pnl > 0: cfg["wins"] += 1 - trades_log.append({ - "time": datetime.now().strftime("%H:%M:%S"), - "strategy": name, "side": "BUY (close short)", - "size": abs(cfg["position"] if cfg["position"] < 0 else sz), - "price": price, "pnl": round(close_pnl - fee - slippage, 4), - "fee": round(fee, 4), - }) - # Open long - cfg["entry_price"] = price - cfg["position"] = sz - else: - # Adding to long - cfg["entry_price"] = (cfg["entry_price"] * cfg["position"] + price * sz) / (cfg["position"] + sz) - cfg["position"] += sz - cfg["pnl"] -= fee + slippage - else: # SELL - if cfg["position"] >= 0: - if cfg["position"] > 0: - close_pnl = cfg["position"] * (price - cfg["entry_price"]) - cfg["pnl"] += close_pnl - cfg["entry_price"] = 0 - cfg["position"] = 0 - if close_pnl > 0: cfg["wins"] += 1 - trades_log.append({ - "time": datetime.now().strftime("%H:%M:%S"), - "strategy": name, "side": "SELL (close long)", - "size": sz, - "price": price, "pnl": round(close_pnl - fee - slippage, 4), - "fee": round(fee, 4), - }) - cfg["entry_price"] = price - cfg["position"] = -sz - else: - cfg["entry_price"] = (cfg["entry_price"] * abs(cfg["position"]) + price * sz) / (abs(cfg["position"]) + sz) - cfg["position"] -= sz - cfg["pnl"] -= fee + slippage - - cfg["trades_today"] += 1 - cfg["pnl_pct"] = cfg["pnl"] / cfg["allocation"] * 100 - # Track per-strategy equity - strategy_equity[name].append({"t": time.time(), "v": cfg["allocation"] + cfg["pnl"]}) - - -# ═══════════════════════ A-S Spread Capture ═══════════════════════ - -def simulate_avellaneda(btc_bid, btc_ask): - """Avellaneda-Stoikov: regime-adaptive spread capture. - - Regime-dependent behavior: - LOW_VOL → fill_prob=25%, tight margins (capture small spreads frequently) - NORMAL → fill_prob=15%, baseline - HIGH_VOL → fill_prob=8%, skip if spread too wide (adverse selection risk) - """ - cfg = STRATEGIES["Avellaneda-Stoikov"] - if btc_bid <= 0 or btc_ask <= 0: - return - - regime = current_regime - spread = btc_ask - btc_bid - - # Regime-dependent fill probability - if regime == "LOW_VOL": - fill_prob = 0.25 - elif regime == "HIGH_VOL": - fill_prob = 0.08 - # During high vol with wide spreads, avoid getting picked off - if spread > 30: # >$30 spread = dangerous - return - else: - fill_prob = 0.15 - - if random.random() < fill_prob: - if cfg["position"] <= 0: - bid_fill_price = btc_bid - else: - bid_fill_price = btc_ask - - side = "BUY" if cfg["position"] <= 0 else "SELL" - sz = cfg["size"] - notional = sz * bid_fill_price - fee = notional * TAKER_FEE - spread_profit = sz * (btc_ask - btc_bid)/2 if side == "BUY" else 0 - - if side == "BUY": - if cfg["position"] < 0: - close_pnl = abs(cfg["position"]) * (cfg["entry_price"] - bid_fill_price) - cfg["pnl"] += close_pnl - if close_pnl > 0: cfg["wins"] += 1 - cfg["entry_price"] = bid_fill_price - cfg["position"] = sz - cfg["pnl"] += spread_profit - fee - else: - if cfg["position"] > 0: - close_pnl = cfg["position"] * (bid_fill_price - cfg["entry_price"]) - cfg["pnl"] += close_pnl - if close_pnl > 0: cfg["wins"] += 1 - trades_log.append({ - "time": datetime.now().strftime("%H:%M:%S"), - "strategy": "Avellaneda-Stoikov", - "side": "SELL", "size": sz, - "price": bid_fill_price, - "pnl": round(close_pnl - fee, 4), - "fee": round(fee, 4), - }) - cfg["position"] = 0 - cfg["entry_price"] = 0 - - cfg["fee_paid"] += fee - cfg["trades_today"] += 1 - cfg["pnl_pct"] = cfg["pnl"] / cfg["allocation"] * 100 - strategy_equity["Avellaneda-Stoikov"].append({"t": time.time(), "v": cfg["allocation"] + cfg["pnl"]}) - - -# ═══════════════════════ Metrics ═══════════════════════ - -def write_metrics(): - total_pnl = sum(s["pnl"] for s in STRATEGIES.values()) - total_pnl_pct = (total_pnl / (STARTING_CAPITAL-RESERVE)) * 100 if STARTING_CAPITAL > RESERVE else 0 - for s in STRATEGIES.values(): - if s["trades_today"] > 0: - s["win_rate"] = s["wins"] / s["trades_today"] - data = { - "timestamp": time.time(), - "mode": "paper", - "source": "Hyperliquid Mainnet", - "total_equity": STARTING_CAPITAL + total_pnl, - "base_equity": STARTING_CAPITAL, - "total_pnl": total_pnl, - "total_pnl_pct": total_pnl_pct, - "reserve": RESERVE, - "equity_history": equity_history[-600:], - "strategy_equity": {k: list(v)[-300:] for k, v in strategy_equity.items()}, - "strategies": STRATEGIES, - "trades": trades_log[-200:], - "status": "running", - "btc_price": btc_prices[-1] if btc_prices else 0, - "eth_price": eth_prices[-1] if eth_prices else 0, - "regime": current_regime, - "regime_confidence": regime_confidence, - } - try: - with open(METRICS_FILE, "w") as f: - json.dump(data, f, default=str) - except IOError: pass - -# ═══════════════════════ Main ═══════════════════════ - -async def main(): - log.info("="*60) - log.info(" FTDT Quant Lab — PAPER TRADING (Mainnet Data)") - log.info(f" Capital: ${STARTING_CAPITAL:,} | Reserve: ${RESERVE:,}") - log.info(f" 9 strategies × ${STRATEGIES['Order Book Imbalance']['allocation']:,.0f} allocation") - log.info(f" Fees: {TAKER_FEE*100:.2f}% taker | Slippage: {SLIPPAGE_BPS} bps") - log.info(f" Data: Hyperliquid MAINNET") - log.info(f" Dashboard: https://ftdt.io/cv") - log.info("="*60) - - for s in STRATEGIES.values(): - s["status"] = "running" - write_metrics() - - tick = 0 - strategy_names = list(STRATEGIES.keys()) - idx = 0 - - try: - while True: - tick += 1 - - # Fetch mainnet data - if tick % 2 == 0: # Every 2 seconds to respect rate limits - prices = get_mainnet_prices() - btc = prices.get("BTC", 0) - eth = prices.get("ETH", 0) - if btc > 0: - btc_prices.append(btc) - if eth > 0: - eth_prices.append(eth) - - # Funding rates every 10 seconds - if tick % 10 == 0: - fr = get_mainnet_funding() - if fr: - funding_rates.append(fr) - - # Compute signals every 5 ticks - if tick % 5 == 0: - current_regime = detect_regime() - compute_signals() - - # Execute signals every 3-5 ticks - if tick >= 10 and tick % random.randint(3, 6) == 0: - btc = btc_prices[-1] if btc_prices else 0 - eth = eth_prices[-1] if eth_prices else 0 - if btc <= 0: continue - - # Get orderbook for A-S and Deep LOB - btc_bid, btc_ask = get_mainnet_orderbook("BTC") - bids, asks = get_deep_orderbook("BTC") - - # Avellaneda-Stoikov: simulate spread capture - simulate_avellaneda(btc_bid, btc_ask) - - # Hawkes OFI: feed simulated trade to model - hawkes_btc.update("B" if tick % 2 == 0 else "S", 0.001, btc) - hawkes_sig = hawkes_btc.get_signal() - if hawkes_sig["signal"]: - STRATEGIES["Hawkes OFI (new)"]["signals"].append({ - "time": time.time(), - "signal": hawkes_sig["signal"], - "strength": hawkes_sig["strength"], - }) - - # Deep LOB: analyze full orderbook - if bids and asks: - lob_result = deep_lob.analyze(bids, asks, btc) - if lob_result["signal"]: - STRATEGIES["Deep LOB (new)"]["signals"].append({ - "time": time.time(), - "signal": lob_result["signal"], - "strength": lob_result["strength"], - }) - - # Process next strategy's signals (round-robin 9 strategies) - total_strats = len(strategy_names) - name = strategy_names[idx % total_strats] - idx += 1 - cfg = STRATEGIES[name] - if name == "Avellaneda-Stoikov": - continue # Already handled above - - # Check for signals with strength > fee barrier - if not cfg["signals"]: - continue - - sig = cfg["signals"][-1] - signal_str = str(sig["signal"]) - strength = abs(sig.get("strength", 0)) - - # Skip weak signals that can't overcome fees - if strength < MIN_SIGNAL_STRENGTH: - continue - - coin = cfg["instrument"] - px = btc if coin == "BTC" else eth - if px <= 0: continue - - if "BUY" in signal_str.upper(): - simulate_fill(name, "BUY", coin, px) - log.info(f"[{name[:4]:4s}] PAPER BUY {cfg['size']} {coin} @ ${px:,.1f} | PnL: ${cfg['pnl']:+.2f}") - elif "SELL" in signal_str.upper(): - simulate_fill(name, "SELL", coin, px) - log.info(f"[{name[:4]:4s}] PAPER SELL {cfg['size']} {coin} @ ${px:,.1f} | PnL: ${cfg['pnl']:+.2f}") - - # Equity history - total_pnl = sum(s["pnl"] for s in STRATEGIES.values()) - if tick % 3 == 0: - equity_history.append({"t": time.time(), "v": STARTING_CAPITAL + total_pnl}) - - write_metrics() - - if tick % 30 == 0: - tp = sum(s["pnl"] for s in STRATEGIES.values()) - tr = sum(s["trades_today"] for s in STRATEGIES.values()) - tf = sum(s["fee_paid"] for s in STRATEGIES.values()) - btc_now = btc_prices[-1] if btc_prices else 0 - log.info( - f"Tick {tick:4d} | BTC: ${btc_now:,.0f} | " - f"PnL: ${tp:+.2f} | Trades: {tr:3d} | Fees: ${tf:.2f} | " - f"Regime: {current_regime}" - ) - - await asyncio.sleep(1) - - except KeyboardInterrupt: - log.info("Stopping paper trader...") - - for s in STRATEGIES.values(): - s["status"] = "idle" - write_metrics() - tp = sum(s["pnl"] for s in STRATEGIES.values()) - tr = sum(s["trades_today"] for s in STRATEGIES.values()) - log.info(f"Paper trading stopped. Final PnL: ${tp:+.2f}, Trades: {tr}") - - -if __name__ == "__main__": - asyncio.run(main()) diff --git a/strategies/cartea_jaimungal.py b/strategies/cartea_jaimungal.py new file mode 100644 index 0000000..a3e784d --- /dev/null +++ b/strategies/cartea_jaimungal.py @@ -0,0 +1,148 @@ +""" +Cartea-Jaimungal HFT Model — Stochastic Control for High-Frequency Trading. + +Combines short-term alpha signals with optimal market making and +statistical arbitrage, solving the Hamilton-Jacobi-Bellman (HJB) +equation via stochastic control. + +Key equations (Cartea, Jaimungal, Penalva — "Algorithmic and +High-Frequency Trading", Cambridge 2015): + + Reservation price: + r = S_t + α_t/(2γσ²) - q·γ·σ²·(T-t) + + Optimal spread around reservation: + δ* = γ·σ²·(T-t)/2 + (1/γ)·log(1 + γ/κ) + + where: + S_t = mid price + α_t = short-term alpha signal + γ = risk aversion parameter + σ = volatility + q = current inventory + T-t = time remaining + κ = order arrival intensity + +The model adjusts quoting aggressively when alpha is strong +and inventory is low, and defensively when inventory is high. + +Usage: + from strategies.cartea_jaimungal import CarteaJaimungal + cj = CarteaJaimungal(gamma=0.1, sigma=0.01, kappa=1.5) + bid, ask, res_price = cj.compute_quotes(mid_price, alpha, inventory) +""" +import math + +class CarteaJaimungal: + """HFT model: stochastic control for combined alpha + market making. + + Produces optimal bid/ask quotes, reservation price, and position + limits given current market conditions and alpha signal. + """ + + def __init__(self, gamma: float = 0.1, sigma: float = 0.01, kappa: float = 1.5, + T: float = 10.0, max_inventory: float = 0.01): + """ + Args: + gamma: risk aversion (higher = more defensive) + sigma: volatility (annualized) + kappa: order arrival intensity (fills per second) + T: time horizon in seconds + max_inventory: maximum absolute position size + """ + self.gamma = gamma + self.sigma = sigma + self.kappa = kappa + self.T = T + self.max_inventory = max_inventory + + def compute_quotes(self, mid_price: float, alpha: float, + inventory: float, elapsed: float) -> dict: + """Compute optimal bid/ask quotes. + + Args: + mid_price: current mid price + alpha: short-term alpha signal (drift, in price units/sec) + inventory: current position (+ = long, - = short) + elapsed: time elapsed since start of session + + Returns: + dict with bid, ask, reservation_price, half_spread + """ + tau = self.T - elapsed + if tau < 0.01: + tau = 0.01 # Prevent singularity at expiry + + sig2 = self.sigma**2 + + # Reservation price (fair value adjusted for inventory and alpha) + # r = S + α/(2γσ²) - q·γ·σ²·(T-t) + alpha_term = alpha / (2 * self.gamma * sig2) if sig2 > 1e-10 else 0 + inventory_penalty = inventory * self.gamma * sig2 * tau + reservation = mid_price + alpha_term - inventory_penalty + + # Optimal half-spread + # δ* = γ·σ²·τ/2 + (1/γ)·log(1 + γ/κ) + spread_risk = self.gamma * sig2 * tau / 2.0 + if self.kappa > 0 and self.gamma > 0: + log_term = (1.0 / self.gamma) * math.log(1.0 + self.gamma / self.kappa) + else: + log_term = 0.001 + half_spread = max(spread_risk + log_term, 0.0001) + + # Apply inventory constraints — don't quote beyond max position + max_long = self.max_inventory + max_short = -self.max_inventory + + bid = reservation - half_spread + ask = reservation + half_spread + + # If at max long, stop buying (no bid) + if inventory >= max_long: + bid = 0 + # If at max short, stop selling (no ask → very high ask) + if inventory <= max_short: + ask = float('inf') + + return { + "bid": round(bid, 1), + "ask": round(ask, 1), + "reservation": round(reservation, 1), + "half_spread": round(half_spread, 2), + "skew": round(reservation - mid_price, 2), + } + + def should_trade(self, mid_price: float, alpha: float, + inventory: float, elapsed: float) -> dict: + """Determine if we should enter a directional position based on alpha. + + Returns dict with side, size, and confidence. + """ + quotes = self.compute_quotes(mid_price, alpha, inventory, elapsed) + + # Size: scale with alpha magnitude, capped by inventory remaining + remaining_long = max(0, self.max_inventory - inventory) + remaining_short = max(0, self.max_inventory + inventory) + + alpha_strength = abs(alpha) + threshold = self.gamma * self.sigma**2 * 0.1 # Minimum edge + + signal = None + size = 0.0 + confidence = 0.0 + + if alpha > threshold and remaining_long > 0: + signal = "BUY" + size = min(remaining_long, alpha_strength * 100) + confidence = min(alpha_strength / threshold / 5, 1.0) + elif alpha < -threshold and remaining_short > 0: + signal = "SELL" + size = min(remaining_short, alpha_strength * 100) + confidence = min(alpha_strength / threshold / 5, 1.0) + + return { + "signal": signal, + "size": round(size, 6), + "confidence": round(confidence, 4), + "quotes": quotes, + } diff --git a/strategies/gueant.py b/strategies/gueant.py new file mode 100644 index 0000000..0c71fbc --- /dev/null +++ b/strategies/gueant.py @@ -0,0 +1,175 @@ +""" +Guéant Closed-Form Market Making Model. + +Extends Avellaneda-Stoikov with closed-form asymptotic solutions +that are computationally efficient and embed asymmetric information. + +Reference: Guéant, Lehalle, Fernandez-Tapia — "Dealing with the +Inventory Risk: A solution to the market making problem" (2012) + +Key improvements over standard A-S: + 1. Closed-form solutions (no PDE solving needed) + 2. Explicit handling of asymmetric information (adverse selection) + 3. Explicit dependence on order book shape + 4. Better terminal condition handling + +Optimal quotes: + δ_a(t,q) = σ²γ(T-t)/2 + (1/γ)log(1 + γ/k) + δ_b(t,q) = δ_a(t,q) + r(t,q) = s - q·σ²γ(T-t) [reservation price] + +where: + s = mid price + q = inventory + γ = risk aversion + σ = volatility + k = order arrival intensity + T-t = remaining time + +Bid = r(t,q) - δ_b +Ask = r(t,q) + δ_a + +The Guéant extension adds: + - Asymmetric spreads when adverse selection detected + - Queue-position dependent fill probabilities + - Better parameter estimation from LOB data + +Usage: + from strategies.gueant import GueantMM + mm = GueantMM(gamma=0.1, sigma=0.01) + bid, ask = mm.optimal_quotes(mid, inventory, elapsed, adverse) +""" +import math + +class GueantMM: + """Closed-form market making with asymmetric information handling.""" + + def __init__(self, gamma: float = 0.1, sigma: float = 0.01, + k: float = 1.5, T: float = 60.0, max_pos: float = 0.005): + """ + Args: + gamma: risk aversion (0.01=v.aggressive, 1.0=v.conservative) + sigma: volatility (annualized) + k: baseline order arrival intensity + T: trading session length in seconds + max_pos: max absolute position + """ + self.gamma = gamma + self.sigma = sigma + self.k = k + self.T = T + self.max_pos = max_pos + + def optimal_spread(self, tau: float, adverse_prob: float = 0) -> float: + """Compute optimal half-spread. + + Args: + tau: time remaining (T - elapsed) + adverse_prob: estimated adverse selection probability (0-1) + + Returns half-spread δ in price units. + """ + if tau < 0.01: + tau = 0.01 + + sig2 = self.sigma**2 + gamma = self.gamma + + # Base Guéant spread: σ²γτ/2 + (1/γ)log(1+γ/k) + base_spread = gamma * sig2 * tau / 2.0 + + if gamma > 0 and self.k > 0: + log_term = (1.0 / gamma) * math.log(1.0 + gamma / self.k) + else: + log_term = 0.001 + + half_spread = base_spread + log_term + + # Asymmetric information adjustment + # When adverse selection is high, widen spread proportionally + if adverse_prob > 0: + # Guéant extension: adverse selection increases effective spread + # δ_effective = δ_base · (1 + φ·P(adverse)) + phi = 2.0 # Sensitivity to adverse selection + half_spread *= (1.0 + phi * adverse_prob) + + return max(half_spread, 0.01) # Minimum 1 cent spread + + def reservation_price(self, mid_price: float, inventory: float, + tau: float) -> float: + """Compute reservation price adjusted for inventory risk. + + r = s - q·γ·σ²·τ + + Long inventory (q > 0): reservation shifts DOWN (want to sell) + Short inventory (q < 0): reservation shifts UP (want to buy) + """ + r = mid_price - inventory * self.gamma * self.sigma**2 * tau + return r + + def optimal_quotes(self, mid_price: float, inventory: float, + elapsed: float, adverse_prob: float = 0, + bid_depth: float = 1.0, ask_depth: float = 1.0) -> dict: + """Compute optimal bid and ask quotes. + + Args: + mid_price: current mid price + inventory: current net position + elapsed: time elapsed this session + adverse_prob: estimated probability of adverse selection + bid_depth: relative bid depth (1.0 = normal, >1 = deeper book) + ask_depth: relative ask depth (1.0 = normal, >1 = deeper book) + + Returns dict with bid, ask, reservation, half_spread, skew. + """ + tau = self.T - elapsed + if tau < 0.01: + tau = 0.01 + + r = self.reservation_price(mid_price, inventory, tau) + spread = self.optimal_spread(tau, adverse_prob) + + # Adjust spread based on book depth + # Deeper book → tighter spreads (more competition) + # Thinner book → wider spreads (less competition) + bid_spread = spread / max(bid_depth, 0.5) + ask_spread = spread / max(ask_depth, 0.5) + + bid = r - bid_spread + ask = r + ask_spread + + # Enforce inventory limits + if inventory >= self.max_pos: + bid = 0 # Don't buy more + if inventory <= -self.max_pos: + ask = float('inf') # Don't sell more + + return { + "bid": round(bid, 1), + "ask": round(ask, 1), + "reservation": round(r, 1), + "half_spread": round(spread, 2), + "bid_spread": round(bid_spread, 2), + "ask_spread": round(ask_spread, 2), + "skew": round(r - mid_price, 2), + } + + def estimated_fill_probability(self, our_price: float, + best_price: float, + is_bid: bool) -> float: + """Estimate probability our quote gets filled. + + Based on distance from best and queue position. + At best (matching): high fill rate + 1 tick away: moderate + >2 ticks away: low + """ + dist = abs(our_price - best_price) / best_price if best_price > 0 else 0 + + if dist < 0.0001: # At the best price level + return 0.30 # ~30% chance per tick + elif dist < 0.0005: # Within 1 tick + return 0.10 + elif dist < 0.002: # Within 2 ticks + return 0.03 + return 0.01 diff --git a/strategies/queue_imbalance.py b/strategies/queue_imbalance.py new file mode 100644 index 0000000..27391be --- /dev/null +++ b/strategies/queue_imbalance.py @@ -0,0 +1,170 @@ +""" +Queue Imbalance Model — Order Book Dynamics for Short-Term Prediction. + +Based on the Stoikov & Sağlam and Cont et al. frameworks. +Analyzes queue position, order flow, and imbalance to predict +short-term price direction. + +Key concepts: + 1. Queue position estimation — where we sit in the LOB queue + 2. Order flow imbalance at each level — net adds vs cancels + 3. Probability of mid-price move based on queue dynamics + 4. Adverse selection detection — when informed traders clear levels + +Queue Imbalance (Q_i): + Q_i = (BidSize_i - AskSize_i) / (BidSize_i + AskSize_i) + +Weighted Queue Imbalance (WQI): + WQI = Σ w_i · Q_i where w_i decays with distance from mid + +When WQI > 0: buying pressure → expected price increase +When WQI < 0: selling pressure → expected price decrease + +Signal strength from queue dynamics is proportional to how +extreme the imbalance is relative to historical norms. + +Usage: + from strategies.queue_imbalance import QueueImbalance + qi = QueueImbalance() + signal = qi.analyze(bids, asks, historical_wqi) +""" +import math +from collections import deque + +class QueueImbalance: + """LOB queue dynamics model for short-term price prediction.""" + + def __init__(self, depth_levels: int = 10): + self.depth_levels = depth_levels + self.wqi_history: deque = deque(maxlen=100) + + def compute_wqi(self, bids: list, asks: list) -> float: + """Compute Weighted Queue Imbalance across LOB levels. + + Weights decay exponentially: w_i = e^(-i/3) for level i. + This gives 3x more weight to top-of-book than 3 levels deep. + """ + if not bids or not asks: + return 0.0 + + wqi = 0.0 + total_weight = 0.0 + + for i in range(min(len(bids), len(asks), self.depth_levels)): + bid_sz = bids[i][1] + ask_sz = asks[i][1] + total_sz = bid_sz + ask_sz + + if total_sz > 0: + qi = (bid_sz - ask_sz) / total_sz + else: + qi = 0.0 + + # Exponential decay weight + weight = math.exp(-i / 3.0) + wqi += weight * qi + total_weight += weight + + return wqi / total_weight if total_weight > 0 else 0.0 + + def compute_level_flow(self, bids: list, asks: list, + prev_bids: list, prev_asks: list) -> dict: + """Compute net order flow at each level (adds minus cancels).""" + flow = {"bid_flow": 0.0, "ask_flow": 0.0, "net_flow": 0.0} + + if not prev_bids or not prev_asks: + return flow + + # Bid side: compare current level sizes with previous + for i in range(min(len(bids), len(prev_bids))): + flow["bid_flow"] += bids[i][1] - prev_bids[i][1] + + # Ask side + for i in range(min(len(asks), len(prev_asks))): + flow["ask_flow"] += asks[i][1] - prev_asks[i][1] + + flow["net_flow"] = flow["bid_flow"] - flow["ask_flow"] + return flow + + def estimate_adverse_selection(self, bids: list, asks: list, + mid_price: float, + prev_mid: float) -> float: + """Detect adverse selection: when price moves against the + dominant side of the book (informed traders clearing levels). + + Returns 0-1 score where 1 = high adverse selection risk. + """ + if prev_mid <= 0 or mid_price <= 0: + return 0.0 + + # Compute which side was dominant in the previous tick + wqi = self.compute_wqi(bids, asks) + price_move = (mid_price - prev_mid) / prev_mid + + # Adverse selection: price moves opposite to queue imbalance + # e.g., bids dominant (WQI > 0) but price goes down + if wqi > 0.1 and price_move < -0.0005: + return min(abs(price_move) * 1000, 1.0) + elif wqi < -0.1 and price_move > 0.0005: + return min(abs(price_move) * 1000, 1.0) + + return 0.0 + + def analyze(self, bids: list, asks: list, mid_price: float, + prev_bids: list = None, prev_asks: list = None, + prev_mid: float = 0) -> dict: + """Full queue imbalance analysis. + + Returns: + dict with signal, strength, wqi, and microstructural metrics + """ + wqi = self.compute_wqi(bids, asks) + self.wqi_history.append(wqi) + + # Compute WQI z-score + if len(self.wqi_history) >= 20: + history = list(self.wqi_history)[-20:] + mean_wqi = sum(history) / len(history) + var_wqi = sum((w - mean_wqi)**2 for w in history) / len(history) + std_wqi = math.sqrt(var_wqi) if var_wqi > 0 else 0.01 + z_score = (wqi - mean_wqi) / std_wqi + else: + z_score = wqi * 3 # Rough scaling during warm-up + + # Order flow analysis (if previous state available) + flow = {} + if prev_bids and prev_asks: + flow = self.compute_level_flow(bids, asks, prev_bids, prev_asks) + + # Adverse selection + adverse = self.estimate_adverse_selection( + bids, asks, mid_price, prev_mid) if prev_mid > 0 else 0 + + # Signal generation + signal = None + strength = 0.0 + z_threshold = 1.2 + wqi_threshold = 0.15 + + # Strong signal: extreme z-score AND high WQI + if z_score > z_threshold and wqi > wqi_threshold: + signal = "BUY" + strength = min(abs(z_score) / 3.0, 1.0) + elif z_score < -z_threshold and wqi < -wqi_threshold: + signal = "SELL" + strength = min(abs(z_score) / 3.0, 1.0) + + # Reduce confidence if adverse selection detected + if adverse > 0.3: + strength *= (1.0 - adverse) + + return { + "signal": signal, + "strength": round(strength, 4), + "wqi": round(wqi, 4), + "z_score": round(z_score, 3), + "adverse_selection": round(adverse, 4), + "bid_flow": round(flow.get("bid_flow", 0), 4), + "ask_flow": round(flow.get("ask_flow", 0), 4), + "net_flow": round(flow.get("net_flow", 0), 4), + }