From 5c271b27d48455553868e3d5408dabb3f5385739 Mon Sep 17 00:00:00 2001
From: Dominick Dupuy <112484879+BonelessWater@users.noreply.github.com>
Date: Thu, 17 Apr 2025 13:46:39 -0400
Subject: [PATCH 01/54] Update README.md
---
README.md | 49 -------------------------------------------------
1 file changed, 49 deletions(-)
diff --git a/README.md b/README.md
index 9461780..ad2d826 100644
--- a/README.md
+++ b/README.md
@@ -3,52 +3,3 @@
# AlgoSystem
A 'batteries-included' pythonic library for AlgoGators members to streamline development workflow.
-
-## Installation
-
-```bash
-pip install algosystem
-```
-
-## Features
-
-- Backtesting engine with standardized metrics
-- Database connectors for pushing and retrieving backtest results
-- Analysis tools for risk and performance evaluation
-- Reporting capabilities for investment proposals
-- Command-line interface for common operations
-
-## Usage
-
-```python
-import algosystem as algo
-
-# Quick backtest example
-backtest = algo.backtesting.Engine(
- strategy=my_strategy,
- data=my_data,
- start_date="2020-01-01",
- end_date="2021-01-01"
-)
-results = backtest.run()
-
-# Push results to database
-algo.data.connectors.push_to_db(results, "my_strategy_v1")
-
-# Generate standard metrics report
-report = algo.reporting.generate_report(results)
-report.save("my_strategy_report.pdf")
-```
-
-## Command Line Interface
-
-```bash
-# Run backtest from configuration file
-algosystem backtest --config my_config.yaml
-
-# Push backtest results to database
-algosystem push --results results.pkl --name "my_strategy_v1"
-
-# Generate standard report
-algosystem report --results results.pkl --output report.pdf
-```
\ No newline at end of file
From 867ac8b95539ce4ec9dee14cc1ef25225b6bbccf Mon Sep 17 00:00:00 2001
From: BonelessWater
Date: Thu, 24 Apr 2025 23:22:14 -0400
Subject: [PATCH 02/54] config
---
algosystem/utils/config.py | 12 +-
algosystem/utils/graph_config.json | 27 +-
benchmark.csv | 1001 ++++++++++++++++++++++++++++
strategy.csv | 1001 ++++++++++++++++++++++++++++
test.py | 2 +
5 files changed, 2037 insertions(+), 6 deletions(-)
create mode 100644 benchmark.csv
create mode 100644 strategy.csv
diff --git a/algosystem/utils/config.py b/algosystem/utils/config.py
index a930dab..baef2eb 100644
--- a/algosystem/utils/config.py
+++ b/algosystem/utils/config.py
@@ -5,10 +5,8 @@
QWidget, QPushButton, QLabel, QMenu, QDialog,
QGridLayout, QComboBox, QColorDialog, QSlider, QSpinBox,
QDoubleSpinBox, QCheckBox, QGroupBox, QToolButton, QScrollArea)
-from PyQt6.QtCore import Qt, pyqtSignal, QSize, QPoint
-from PyQt6.QtGui import QAction, QIcon
+from PyQt6.QtCore import pyqtSignal, QPoint
import pyqtgraph as pg
-from functools import partial
# For saving and loading configurations
CONFIG_PATH = os.path.join(os.path.dirname(__file__), "graph_config.json")
@@ -376,8 +374,12 @@ def load_dashboard(self):
self.graphs.append(graph)
-def config_UI():
+def config_UI(strategy_path=None):
+ """Main function to run the Graph Dashboard"""
app = pg.mkQApp("Graph Dashboard")
dashboard = GraphDashboard()
dashboard.show()
- sys.exit(app.exec())
\ No newline at end of file
+ sys.exit(app.exec())
+
+if __name__ == "__main__":
+ config_UI()
\ No newline at end of file
diff --git a/algosystem/utils/graph_config.json b/algosystem/utils/graph_config.json
index 6ad5b4f..98ab966 100644
--- a/algosystem/utils/graph_config.json
+++ b/algosystem/utils/graph_config.json
@@ -1,3 +1,28 @@
{
- "graphs": []
+ "graphs": [
+ {
+ "id": 2157940446288,
+ "type": "scatter",
+ "title": "Scatter Graph 1",
+ "config": {}
+ },
+ {
+ "id": 2158012825136,
+ "type": "scatter",
+ "title": "Scatter Graph 2",
+ "config": {}
+ },
+ {
+ "id": 2158013241200,
+ "type": "line",
+ "title": "Line Graph 3",
+ "config": {}
+ },
+ {
+ "id": 2158013313456,
+ "type": "bar",
+ "title": "Bar Graph 4",
+ "config": {}
+ }
+ ]
}
\ No newline at end of file
diff --git a/benchmark.csv b/benchmark.csv
new file mode 100644
index 0000000..dfaff31
--- /dev/null
+++ b/benchmark.csv
@@ -0,0 +1,1001 @@
+,Benchmark
+2020-01-01,-0.24106536260370706
+2020-01-02,0.13967091520814182
+2020-01-03,-1.249317234667989
+2020-01-06,-0.9206594428267999
+2020-01-07,-1.7504216494525089
+2020-01-08,-0.5093144341553919
+2020-01-09,-0.5773312288353949
+2020-01-10,-0.5558709432958192
+2020-01-13,-0.10469694157834286
+2020-01-14,0.17140858368029
+2020-01-15,-0.8752910153412127
+2020-01-16,0.8774698398166317
+2020-01-17,-0.49340963278583827
+2020-01-20,-0.746638679075178
+2020-01-21,-0.8146958854979294
+2020-01-22,-1.111756880085303
+2020-01-23,-2.2902013794922573
+2020-01-24,-2.9961985402775255
+2020-01-27,-1.6135152483234156
+2020-01-28,-1.6899324055666811
+2020-01-29,-1.3235095602818285
+2020-01-30,-0.5774683696516566
+2020-01-31,-1.3484754609972271
+2020-02-03,-1.4600583740713509
+2020-02-04,-0.14416897256590677
+2020-02-05,0.8764130820077667
+2020-02-06,2.0795287796904613
+2020-02-07,1.8649265498656424
+2020-02-10,2.266593132766246
+2020-02-11,1.2751610456170068
+2020-02-12,2.914456163778482
+2020-02-13,3.7024090099044074
+2020-02-14,3.5919163471299353
+2020-02-17,3.282239721556179
+2020-02-18,1.7996351173295972
+2020-02-19,3.4226910516934863
+2020-02-20,2.8110581316698666
+2020-02-21,1.9822485278411033
+2020-02-24,2.269707937340102
+2020-02-25,3.3174625439373826
+2020-02-26,3.302224802019464
+2020-02-27,1.614920101433149
+2020-02-28,0.9030488667171225
+2020-03-02,1.3091859703739341
+2020-03-03,0.23266250807934719
+2020-03-04,-1.1097207421670436
+2020-03-05,-1.1773469992610124
+2020-03-06,-0.7937794935390836
+2020-03-09,-1.2156564486718144
+2020-03-10,-2.7000584873349167
+2020-03-11,-1.6624275539797992
+2020-03-12,-2.2554591846384313
+2020-03-13,-1.3647178717236335
+2020-03-16,-2.9408507652851203
+2020-03-17,-2.8933594803178813
+2020-03-18,-3.053334094078936
+2020-03-19,-2.2283984987517016
+2020-03-20,-1.671114208795157
+2020-03-23,-2.5571237598977454
+2020-03-24,-2.368680791471418
+2020-03-25,-2.5972637078643417
+2020-03-26,-1.9364231932027596
+2020-03-27,-2.291182370807355
+2020-03-30,-0.62083384381363
+2020-03-31,-1.2349046506752486
+2020-04-01,-0.5561863781167046
+2020-04-02,-0.8777213080862896
+2020-04-03,-1.3804981960616232
+2020-04-06,-0.9844550607711408
+2020-04-07,-0.9690751999111676
+2020-04-08,-0.5228964254347159
+2020-04-09,-0.7971814169682325
+2020-04-10,-0.9028186824970459
+2020-04-13,0.25968842600855657
+2020-04-14,2.257929212646527
+2020-04-15,2.676426821205053
+2020-04-16,2.6324352061278145
+2020-04-17,3.8816501994034933
+2020-04-20,1.4978156440188113
+2020-04-21,1.875594200620381
+2020-04-22,0.9940794489257094
+2020-04-23,-0.4072728233246843
+2020-04-24,0.4690015516047692
+2020-04-27,0.8224934286502747
+2020-04-28,0.8288458172634291
+2020-04-29,-0.6799276738283303
+2020-04-30,-0.8149654231457526
+2020-05-01,-0.4062070276940938
+2020-05-04,-0.35942361248693916
+2020-05-05,0.06246735344091042
+2020-05-06,-0.4103121986874509
+2020-05-07,0.13712354660343967
+2020-05-08,-0.5605251762719343
+2020-05-11,-0.8669978551007008
+2020-05-12,0.5449302166208875
+2020-05-13,-0.15992608882561543
+2020-05-14,2.236151257826181
+2020-05-15,0.4157159883685557
+2020-05-18,2.1256712071670307
+2020-05-19,2.05077044415901
+2020-05-20,2.6836982530451374
+2020-05-21,3.556772323805109
+2020-05-22,3.36495071326921
+2020-05-25,4.318435645542931
+2020-05-26,4.029656152885522
+2020-05-27,5.125093961640514
+2020-05-28,4.871901836326698
+2020-05-29,5.717555761780746
+2020-06-01,4.564956068007966
+2020-06-02,4.4435015566371225
+2020-06-03,5.874202191450208
+2020-06-04,5.4410972299129945
+2020-06-05,6.206068438709065
+2020-06-08,5.650699443994784
+2020-06-09,6.0478325985855985
+2020-06-10,6.959063784768164
+2020-06-11,7.414387378858482
+2020-06-12,8.813335642170689
+2020-06-15,7.297130261996007
+2020-06-16,7.6133362415098125
+2020-06-17,8.59409951317589
+2020-06-18,8.127292126641246
+2020-06-19,8.676528241896449
+2020-06-22,9.546363435394863
+2020-06-23,11.213866473442405
+2020-06-24,12.060527379607848
+2020-06-25,12.732341305505658
+2020-06-26,14.014963486974779
+2020-06-29,13.892216168293842
+2020-06-30,11.981910746215302
+2020-07-01,11.976496599332117
+2020-07-02,11.807280460895518
+2020-07-03,12.500760074678372
+2020-07-06,13.031721510503358
+2020-07-07,13.794788851986006
+2020-07-08,12.8958608386312
+2020-07-09,13.632333397046766
+2020-07-10,15.059344419248172
+2020-07-13,15.972625039259826
+2020-07-14,13.620492482322673
+2020-07-15,13.500291125031305
+2020-07-16,12.194395503873869
+2020-07-17,13.436415282470294
+2020-07-20,13.18126983611662
+2020-07-21,14.29929400429436
+2020-07-22,13.218494347127875
+2020-07-23,11.860546254618402
+2020-07-24,12.40936206874631
+2020-07-27,12.271967967778744
+2020-07-28,11.2898746048626
+2020-07-29,10.096754554157277
+2020-07-30,9.548204674558804
+2020-07-31,10.414247800251248
+2020-08-03,10.40948445576607
+2020-08-04,10.755751046133776
+2020-08-05,9.734502232692229
+2020-08-06,9.663414230629186
+2020-08-07,10.602557101083823
+2020-08-10,10.787733294340109
+2020-08-11,11.551452908624423
+2020-08-12,12.181883259166904
+2020-08-13,13.113708823521199
+2020-08-14,12.481782981270925
+2020-08-17,12.659897625623568
+2020-08-18,14.178100589727292
+2020-08-19,14.986586486001448
+2020-08-20,15.810994181761844
+2020-08-21,15.579864970909982
+2020-08-24,18.076262126119197
+2020-08-25,19.354557285664775
+2020-08-26,20.023058468818206
+2020-08-27,19.305827853152255
+2020-08-28,20.240511723550366
+2020-08-31,20.568056718951752
+2020-09-01,20.539654279543676
+2020-09-02,19.95669317048361
+2020-09-03,20.369835284656098
+2020-09-04,19.6729845206741
+2020-09-07,19.50159678227195
+2020-09-08,20.33809651466402
+2020-09-09,19.919544471004595
+2020-09-10,20.447857752418845
+2020-09-11,20.880447609561166
+2020-09-14,21.140806433100746
+2020-09-15,22.171076799269976
+2020-09-16,21.937861731632747
+2020-09-17,22.987257849959917
+2020-09-18,21.01587298532924
+2020-09-21,21.169197959261815
+2020-09-22,18.986663606061803
+2020-09-23,19.47810882925236
+2020-09-24,19.659008347390827
+2020-09-25,19.07142909224332
+2020-09-28,19.644223092029
+2020-09-29,20.714072601191884
+2020-09-30,21.86410421663041
+2020-10-01,21.243638558727262
+2020-10-02,22.480235641726455
+2020-10-05,20.626723303168145
+2020-10-06,20.058871028710833
+2020-10-07,19.253934250249703
+2020-10-08,19.054988634373537
+2020-10-09,19.894754191077784
+2020-10-12,20.568227137841898
+2020-10-13,19.38511179726952
+2020-10-14,16.69336502219218
+2020-10-15,16.69645256818856
+2020-10-16,15.435991979473803
+2020-10-19,17.48023512167496
+2020-10-20,18.024875392770017
+2020-10-21,17.239526008970603
+2020-10-22,19.83256455977002
+2020-10-23,18.77538632769957
+2020-10-26,17.61955667457179
+2020-10-27,18.40403256431247
+2020-10-28,20.137178629166367
+2020-10-29,18.409109551591353
+2020-10-30,17.822496957769808
+2020-11-02,17.271103081085595
+2020-11-03,18.00852437468098
+2020-11-04,18.803492678223677
+2020-11-05,19.067103460958496
+2020-11-06,19.54892754559818
+2020-11-09,19.212463749871848
+2020-11-10,18.740974550609213
+2020-11-11,19.80277297086487
+2020-11-12,19.920847340183958
+2020-11-13,20.264451256874505
+2020-11-16,18.74879233532062
+2020-11-17,18.843538322686694
+2020-11-18,19.900621715158326
+2020-11-19,18.60293996936923
+2020-11-20,18.66832151171556
+2020-11-23,18.705593696469766
+2020-11-24,18.464701101888934
+2020-11-25,19.065978747480813
+2020-11-26,19.03295031044734
+2020-11-27,19.051022233882474
+2020-11-30,20.79195292518924
+2020-12-01,19.927677986731776
+2020-12-02,19.933774177356945
+2020-12-03,21.095428999298953
+2020-12-04,20.36852124151399
+2020-12-07,20.619930685188994
+2020-12-08,20.858620832214708
+2020-12-09,21.01651023741994
+2020-12-10,21.17515722219041
+2020-12-11,21.957502186894516
+2020-12-14,21.708198012397368
+2020-12-15,22.996210839771827
+2020-12-16,22.596991784528377
+2020-12-17,25.430047402388478
+2020-12-18,25.53014403136239
+2020-12-21,23.781300771479373
+2020-12-22,22.201634203326712
+2020-12-23,20.418665837602795
+2020-12-24,19.928758871937305
+2020-12-25,23.000362034904963
+2020-12-28,22.955346632943403
+2020-12-29,21.44651491419927
+2020-12-30,20.859090531477865
+2020-12-31,21.010432426854816
+2021-01-01,21.190427091174733
+2021-01-04,21.883663966606207
+2021-01-05,21.10129747803363
+2021-01-06,20.798187925566772
+2021-01-07,20.075219743403434
+2021-01-08,19.255736409261132
+2021-01-11,18.192895787988697
+2021-01-12,16.340599014086116
+2021-01-13,17.041085367587304
+2021-01-14,15.622379490176439
+2021-01-15,17.59818803379545
+2021-01-18,16.113408796794698
+2021-01-19,17.766968062524352
+2021-01-20,17.651872079798697
+2021-01-21,15.964653642740714
+2021-01-22,16.90174621882055
+2021-01-25,15.189922979191376
+2021-01-26,15.386159880666906
+2021-01-27,16.193841538803724
+2021-01-28,15.411236757317473
+2021-01-29,14.515682666296291
+2021-02-01,13.349023056423649
+2021-02-02,12.470548156730475
+2021-02-03,12.294664993616694
+2021-02-04,12.07766237878841
+2021-02-05,10.57822659211268
+2021-02-08,10.884951422648536
+2021-02-09,9.184555940373688
+2021-02-10,9.696539820847464
+2021-02-11,10.521744040173942
+2021-02-12,10.186304506621955
+2021-02-15,11.59532600739529
+2021-02-16,10.261553607454413
+2021-02-17,9.225155704166154
+2021-02-18,8.4372393327385
+2021-02-19,7.034827549323659
+2021-02-22,7.956474329359032
+2021-02-23,6.492116623206541
+2021-02-24,5.753088267703365
+2021-02-25,5.899206249910002
+2021-02-26,6.521876937237646
+2021-03-01,6.431589048348426
+2021-03-02,7.90703887573863
+2021-03-03,7.302374357089866
+2021-03-04,5.178912198580013
+2021-03-05,5.763884519159579
+2021-03-08,5.8731022905391415
+2021-03-09,4.089582900525211
+2021-03-10,4.790759206149957
+2021-03-11,5.454995868511246
+2021-03-12,5.591930783402169
+2021-03-15,7.621657921053618
+2021-03-16,7.812976541089565
+2021-03-17,6.4716221305910295
+2021-03-18,6.107384948276501
+2021-03-19,5.661075702974104
+2021-03-22,4.02140048939123
+2021-03-23,2.884972801357843
+2021-03-24,3.7805665697245043
+2021-03-25,4.099000951118183
+2021-03-26,4.096910747193529
+2021-03-29,2.730686191455423
+2021-03-30,2.160796314663315
+2021-03-31,2.9933532171825252
+2021-04-01,3.03699865692929
+2021-04-02,2.4116379504956806
+2021-04-05,1.5982871375414995
+2021-04-06,2.129375037674801
+2021-04-07,1.3884171659044071
+2021-04-08,1.4500218922453532
+2021-04-09,2.410985495917547
+2021-04-12,3.0207809032464414
+2021-04-13,3.0398395378617415
+2021-04-14,2.539542602996171
+2021-04-15,3.5926837290812683
+2021-04-16,3.9999253583622645
+2021-04-19,4.712292158697564
+2021-04-20,3.0591101434216386
+2021-04-21,3.691742322995193
+2021-04-22,3.805407796691543
+2021-04-23,3.2972593275459587
+2021-04-26,2.1506446380639765
+2021-04-27,0.9569513879533231
+2021-04-28,0.39542998439160637
+2021-04-29,0.8848736203357965
+2021-04-30,1.0122664191483859
+2021-05-03,3.2848315977359652
+2021-05-04,4.230842373405353
+2021-05-05,5.114704958661787
+2021-05-06,4.4333000904926925
+2021-05-07,3.942762670887443
+2021-05-10,3.4426253808571103
+2021-05-11,4.991577902734082
+2021-05-12,5.0221196985811565
+2021-05-13,4.882748617691829
+2021-05-14,5.219514802567681
+2021-05-17,5.545247272020275
+2021-05-18,5.194727437381729
+2021-05-19,5.174405176151688
+2021-05-20,5.327198634875571
+2021-05-21,6.144557367857599
+2021-05-24,5.85522151319023
+2021-05-25,6.06295791867383
+2021-05-26,5.713719175621288
+2021-05-27,5.682518753357719
+2021-05-28,5.5074654319620935
+2021-05-31,4.705412046076471
+2021-06-01,6.042573997562175
+2021-06-02,5.95415885917898
+2021-06-03,7.212838761598157
+2021-06-04,7.780932274784173
+2021-06-07,6.921178235751461
+2021-06-08,7.590396731922076
+2021-06-09,7.493583505517011
+2021-06-10,5.391844020089698
+2021-06-11,5.843362713564377
+2021-06-14,5.807115358027554
+2021-06-15,7.609008985954773
+2021-06-16,8.799055033826752
+2021-06-17,10.359976754423698
+2021-06-18,12.424751761412704
+2021-06-21,13.587635478592487
+2021-06-22,14.12417940328544
+2021-06-23,15.75715024678678
+2021-06-24,16.00530827983472
+2021-06-25,15.292246694355365
+2021-06-28,14.388593342860197
+2021-06-29,13.486382708486602
+2021-06-30,14.900632988141611
+2021-07-01,14.656465290586913
+2021-07-02,15.873149376796887
+2021-07-05,13.94053561345957
+2021-07-06,15.49853501934653
+2021-07-07,17.28499473216075
+2021-07-08,18.192789527864427
+2021-07-09,18.982995178909917
+2021-07-12,18.89739514826615
+2021-07-13,19.273436322915202
+2021-07-14,18.391983582795117
+2021-07-15,18.582718448488396
+2021-07-16,19.791901952080387
+2021-07-19,20.033610685254956
+2021-07-20,20.27154135413492
+2021-07-21,20.705764734605676
+2021-07-22,21.930341618712482
+2021-07-23,21.10415286517255
+2021-07-26,19.05179109474903
+2021-07-27,17.902123897531528
+2021-07-28,18.330916149241013
+2021-07-29,18.740213312001128
+2021-07-30,16.98263000200872
+2021-08-02,17.258473395529037
+2021-08-03,16.97556369495722
+2021-08-04,18.20162932893748
+2021-08-05,16.20770536024375
+2021-08-06,16.698185757523945
+2021-08-09,16.48534504124847
+2021-08-10,17.046624097407445
+2021-08-11,18.101674923765636
+2021-08-12,16.88840658606155
+2021-08-13,16.62399297823692
+2021-08-16,16.29602657663772
+2021-08-17,16.22835020267315
+2021-08-18,16.60312896351773
+2021-08-19,17.14587581643626
+2021-08-20,16.42145412092892
+2021-08-23,15.197818311470174
+2021-08-24,16.73600005123743
+2021-08-25,16.007934854585546
+2021-08-26,15.265357260519194
+2021-08-27,15.660289523378372
+2021-08-30,15.674569423048592
+2021-08-31,14.783499299236091
+2021-09-01,13.876742542086573
+2021-09-02,12.628079611024475
+2021-09-03,14.235491085212521
+2021-09-06,15.440733069282471
+2021-09-07,17.02801737759941
+2021-09-08,17.244242706549777
+2021-09-09,17.93073811323492
+2021-09-10,20.667096466345683
+2021-09-13,21.2810783978894
+2021-09-14,19.78453103887049
+2021-09-15,19.968225127408715
+2021-09-16,19.353044845488284
+2021-09-17,18.557431040316143
+2021-09-20,17.190291896141108
+2021-09-21,17.499231270310343
+2021-09-22,17.189480663042374
+2021-09-23,15.27245304162292
+2021-09-24,14.547279292345051
+2021-09-27,15.354981774717402
+2021-09-28,15.647118076730585
+2021-09-29,14.740692793664467
+2021-09-30,12.266850599495974
+2021-10-01,12.381452735618005
+2021-10-04,13.335291462920258
+2021-10-05,13.34886497342576
+2021-10-06,14.954360771931253
+2021-10-07,14.35792529298644
+2021-10-08,13.553208752728906
+2021-10-11,14.299739874416607
+2021-10-12,12.331363679732405
+2021-10-13,11.367241650343596
+2021-10-14,11.963208119684392
+2021-10-15,12.154460431870524
+2021-10-18,12.479247214765852
+2021-10-19,12.986700932838543
+2021-10-20,12.31419128540981
+2021-10-21,11.60343237286222
+2021-10-22,12.839930766347425
+2021-10-25,11.82626455528715
+2021-10-26,12.010547912964853
+2021-10-27,11.509364774623391
+2021-10-28,12.282000286301791
+2021-10-29,11.495242278073782
+2021-11-01,12.591792309545301
+2021-11-02,11.99589330383195
+2021-11-03,11.765251556798878
+2021-11-04,11.981520024178781
+2021-11-05,12.24495096295037
+2021-11-08,12.035558448393065
+2021-11-09,10.86442772574668
+2021-11-10,9.20656679444458
+2021-11-11,9.788746885046475
+2021-11-12,9.746820029466521
+2021-11-15,9.606228785642786
+2021-11-16,9.537138183286153
+2021-11-17,9.473586260731597
+2021-11-18,9.159649943552461
+2021-11-19,9.872096741663292
+2021-11-22,9.154871471814435
+2021-11-23,9.871991785959056
+2021-11-24,10.47122551228455
+2021-11-25,8.863083782717819
+2021-11-26,9.713659326349422
+2021-11-29,10.536284511847624
+2021-11-30,11.273527645758344
+2021-12-01,10.73969776925586
+2021-12-02,10.364073715172635
+2021-12-03,10.654483942417286
+2021-12-06,10.428989661715606
+2021-12-07,8.793330953813417
+2021-12-08,8.870031953880831
+2021-12-09,8.727192085396457
+2021-12-10,7.851925571406575
+2021-12-13,8.473850812423212
+2021-12-14,8.981238154215525
+2021-12-15,8.453944364691884
+2021-12-16,8.475334152007175
+2021-12-17,8.612025753390759
+2021-12-20,7.512914396780715
+2021-12-21,7.519687915539051
+2021-12-22,7.661296779484127
+2021-12-23,7.532660035791614
+2021-12-24,8.109762077761053
+2021-12-27,5.493017589669101
+2021-12-28,3.788262716891189
+2021-12-29,2.339370790705357
+2021-12-30,2.5401130528668157
+2021-12-31,2.8363719638505063
+2022-01-03,0.9408395162160856
+2022-01-04,-0.16405257688801145
+2022-01-05,0.3860139396824712
+2022-01-06,2.6736253134602186
+2022-01-07,2.146146365627526
+2022-01-10,2.3478213074041454
+2022-01-11,1.389981887907769
+2022-01-12,2.7234194748626046
+2022-01-13,2.7932710865413295
+2022-01-14,3.2665357716222396
+2022-01-17,4.28050686951504
+2022-01-18,6.013762165954208
+2022-01-19,5.85897953451127
+2022-01-20,5.129580421994385
+2022-01-21,6.986511401152172
+2022-01-24,8.107273851279118
+2022-01-25,9.526050466696487
+2022-01-26,8.539919873100288
+2022-01-27,8.153204429519393
+2022-01-28,7.9766802707417135
+2022-01-31,9.33671255278586
+2022-02-01,7.510669748982463
+2022-02-02,7.016920023631169
+2022-02-03,6.912847470396374
+2022-02-04,6.3523014788429695
+2022-02-07,6.8116775572230415
+2022-02-08,6.0612847572041515
+2022-02-09,6.310554826909893
+2022-02-10,7.436547419171382
+2022-02-11,6.82153363845936
+2022-02-14,5.117615105129082
+2022-02-15,3.9306904566224246
+2022-02-16,2.733479292576973
+2022-02-17,1.593909070469472
+2022-02-18,0.05302099150343831
+2022-02-21,1.6985246435250718
+2022-02-22,2.600709986967994
+2022-02-23,1.8664577933958912
+2022-02-24,1.7767428440659352
+2022-02-25,2.0424032674331247
+2022-02-28,0.10248879633697383
+2022-03-01,0.6156851272568927
+2022-03-02,-0.16479082801518818
+2022-03-03,-1.1581823465505705
+2022-03-04,0.3707494347230218
+2022-03-07,-0.6239427450068424
+2022-03-08,0.7386456302269762
+2022-03-09,0.943780588780016
+2022-03-10,0.2759898198595381
+2022-03-11,-1.054201847017643
+2022-03-14,0.7913368762590245
+2022-03-15,0.41434002315504403
+2022-03-16,1.6562282667149655
+2022-03-17,1.2886603516431077
+2022-03-18,2.0660589094274746
+2022-03-21,1.6489212683307994
+2022-03-22,-0.46651204829722737
+2022-03-23,-0.5823227270636917
+2022-03-24,-2.012419552865533
+2022-03-25,-1.8714719611178032
+2022-03-28,-1.527616339502365
+2022-03-29,-0.8389498059750513
+2022-03-30,-0.3174930621705837
+2022-03-31,-0.28287710359468504
+2022-04-01,0.9087670960262906
+2022-04-04,2.8602136755869125
+2022-04-05,2.352607602001816
+2022-04-06,3.088480687055424
+2022-04-07,3.945159556464454
+2022-04-08,5.832628675694972
+2022-04-11,5.271881788140723
+2022-04-12,5.1056956091690395
+2022-04-13,6.066817220184705
+2022-04-14,6.0182933676590595
+2022-04-15,7.136242763214735
+2022-04-18,8.609119980290956
+2022-04-19,9.171474624904802
+2022-04-20,8.898534405197898
+2022-04-21,7.425451226011894
+2022-04-22,6.964564269007131
+2022-04-25,7.96581912804097
+2022-04-26,8.17819084826966
+2022-04-27,8.67683634812989
+2022-04-28,9.45162367897312
+2022-04-29,8.383614706103309
+2022-05-02,7.39669672658381
+2022-05-03,8.105317442238583
+2022-05-04,7.028266416391973
+2022-05-05,7.6663978465442435
+2022-05-06,7.394861871789907
+2022-05-09,8.276027216550471
+2022-05-10,9.7159342002003
+2022-05-11,10.680721896235868
+2022-05-12,9.754148392429677
+2022-05-13,8.625509627668453
+2022-05-16,8.497130058743753
+2022-05-17,9.682747561360575
+2022-05-18,10.929473708304705
+2022-05-19,13.847620755976571
+2022-05-20,13.718266125743906
+2022-05-23,14.847116768310011
+2022-05-24,15.228156571026162
+2022-05-25,16.196788193384677
+2022-05-26,16.436367524203174
+2022-05-27,16.530661764790356
+2022-05-30,17.865987198685204
+2022-05-31,17.686355788201595
+2022-06-01,17.508094788378067
+2022-06-02,18.241991355857003
+2022-06-03,18.122580359111463
+2022-06-06,18.003700472244475
+2022-06-07,19.202930973138653
+2022-06-08,19.62437049087396
+2022-06-09,20.557527617945265
+2022-06-10,21.16214257558988
+2022-06-13,21.304097813065166
+2022-06-14,21.933811599705116
+2022-06-15,23.000471254620432
+2022-06-16,24.72986738462793
+2022-06-17,24.81739552155812
+2022-06-20,24.45113300603398
+2022-06-21,24.78889897040102
+2022-06-22,25.531714381771693
+2022-06-23,25.61514606089011
+2022-06-24,26.5031859626699
+2022-06-27,27.65830176106462
+2022-06-28,27.942674908217036
+2022-06-29,27.988748966857333
+2022-06-30,28.208564697004505
+2022-07-01,27.893983781577482
+2022-07-04,27.136650793922097
+2022-07-05,27.849590193021022
+2022-07-06,28.54506191046265
+2022-07-07,28.288542002065245
+2022-07-08,29.30477640142549
+2022-07-11,30.86511492522253
+2022-07-12,32.328403033915585
+2022-07-13,32.41716420114079
+2022-07-14,33.324914119316205
+2022-07-15,32.94326278498442
+2022-07-18,33.06495049917639
+2022-07-19,33.01174885525409
+2022-07-20,32.56273788983094
+2022-07-21,30.952292450556897
+2022-07-22,29.980060668580062
+2022-07-25,31.15036901445936
+2022-07-26,31.758759379838942
+2022-07-27,30.444671373274783
+2022-07-28,28.298595012652214
+2022-07-29,29.323802235213318
+2022-08-01,28.32809549780326
+2022-08-02,28.075526366413804
+2022-08-03,29.08037808502167
+2022-08-04,29.41783806803872
+2022-08-05,29.37320544421578
+2022-08-08,30.16093284461797
+2022-08-09,31.85877657416309
+2022-08-10,31.135965236483685
+2022-08-11,30.958145090700633
+2022-08-12,32.34434377300125
+2022-08-15,31.70497195464177
+2022-08-16,31.597924315052865
+2022-08-17,31.43633566486237
+2022-08-18,31.001215264164312
+2022-08-19,31.53506680183223
+2022-08-22,30.627659931401112
+2022-08-23,32.33970577183393
+2022-08-24,32.670502270193374
+2022-08-25,31.112247415059638
+2022-08-26,31.67985931285948
+2022-08-29,31.641460989063994
+2022-08-30,30.78303578759531
+2022-08-31,30.756840056411065
+2022-09-01,32.19052355688754
+2022-09-02,30.99282736097479
+2022-09-05,32.23187885241043
+2022-09-06,32.56518623862856
+2022-09-07,33.51099501475493
+2022-09-08,33.341140616385935
+2022-09-09,32.56874017673945
+2022-09-12,31.56884145282925
+2022-09-13,32.438779740558985
+2022-09-14,32.11973287546438
+2022-09-15,31.62275140579895
+2022-09-16,32.80609517442909
+2022-09-19,34.052780135960326
+2022-09-20,35.41545153813984
+2022-09-21,35.723296038810545
+2022-09-22,36.09577494405227
+2022-09-23,36.44664465933234
+2022-09-26,34.76617557107691
+2022-09-27,35.197360770636436
+2022-09-28,33.61370882655932
+2022-09-29,31.11370575577618
+2022-09-30,30.91968783256345
+2022-10-03,31.64413411796861
+2022-10-04,30.611448714070505
+2022-10-05,30.283233386317953
+2022-10-06,30.85478046541406
+2022-10-07,32.01331647801275
+2022-10-10,32.289159931269154
+2022-10-11,32.53905518162145
+2022-10-12,32.769050835418724
+2022-10-13,34.404879721148106
+2022-10-14,34.66272443431046
+2022-10-17,33.96800280236561
+2022-10-18,34.285883561976085
+2022-10-19,35.74178128711971
+2022-10-20,36.60504908838861
+2022-10-21,36.41901888243982
+2022-10-24,35.29473093042779
+2022-10-25,34.96379649975045
+2022-10-26,35.087044859718965
+2022-10-27,33.08610141682443
+2022-10-28,33.76212277631465
+2022-10-31,32.141781264371126
+2022-11-01,31.92849772680114
+2022-11-02,31.982398402727853
+2022-11-03,32.884829439004996
+2022-11-04,33.280831084643935
+2022-11-07,33.523851284317665
+2022-11-08,33.397335750942354
+2022-11-09,33.2258854828325
+2022-11-10,33.27660345316394
+2022-11-11,34.481329091977585
+2022-11-14,34.186138743623154
+2022-11-15,32.790033279027
+2022-11-16,32.88448351823469
+2022-11-17,31.49858652871685
+2022-11-18,30.79886172370617
+2022-11-21,30.88723349112741
+2022-11-22,30.32125489110297
+2022-11-23,27.23963297503625
+2022-11-24,27.45457773729898
+2022-11-25,27.21202138478985
+2022-11-28,25.918282120208072
+2022-11-29,27.85564362941819
+2022-11-30,29.334384601897163
+2022-12-01,27.745986862866012
+2022-12-02,26.845527977846025
+2022-12-05,27.27413612082431
+2022-12-06,26.807249549027393
+2022-12-07,27.475116647252733
+2022-12-08,26.32539797840171
+2022-12-09,26.896788947985748
+2022-12-12,28.2058476920801
+2022-12-13,27.909569114560107
+2022-12-14,27.341520857563502
+2022-12-15,27.644805353273142
+2022-12-16,27.89072600550579
+2022-12-19,28.346301278916837
+2022-12-20,28.229277537317877
+2022-12-21,25.9234644857519
+2022-12-22,25.544515790878147
+2022-12-23,25.963055156756596
+2022-12-26,26.425998440004186
+2022-12-27,25.765822495178494
+2022-12-28,25.901965398484357
+2022-12-29,25.49828240399004
+2022-12-30,24.892832961856136
+2023-01-02,24.216954219305453
+2023-01-03,24.491284868678562
+2023-01-04,22.586410039199603
+2023-01-05,25.424065240559433
+2023-01-06,25.21312137946747
+2023-01-09,26.34351514139804
+2023-01-10,24.786047777122207
+2023-01-11,23.978157643103877
+2023-01-12,24.261458604925366
+2023-01-13,23.793377304085208
+2023-01-16,25.07577352888796
+2023-01-17,25.07127672687676
+2023-01-18,26.74054867982526
+2023-01-19,25.373433987335332
+2023-01-20,26.92201319682344
+2023-01-23,27.080937233416126
+2023-01-24,27.441925029186528
+2023-01-25,27.332876146139398
+2023-01-26,27.503953240067275
+2023-01-27,27.816270776065444
+2023-01-30,28.35631126540128
+2023-01-31,29.55003584150427
+2023-02-01,29.80070120032873
+2023-02-02,30.13572290642021
+2023-02-03,30.727208863840477
+2023-02-06,29.276337463594835
+2023-02-07,31.16278964591565
+2023-02-08,30.550362357369195
+2023-02-09,31.520506769688275
+2023-02-10,29.68512946561427
+2023-02-13,30.596261234127685
+2023-02-14,30.68660823989905
+2023-02-15,31.374254195988275
+2023-02-16,31.57816356647771
+2023-02-17,34.051978695294885
+2023-02-20,33.7332570040638
+2023-02-21,34.108402212856504
+2023-02-22,34.35232815981515
+2023-02-23,33.23631686482805
+2023-02-24,33.220470810353234
+2023-02-27,32.99984801592564
+2023-02-28,31.95159882237636
+2023-03-01,32.09182003077546
+2023-03-02,31.36441387712358
+2023-03-03,30.991536342522306
+2023-03-06,30.51998138791023
+2023-03-07,29.814418138148184
+2023-03-08,30.14371325515479
+2023-03-09,32.85801108814794
+2023-03-10,32.558452865431946
+2023-03-13,32.91173435780037
+2023-03-14,31.53625896570352
+2023-03-15,32.32444044353406
+2023-03-16,31.566272778706253
+2023-03-17,31.506358163637927
+2023-03-20,29.81123134380424
+2023-03-21,31.43210233728319
+2023-03-22,32.38081502301809
+2023-03-23,32.10340274505538
+2023-03-24,32.21148998666693
+2023-03-27,33.750815128893045
+2023-03-28,31.682504241939
+2023-03-29,32.26759650412215
+2023-03-30,32.221339839905404
+2023-03-31,32.00730473075479
+2023-04-03,32.48814699026984
+2023-04-04,32.879278254412256
+2023-04-05,32.9622601062054
+2023-04-06,31.67553386454232
+2023-04-07,31.710123850817023
+2023-04-10,31.275147085304315
+2023-04-11,31.24903516914951
+2023-04-12,31.737577787099557
+2023-04-13,30.665842644346444
+2023-04-14,30.29185038245799
+2023-04-17,30.127952126604264
+2023-04-18,29.771713272360874
+2023-04-19,30.15335772841635
+2023-04-20,30.95071425971029
+2023-04-21,32.16212456716738
+2023-04-24,32.7948168151782
+2023-04-25,33.96847875739157
+2023-04-26,33.73421897542058
+2023-04-27,32.94244174146517
+2023-04-28,32.66819728222524
+2023-05-01,32.60295272362369
+2023-05-02,31.76917065569665
+2023-05-03,31.42175017629126
+2023-05-04,31.214591381288383
+2023-05-05,31.289069597100173
+2023-05-08,30.076196725900317
+2023-05-09,29.890842633135332
+2023-05-10,29.843904747788255
+2023-05-11,31.152936232956392
+2023-05-12,30.707137090543387
+2023-05-15,30.0749487587791
+2023-05-16,30.556884218742624
+2023-05-17,29.26841088513281
+2023-05-18,29.8627272251148
+2023-05-19,29.725167703138027
+2023-05-22,30.895153011392548
+2023-05-23,30.312752140962516
+2023-05-24,29.65511387669423
+2023-05-25,29.014603491372633
+2023-05-26,27.80367548601187
+2023-05-29,27.153319998085657
+2023-05-30,26.904527403228155
+2023-05-31,26.40980061545999
+2023-06-01,26.982987540588987
+2023-06-02,26.78199980242574
+2023-06-05,26.523603015816974
+2023-06-06,24.38512769594468
+2023-06-07,25.02279444109635
+2023-06-08,24.935266340680826
+2023-06-09,23.40074195001646
+2023-06-12,22.73738593853458
+2023-06-13,24.68651814978292
+2023-06-14,22.928529154935454
+2023-06-15,23.680061944178217
+2023-06-16,23.340303703899313
+2023-06-19,20.497831494004732
+2023-06-20,19.83156974831559
+2023-06-21,19.72461165033144
+2023-06-22,20.381475724088006
+2023-06-23,19.576620187312365
+2023-06-26,19.990405369599497
+2023-06-27,17.56021852757435
+2023-06-28,18.02346090944155
+2023-06-29,17.916931069630365
+2023-06-30,17.401388387619708
+2023-07-03,16.304377972887522
+2023-07-04,15.639419012268927
+2023-07-05,15.870117797145163
+2023-07-06,15.117591898281557
+2023-07-07,13.796380325411908
+2023-07-10,14.117172005580802
+2023-07-11,14.633244512412269
+2023-07-12,14.789790217849259
+2023-07-13,16.74827818060384
+2023-07-14,16.95242898663929
+2023-07-17,16.45493209061038
+2023-07-18,17.04255646017883
+2023-07-19,18.249322921968275
+2023-07-20,19.328997975196526
+2023-07-21,20.466073561098952
+2023-07-24,20.81610963372743
+2023-07-25,20.69061930379366
+2023-07-26,20.26898503460783
+2023-07-27,19.608445483897878
+2023-07-28,19.58884816292017
+2023-07-31,20.479379003907844
+2023-08-01,21.410790809863222
+2023-08-02,19.72302954163272
+2023-08-03,20.343156372826968
+2023-08-04,20.116181234642557
+2023-08-07,19.674483946608408
+2023-08-08,19.078102473913603
+2023-08-09,18.303067278083553
+2023-08-10,17.435628549826113
+2023-08-11,17.1617327338746
+2023-08-14,15.60219234116106
+2023-08-15,15.185078747532694
+2023-08-16,15.442757330238617
+2023-08-17,16.57121407684266
+2023-08-18,16.2142442977888
+2023-08-21,16.145045536008343
+2023-08-22,16.205420985947335
+2023-08-23,16.62676485832534
+2023-08-24,16.47654035927486
+2023-08-25,16.00810578282233
+2023-08-28,15.401629690611308
+2023-08-29,15.892434286889557
+2023-08-30,14.396443925303549
+2023-08-31,15.568551083819141
+2023-09-01,15.678813401876614
+2023-09-04,14.245358740346141
+2023-09-05,15.71262317508565
+2023-09-06,16.040963535867544
+2023-09-07,15.637818904934601
+2023-09-08,15.556301515656685
+2023-09-11,13.59883270541605
+2023-09-12,13.261591864665448
+2023-09-13,13.219589371996781
+2023-09-14,12.160746076122972
+2023-09-15,12.74374613534023
+2023-09-18,13.182882026430482
+2023-09-19,12.291069007552728
+2023-09-20,12.318661629203733
+2023-09-21,13.524963062176404
+2023-09-22,12.601170237583663
+2023-09-25,11.51516478208264
+2023-09-26,12.094918504662928
+2023-09-27,9.975131491402987
+2023-09-28,9.688724926934155
+2023-09-29,10.443975476091385
+2023-10-02,11.573606118839038
+2023-10-03,9.749023341241667
+2023-10-04,9.77505593552532
+2023-10-05,9.48801980549673
+2023-10-06,9.954695906023856
+2023-10-09,10.786273731954271
+2023-10-10,11.418318523457994
+2023-10-11,11.100946713951965
+2023-10-12,12.061334148881395
+2023-10-13,12.70766392352326
+2023-10-16,10.350318548656833
+2023-10-17,11.424182026244496
+2023-10-18,11.04545571165675
+2023-10-19,10.656355862157005
+2023-10-20,12.164298825189185
+2023-10-23,12.637526323700268
+2023-10-24,11.915840724699054
+2023-10-25,12.773456187663715
+2023-10-26,11.841713083931715
+2023-10-27,10.661149980448222
+2023-10-30,9.706809549614183
+2023-10-31,9.92449395954403
diff --git a/strategy.csv b/strategy.csv
new file mode 100644
index 0000000..df7a9d5
--- /dev/null
+++ b/strategy.csv
@@ -0,0 +1,1001 @@
+,Strategy
+2020-01-01,0.7357483921101974
+2020-01-02,1.9884270581800045
+2020-01-03,3.0632934316172475
+2020-01-06,2.846807905095898
+2020-01-07,2.3004606928801548
+2020-01-08,2.2390648562863524
+2020-01-09,2.042894997718815
+2020-01-10,2.174533777336096
+2020-01-13,2.0068978684665586
+2020-01-14,0.16501901395415874
+2020-01-15,0.4936492061384448
+2020-01-16,1.460313898401915
+2020-01-17,0.5146039121515958
+2020-01-20,0.7701443286326403
+2020-01-21,-0.7831351460158492
+2020-01-22,-1.9090707136353466
+2020-01-23,-0.991708128657373
+2020-01-24,-1.639063799630971
+2020-01-27,-2.077928799655441
+2020-01-28,-3.6934969082953373
+2020-01-29,-2.236978157868158
+2020-01-30,-1.1531615738294339
+2020-01-31,0.13030118388650358
+2020-02-03,0.47915357253375235
+2020-02-04,1.8676066754871128
+2020-02-05,1.1491350432501886
+2020-02-06,2.2791897386471707
+2020-02-07,1.7409721065917392
+2020-02-10,4.0651513323573685
+2020-02-11,3.3796783277771465
+2020-02-12,2.79028620566545
+2020-02-13,3.8699126737599627
+2020-02-14,6.184626397035899
+2020-02-17,6.458409171799424
+2020-02-18,6.678926983424501
+2020-02-19,7.376416324618663
+2020-02-20,7.598985243873085
+2020-02-21,7.025049032014206
+2020-02-24,7.325773875519349
+2020-02-25,7.149178619536133
+2020-02-26,7.0400057699032565
+2020-02-27,6.426419513901225
+2020-02-28,5.721775281698948
+2020-03-02,6.1907552379415
+2020-03-03,4.91568891067102
+2020-03-04,5.999938405119647
+2020-03-05,7.452879893484996
+2020-03-06,10.191811198683315
+2020-03-09,10.014044052333563
+2020-03-10,9.441496024756571
+2020-03-11,9.362377632428304
+2020-03-12,8.734253632856307
+2020-03-13,8.297603595918467
+2020-03-16,9.08441578580899
+2020-03-17,8.996413878694064
+2020-03-18,8.206123841952689
+2020-03-19,8.602720269634418
+2020-03-20,7.087080234133848
+2020-03-23,9.301069547951444
+2020-03-24,10.27219885801314
+2020-03-25,10.708544608326953
+2020-03-26,9.370269228969162
+2020-03-27,9.26455997852135
+2020-03-30,8.03714921269293
+2020-03-31,9.844859166273686
+2020-04-01,9.723588948779094
+2020-04-02,7.745025300892162
+2020-04-03,7.076608736945488
+2020-04-06,7.013149490533461
+2020-04-07,7.862955806224955
+2020-04-08,7.705822077575297
+2020-04-09,7.355406188564516
+2020-04-10,8.466116117648372
+2020-04-13,8.339570115922882
+2020-04-14,7.867840150970967
+2020-04-15,6.38741579352569
+2020-04-16,6.869897582258025
+2020-04-17,7.23894159572801
+2020-04-20,8.25654990927028
+2020-04-21,7.7626043551386665
+2020-04-22,6.216523548787761
+2020-04-23,7.5081870510305375
+2020-04-24,8.599819715917933
+2020-04-27,8.930241255348118
+2020-04-28,8.944356165925887
+2020-04-29,8.869691792202696
+2020-04-30,8.503182428972865
+2020-05-01,8.239786048619166
+2020-05-04,7.96700087350264
+2020-05-05,8.166872539193943
+2020-05-06,7.981905044653236
+2020-05-07,8.710331005938915
+2020-05-08,8.530533048280851
+2020-05-11,8.423735866748434
+2020-05-12,6.821248665462875
+2020-05-13,5.593183490606911
+2020-05-14,6.542441763893365
+2020-05-15,7.4563286292341235
+2020-05-18,7.318171256765534
+2020-05-19,7.895116507504331
+2020-05-20,6.896049941541767
+2020-05-21,7.806618670596854
+2020-05-22,7.26722301653827
+2020-05-25,7.523482285365853
+2020-05-26,8.447617549726553
+2020-05-27,8.94647889420785
+2020-05-28,9.758237036207309
+2020-05-29,8.86566983516092
+2020-06-01,7.523306057357549
+2020-06-02,7.369676161266769
+2020-06-03,7.978098244974991
+2020-06-04,9.918178215801976
+2020-06-05,8.796336940946428
+2020-06-08,7.58157646062617
+2020-06-09,6.7211196702635485
+2020-06-10,6.423492947466725
+2020-06-11,7.691044041910734
+2020-06-12,6.928655563134214
+2020-06-15,8.463929275185661
+2020-06-16,7.358397018892295
+2020-06-17,7.334936082595461
+2020-06-18,7.972273461402063
+2020-06-19,7.680030550282116
+2020-06-22,6.425465097942425
+2020-06-23,5.715339210562657
+2020-06-24,6.305671644846736
+2020-06-25,5.2541756791928265
+2020-06-26,5.061815699628423
+2020-06-29,6.257264109013702
+2020-06-30,5.193930014546892
+2020-07-01,5.4816034524637205
+2020-07-02,4.922265608193508
+2020-07-03,6.054780943561218
+2020-07-06,5.264929381504224
+2020-07-07,6.465428181586691
+2020-07-08,7.611756053747666
+2020-07-09,6.199703226750855
+2020-07-10,5.730827303863787
+2020-07-13,4.419790460205247
+2020-07-14,2.4862374400271525
+2020-07-15,2.3325755131334627
+2020-07-16,0.9871135258033139
+2020-07-17,0.9124360639190059
+2020-07-20,0.12901805414701706
+2020-07-21,0.1445945005390053
+2020-07-22,-0.04971855665972938
+2020-07-23,-0.6363897490480814
+2020-07-24,0.4753978422078884
+2020-07-27,1.4145569066190982
+2020-07-28,1.2464685754205411
+2020-07-29,0.23274129837973923
+2020-07-30,-0.11043009457742897
+2020-07-31,1.1008593042734154
+2020-08-03,-0.2424641423534566
+2020-08-04,-0.8308762788292392
+2020-08-05,-1.6536770197785675
+2020-08-06,-1.9149069120673283
+2020-08-07,-2.3642496429298134
+2020-08-10,-2.8543280068083483
+2020-08-11,-3.0454528801892744
+2020-08-12,-2.678572481105696
+2020-08-13,-5.100559102093797
+2020-08-14,-4.27492733370067
+2020-08-17,-4.936810256507032
+2020-08-18,-3.561294947496259
+2020-08-19,-3.9039185905026685
+2020-08-20,-4.911015158239838
+2020-08-21,-4.743619247785111
+2020-08-24,-5.071366031926051
+2020-08-25,-4.972662802653222
+2020-08-26,-6.236932844170688
+2020-08-27,-5.776101150030339
+2020-08-28,-6.479260839164142
+2020-08-31,-5.225662368259379
+2020-09-01,-5.873620913613141
+2020-09-02,-6.488711995225239
+2020-09-03,-6.3005820955522704
+2020-09-04,-7.937276742222109
+2020-09-07,-7.344915169111686
+2020-09-08,-6.7234540143340675
+2020-09-09,-5.9749625372196435
+2020-09-10,-6.38888809457606
+2020-09-11,-5.922833966584094
+2020-09-14,-6.305954749322908
+2020-09-15,-6.289641742913304
+2020-09-16,-5.832035971362423
+2020-09-17,-4.849750559306676
+2020-09-18,-5.982598301316996
+2020-09-21,-6.516078455968839
+2020-09-22,-6.66560974978881
+2020-09-23,-6.39067679589809
+2020-09-24,-7.1847937218521265
+2020-09-25,-6.945697238080128
+2020-09-28,-8.690549585704344
+2020-09-29,-9.62637013906905
+2020-09-30,-9.08194724670898
+2020-10-01,-9.24585875329302
+2020-10-02,-10.347262621226422
+2020-10-05,-11.366335487504852
+2020-10-06,-13.871168068628691
+2020-10-07,-13.520414714099175
+2020-10-08,-13.735641833279125
+2020-10-09,-13.372464544842346
+2020-10-12,-12.495201017992528
+2020-10-13,-13.302247191012265
+2020-10-14,-12.605367390833434
+2020-10-15,-12.932911727304987
+2020-10-16,-11.683377882575646
+2020-10-19,-14.251302722739567
+2020-10-20,-13.840226906283087
+2020-10-21,-13.475985198953893
+2020-10-22,-14.443601588922917
+2020-10-23,-14.427385968905812
+2020-10-26,-15.368600444562215
+2020-10-27,-15.099284098307388
+2020-10-28,-14.689004265253857
+2020-10-29,-14.085556807926663
+2020-10-30,-12.833672905382752
+2020-11-02,-11.65201750030643
+2020-11-03,-14.053724459421908
+2020-11-04,-15.734196676219533
+2020-11-05,-17.397206321575645
+2020-11-06,-15.00719916052451
+2020-11-09,-15.229359624041344
+2020-11-10,-16.780441103993905
+2020-11-11,-16.337292188961722
+2020-11-12,-15.893062544334496
+2020-11-13,-16.30245031928777
+2020-11-16,-15.448085545387592
+2020-11-17,-14.615669326546147
+2020-11-18,-16.280921197445434
+2020-11-19,-16.182290499990923
+2020-11-20,-16.217455830752616
+2020-11-23,-16.701039310101663
+2020-11-24,-16.310104037175652
+2020-11-25,-16.927163823329643
+2020-11-26,-18.836227714276127
+2020-11-27,-16.57621269011026
+2020-11-30,-16.934636655199174
+2020-12-01,-17.171219244097582
+2020-12-02,-17.163994840066195
+2020-12-03,-16.42119093421848
+2020-12-04,-15.923303690918397
+2020-12-07,-17.55266531344548
+2020-12-08,-19.05480045646565
+2020-12-09,-17.924919834078416
+2020-12-10,-16.400493820452066
+2020-12-11,-17.988365235356696
+2020-12-14,-17.609035429669806
+2020-12-15,-16.456762809908426
+2020-12-16,-16.401381217204683
+2020-12-17,-16.689942179226836
+2020-12-18,-15.67509734230434
+2020-12-21,-16.261705252378693
+2020-12-22,-15.458600579108285
+2020-12-23,-15.795479835033088
+2020-12-24,-14.946803233370751
+2020-12-25,-14.515290158892526
+2020-12-28,-14.550003753456412
+2020-12-29,-14.454954993963453
+2020-12-30,-15.998756781414432
+2020-12-31,-15.961096842663837
+2021-01-01,-15.811619588602879
+2021-01-04,-15.519983150304318
+2021-01-05,-15.938153702577452
+2021-01-06,-15.751358922500273
+2021-01-07,-16.542757741803268
+2021-01-08,-17.717588413596395
+2021-01-11,-15.82845277803899
+2021-01-12,-14.862070532287447
+2021-01-13,-14.919600582221882
+2021-01-14,-13.250662577676364
+2021-01-15,-14.141224672605277
+2021-01-18,-12.84878331893817
+2021-01-19,-12.59893838467718
+2021-01-20,-11.009235883381832
+2021-01-21,-12.510414008787027
+2021-01-22,-13.861139961574843
+2021-01-25,-13.477289680535824
+2021-01-26,-12.200340844893509
+2021-01-27,-12.45581387885933
+2021-01-28,-12.779524355989873
+2021-01-29,-12.580235322269727
+2021-02-01,-12.853697668372856
+2021-02-02,-12.917374392774883
+2021-02-03,-13.992453469538738
+2021-02-04,-13.829315471171315
+2021-02-05,-13.460082575223092
+2021-02-08,-15.328911050405187
+2021-02-09,-14.397999303806763
+2021-02-10,-13.648767141586497
+2021-02-11,-14.788221595292644
+2021-02-12,-14.506184884798081
+2021-02-15,-14.778563323595833
+2021-02-16,-16.18331585012604
+2021-02-17,-15.534711931321203
+2021-02-18,-15.609611931142345
+2021-02-19,-13.922663979142385
+2021-02-22,-11.584930163088956
+2021-02-23,-12.494320577330853
+2021-02-24,-13.787299389724758
+2021-02-25,-11.64135044409569
+2021-02-26,-13.212950910716716
+2021-03-01,-14.244840749195381
+2021-03-02,-13.914999799793314
+2021-03-03,-15.107831150581703
+2021-03-04,-14.979885124088609
+2021-03-05,-15.636631837370617
+2021-03-08,-17.369431549914683
+2021-03-09,-17.08966134399216
+2021-03-10,-19.239033414798797
+2021-03-11,-19.335603312779288
+2021-03-12,-20.85580877414719
+2021-03-15,-20.43764824911242
+2021-03-16,-19.266651699252087
+2021-03-17,-21.010290531468833
+2021-03-18,-20.304254959858927
+2021-03-19,-19.825005848167606
+2021-03-22,-21.12259965750392
+2021-03-23,-21.976120239268003
+2021-03-24,-24.261138284377523
+2021-03-25,-24.85974599214539
+2021-03-26,-25.949470862047953
+2021-03-29,-25.73906915841778
+2021-03-30,-26.000848805965912
+2021-03-31,-27.22692835016215
+2021-04-01,-27.813028080222004
+2021-04-02,-29.40665809412914
+2021-04-05,-29.01383912356667
+2021-04-06,-28.734983636132768
+2021-04-07,-27.543789241102427
+2021-04-08,-26.368522195440153
+2021-04-09,-25.472412567746606
+2021-04-12,-23.896814675646464
+2021-04-13,-24.660058979450785
+2021-04-14,-26.03837753194624
+2021-04-15,-25.54455242217195
+2021-04-16,-26.21826184881952
+2021-04-19,-25.521734965504074
+2021-04-20,-25.505759211253938
+2021-04-21,-24.684845393914557
+2021-04-22,-23.41307651076571
+2021-04-23,-22.72446123597517
+2021-04-26,-22.027164772163246
+2021-04-27,-21.130820739603223
+2021-04-28,-22.744670377073497
+2021-04-29,-23.470612779917573
+2021-04-30,-24.845735178964144
+2021-05-03,-25.544238624758385
+2021-05-04,-25.274151144058596
+2021-05-05,-24.47535778802616
+2021-05-06,-25.312028106034642
+2021-05-07,-25.020730163676994
+2021-05-10,-26.035600568892438
+2021-05-11,-26.997788645494
+2021-05-12,-28.433100317037848
+2021-05-13,-26.727680174039282
+2021-05-14,-26.29643606952335
+2021-05-17,-25.874166999880536
+2021-05-18,-25.232516067944466
+2021-05-19,-25.01354558935336
+2021-05-20,-24.868560371323394
+2021-05-21,-24.736726274618366
+2021-05-24,-25.59932065682704
+2021-05-25,-25.335489368632008
+2021-05-26,-24.06661013333725
+2021-05-27,-23.476279673693195
+2021-05-28,-23.879246338951663
+2021-05-31,-24.775080312653632
+2021-06-01,-25.521564267081892
+2021-06-02,-25.929230636734715
+2021-06-03,-26.25298867724052
+2021-06-04,-26.487467951448426
+2021-06-07,-26.32160508944221
+2021-06-08,-26.081634279093777
+2021-06-09,-26.43381563837989
+2021-06-10,-27.718210504639163
+2021-06-11,-26.586216598920196
+2021-06-14,-25.93795402253667
+2021-06-15,-25.863094489962027
+2021-06-16,-24.01283149975006
+2021-06-17,-24.05129435911145
+2021-06-18,-24.50920654681697
+2021-06-21,-22.924515950476575
+2021-06-22,-22.900795532135945
+2021-06-23,-20.923423084555125
+2021-06-24,-20.397372829499155
+2021-06-25,-20.83450842689843
+2021-06-28,-20.026479995338498
+2021-06-29,-20.262869053539763
+2021-06-30,-20.013998652946338
+2021-07-01,-20.918348233678177
+2021-07-02,-20.135702413057896
+2021-07-05,-20.93464314743621
+2021-07-06,-21.660588609757447
+2021-07-07,-22.653719934338532
+2021-07-08,-21.638524632338857
+2021-07-09,-24.7695995782453
+2021-07-12,-25.35903277750022
+2021-07-13,-26.524064818624232
+2021-07-14,-24.351186820487214
+2021-07-15,-24.173589619359127
+2021-07-16,-24.611353466487262
+2021-07-19,-24.290477706032647
+2021-07-20,-24.166120597140406
+2021-07-21,-22.92606121676822
+2021-07-22,-21.918013352988545
+2021-07-23,-20.810792076743866
+2021-07-26,-23.02435900497797
+2021-07-27,-24.1459071354794
+2021-07-28,-24.328717655545763
+2021-07-29,-25.632929308178348
+2021-07-30,-25.620440931315457
+2021-08-02,-25.088138392822163
+2021-08-03,-25.331852384923927
+2021-08-04,-25.045977276546623
+2021-08-05,-23.3295750564669
+2021-08-06,-23.337355940620977
+2021-08-09,-22.97991270794151
+2021-08-10,-25.3636437970718
+2021-08-11,-23.946638123656022
+2021-08-12,-22.722418679459132
+2021-08-13,-22.508192434451527
+2021-08-16,-21.90908561811054
+2021-08-17,-23.028809003830894
+2021-08-18,-23.641323523175515
+2021-08-19,-24.418589846792667
+2021-08-20,-25.524861350134934
+2021-08-23,-26.164466741568518
+2021-08-24,-25.829686786607443
+2021-08-25,-25.682292042852755
+2021-08-26,-25.719017571608493
+2021-08-27,-26.714088679875527
+2021-08-30,-26.13370888249698
+2021-08-31,-25.039802296441678
+2021-09-01,-24.600036860334022
+2021-09-02,-23.505197559119296
+2021-09-03,-23.039323278780618
+2021-09-06,-23.28473652931886
+2021-09-07,-23.63876979819942
+2021-09-08,-23.08901911439841
+2021-09-09,-22.583455995677948
+2021-09-10,-24.810867914030112
+2021-09-13,-24.876606774379386
+2021-09-14,-24.56107705048887
+2021-09-15,-21.62583272256351
+2021-09-16,-21.338741116257136
+2021-09-17,-19.727231500803306
+2021-09-20,-18.6838655316833
+2021-09-21,-18.102546279705177
+2021-09-22,-18.686353860987158
+2021-09-23,-20.390304582755327
+2021-09-24,-21.734154444462213
+2021-09-27,-20.083207023905914
+2021-09-28,-21.164981693526737
+2021-09-29,-20.839638154478862
+2021-09-30,-20.742560776757593
+2021-10-01,-20.89064705786595
+2021-10-04,-20.876065656273855
+2021-10-05,-22.246936166246904
+2021-10-06,-23.245291686634992
+2021-10-07,-22.593977898332493
+2021-10-08,-22.598766356882624
+2021-10-11,-22.481026386775284
+2021-10-12,-24.47109129376604
+2021-10-13,-24.021716730672296
+2021-10-14,-23.31685613126574
+2021-10-15,-22.97644471356057
+2021-10-18,-23.357196783923136
+2021-10-19,-22.648545500692926
+2021-10-20,-22.150231482696807
+2021-10-21,-22.18451492994748
+2021-10-22,-21.911162736645544
+2021-10-25,-20.56336932932944
+2021-10-26,-20.703184058022845
+2021-10-27,-19.06575184612793
+2021-10-28,-18.51910756573351
+2021-10-29,-18.367944126876456
+2021-11-01,-18.785807623193133
+2021-11-02,-17.96216703004906
+2021-11-03,-17.76207254143495
+2021-11-04,-19.129336735381052
+2021-11-05,-19.795612181085815
+2021-11-08,-18.356383267935612
+2021-11-09,-19.853312381864463
+2021-11-10,-19.102984545574117
+2021-11-11,-19.849703032050595
+2021-11-12,-17.794727505029414
+2021-11-15,-18.280938973082737
+2021-11-16,-18.544929439538517
+2021-11-17,-18.19650550652606
+2021-11-18,-19.01767132828341
+2021-11-19,-19.841796617650296
+2021-11-22,-19.987835327360784
+2021-11-23,-21.01414902813129
+2021-11-24,-20.671080713310342
+2021-11-25,-21.93892205482775
+2021-11-26,-23.790964334696305
+2021-11-29,-23.119161420019505
+2021-11-30,-24.77922921502363
+2021-12-01,-25.079314490885718
+2021-12-02,-25.850682447069854
+2021-12-03,-26.264279303488934
+2021-12-06,-27.871129217810584
+2021-12-07,-28.360118215902
+2021-12-08,-27.314102676650524
+2021-12-09,-27.81576084363791
+2021-12-10,-28.72238623454851
+2021-12-13,-31.110594789326722
+2021-12-14,-31.696555769544617
+2021-12-15,-31.55251716047754
+2021-12-16,-30.937766170084032
+2021-12-17,-30.902479920322627
+2021-12-20,-31.229108271162573
+2021-12-21,-30.355758130299268
+2021-12-22,-30.71894408197406
+2021-12-23,-29.438064148405353
+2021-12-24,-30.027021964785444
+2021-12-27,-30.693342987311638
+2021-12-28,-30.017683579966697
+2021-12-29,-29.882363433275852
+2021-12-30,-30.262443772307467
+2021-12-31,-29.461075838866392
+2022-01-03,-28.438066667885767
+2022-01-04,-28.077537221182713
+2022-01-05,-28.188083843067798
+2022-01-06,-28.986840318764433
+2022-01-07,-28.541907437140072
+2022-01-10,-28.30074805432464
+2022-01-11,-27.55219617244974
+2022-01-12,-25.901873351943348
+2022-01-13,-24.880556364633712
+2022-01-14,-24.282224541627464
+2022-01-17,-24.018854859378497
+2022-01-18,-25.42514364717359
+2022-01-19,-24.378838124266533
+2022-01-20,-24.044947262262763
+2022-01-21,-23.608475353782886
+2022-01-24,-24.382264685310187
+2022-01-25,-23.991626333267956
+2022-01-26,-23.513092616508366
+2022-01-27,-24.888498677420174
+2022-01-28,-24.759660072734064
+2022-01-31,-25.25168947580046
+2022-02-01,-24.47783340350817
+2022-02-02,-24.41453758600401
+2022-02-03,-22.39633651721798
+2022-02-04,-22.837995303921243
+2022-02-07,-22.76388350117432
+2022-02-08,-22.618381452708014
+2022-02-09,-23.063445616008426
+2022-02-10,-22.348991243406175
+2022-02-11,-20.94514393263075
+2022-02-14,-21.39461401814481
+2022-02-15,-20.04119426438795
+2022-02-16,-20.09918253750279
+2022-02-17,-18.478982776913707
+2022-02-18,-20.715119979901935
+2022-02-21,-22.537234664546478
+2022-02-22,-22.4891510503337
+2022-02-23,-22.778767914178193
+2022-02-24,-21.777954267483825
+2022-02-25,-22.205947383438424
+2022-02-28,-23.014790768615367
+2022-03-01,-23.25615680405102
+2022-03-02,-23.694714290757247
+2022-03-03,-24.459126948631386
+2022-03-04,-24.51301615175903
+2022-03-07,-24.99138425707097
+2022-03-08,-26.888450388082557
+2022-03-09,-26.62485346930636
+2022-03-10,-25.975579658445998
+2022-03-11,-27.728857105798316
+2022-03-14,-28.552961210217475
+2022-03-15,-31.340619069656412
+2022-03-16,-30.833939897368218
+2022-03-17,-32.85248670091075
+2022-03-18,-33.03402770158637
+2022-03-21,-33.405352812595
+2022-03-22,-33.375564405153284
+2022-03-23,-33.74874520021398
+2022-03-24,-32.79672985839452
+2022-03-25,-32.88503895474873
+2022-03-28,-31.763886088031853
+2022-03-29,-31.588818735369916
+2022-03-30,-32.47158327570414
+2022-03-31,-32.47885076193888
+2022-04-01,-33.304494950804326
+2022-04-04,-32.80739531420169
+2022-04-05,-31.939444030840594
+2022-04-06,-32.06309778209523
+2022-04-07,-32.38292873721041
+2022-04-08,-31.61875269712716
+2022-04-11,-32.860579724618646
+2022-04-12,-33.45383647202279
+2022-04-13,-33.395060619351064
+2022-04-14,-32.988538880342524
+2022-04-15,-32.89017156834002
+2022-04-18,-31.858264322838146
+2022-04-19,-29.374973468464137
+2022-04-20,-28.87748832866626
+2022-04-21,-28.969759327323715
+2022-04-22,-28.856817525353907
+2022-04-25,-29.474095497324022
+2022-04-26,-29.552139938437126
+2022-04-27,-26.924529167709018
+2022-04-28,-27.031873599800274
+2022-04-29,-25.577064046448182
+2022-05-02,-26.609717096449714
+2022-05-03,-25.81629314670327
+2022-05-04,-26.36917526371167
+2022-05-05,-27.138127025963936
+2022-05-06,-25.676568898992045
+2022-05-09,-25.976286336966442
+2022-05-10,-26.96355135973857
+2022-05-11,-26.304381284623126
+2022-05-12,-26.170906320387328
+2022-05-13,-26.446564410408612
+2022-05-16,-27.765940241820914
+2022-05-17,-28.209180466449734
+2022-05-18,-28.22057377479285
+2022-05-19,-26.660462133368185
+2022-05-20,-28.447209856909918
+2022-05-23,-27.082084791870635
+2022-05-24,-28.829319218864004
+2022-05-25,-27.883187941242966
+2022-05-26,-27.55820698218608
+2022-05-27,-26.44864661403492
+2022-05-30,-25.332607025313596
+2022-05-31,-23.286070499914032
+2022-06-01,-26.852400109212656
+2022-06-02,-26.49407096529366
+2022-06-03,-26.915955071634755
+2022-06-06,-27.136296051798286
+2022-06-07,-26.818637623528744
+2022-06-08,-27.043661248851958
+2022-06-09,-28.17006204024113
+2022-06-10,-27.341230174523652
+2022-06-13,-26.875023034360414
+2022-06-14,-25.957497026562425
+2022-06-15,-25.287581594664207
+2022-06-16,-24.86046578483189
+2022-06-17,-25.043628501289238
+2022-06-20,-24.66924459554092
+2022-06-21,-23.504810603986463
+2022-06-22,-24.23208829470466
+2022-06-23,-22.772390448017497
+2022-06-24,-23.561933988023313
+2022-06-27,-23.335475380035763
+2022-06-28,-24.36311447262759
+2022-06-29,-23.176538626290835
+2022-06-30,-21.211242641749987
+2022-07-01,-20.549115686756643
+2022-07-04,-19.041475959406803
+2022-07-05,-19.755327737285672
+2022-07-06,-19.372800434417275
+2022-07-07,-17.526007888047324
+2022-07-08,-17.68943197886716
+2022-07-11,-18.610408055550174
+2022-07-12,-17.576451406064745
+2022-07-13,-17.132597310552356
+2022-07-14,-16.45157263969346
+2022-07-15,-16.14291061173481
+2022-07-18,-15.775485734776954
+2022-07-19,-15.141508778408543
+2022-07-20,-15.527519746942314
+2022-07-21,-18.039400226413427
+2022-07-22,-16.35989169013943
+2022-07-25,-15.877951343763895
+2022-07-26,-15.002679334338156
+2022-07-27,-15.933780221587524
+2022-07-28,-15.759470960305697
+2022-07-29,-16.63435306112646
+2022-08-01,-16.667059552686215
+2022-08-02,-18.06244390849133
+2022-08-03,-18.650413252825516
+2022-08-04,-19.22742489892301
+2022-08-05,-19.23961099277372
+2022-08-08,-18.76748578040732
+2022-08-09,-18.525944310832674
+2022-08-10,-18.821036721553497
+2022-08-11,-19.54259882060613
+2022-08-12,-19.8194712252776
+2022-08-15,-18.94117245281435
+2022-08-16,-19.478224539947224
+2022-08-17,-19.188815324148344
+2022-08-18,-18.907202181308374
+2022-08-19,-18.1219932687302
+2022-08-22,-18.977301560675897
+2022-08-23,-19.242610323456
+2022-08-24,-21.22880486553673
+2022-08-25,-20.028755206275207
+2022-08-26,-20.440053888414578
+2022-08-29,-20.14532319151995
+2022-08-30,-18.96190807262992
+2022-08-31,-17.475250923420003
+2022-09-01,-19.0168063000493
+2022-09-02,-18.107033589169983
+2022-09-05,-17.624304020695533
+2022-09-06,-18.11581466021236
+2022-09-07,-18.630503510348863
+2022-09-08,-20.927720398849786
+2022-09-09,-21.20574852259398
+2022-09-12,-20.76063078633865
+2022-09-13,-20.98791734815219
+2022-09-14,-21.400170510729254
+2022-09-15,-19.432877768037674
+2022-09-16,-19.57505286998911
+2022-09-19,-18.964572069760482
+2022-09-20,-18.976957837145758
+2022-09-21,-18.435364648615206
+2022-09-22,-18.37937966616831
+2022-09-23,-18.759833546567002
+2022-09-26,-19.144127726656283
+2022-09-27,-19.066590333277603
+2022-09-28,-20.93602421347374
+2022-09-29,-19.321014898203646
+2022-09-30,-19.602873804180167
+2022-10-03,-20.18599125694262
+2022-10-04,-18.331152826392476
+2022-10-05,-19.871144702950822
+2022-10-06,-19.939094761473626
+2022-10-07,-19.132091092857817
+2022-10-10,-18.580064211777486
+2022-10-11,-18.840630644613345
+2022-10-12,-18.190131358936846
+2022-10-13,-18.417750475568717
+2022-10-14,-18.697321753856286
+2022-10-17,-18.213367446995033
+2022-10-18,-18.360912371704185
+2022-10-19,-18.597037751916545
+2022-10-20,-18.48376913280998
+2022-10-21,-16.844752580126396
+2022-10-24,-15.423830235878487
+2022-10-25,-14.910681061120338
+2022-10-26,-14.63871013071318
+2022-10-27,-13.710953742010116
+2022-10-28,-11.980914390448563
+2022-10-31,-13.929705342243654
+2022-11-01,-12.728922936522995
+2022-11-02,-12.46197114569199
+2022-11-03,-14.108996776028365
+2022-11-04,-13.765843200056684
+2022-11-07,-12.83471898440937
+2022-11-08,-13.65775995899109
+2022-11-09,-13.58305649192445
+2022-11-10,-14.212012621818257
+2022-11-11,-15.830338038218068
+2022-11-14,-14.97865304160815
+2022-11-15,-15.185659300212436
+2022-11-16,-13.927831165438107
+2022-11-17,-14.144603139554546
+2022-11-18,-12.71577894722676
+2022-11-21,-11.646420411896983
+2022-11-22,-12.920701745924394
+2022-11-23,-13.096172718471248
+2022-11-24,-11.151554892349374
+2022-11-25,-11.774275443108492
+2022-11-28,-11.901599146463404
+2022-11-29,-13.171450938829272
+2022-11-30,-14.416533795903664
+2022-12-01,-13.618542183545008
+2022-12-02,-12.834435287922565
+2022-12-05,-12.177642783305423
+2022-12-06,-13.472968074647682
+2022-12-07,-11.435488060652508
+2022-12-08,-11.176169976320937
+2022-12-09,-10.600199775355573
+2022-12-12,-9.667849006584278
+2022-12-13,-9.17990194225457
+2022-12-14,-7.118212157560748
+2022-12-15,-7.333756517360157
+2022-12-16,-7.120720963097033
+2022-12-19,-7.526770199694091
+2022-12-20,-8.05808186021616
+2022-12-21,-8.507730204191306
+2022-12-22,-9.984762780855723
+2022-12-23,-10.786632595180007
+2022-12-26,-11.430680688535483
+2022-12-27,-10.361663725232258
+2022-12-28,-10.303742613777738
+2022-12-29,-11.029059821084198
+2022-12-30,-9.953919855181235
+2023-01-02,-9.943878135830769
+2023-01-03,-8.884243178995206
+2023-01-04,-8.563607507381066
+2023-01-05,-9.6459499287799
+2023-01-06,-11.15983761498732
+2023-01-09,-11.892450948980954
+2023-01-10,-12.377339530560251
+2023-01-11,-11.046523377520511
+2023-01-12,-10.201333809684833
+2023-01-13,-11.213776700892485
+2023-01-16,-11.202138899892633
+2023-01-17,-11.655636624860422
+2023-01-18,-13.029517203222449
+2023-01-19,-11.451019335358422
+2023-01-20,-10.076062298220773
+2023-01-23,-10.697942640804376
+2023-01-24,-12.07369366832625
+2023-01-25,-12.6148939032052
+2023-01-26,-12.09080811633821
+2023-01-27,-10.860889185655639
+2023-01-30,-11.011035136272513
+2023-01-31,-12.48704294649522
+2023-02-01,-14.147253370814134
+2023-02-02,-13.94418038204476
+2023-02-03,-11.758087988641773
+2023-02-06,-12.247542633906523
+2023-02-07,-13.052390729580491
+2023-02-08,-12.148812449083819
+2023-02-09,-11.60549632297532
+2023-02-10,-10.006640833117338
+2023-02-13,-9.385386374112247
+2023-02-14,-8.13893587813793
+2023-02-15,-6.7478590581121285
+2023-02-16,-5.508499471252014
+2023-02-17,-7.115366384313958
+2023-02-20,-5.867473790174733
+2023-02-21,-6.2126701672398905
+2023-02-22,-7.275898273458848
+2023-02-23,-7.304527733618108
+2023-02-24,-8.552834018749857
+2023-02-27,-10.469126149966916
+2023-02-28,-11.576174472031864
+2023-03-01,-11.441082395516508
+2023-03-02,-12.06064140250497
+2023-03-03,-13.59261511027761
+2023-03-06,-13.841442433429327
+2023-03-07,-15.19947490759728
+2023-03-08,-14.450534453202371
+2023-03-09,-13.836338935715883
+2023-03-10,-11.758576097266628
+2023-03-13,-12.802960904710067
+2023-03-14,-13.159583449843467
+2023-03-15,-14.119040741036878
+2023-03-16,-14.807794110632145
+2023-03-17,-14.480312306001098
+2023-03-20,-15.065750022660044
+2023-03-21,-13.833100549805916
+2023-03-22,-14.804645696338044
+2023-03-23,-15.075771899236388
+2023-03-24,-14.90793499515383
+2023-03-27,-15.017429063927207
+2023-03-28,-16.861226372568428
+2023-03-29,-15.300732032419468
+2023-03-30,-15.413269419875578
+2023-03-31,-16.010482706876356
+2023-04-03,-16.041902081250402
+2023-04-04,-16.022626630176763
+2023-04-05,-14.920077536187492
+2023-04-06,-15.686675688213287
+2023-04-07,-13.090456832887888
+2023-04-10,-12.943394533908878
+2023-04-11,-12.176543246488459
+2023-04-12,-12.05383324086242
+2023-04-13,-12.539338760902144
+2023-04-14,-13.065308957547296
+2023-04-17,-11.51993782383242
+2023-04-18,-12.309093320676963
+2023-04-19,-11.388748060766742
+2023-04-20,-9.987111253625882
+2023-04-21,-9.156897004006385
+2023-04-24,-10.646673221129308
+2023-04-25,-9.988307129297631
+2023-04-26,-10.055854720229446
+2023-04-27,-12.042866829190043
+2023-04-28,-10.971603317597749
+2023-05-01,-10.14693001873918
+2023-05-02,-10.790535544201344
+2023-05-03,-9.822908684350097
+2023-05-04,-11.804096105203463
+2023-05-05,-11.098660275084843
+2023-05-08,-10.337218287744088
+2023-05-09,-10.92656107662687
+2023-05-10,-11.516148900990322
+2023-05-11,-9.304584316677214
+2023-05-12,-10.42700853592641
+2023-05-15,-11.373302455773844
+2023-05-16,-9.585411262782713
+2023-05-17,-10.823788444350972
+2023-05-18,-9.745023741778637
+2023-05-19,-10.842731412911371
+2023-05-22,-11.471059174507419
+2023-05-23,-12.356624549490027
+2023-05-24,-12.351648708187911
+2023-05-25,-12.059135592501331
+2023-05-26,-12.995117395709023
+2023-05-29,-14.939968441015026
+2023-05-30,-14.763125143737486
+2023-05-31,-15.131509744417878
+2023-06-01,-14.795609495045422
+2023-06-02,-12.866470075901779
+2023-06-05,-13.414814872402088
+2023-06-06,-13.016938162285458
+2023-06-07,-13.720305241424823
+2023-06-08,-13.06573796827308
+2023-06-09,-12.339765208078676
+2023-06-12,-11.717561776629001
+2023-06-13,-11.467497438809344
+2023-06-14,-11.625835879549205
+2023-06-15,-12.809057378071962
+2023-06-16,-13.664212322965057
+2023-06-19,-12.769257372175145
+2023-06-20,-14.177692746756508
+2023-06-21,-14.234983452326162
+2023-06-22,-13.61626511614906
+2023-06-23,-13.05593389294064
+2023-06-26,-15.100886625302241
+2023-06-27,-16.119776998129183
+2023-06-28,-15.397869711500693
+2023-06-29,-15.751091699754433
+2023-06-30,-14.554348274612506
+2023-07-03,-15.5295197900781
+2023-07-04,-15.849118808351482
+2023-07-05,-16.990963125226138
+2023-07-06,-16.75318678530952
+2023-07-07,-16.521474507033222
+2023-07-10,-16.09229330324436
+2023-07-11,-15.974017747189212
+2023-07-12,-14.397593438956012
+2023-07-13,-16.405273739775534
+2023-07-14,-17.23130737569353
+2023-07-17,-17.18703296224511
+2023-07-18,-17.072429461887953
+2023-07-19,-15.911004902540743
+2023-07-20,-16.39888397426041
+2023-07-21,-15.57817865825008
+2023-07-24,-15.33512194359571
+2023-07-25,-13.977199962222375
+2023-07-26,-15.389351486663992
+2023-07-27,-15.241405412928046
+2023-07-28,-14.596152717622974
+2023-07-31,-15.052817107540504
+2023-08-01,-13.99390278580566
+2023-08-02,-13.705514214234388
+2023-08-03,-13.761972523634295
+2023-08-04,-13.895395646794842
+2023-08-07,-13.466529247953403
+2023-08-08,-12.392828703196615
+2023-08-09,-12.895915395742108
+2023-08-10,-13.977959536046917
+2023-08-11,-11.586743344270216
+2023-08-14,-12.407601497222663
+2023-08-15,-12.024373951105021
+2023-08-16,-12.102092545632459
+2023-08-17,-12.325994966677511
+2023-08-18,-12.284999089653933
+2023-08-21,-13.190100246785182
+2023-08-22,-12.581086748018041
+2023-08-23,-14.24853846740408
+2023-08-24,-13.56587822013402
+2023-08-25,-13.738845318160811
+2023-08-28,-15.488767757554603
+2023-08-29,-15.714975864854672
+2023-08-30,-14.362340453372601
+2023-08-31,-13.87721445382738
+2023-09-01,-12.556971315555773
+2023-09-04,-11.917414527444542
+2023-09-05,-12.322506268949464
+2023-09-06,-11.636087002898359
+2023-09-07,-11.010665482613723
+2023-09-08,-11.554206685832046
+2023-09-11,-10.311163421138843
+2023-09-12,-8.983909002536869
+2023-09-13,-8.032187647159184
+2023-09-14,-6.613364795493982
+2023-09-15,-5.419329335596233
+2023-09-18,-5.608789678117726
+2023-09-19,-5.8881788137934485
+2023-09-20,-5.7977944455406
+2023-09-21,-7.159260128597837
+2023-09-22,-7.05793688641383
+2023-09-25,-7.8913955206497075
+2023-09-26,-8.508580959710397
+2023-09-27,-8.610728489699525
+2023-09-28,-8.188003764065195
+2023-09-29,-8.362784820286564
+2023-10-02,-7.949031205405605
+2023-10-03,-5.741631402195296
+2023-10-04,-4.914093847491602
+2023-10-05,-4.4674173602362695
+2023-10-06,-2.647838581850569
+2023-10-09,-2.048413664154259
+2023-10-10,-3.45405952241056
+2023-10-11,-5.707369707165629
+2023-10-12,-4.5778379205004205
+2023-10-13,-3.844323613302007
+2023-10-16,-3.8641625306182705
+2023-10-17,-5.772334058824401
+2023-10-18,-6.580926098544097
+2023-10-19,-7.934684057580862
+2023-10-20,-6.565233838214438
+2023-10-23,-6.841369791839616
+2023-10-24,-7.450522853193845
+2023-10-25,-7.896094107560107
+2023-10-26,-8.808606602333338
+2023-10-27,-7.94531145529377
+2023-10-30,-8.704153742927776
+2023-10-31,-7.810072294296702
diff --git a/test.py b/test.py
index ab26f6b..cc85fc6 100644
--- a/test.py
+++ b/test.py
@@ -13,6 +13,8 @@
data = pd.Series(np.random.randn(1000).cumsum(), index=dates, name="Strategy")
benchmark = pd.Series(np.random.randn(1000).cumsum(), index=dates, name="Benchmark")
+ data.to_csv("strategy.csv")
+ benchmark.to_csv("benchmark.csv")
engine = Engine(data)
engine.run()
From 7fc424bfb91cc95645c42ba677ae0acf5e8041ed Mon Sep 17 00:00:00 2001
From: BonelessWater
Date: Fri, 25 Apr 2025 01:46:21 -0400
Subject: [PATCH 03/54] graph registery and customization
---
algosystem/cli/commands.py | 289 +++-
algosystem/dashboard/__init__.py | 15 +
algosystem/dashboard/dashboard_module.py | 1813 ++++++++++++++++++++++
algosystem/dashboard/plot_registery.py | 422 +++++
pyproject.toml | 35 +-
5 files changed, 2560 insertions(+), 14 deletions(-)
create mode 100644 algosystem/dashboard/__init__.py
create mode 100644 algosystem/dashboard/dashboard_module.py
create mode 100644 algosystem/dashboard/plot_registery.py
diff --git a/algosystem/cli/commands.py b/algosystem/cli/commands.py
index e91cf51..f7ddf3c 100644
--- a/algosystem/cli/commands.py
+++ b/algosystem/cli/commands.py
@@ -1,19 +1,282 @@
+import os
+import sys
import click
-from algosystem.utils.config import config_UI
+import pandas as pd
+from pathlib import Path
-@click.command(context_settings=dict(help_option_names=['-h', '--help']))
-@click.argument(
- "config_path",
- type=click.Path(exists=True, file_okay=True, dir_okay=False),
- metavar="PATH",
-)
-def cli(config_path):
+# Add parent directory to path to allow direct script execution
+sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
+
+@click.group()
+def cli():
+ """AlgoSystem Dashboard command-line interface."""
+ pass
+
+@cli.command()
+@click.option('--config', '-c', type=click.Path(exists=True),
+ help='Path to a dashboard configuration file to load')
+@click.option('--data-dir', '-d', type=click.Path(exists=True),
+ help='Directory containing data files to preload')
+def launch(config, data_dir):
+ """Launch the AlgoSystem Dashboard UI."""
+ from algosystem.dashboard.dashboard_module import launch_dashboard
+
+ # Set environment variables for config and data if provided
+ if config:
+ os.environ['ALGO_DASHBOARD_CONFIG'] = os.path.abspath(config)
+
+ if data_dir:
+ os.environ['ALGO_DASHBOARD_DATA_DIR'] = os.path.abspath(data_dir)
+
+ # Launch the dashboard
+ launch_dashboard()
+
+@cli.command()
+@click.argument('input_file', type=click.Path(exists=True))
+@click.argument('output_file', type=click.Path())
+@click.option('--config', '-c', type=click.Path(exists=True), required=True,
+ help='Path to a dashboard configuration file')
+def render(input_file, output_file, config):
"""
- Launch the configuration UI for the given JSON file.
+ Render a dashboard from a configuration file and CSV data.
+
+ INPUT_FILE: Path to a CSV file with strategy data
+ OUTPUT_FILE: Path to save the dashboard image (PNG or PDF)
+ """
+ import json
+ import matplotlib.pyplot as plt
+ from matplotlib.gridspec import GridSpec
+ from algosystem.backtesting.engine import Engine
+
+ # Load the dashboard configuration
+ with open(config, 'r') as f:
+ dashboard_config = json.load(f)
+
+ # Load the CSV data
+ try:
+ data = pd.read_csv(input_file, index_col=0, parse_dates=True)
+ print(f"Loaded data with shape: {data.shape}")
+ except Exception as e:
+ print(f"Error loading CSV file: {e}")
+ sys.exit(1)
+
+ # Create a backtest engine to process the data
+ try:
+ if isinstance(data, pd.DataFrame) and data.shape[1] > 1:
+ # Use the first column as price data for simplicity
+ price_data = data.iloc[:, 0]
+ else:
+ price_data = data
+
+ engine = Engine(data=price_data)
+ results = engine.run()
+ print("Backtest completed successfully")
+ except Exception as e:
+ print(f"Error running backtest: {e}")
+ sys.exit(1)
+
+ # Determine the dashboard grid size
+ if 'dashboard' in dashboard_config and 'max_cols' in dashboard_config['dashboard']:
+ max_cols = dashboard_config['dashboard']['max_cols']
+ else:
+ max_cols = 2
+
+ # Count plots to determine grid size
+ if 'dashboard' in dashboard_config and 'plots' in dashboard_config['dashboard']:
+ plots = dashboard_config['dashboard']['plots']
+ num_plots = len(plots)
+ else:
+ print("No plots defined in configuration file")
+ sys.exit(1)
+
+ # Calculate grid dimensions
+ num_rows = (num_plots + max_cols - 1) // max_cols
+
+ # Create matplotlib figure for the dashboard
+ fig = plt.figure(figsize=(max_cols * 8, num_rows * 6))
+ gs = GridSpec(num_rows, max_cols, figure=fig)
+
+ # Create a plot for each defined plot in the configuration
+ plot_positions = {}
+ for i, plot_config in enumerate(plots):
+ # Get plot position from config or calculate it
+ if 'position' in plot_config:
+ row, col = plot_config['position']['row'], plot_config['position']['col']
+ else:
+ row, col = i // max_cols, i % max_cols
+
+ # Store position to avoid duplicates
+ pos_key = f"{row},{col}"
+ if pos_key in plot_positions:
+ # Position already occupied, find next available spot
+ for r in range(num_rows):
+ for c in range(max_cols):
+ test_key = f"{r},{c}"
+ if test_key not in plot_positions:
+ row, col = r, c
+ pos_key = test_key
+ break
+
+ plot_positions[pos_key] = True
+
+ # Create the plot based on its type
+ ax = fig.add_subplot(gs[row, col])
+
+ # Get plot type and title
+ plot_type = plot_config.get('type', 'Unknown')
+ title = plot_config.get('title', plot_type)
+
+ # Create the appropriate plot based on type
+ if plot_type == 'Equity Curve':
+ equity = results['equity']
+ ax.plot(equity, label='Strategy')
+ ax.set_title(title)
+ ax.set_xlabel('Date')
+ ax.set_ylabel('Equity ($)')
+ ax.grid(alpha=0.3)
+
+ elif plot_type == 'Drawdown Chart':
+ # Calculate drawdown
+ equity = results['equity']
+ returns = equity.pct_change().dropna()
+ cum_returns = (1 + returns).cumprod()
+ running_max = cum_returns.cummax()
+ drawdown = (cum_returns / running_max) - 1
+
+ ax.fill_between(drawdown.index, 0, drawdown, color='red', alpha=0.3)
+ ax.plot(drawdown, color='red', linewidth=1)
+ ax.set_title(title)
+ ax.set_xlabel('Date')
+ ax.set_ylabel('Drawdown (%)')
+ ax.grid(alpha=0.3)
+
+ elif plot_type == 'Monthly Returns Heatmap':
+ equity = results['equity']
+ monthly_returns = equity.resample('M').last().pct_change().dropna()
+ returns_matrix = monthly_returns.groupby(
+ [monthly_returns.index.year, monthly_returns.index.month]).first().unstack()
+
+ # Create heatmap (simplified version)
+ cax = ax.imshow(returns_matrix, cmap='RdYlGn')
+ plt.colorbar(cax, ax=ax, label='Monthly Return')
+ ax.set_title(title)
+ ax.set_xlabel('Month')
+ ax.set_ylabel('Year')
+
+ elif plot_type == 'Rolling Sharpe Ratio':
+ equity = results['equity']
+ returns = equity.pct_change().dropna()
+ window = plot_config.get('config', {}).get('window_size', 252)
+
+ # Calculate rolling Sharpe ratio
+ rolling_return = returns.rolling(window).mean() * 252
+ rolling_vol = returns.rolling(window).std() * (252 ** 0.5)
+ rolling_sharpe = rolling_return / rolling_vol
+
+ ax.plot(rolling_sharpe, linewidth=2)
+ ax.axhline(y=1, color='green', linestyle='--', alpha=0.7)
+ ax.axhline(y=0, color='red', linestyle='--', alpha=0.7)
+
+ ax.set_title(f"{title} ({window//252}-Year Window)")
+ ax.set_xlabel('Date')
+ ax.set_ylabel('Sharpe Ratio')
+ ax.grid(alpha=0.3)
+
+ else:
+ # Generic plot for unrecognized types
+ ax.text(0.5, 0.5, f"Plot Type: {plot_type}", ha='center', va='center')
+ ax.set_title(title)
+ ax.axis('off')
+
+ # Add overall title
+ fig.suptitle("AlgoSystem Dashboard", fontsize=16)
+
+ # Adjust layout and save
+ fig.tight_layout(rect=[0, 0, 1, 0.97])
+
+ try:
+ output_ext = os.path.splitext(output_file)[1].lower()
+ if output_ext == '.pdf':
+ fig.savefig(output_file, format='pdf')
+ else:
+ # Default to PNG
+ fig.savefig(output_file, format='png', dpi=300)
+
+ print(f"Dashboard saved to: {output_file}")
+ except Exception as e:
+ print(f"Error saving dashboard: {e}")
+ sys.exit(1)
- PATH Path to your config file (must exist).
+@cli.command()
+@click.argument('output_dir', type=click.Path())
+def create_config(output_dir):
+ """
+ Create a sample dashboard configuration file.
+
+ OUTPUT_DIR: Directory to save the sample configuration
"""
- config_UI(config_path)
+ import json
+
+ # Create a sample configuration
+ sample_config = {
+ 'dashboard': {
+ 'max_cols': 2,
+ 'plots': [
+ {
+ 'id': 1,
+ 'type': 'Equity Curve',
+ 'title': 'Strategy Equity',
+ 'position': {'row': 0, 'col': 0},
+ 'config': {
+ 'line_color': '#0000FF',
+ 'line_width': 2,
+ 'grid': {'x': True, 'y': True}
+ }
+ },
+ {
+ 'id': 2,
+ 'type': 'Drawdown Chart',
+ 'title': 'Drawdown Analysis',
+ 'position': {'row': 0, 'col': 1},
+ 'config': {
+ 'line_color': '#FF0000',
+ 'line_width': 1,
+ 'grid': {'x': True, 'y': True}
+ }
+ },
+ {
+ 'id': 3,
+ 'type': 'Monthly Returns Heatmap',
+ 'title': 'Monthly Performance',
+ 'position': {'row': 1, 'col': 0},
+ 'config': {}
+ },
+ {
+ 'id': 4,
+ 'type': 'Rolling Sharpe Ratio',
+ 'title': 'Rolling Sharpe',
+ 'position': {'row': 1, 'col': 1},
+ 'config': {
+ 'window_size': 252,
+ 'line_color': '#00AA00',
+ 'line_width': 2,
+ 'grid': {'x': True, 'y': True}
+ }
+ }
+ ]
+ },
+ 'data_sources': []
+ }
+
+ # Ensure output directory exists
+ os.makedirs(output_dir, exist_ok=True)
+
+ # Save configuration file
+ output_path = os.path.join(output_dir, 'sample_dashboard_config.json')
+ with open(output_path, 'w') as f:
+ json.dump(sample_config, f, indent=4)
+
+ print(f"Sample configuration saved to: {output_path}")
-if __name__ == "__main__":
- cli()
+if __name__ == '__main__':
+ cli()
\ No newline at end of file
diff --git a/algosystem/dashboard/__init__.py b/algosystem/dashboard/__init__.py
new file mode 100644
index 0000000..124c307
--- /dev/null
+++ b/algosystem/dashboard/__init__.py
@@ -0,0 +1,15 @@
+from algosystem.dashboard.dashboard_module import (
+ DataManager,
+ PlotRegistry,
+ EnhancedGraphModule,
+ DashboardArea,
+ launch_dashboard
+)
+
+__all__ = [
+ "DataManager",
+ "PlotRegistry",
+ "EnhancedGraphModule",
+ "DashboardArea",
+ "launch_dashboard"
+]
\ No newline at end of file
diff --git a/algosystem/dashboard/dashboard_module.py b/algosystem/dashboard/dashboard_module.py
new file mode 100644
index 0000000..78a9863
--- /dev/null
+++ b/algosystem/dashboard/dashboard_module.py
@@ -0,0 +1,1813 @@
+import os
+import sys
+import json
+import numpy as np
+import pandas as pd
+from datetime import datetime
+from PyQt6.QtWidgets import (
+ QApplication, QMainWindow, QVBoxLayout, QHBoxLayout,
+ QWidget, QPushButton, QLabel, QMenu, QDialog,
+ QGridLayout, QComboBox, QColorDialog, QSlider, QSpinBox,
+ QDoubleSpinBox, QCheckBox, QGroupBox, QToolButton, QScrollArea,
+ QFileDialog, QTabWidget, QLineEdit, QMessageBox, QListWidget,
+ QSplitter, QTreeWidget, QTreeWidgetItem
+)
+from PyQt6.QtCore import Qt, pyqtSignal, QPoint, QSize
+from PyQt6.QtGui import QIcon, QDrag, QPixmap
+import pyqtgraph as pg
+from PyQt6.QtGui import QPainter, QDrag, QPixmap
+from PyQt6.QtCore import QMimeData
+import matplotlib.pyplot as plt
+from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
+
+# Import AlgoSystem modules
+from algosystem.utils.config import load_config, save_config
+
+# Import performance functions
+from algosystem.analysis.performance import (
+ calculate_returns_stats,
+ calculate_rolling_stats,
+ compare_strategies,
+ analyze_returns_by_period
+)
+
+# Import portfolio functions
+from algosystem.analysis.portfolio import (
+ calculate_portfolio_return,
+ calculate_portfolio_variance,
+ calculate_portfolio_std,
+ calculate_sharpe_ratio,
+ optimize_portfolio,
+ calculate_efficient_frontier
+)
+
+# Import risk functions
+from algosystem.analysis.risk import (
+ calculate_var,
+ calculate_cvar,
+ calculate_risk_metrics,
+ stress_test
+)
+
+from algosystem.backtesting.engine import Engine
+from algosystem.backtesting.visualization import (
+ create_equity_chart,
+ create_drawdown_chart,
+ create_monthly_returns_heatmap,
+ create_rolling_sharpe_chart,
+ create_performance_dashboard
+)
+
+class PlotRegistry:
+ """Registry of available plot types and their associated functions"""
+
+ def __init__(self):
+ self.plot_types = {}
+ self.register_default_plots()
+
+ def register_plot(self, name, function, description, required_data, parameters=None):
+ """Register a new plot type"""
+ self.plot_types[name] = {
+ 'function': function,
+ 'description': description,
+ 'required_data': required_data,
+ 'parameters': parameters or {}
+ }
+
+ def register_default_plots(self):
+ """Register the default plot types that come with AlgoSystem"""
+
+ # Performance plots
+ self.register_plot(
+ name="Equity Curve",
+ function=create_equity_chart,
+ description="Shows the growth of portfolio value over time",
+ required_data=["equity"],
+ parameters={
+ 'benchmark': {'type': 'data', 'required': False, 'default': None},
+ 'figsize': {'type': 'tuple', 'required': False, 'default': (10, 6)}
+ }
+ )
+
+ self.register_plot(
+ name="Drawdown Chart",
+ function=create_drawdown_chart,
+ description="Shows the drawdown periods for the strategy",
+ required_data=["equity"],
+ parameters={
+ 'figsize': {'type': 'tuple', 'required': False, 'default': (10, 6)}
+ }
+ )
+
+ self.register_plot(
+ name="Monthly Returns Heatmap",
+ function=create_monthly_returns_heatmap,
+ description="Displays monthly returns as a heatmap",
+ required_data=["equity"],
+ parameters={
+ 'figsize': {'type': 'tuple', 'required': False, 'default': (10, 6)}
+ }
+ )
+
+ self.register_plot(
+ name="Rolling Sharpe Ratio",
+ function=create_rolling_sharpe_chart,
+ description="Shows the rolling Sharpe ratio over time",
+ required_data=["equity"],
+ parameters={
+ 'window': {'type': 'int', 'required': False, 'default': 252},
+ 'figsize': {'type': 'tuple', 'required': False, 'default': (10, 6)}
+ }
+ )
+
+ # Risk analysis plots - using functions from risk.py
+ self.register_plot(
+ name="Value at Risk (VaR)",
+ function=self._create_var_plot,
+ description="Shows the Value at Risk at different confidence levels",
+ required_data=["returns"],
+ parameters={
+ 'confidence_levels': {'type': 'list', 'required': False, 'default': [0.9, 0.95, 0.99]},
+ 'method': {'type': 'choice', 'required': False, 'default': 'historical',
+ 'choices': ['historical', 'parametric', 'monte_carlo']}
+ }
+ )
+
+ # Portfolio optimization plots - using functions from portfolio.py
+ self.register_plot(
+ name="Efficient Frontier",
+ function=self._create_efficient_frontier_plot,
+ description="Shows the efficient frontier for a portfolio of assets",
+ required_data=["returns_matrix"],
+ parameters={
+ 'num_points': {'type': 'int', 'required': False, 'default': 50},
+ 'risk_free_rate': {'type': 'float', 'required': False, 'default': 0.0}
+ }
+ )
+
+ # Add more plot types from performance.py
+ self.register_plot(
+ name="Returns by Period",
+ function=self._create_returns_by_period_plot,
+ description="Shows returns broken down by different time periods",
+ required_data=["returns"],
+ parameters={}
+ )
+
+ self.register_plot(
+ name="Rolling Performance",
+ function=self._create_rolling_performance_plot,
+ description="Shows rolling performance metrics over time",
+ required_data=["returns"],
+ parameters={
+ 'window': {'type': 'int', 'required': False, 'default': 252}
+ }
+ )
+
+ # Add more plot types from risk.py
+ self.register_plot(
+ name="Return Distribution",
+ function=self._create_return_distribution_plot,
+ description="Histogram of returns with normal distribution overlay",
+ required_data=["returns"],
+ parameters={
+ 'bins': {'type': 'int', 'required': False, 'default': 50}
+ }
+ )
+
+ self.register_plot(
+ name="Risk Metrics",
+ function=self._create_risk_metrics_plot,
+ description="Visual summary of key risk metrics",
+ required_data=["returns"],
+ parameters={
+ 'risk_free_rate': {'type': 'float', 'required': False, 'default': 0.0}
+ }
+ )
+
+ def _create_var_plot(self, returns, confidence_levels=[0.9, 0.95, 0.99], method='historical'):
+ """Create VaR plot using calculate_var from risk.py"""
+ fig = plt.figure(figsize=(10, 6))
+ ax = fig.add_subplot(111)
+
+ # Calculate VaR at different confidence levels using risk.py function
+ var_values = [calculate_var(returns, cl, method) for cl in confidence_levels]
+
+ # Plot returns histogram
+ returns.hist(bins=50, ax=ax, alpha=0.5)
+
+ # Add VaR lines
+ colors = ['green', 'orange', 'red']
+ for i, (cl, var) in enumerate(zip(confidence_levels, var_values)):
+ ax.axvline(-var, color=colors[i], linestyle='--',
+ label=f'VaR {cl*100:.0f}%: {var:.2%}')
+
+ ax.set_title(f'Value at Risk ({method.capitalize()})')
+ ax.set_xlabel('Returns')
+ ax.set_ylabel('Frequency')
+ ax.legend()
+
+ return fig
+
+ def _create_efficient_frontier_plot(self, returns_matrix, num_points=50, risk_free_rate=0.0):
+ """Create efficient frontier plot using functions from portfolio.py"""
+ fig = plt.figure(figsize=(10, 6))
+ ax = fig.add_subplot(111)
+
+ # Calculate the efficient frontier using portfolio.py function
+ frontier_returns, frontier_volatilities, frontier_weights = calculate_efficient_frontier(
+ returns_matrix, num_points, risk_free_rate
+ )
+
+ # Plot the efficient frontier
+ ax.plot(frontier_volatilities, frontier_returns, 'b-', linewidth=3, label='Efficient Frontier')
+
+ # Calculate and plot the optimal portfolio (maximum Sharpe ratio)
+ optimal_weights, performance = optimize_portfolio(returns_matrix, risk_free_rate)
+ optimal_return = performance['expected_return']
+ optimal_volatility = performance['volatility']
+
+ ax.scatter(optimal_volatility, optimal_return, marker='*', s=200, color='red',
+ label=f'Optimal Portfolio (Sharpe: {performance["sharpe_ratio"]:.2f})')
+
+ # Add capital market line if risk-free rate is provided
+ if risk_free_rate > 0:
+ max_vol = frontier_volatilities[-1] * 1.2
+ x_values = np.linspace(0, max_vol, 100)
+ slope = (optimal_return - risk_free_rate) / optimal_volatility
+ y_values = risk_free_rate + slope * x_values
+ ax.plot(x_values, y_values, 'g--', label='Capital Market Line')
+ ax.scatter(0, risk_free_rate, marker='o', color='green', label='Risk-Free Asset')
+
+ ax.set_title('Efficient Frontier')
+ ax.set_xlabel('Volatility (Standard Deviation)')
+ ax.set_ylabel('Expected Return')
+ ax.legend()
+ ax.grid(True)
+
+ return fig
+
+ def _create_return_distribution_plot(self, returns, bins=50):
+ """Create histogram of returns with normal distribution overlay"""
+ fig = plt.figure(figsize=(10, 6))
+ ax = fig.add_subplot(111)
+
+ # Plot histogram
+ n, bins, patches = ax.hist(returns, bins=bins, density=True, alpha=0.6, color='blue')
+
+ # Fit normal distribution
+ mu = returns.mean()
+ sigma = returns.std()
+ x = np.linspace(mu - 4*sigma, mu + 4*sigma, 100)
+ y = (1 / (sigma * np.sqrt(2 * np.pi))) * np.exp(- (x - mu)**2 / (2 * sigma**2))
+
+ # Plot normal distribution
+ ax.plot(x, y, 'r--', linewidth=2, label='Normal Distribution')
+
+ # Add mean line
+ ax.axvline(mu, color='green', linestyle='-', linewidth=2,
+ label=f'Mean: {mu:.2%}')
+
+ # Calculate and display skewness and kurtosis
+ skew = returns.skew()
+ kurt = returns.kurtosis()
+ stats_text = f'Skewness: {skew:.2f}\nKurtosis: {kurt:.2f}'
+ ax.text(0.95, 0.95, stats_text, transform=ax.transAxes, verticalalignment='top',
+ horizontalalignment='right', bbox={'facecolor': 'white', 'alpha': 0.8})
+
+ ax.set_title('Return Distribution')
+ ax.set_xlabel('Returns')
+ ax.set_ylabel('Density')
+ ax.legend()
+ ax.grid(True, alpha=0.3)
+
+ return fig
+
+ def _create_risk_metrics_plot(self, returns, risk_free_rate=0.0):
+ """Create visual summary of risk metrics using calculate_risk_metrics from risk.py"""
+ # Calculate risk metrics
+ metrics = calculate_risk_metrics(returns, risk_free_rate)
+
+ fig = plt.figure(figsize=(10, 6))
+ ax = fig.add_subplot(111)
+
+ # Create bar chart of key metrics
+ metric_names = ['annual_return', 'volatility', 'sharpe_ratio', 'sortino_ratio', 'max_drawdown']
+ metric_labels = ['Annual Return', 'Volatility', 'Sharpe Ratio', 'Sortino Ratio', 'Max Drawdown']
+ metric_values = [metrics[name] for name in metric_names]
+
+ # Adjust max_drawdown to positive for visualization
+ metric_values[4] = abs(metric_values[4])
+
+ x = np.arange(len(metric_names))
+ bars = ax.bar(x, metric_values, width=0.6, alpha=0.7)
+
+ # Add value labels on top of bars
+ for bar in bars:
+ height = bar.get_height()
+ ax.annotate(f'{height:.2f}',
+ xy=(bar.get_x() + bar.get_width() / 2, height),
+ xytext=(0, 3), # 3 points vertical offset
+ textcoords="offset points",
+ ha='center', va='bottom')
+
+ ax.set_title('Risk Metrics Summary')
+ ax.set_xticks(x)
+ ax.set_xticklabels(metric_labels, rotation=45)
+ ax.grid(True, alpha=0.3, axis='y')
+
+ return fig
+
+ def _create_returns_by_period_plot(self, returns):
+ """Create returns by period plot using analyze_returns_by_period from performance.py"""
+ # Get period analysis
+ period_analysis = analyze_returns_by_period(returns)
+
+ fig = plt.figure(figsize=(12, 10))
+
+ # Create subplot for monthly returns
+ ax1 = fig.add_subplot(2, 2, 1)
+ monthly_returns = period_analysis['monthly']['returns']
+ monthly_returns.plot(kind='bar', ax=ax1)
+ ax1.set_title('Monthly Returns')
+ ax1.set_ylabel('Return')
+ ax1.grid(True, alpha=0.3)
+
+ # Create subplot for day of week analysis
+ ax2 = fig.add_subplot(2, 2, 2)
+ dow_analysis = period_analysis['day_of_week']
+ dow_analysis['mean'].plot(kind='bar', ax=ax2)
+ ax2.set_title('Average Return by Day of Week')
+ ax2.set_ylabel('Return')
+ ax2.grid(True, alpha=0.3)
+
+ # Create subplot for month of year analysis
+ ax3 = fig.add_subplot(2, 2, 3)
+ moy_analysis = period_analysis['month_of_year']
+ moy_analysis['mean'].plot(kind='bar', ax=ax3)
+ ax3.set_title('Average Return by Month')
+ ax3.set_ylabel('Return')
+ ax3.grid(True, alpha=0.3)
+
+ # Create subplot for positive percentage by period
+ ax4 = fig.add_subplot(2, 2, 4)
+ periods = ['daily', 'monthly', 'quarterly', 'annual']
+ period_labels = ['Daily', 'Monthly', 'Quarterly', 'Annual']
+ positive_pcts = [period_analysis[p]['positive_pct'] for p in periods]
+
+ ax4.bar(period_labels, positive_pcts)
+ ax4.set_title('Percentage of Positive Returns by Period')
+ ax4.set_ylabel('Percentage')
+ ax4.set_ylim([0, 1])
+ ax4.grid(True, alpha=0.3)
+
+ plt.tight_layout()
+ return fig
+
+ def _create_rolling_performance_plot(self, returns, window=252):
+ """Create rolling performance plot using calculate_rolling_stats from performance.py"""
+ # Calculate rolling statistics
+ rolling_stats = calculate_rolling_stats(returns, window)
+
+ fig = plt.figure(figsize=(12, 10))
+
+ # Create subplot for rolling return
+ ax1 = fig.add_subplot(2, 2, 1)
+ rolling_stats['rolling_return'].plot(ax=ax1)
+ ax1.set_title(f'Rolling {window}-Day Return (Annualized)')
+ ax1.set_ylabel('Return')
+ ax1.grid(True, alpha=0.3)
+
+ # Create subplot for rolling volatility
+ ax2 = fig.add_subplot(2, 2, 2)
+ rolling_stats['rolling_volatility'].plot(ax=ax2)
+ ax2.set_title(f'Rolling {window}-Day Volatility (Annualized)')
+ ax2.set_ylabel('Volatility')
+ ax2.grid(True, alpha=0.3)
+
+ # Create subplot for rolling Sharpe ratio
+ ax3 = fig.add_subplot(2, 2, 3)
+ rolling_stats['rolling_sharpe'].plot(ax=ax3)
+ ax3.set_title(f'Rolling {window}-Day Sharpe Ratio')
+ ax3.set_ylabel('Sharpe Ratio')
+ ax3.grid(True, alpha=0.3)
+
+ # Create subplot for rolling max drawdown
+ ax4 = fig.add_subplot(2, 2, 4)
+ rolling_stats['rolling_max_drawdown'].plot(ax=ax4)
+ ax4.set_title(f'Rolling {window}-Day Max Drawdown')
+ ax4.set_ylabel('Drawdown')
+ ax4.grid(True, alpha=0.3)
+
+ plt.tight_layout()
+ return fig
+
+ def get_plot_types(self):
+ """Get list of available plot types"""
+ return list(self.plot_types.keys())
+
+ def get_plot_info(self, name):
+ """Get information about a specific plot type"""
+ return self.plot_types.get(name)
+
+ def create_plot(self, plot_type, data, **kwargs):
+ """Create a plot of the specified type using the provided data"""
+ if plot_type not in self.plot_types:
+ raise ValueError(f"Unknown plot type: {plot_type}")
+
+ plot_info = self.plot_types[plot_type]
+ plot_func = plot_info['function']
+
+ # Check if we have the required data
+ required_data = plot_info['required_data']
+ for req in required_data:
+ if req not in data:
+ raise ValueError(f"Missing required data for {plot_type}: {req}")
+
+ # Extract required data from data dictionary
+ plot_data = {req: data[req] for req in required_data if req in data}
+
+ # Merge kwargs with default parameters
+ parameters = plot_info['parameters']
+ for param_name, param_info in parameters.items():
+ if param_name not in kwargs and 'default' in param_info:
+ kwargs[param_name] = param_info['default']
+
+ # Create the plot
+ return plot_func(**plot_data, **kwargs)
+
+
+class DataManager:
+ """Handles loading and preprocessing of strategy data"""
+
+ def __init__(self):
+ self.data_sources = {}
+ self.current_data = None
+ self.prepared_data = {} # Store preprocessed data for charts
+
+ def load_csv(self, file_path, name=None):
+ """Load data from a CSV file"""
+ try:
+ # Auto-generate name from filename if not provided
+ if name is None:
+ name = os.path.splitext(os.path.basename(file_path))[0]
+
+ # Load the CSV data
+ data = pd.read_csv(file_path, index_col=0, parse_dates=True)
+
+ # Store the data
+ self.data_sources[name] = {
+ 'type': 'csv',
+ 'path': file_path,
+ 'data': data
+ }
+
+ # Preprocess the data for charts
+ self._prepare_data_for_charts(name)
+
+ return name
+ except Exception as e:
+ print(f"Error loading CSV: {e}")
+ return None
+
+ def load_backtest_results(self, results_dict, name=None):
+ """Load data from backtest results"""
+ try:
+ # Auto-generate name if not provided
+ if name is None:
+ name = f"Backtest_{datetime.now().strftime('%Y%m%d_%H%M%S')}"
+
+ # Store the data
+ self.data_sources[name] = {
+ 'type': 'backtest',
+ 'data': results_dict
+ }
+
+ # Preprocess the data for charts
+ self._prepare_data_for_charts(name)
+
+ return name
+ except Exception as e:
+ print(f"Error loading backtest results: {e}")
+ return None
+
+ def _prepare_data_for_charts(self, source_name):
+ """Preprocess data for charts when data is loaded"""
+ if source_name not in self.data_sources:
+ return
+
+ source_info = self.data_sources[source_name]
+ source_type = source_info['type']
+ source_data = source_info['data']
+
+ # Initialize prepared data for this source
+ self.prepared_data[source_name] = {}
+
+ # For backtest results
+ if source_type == 'backtest':
+ # Extract equity curve
+ if 'equity' in source_data:
+ equity = source_data['equity']
+ self.prepared_data[source_name]['equity'] = equity
+
+ # Calculate returns
+ returns = equity.pct_change().dropna()
+ self.prepared_data[source_name]['returns'] = returns
+
+ # Calculate drawdown
+ cumulative_returns = (1 + returns).cumprod()
+ drawdown = (cumulative_returns / cumulative_returns.cummax()) - 1
+ self.prepared_data[source_name]['drawdown'] = drawdown
+
+ # If there are positions, calculate turnover
+ if 'positions' in source_data:
+ positions = source_data['positions']
+ daily_turnover = positions.diff().abs().sum(axis=1)
+ self.prepared_data[source_name]['turnover'] = daily_turnover
+
+ # Calculate performance metrics
+ try:
+ from algosystem.analysis.risk import calculate_risk_metrics
+ metrics = calculate_risk_metrics(returns)
+ self.prepared_data[source_name]['metrics'] = metrics
+ except Exception as e:
+ print(f"Error calculating risk metrics: {e}")
+
+ # For CSV data
+ elif source_type == 'csv':
+ data = source_data
+
+ # If it's a DataFrame with a single column, treat it as an equity curve
+ if isinstance(data, pd.DataFrame) and data.shape[1] == 1:
+ equity = data.iloc[:, 0]
+ self.prepared_data[source_name]['equity'] = equity
+
+ # Calculate returns
+ returns = equity.pct_change().dropna()
+ self.prepared_data[source_name]['returns'] = returns
+
+ # Calculate drawdown
+ cumulative_returns = (1 + returns).cumprod()
+ drawdown = (cumulative_returns / cumulative_returns.cummax()) - 1
+ self.prepared_data[source_name]['drawdown'] = drawdown
+
+ # Calculate performance metrics
+ try:
+ from algosystem.analysis.risk import calculate_risk_metrics
+ metrics = calculate_risk_metrics(returns)
+ self.prepared_data[source_name]['metrics'] = metrics
+ except Exception as e:
+ print(f"Error calculating risk metrics: {e}")
+
+ # If it's a DataFrame with multiple columns, treat it as returns of multiple assets
+ elif isinstance(data, pd.DataFrame) and data.shape[1] > 1:
+ # Store the data as returns matrix for portfolio analysis
+ self.prepared_data[source_name]['returns_matrix'] = data
+
+ # Calculate correlation matrix
+ correlation = data.corr()
+ self.prepared_data[source_name]['correlation'] = correlation
+
+ # Calculate efficient frontier
+ try:
+ from algosystem.analysis.portfolio import calculate_efficient_frontier, optimize_portfolio
+ frontier_returns, frontier_volatilities, frontier_weights = calculate_efficient_frontier(data, 20, 0.0)
+ optimal_weights, performance = optimize_portfolio(data, 0.0)
+
+ self.prepared_data[source_name]['frontier_returns'] = frontier_returns
+ self.prepared_data[source_name]['frontier_volatilities'] = frontier_volatilities
+ self.prepared_data[source_name]['frontier_weights'] = frontier_weights
+ self.prepared_data[source_name]['optimal_weights'] = optimal_weights
+ self.prepared_data[source_name]['optimal_performance'] = performance
+ except Exception as e:
+ print(f"Error calculating portfolio optimization: {e}")
+
+ def get_data_source_names(self):
+ """Get list of available data sources"""
+ return list(self.data_sources.keys())
+
+ def get_data(self, name):
+ """Get data for a specific source"""
+ if name in self.data_sources:
+ return self.data_sources[name]['data']
+ return None
+
+ def get_prepared_data(self, name, data_type=None):
+ """Get prepared data for a specific source and data type"""
+ if name in self.prepared_data:
+ if data_type is not None:
+ return self.prepared_data[name].get(data_type)
+ return self.prepared_data[name]
+ return None
+
+ def generate_returns(self, data_name, price_column=None):
+ """Generate returns series from price data"""
+ # First check if returns are already prepared
+ prepared_returns = self.get_prepared_data(data_name, 'returns')
+ if prepared_returns is not None:
+ return prepared_returns
+
+ # If not, calculate returns from the data
+ data = self.get_data(data_name)
+ if data is None:
+ return None
+
+ # If it's a backtest result, extract the equity curve
+ if self.data_sources[data_name]['type'] == 'backtest':
+ if 'equity' in data:
+ equity = data['equity']
+ returns = equity.pct_change().dropna()
+ # Store the results for future use
+ if data_name in self.prepared_data:
+ self.prepared_data[data_name]['returns'] = returns
+ return returns
+
+ # Otherwise, treat as a DataFrame with a price column
+ elif isinstance(data, pd.DataFrame):
+ if price_column is None:
+ if data.shape[1] == 1:
+ price_column = data.columns[0]
+ else:
+ raise ValueError("DataFrame has multiple columns; specify price_column.")
+
+ prices = data[price_column]
+ returns = prices.pct_change().dropna()
+ # Store the results for future use
+ if data_name in self.prepared_data:
+ self.prepared_data[data_name]['returns'] = returns
+ return returns
+
+ return None
+
+
+class EnhancedGraphModule(pg.GraphicsLayoutWidget):
+ """A modular plot widget that can be customized and placed in the dashboard"""
+
+ removed = pyqtSignal(object) # Signal emitted when plot is removed
+
+ def __init__(self, parent=None, plot_id=None, plot_type=None, title="Plot", config=None):
+ super().__init__(parent)
+ self.plot_id = plot_id if plot_id else id(self) # Unique identifier
+ self.plot_type = plot_type
+ self.plot_title = title
+ self.config = config or {}
+
+ # Set the background and size
+ self.setBackground('w')
+ self.setMinimumSize(300, 200)
+
+ # Create a plot area
+ self.plot_item = self.addPlot(title=title)
+
+ # Add controls as overlay
+ self.controls = QWidget(self)
+ self.controls_layout = QHBoxLayout(self.controls)
+ self.controls_layout.setContentsMargins(5, 5, 5, 5)
+ self.controls_layout.setSpacing(2)
+
+ # Title label
+ self.title_label = QLabel(title)
+ self.title_label.setStyleSheet("background-color: rgba(255, 255, 255, 0.7); padding: 2px;")
+ self.controls_layout.addWidget(self.title_label)
+
+ # Spacer to push buttons to the right
+ self.controls_layout.addStretch()
+
+ # Settings button
+ self.settings_btn = QToolButton()
+ self.settings_btn.setText("⚙")
+ self.settings_btn.setStyleSheet("background-color: rgba(255, 255, 255, 0.7);")
+ self.settings_btn.clicked.connect(self.show_settings)
+ self.controls_layout.addWidget(self.settings_btn)
+
+ # Remove button with black x
+ self.remove_btn = QToolButton()
+ self.remove_btn.setText("✕")
+ self.remove_btn.setStyleSheet("background-color: rgba(255, 255, 255, 0.7); color: black; font-weight: bold;")
+ self.remove_btn.clicked.connect(self.remove_self)
+ self.controls_layout.addWidget(self.remove_btn)
+
+ # Position the controls at the top
+ self.controls.setGeometry(0, 0, self.width(), 30)
+
+ # Apply the configuration if available
+ self.apply_config()
+
+ def resizeEvent(self, event):
+ """Handle resize event to reposition controls"""
+ super().resizeEvent(event)
+ # Make sure controls exist before setting geometry
+ if hasattr(self, 'controls'):
+ self.controls.setGeometry(0, 0, self.width(), 30)
+
+ def apply_config(self):
+ """Apply saved configuration to the plot"""
+ if not self.config:
+ return
+
+ # Apply plot-specific settings
+ if "title" in self.config:
+ self.plot_title = self.config["title"]
+ self.title_label.setText(self.plot_title)
+ self.plot_item.setTitle(self.plot_title)
+
+ if "grid" in self.config:
+ self.plot_item.showGrid(x=self.config["grid"].get("x", True),
+ y=self.config["grid"].get("y", True))
+
+ def update_plot_data(self, data):
+ """Update the plot with new data"""
+ self.plot_item.clear()
+
+ # Example: Simple line plot
+ if isinstance(data, pd.Series):
+ x = np.arange(len(data))
+ y = data.values
+ self.plot_item.plot(x, y, pen=pg.mkPen(color='b', width=2))
+ elif isinstance(data, pd.DataFrame):
+ for column in data.columns:
+ y = data[column].values
+ x = np.arange(len(y))
+ self.plot_item.plot(x, y, pen=pg.mkPen(width=2), name=column)
+
+ # Add legend if multiple series
+ if isinstance(data, pd.DataFrame) and len(data.columns) > 1:
+ self.plot_item.addLegend()
+
+ def show_settings(self):
+ """Open settings dialog for this plot"""
+ settings_dialog = PlotSettingsDialog(self, self.config, self.plot_type)
+ if settings_dialog.exec():
+ # Update configuration based on dialog results
+ self.config = settings_dialog.get_config()
+ self.apply_config()
+
+ def remove_self(self):
+ """Remove this plot from the dashboard"""
+ self.removed.emit(self)
+ self.deleteLater()
+
+ def get_config_dict(self):
+ """Return a dictionary with configuration for saving"""
+ return {
+ "id": self.plot_id,
+ "type": self.plot_type,
+ "title": self.plot_title,
+ "config": self.config
+ }
+
+
+class PlotSettingsDialog(QDialog):
+ """Dialog for editing plot settings"""
+
+ def __init__(self, parent=None, config=None, plot_type=None):
+ super().__init__(parent)
+ self.config = config or {}
+ self.plot_type = plot_type
+
+ self.setWindowTitle("Plot Settings")
+ self.setMinimumWidth(400)
+
+ layout = QVBoxLayout(self)
+
+ # Title settings
+ title_group = QGroupBox("Title")
+ title_layout = QHBoxLayout()
+ title_group.setLayout(title_layout)
+
+ self.title_edit = QLineEdit()
+ if "title" in self.config:
+ self.title_edit.setText(self.config["title"])
+ else:
+ self.title_edit.setText(f"{plot_type or 'Plot'}")
+ title_layout.addWidget(self.title_edit)
+
+ layout.addWidget(title_group)
+
+ # Data source settings
+ data_group = QGroupBox("Data Source")
+ data_layout = QGridLayout()
+ data_group.setLayout(data_layout)
+
+ data_layout.addWidget(QLabel("Source:"), 0, 0)
+ self.data_source = QComboBox()
+ # These would be populated from the dashboard's data manager
+ self.data_source.addItems(["Strategy 1", "Benchmark", "Custom"])
+ data_layout.addWidget(self.data_source, 0, 1)
+
+ data_layout.addWidget(QLabel("Column:"), 1, 0)
+ self.data_column = QComboBox()
+ # These would be populated based on the selected data source
+ self.data_column.addItems(["Close", "Open", "High", "Low", "Volume"])
+ data_layout.addWidget(self.data_column, 1, 1)
+
+ layout.addWidget(data_group)
+
+ # Visual settings
+ visual_group = QGroupBox("Visual Settings")
+ visual_layout = QGridLayout()
+ visual_group.setLayout(visual_layout)
+
+ # Line color
+ visual_layout.addWidget(QLabel("Line Color:"), 0, 0)
+ self.line_color_btn = QPushButton()
+ self.line_color = self.config.get("line_color", "#0000FF")
+ self.line_color_btn.setStyleSheet(f"background-color: {self.line_color}")
+ self.line_color_btn.clicked.connect(self.choose_line_color)
+ visual_layout.addWidget(self.line_color_btn, 0, 1)
+
+ # Line width
+ visual_layout.addWidget(QLabel("Line Width:"), 1, 0)
+ self.line_width = QSpinBox()
+ self.line_width.setRange(1, 10)
+ self.line_width.setValue(self.config.get("line_width", 2))
+ visual_layout.addWidget(self.line_width, 1, 1)
+
+ # Grid options
+ visual_layout.addWidget(QLabel("Show Grid:"), 2, 0)
+ grid_layout = QHBoxLayout()
+
+ self.grid_x = QCheckBox("X")
+ self.grid_y = QCheckBox("Y")
+
+ grid_config = self.config.get("grid", {"x": True, "y": True})
+ self.grid_x.setChecked(grid_config.get("x", True))
+ self.grid_y.setChecked(grid_config.get("y", True))
+
+ grid_layout.addWidget(self.grid_x)
+ grid_layout.addWidget(self.grid_y)
+ visual_layout.addLayout(grid_layout, 2, 1)
+
+ layout.addWidget(visual_group)
+
+ # Plot-specific settings
+ if self.plot_type:
+ specific_group = QGroupBox(f"{self.plot_type} Settings")
+ specific_layout = QGridLayout()
+ specific_group.setLayout(specific_layout)
+
+ # Add plot-specific settings based on plot type
+ if self.plot_type == "Equity Curve":
+ specific_layout.addWidget(QLabel("Show Benchmark:"), 0, 0)
+ self.show_benchmark = QCheckBox()
+ self.show_benchmark.setChecked(self.config.get("show_benchmark", False))
+ specific_layout.addWidget(self.show_benchmark, 0, 1)
+
+ specific_layout.addWidget(QLabel("Benchmark:"), 1, 0)
+ self.benchmark_source = QComboBox()
+ # Would be populated from dashboard's data manager
+ self.benchmark_source.addItems(["S&P 500", "Nasdaq", "Custom"])
+ specific_layout.addWidget(self.benchmark_source, 1, 1)
+
+ elif self.plot_type == "Rolling Sharpe Ratio":
+ specific_layout.addWidget(QLabel("Window (days):"), 0, 0)
+ self.window_size = QSpinBox()
+ self.window_size.setRange(5, 500)
+ self.window_size.setValue(self.config.get("window_size", 252))
+ specific_layout.addWidget(self.window_size, 0, 1)
+
+ layout.addWidget(specific_group)
+
+ # Buttons
+ button_layout = QHBoxLayout()
+ ok_button = QPushButton("OK")
+ ok_button.clicked.connect(self.accept)
+ cancel_button = QPushButton("Cancel")
+ cancel_button.clicked.connect(self.reject)
+
+ button_layout.addWidget(cancel_button)
+ button_layout.addWidget(ok_button)
+ layout.addLayout(button_layout)
+
+ def choose_line_color(self):
+ """Open color picker for line color"""
+ color = QColorDialog.getColor()
+ if color.isValid():
+ self.line_color = color.name()
+ self.line_color_btn.setStyleSheet(f"background-color: {self.line_color}")
+
+ def get_config(self):
+ """Return the updated configuration"""
+ config = {
+ "title": self.title_edit.text(),
+ "line_color": self.line_color,
+ "line_width": self.line_width.value(),
+ "grid": {
+ "x": self.grid_x.isChecked(),
+ "y": self.grid_y.isChecked()
+ },
+ "data_source": self.data_source.currentText(),
+ "data_column": self.data_column.currentText()
+ }
+
+ # Add plot-specific settings
+ if self.plot_type == "Equity Curve":
+ config["show_benchmark"] = self.show_benchmark.isChecked()
+ config["benchmark_source"] = self.benchmark_source.currentText()
+ elif self.plot_type == "Rolling Sharpe Ratio":
+ config["window_size"] = self.window_size.value()
+
+ return config
+
+
+class PlotPalette(QTreeWidget):
+ """Widget displaying available plot types categorized by function"""
+
+ def __init__(self, parent=None, plot_registry=None):
+ super().__init__(parent)
+ self.plot_registry = plot_registry or PlotRegistry()
+
+ # Set up the tree widget
+ self.setHeaderLabel("Available Plots")
+ self.setDragEnabled(True)
+
+ # Populate the tree with plot types
+ self.populate()
+
+ def populate(self):
+ """Populate the tree with available plot types"""
+ self.clear()
+
+ # Create categories
+ performance_category = QTreeWidgetItem(self, ["Performance"])
+ risk_category = QTreeWidgetItem(self, ["Risk Analysis"])
+ portfolio_category = QTreeWidgetItem(self, ["Portfolio Optimization"])
+
+ # Categorize plot types
+ plot_types = self.plot_registry.get_plot_types()
+ for plot_type in plot_types:
+ item = QTreeWidgetItem([plot_type])
+
+ # Add to appropriate category
+ if "Equity" in plot_type or "Drawdown" in plot_type or "Sharpe" in plot_type or "Monthly Returns" in plot_type:
+ performance_category.addChild(item)
+ elif "VaR" in plot_type or "Risk" in plot_type or "Return Distribution" in plot_type:
+ risk_category.addChild(item)
+ elif "Efficient" in plot_type or "Portfolio" in plot_type:
+ portfolio_category.addChild(item)
+ else:
+ self.addTopLevelItem(item)
+
+ # Expand all categories
+ self.expandAll()
+
+ def mousePressEvent(self, event):
+ """Handle mouse press event for dragging"""
+ super().mousePressEvent(event)
+
+ if event.button() == Qt.MouseButton.LeftButton:
+ # Get the item under the cursor
+ item = self.itemAt(event.pos())
+ if item and item.parent(): # Only allow dragging leaf nodes
+ # Store the plot type
+ self.drag_plot_type = item.text(0)
+
+ # Start drag operation
+ drag = QDrag(self)
+ mime_data = QMimeData()
+ mime_data.setText(self.drag_plot_type)
+ drag.setMimeData(mime_data)
+
+ # Create a pixmap for the drag icon
+ pixmap = QPixmap(100, 30)
+ pixmap.fill(Qt.GlobalColor.transparent)
+ painter = QPainter(pixmap)
+ painter.drawText(0, 20, self.drag_plot_type)
+ painter.end()
+
+ drag.setPixmap(pixmap)
+ drag.exec(Qt.DropAction.CopyAction)
+
+
+class DashboardArea(QWidget):
+ """Widget containing the dashboard grid where plots are arranged"""
+
+ def __init__(self, parent=None, data_manager=None, plot_registry=None):
+ super().__init__(parent)
+ self.data_manager = data_manager or DataManager()
+ self.plot_registry = plot_registry or PlotRegistry()
+
+ # Set up layout
+ self.layout = QGridLayout(self)
+ self.layout.setSpacing(10)
+
+ # Track plots
+ self.plots = []
+ self.grid_positions = {} # Map plot ID to grid position
+ self.current_row = 0
+ self.current_col = 0
+ self.max_cols = 2
+
+ # Currently active data source
+ self.active_data_source = None
+
+ # Accept drops
+ self.setAcceptDrops(True)
+
+ def dragEnterEvent(self, event):
+ """Handle drag enter event"""
+ if event.mimeData().hasText():
+ event.accept()
+ else:
+ event.ignore()
+
+ def dropEvent(self, event):
+ """Handle drop event"""
+ if event.mimeData().hasText():
+ plot_type = event.mimeData().text()
+
+ # Add the plot to the grid
+ self.add_plot(plot_type)
+
+ event.accept()
+ else:
+ event.ignore()
+
+ def add_plot(self, plot_type, config=None):
+ """Add a new plot to the dashboard"""
+ # Create the plot
+ plot = EnhancedGraphModule(plot_type=plot_type, title=plot_type, config=config)
+ plot.removed.connect(self.remove_plot)
+
+ # Add to grid layout
+ grid_pos = (self.current_row, self.current_col)
+ self.layout.addWidget(plot, *grid_pos)
+ self.grid_positions[plot.plot_id] = grid_pos
+
+ # Update grid position for next plot
+ self.current_col += 1
+ if self.current_col >= self.max_cols:
+ self.current_col = 0
+ self.current_row += 1
+
+ self.plots.append(plot)
+
+ # If there's active data, update the plot with it
+ if self.active_data_source:
+ self.update_plot_with_source(plot, self.active_data_source)
+ else:
+ # No data available, generate sample data
+ self.update_plot_with_sample_data(plot)
+
+ return plot
+
+ def update_plot_with_source(self, plot, source_name):
+ """Update a plot with data from a specific source"""
+ # Get prepared data for this source
+ prepared_data = self.data_manager.get_prepared_data(source_name)
+ if not prepared_data:
+ # If no prepared data, use sample data
+ self.update_plot_with_sample_data(plot)
+ return
+
+ # Get plot info
+ plot_info = self.plot_registry.get_plot_info(plot.plot_type)
+ if not plot_info:
+ return
+
+ # Check if we have all required data
+ required_data = plot_info['required_data']
+ missing_data = [req for req in required_data if req not in prepared_data]
+
+ if missing_data:
+ # Try to generate missing data
+ for req in missing_data:
+ if req == 'returns' and 'equity' in prepared_data:
+ # Generate returns from equity
+ equity = prepared_data['equity']
+ prepared_data['returns'] = equity.pct_change().dropna()
+ elif req == 'returns_matrix' and 'equity' in prepared_data:
+ # For single-asset data, create a dummy returns matrix with just this asset
+ returns = prepared_data.get('returns')
+ if returns is None:
+ returns = prepared_data['equity'].pct_change().dropna()
+ prepared_data['returns_matrix'] = pd.DataFrame(returns, columns=['Asset'])
+ elif req == 'drawdown' and 'returns' in prepared_data:
+ # Generate drawdown series from returns
+ returns = prepared_data['returns']
+ cumulative_returns = (1 + returns).cumprod()
+ prepared_data['drawdown'] = (cumulative_returns / cumulative_returns.cummax()) - 1
+
+ # If we still have missing data after trying to generate it, use sample data
+ missing_data = [req for req in required_data if req not in prepared_data]
+ if missing_data:
+ self.update_plot_with_sample_data(plot)
+ return
+
+ # Extract required data for the plot
+ plot_data = {req: prepared_data[req] for req in required_data}
+
+ # Get default parameters
+ parameters = plot_info['parameters']
+ kwargs = {}
+ for param_name, param_info in parameters.items():
+ if 'default' in param_info:
+ kwargs[param_name] = param_info['default']
+
+ # Apply configuration parameters if available
+ if plot.config and 'parameters' in plot.config:
+ for param_name, value in plot.config['parameters'].items():
+ kwargs[param_name] = value
+
+ try:
+ # Create the plot figure using the plot registry function
+ figure = self.plot_registry.create_plot(plot.plot_type, plot_data, **kwargs)
+
+ # Convert matplotlib figure to PyQtGraph plot data
+ self._update_pyqtgraph_from_matplotlib(plot, figure)
+ except Exception as e:
+ print(f"Error updating plot {plot.plot_type}: {e}")
+ self.update_plot_with_sample_data(plot)
+
+ def _update_pyqtgraph_from_matplotlib(self, plot_widget, matplotlib_figure):
+ """Convert matplotlib figure to data for PyQtGraph plot"""
+ # This is a simplified conversion that extracts data from the first axes of the matplotlib figure
+ # For a complete solution, you would need to handle multiple axes, different plot types, etc.
+ try:
+ # Extract data from the first axes
+ axes = matplotlib_figure.axes[0]
+
+ # Clear existing plot items
+ plot_widget.plot_item.clear()
+
+ # Get all line plots from the axes
+ for line in axes.get_lines():
+ x_data = line.get_xdata()
+ y_data = line.get_ydata()
+
+ # Convert data to numpy arrays if needed
+ if not isinstance(x_data, np.ndarray):
+ x_data = np.array(x_data)
+ if not isinstance(y_data, np.ndarray):
+ y_data = np.array(y_data)
+
+ # Get color and create pen
+ color = line.get_color()
+ if isinstance(color, tuple) and len(color) == 3:
+ color = tuple(int(c * 255) for c in color) + (255,) # RGBA
+ elif isinstance(color, str):
+ # Convert matplotlib color string to RGBA tuple
+ from matplotlib.colors import to_rgba
+ rgba = to_rgba(color)
+ color = tuple(int(c * 255) for c in rgba)
+
+ pen = pg.mkPen(color=color, width=line.get_linewidth())
+
+ # Add to plot
+ plot_widget.plot_item.plot(x_data, y_data, pen=pen, name=line.get_label())
+
+ # Update plot title and labels
+ plot_widget.plot_item.setTitle(axes.get_title())
+ plot_widget.plot_item.setLabel('bottom', axes.get_xlabel())
+ plot_widget.plot_item.setLabel('left', axes.get_ylabel())
+
+ # Add legend if needed
+ if axes.get_legend():
+ plot_widget.plot_item.addLegend()
+
+ # Close matplotlib figure to free resources
+ plt.close(matplotlib_figure)
+
+ except Exception as e:
+ print(f"Error converting matplotlib figure to PyQtGraph: {e}")
+ # Fall back to sample data
+ self.update_plot_with_sample_data(plot_widget)
+
+ def update_plot_with_sample_data(self, plot):
+ """Update a plot with sample data if no real data is available"""
+ # Generate sample data based on plot type
+ plot.plot_item.clear()
+
+ if plot.plot_type == "Equity Curve":
+ # Sample equity curve
+ x = np.arange(100)
+ y = 100 * (1 + 0.001 * np.cumsum(np.random.normal(0.001, 0.01, 100)))
+ plot.plot_item.plot(x, y, pen=pg.mkPen(color='b', width=2))
+
+ elif plot.plot_type == "Drawdown Chart":
+ # Sample drawdown chart
+ x = np.arange(100)
+ drawdown = -0.01 * np.abs(np.cumsum(np.random.normal(0, 1, 100)))
+ drawdown = np.maximum(drawdown, -0.3) # Cap at -30%
+ plot.plot_item.plot(x, drawdown, pen=pg.mkPen(color='r', width=2))
+
+ elif plot.plot_type == "Monthly Returns Heatmap":
+ # For heatmap, we need a different approach since PyQtGraph doesn't directly support heatmaps
+ # Create a colorful grid as placeholder
+ img = np.random.normal(0, 1, (12, 5)) # 12 months x 5 years
+ colormap = pg.colormap.get('viridis')
+ image_item = pg.ImageItem(img)
+ image_item.setLookupTable(colormap.getLookupTable())
+ plot.plot_item.addItem(image_item)
+
+ elif plot.plot_type == "Rolling Sharpe Ratio":
+ # Sample rolling sharpe ratio
+ x = np.arange(100)
+ y = np.cumsum(np.random.normal(0, 0.2, 100))
+ y = y - np.min(y) # Make all positive
+ y = y / np.max(y) * 3 # Scale to reasonable Sharpe values
+ plot.plot_item.plot(x, y, pen=pg.mkPen(color='g', width=2))
+
+ elif "VaR" in plot.plot_type:
+ # Sample VaR distribution
+ x = np.linspace(-0.05, 0.05, 100)
+ y = np.exp(-(x-0.001)**2/(2*0.01**2)) / (0.01 * np.sqrt(2*np.pi))
+ plot.plot_item.plot(x, y, pen=pg.mkPen(color='b', width=2))
+
+ # Add VaR lines
+ var_95 = -0.02
+ plot.plot_item.addLine(x=var_95, pen=pg.mkPen(color='r', width=2, style=Qt.PenStyle.DashLine))
+
+ elif "Efficient Frontier" in plot.plot_type:
+ # Sample efficient frontier
+ risk = np.linspace(0.05, 0.3, 100)
+ return_values = 0.02 + 0.3 * risk + 0.05 * np.random.random(100)
+ plot.plot_item.plot(risk, return_values, pen=pg.mkPen(color='b', width=2))
+
+ # Add points
+ scatter = pg.ScatterPlotItem(size=10, brush=pg.mkBrush(255, 0, 0, 255))
+ scatter.addPoints([0.1, 0.2], [0.05, 0.12])
+ plot.plot_item.addItem(scatter)
+
+ else:
+ # Generic line plot for other plot types
+ x = np.arange(100)
+ y = np.cumsum(np.random.normal(0, 1, 100))
+ plot.plot_item.plot(x, y, pen=pg.mkPen(color='b', width=2))
+
+ def set_active_data_source(self, source_name):
+ """Set the active data source and update all plots"""
+ self.active_data_source = source_name
+
+ # Update all existing plots with the new data source
+ for plot in self.plots:
+ self.update_plot_with_source(plot, source_name)
+
+ def remove_plot(self, plot):
+ """Remove a plot from the dashboard"""
+ if plot in self.plots:
+ self.plots.remove(plot)
+ self.layout.removeWidget(plot)
+
+ # Delete from grid positions
+ if plot.plot_id in self.grid_positions:
+ del self.grid_positions[plot.plot_id]
+
+ # Rearrange the remaining plots
+ self.rearrange_plots()
+
+ def rearrange_plots(self):
+ """Rearrange all plots in the grid"""
+ # Remove all plots from grid layout
+ for plot in self.plots:
+ self.layout.removeWidget(plot)
+
+ # Reset grid positions
+ self.grid_positions = {}
+ self.current_row = 0
+ self.current_col = 0
+
+ # Re-add plots to layout
+ for plot in self.plots:
+ grid_pos = (self.current_row, self.current_col)
+ self.layout.addWidget(plot, *grid_pos)
+ self.grid_positions[plot.plot_id] = grid_pos
+
+ # Update grid position for next plot
+ self.current_col += 1
+ if self.current_col >= self.max_cols:
+ self.current_col = 0
+ self.current_row += 1
+
+ def get_dashboard_config(self):
+ """Get the dashboard configuration for saving"""
+ plot_configs = []
+ for plot in self.plots:
+ config = plot.get_config_dict()
+ # Add grid position
+ if plot.plot_id in self.grid_positions:
+ row, col = self.grid_positions[plot.plot_id]
+ config['position'] = {'row': row, 'col': col}
+ plot_configs.append(config)
+
+ return {
+ 'plots': plot_configs,
+ 'max_cols': self.max_cols,
+ 'active_data_source': self.active_data_source
+ }
+
+ def load_dashboard_config(self, config):
+ """Load dashboard from configuration"""
+ if not config or 'plots' not in config:
+ return
+
+ # Clear existing plots
+ for plot in self.plots[:]:
+ self.remove_plot(plot)
+
+ # Set max columns
+ self.max_cols = config.get('max_cols', 2)
+
+ # Set active data source
+ if 'active_data_source' in config:
+ self.active_data_source = config['active_data_source']
+
+ # Add plots from config
+ for plot_config in config['plots']:
+ plot_type = plot_config.get('type')
+ if not plot_type:
+ continue
+
+ # Create the plot
+ plot = self.add_plot(plot_type, plot_config.get('config'))
+
+ # Set position if specified
+ if 'position' in plot_config:
+ pos = plot_config['position']
+ if plot.plot_id in self.grid_positions:
+ del self.grid_positions[plot.plot_id]
+ self.layout.removeWidget(plot)
+
+ row, col = pos.get('row', 0), pos.get('col', 0)
+ self.layout.addWidget(plot, row, col)
+ self.grid_positions[plot.plot_id] = (row, col)
+
+ def load_data(self):
+ """Load data from a file and add it to the data manager."""
+ # Open file dialog to select data file
+ file_path, _ = QFileDialog.getOpenFileName(
+ self,
+ "Load Data File",
+ "",
+ "CSV Files (*.csv);;All Files (*)"
+ )
+
+ if file_path:
+ try:
+ # Load the data into the data manager
+ source_name = self.data_manager.load_csv(file_path)
+
+ if source_name:
+ # Update data source selector
+ self.update_data_sources()
+
+ # Select the newly loaded data source
+ index = self.data_source_selector.findText(source_name)
+ if index >= 0:
+ self.data_source_selector.setCurrentIndex(index)
+
+ QMessageBox.information(
+ self,
+ "Data Loaded",
+ f"Successfully loaded data from {os.path.basename(file_path)}"
+ )
+ else:
+ QMessageBox.warning(
+ self,
+ "Load Error",
+ "Failed to load data from the selected file."
+ )
+ except Exception as e:
+ QMessageBox.critical(
+ self,
+ "Error",
+ f"An error occurred while loading the data: {str(e)}"
+ )
+
+ def update_data_sources(self):
+ """Update the data source selector with available data sources."""
+ # Get list of data sources
+ sources = self.data_manager.get_data_source_names()
+
+ # Save current selection
+ current_text = self.data_source_selector.currentText()
+
+ # Clear and repopulate
+ self.data_source_selector.clear()
+ self.data_source_selector.addItems(sources)
+
+ # Restore selection if possible
+ if current_text:
+ index = self.data_source_selector.findText(current_text)
+ if index >= 0:
+ self.data_source_selector.setCurrentIndex(index)
+ elif self.data_source_selector.count() > 0:
+ # Otherwise select the first item
+ self.data_source_selector.setCurrentIndex(0)
+
+ def on_data_source_changed(self, source_name):
+ """Handle changes to the selected data source."""
+ if source_name:
+ # Set the active data source in the dashboard area
+ self.dashboard_area.set_active_data_source(source_name)
+
+ def refresh_all_charts(self):
+ """Refresh all charts with current data."""
+ current_source = self.data_source_selector.currentText()
+ if current_source:
+ self.dashboard_area.set_active_data_source(current_source)
+ QMessageBox.information(
+ self,
+ "Refresh Complete",
+ "All charts have been refreshed with the current data."
+ )
+ else:
+ QMessageBox.warning(
+ self,
+ "No Data Selected",
+ "Please select a data source to refresh charts."
+ )
+
+ def save_configuration(self):
+ """Save the current dashboard configuration."""
+ file_path, _ = QFileDialog.getSaveFileName(
+ self,
+ "Save Dashboard Configuration",
+ "",
+ "JSON Files (*.json);;All Files (*)"
+ )
+
+ if file_path:
+ try:
+ # Get configuration from dashboard area
+ dashboard_config = self.dashboard_area.get_dashboard_config()
+
+ # Save configuration to file
+ with open(file_path, 'w') as f:
+ import json
+ json.dump(dashboard_config, f, indent=4)
+
+ QMessageBox.information(
+ self,
+ "Save Complete",
+ f"Dashboard configuration saved to {os.path.basename(file_path)}"
+ )
+ except Exception as e:
+ QMessageBox.critical(
+ self,
+ "Error",
+ f"An error occurred while saving the configuration: {str(e)}"
+ )
+
+ def load_configuration(self):
+ """Load a dashboard configuration from a file."""
+ file_path, _ = QFileDialog.getOpenFileName(
+ self,
+ "Load Dashboard Configuration",
+ "",
+ "JSON Files (*.json);;All Files (*)"
+ )
+
+ if file_path:
+ try:
+ # Load configuration from file
+ with open(file_path, 'r') as f:
+ import json
+ dashboard_config = json.load(f)
+
+ # Apply configuration to dashboard area
+ self.dashboard_area.load_dashboard_config(dashboard_config)
+
+ # Update active data source if specified
+ if 'active_data_source' in dashboard_config and dashboard_config['active_data_source']:
+ source_name = dashboard_config['active_data_source']
+ index = self.data_source_selector.findText(source_name)
+ if index >= 0:
+ self.data_source_selector.setCurrentIndex(index)
+
+ QMessageBox.information(
+ self,
+ "Load Complete",
+ f"Dashboard configuration loaded from {os.path.basename(file_path)}"
+ )
+ except Exception as e:
+ QMessageBox.critical(
+ self,
+ "Error",
+ f"An error occurred while loading the configuration: {str(e)}"
+ )
+
+ def load_config_from_env(self):
+ """Load configuration from environment variable."""
+ config_path = os.environ.get('ALGO_DASHBOARD_CONFIG')
+ if config_path and os.path.exists(config_path):
+ try:
+ # Load configuration from file
+ with open(config_path, 'r') as f:
+ import json
+ dashboard_config = json.load(f)
+
+ # Apply configuration to dashboard area
+ self.dashboard_area.load_dashboard_config(dashboard_config)
+
+ print(f"Loaded configuration from environment variable: {config_path}")
+ except Exception as e:
+ print(f"Error loading configuration from environment: {e}")
+
+ def load_data_from_env(self):
+ """Load data from directory specified in environment variable."""
+ data_dir = os.environ.get('ALGO_DASHBOARD_DATA_DIR')
+ if data_dir and os.path.exists(data_dir):
+ try:
+ # Look for CSV files in the directory
+ import glob
+ csv_files = glob.glob(os.path.join(data_dir, "*.csv"))
+
+ for csv_file in csv_files:
+ source_name = self.data_manager.load_csv(csv_file)
+ if source_name:
+ print(f"Loaded data from: {csv_file}")
+
+ # Update data source selector
+ self.update_data_sources()
+
+ # Select the first data source if available
+ if self.data_source_selector.count() > 0:
+ self.data_source_selector.setCurrentIndex(0)
+
+ print(f"Loaded data from environment variable directory: {data_dir}")
+ except Exception as e:
+ print(f"Error loading data from environment: {e}")
+
+def launch_dashboard():
+ """Launch the AlgoSystem Dashboard application."""
+ import sys
+
+ class DashboardApp(QMainWindow):
+ def __init__(self):
+ super().__init__()
+ # Set window properties
+ self.setWindowTitle("AlgoSystem Dashboard")
+ self.resize(1200, 800)
+
+ # Initialize core components
+ self.plot_registry = PlotRegistry() # Registry of available chart types
+ self.data_manager = DataManager() # Handles loading and preprocessing data
+
+ # Set up the main layout
+ self.central_widget = QWidget()
+ self.setCentralWidget(self.central_widget)
+ self.main_layout = QVBoxLayout(self.central_widget)
+
+ # Create toolbar with buttons and data source selector
+ toolbar_layout = QHBoxLayout()
+
+ # Add Load Data button
+ self.load_data_btn = QPushButton("Load Data")
+ self.load_data_btn.clicked.connect(self.load_data)
+ toolbar_layout.addWidget(self.load_data_btn)
+
+ # Add data source selector dropdown
+ toolbar_layout.addWidget(QLabel("Data Source:"))
+ self.data_source_selector = QComboBox()
+ self.data_source_selector.currentTextChanged.connect(self.on_data_source_changed)
+ toolbar_layout.addWidget(self.data_source_selector)
+
+ # Add Refresh Charts button
+ self.refresh_btn = QPushButton("Refresh Charts")
+ self.refresh_btn.clicked.connect(self.refresh_all_charts)
+ toolbar_layout.addWidget(self.refresh_btn)
+
+ toolbar_layout.addStretch() # Push remaining buttons to the right
+
+ # Add Save/Load Configuration buttons
+ self.save_config_btn = QPushButton("Save Configuration")
+ self.save_config_btn.clicked.connect(self.save_configuration)
+ toolbar_layout.addWidget(self.save_config_btn)
+
+ self.load_config_btn = QPushButton("Load Configuration")
+ self.load_config_btn.clicked.connect(self.load_configuration)
+ toolbar_layout.addWidget(self.load_config_btn)
+
+ self.main_layout.addLayout(toolbar_layout)
+
+ # Create split view with plot palette on left and dashboard area on right
+ self.splitter = QSplitter(Qt.Orientation.Horizontal)
+
+ # Add plot palette (left side)
+ self.plot_palette = PlotPalette(plot_registry=self.plot_registry)
+ self.splitter.addWidget(self.plot_palette)
+
+ # Add dashboard area (right side)
+ self.dashboard_area = DashboardArea(
+ data_manager=self.data_manager,
+ plot_registry=self.plot_registry
+ )
+ self.splitter.addWidget(self.dashboard_area)
+
+ # Set initial sizes for the splitter (palette vs. dashboard)
+ self.splitter.setSizes([300, 900])
+
+ self.main_layout.addWidget(self.splitter)
+
+ # Load configuration from environment variable if available
+ self.load_config_from_env()
+
+ # Load data from directory if available
+ self.load_data_from_env()
+
+ # ADDING MISSING METHODS
+ def load_data(self):
+ """Load data from a file and add it to the data manager."""
+ # Open file dialog to select data file
+ file_path, _ = QFileDialog.getOpenFileName(
+ self,
+ "Load Data File",
+ "",
+ "CSV Files (*.csv);;All Files (*)"
+ )
+
+ if file_path:
+ try:
+ # Load the data into the data manager
+ source_name = self.data_manager.load_csv(file_path)
+
+ if source_name:
+ # Update data source selector
+ self.update_data_sources()
+
+ # Select the newly loaded data source
+ index = self.data_source_selector.findText(source_name)
+ if index >= 0:
+ self.data_source_selector.setCurrentIndex(index)
+
+ QMessageBox.information(
+ self,
+ "Data Loaded",
+ f"Successfully loaded data from {os.path.basename(file_path)}"
+ )
+ else:
+ QMessageBox.warning(
+ self,
+ "Load Error",
+ "Failed to load data from the selected file."
+ )
+ except Exception as e:
+ QMessageBox.critical(
+ self,
+ "Error",
+ f"An error occurred while loading the data: {str(e)}"
+ )
+
+ def update_data_sources(self):
+ """Update the data source selector with available data sources."""
+ # Get list of data sources
+ sources = self.data_manager.get_data_source_names()
+
+ # Save current selection
+ current_text = self.data_source_selector.currentText()
+
+ # Clear and repopulate
+ self.data_source_selector.clear()
+ self.data_source_selector.addItems(sources)
+
+ # Restore selection if possible
+ if current_text:
+ index = self.data_source_selector.findText(current_text)
+ if index >= 0:
+ self.data_source_selector.setCurrentIndex(index)
+ elif self.data_source_selector.count() > 0:
+ # Otherwise select the first item
+ self.data_source_selector.setCurrentIndex(0)
+
+ def on_data_source_changed(self, source_name):
+ """Handle changes to the selected data source."""
+ if source_name:
+ # Set the active data source in the dashboard area
+ self.dashboard_area.set_active_data_source(source_name)
+
+ def refresh_all_charts(self):
+ """Refresh all charts with current data."""
+ current_source = self.data_source_selector.currentText()
+ if current_source:
+ self.dashboard_area.set_active_data_source(current_source)
+ QMessageBox.information(
+ self,
+ "Refresh Complete",
+ "All charts have been refreshed with the current data."
+ )
+ else:
+ QMessageBox.warning(
+ self,
+ "No Data Selected",
+ "Please select a data source to refresh charts."
+ )
+
+ def save_configuration(self):
+ """Save the current dashboard configuration."""
+ file_path, _ = QFileDialog.getSaveFileName(
+ self,
+ "Save Dashboard Configuration",
+ "",
+ "JSON Files (*.json);;All Files (*)"
+ )
+
+ if file_path:
+ try:
+ # Get configuration from dashboard area
+ dashboard_config = self.dashboard_area.get_dashboard_config()
+
+ # Save configuration to file
+ with open(file_path, 'w') as f:
+ import json
+ json.dump(dashboard_config, f, indent=4)
+
+ QMessageBox.information(
+ self,
+ "Save Complete",
+ f"Dashboard configuration saved to {os.path.basename(file_path)}"
+ )
+ except Exception as e:
+ QMessageBox.critical(
+ self,
+ "Error",
+ f"An error occurred while saving the configuration: {str(e)}"
+ )
+
+ def load_configuration(self):
+ """Load a dashboard configuration from a file."""
+ file_path, _ = QFileDialog.getOpenFileName(
+ self,
+ "Load Dashboard Configuration",
+ "",
+ "JSON Files (*.json);;All Files (*)"
+ )
+
+ if file_path:
+ try:
+ # Load configuration from file
+ with open(file_path, 'r') as f:
+ import json
+ dashboard_config = json.load(f)
+
+ # Apply configuration to dashboard area
+ self.dashboard_area.load_dashboard_config(dashboard_config)
+
+ # Update active data source if specified
+ if 'active_data_source' in dashboard_config and dashboard_config['active_data_source']:
+ source_name = dashboard_config['active_data_source']
+ index = self.data_source_selector.findText(source_name)
+ if index >= 0:
+ self.data_source_selector.setCurrentIndex(index)
+
+ QMessageBox.information(
+ self,
+ "Load Complete",
+ f"Dashboard configuration loaded from {os.path.basename(file_path)}"
+ )
+ except Exception as e:
+ QMessageBox.critical(
+ self,
+ "Error",
+ f"An error occurred while loading the configuration: {str(e)}"
+ )
+
+ def load_config_from_env(self):
+ """Load configuration from environment variable."""
+ config_path = os.environ.get('ALGO_DASHBOARD_CONFIG')
+ if config_path and os.path.exists(config_path):
+ try:
+ # Load configuration from file
+ with open(config_path, 'r') as f:
+ import json
+ dashboard_config = json.load(f)
+
+ # Apply configuration to dashboard area
+ self.dashboard_area.load_dashboard_config(dashboard_config)
+
+ print(f"Loaded configuration from environment variable: {config_path}")
+ except Exception as e:
+ print(f"Error loading configuration from environment: {e}")
+
+ def load_data_from_env(self):
+ """Load data from directory specified in environment variable."""
+ data_dir = os.environ.get('ALGO_DASHBOARD_DATA_DIR')
+ if data_dir and os.path.exists(data_dir):
+ try:
+ # Look for CSV files in the directory
+ import glob
+ csv_files = glob.glob(os.path.join(data_dir, "*.csv"))
+
+ for csv_file in csv_files:
+ source_name = self.data_manager.load_csv(csv_file)
+ if source_name:
+ print(f"Loaded data from: {csv_file}")
+
+ # Update data source selector
+ self.update_data_sources()
+
+ # Select the first data source if available
+ if self.data_source_selector.count() > 0:
+ self.data_source_selector.setCurrentIndex(0)
+
+ print(f"Loaded data from environment variable directory: {data_dir}")
+ except Exception as e:
+ print(f"Error loading data from environment: {e}")
+
+ # Create and run the application
+ app = QApplication(sys.argv)
+ dashboard = DashboardApp()
+ dashboard.show()
+ sys.exit(app.exec())
+
+
diff --git a/algosystem/dashboard/plot_registery.py b/algosystem/dashboard/plot_registery.py
new file mode 100644
index 0000000..4d08cfb
--- /dev/null
+++ b/algosystem/dashboard/plot_registery.py
@@ -0,0 +1,422 @@
+import pandas as pd
+import numpy as np
+import matplotlib.pyplot as plt
+from matplotlib.figure import Figure
+
+# Import visualization functions
+from algosystem.backtesting.visualization import (
+ create_equity_chart,
+ create_drawdown_chart,
+ create_monthly_returns_heatmap,
+ create_rolling_sharpe_chart
+)
+
+# Import performance functions
+from algosystem.analysis.performance import (
+ calculate_returns_stats,
+ calculate_rolling_stats,
+ compare_strategies,
+ analyze_returns_by_period
+)
+
+# Import portfolio functions
+from algosystem.analysis.portfolio import (
+ calculate_portfolio_return,
+ calculate_portfolio_variance,
+ calculate_portfolio_std,
+ calculate_sharpe_ratio,
+ optimize_portfolio,
+ calculate_efficient_frontier
+)
+
+# Import risk functions
+from algosystem.analysis.risk import (
+ calculate_var,
+ calculate_cvar,
+ calculate_risk_metrics,
+ stress_test
+)
+
+class PlotRegistry:
+ """Registry of available plot types and their associated functions"""
+
+ def __init__(self):
+ self.plot_types = {}
+ self.register_default_plots()
+
+ def register_plot(self, name, function, description, required_data, parameters=None):
+ """Register a new plot type"""
+ self.plot_types[name] = {
+ 'function': function,
+ 'description': description,
+ 'required_data': required_data,
+ 'parameters': parameters or {}
+ }
+
+ def register_default_plots(self):
+ """Register the default plot types that come with AlgoSystem"""
+
+ # Performance plots
+ self.register_plot(
+ name="Equity Curve",
+ function=create_equity_chart,
+ description="Shows the growth of portfolio value over time",
+ required_data=["equity"],
+ parameters={
+ 'benchmark': {'type': 'data', 'required': False, 'default': None},
+ 'figsize': {'type': 'tuple', 'required': False, 'default': (10, 6)}
+ }
+ )
+
+ self.register_plot(
+ name="Drawdown Chart",
+ function=create_drawdown_chart,
+ description="Shows the drawdown periods for the strategy",
+ required_data=["equity"],
+ parameters={
+ 'figsize': {'type': 'tuple', 'required': False, 'default': (10, 6)}
+ }
+ )
+
+ self.register_plot(
+ name="Monthly Returns Heatmap",
+ function=create_monthly_returns_heatmap,
+ description="Displays monthly returns as a heatmap",
+ required_data=["equity"],
+ parameters={
+ 'figsize': {'type': 'tuple', 'required': False, 'default': (10, 6)}
+ }
+ )
+
+ self.register_plot(
+ name="Rolling Sharpe Ratio",
+ function=create_rolling_sharpe_chart,
+ description="Shows the rolling Sharpe ratio over time",
+ required_data=["equity"],
+ parameters={
+ 'window': {'type': 'int', 'required': False, 'default': 252},
+ 'figsize': {'type': 'tuple', 'required': False, 'default': (10, 6)}
+ }
+ )
+
+ # Risk analysis plots - using functions from risk.py
+ self.register_plot(
+ name="Value at Risk (VaR)",
+ function=self._create_var_plot,
+ description="Shows the Value at Risk at different confidence levels",
+ required_data=["returns"],
+ parameters={
+ 'confidence_levels': {'type': 'list', 'required': False, 'default': [0.9, 0.95, 0.99]},
+ 'method': {'type': 'choice', 'required': False, 'default': 'historical',
+ 'choices': ['historical', 'parametric', 'monte_carlo']}
+ }
+ )
+
+ # Portfolio optimization plots - using functions from portfolio.py
+ self.register_plot(
+ name="Efficient Frontier",
+ function=self._create_efficient_frontier_plot,
+ description="Shows the efficient frontier for a portfolio of assets",
+ required_data=["returns_matrix"],
+ parameters={
+ 'num_points': {'type': 'int', 'required': False, 'default': 50},
+ 'risk_free_rate': {'type': 'float', 'required': False, 'default': 0.0}
+ }
+ )
+
+ # Add more plot types from performance.py
+ self.register_plot(
+ name="Returns by Period",
+ function=self._create_returns_by_period_plot,
+ description="Shows returns broken down by different time periods",
+ required_data=["returns"],
+ parameters={}
+ )
+
+ self.register_plot(
+ name="Rolling Performance",
+ function=self._create_rolling_performance_plot,
+ description="Shows rolling performance metrics over time",
+ required_data=["returns"],
+ parameters={
+ 'window': {'type': 'int', 'required': False, 'default': 252}
+ }
+ )
+
+ # Add more plot types from risk.py
+ self.register_plot(
+ name="Return Distribution",
+ function=self._create_return_distribution_plot,
+ description="Histogram of returns with normal distribution overlay",
+ required_data=["returns"],
+ parameters={
+ 'bins': {'type': 'int', 'required': False, 'default': 50}
+ }
+ )
+
+ self.register_plot(
+ name="Risk Metrics",
+ function=self._create_risk_metrics_plot,
+ description="Visual summary of key risk metrics",
+ required_data=["returns"],
+ parameters={
+ 'risk_free_rate': {'type': 'float', 'required': False, 'default': 0.0}
+ }
+ )
+
+ def _create_var_plot(self, returns, confidence_levels=[0.9, 0.95, 0.99], method='historical'):
+ """Create VaR plot using calculate_var from risk.py"""
+ fig = plt.figure(figsize=(10, 6))
+ ax = fig.add_subplot(111)
+
+ # Calculate VaR at different confidence levels using risk.py function
+ var_values = [calculate_var(returns, cl, method) for cl in confidence_levels]
+
+ # Plot returns histogram
+ returns.hist(bins=50, ax=ax, alpha=0.5)
+
+ # Add VaR lines
+ colors = ['green', 'orange', 'red']
+ for i, (cl, var) in enumerate(zip(confidence_levels, var_values)):
+ ax.axvline(-var, color=colors[i], linestyle='--',
+ label=f'VaR {cl*100:.0f}%: {var:.2%}')
+
+ ax.set_title(f'Value at Risk ({method.capitalize()})')
+ ax.set_xlabel('Returns')
+ ax.set_ylabel('Frequency')
+ ax.legend()
+
+ return fig
+
+ def _create_efficient_frontier_plot(self, returns_matrix, num_points=50, risk_free_rate=0.0):
+ """Create efficient frontier plot using functions from portfolio.py"""
+ fig = plt.figure(figsize=(10, 6))
+ ax = fig.add_subplot(111)
+
+ # Calculate the efficient frontier using portfolio.py function
+ frontier_returns, frontier_volatilities, frontier_weights = calculate_efficient_frontier(
+ returns_matrix, num_points, risk_free_rate
+ )
+
+ # Plot the efficient frontier
+ ax.plot(frontier_volatilities, frontier_returns, 'b-', linewidth=3, label='Efficient Frontier')
+
+ # Calculate and plot the optimal portfolio (maximum Sharpe ratio)
+ optimal_weights, performance = optimize_portfolio(returns_matrix, risk_free_rate)
+ optimal_return = performance['expected_return']
+ optimal_volatility = performance['volatility']
+
+ ax.scatter(optimal_volatility, optimal_return, marker='*', s=200, color='red',
+ label=f'Optimal Portfolio (Sharpe: {performance["sharpe_ratio"]:.2f})')
+
+ # Add capital market line if risk-free rate is provided
+ if risk_free_rate > 0:
+ max_vol = frontier_volatilities[-1] * 1.2
+ x_values = np.linspace(0, max_vol, 100)
+ slope = (optimal_return - risk_free_rate) / optimal_volatility
+ y_values = risk_free_rate + slope * x_values
+ ax.plot(x_values, y_values, 'g--', label='Capital Market Line')
+ ax.scatter(0, risk_free_rate, marker='o', color='green', label='Risk-Free Asset')
+
+ ax.set_title('Efficient Frontier')
+ ax.set_xlabel('Volatility (Standard Deviation)')
+ ax.set_ylabel('Expected Return')
+ ax.legend()
+ ax.grid(True)
+
+ return fig
+
+ def _create_return_distribution_plot(self, returns, bins=50):
+ """Create histogram of returns with normal distribution overlay"""
+ fig = plt.figure(figsize=(10, 6))
+ ax = fig.add_subplot(111)
+
+ # Plot histogram
+ n, bins, patches = ax.hist(returns, bins=bins, density=True, alpha=0.6, color='blue')
+
+ # Fit normal distribution
+ mu = returns.mean()
+ sigma = returns.std()
+ x = np.linspace(mu - 4*sigma, mu + 4*sigma, 100)
+ y = (1 / (sigma * np.sqrt(2 * np.pi))) * np.exp(- (x - mu)**2 / (2 * sigma**2))
+
+ # Plot normal distribution
+ ax.plot(x, y, 'r--', linewidth=2, label='Normal Distribution')
+
+ # Add mean line
+ ax.axvline(mu, color='green', linestyle='-', linewidth=2,
+ label=f'Mean: {mu:.2%}')
+
+ # Calculate and display skewness and kurtosis
+ skew = returns.skew()
+ kurt = returns.kurtosis()
+ stats_text = f'Skewness: {skew:.2f}\nKurtosis: {kurt:.2f}'
+ ax.text(0.95, 0.95, stats_text, transform=ax.transAxes, verticalalignment='top',
+ horizontalalignment='right', bbox={'facecolor': 'white', 'alpha': 0.8})
+
+ ax.set_title('Return Distribution')
+ ax.set_xlabel('Returns')
+ ax.set_ylabel('Density')
+ ax.legend()
+ ax.grid(True, alpha=0.3)
+
+ return fig
+
+ def _create_risk_metrics_plot(self, returns, risk_free_rate=0.0):
+ """Create visual summary of risk metrics using calculate_risk_metrics from risk.py"""
+ # Calculate risk metrics
+ metrics = calculate_risk_metrics(returns, risk_free_rate)
+
+ fig = plt.figure(figsize=(10, 6))
+ ax = fig.add_subplot(111)
+
+ # Create bar chart of key metrics
+ metric_names = ['annual_return', 'volatility', 'sharpe_ratio', 'sortino_ratio', 'max_drawdown']
+ metric_labels = ['Annual Return', 'Volatility', 'Sharpe Ratio', 'Sortino Ratio', 'Max Drawdown']
+ metric_values = [metrics[name] for name in metric_names]
+
+ # Adjust max_drawdown to positive for visualization
+ metric_values[4] = abs(metric_values[4])
+
+ x = np.arange(len(metric_names))
+ bars = ax.bar(x, metric_values, width=0.6, alpha=0.7)
+
+ # Add value labels on top of bars
+ for bar in bars:
+ height = bar.get_height()
+ ax.annotate(f'{height:.2f}',
+ xy=(bar.get_x() + bar.get_width() / 2, height),
+ xytext=(0, 3), # 3 points vertical offset
+ textcoords="offset points",
+ ha='center', va='bottom')
+
+ ax.set_title('Risk Metrics Summary')
+ ax.set_xticks(x)
+ ax.set_xticklabels(metric_labels, rotation=45)
+ ax.grid(True, alpha=0.3, axis='y')
+
+ return fig
+
+ def _create_returns_by_period_plot(self, returns):
+ """Create returns by period plot using analyze_returns_by_period from performance.py"""
+ # Get period analysis
+ period_analysis = analyze_returns_by_period(returns)
+
+ fig = plt.figure(figsize=(12, 10))
+
+ # Create subplot for monthly returns
+ ax1 = fig.add_subplot(2, 2, 1)
+ monthly_returns = period_analysis['monthly']['returns']
+ monthly_returns.plot(kind='bar', ax=ax1)
+ ax1.set_title('Monthly Returns')
+ ax1.set_ylabel('Return')
+ ax1.grid(True, alpha=0.3)
+
+ # Create subplot for day of week analysis
+ ax2 = fig.add_subplot(2, 2, 2)
+ dow_analysis = period_analysis['day_of_week']
+ dow_analysis['mean'].plot(kind='bar', ax=ax2)
+ ax2.set_title('Average Return by Day of Week')
+ ax2.set_ylabel('Return')
+ ax2.grid(True, alpha=0.3)
+
+ # Create subplot for month of year analysis
+ ax3 = fig.add_subplot(2, 2, 3)
+ moy_analysis = period_analysis['month_of_year']
+ moy_analysis['mean'].plot(kind='bar', ax=ax3)
+ ax3.set_title('Average Return by Month')
+ ax3.set_ylabel('Return')
+ ax3.grid(True, alpha=0.3)
+
+ # Create subplot for positive percentage by period
+ ax4 = fig.add_subplot(2, 2, 4)
+ periods = ['daily', 'monthly', 'quarterly', 'annual']
+ period_labels = ['Daily', 'Monthly', 'Quarterly', 'Annual']
+ positive_pcts = [period_analysis[p]['positive_pct'] for p in periods]
+
+ ax4.bar(period_labels, positive_pcts)
+ ax4.set_title('Percentage of Positive Returns by Period')
+ ax4.set_ylabel('Percentage')
+ ax4.set_ylim([0, 1])
+ ax4.grid(True, alpha=0.3)
+
+ plt.tight_layout()
+ return fig
+
+ def _create_rolling_performance_plot(self, returns, window=252):
+ """Create rolling performance plot using calculate_rolling_stats from performance.py"""
+ # Calculate rolling statistics
+ rolling_stats = calculate_rolling_stats(returns, window)
+
+ fig = plt.figure(figsize=(12, 10))
+
+ # Create subplot for rolling return
+ ax1 = fig.add_subplot(2, 2, 1)
+ rolling_stats['rolling_return'].plot(ax=ax1)
+ ax1.set_title(f'Rolling {window}-Day Return (Annualized)')
+ ax1.set_ylabel('Return')
+ ax1.grid(True, alpha=0.3)
+
+ # Create subplot for rolling volatility
+ ax2 = fig.add_subplot(2, 2, 2)
+ rolling_stats['rolling_volatility'].plot(ax=ax2)
+ ax2.set_title(f'Rolling {window}-Day Volatility (Annualized)')
+ ax2.set_ylabel('Volatility')
+ ax2.grid(True, alpha=0.3)
+
+ # Create subplot for rolling Sharpe ratio
+ ax3 = fig.add_subplot(2, 2, 3)
+ rolling_stats['rolling_sharpe'].plot(ax=ax3)
+ ax3.set_title(f'Rolling {window}-Day Sharpe Ratio')
+ ax3.set_ylabel('Sharpe Ratio')
+ ax3.grid(True, alpha=0.3)
+
+ # Create subplot for rolling max drawdown
+ ax4 = fig.add_subplot(2, 2, 4)
+ rolling_stats['rolling_max_drawdown'].plot(ax=ax4)
+ ax4.set_title(f'Rolling {window}-Day Max Drawdown')
+ ax4.set_ylabel('Drawdown')
+ ax4.grid(True, alpha=0.3)
+
+ plt.tight_layout()
+ return fig
+
+ def get_plot_types(self):
+ """Get list of available plot types"""
+ return list(self.plot_types.keys())
+
+ def get_plot_info(self, name):
+ """Get information about a specific plot type"""
+ return self.plot_types.get(name)
+
+ def create_plot(self, plot_type, data, **kwargs):
+ """Create a plot of the specified type using the provided data"""
+ if plot_type not in self.plot_types:
+ raise ValueError(f"Unknown plot type: {plot_type}")
+
+ plot_info = self.plot_types[plot_type]
+ plot_func = plot_info['function']
+
+ # Check if we have the required data
+ required_data = plot_info['required_data']
+ for req in required_data:
+ if req not in data:
+ raise ValueError(f"Missing required data for {plot_type}: {req}")
+
+ # Extract required data from data dictionary
+ plot_data = {req: data[req] for req in required_data if req in data}
+
+ # Merge kwargs with default parameters
+ parameters = plot_info['parameters']
+ for param_name, param_info in parameters.items():
+ if param_name not in kwargs and 'default' in param_info:
+ kwargs[param_name] = param_info['default']
+
+ # Create the plot
+ return plot_func(**plot_data, **kwargs)
+
+
+# Utility function to create a plot registry with default plots
+def create_plot_registry():
+ """Create and return a plot registry with default plots"""
+ return PlotRegistry()
\ No newline at end of file
diff --git a/pyproject.toml b/pyproject.toml
index 04f3922..90175d1 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -15,7 +15,6 @@ classifiers = [
"Programming Language :: Python :: 3.10"
]
-# (Optional) Explicitly include your package if needed.
packages = [
{ include = "algosystem" }
]
@@ -43,10 +42,44 @@ rich = "^14.0.0"
[tool.poetry.scripts]
algosystem = "algosystem.cli.commands:cli"
+algodash = "algosystem.dashboard.dashboard_cli:cli"
[tool.poetry.group.dev.dependencies]
pytest = "^8.3.5"
+pylint = "^3.1.0"
+black = "^24.4.0"
+isort = "^5.13.2"
+mypy = "^1.8.0"
+pytest-cov = "^5.0.0"
+
+[tool.poetry.group.docs]
+optional = true
+
+[tool.poetry.group.docs.dependencies]
+sphinx = "^7.3.7"
+sphinx-rtd-theme = "^2.0.0"
+sphinx-copybutton = "^0.5.2"
+myst-parser = "^3.0.0"
[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"
+
+[tool.black]
+line-length = 100
+target-version = ["py311"]
+
+[tool.isort]
+profile = "black"
+line_length = 100
+
+[tool.mypy]
+python_version = "3.11"
+warn_return_any = true
+warn_unused_configs = true
+disallow_untyped_defs = false
+disallow_incomplete_defs = false
+
+[tool.pytest.ini_options]
+testpaths = ["tests"]
+python_files = "test_*.py"
\ No newline at end of file
From 433c4e54646047f4eae60571f6c4494da4b2e22f Mon Sep 17 00:00:00 2001
From: BonelessWater
Date: Sat, 3 May 2025 22:24:46 -0400
Subject: [PATCH 04/54] metrics calculation successful
---
algosystem/api.py | 25 +-
algosystem/backtesting/engine.py | 39 +-
algosystem/backtesting/metrics.py | 209 +-
algosystem/cli/commands.py | 6 +-
algosystem/dashboard/chart_handlers.py | 0
algosystem/static/images/logo_transparent.png | Bin 0 -> 2634 bytes
benchmark.csv | 2000 ++++++++---------
poetry.lock | 732 +++++-
strategy.csv | 2000 ++++++++---------
test.py | 53 +-
10 files changed, 2924 insertions(+), 2140 deletions(-)
create mode 100644 algosystem/dashboard/chart_handlers.py
create mode 100644 algosystem/static/images/logo_transparent.png
diff --git a/algosystem/api.py b/algosystem/api.py
index 1e48da8..0f841c5 100644
--- a/algosystem/api.py
+++ b/algosystem/api.py
@@ -1,13 +1,13 @@
from backtesting import Engine
from data.connectors import database
-from reporting import export
+#from reporting import export
import pandas as pd
# Create a class-based API
class AlgoSystem:
@staticmethod
def run_backtest(data, strategy, start_date=None, end_date=None,
- initial_capital=100000.0, commission=0.001, **kwargs):
+ initial_capital=100000.0, **kwargs):
"""Run a backtest programmatically"""
engine = Engine(
strategy=strategy,
@@ -15,7 +15,6 @@ def run_backtest(data, strategy, start_date=None, end_date=None,
start_date=start_date,
end_date=end_date,
initial_capital=initial_capital,
- commission=commission
)
return engine.run()
@@ -55,26 +54,6 @@ def list_backtests(strategy_type=None):
"""List backtests from database"""
return database.list_from_db(strategy_type)
- @staticmethod
- def generate_report(results, output_path, format='pdf'):
- """Generate a backtest report"""
- report_generator = export.ReportGenerator(results)
-
- if format == 'pdf':
- report_generator.to_pdf(output_path)
- elif format == 'html':
- report_generator.to_html(output_path)
- elif format == 'md':
- report_generator.to_markdown(output_path)
-
- return output_path
-
- @staticmethod
- def analyze_results(results):
- """Calculate and return advanced metrics"""
- from backtesting.metrics import calculate_advanced_metrics
- return calculate_advanced_metrics(results)
-
@staticmethod
def visualize_results(results, output=None):
"""Create an interactive visualization"""
diff --git a/algosystem/backtesting/engine.py b/algosystem/backtesting/engine.py
index b41286b..3308484 100644
--- a/algosystem/backtesting/engine.py
+++ b/algosystem/backtesting/engine.py
@@ -17,8 +17,8 @@
class Engine:
"""Backtesting engine that uses a price series (e.g. portfolio value) as input."""
- def __init__(self, data, start_date=None, end_date=None,
- initial_capital=None, commission=0.001, price_column=None):
+ def __init__(self, data, benchmark, start_date=None, end_date=None,
+ initial_capital=None, price_column=None):
"""
Initialize the backtesting engine using a price series.
@@ -33,8 +33,6 @@ def __init__(self, data, start_date=None, end_date=None,
End date for the backtest (YYYY-MM-DD). Defaults to the last date in data.
initial_capital : float, optional
Initial capital. If not provided, inferred as the first value of the price series.
- commission : float, default 0.001
- (Not used in the current logic, but kept for backward compatibility.)
price_column : str, optional
If data is a DataFrame with multiple columns, specify the column name representing
portfolio value.
@@ -53,6 +51,9 @@ def __init__(self, data, start_date=None, end_date=None,
else:
raise TypeError("data must be a pandas DataFrame or Series")
+
+ self.benchmark_series = benchmark.copy() if benchmark is not None else None
+
# Set date range based on provided dates or available index
self.start_date = pd.to_datetime(start_date) if start_date else self.price_series.index[0]
self.end_date = pd.to_datetime(end_date) if end_date else self.price_series.index[-1]
@@ -64,12 +65,10 @@ def __init__(self, data, start_date=None, end_date=None,
# Use the provided initial_capital or infer it from the first value
self.initial_capital = initial_capital if initial_capital is not None else self.price_series.iloc[0]
- self.commission = commission # Not used in this simplified logic
self.results = None
-
- # This variable is used to store already-computed data to reduce redundancy
- self.data_series = {}
+ self.metrics = None
+ self.plots = None
logger.info(f"Initialized backtest from {self.start_date.date()} to {self.end_date.date()}")
@@ -91,6 +90,13 @@ def run(self):
# Normalize the price series relative to its first value and scale by initial capital.
equity_series = self.initial_capital * (self.price_series / self.price_series.iloc[0])
+
+ logger.info("Calculating performance metrics")
+ self.metrics = metrics.calculate_metrics(equity_series, self.benchmark_series)
+
+ logger.info("Generating performance plots")
+ # Fix: Pass benchmark_series instead of initial_capital
+ self.plots = metrics.calculate_time_series_data(equity_series, self.benchmark_series)
self.results = {
'equity': equity_series,
@@ -101,7 +107,9 @@ def run(self):
'returns': (equity_series.iloc[-1] - self.initial_capital) / self.initial_capital,
'data': self.price_series,
'start_date': self.start_date,
- 'end_date': self.end_date
+ 'end_date': self.end_date,
+ 'metrics': self.metrics,
+ 'plots': self.plots,
}
logger.info(f"Backtest completed. Final return: {self.results['returns']:.2%}")
@@ -110,19 +118,14 @@ def run(self):
def get_results(self):
return self.results
- def get_metrics(self, advanced_metrics=True, drawdown_analysis=False):
- """
- Calculate and return performance metrics.
- """
- output = metrics.quant_stats(self.results['equity'])
-
- return output
+ def get_metrics(self):
+ return self.metrics
- def print_metrics(self, advanced_metrics=True, drawdown_analysis=False):
+ def print_metrics(self):
"""
Print performance metrics to console.
"""
- metrics = self.get_metrics(advanced_metrics, drawdown_analysis)
+ metrics = self.get_metrics()
logger.info("Performance Metrics:")
for key, value in metrics.items():
logger.info(f"{key}: {value}")
diff --git a/algosystem/backtesting/metrics.py b/algosystem/backtesting/metrics.py
index 805f8c3..7a207fb 100644
--- a/algosystem/backtesting/metrics.py
+++ b/algosystem/backtesting/metrics.py
@@ -2,7 +2,6 @@
import pandas as pd
import numpy as np
-# Time series
def rolling_sharpe(returns, window=30):
return qs.stats.rolling_sharpe(returns, window)
@@ -12,33 +11,15 @@ def rolling_sortino(returns, window=30):
def rolling_volatility(returns, window=30):
return returns.rolling(window).std() * np.sqrt(252) # Annualized
-def rolling_max_drawdown(returns, window=30):
- return qs.stats.rolling_max_drawdown(returns, window)
-
def calmar(returns):
return qs.stats.calmar(returns)
-def rolling_information_ratio(returns, benchmark, window=30):
- return qs.stats.rolling_information_ratio(returns, benchmark, window)
-
-def rolling_beta(returns, benchmark, window=30):
- return qs.stats.rolling_beta(returns, benchmark, window)
-
def rolling_skew(returns, window=30):
return returns.rolling(window).skew()
-def rolling_kurtosis(returns, window=30):
- return returns.rolling(window).kurtosis()
-
def rolling_var(returns, window=30, q=0.05):
return returns.rolling(window).quantile(q)
-def rolling_cvar(returns, window=30, q=0.05):
- # conditional (expected shortfall) below the q‑quantile
- return returns.rolling(window).apply(
- lambda x: x[x <= x.quantile(q)].mean(), raw=True
- )
-
def rolling_drawdown_duration(returns: pd.Series, window: int = 30) -> pd.Series:
"""
Computes the rolling maximum drawdown duration over a given window.
@@ -82,7 +63,6 @@ def rolling_turnover(positions, window=30):
daily_chg = positions.diff().abs()
return daily_chg.rolling(window).sum()
-# 7. Equity curve & drawdown series (static, but very informative)
def equity_curve(returns):
return (1 + returns).cumprod()
@@ -91,59 +71,160 @@ def drawdown_series(returns):
high = ec.cummax()
return (ec / high) - 1
-def quant_stats(strategy, benchmark):
- """Utilizes the quantstats library and other processing to return the results dictionary
-
+def calculate_time_series_data(strategy, benchmark=None, window=30):
+ """
+ Calculate time series data for a strategy and optional benchmark.
+ Returns only data that changes over time (rolling metrics).
+
Parameters
----------
- strategy_name : str
- The name of the over-arching strategy behind the positions obtained from the system
strategy : pd.Series
- The positions of the strategy
- benchmark_name : str
- The name of the benchmark used to find performance metrics
- benchmark : pd.Series
- The positions of the benchmark
+ Daily prices or returns of the strategy, indexed by date
+ benchmark : pd.Series, optional
+ Daily prices or returns of the benchmark, indexed by date
+ window : int, default=30
+ Rolling window size for metrics calculation
-
Returns
-------
dict
- The processed data
+ Dictionary containing all calculated time series data
"""
- strategy = strategy.pct_change().dropna()
- benchmark = benchmark.pct_change().dropna()
-
- # Calculate distributions with serialized dates
- functions_list = [
- "adjusted_sortino", "avg_loss", "avg_return", "avg_win", "best", "cagr", "calmar",
- "common_sense_ratio", "comp", "conditional_value_at_risk", "consecutive_losses",
- "consecutive_wins", "cpc_index", "cvar", "expected_return",
- "expected_shortfall", "exposure", "gain_to_pain_ratio", "geometric_mean", "ghpr", "greeks",
- "information_ratio", "kelly_criterion", "kurtosis", "max_drawdown", "omega",
- "outlier_loss_ratio", "outlier_win_ratio", "payoff_ratio",
- "probabilistic_adjusted_sortino_ratio", "probabilistic_ratio", "probabilistic_sharpe_ratio",
- "risk_of_ruin", "risk_return_ratio", "ror", "serenity_index", "sharpe", "skew", "smart_sharpe",
- "smart_sortino", "sortino", "tail_ratio", "ulcer_index", "ulcer_performance_index", "upi",
- "value_at_risk", "var", "volatility", "win_loss_ratio", "win_rate", "worst",
- ]
+ # Convert to returns if prices are provided
+ if not (abs(strategy.pct_change().dropna()) < 0.5).all():
+ strategy_returns = strategy
+ else:
+ strategy_returns = strategy.pct_change().dropna()
+
+ # Handle benchmark if provided
+ benchmark_returns = None
+ if benchmark is not None:
+ if not (abs(benchmark.pct_change().dropna()) < 0.5).all():
+ benchmark_returns = benchmark
+ else:
+ benchmark_returns = benchmark.pct_change().dropna()
+
+ # Align data
+ strategy_returns, benchmark_returns = strategy_returns.align(benchmark_returns, join='inner')
+
+ # Initialize results dictionary
+ time_series = {}
+
+ # Calculate equity curves
+ time_series['equity_curve'] = equity_curve(strategy_returns)
+ time_series['drawdown_series'] = drawdown_series(strategy_returns)
+
+ # Calculate rolling metrics
+ time_series['rolling_sharpe'] = rolling_sharpe(strategy_returns, window)
+ time_series['rolling_sortino'] = rolling_sortino(strategy_returns, window)
+ time_series['rolling_volatility'] = rolling_volatility(strategy_returns, window)
+ time_series['rolling_skew'] = rolling_skew(strategy_returns, window)
+ time_series['rolling_var'] = rolling_var(strategy_returns, window)
+ time_series['rolling_drawdown_duration'] = rolling_drawdown_duration(strategy_returns, window)
+
+ # Calculate benchmark-dependent time series if benchmark is provided
+ if benchmark_returns is not None:
+ time_series['benchmark_equity_curve'] = equity_curve(benchmark_returns)
+ time_series['benchmark_drawdown_series'] = drawdown_series(benchmark_returns)
+ time_series['benchmark_rolling_volatility'] = rolling_volatility(benchmark_returns, window)
+
+ # Calculate relative performance
+ time_series['relative_performance'] = time_series['equity_curve'] / time_series['benchmark_equity_curve']
+
+ # Calculate periodic returns (also time series)
+ time_series['daily_returns'] = strategy_returns
+ time_series['monthly_returns'] = strategy_returns.resample('ME').apply(lambda x: (1 + x).prod() - 1)
+ time_series['yearly_returns'] = strategy_returns.resample('YE').apply(lambda x: (1 + x).prod() - 1)
+
+ # Calculate rolling returns for different periods
+ time_series['rolling_3m_returns'] = (1 + strategy_returns).rolling(63).apply(lambda x: x.prod() - 1, raw=True)
+ time_series['rolling_6m_returns'] = (1 + strategy_returns).rolling(126).apply(lambda x: x.prod() - 1, raw=True)
+ time_series['rolling_1y_returns'] = (1 + strategy_returns).rolling(252).apply(lambda x: x.prod() - 1, raw=True)
+
+ return time_series
- results = {}
+def calculate_metrics(strategy, benchmark=None):
+ """
+ Calculate static performance metrics for a strategy and optional benchmark.
+ Returns only point-in-time metrics (not time series data).
+
+ Parameters
+ ----------
+ strategy : pd.Series
+ Daily prices or returns of the strategy, indexed by date
+ benchmark : pd.Series, optional
+ Daily prices or returns of the benchmark, indexed by date
+
+ Returns
+ -------
+ dict
+ Dictionary containing all calculated performance metrics
+ """
+ # Convert to returns if prices are provided
+ if not (abs(strategy.pct_change().dropna()) < 0.5).all():
+ strategy_returns = strategy
+ else:
+ strategy_returns = strategy.pct_change().dropna()
+
+ # Handle benchmark if provided
+ benchmark_returns = None
+ if benchmark is not None:
+ if not (abs(benchmark.pct_change().dropna()) < 0.5).all():
+ benchmark_returns = benchmark
+ else:
+ benchmark_returns = benchmark.pct_change().dropna()
+
+ # Align data
+ strategy_returns, benchmark_returns = strategy_returns.align(benchmark_returns, join='inner')
+
+ metrics = {}
- # Add calculated metrics to the results
- for func_name in functions_list:
+ # Basic return statistics
+ metrics['total_return'] = (strategy_returns + 1).prod() - 1
+ metrics['annualized_return'] = (1 + metrics['total_return']) ** (252 / len(strategy_returns)) - 1
+ metrics['annualized_volatility'] = strategy_returns.std() * np.sqrt(252)
+
+ # Risk metrics
+ try:
+ metrics['max_drawdown'] = qs.stats.max_drawdown(strategy_returns)
+ metrics['var_95'] = qs.stats.value_at_risk(strategy_returns, cutoff=0.05)
+ metrics['cvar_95'] = qs.stats.conditional_value_at_risk(strategy_returns, cutoff=0.05)
+ metrics['skewness'] = strategy_returns.skew()
+ except Exception as e:
+ metrics['risk_metrics_error'] = str(e)
+
+ # Ratios
+ try:
+ metrics['sharpe_ratio'] = qs.stats.sharpe(strategy_returns)
+ metrics['sortino_ratio'] = qs.stats.sortino(strategy_returns)
+ metrics['calmar_ratio'] = qs.stats.calmar(strategy_returns)
+ except Exception as e:
+ metrics['ratio_metrics_error'] = str(e)
+
+ # Trade statistics
+ metrics['positive_days'] = (strategy_returns > 0).sum()
+ metrics['negative_days'] = (strategy_returns < 0).sum()
+ metrics['pct_positive_days'] = (strategy_returns > 0).mean()
+
+ # Monthly statistics
+ monthly_returns = strategy_returns.resample('ME').apply(lambda x: (1 + x).prod() - 1)
+ metrics['best_month'] = monthly_returns.max()
+ metrics['worst_month'] = monthly_returns.min()
+ metrics['avg_monthly_return'] = monthly_returns.mean()
+ metrics['monthly_volatility'] = monthly_returns.std()
+ metrics['pct_positive_months'] = (monthly_returns > 0).mean()
+
+ # Calculate additional benchmark-dependent metrics if benchmark is provided
+ if benchmark_returns is not None:
try:
- func = getattr(qs.stats, func_name)
-
- # Handle functions requiring additional arguments
- if func_name in ["information_ratio", "r_squared"]:
- result = func(strategy, benchmark)
- else:
- result = func(strategy)
-
- results[func_name] = result
-
+ metrics['alpha'] = qs.stats.greeks(strategy_returns, benchmark_returns)['alpha']
+ metrics['beta'] = qs.stats.greeks(strategy_returns, benchmark_returns)['beta']
+ metrics['correlation'] = strategy_returns.corr(benchmark_returns)
+ metrics['tracking_error'] = qs.stats.greeks(strategy_returns, benchmark_returns)['risk']
+ metrics['information_ratio'] = qs.stats.information_ratio(strategy_returns, benchmark_returns)
+ metrics['capture_ratio_up'] = qs.stats.capture(strategy_returns, benchmark_returns, up=True)
+ metrics['capture_ratio_down'] = qs.stats.capture(strategy_returns, benchmark_returns, up=False)
except Exception as e:
- results[func_name] = f"Error in {func_name}: {e}"
-
- return results
+ metrics['benchmark_metrics_error'] = str(e)
+
+ return metrics
\ No newline at end of file
diff --git a/algosystem/cli/commands.py b/algosystem/cli/commands.py
index f7ddf3c..3f28f4d 100644
--- a/algosystem/cli/commands.py
+++ b/algosystem/cli/commands.py
@@ -34,9 +34,7 @@ def launch(config, data_dir):
@cli.command()
@click.argument('input_file', type=click.Path(exists=True))
@click.argument('output_file', type=click.Path())
-@click.option('--config', '-c', type=click.Path(exists=True), required=True,
- help='Path to a dashboard configuration file')
-def render(input_file, output_file, config):
+def render(input_file, output_file,):
"""
Render a dashboard from a configuration file and CSV data.
@@ -49,7 +47,7 @@ def render(input_file, output_file, config):
from algosystem.backtesting.engine import Engine
# Load the dashboard configuration
- with open(config, 'r') as f:
+ with open('algosystem/utils/graph_config.json', 'r') as f:
dashboard_config = json.load(f)
# Load the CSV data
diff --git a/algosystem/dashboard/chart_handlers.py b/algosystem/dashboard/chart_handlers.py
new file mode 100644
index 0000000..e69de29
diff --git a/algosystem/static/images/logo_transparent.png b/algosystem/static/images/logo_transparent.png
new file mode 100644
index 0000000000000000000000000000000000000000..d9b2890215fbb360d06b56677a219489c278be38
GIT binary patch
literal 2634
zcmV-Q3bpl#P)Px<1W80eRA@u(nR#?n)g8yb_bsz$$O6e^vJpa{0W>U85TuG=A+i{;0#yM;6p#P~
zq6k8WNE=!prIlz|6i-Ez$gbd4l5?b?U=@^*uqT8BNHSR_$z*2U%zO9tOu%#4GMSKw
z@f_|yv%LHJ{XX~m`^}wqe~;i-I>@h-8+XC)bms0Vey!s9Sy`(5uU3!IY7H1QcJVGU
zWQg3>8TnZh&w2TQXWEsx0m;-gJwsqzs?X0RB-KfGt&
z@~I^DF{v%#+g$O2*$ER2wz4fD)CL(G>H{KS?AH5f-Hi7?Znxk?Y0qh-s{D*jwP&Xr
z-~4)!qJ#t@WaPx(`Hx@m?{){yK3%6P*uK&htyrLf
z3q(-hmSunls8ci$;szsd@m{XoftRkHx(wg$S#0KPPKJqgVs?G5d;-fhlcKhkHs$ew0FA!
zFG(G>lotQE$mFgUc{ow2C@>5dx`IgVdG$wfR6!a6PSJo1LV%;k({S+5uj-g!8qfXGqKyt!QvY#`n-QYwODiwnIpe}2>tv)h`c+$~|
z(Q5F5H^z?SEk!#+YYPQ6WK=T&in-gt4&j}ja8^sA%UYVNt161pb1pbQP^yp2HTE6;
ze8kkhooxko>+Z)rwOw}V$cOeb|9di+IKVL(msOo$HJD#YSd+WabN%F@?1j3jqNO3U
z8Zu$Hqz!{jADq-TBezvQ(pD+{W6HgHLxbBIWGm%0M1hkNP|O8<5!83o#PHzuGVxG3%e!Hr-3f%g^l65uvGG7ei8$daND#4H0
zO}#e9{yAszwLr(8joA{(Y9{D;84@T;V1!@)q@L!PZ=bm1;4Ej8CU5&Y_RzYs@TU!E
zU_8zXp$+k4CQTwwF5P)8koBz>)>j|eH^t1^Ig!aIqiV1L%xN;D`#RXuyfC
z6Ou=3M$Ij3DSV3+XITq7oz2aD$5>N5Ho#pCN<>^#b%eIxqm#_DHg5I?P`PsKp1L1$
zMul<`c!i-{3`5;af-L#jy)@*EAtL~u08Q}w*Y~ILJ6#*KkV8L!#c0c&;HrK8Dr$s
z+`&q4+4nFAfJ@M$N(^!Y-#ai_J8RP>Ujm;_xo@_vx_C_|=7gZgsF8WlfloPtli%|s
z!ROJUQmI-qF=N$BvyhY#zvj)(RnlsSD(`jHRVt(#`Ay3aRP0e`E*MOdRrNoC}}|E>b_ZdOn)neeu>|zWDPA+`4|+
z^qLWLnfpx+>F&|I;(ounxU_SLFa^WV={(N(lTP@J&y1{6}`iMR(6
z|Db;Pony_xHw(^K8h7%gPZkF{%F+TkI~1zG0wY*_;zyCMeDF+j0lZx=UY_JKp2`;d
zAVDDlsyRP6JI1~qz3M=EbAFoz&rhGwN31B^Z?c^97nORrconRM&LF0kha=PWebZb3
zZ`V)#@%|*O8#0h@CPt9*FxX1qTy7`mq5AXhaw5!Aj
zj)OyHsM3a_^J|$}Z>?#srINR3jMa2L*BAr`WS&Q{jl$SJF+1e7Z9Z*TzAVhsx;wsY
z<>%e_>cNm5;HevzB?08OlTL=uTHm87A5DTwJKh|7`jd5AqWOB2j!Li#TAZSR=(`{z
zl-%=pxi3(@&S9I9KRUB_^LVpffl6^g5)C-XI@uE*doG%cTXf3~Zk`s3OSDqQ&
zfp>$WE>uz#q<%?hZ1#oZjW*ECy=3&FWwmQmf+t_?>E~dRj)C-$^o7NOo5Yfu&Dy-YVEYz
zA-lmmy(Et{yV5!KoI9^ayFL_mtA-m#pb~iqiVFq}AK^zEc#*o`IS#rwH7@DGU0g)(
z*0c?mtVIP!xzmUFAUFX+L7~7Cm~b3GJ%?lBdATyKf;YZxqVSsP5;DfX
z2y4tJRTQYSYEW5jd;}wLA}pLA4A3O-`TXRq=wi<|xi%
z`-vatIa9Vo$mR~|9%nZ?ytNIb6mCku6Atx6gW!jrN{xIbb-7pYmZ1KUb6ce8FA3W0
suF{_1ys_L>{7z@;uHttU_fdiW1N1i$b*I@Z_W%F@07*qoM6N<$g0=?}YXATM
literal 0
HcmV?d00001
diff --git a/benchmark.csv b/benchmark.csv
index dfaff31..23ead81 100644
--- a/benchmark.csv
+++ b/benchmark.csv
@@ -1,1001 +1,1001 @@
,Benchmark
-2020-01-01,-0.24106536260370706
-2020-01-02,0.13967091520814182
-2020-01-03,-1.249317234667989
-2020-01-06,-0.9206594428267999
-2020-01-07,-1.7504216494525089
-2020-01-08,-0.5093144341553919
-2020-01-09,-0.5773312288353949
-2020-01-10,-0.5558709432958192
-2020-01-13,-0.10469694157834286
-2020-01-14,0.17140858368029
-2020-01-15,-0.8752910153412127
-2020-01-16,0.8774698398166317
-2020-01-17,-0.49340963278583827
-2020-01-20,-0.746638679075178
-2020-01-21,-0.8146958854979294
-2020-01-22,-1.111756880085303
-2020-01-23,-2.2902013794922573
-2020-01-24,-2.9961985402775255
-2020-01-27,-1.6135152483234156
-2020-01-28,-1.6899324055666811
-2020-01-29,-1.3235095602818285
-2020-01-30,-0.5774683696516566
-2020-01-31,-1.3484754609972271
-2020-02-03,-1.4600583740713509
-2020-02-04,-0.14416897256590677
-2020-02-05,0.8764130820077667
-2020-02-06,2.0795287796904613
-2020-02-07,1.8649265498656424
-2020-02-10,2.266593132766246
-2020-02-11,1.2751610456170068
-2020-02-12,2.914456163778482
-2020-02-13,3.7024090099044074
-2020-02-14,3.5919163471299353
-2020-02-17,3.282239721556179
-2020-02-18,1.7996351173295972
-2020-02-19,3.4226910516934863
-2020-02-20,2.8110581316698666
-2020-02-21,1.9822485278411033
-2020-02-24,2.269707937340102
-2020-02-25,3.3174625439373826
-2020-02-26,3.302224802019464
-2020-02-27,1.614920101433149
-2020-02-28,0.9030488667171225
-2020-03-02,1.3091859703739341
-2020-03-03,0.23266250807934719
-2020-03-04,-1.1097207421670436
-2020-03-05,-1.1773469992610124
-2020-03-06,-0.7937794935390836
-2020-03-09,-1.2156564486718144
-2020-03-10,-2.7000584873349167
-2020-03-11,-1.6624275539797992
-2020-03-12,-2.2554591846384313
-2020-03-13,-1.3647178717236335
-2020-03-16,-2.9408507652851203
-2020-03-17,-2.8933594803178813
-2020-03-18,-3.053334094078936
-2020-03-19,-2.2283984987517016
-2020-03-20,-1.671114208795157
-2020-03-23,-2.5571237598977454
-2020-03-24,-2.368680791471418
-2020-03-25,-2.5972637078643417
-2020-03-26,-1.9364231932027596
-2020-03-27,-2.291182370807355
-2020-03-30,-0.62083384381363
-2020-03-31,-1.2349046506752486
-2020-04-01,-0.5561863781167046
-2020-04-02,-0.8777213080862896
-2020-04-03,-1.3804981960616232
-2020-04-06,-0.9844550607711408
-2020-04-07,-0.9690751999111676
-2020-04-08,-0.5228964254347159
-2020-04-09,-0.7971814169682325
-2020-04-10,-0.9028186824970459
-2020-04-13,0.25968842600855657
-2020-04-14,2.257929212646527
-2020-04-15,2.676426821205053
-2020-04-16,2.6324352061278145
-2020-04-17,3.8816501994034933
-2020-04-20,1.4978156440188113
-2020-04-21,1.875594200620381
-2020-04-22,0.9940794489257094
-2020-04-23,-0.4072728233246843
-2020-04-24,0.4690015516047692
-2020-04-27,0.8224934286502747
-2020-04-28,0.8288458172634291
-2020-04-29,-0.6799276738283303
-2020-04-30,-0.8149654231457526
-2020-05-01,-0.4062070276940938
-2020-05-04,-0.35942361248693916
-2020-05-05,0.06246735344091042
-2020-05-06,-0.4103121986874509
-2020-05-07,0.13712354660343967
-2020-05-08,-0.5605251762719343
-2020-05-11,-0.8669978551007008
-2020-05-12,0.5449302166208875
-2020-05-13,-0.15992608882561543
-2020-05-14,2.236151257826181
-2020-05-15,0.4157159883685557
-2020-05-18,2.1256712071670307
-2020-05-19,2.05077044415901
-2020-05-20,2.6836982530451374
-2020-05-21,3.556772323805109
-2020-05-22,3.36495071326921
-2020-05-25,4.318435645542931
-2020-05-26,4.029656152885522
-2020-05-27,5.125093961640514
-2020-05-28,4.871901836326698
-2020-05-29,5.717555761780746
-2020-06-01,4.564956068007966
-2020-06-02,4.4435015566371225
-2020-06-03,5.874202191450208
-2020-06-04,5.4410972299129945
-2020-06-05,6.206068438709065
-2020-06-08,5.650699443994784
-2020-06-09,6.0478325985855985
-2020-06-10,6.959063784768164
-2020-06-11,7.414387378858482
-2020-06-12,8.813335642170689
-2020-06-15,7.297130261996007
-2020-06-16,7.6133362415098125
-2020-06-17,8.59409951317589
-2020-06-18,8.127292126641246
-2020-06-19,8.676528241896449
-2020-06-22,9.546363435394863
-2020-06-23,11.213866473442405
-2020-06-24,12.060527379607848
-2020-06-25,12.732341305505658
-2020-06-26,14.014963486974779
-2020-06-29,13.892216168293842
-2020-06-30,11.981910746215302
-2020-07-01,11.976496599332117
-2020-07-02,11.807280460895518
-2020-07-03,12.500760074678372
-2020-07-06,13.031721510503358
-2020-07-07,13.794788851986006
-2020-07-08,12.8958608386312
-2020-07-09,13.632333397046766
-2020-07-10,15.059344419248172
-2020-07-13,15.972625039259826
-2020-07-14,13.620492482322673
-2020-07-15,13.500291125031305
-2020-07-16,12.194395503873869
-2020-07-17,13.436415282470294
-2020-07-20,13.18126983611662
-2020-07-21,14.29929400429436
-2020-07-22,13.218494347127875
-2020-07-23,11.860546254618402
-2020-07-24,12.40936206874631
-2020-07-27,12.271967967778744
-2020-07-28,11.2898746048626
-2020-07-29,10.096754554157277
-2020-07-30,9.548204674558804
-2020-07-31,10.414247800251248
-2020-08-03,10.40948445576607
-2020-08-04,10.755751046133776
-2020-08-05,9.734502232692229
-2020-08-06,9.663414230629186
-2020-08-07,10.602557101083823
-2020-08-10,10.787733294340109
-2020-08-11,11.551452908624423
-2020-08-12,12.181883259166904
-2020-08-13,13.113708823521199
-2020-08-14,12.481782981270925
-2020-08-17,12.659897625623568
-2020-08-18,14.178100589727292
-2020-08-19,14.986586486001448
-2020-08-20,15.810994181761844
-2020-08-21,15.579864970909982
-2020-08-24,18.076262126119197
-2020-08-25,19.354557285664775
-2020-08-26,20.023058468818206
-2020-08-27,19.305827853152255
-2020-08-28,20.240511723550366
-2020-08-31,20.568056718951752
-2020-09-01,20.539654279543676
-2020-09-02,19.95669317048361
-2020-09-03,20.369835284656098
-2020-09-04,19.6729845206741
-2020-09-07,19.50159678227195
-2020-09-08,20.33809651466402
-2020-09-09,19.919544471004595
-2020-09-10,20.447857752418845
-2020-09-11,20.880447609561166
-2020-09-14,21.140806433100746
-2020-09-15,22.171076799269976
-2020-09-16,21.937861731632747
-2020-09-17,22.987257849959917
-2020-09-18,21.01587298532924
-2020-09-21,21.169197959261815
-2020-09-22,18.986663606061803
-2020-09-23,19.47810882925236
-2020-09-24,19.659008347390827
-2020-09-25,19.07142909224332
-2020-09-28,19.644223092029
-2020-09-29,20.714072601191884
-2020-09-30,21.86410421663041
-2020-10-01,21.243638558727262
-2020-10-02,22.480235641726455
-2020-10-05,20.626723303168145
-2020-10-06,20.058871028710833
-2020-10-07,19.253934250249703
-2020-10-08,19.054988634373537
-2020-10-09,19.894754191077784
-2020-10-12,20.568227137841898
-2020-10-13,19.38511179726952
-2020-10-14,16.69336502219218
-2020-10-15,16.69645256818856
-2020-10-16,15.435991979473803
-2020-10-19,17.48023512167496
-2020-10-20,18.024875392770017
-2020-10-21,17.239526008970603
-2020-10-22,19.83256455977002
-2020-10-23,18.77538632769957
-2020-10-26,17.61955667457179
-2020-10-27,18.40403256431247
-2020-10-28,20.137178629166367
-2020-10-29,18.409109551591353
-2020-10-30,17.822496957769808
-2020-11-02,17.271103081085595
-2020-11-03,18.00852437468098
-2020-11-04,18.803492678223677
-2020-11-05,19.067103460958496
-2020-11-06,19.54892754559818
-2020-11-09,19.212463749871848
-2020-11-10,18.740974550609213
-2020-11-11,19.80277297086487
-2020-11-12,19.920847340183958
-2020-11-13,20.264451256874505
-2020-11-16,18.74879233532062
-2020-11-17,18.843538322686694
-2020-11-18,19.900621715158326
-2020-11-19,18.60293996936923
-2020-11-20,18.66832151171556
-2020-11-23,18.705593696469766
-2020-11-24,18.464701101888934
-2020-11-25,19.065978747480813
-2020-11-26,19.03295031044734
-2020-11-27,19.051022233882474
-2020-11-30,20.79195292518924
-2020-12-01,19.927677986731776
-2020-12-02,19.933774177356945
-2020-12-03,21.095428999298953
-2020-12-04,20.36852124151399
-2020-12-07,20.619930685188994
-2020-12-08,20.858620832214708
-2020-12-09,21.01651023741994
-2020-12-10,21.17515722219041
-2020-12-11,21.957502186894516
-2020-12-14,21.708198012397368
-2020-12-15,22.996210839771827
-2020-12-16,22.596991784528377
-2020-12-17,25.430047402388478
-2020-12-18,25.53014403136239
-2020-12-21,23.781300771479373
-2020-12-22,22.201634203326712
-2020-12-23,20.418665837602795
-2020-12-24,19.928758871937305
-2020-12-25,23.000362034904963
-2020-12-28,22.955346632943403
-2020-12-29,21.44651491419927
-2020-12-30,20.859090531477865
-2020-12-31,21.010432426854816
-2021-01-01,21.190427091174733
-2021-01-04,21.883663966606207
-2021-01-05,21.10129747803363
-2021-01-06,20.798187925566772
-2021-01-07,20.075219743403434
-2021-01-08,19.255736409261132
-2021-01-11,18.192895787988697
-2021-01-12,16.340599014086116
-2021-01-13,17.041085367587304
-2021-01-14,15.622379490176439
-2021-01-15,17.59818803379545
-2021-01-18,16.113408796794698
-2021-01-19,17.766968062524352
-2021-01-20,17.651872079798697
-2021-01-21,15.964653642740714
-2021-01-22,16.90174621882055
-2021-01-25,15.189922979191376
-2021-01-26,15.386159880666906
-2021-01-27,16.193841538803724
-2021-01-28,15.411236757317473
-2021-01-29,14.515682666296291
-2021-02-01,13.349023056423649
-2021-02-02,12.470548156730475
-2021-02-03,12.294664993616694
-2021-02-04,12.07766237878841
-2021-02-05,10.57822659211268
-2021-02-08,10.884951422648536
-2021-02-09,9.184555940373688
-2021-02-10,9.696539820847464
-2021-02-11,10.521744040173942
-2021-02-12,10.186304506621955
-2021-02-15,11.59532600739529
-2021-02-16,10.261553607454413
-2021-02-17,9.225155704166154
-2021-02-18,8.4372393327385
-2021-02-19,7.034827549323659
-2021-02-22,7.956474329359032
-2021-02-23,6.492116623206541
-2021-02-24,5.753088267703365
-2021-02-25,5.899206249910002
-2021-02-26,6.521876937237646
-2021-03-01,6.431589048348426
-2021-03-02,7.90703887573863
-2021-03-03,7.302374357089866
-2021-03-04,5.178912198580013
-2021-03-05,5.763884519159579
-2021-03-08,5.8731022905391415
-2021-03-09,4.089582900525211
-2021-03-10,4.790759206149957
-2021-03-11,5.454995868511246
-2021-03-12,5.591930783402169
-2021-03-15,7.621657921053618
-2021-03-16,7.812976541089565
-2021-03-17,6.4716221305910295
-2021-03-18,6.107384948276501
-2021-03-19,5.661075702974104
-2021-03-22,4.02140048939123
-2021-03-23,2.884972801357843
-2021-03-24,3.7805665697245043
-2021-03-25,4.099000951118183
-2021-03-26,4.096910747193529
-2021-03-29,2.730686191455423
-2021-03-30,2.160796314663315
-2021-03-31,2.9933532171825252
-2021-04-01,3.03699865692929
-2021-04-02,2.4116379504956806
-2021-04-05,1.5982871375414995
-2021-04-06,2.129375037674801
-2021-04-07,1.3884171659044071
-2021-04-08,1.4500218922453532
-2021-04-09,2.410985495917547
-2021-04-12,3.0207809032464414
-2021-04-13,3.0398395378617415
-2021-04-14,2.539542602996171
-2021-04-15,3.5926837290812683
-2021-04-16,3.9999253583622645
-2021-04-19,4.712292158697564
-2021-04-20,3.0591101434216386
-2021-04-21,3.691742322995193
-2021-04-22,3.805407796691543
-2021-04-23,3.2972593275459587
-2021-04-26,2.1506446380639765
-2021-04-27,0.9569513879533231
-2021-04-28,0.39542998439160637
-2021-04-29,0.8848736203357965
-2021-04-30,1.0122664191483859
-2021-05-03,3.2848315977359652
-2021-05-04,4.230842373405353
-2021-05-05,5.114704958661787
-2021-05-06,4.4333000904926925
-2021-05-07,3.942762670887443
-2021-05-10,3.4426253808571103
-2021-05-11,4.991577902734082
-2021-05-12,5.0221196985811565
-2021-05-13,4.882748617691829
-2021-05-14,5.219514802567681
-2021-05-17,5.545247272020275
-2021-05-18,5.194727437381729
-2021-05-19,5.174405176151688
-2021-05-20,5.327198634875571
-2021-05-21,6.144557367857599
-2021-05-24,5.85522151319023
-2021-05-25,6.06295791867383
-2021-05-26,5.713719175621288
-2021-05-27,5.682518753357719
-2021-05-28,5.5074654319620935
-2021-05-31,4.705412046076471
-2021-06-01,6.042573997562175
-2021-06-02,5.95415885917898
-2021-06-03,7.212838761598157
-2021-06-04,7.780932274784173
-2021-06-07,6.921178235751461
-2021-06-08,7.590396731922076
-2021-06-09,7.493583505517011
-2021-06-10,5.391844020089698
-2021-06-11,5.843362713564377
-2021-06-14,5.807115358027554
-2021-06-15,7.609008985954773
-2021-06-16,8.799055033826752
-2021-06-17,10.359976754423698
-2021-06-18,12.424751761412704
-2021-06-21,13.587635478592487
-2021-06-22,14.12417940328544
-2021-06-23,15.75715024678678
-2021-06-24,16.00530827983472
-2021-06-25,15.292246694355365
-2021-06-28,14.388593342860197
-2021-06-29,13.486382708486602
-2021-06-30,14.900632988141611
-2021-07-01,14.656465290586913
-2021-07-02,15.873149376796887
-2021-07-05,13.94053561345957
-2021-07-06,15.49853501934653
-2021-07-07,17.28499473216075
-2021-07-08,18.192789527864427
-2021-07-09,18.982995178909917
-2021-07-12,18.89739514826615
-2021-07-13,19.273436322915202
-2021-07-14,18.391983582795117
-2021-07-15,18.582718448488396
-2021-07-16,19.791901952080387
-2021-07-19,20.033610685254956
-2021-07-20,20.27154135413492
-2021-07-21,20.705764734605676
-2021-07-22,21.930341618712482
-2021-07-23,21.10415286517255
-2021-07-26,19.05179109474903
-2021-07-27,17.902123897531528
-2021-07-28,18.330916149241013
-2021-07-29,18.740213312001128
-2021-07-30,16.98263000200872
-2021-08-02,17.258473395529037
-2021-08-03,16.97556369495722
-2021-08-04,18.20162932893748
-2021-08-05,16.20770536024375
-2021-08-06,16.698185757523945
-2021-08-09,16.48534504124847
-2021-08-10,17.046624097407445
-2021-08-11,18.101674923765636
-2021-08-12,16.88840658606155
-2021-08-13,16.62399297823692
-2021-08-16,16.29602657663772
-2021-08-17,16.22835020267315
-2021-08-18,16.60312896351773
-2021-08-19,17.14587581643626
-2021-08-20,16.42145412092892
-2021-08-23,15.197818311470174
-2021-08-24,16.73600005123743
-2021-08-25,16.007934854585546
-2021-08-26,15.265357260519194
-2021-08-27,15.660289523378372
-2021-08-30,15.674569423048592
-2021-08-31,14.783499299236091
-2021-09-01,13.876742542086573
-2021-09-02,12.628079611024475
-2021-09-03,14.235491085212521
-2021-09-06,15.440733069282471
-2021-09-07,17.02801737759941
-2021-09-08,17.244242706549777
-2021-09-09,17.93073811323492
-2021-09-10,20.667096466345683
-2021-09-13,21.2810783978894
-2021-09-14,19.78453103887049
-2021-09-15,19.968225127408715
-2021-09-16,19.353044845488284
-2021-09-17,18.557431040316143
-2021-09-20,17.190291896141108
-2021-09-21,17.499231270310343
-2021-09-22,17.189480663042374
-2021-09-23,15.27245304162292
-2021-09-24,14.547279292345051
-2021-09-27,15.354981774717402
-2021-09-28,15.647118076730585
-2021-09-29,14.740692793664467
-2021-09-30,12.266850599495974
-2021-10-01,12.381452735618005
-2021-10-04,13.335291462920258
-2021-10-05,13.34886497342576
-2021-10-06,14.954360771931253
-2021-10-07,14.35792529298644
-2021-10-08,13.553208752728906
-2021-10-11,14.299739874416607
-2021-10-12,12.331363679732405
-2021-10-13,11.367241650343596
-2021-10-14,11.963208119684392
-2021-10-15,12.154460431870524
-2021-10-18,12.479247214765852
-2021-10-19,12.986700932838543
-2021-10-20,12.31419128540981
-2021-10-21,11.60343237286222
-2021-10-22,12.839930766347425
-2021-10-25,11.82626455528715
-2021-10-26,12.010547912964853
-2021-10-27,11.509364774623391
-2021-10-28,12.282000286301791
-2021-10-29,11.495242278073782
-2021-11-01,12.591792309545301
-2021-11-02,11.99589330383195
-2021-11-03,11.765251556798878
-2021-11-04,11.981520024178781
-2021-11-05,12.24495096295037
-2021-11-08,12.035558448393065
-2021-11-09,10.86442772574668
-2021-11-10,9.20656679444458
-2021-11-11,9.788746885046475
-2021-11-12,9.746820029466521
-2021-11-15,9.606228785642786
-2021-11-16,9.537138183286153
-2021-11-17,9.473586260731597
-2021-11-18,9.159649943552461
-2021-11-19,9.872096741663292
-2021-11-22,9.154871471814435
-2021-11-23,9.871991785959056
-2021-11-24,10.47122551228455
-2021-11-25,8.863083782717819
-2021-11-26,9.713659326349422
-2021-11-29,10.536284511847624
-2021-11-30,11.273527645758344
-2021-12-01,10.73969776925586
-2021-12-02,10.364073715172635
-2021-12-03,10.654483942417286
-2021-12-06,10.428989661715606
-2021-12-07,8.793330953813417
-2021-12-08,8.870031953880831
-2021-12-09,8.727192085396457
-2021-12-10,7.851925571406575
-2021-12-13,8.473850812423212
-2021-12-14,8.981238154215525
-2021-12-15,8.453944364691884
-2021-12-16,8.475334152007175
-2021-12-17,8.612025753390759
-2021-12-20,7.512914396780715
-2021-12-21,7.519687915539051
-2021-12-22,7.661296779484127
-2021-12-23,7.532660035791614
-2021-12-24,8.109762077761053
-2021-12-27,5.493017589669101
-2021-12-28,3.788262716891189
-2021-12-29,2.339370790705357
-2021-12-30,2.5401130528668157
-2021-12-31,2.8363719638505063
-2022-01-03,0.9408395162160856
-2022-01-04,-0.16405257688801145
-2022-01-05,0.3860139396824712
-2022-01-06,2.6736253134602186
-2022-01-07,2.146146365627526
-2022-01-10,2.3478213074041454
-2022-01-11,1.389981887907769
-2022-01-12,2.7234194748626046
-2022-01-13,2.7932710865413295
-2022-01-14,3.2665357716222396
-2022-01-17,4.28050686951504
-2022-01-18,6.013762165954208
-2022-01-19,5.85897953451127
-2022-01-20,5.129580421994385
-2022-01-21,6.986511401152172
-2022-01-24,8.107273851279118
-2022-01-25,9.526050466696487
-2022-01-26,8.539919873100288
-2022-01-27,8.153204429519393
-2022-01-28,7.9766802707417135
-2022-01-31,9.33671255278586
-2022-02-01,7.510669748982463
-2022-02-02,7.016920023631169
-2022-02-03,6.912847470396374
-2022-02-04,6.3523014788429695
-2022-02-07,6.8116775572230415
-2022-02-08,6.0612847572041515
-2022-02-09,6.310554826909893
-2022-02-10,7.436547419171382
-2022-02-11,6.82153363845936
-2022-02-14,5.117615105129082
-2022-02-15,3.9306904566224246
-2022-02-16,2.733479292576973
-2022-02-17,1.593909070469472
-2022-02-18,0.05302099150343831
-2022-02-21,1.6985246435250718
-2022-02-22,2.600709986967994
-2022-02-23,1.8664577933958912
-2022-02-24,1.7767428440659352
-2022-02-25,2.0424032674331247
-2022-02-28,0.10248879633697383
-2022-03-01,0.6156851272568927
-2022-03-02,-0.16479082801518818
-2022-03-03,-1.1581823465505705
-2022-03-04,0.3707494347230218
-2022-03-07,-0.6239427450068424
-2022-03-08,0.7386456302269762
-2022-03-09,0.943780588780016
-2022-03-10,0.2759898198595381
-2022-03-11,-1.054201847017643
-2022-03-14,0.7913368762590245
-2022-03-15,0.41434002315504403
-2022-03-16,1.6562282667149655
-2022-03-17,1.2886603516431077
-2022-03-18,2.0660589094274746
-2022-03-21,1.6489212683307994
-2022-03-22,-0.46651204829722737
-2022-03-23,-0.5823227270636917
-2022-03-24,-2.012419552865533
-2022-03-25,-1.8714719611178032
-2022-03-28,-1.527616339502365
-2022-03-29,-0.8389498059750513
-2022-03-30,-0.3174930621705837
-2022-03-31,-0.28287710359468504
-2022-04-01,0.9087670960262906
-2022-04-04,2.8602136755869125
-2022-04-05,2.352607602001816
-2022-04-06,3.088480687055424
-2022-04-07,3.945159556464454
-2022-04-08,5.832628675694972
-2022-04-11,5.271881788140723
-2022-04-12,5.1056956091690395
-2022-04-13,6.066817220184705
-2022-04-14,6.0182933676590595
-2022-04-15,7.136242763214735
-2022-04-18,8.609119980290956
-2022-04-19,9.171474624904802
-2022-04-20,8.898534405197898
-2022-04-21,7.425451226011894
-2022-04-22,6.964564269007131
-2022-04-25,7.96581912804097
-2022-04-26,8.17819084826966
-2022-04-27,8.67683634812989
-2022-04-28,9.45162367897312
-2022-04-29,8.383614706103309
-2022-05-02,7.39669672658381
-2022-05-03,8.105317442238583
-2022-05-04,7.028266416391973
-2022-05-05,7.6663978465442435
-2022-05-06,7.394861871789907
-2022-05-09,8.276027216550471
-2022-05-10,9.7159342002003
-2022-05-11,10.680721896235868
-2022-05-12,9.754148392429677
-2022-05-13,8.625509627668453
-2022-05-16,8.497130058743753
-2022-05-17,9.682747561360575
-2022-05-18,10.929473708304705
-2022-05-19,13.847620755976571
-2022-05-20,13.718266125743906
-2022-05-23,14.847116768310011
-2022-05-24,15.228156571026162
-2022-05-25,16.196788193384677
-2022-05-26,16.436367524203174
-2022-05-27,16.530661764790356
-2022-05-30,17.865987198685204
-2022-05-31,17.686355788201595
-2022-06-01,17.508094788378067
-2022-06-02,18.241991355857003
-2022-06-03,18.122580359111463
-2022-06-06,18.003700472244475
-2022-06-07,19.202930973138653
-2022-06-08,19.62437049087396
-2022-06-09,20.557527617945265
-2022-06-10,21.16214257558988
-2022-06-13,21.304097813065166
-2022-06-14,21.933811599705116
-2022-06-15,23.000471254620432
-2022-06-16,24.72986738462793
-2022-06-17,24.81739552155812
-2022-06-20,24.45113300603398
-2022-06-21,24.78889897040102
-2022-06-22,25.531714381771693
-2022-06-23,25.61514606089011
-2022-06-24,26.5031859626699
-2022-06-27,27.65830176106462
-2022-06-28,27.942674908217036
-2022-06-29,27.988748966857333
-2022-06-30,28.208564697004505
-2022-07-01,27.893983781577482
-2022-07-04,27.136650793922097
-2022-07-05,27.849590193021022
-2022-07-06,28.54506191046265
-2022-07-07,28.288542002065245
-2022-07-08,29.30477640142549
-2022-07-11,30.86511492522253
-2022-07-12,32.328403033915585
-2022-07-13,32.41716420114079
-2022-07-14,33.324914119316205
-2022-07-15,32.94326278498442
-2022-07-18,33.06495049917639
-2022-07-19,33.01174885525409
-2022-07-20,32.56273788983094
-2022-07-21,30.952292450556897
-2022-07-22,29.980060668580062
-2022-07-25,31.15036901445936
-2022-07-26,31.758759379838942
-2022-07-27,30.444671373274783
-2022-07-28,28.298595012652214
-2022-07-29,29.323802235213318
-2022-08-01,28.32809549780326
-2022-08-02,28.075526366413804
-2022-08-03,29.08037808502167
-2022-08-04,29.41783806803872
-2022-08-05,29.37320544421578
-2022-08-08,30.16093284461797
-2022-08-09,31.85877657416309
-2022-08-10,31.135965236483685
-2022-08-11,30.958145090700633
-2022-08-12,32.34434377300125
-2022-08-15,31.70497195464177
-2022-08-16,31.597924315052865
-2022-08-17,31.43633566486237
-2022-08-18,31.001215264164312
-2022-08-19,31.53506680183223
-2022-08-22,30.627659931401112
-2022-08-23,32.33970577183393
-2022-08-24,32.670502270193374
-2022-08-25,31.112247415059638
-2022-08-26,31.67985931285948
-2022-08-29,31.641460989063994
-2022-08-30,30.78303578759531
-2022-08-31,30.756840056411065
-2022-09-01,32.19052355688754
-2022-09-02,30.99282736097479
-2022-09-05,32.23187885241043
-2022-09-06,32.56518623862856
-2022-09-07,33.51099501475493
-2022-09-08,33.341140616385935
-2022-09-09,32.56874017673945
-2022-09-12,31.56884145282925
-2022-09-13,32.438779740558985
-2022-09-14,32.11973287546438
-2022-09-15,31.62275140579895
-2022-09-16,32.80609517442909
-2022-09-19,34.052780135960326
-2022-09-20,35.41545153813984
-2022-09-21,35.723296038810545
-2022-09-22,36.09577494405227
-2022-09-23,36.44664465933234
-2022-09-26,34.76617557107691
-2022-09-27,35.197360770636436
-2022-09-28,33.61370882655932
-2022-09-29,31.11370575577618
-2022-09-30,30.91968783256345
-2022-10-03,31.64413411796861
-2022-10-04,30.611448714070505
-2022-10-05,30.283233386317953
-2022-10-06,30.85478046541406
-2022-10-07,32.01331647801275
-2022-10-10,32.289159931269154
-2022-10-11,32.53905518162145
-2022-10-12,32.769050835418724
-2022-10-13,34.404879721148106
-2022-10-14,34.66272443431046
-2022-10-17,33.96800280236561
-2022-10-18,34.285883561976085
-2022-10-19,35.74178128711971
-2022-10-20,36.60504908838861
-2022-10-21,36.41901888243982
-2022-10-24,35.29473093042779
-2022-10-25,34.96379649975045
-2022-10-26,35.087044859718965
-2022-10-27,33.08610141682443
-2022-10-28,33.76212277631465
-2022-10-31,32.141781264371126
-2022-11-01,31.92849772680114
-2022-11-02,31.982398402727853
-2022-11-03,32.884829439004996
-2022-11-04,33.280831084643935
-2022-11-07,33.523851284317665
-2022-11-08,33.397335750942354
-2022-11-09,33.2258854828325
-2022-11-10,33.27660345316394
-2022-11-11,34.481329091977585
-2022-11-14,34.186138743623154
-2022-11-15,32.790033279027
-2022-11-16,32.88448351823469
-2022-11-17,31.49858652871685
-2022-11-18,30.79886172370617
-2022-11-21,30.88723349112741
-2022-11-22,30.32125489110297
-2022-11-23,27.23963297503625
-2022-11-24,27.45457773729898
-2022-11-25,27.21202138478985
-2022-11-28,25.918282120208072
-2022-11-29,27.85564362941819
-2022-11-30,29.334384601897163
-2022-12-01,27.745986862866012
-2022-12-02,26.845527977846025
-2022-12-05,27.27413612082431
-2022-12-06,26.807249549027393
-2022-12-07,27.475116647252733
-2022-12-08,26.32539797840171
-2022-12-09,26.896788947985748
-2022-12-12,28.2058476920801
-2022-12-13,27.909569114560107
-2022-12-14,27.341520857563502
-2022-12-15,27.644805353273142
-2022-12-16,27.89072600550579
-2022-12-19,28.346301278916837
-2022-12-20,28.229277537317877
-2022-12-21,25.9234644857519
-2022-12-22,25.544515790878147
-2022-12-23,25.963055156756596
-2022-12-26,26.425998440004186
-2022-12-27,25.765822495178494
-2022-12-28,25.901965398484357
-2022-12-29,25.49828240399004
-2022-12-30,24.892832961856136
-2023-01-02,24.216954219305453
-2023-01-03,24.491284868678562
-2023-01-04,22.586410039199603
-2023-01-05,25.424065240559433
-2023-01-06,25.21312137946747
-2023-01-09,26.34351514139804
-2023-01-10,24.786047777122207
-2023-01-11,23.978157643103877
-2023-01-12,24.261458604925366
-2023-01-13,23.793377304085208
-2023-01-16,25.07577352888796
-2023-01-17,25.07127672687676
-2023-01-18,26.74054867982526
-2023-01-19,25.373433987335332
-2023-01-20,26.92201319682344
-2023-01-23,27.080937233416126
-2023-01-24,27.441925029186528
-2023-01-25,27.332876146139398
-2023-01-26,27.503953240067275
-2023-01-27,27.816270776065444
-2023-01-30,28.35631126540128
-2023-01-31,29.55003584150427
-2023-02-01,29.80070120032873
-2023-02-02,30.13572290642021
-2023-02-03,30.727208863840477
-2023-02-06,29.276337463594835
-2023-02-07,31.16278964591565
-2023-02-08,30.550362357369195
-2023-02-09,31.520506769688275
-2023-02-10,29.68512946561427
-2023-02-13,30.596261234127685
-2023-02-14,30.68660823989905
-2023-02-15,31.374254195988275
-2023-02-16,31.57816356647771
-2023-02-17,34.051978695294885
-2023-02-20,33.7332570040638
-2023-02-21,34.108402212856504
-2023-02-22,34.35232815981515
-2023-02-23,33.23631686482805
-2023-02-24,33.220470810353234
-2023-02-27,32.99984801592564
-2023-02-28,31.95159882237636
-2023-03-01,32.09182003077546
-2023-03-02,31.36441387712358
-2023-03-03,30.991536342522306
-2023-03-06,30.51998138791023
-2023-03-07,29.814418138148184
-2023-03-08,30.14371325515479
-2023-03-09,32.85801108814794
-2023-03-10,32.558452865431946
-2023-03-13,32.91173435780037
-2023-03-14,31.53625896570352
-2023-03-15,32.32444044353406
-2023-03-16,31.566272778706253
-2023-03-17,31.506358163637927
-2023-03-20,29.81123134380424
-2023-03-21,31.43210233728319
-2023-03-22,32.38081502301809
-2023-03-23,32.10340274505538
-2023-03-24,32.21148998666693
-2023-03-27,33.750815128893045
-2023-03-28,31.682504241939
-2023-03-29,32.26759650412215
-2023-03-30,32.221339839905404
-2023-03-31,32.00730473075479
-2023-04-03,32.48814699026984
-2023-04-04,32.879278254412256
-2023-04-05,32.9622601062054
-2023-04-06,31.67553386454232
-2023-04-07,31.710123850817023
-2023-04-10,31.275147085304315
-2023-04-11,31.24903516914951
-2023-04-12,31.737577787099557
-2023-04-13,30.665842644346444
-2023-04-14,30.29185038245799
-2023-04-17,30.127952126604264
-2023-04-18,29.771713272360874
-2023-04-19,30.15335772841635
-2023-04-20,30.95071425971029
-2023-04-21,32.16212456716738
-2023-04-24,32.7948168151782
-2023-04-25,33.96847875739157
-2023-04-26,33.73421897542058
-2023-04-27,32.94244174146517
-2023-04-28,32.66819728222524
-2023-05-01,32.60295272362369
-2023-05-02,31.76917065569665
-2023-05-03,31.42175017629126
-2023-05-04,31.214591381288383
-2023-05-05,31.289069597100173
-2023-05-08,30.076196725900317
-2023-05-09,29.890842633135332
-2023-05-10,29.843904747788255
-2023-05-11,31.152936232956392
-2023-05-12,30.707137090543387
-2023-05-15,30.0749487587791
-2023-05-16,30.556884218742624
-2023-05-17,29.26841088513281
-2023-05-18,29.8627272251148
-2023-05-19,29.725167703138027
-2023-05-22,30.895153011392548
-2023-05-23,30.312752140962516
-2023-05-24,29.65511387669423
-2023-05-25,29.014603491372633
-2023-05-26,27.80367548601187
-2023-05-29,27.153319998085657
-2023-05-30,26.904527403228155
-2023-05-31,26.40980061545999
-2023-06-01,26.982987540588987
-2023-06-02,26.78199980242574
-2023-06-05,26.523603015816974
-2023-06-06,24.38512769594468
-2023-06-07,25.02279444109635
-2023-06-08,24.935266340680826
-2023-06-09,23.40074195001646
-2023-06-12,22.73738593853458
-2023-06-13,24.68651814978292
-2023-06-14,22.928529154935454
-2023-06-15,23.680061944178217
-2023-06-16,23.340303703899313
-2023-06-19,20.497831494004732
-2023-06-20,19.83156974831559
-2023-06-21,19.72461165033144
-2023-06-22,20.381475724088006
-2023-06-23,19.576620187312365
-2023-06-26,19.990405369599497
-2023-06-27,17.56021852757435
-2023-06-28,18.02346090944155
-2023-06-29,17.916931069630365
-2023-06-30,17.401388387619708
-2023-07-03,16.304377972887522
-2023-07-04,15.639419012268927
-2023-07-05,15.870117797145163
-2023-07-06,15.117591898281557
-2023-07-07,13.796380325411908
-2023-07-10,14.117172005580802
-2023-07-11,14.633244512412269
-2023-07-12,14.789790217849259
-2023-07-13,16.74827818060384
-2023-07-14,16.95242898663929
-2023-07-17,16.45493209061038
-2023-07-18,17.04255646017883
-2023-07-19,18.249322921968275
-2023-07-20,19.328997975196526
-2023-07-21,20.466073561098952
-2023-07-24,20.81610963372743
-2023-07-25,20.69061930379366
-2023-07-26,20.26898503460783
-2023-07-27,19.608445483897878
-2023-07-28,19.58884816292017
-2023-07-31,20.479379003907844
-2023-08-01,21.410790809863222
-2023-08-02,19.72302954163272
-2023-08-03,20.343156372826968
-2023-08-04,20.116181234642557
-2023-08-07,19.674483946608408
-2023-08-08,19.078102473913603
-2023-08-09,18.303067278083553
-2023-08-10,17.435628549826113
-2023-08-11,17.1617327338746
-2023-08-14,15.60219234116106
-2023-08-15,15.185078747532694
-2023-08-16,15.442757330238617
-2023-08-17,16.57121407684266
-2023-08-18,16.2142442977888
-2023-08-21,16.145045536008343
-2023-08-22,16.205420985947335
-2023-08-23,16.62676485832534
-2023-08-24,16.47654035927486
-2023-08-25,16.00810578282233
-2023-08-28,15.401629690611308
-2023-08-29,15.892434286889557
-2023-08-30,14.396443925303549
-2023-08-31,15.568551083819141
-2023-09-01,15.678813401876614
-2023-09-04,14.245358740346141
-2023-09-05,15.71262317508565
-2023-09-06,16.040963535867544
-2023-09-07,15.637818904934601
-2023-09-08,15.556301515656685
-2023-09-11,13.59883270541605
-2023-09-12,13.261591864665448
-2023-09-13,13.219589371996781
-2023-09-14,12.160746076122972
-2023-09-15,12.74374613534023
-2023-09-18,13.182882026430482
-2023-09-19,12.291069007552728
-2023-09-20,12.318661629203733
-2023-09-21,13.524963062176404
-2023-09-22,12.601170237583663
-2023-09-25,11.51516478208264
-2023-09-26,12.094918504662928
-2023-09-27,9.975131491402987
-2023-09-28,9.688724926934155
-2023-09-29,10.443975476091385
-2023-10-02,11.573606118839038
-2023-10-03,9.749023341241667
-2023-10-04,9.77505593552532
-2023-10-05,9.48801980549673
-2023-10-06,9.954695906023856
-2023-10-09,10.786273731954271
-2023-10-10,11.418318523457994
-2023-10-11,11.100946713951965
-2023-10-12,12.061334148881395
-2023-10-13,12.70766392352326
-2023-10-16,10.350318548656833
-2023-10-17,11.424182026244496
-2023-10-18,11.04545571165675
-2023-10-19,10.656355862157005
-2023-10-20,12.164298825189185
-2023-10-23,12.637526323700268
-2023-10-24,11.915840724699054
-2023-10-25,12.773456187663715
-2023-10-26,11.841713083931715
-2023-10-27,10.661149980448222
-2023-10-30,9.706809549614183
-2023-10-31,9.92449395954403
+2020-01-01,97.57702437647528
+2020-01-02,99.0826558494808
+2020-01-03,98.76728244811761
+2020-01-06,99.6026691035
+2020-01-07,100.69868064034783
+2020-01-08,100.90031313125345
+2020-01-09,99.55300828943201
+2020-01-10,97.733502375462
+2020-01-13,96.69030771254177
+2020-01-14,96.90562100325828
+2020-01-15,98.16347129679782
+2020-01-16,99.14754123627974
+2020-01-17,99.97433309996117
+2020-01-20,100.47585000255368
+2020-01-21,101.78645973910452
+2020-01-22,99.91800538630086
+2020-01-23,99.45724777889909
+2020-01-24,98.2291132546761
+2020-01-27,99.19530526260506
+2020-01-28,99.8061729653942
+2020-01-29,98.9522018731699
+2020-01-30,98.58458937089416
+2020-01-31,97.52216170627067
+2020-02-03,96.7076673250575
+2020-02-04,97.23809634373022
+2020-02-05,96.61026089019913
+2020-02-06,96.93101934594085
+2020-02-07,95.99931887774004
+2020-02-10,95.26570170133155
+2020-02-11,95.45077283351401
+2020-02-12,96.33701840981158
+2020-02-13,96.60020295882546
+2020-02-14,97.27663837052565
+2020-02-17,95.62012600348888
+2020-02-18,94.977186938152
+2020-02-19,94.76302664791993
+2020-02-20,95.2602358089006
+2020-02-21,96.51283095499616
+2020-02-24,95.33925321345502
+2020-02-25,94.41050621035323
+2020-02-26,93.82239623284327
+2020-02-27,95.85537384824909
+2020-02-28,97.00332978474644
+2020-03-02,98.21789372873732
+2020-03-03,96.78707670575113
+2020-03-04,97.08040389206086
+2020-03-05,95.50666854675104
+2020-03-06,96.17412050562957
+2020-03-09,94.7255598112369
+2020-03-10,93.54527659882149
+2020-03-11,93.92467250799812
+2020-03-12,93.62670750000804
+2020-03-13,93.56160874744214
+2020-03-16,91.7152155269978
+2020-03-17,90.67765624018995
+2020-03-18,89.5926193367261
+2020-03-19,90.99105952897906
+2020-03-20,91.4889132257594
+2020-03-23,92.88845480119696
+2020-03-24,91.69952136703296
+2020-03-25,92.26741669596541
+2020-03-26,92.62720587003288
+2020-03-27,92.24709384683352
+2020-03-30,91.37387293871254
+2020-03-31,91.61423224418121
+2020-04-01,90.71023689601893
+2020-04-02,91.13231310928208
+2020-04-03,90.74108248586585
+2020-04-06,88.65721768622129
+2020-04-07,89.94418505067041
+2020-04-08,89.90976923952036
+2020-04-09,88.31711349938675
+2020-04-10,89.04233974922604
+2020-04-13,88.49760273252583
+2020-04-14,89.41844323109352
+2020-04-15,88.79494644374513
+2020-04-16,87.76910991343372
+2020-04-17,88.54458394966385
+2020-04-20,89.33893772008547
+2020-04-21,89.35851162746417
+2020-04-22,89.0988882390591
+2020-04-23,88.09380918930594
+2020-04-24,90.06284078206535
+2020-04-27,89.08634124393942
+2020-04-28,88.7654999995408
+2020-04-29,86.95048655048349
+2020-04-30,87.67776734386703
+2020-05-01,86.13897959040875
+2020-05-04,85.72818805672944
+2020-05-05,84.77013808156946
+2020-05-06,84.92562562123857
+2020-05-07,84.34806027472328
+2020-05-08,85.13711705704651
+2020-05-11,86.01492718316415
+2020-05-12,86.80024504859823
+2020-05-13,86.74122290433687
+2020-05-14,87.1036921542671
+2020-05-15,86.04649629961571
+2020-05-18,87.12121090751482
+2020-05-19,87.12182625183961
+2020-05-20,87.16892354545661
+2020-05-21,86.10184530325877
+2020-05-22,87.44060171201407
+2020-05-25,88.27949431685764
+2020-05-26,88.60080401880401
+2020-05-27,87.18149436524948
+2020-05-28,89.11022042855905
+2020-05-29,90.94863842186219
+2020-06-01,91.27085420129653
+2020-06-02,91.12215956396217
+2020-06-03,91.60801929077185
+2020-06-04,91.89612367936365
+2020-06-05,93.23478956829483
+2020-06-08,92.91528131292276
+2020-06-09,93.86229873706047
+2020-06-10,94.48962495261746
+2020-06-11,94.20724597024108
+2020-06-12,94.87452652997283
+2020-06-15,95.4393553888147
+2020-06-16,94.44414957033618
+2020-06-17,94.38789706972632
+2020-06-18,92.9914980149964
+2020-06-19,95.30222018963738
+2020-06-22,97.7432284844394
+2020-06-23,98.25048284709753
+2020-06-24,96.91979737868547
+2020-06-25,98.37280755672002
+2020-06-26,96.22944432027991
+2020-06-29,96.28944738249575
+2020-06-30,96.14488434517774
+2020-07-01,95.35384281512897
+2020-07-02,97.28514170330469
+2020-07-03,98.00002999519312
+2020-07-06,99.23065044423277
+2020-07-07,100.52183416313972
+2020-07-08,100.97424676986915
+2020-07-09,103.40676035365249
+2020-07-10,104.35084022604909
+2020-07-13,103.90288569059211
+2020-07-14,103.18028534641222
+2020-07-15,102.84704383309618
+2020-07-16,101.22498746505096
+2020-07-17,102.79144634884412
+2020-07-20,102.50739510437359
+2020-07-21,103.60749136819594
+2020-07-22,105.08957407032871
+2020-07-23,105.61602207777597
+2020-07-24,104.88604203189784
+2020-07-27,103.48286271263045
+2020-07-28,102.9432635853619
+2020-07-29,105.035535638457
+2020-07-30,105.3311731928158
+2020-07-31,108.20139048227271
+2020-08-03,107.08804943799188
+2020-08-04,106.71474332041227
+2020-08-05,104.88555211177595
+2020-08-06,105.29824330830809
+2020-08-07,105.17239272801953
+2020-08-10,104.758403343577
+2020-08-11,105.68826337676349
+2020-08-12,105.23185219774365
+2020-08-13,106.4449109645864
+2020-08-14,107.93859268386396
+2020-08-17,108.30447920289257
+2020-08-18,108.45410383026967
+2020-08-19,106.1881430656884
+2020-08-20,106.20827544849296
+2020-08-21,106.83550938094359
+2020-08-24,108.28101033810147
+2020-08-25,107.9040144942278
+2020-08-26,107.85823995702887
+2020-08-27,107.62367338326897
+2020-08-28,106.90815304831656
+2020-08-31,105.60072129825433
+2020-09-01,106.0892158029221
+2020-09-02,106.83130449128461
+2020-09-03,107.45370994601325
+2020-09-04,110.56424201898498
+2020-09-07,109.3399314285646
+2020-09-08,108.89232992821015
+2020-09-09,109.44534684235259
+2020-09-10,111.34721167302443
+2020-09-11,111.8026788337151
+2020-09-14,110.98985732025963
+2020-09-15,113.12118215973848
+2020-09-16,112.07413333998775
+2020-09-17,112.15133254896317
+2020-09-18,111.33101582973364
+2020-09-21,111.97459023790704
+2020-09-22,110.52659795406574
+2020-09-23,112.82182424570944
+2020-09-24,112.97167814059989
+2020-09-25,112.29741925010659
+2020-09-28,112.23190039802518
+2020-09-29,113.60257784033527
+2020-09-30,114.08549453595111
+2020-10-01,116.88463603265866
+2020-10-02,113.8999165922078
+2020-10-05,113.00561630772006
+2020-10-06,112.01050888485122
+2020-10-07,111.42535943771577
+2020-10-08,113.2587486816664
+2020-10-09,113.1009532042139
+2020-10-12,112.91209100909863
+2020-10-13,112.8073385123572
+2020-10-14,113.46133504645739
+2020-10-15,116.0958315211979
+2020-10-16,117.1519721234664
+2020-10-19,120.88719582603747
+2020-10-20,121.15334361924586
+2020-10-21,122.42501459378299
+2020-10-22,123.5892392114355
+2020-10-23,123.6294001549552
+2020-10-26,124.39901437950078
+2020-10-27,123.70945624388389
+2020-10-28,124.87526054920541
+2020-10-29,125.5354115481717
+2020-10-30,126.64471424249273
+2020-11-02,126.33796325272996
+2020-11-03,126.99404571683175
+2020-11-04,127.24895432084928
+2020-11-05,126.5909206974872
+2020-11-06,126.68968253885113
+2020-11-09,126.5003134266058
+2020-11-10,126.28555796499408
+2020-11-11,127.20442532651734
+2020-11-12,128.69936203713206
+2020-11-13,130.8664447423009
+2020-11-16,130.93552758636812
+2020-11-17,134.18585904272524
+2020-11-18,135.27263711034925
+2020-11-19,133.36247647775693
+2020-11-20,132.49424524791067
+2020-11-23,132.43063854099748
+2020-11-24,134.1344153174184
+2020-11-25,135.91155818756633
+2020-11-26,134.018829447304
+2020-11-27,131.42677358993402
+2020-11-30,133.41726055434586
+2020-12-01,134.26168649958282
+2020-12-02,133.9926211958157
+2020-12-03,133.01512019198702
+2020-12-04,134.13370641473585
+2020-12-07,136.18379803963109
+2020-12-08,135.9158925329548
+2020-12-09,135.75237196162072
+2020-12-10,138.24847278882163
+2020-12-11,141.64283732220832
+2020-12-14,143.0074894362117
+2020-12-15,143.6114297201736
+2020-12-16,145.75869755110358
+2020-12-17,148.4291589076902
+2020-12-18,148.7132282472261
+2020-12-21,149.95491019405114
+2020-12-22,149.05290925455796
+2020-12-23,148.55821817258231
+2020-12-24,147.69628021836058
+2020-12-25,147.92097465892323
+2020-12-28,151.80255237331482
+2020-12-29,153.72183875397414
+2020-12-30,152.95813947820358
+2020-12-31,152.7461734644106
+2021-01-01,152.44825753061392
+2021-01-04,154.9884443179099
+2021-01-05,152.18805385547537
+2021-01-06,157.84445191862343
+2021-01-07,156.830527489265
+2021-01-08,155.50100074853677
+2021-01-11,153.93860416015735
+2021-01-12,156.6879735236253
+2021-01-13,155.07668813976449
+2021-01-14,154.19406365565322
+2021-01-15,155.4386788048555
+2021-01-18,153.05001098569082
+2021-01-19,151.90999574290564
+2021-01-20,150.18859269959444
+2021-01-21,150.58837652882704
+2021-01-22,150.1610299974291
+2021-01-25,148.43198046062756
+2021-01-26,146.4142728271127
+2021-01-27,147.4060661994084
+2021-01-28,147.91682782254182
+2021-01-29,148.36187866366905
+2021-02-01,145.8026960320513
+2021-02-02,144.5771425973022
+2021-02-03,146.45208564686604
+2021-02-04,144.25694196505398
+2021-02-05,145.9108349488237
+2021-02-08,148.37430276444428
+2021-02-09,150.9134576950188
+2021-02-10,153.4027393911127
+2021-02-11,151.4922299675735
+2021-02-12,150.89195611647244
+2021-02-15,151.88297530890728
+2021-02-16,155.23054320178755
+2021-02-17,156.1057074974582
+2021-02-18,155.02043166401788
+2021-02-19,153.5845020397861
+2021-02-22,157.48763479081907
+2021-02-23,157.85994557995207
+2021-02-24,159.1888062430284
+2021-02-25,158.17554725087837
+2021-02-26,158.15055302265588
+2021-03-01,159.5674804742942
+2021-03-02,160.1900873826261
+2021-03-03,160.08562468687117
+2021-03-04,160.1602589531345
+2021-03-05,161.65418705690564
+2021-03-08,162.3167132453884
+2021-03-09,159.94388348224868
+2021-03-10,161.1737992502411
+2021-03-11,162.0831780391402
+2021-03-12,157.9794988337152
+2021-03-15,155.48669516414753
+2021-03-16,158.45536332557953
+2021-03-17,156.75240087510207
+2021-03-18,154.83086335101112
+2021-03-19,153.1171777151545
+2021-03-22,151.02668345449771
+2021-03-23,148.39819004321149
+2021-03-24,150.91918442863596
+2021-03-25,152.04897453309874
+2021-03-26,154.70256263484566
+2021-03-29,156.87948334390924
+2021-03-30,154.2374634049835
+2021-03-31,152.09881377735528
+2021-04-01,152.87488644554884
+2021-04-02,150.6154748354444
+2021-04-05,151.2198544843627
+2021-04-06,150.31491137243822
+2021-04-07,152.33858087261692
+2021-04-08,156.00109819494847
+2021-04-09,157.47583285199434
+2021-04-12,159.6819887010525
+2021-04-13,161.61985777742086
+2021-04-14,165.0379331058107
+2021-04-15,165.23516558051787
+2021-04-16,161.24092646359236
+2021-04-19,162.8172404006371
+2021-04-20,160.05247404667662
+2021-04-21,160.5038126740238
+2021-04-22,159.31799631968718
+2021-04-23,158.11402306191653
+2021-04-26,158.61041506291363
+2021-04-27,158.40049239041358
+2021-04-28,155.37103351382072
+2021-04-29,156.38955391185706
+2021-04-30,157.74363967756491
+2021-05-03,155.21396567042552
+2021-05-04,154.39469818798
+2021-05-05,155.638205925254
+2021-05-06,153.42898696860934
+2021-05-07,152.4142114911641
+2021-05-10,154.0587789432937
+2021-05-11,154.8125550863202
+2021-05-12,154.45158295868998
+2021-05-13,154.529518725034
+2021-05-14,154.4070791903728
+2021-05-17,152.69104002018068
+2021-05-18,153.40221449724027
+2021-05-19,155.53592887438222
+2021-05-20,153.53502386894274
+2021-05-21,151.89708945465912
+2021-05-24,152.2000546458047
+2021-05-25,154.64400328017294
+2021-05-26,154.6992497494517
+2021-05-27,153.80748267965865
+2021-05-28,155.0235191672109
+2021-05-31,153.01461465088983
+2021-06-01,150.90199122100563
+2021-06-02,150.22903646171585
+2021-06-03,151.37760036889975
+2021-06-04,149.3136541740237
+2021-06-07,151.05529898418408
+2021-06-08,152.82501294687893
+2021-06-09,155.2000715613283
+2021-06-10,151.42431940769575
+2021-06-11,151.4888411291017
+2021-06-14,148.74411078050804
+2021-06-15,146.5402499471355
+2021-06-16,149.79262515323887
+2021-06-17,149.01194988621737
+2021-06-18,147.3300769266786
+2021-06-21,146.8542029544321
+2021-06-22,148.05153655548017
+2021-06-23,147.04531689275933
+2021-06-24,144.2716242853234
+2021-06-25,145.29517110074775
+2021-06-28,145.48672469895922
+2021-06-29,147.18768812091912
+2021-06-30,147.97036442494743
+2021-07-01,149.56032356850199
+2021-07-02,149.0063513166557
+2021-07-05,148.48547760520688
+2021-07-06,148.5500444967593
+2021-07-07,147.59486429897623
+2021-07-08,147.1475502990905
+2021-07-09,144.83542303731429
+2021-07-12,143.17447788204038
+2021-07-13,142.76504151372706
+2021-07-14,142.7874079868805
+2021-07-15,143.7827786264102
+2021-07-16,143.86634538162798
+2021-07-19,144.40391680970956
+2021-07-20,145.6343674664777
+2021-07-21,144.55155542260044
+2021-07-22,143.31631581523143
+2021-07-23,144.5800572613743
+2021-07-26,145.67901022449993
+2021-07-27,142.81648136184972
+2021-07-28,143.24375572343416
+2021-07-29,144.6186769754535
+2021-07-30,143.94563287976837
+2021-08-02,140.63926965557178
+2021-08-03,139.72218291323867
+2021-08-04,139.29847295553813
+2021-08-05,137.44224858101552
+2021-08-06,136.9839256577605
+2021-08-09,136.97690698416883
+2021-08-10,135.67250681708606
+2021-08-11,136.34908137347637
+2021-08-12,136.7418150493157
+2021-08-13,137.11976636590458
+2021-08-16,138.66875522520604
+2021-08-17,139.01395267053172
+2021-08-18,139.84077400136644
+2021-08-19,140.78482632399502
+2021-08-20,141.66225311371412
+2021-08-23,141.59334232981985
+2021-08-24,141.7967303361371
+2021-08-25,143.8307771275189
+2021-08-26,141.75630622218972
+2021-08-27,141.3363376127338
+2021-08-30,138.07487169444562
+2021-08-31,139.01893555952083
+2021-09-01,138.20704802275353
+2021-09-02,137.89191428253392
+2021-09-03,135.556183678608
+2021-09-06,134.26107710884523
+2021-09-07,134.18346681822777
+2021-09-08,136.53145052712875
+2021-09-09,137.3781114550703
+2021-09-10,138.2804073118152
+2021-09-13,137.79633586331911
+2021-09-14,138.76570834541906
+2021-09-15,137.62569871611134
+2021-09-16,138.32460278219946
+2021-09-17,141.9603336347065
+2021-09-20,143.24707066125893
+2021-09-21,144.37843180381705
+2021-09-22,146.96618976414572
+2021-09-23,150.7472882964089
+2021-09-24,152.22266695202126
+2021-09-27,149.10306054325108
+2021-09-28,149.92534217541248
+2021-09-29,151.9168237974689
+2021-09-30,152.99176057860663
+2021-10-01,151.1938021727859
+2021-10-04,151.6150390119523
+2021-10-05,152.12918030844546
+2021-10-06,151.32302582979037
+2021-10-07,153.4030247604489
+2021-10-08,155.00822876155965
+2021-10-11,152.52229165188817
+2021-10-12,154.05818145383807
+2021-10-13,157.28866389047
+2021-10-14,158.49026714407748
+2021-10-15,159.38238675500796
+2021-10-18,161.48402932799885
+2021-10-19,163.22673420682898
+2021-10-20,166.3005996031823
+2021-10-21,168.70697196493555
+2021-10-22,167.777522543303
+2021-10-25,167.26586838821584
+2021-10-26,170.38707040373666
+2021-10-27,171.4539033209494
+2021-10-28,172.4617039474729
+2021-10-29,172.90536482661733
+2021-11-01,171.50018511413404
+2021-11-02,177.19024840344287
+2021-11-03,173.27233053028021
+2021-11-04,175.3508408320722
+2021-11-05,175.27166877833946
+2021-11-08,177.83259796782684
+2021-11-09,178.18832911895095
+2021-11-10,174.133187163972
+2021-11-11,172.4975425437551
+2021-11-12,173.74826392447738
+2021-11-15,173.90059388560917
+2021-11-16,171.48627984887048
+2021-11-17,170.1941636023399
+2021-11-18,168.94824614904599
+2021-11-19,170.24198431747288
+2021-11-22,167.98552299820358
+2021-11-23,166.4123780519975
+2021-11-24,167.32332114024098
+2021-11-25,165.84938975265277
+2021-11-26,165.39426206690052
+2021-11-29,166.27534629864041
+2021-11-30,166.20458446029184
+2021-12-01,165.1291154795997
+2021-12-02,164.84187639931815
+2021-12-03,165.88174841483024
+2021-12-06,164.09258150417972
+2021-12-07,164.91093635904767
+2021-12-08,164.61466091105385
+2021-12-09,163.13445069597338
+2021-12-10,159.79866385593198
+2021-12-13,159.31344957405597
+2021-12-14,158.53014762069324
+2021-12-15,159.32008766328076
+2021-12-16,159.91597199979896
+2021-12-17,161.98216945670657
+2021-12-20,160.25623977156346
+2021-12-21,159.6744379650403
+2021-12-22,158.06197056075914
+2021-12-23,160.2786474251664
+2021-12-24,159.97466397363087
+2021-12-27,161.2787327668567
+2021-12-28,159.65223230167453
+2021-12-29,160.36552229181703
+2021-12-30,157.9469025582666
+2021-12-31,158.87708452000265
+2022-01-03,159.83594782526905
+2022-01-04,162.22791473029574
+2022-01-05,156.57882125864765
+2022-01-06,160.20800152626188
+2022-01-07,157.3465787105788
+2022-01-10,158.80452234806916
+2022-01-11,159.77615703166703
+2022-01-12,155.27485850983643
+2022-01-13,156.16458456406158
+2022-01-14,152.09620289653364
+2022-01-17,153.4627693462549
+2022-01-18,154.62395490336945
+2022-01-19,153.30800177211648
+2022-01-20,151.81076396682187
+2022-01-21,149.52593994401167
+2022-01-24,149.36424040356263
+2022-01-25,147.45149967277354
+2022-01-26,146.4006298065155
+2022-01-27,145.96715596186655
+2022-01-28,147.12428560493746
+2022-01-31,150.80207447764
+2022-02-01,152.019944018683
+2022-02-02,151.1923695763314
+2022-02-03,150.60787334596594
+2022-02-04,147.28358543029273
+2022-02-07,143.06625228888618
+2022-02-08,144.9400814745243
+2022-02-09,144.19750746418526
+2022-02-10,145.53668501761138
+2022-02-11,147.38899559779844
+2022-02-14,146.72565125462452
+2022-02-15,146.26501060359965
+2022-02-16,142.96931647806508
+2022-02-17,147.4602407160341
+2022-02-18,145.99370534969756
+2022-02-21,146.95303978539297
+2022-02-22,145.0087243845887
+2022-02-23,143.8024256006902
+2022-02-24,143.33506548192915
+2022-02-25,142.55124053904677
+2022-02-28,142.79349629024162
+2022-03-01,144.88793795577658
+2022-03-02,145.34551872273022
+2022-03-03,144.43602570120706
+2022-03-04,145.81116822068313
+2022-03-07,147.27292875733252
+2022-03-08,148.42965188384454
+2022-03-09,147.12856999868862
+2022-03-10,152.31856529785003
+2022-03-11,150.02022925887718
+2022-03-14,152.89603492703856
+2022-03-15,153.51141340093886
+2022-03-16,154.51888081074054
+2022-03-17,158.50015788082757
+2022-03-18,156.5418633629111
+2022-03-21,156.31968672972965
+2022-03-22,156.21273516573297
+2022-03-23,153.4318809216275
+2022-03-24,154.65142099594672
+2022-03-25,157.27292799637894
+2022-03-28,158.5022402379138
+2022-03-29,159.59397821638083
+2022-03-30,159.09342768027878
+2022-03-31,156.42830023315713
+2022-04-01,158.11667624515817
+2022-04-04,159.15890615662195
+2022-04-05,164.5136836710028
+2022-04-06,162.22693007725258
+2022-04-07,162.66947989419936
+2022-04-08,164.88422774727653
+2022-04-11,166.0425285374737
+2022-04-12,166.06175252709238
+2022-04-13,165.8947111555726
+2022-04-14,167.49109126314264
+2022-04-15,165.59286092893066
+2022-04-18,165.95151449960255
+2022-04-19,163.89683071659206
+2022-04-20,160.49076409094587
+2022-04-21,157.65566503343928
+2022-04-22,155.0051725526472
+2022-04-25,155.8425064120163
+2022-04-26,155.75881848712038
+2022-04-27,155.03125906850119
+2022-04-28,150.23864313267964
+2022-04-29,148.16235483223133
+2022-05-02,145.49700898247272
+2022-05-03,142.5257790026109
+2022-05-04,139.02318139865963
+2022-05-05,137.30025372773648
+2022-05-06,136.01343628440495
+2022-05-09,135.31193212780943
+2022-05-10,136.41812033447252
+2022-05-11,135.47179327538453
+2022-05-12,136.08336060696755
+2022-05-13,136.66062296305336
+2022-05-16,137.3513688905394
+2022-05-17,140.05250987968597
+2022-05-18,139.13960107361774
+2022-05-19,139.34887211687465
+2022-05-20,139.1975202400449
+2022-05-23,140.08839342627275
+2022-05-24,139.63265466868398
+2022-05-25,141.2537039040779
+2022-05-26,140.7199527034628
+2022-05-27,142.9493815837039
+2022-05-30,140.4517311580356
+2022-05-31,142.5008953873872
+2022-06-01,143.00864349150743
+2022-06-02,143.09528458933795
+2022-06-03,147.59502406073537
+2022-06-06,148.78232181128755
+2022-06-07,148.67737154146712
+2022-06-08,149.27594099096066
+2022-06-09,146.6543164003087
+2022-06-10,145.68924445807764
+2022-06-13,145.6851653511604
+2022-06-14,145.05302060854862
+2022-06-15,144.02463413601973
+2022-06-16,144.86715751452442
+2022-06-17,142.89994789418336
+2022-06-20,144.33713068426897
+2022-06-21,142.6472052139543
+2022-06-22,142.51531447804294
+2022-06-23,143.7260117902195
+2022-06-24,145.11937180979356
+2022-06-27,143.32664815026527
+2022-06-28,140.88744187041294
+2022-06-29,141.0328609647516
+2022-06-30,137.5179778929155
+2022-07-01,139.2586146016543
+2022-07-04,140.6676243929693
+2022-07-05,140.6747927967246
+2022-07-06,137.91220935386855
+2022-07-07,140.89663823212217
+2022-07-08,140.64186795381232
+2022-07-11,140.1733934876074
+2022-07-12,138.03929856448133
+2022-07-13,136.83565182604943
+2022-07-14,136.6345242079653
+2022-07-15,138.18191431142142
+2022-07-18,141.37760204168106
+2022-07-19,139.26259613301363
+2022-07-20,140.76393349081957
+2022-07-21,141.13374322230652
+2022-07-22,140.19211597824548
+2022-07-25,143.48349522779714
+2022-07-26,143.04531947567955
+2022-07-27,142.10737142791479
+2022-07-28,143.07519360165998
+2022-07-29,140.18461434009905
+2022-08-01,140.79772148122308
+2022-08-02,143.1675044148629
+2022-08-03,141.11406438108014
+2022-08-04,138.46487177214323
+2022-08-05,140.24747331254565
+2022-08-08,139.94548511022128
+2022-08-09,139.85438878807275
+2022-08-10,139.8478855347522
+2022-08-11,139.77277512998
+2022-08-12,142.77278802865663
+2022-08-15,142.52309740421478
+2022-08-16,139.57495606548238
+2022-08-17,140.40649272128732
+2022-08-18,141.69845070263045
+2022-08-19,143.3435853050383
+2022-08-22,144.95640516089912
+2022-08-23,144.21915365452136
+2022-08-24,145.47434334361756
+2022-08-25,145.56247081202255
+2022-08-26,148.24750762704346
+2022-08-29,147.70913628170524
+2022-08-30,147.96049037948163
+2022-08-31,149.9394531503616
+2022-09-01,148.48103175791803
+2022-09-02,146.29878796497817
+2022-09-05,145.00767974910113
+2022-09-06,146.28965884197964
+2022-09-07,149.04100671191688
+2022-09-08,150.328418987405
+2022-09-09,151.70339494239317
+2022-09-12,153.8342857442242
+2022-09-13,152.89058123707233
+2022-09-14,153.17740903291954
+2022-09-15,150.65152893471335
+2022-09-16,150.11475798835653
+2022-09-19,149.97111426133586
+2022-09-20,148.23706747869082
+2022-09-21,147.0879341886841
+2022-09-22,146.0763774253312
+2022-09-23,145.86323329691936
+2022-09-26,146.50252437355363
+2022-09-27,146.62450931534667
+2022-09-28,148.2944856742223
+2022-09-29,144.29918615631686
+2022-09-30,148.5887625885448
+2022-10-03,145.3711066338473
+2022-10-04,147.80910156284736
+2022-10-05,150.49815515398092
+2022-10-06,147.96933884261563
+2022-10-07,145.15943360149848
+2022-10-10,146.35390411727877
+2022-10-11,145.65804175559865
+2022-10-12,144.50865881537106
+2022-10-13,146.34999018764663
+2022-10-14,145.78415651613287
+2022-10-17,147.6440139001408
+2022-10-18,146.86759510212218
+2022-10-19,146.81193177319182
+2022-10-20,144.89945787601246
+2022-10-21,148.1529648181113
+2022-10-24,148.2036526131792
+2022-10-25,148.72580976097993
+2022-10-26,149.60336156138388
+2022-10-27,148.6164090143911
+2022-10-28,149.89828079735972
+2022-10-31,151.59479160151324
+2022-11-01,153.56839001833478
+2022-11-02,153.9866041475702
+2022-11-03,151.30836506475669
+2022-11-04,152.49915308033567
+2022-11-07,152.8974006558365
+2022-11-08,154.24795603335195
+2022-11-09,158.08605318948358
+2022-11-10,156.9231839540279
+2022-11-11,158.60270091891715
+2022-11-14,156.37594186253466
+2022-11-15,156.98031984209436
+2022-11-16,154.96292859340844
+2022-11-17,157.48887240388643
+2022-11-18,154.22153729581146
+2022-11-21,152.05741705853862
+2022-11-22,151.82496978314634
+2022-11-23,153.0491865897984
+2022-11-24,151.8997006893588
+2022-11-25,153.55259456333602
+2022-11-28,154.24517379497445
+2022-11-29,152.55821941171303
+2022-11-30,153.71123047018412
+2022-12-01,149.94153613835852
+2022-12-02,150.91165676924942
+2022-12-05,149.02178079338466
+2022-12-06,148.305436950502
+2022-12-07,147.78041217777067
+2022-12-08,150.68829669684592
+2022-12-09,151.21340806491406
+2022-12-12,149.3302462155408
+2022-12-13,151.61732639450864
+2022-12-14,153.56310464692376
+2022-12-15,153.06369282923734
+2022-12-16,152.27595383415016
+2022-12-19,150.40648806459785
+2022-12-20,151.5211831879499
+2022-12-21,151.31255469618137
+2022-12-22,147.9496645698576
+2022-12-23,149.83305328900528
+2022-12-26,147.3589167465064
+2022-12-27,145.8380679400836
+2022-12-28,144.9739333210546
+2022-12-29,146.6857032998683
+2022-12-30,147.45406554726998
+2023-01-02,145.6329455397621
+2023-01-03,143.29364209038064
+2023-01-04,142.94301063640907
+2023-01-05,142.1857511220911
+2023-01-06,140.68450811516368
+2023-01-09,142.2757858970623
+2023-01-10,142.56989176682592
+2023-01-11,144.19262959295793
+2023-01-12,143.96122935543895
+2023-01-13,144.10912606974827
+2023-01-16,142.59383161326915
+2023-01-17,140.8970814699272
+2023-01-18,138.44106332935138
+2023-01-19,138.14170963100705
+2023-01-20,137.9761577095077
+2023-01-23,138.4306864178525
+2023-01-24,137.33941703162762
+2023-01-25,136.64374318448725
+2023-01-26,137.87800564348112
+2023-01-27,137.48220032349514
+2023-01-30,136.3195414592559
+2023-01-31,138.34360975676177
+2023-02-01,138.26281048825345
+2023-02-02,136.41105110376287
+2023-02-03,134.3238774768594
+2023-02-06,134.32637087672333
+2023-02-07,134.66680811826456
+2023-02-08,134.73436727580966
+2023-02-09,135.20759914763528
+2023-02-10,135.65449572440295
+2023-02-13,135.0971314744432
+2023-02-14,132.8443226392141
+2023-02-15,132.7338912774094
+2023-02-16,130.0197824995348
+2023-02-17,130.6477093349939
+2023-02-20,131.64803217960787
+2023-02-21,129.98994771489637
+2023-02-22,128.68573021228318
+2023-02-23,128.5035647780366
+2023-02-24,129.4133490201433
+2023-02-27,127.10095556006904
+2023-02-28,129.00144477205706
+2023-03-01,128.60864715699964
+2023-03-02,129.16001329608756
+2023-03-03,130.80822689646163
+2023-03-06,129.81799849469587
+2023-03-07,131.87839974175319
+2023-03-08,130.46164870634942
+2023-03-09,129.34108272908423
+2023-03-10,128.9943144287916
+2023-03-13,127.64278306057612
+2023-03-14,126.598675198041
+2023-03-15,127.07652658899265
+2023-03-16,124.57141995902575
+2023-03-17,127.01264991190229
+2023-03-20,129.41152486494641
+2023-03-21,126.67828708355657
+2023-03-22,126.31898279865514
+2023-03-23,127.08972517316424
+2023-03-24,127.93425269852752
+2023-03-27,126.93758923693565
+2023-03-28,124.50196642198233
+2023-03-29,124.12958139817032
+2023-03-30,120.98172947685795
+2023-03-31,121.91451035761793
+2023-04-03,123.2732014372364
+2023-04-04,122.81366891364381
+2023-04-05,123.66384511904968
+2023-04-06,122.58349755759819
+2023-04-07,122.3711296394041
+2023-04-10,121.82903098570246
+2023-04-11,119.61215495005217
+2023-04-12,117.09434691088228
+2023-04-13,116.08483434421564
+2023-04-14,116.68638604992223
+2023-04-17,118.24053402399548
+2023-04-18,117.61933573726138
+2023-04-19,121.82466776802326
+2023-04-20,121.64930848248972
+2023-04-21,118.65643643020461
+2023-04-24,119.17406927695077
+2023-04-25,119.40619745130712
+2023-04-26,117.7638255624095
+2023-04-27,115.46649557565377
+2023-04-28,115.26439832900405
+2023-05-01,114.32310257307847
+2023-05-02,114.62953042068482
+2023-05-03,113.87667565757566
+2023-05-04,115.91414954316322
+2023-05-05,116.07764921782353
+2023-05-08,116.64567057117598
+2023-05-09,114.92813048632316
+2023-05-10,113.45920476285465
+2023-05-11,115.06362132934764
+2023-05-12,112.83664726562228
+2023-05-15,111.47626686083973
+2023-05-16,111.6258936661087
+2023-05-17,114.13519616073229
+2023-05-18,114.59172231919301
+2023-05-19,117.1683218242539
+2023-05-22,116.86297798996802
+2023-05-23,118.22518252323653
+2023-05-24,116.91421838810302
+2023-05-25,114.74488867569299
+2023-05-26,115.3298694638784
+2023-05-29,116.3758516225258
+2023-05-30,114.96007651766334
+2023-05-31,115.26049289705864
+2023-06-01,115.84661296963328
+2023-06-02,115.46439084769786
+2023-06-05,114.87142265394594
+2023-06-06,112.93306021992231
+2023-06-07,111.1229493623187
+2023-06-08,112.16548671734353
+2023-06-09,113.36568041910485
+2023-06-12,114.65347370398796
+2023-06-13,114.42498739175086
+2023-06-14,113.70910966176821
+2023-06-15,113.20080252320004
+2023-06-16,110.93715459430067
+2023-06-19,110.26475312241438
+2023-06-20,110.15176804951827
+2023-06-21,110.79564682843296
+2023-06-22,110.42719721894998
+2023-06-23,109.28416949291272
+2023-06-26,107.56578165268937
+2023-06-27,106.84551022034066
+2023-06-28,108.75169919048484
+2023-06-29,107.62628167462933
+2023-06-30,105.72216183499386
+2023-07-03,105.68184035514005
+2023-07-04,106.36849391113232
+2023-07-05,107.66107999472847
+2023-07-06,107.67198903706196
+2023-07-07,106.97659095057317
+2023-07-10,108.57794963471741
+2023-07-11,107.81372715644176
+2023-07-12,106.44691005754296
+2023-07-13,104.48014519678249
+2023-07-14,103.5194432178588
+2023-07-17,105.08946115206656
+2023-07-18,104.10577531778402
+2023-07-19,102.08982546663154
+2023-07-20,99.40494237210909
+2023-07-21,99.78402345195869
+2023-07-24,99.76586624207985
+2023-07-25,99.84808001375052
+2023-07-26,100.01507622035541
+2023-07-27,101.42896388054818
+2023-07-28,100.12069156507684
+2023-07-31,100.36333378336155
+2023-08-01,100.00987880378062
+2023-08-02,101.26265975794068
+2023-08-03,100.80990834986542
+2023-08-04,100.15851670819104
+2023-08-07,100.03881543855361
+2023-08-08,100.75368331632701
+2023-08-09,100.73502537651197
+2023-08-10,99.28993620365094
+2023-08-11,98.03267346766646
+2023-08-14,97.63074671474679
+2023-08-15,95.19955796477767
+2023-08-16,93.63984035475414
+2023-08-17,93.23959488055276
+2023-08-18,93.82243285044053
+2023-08-21,93.93046231318203
+2023-08-22,94.47071658207716
+2023-08-23,96.5125094884775
+2023-08-24,96.09918437216697
+2023-08-25,98.46229019855772
+2023-08-28,97.37321792353009
+2023-08-29,96.62909541160901
+2023-08-30,94.49645775055795
+2023-08-31,94.09491296028709
+2023-09-01,94.36403095154961
+2023-09-04,94.01944806325682
+2023-09-05,94.78744066687547
+2023-09-06,94.72639891270013
+2023-09-07,94.57800481598153
+2023-09-08,94.26427916072976
+2023-09-11,95.72517810043519
+2023-09-12,96.54792188580271
+2023-09-13,97.60626883178992
+2023-09-14,96.95122852201942
+2023-09-15,95.5048075764875
+2023-09-18,93.80413965179079
+2023-09-19,93.05659076183758
+2023-09-20,92.73709252387009
+2023-09-21,91.38489477767664
+2023-09-22,90.91834042973404
+2023-09-25,92.33930327234047
+2023-09-26,90.76331056673128
+2023-09-27,91.5815752078348
+2023-09-28,92.29723823571311
+2023-09-29,93.06829582749342
+2023-10-02,94.0812809556984
+2023-10-03,93.48875630912696
+2023-10-04,91.88200255940929
+2023-10-05,91.138593602501
+2023-10-06,93.34779907043965
+2023-10-09,95.14687338554093
+2023-10-10,94.6563905707351
+2023-10-11,95.65634115157148
+2023-10-12,93.8454133242883
+2023-10-13,94.65565232917115
+2023-10-16,94.8123558971576
+2023-10-17,95.89941159998419
+2023-10-18,96.63076671862908
+2023-10-19,97.16051329374653
+2023-10-20,98.17750722999536
+2023-10-23,97.66410759453126
+2023-10-24,98.17079487949295
+2023-10-25,95.99500708510683
+2023-10-26,96.33701795699832
+2023-10-27,94.83405847810222
+2023-10-30,95.68491734707756
+2023-10-31,95.90164992956683
diff --git a/poetry.lock b/poetry.lock
index 5591325..d82efa0 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -1,5 +1,29 @@
# This file is automatically @generated by Poetry 2.1.2 and should not be changed by hand.
+[[package]]
+name = "alabaster"
+version = "0.7.16"
+description = "A light, configurable Sphinx theme"
+optional = false
+python-versions = ">=3.9"
+groups = ["docs"]
+files = [
+ {file = "alabaster-0.7.16-py3-none-any.whl", hash = "sha256:b46733c07dce03ae4e150330b975c75737fa60f0a7c591b6c8bf4928a28e2c92"},
+ {file = "alabaster-0.7.16.tar.gz", hash = "sha256:75a8b99c28a5dad50dd7f8ccdd447a121ddb3892da9e53d1ca5cca3106d58d65"},
+]
+
+[[package]]
+name = "astroid"
+version = "3.3.9"
+description = "An abstract syntax tree for Python with inference support."
+optional = false
+python-versions = ">=3.9.0"
+groups = ["dev"]
+files = [
+ {file = "astroid-3.3.9-py3-none-any.whl", hash = "sha256:d05bfd0acba96a7bd43e222828b7d9bc1e138aaeb0649707908d3702a9831248"},
+ {file = "astroid-3.3.9.tar.gz", hash = "sha256:622cc8e3048684aa42c820d9d218978021c3c3d174fb03a9f0d615921744f550"},
+]
+
[[package]]
name = "asttokens"
version = "3.0.0"
@@ -16,6 +40,21 @@ files = [
astroid = ["astroid (>=2,<4)"]
test = ["astroid (>=2,<4)", "pytest", "pytest-cov", "pytest-xdist"]
+[[package]]
+name = "babel"
+version = "2.17.0"
+description = "Internationalization utilities"
+optional = false
+python-versions = ">=3.8"
+groups = ["docs"]
+files = [
+ {file = "babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2"},
+ {file = "babel-2.17.0.tar.gz", hash = "sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d"},
+]
+
+[package.extras]
+dev = ["backports.zoneinfo ; python_version < \"3.9\"", "freezegun (>=1.0,<2.0)", "jinja2 (>=3.0)", "pytest (>=6.0)", "pytest-cov", "pytz", "setuptools", "tzdata ; sys_platform == \"win32\""]
+
[[package]]
name = "beautifulsoup4"
version = "4.13.4"
@@ -39,6 +78,51 @@ charset-normalizer = ["charset-normalizer"]
html5lib = ["html5lib"]
lxml = ["lxml"]
+[[package]]
+name = "black"
+version = "24.10.0"
+description = "The uncompromising code formatter."
+optional = false
+python-versions = ">=3.9"
+groups = ["dev"]
+files = [
+ {file = "black-24.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e6668650ea4b685440857138e5fe40cde4d652633b1bdffc62933d0db4ed9812"},
+ {file = "black-24.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1c536fcf674217e87b8cc3657b81809d3c085d7bf3ef262ead700da345bfa6ea"},
+ {file = "black-24.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:649fff99a20bd06c6f727d2a27f401331dc0cc861fb69cde910fe95b01b5928f"},
+ {file = "black-24.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:fe4d6476887de70546212c99ac9bd803d90b42fc4767f058a0baa895013fbb3e"},
+ {file = "black-24.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5a2221696a8224e335c28816a9d331a6c2ae15a2ee34ec857dcf3e45dbfa99ad"},
+ {file = "black-24.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f9da3333530dbcecc1be13e69c250ed8dfa67f43c4005fb537bb426e19200d50"},
+ {file = "black-24.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4007b1393d902b48b36958a216c20c4482f601569d19ed1df294a496eb366392"},
+ {file = "black-24.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:394d4ddc64782e51153eadcaaca95144ac4c35e27ef9b0a42e121ae7e57a9175"},
+ {file = "black-24.10.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b5e39e0fae001df40f95bd8cc36b9165c5e2ea88900167bddf258bacef9bbdc3"},
+ {file = "black-24.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d37d422772111794b26757c5b55a3eade028aa3fde43121ab7b673d050949d65"},
+ {file = "black-24.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:14b3502784f09ce2443830e3133dacf2c0110d45191ed470ecb04d0f5f6fcb0f"},
+ {file = "black-24.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:30d2c30dc5139211dda799758559d1b049f7f14c580c409d6ad925b74a4208a8"},
+ {file = "black-24.10.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1cbacacb19e922a1d75ef2b6ccaefcd6e93a2c05ede32f06a21386a04cedb981"},
+ {file = "black-24.10.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1f93102e0c5bb3907451063e08b9876dbeac810e7da5a8bfb7aeb5a9ef89066b"},
+ {file = "black-24.10.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ddacb691cdcdf77b96f549cf9591701d8db36b2f19519373d60d31746068dbf2"},
+ {file = "black-24.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:680359d932801c76d2e9c9068d05c6b107f2584b2a5b88831c83962eb9984c1b"},
+ {file = "black-24.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:17374989640fbca88b6a448129cd1745c5eb8d9547b464f281b251dd00155ccd"},
+ {file = "black-24.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:63f626344343083322233f175aaf372d326de8436f5928c042639a4afbbf1d3f"},
+ {file = "black-24.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfa1d0cb6200857f1923b602f978386a3a2758a65b52e0950299ea014be6800"},
+ {file = "black-24.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:2cd9c95431d94adc56600710f8813ee27eea544dd118d45896bb734e9d7a0dc7"},
+ {file = "black-24.10.0-py3-none-any.whl", hash = "sha256:3bb2b7a1f7b685f85b11fed1ef10f8a9148bceb49853e47a294a3dd963c1dd7d"},
+ {file = "black-24.10.0.tar.gz", hash = "sha256:846ea64c97afe3bc677b761787993be4991810ecc7a4a937816dd6bddedc4875"},
+]
+
+[package.dependencies]
+click = ">=8.0.0"
+mypy-extensions = ">=0.4.3"
+packaging = ">=22.0"
+pathspec = ">=0.9.0"
+platformdirs = ">=2"
+
+[package.extras]
+colorama = ["colorama (>=0.4.3)"]
+d = ["aiohttp (>=3.10)"]
+jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"]
+uvloop = ["uvloop (>=0.15.2)"]
+
[[package]]
name = "brotli"
version = "1.1.0"
@@ -222,7 +306,7 @@ version = "2025.1.31"
description = "Python package for providing Mozilla's CA Bundle."
optional = false
python-versions = ">=3.6"
-groups = ["main"]
+groups = ["main", "docs"]
files = [
{file = "certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe"},
{file = "certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651"},
@@ -314,7 +398,7 @@ version = "3.4.1"
description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet."
optional = false
python-versions = ">=3.7"
-groups = ["main"]
+groups = ["main", "docs"]
files = [
{file = "charset_normalizer-3.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de"},
{file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176"},
@@ -416,7 +500,7 @@ version = "8.1.8"
description = "Composable command line interface toolkit"
optional = false
python-versions = ">=3.7"
-groups = ["main"]
+groups = ["main", "dev"]
files = [
{file = "click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2"},
{file = "click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a"},
@@ -431,12 +515,12 @@ version = "0.4.6"
description = "Cross-platform colored terminal text."
optional = false
python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7"
-groups = ["main", "dev"]
+groups = ["main", "dev", "docs"]
files = [
{file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"},
{file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"},
]
-markers = {main = "platform_system == \"Windows\" or sys_platform == \"win32\"", dev = "sys_platform == \"win32\""}
+markers = {main = "platform_system == \"Windows\" or sys_platform == \"win32\"", dev = "platform_system == \"Windows\" or sys_platform == \"win32\"", docs = "sys_platform == \"win32\""}
[[package]]
name = "contourpy"
@@ -512,6 +596,82 @@ mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.11.1)", "types-Pil
test = ["Pillow", "contourpy[test-no-images]", "matplotlib"]
test-no-images = ["pytest", "pytest-cov", "pytest-rerunfailures", "pytest-xdist", "wurlitzer"]
+[[package]]
+name = "coverage"
+version = "7.8.0"
+description = "Code coverage measurement for Python"
+optional = false
+python-versions = ">=3.9"
+groups = ["dev"]
+files = [
+ {file = "coverage-7.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2931f66991175369859b5fd58529cd4b73582461877ecfd859b6549869287ffe"},
+ {file = "coverage-7.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:52a523153c568d2c0ef8826f6cc23031dc86cffb8c6aeab92c4ff776e7951b28"},
+ {file = "coverage-7.8.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c8a5c139aae4c35cbd7cadca1df02ea8cf28a911534fc1b0456acb0b14234f3"},
+ {file = "coverage-7.8.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5a26c0c795c3e0b63ec7da6efded5f0bc856d7c0b24b2ac84b4d1d7bc578d676"},
+ {file = "coverage-7.8.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:821f7bcbaa84318287115d54becb1915eece6918136c6f91045bb84e2f88739d"},
+ {file = "coverage-7.8.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a321c61477ff8ee705b8a5fed370b5710c56b3a52d17b983d9215861e37b642a"},
+ {file = "coverage-7.8.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:ed2144b8a78f9d94d9515963ed273d620e07846acd5d4b0a642d4849e8d91a0c"},
+ {file = "coverage-7.8.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:042e7841a26498fff7a37d6fda770d17519982f5b7d8bf5278d140b67b61095f"},
+ {file = "coverage-7.8.0-cp310-cp310-win32.whl", hash = "sha256:f9983d01d7705b2d1f7a95e10bbe4091fabc03a46881a256c2787637b087003f"},
+ {file = "coverage-7.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:5a570cd9bd20b85d1a0d7b009aaf6c110b52b5755c17be6962f8ccd65d1dbd23"},
+ {file = "coverage-7.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e7ac22a0bb2c7c49f441f7a6d46c9c80d96e56f5a8bc6972529ed43c8b694e27"},
+ {file = "coverage-7.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bf13d564d310c156d1c8e53877baf2993fb3073b2fc9f69790ca6a732eb4bfea"},
+ {file = "coverage-7.8.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5761c70c017c1b0d21b0815a920ffb94a670c8d5d409d9b38857874c21f70d7"},
+ {file = "coverage-7.8.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5ff52d790c7e1628241ffbcaeb33e07d14b007b6eb00a19320c7b8a7024c040"},
+ {file = "coverage-7.8.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d39fc4817fd67b3915256af5dda75fd4ee10621a3d484524487e33416c6f3543"},
+ {file = "coverage-7.8.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b44674870709017e4b4036e3d0d6c17f06a0e6d4436422e0ad29b882c40697d2"},
+ {file = "coverage-7.8.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8f99eb72bf27cbb167b636eb1726f590c00e1ad375002230607a844d9e9a2318"},
+ {file = "coverage-7.8.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b571bf5341ba8c6bc02e0baeaf3b061ab993bf372d982ae509807e7f112554e9"},
+ {file = "coverage-7.8.0-cp311-cp311-win32.whl", hash = "sha256:e75a2ad7b647fd8046d58c3132d7eaf31b12d8a53c0e4b21fa9c4d23d6ee6d3c"},
+ {file = "coverage-7.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:3043ba1c88b2139126fc72cb48574b90e2e0546d4c78b5299317f61b7f718b78"},
+ {file = "coverage-7.8.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:bbb5cc845a0292e0c520656d19d7ce40e18d0e19b22cb3e0409135a575bf79fc"},
+ {file = "coverage-7.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4dfd9a93db9e78666d178d4f08a5408aa3f2474ad4d0e0378ed5f2ef71640cb6"},
+ {file = "coverage-7.8.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f017a61399f13aa6d1039f75cd467be388d157cd81f1a119b9d9a68ba6f2830d"},
+ {file = "coverage-7.8.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0915742f4c82208ebf47a2b154a5334155ed9ef9fe6190674b8a46c2fb89cb05"},
+ {file = "coverage-7.8.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a40fcf208e021eb14b0fac6bdb045c0e0cab53105f93ba0d03fd934c956143a"},
+ {file = "coverage-7.8.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a1f406a8e0995d654b2ad87c62caf6befa767885301f3b8f6f73e6f3c31ec3a6"},
+ {file = "coverage-7.8.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:77af0f6447a582fdc7de5e06fa3757a3ef87769fbb0fdbdeba78c23049140a47"},
+ {file = "coverage-7.8.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f2d32f95922927186c6dbc8bc60df0d186b6edb828d299ab10898ef3f40052fe"},
+ {file = "coverage-7.8.0-cp312-cp312-win32.whl", hash = "sha256:769773614e676f9d8e8a0980dd7740f09a6ea386d0f383db6821df07d0f08545"},
+ {file = "coverage-7.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:e5d2b9be5b0693cf21eb4ce0ec8d211efb43966f6657807f6859aab3814f946b"},
+ {file = "coverage-7.8.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5ac46d0c2dd5820ce93943a501ac5f6548ea81594777ca585bf002aa8854cacd"},
+ {file = "coverage-7.8.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:771eb7587a0563ca5bb6f622b9ed7f9d07bd08900f7589b4febff05f469bea00"},
+ {file = "coverage-7.8.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42421e04069fb2cbcbca5a696c4050b84a43b05392679d4068acbe65449b5c64"},
+ {file = "coverage-7.8.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:554fec1199d93ab30adaa751db68acec2b41c5602ac944bb19187cb9a41a8067"},
+ {file = "coverage-7.8.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5aaeb00761f985007b38cf463b1d160a14a22c34eb3f6a39d9ad6fc27cb73008"},
+ {file = "coverage-7.8.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:581a40c7b94921fffd6457ffe532259813fc68eb2bdda60fa8cc343414ce3733"},
+ {file = "coverage-7.8.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:f319bae0321bc838e205bf9e5bc28f0a3165f30c203b610f17ab5552cff90323"},
+ {file = "coverage-7.8.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:04bfec25a8ef1c5f41f5e7e5c842f6b615599ca8ba8391ec33a9290d9d2db3a3"},
+ {file = "coverage-7.8.0-cp313-cp313-win32.whl", hash = "sha256:dd19608788b50eed889e13a5d71d832edc34fc9dfce606f66e8f9f917eef910d"},
+ {file = "coverage-7.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:a9abbccd778d98e9c7e85038e35e91e67f5b520776781d9a1e2ee9d400869487"},
+ {file = "coverage-7.8.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:18c5ae6d061ad5b3e7eef4363fb27a0576012a7447af48be6c75b88494c6cf25"},
+ {file = "coverage-7.8.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:95aa6ae391a22bbbce1b77ddac846c98c5473de0372ba5c463480043a07bff42"},
+ {file = "coverage-7.8.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e013b07ba1c748dacc2a80e69a46286ff145935f260eb8c72df7185bf048f502"},
+ {file = "coverage-7.8.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d766a4f0e5aa1ba056ec3496243150698dc0481902e2b8559314368717be82b1"},
+ {file = "coverage-7.8.0-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad80e6b4a0c3cb6f10f29ae4c60e991f424e6b14219d46f1e7d442b938ee68a4"},
+ {file = "coverage-7.8.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b87eb6fc9e1bb8f98892a2458781348fa37e6925f35bb6ceb9d4afd54ba36c73"},
+ {file = "coverage-7.8.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:d1ba00ae33be84066cfbe7361d4e04dec78445b2b88bdb734d0d1cbab916025a"},
+ {file = "coverage-7.8.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f3c38e4e5ccbdc9198aecc766cedbb134b2d89bf64533973678dfcf07effd883"},
+ {file = "coverage-7.8.0-cp313-cp313t-win32.whl", hash = "sha256:379fe315e206b14e21db5240f89dc0774bdd3e25c3c58c2c733c99eca96f1ada"},
+ {file = "coverage-7.8.0-cp313-cp313t-win_amd64.whl", hash = "sha256:2e4b6b87bb0c846a9315e3ab4be2d52fac905100565f4b92f02c445c8799e257"},
+ {file = "coverage-7.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fa260de59dfb143af06dcf30c2be0b200bed2a73737a8a59248fcb9fa601ef0f"},
+ {file = "coverage-7.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:96121edfa4c2dfdda409877ea8608dd01de816a4dc4a0523356067b305e4e17a"},
+ {file = "coverage-7.8.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b8af63b9afa1031c0ef05b217faa598f3069148eeee6bb24b79da9012423b82"},
+ {file = "coverage-7.8.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:89b1f4af0d4afe495cd4787a68e00f30f1d15939f550e869de90a86efa7e0814"},
+ {file = "coverage-7.8.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94ec0be97723ae72d63d3aa41961a0b9a6f5a53ff599813c324548d18e3b9e8c"},
+ {file = "coverage-7.8.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8a1d96e780bdb2d0cbb297325711701f7c0b6f89199a57f2049e90064c29f6bd"},
+ {file = "coverage-7.8.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:f1d8a2a57b47142b10374902777e798784abf400a004b14f1b0b9eaf1e528ba4"},
+ {file = "coverage-7.8.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:cf60dd2696b457b710dd40bf17ad269d5f5457b96442f7f85722bdb16fa6c899"},
+ {file = "coverage-7.8.0-cp39-cp39-win32.whl", hash = "sha256:be945402e03de47ba1872cd5236395e0f4ad635526185a930735f66710e1bd3f"},
+ {file = "coverage-7.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:90e7fbc6216ecaffa5a880cdc9c77b7418c1dcb166166b78dbc630d07f278cc3"},
+ {file = "coverage-7.8.0-pp39.pp310.pp311-none-any.whl", hash = "sha256:b8194fb8e50d556d5849753de991d390c5a1edeeba50f68e3a9253fbd8bf8ccd"},
+ {file = "coverage-7.8.0-py3-none-any.whl", hash = "sha256:dbf364b4c5e7bae9250528167dfe40219b62e2d573c854d74be213e1e52069f7"},
+ {file = "coverage-7.8.0.tar.gz", hash = "sha256:7a3d62b3b03b4b6fd41a085f3574874cf946cb4604d2b4d3e8dca8cd570ca501"},
+]
+
+[package.extras]
+toml = ["tomli ; python_full_version <= \"3.11.0a6\""]
+
[[package]]
name = "cssselect2"
version = "0.8.0"
@@ -560,6 +720,34 @@ files = [
{file = "decorator-5.2.1.tar.gz", hash = "sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360"},
]
+[[package]]
+name = "dill"
+version = "0.4.0"
+description = "serialize all of Python"
+optional = false
+python-versions = ">=3.8"
+groups = ["dev"]
+files = [
+ {file = "dill-0.4.0-py3-none-any.whl", hash = "sha256:44f54bf6412c2c8464c14e8243eb163690a9800dbe2c367330883b19c7561049"},
+ {file = "dill-0.4.0.tar.gz", hash = "sha256:0633f1d2df477324f53a895b02c901fb961bdbf65a17122586ea7019292cbcf0"},
+]
+
+[package.extras]
+graph = ["objgraph (>=1.7.2)"]
+profile = ["gprof2dot (>=2022.7.29)"]
+
+[[package]]
+name = "docutils"
+version = "0.20.1"
+description = "Docutils -- Python Documentation Utilities"
+optional = false
+python-versions = ">=3.7"
+groups = ["docs"]
+files = [
+ {file = "docutils-0.20.1-py3-none-any.whl", hash = "sha256:96f387a2c5562db4476f09f13bbab2192e764cac08ebbf3a34a95d9b1e4a59d6"},
+ {file = "docutils-0.20.1.tar.gz", hash = "sha256:f08a4e276c3a1583a86dce3e34aba3fe04d02bba2dd51ed16106244e8a923e3b"},
+]
+
[[package]]
name = "executing"
version = "2.2.0"
@@ -797,7 +985,7 @@ version = "3.10"
description = "Internationalized Domain Names in Applications (IDNA)"
optional = false
python-versions = ">=3.6"
-groups = ["main"]
+groups = ["main", "docs"]
files = [
{file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"},
{file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"},
@@ -806,6 +994,18 @@ files = [
[package.extras]
all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"]
+[[package]]
+name = "imagesize"
+version = "1.4.1"
+description = "Getting image size from png/jpeg/jpeg2000/gif file"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+groups = ["docs"]
+files = [
+ {file = "imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b"},
+ {file = "imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a"},
+]
+
[[package]]
name = "iniconfig"
version = "2.1.0"
@@ -866,6 +1066,21 @@ files = [
[package.dependencies]
pygments = "*"
+[[package]]
+name = "isort"
+version = "5.13.2"
+description = "A Python utility / library to sort Python imports."
+optional = false
+python-versions = ">=3.8.0"
+groups = ["dev"]
+files = [
+ {file = "isort-5.13.2-py3-none-any.whl", hash = "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6"},
+ {file = "isort-5.13.2.tar.gz", hash = "sha256:48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109"},
+]
+
+[package.extras]
+colors = ["colorama (>=0.4.6)"]
+
[[package]]
name = "jedi"
version = "0.19.2"
@@ -886,6 +1101,24 @@ docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alab
qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"]
testing = ["Django", "attrs", "colorama", "docopt", "pytest (<9.0.0)"]
+[[package]]
+name = "jinja2"
+version = "3.1.6"
+description = "A very fast and expressive template engine."
+optional = false
+python-versions = ">=3.7"
+groups = ["docs"]
+files = [
+ {file = "jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67"},
+ {file = "jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d"},
+]
+
+[package.dependencies]
+MarkupSafe = ">=2.0"
+
+[package.extras]
+i18n = ["Babel (>=2.7)"]
+
[[package]]
name = "kiwisolver"
version = "1.4.8"
@@ -998,7 +1231,7 @@ version = "3.0.0"
description = "Python port of markdown-it. Markdown parsing, done right!"
optional = false
python-versions = ">=3.8"
-groups = ["main"]
+groups = ["main", "docs"]
files = [
{file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"},
{file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"},
@@ -1017,6 +1250,77 @@ profiling = ["gprof2dot"]
rtd = ["jupyter_sphinx", "mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"]
testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"]
+[[package]]
+name = "markupsafe"
+version = "3.0.2"
+description = "Safely add untrusted strings to HTML/XML markup."
+optional = false
+python-versions = ">=3.9"
+groups = ["docs"]
+files = [
+ {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8"},
+ {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158"},
+ {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579"},
+ {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d"},
+ {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb"},
+ {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b"},
+ {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c"},
+ {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171"},
+ {file = "MarkupSafe-3.0.2-cp310-cp310-win32.whl", hash = "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50"},
+ {file = "MarkupSafe-3.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a"},
+ {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d"},
+ {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93"},
+ {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832"},
+ {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84"},
+ {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca"},
+ {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798"},
+ {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e"},
+ {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4"},
+ {file = "MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d"},
+ {file = "MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b"},
+ {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf"},
+ {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225"},
+ {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028"},
+ {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8"},
+ {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c"},
+ {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557"},
+ {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22"},
+ {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48"},
+ {file = "MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30"},
+ {file = "MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f"},
+ {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a"},
+ {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff"},
+ {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13"},
+ {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144"},
+ {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29"},
+ {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0"},
+ {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0"},
+ {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178"},
+ {file = "MarkupSafe-3.0.2-cp39-cp39-win32.whl", hash = "sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f"},
+ {file = "MarkupSafe-3.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a"},
+ {file = "markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0"},
+]
+
[[package]]
name = "matplotlib"
version = "3.10.1"
@@ -1090,13 +1394,45 @@ files = [
[package.dependencies]
traitlets = "*"
+[[package]]
+name = "mccabe"
+version = "0.7.0"
+description = "McCabe checker, plugin for flake8"
+optional = false
+python-versions = ">=3.6"
+groups = ["dev"]
+files = [
+ {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"},
+ {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"},
+]
+
+[[package]]
+name = "mdit-py-plugins"
+version = "0.4.2"
+description = "Collection of plugins for markdown-it-py"
+optional = false
+python-versions = ">=3.8"
+groups = ["docs"]
+files = [
+ {file = "mdit_py_plugins-0.4.2-py3-none-any.whl", hash = "sha256:0c673c3f889399a33b95e88d2f0d111b4447bdfea7f237dab2d488f459835636"},
+ {file = "mdit_py_plugins-0.4.2.tar.gz", hash = "sha256:5f2cd1fdb606ddf152d37ec30e46101a60512bc0e5fa1a7002c36647b09e26b5"},
+]
+
+[package.dependencies]
+markdown-it-py = ">=1.0.0,<4.0.0"
+
+[package.extras]
+code-style = ["pre-commit"]
+rtd = ["myst-parser", "sphinx-book-theme"]
+testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"]
+
[[package]]
name = "mdurl"
version = "0.1.2"
description = "Markdown URL utilities"
optional = false
python-versions = ">=3.7"
-groups = ["main"]
+groups = ["main", "docs"]
files = [
{file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"},
{file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"},
@@ -1114,6 +1450,98 @@ files = [
{file = "multitasking-0.0.11.tar.gz", hash = "sha256:4d6bc3cc65f9b2dca72fb5a787850a88dae8f620c2b36ae9b55248e51bcd6026"},
]
+[[package]]
+name = "mypy"
+version = "1.15.0"
+description = "Optional static typing for Python"
+optional = false
+python-versions = ">=3.9"
+groups = ["dev"]
+files = [
+ {file = "mypy-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:979e4e1a006511dacf628e36fadfecbcc0160a8af6ca7dad2f5025529e082c13"},
+ {file = "mypy-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c4bb0e1bd29f7d34efcccd71cf733580191e9a264a2202b0239da95984c5b559"},
+ {file = "mypy-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:be68172e9fd9ad8fb876c6389f16d1c1b5f100ffa779f77b1fb2176fcc9ab95b"},
+ {file = "mypy-1.15.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c7be1e46525adfa0d97681432ee9fcd61a3964c2446795714699a998d193f1a3"},
+ {file = "mypy-1.15.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:2e2c2e6d3593f6451b18588848e66260ff62ccca522dd231cd4dd59b0160668b"},
+ {file = "mypy-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:6983aae8b2f653e098edb77f893f7b6aca69f6cffb19b2cc7443f23cce5f4828"},
+ {file = "mypy-1.15.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2922d42e16d6de288022e5ca321cd0618b238cfc5570e0263e5ba0a77dbef56f"},
+ {file = "mypy-1.15.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2ee2d57e01a7c35de00f4634ba1bbf015185b219e4dc5909e281016df43f5ee5"},
+ {file = "mypy-1.15.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:973500e0774b85d9689715feeffcc980193086551110fd678ebe1f4342fb7c5e"},
+ {file = "mypy-1.15.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5a95fb17c13e29d2d5195869262f8125dfdb5c134dc8d9a9d0aecf7525b10c2c"},
+ {file = "mypy-1.15.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1905f494bfd7d85a23a88c5d97840888a7bd516545fc5aaedff0267e0bb54e2f"},
+ {file = "mypy-1.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:c9817fa23833ff189db061e6d2eff49b2f3b6ed9856b4a0a73046e41932d744f"},
+ {file = "mypy-1.15.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:aea39e0583d05124836ea645f412e88a5c7d0fd77a6d694b60d9b6b2d9f184fd"},
+ {file = "mypy-1.15.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2f2147ab812b75e5b5499b01ade1f4a81489a147c01585cda36019102538615f"},
+ {file = "mypy-1.15.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ce436f4c6d218a070048ed6a44c0bbb10cd2cc5e272b29e7845f6a2f57ee4464"},
+ {file = "mypy-1.15.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8023ff13985661b50a5928fc7a5ca15f3d1affb41e5f0a9952cb68ef090b31ee"},
+ {file = "mypy-1.15.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1124a18bc11a6a62887e3e137f37f53fbae476dc36c185d549d4f837a2a6a14e"},
+ {file = "mypy-1.15.0-cp312-cp312-win_amd64.whl", hash = "sha256:171a9ca9a40cd1843abeca0e405bc1940cd9b305eaeea2dda769ba096932bb22"},
+ {file = "mypy-1.15.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:93faf3fdb04768d44bf28693293f3904bbb555d076b781ad2530214ee53e3445"},
+ {file = "mypy-1.15.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:811aeccadfb730024c5d3e326b2fbe9249bb7413553f15499a4050f7c30e801d"},
+ {file = "mypy-1.15.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:98b7b9b9aedb65fe628c62a6dc57f6d5088ef2dfca37903a7d9ee374d03acca5"},
+ {file = "mypy-1.15.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c43a7682e24b4f576d93072216bf56eeff70d9140241f9edec0c104d0c515036"},
+ {file = "mypy-1.15.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:baefc32840a9f00babd83251560e0ae1573e2f9d1b067719479bfb0e987c6357"},
+ {file = "mypy-1.15.0-cp313-cp313-win_amd64.whl", hash = "sha256:b9378e2c00146c44793c98b8d5a61039a048e31f429fb0eb546d93f4b000bedf"},
+ {file = "mypy-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e601a7fa172c2131bff456bb3ee08a88360760d0d2f8cbd7a75a65497e2df078"},
+ {file = "mypy-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:712e962a6357634fef20412699a3655c610110e01cdaa6180acec7fc9f8513ba"},
+ {file = "mypy-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f95579473af29ab73a10bada2f9722856792a36ec5af5399b653aa28360290a5"},
+ {file = "mypy-1.15.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8f8722560a14cde92fdb1e31597760dc35f9f5524cce17836c0d22841830fd5b"},
+ {file = "mypy-1.15.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1fbb8da62dc352133d7d7ca90ed2fb0e9d42bb1a32724c287d3c76c58cbaa9c2"},
+ {file = "mypy-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:d10d994b41fb3497719bbf866f227b3489048ea4bbbb5015357db306249f7980"},
+ {file = "mypy-1.15.0-py3-none-any.whl", hash = "sha256:5469affef548bd1895d86d3bf10ce2b44e33d86923c29e4d675b3e323437ea3e"},
+ {file = "mypy-1.15.0.tar.gz", hash = "sha256:404534629d51d3efea5c800ee7c42b72a6554d6c400e6a79eafe15d11341fd43"},
+]
+
+[package.dependencies]
+mypy_extensions = ">=1.0.0"
+typing_extensions = ">=4.6.0"
+
+[package.extras]
+dmypy = ["psutil (>=4.0)"]
+faster-cache = ["orjson"]
+install-types = ["pip"]
+mypyc = ["setuptools (>=50)"]
+reports = ["lxml"]
+
+[[package]]
+name = "mypy-extensions"
+version = "1.1.0"
+description = "Type system extensions for programs checked with the mypy type checker."
+optional = false
+python-versions = ">=3.8"
+groups = ["dev"]
+files = [
+ {file = "mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505"},
+ {file = "mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558"},
+]
+
+[[package]]
+name = "myst-parser"
+version = "3.0.1"
+description = "An extended [CommonMark](https://spec.commonmark.org/) compliant parser,"
+optional = false
+python-versions = ">=3.8"
+groups = ["docs"]
+files = [
+ {file = "myst_parser-3.0.1-py3-none-any.whl", hash = "sha256:6457aaa33a5d474aca678b8ead9b3dc298e89c68e67012e73146ea6fd54babf1"},
+ {file = "myst_parser-3.0.1.tar.gz", hash = "sha256:88f0cb406cb363b077d176b51c476f62d60604d68a8dcdf4832e080441301a87"},
+]
+
+[package.dependencies]
+docutils = ">=0.18,<0.22"
+jinja2 = "*"
+markdown-it-py = ">=3.0,<4.0"
+mdit-py-plugins = ">=0.4,<1.0"
+pyyaml = "*"
+sphinx = ">=6,<8"
+
+[package.extras]
+code-style = ["pre-commit (>=3.0,<4.0)"]
+linkify = ["linkify-it-py (>=2.0,<3.0)"]
+rtd = ["ipython", "sphinx (>=7)", "sphinx-autodoc2 (>=0.5.0,<0.6.0)", "sphinx-book-theme (>=1.1,<2.0)", "sphinx-copybutton", "sphinx-design", "sphinx-pyscript", "sphinx-tippy (>=0.4.3)", "sphinx-togglebutton", "sphinxext-opengraph (>=0.9.0,<0.10.0)", "sphinxext-rediraffe (>=0.2.7,<0.3.0)"]
+testing = ["beautifulsoup4", "coverage[toml]", "defusedxml", "pytest (>=8,<9)", "pytest-cov", "pytest-param-files (>=0.6.0,<0.7.0)", "pytest-regressions", "sphinx-pytest"]
+testing-docutils = ["pygments", "pytest (>=8,<9)", "pytest-param-files (>=0.6.0,<0.7.0)"]
+
[[package]]
name = "numpy"
version = "2.2.4"
@@ -1185,7 +1613,7 @@ version = "24.2"
description = "Core utilities for Python packages"
optional = false
python-versions = ">=3.8"
-groups = ["main", "dev"]
+groups = ["main", "dev", "docs"]
files = [
{file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"},
{file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"},
@@ -1293,6 +1721,18 @@ files = [
qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"]
testing = ["docopt", "pytest"]
+[[package]]
+name = "pathspec"
+version = "0.12.1"
+description = "Utility library for gitignore style pattern matching of file paths."
+optional = false
+python-versions = ">=3.8"
+groups = ["dev"]
+files = [
+ {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"},
+ {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"},
+]
+
[[package]]
name = "peewee"
version = "3.17.9"
@@ -1426,7 +1866,7 @@ version = "4.3.7"
description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`."
optional = false
python-versions = ">=3.9"
-groups = ["main"]
+groups = ["main", "dev"]
files = [
{file = "platformdirs-4.3.7-py3-none-any.whl", hash = "sha256:a03875334331946f13c549dbd8f4bac7a13a50a895a0eb1e8c6a8ace80d40a94"},
{file = "platformdirs-4.3.7.tar.gz", hash = "sha256:eb437d586b6a0986388f0d6f74aa0cde27b48d0e3d66843640bfb6bdcdb6e351"},
@@ -1585,7 +2025,7 @@ version = "2.19.1"
description = "Pygments is a syntax highlighting package written in Python."
optional = false
python-versions = ">=3.8"
-groups = ["main"]
+groups = ["main", "docs"]
files = [
{file = "pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c"},
{file = "pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f"},
@@ -1594,6 +2034,34 @@ files = [
[package.extras]
windows-terminal = ["colorama (>=0.4.6)"]
+[[package]]
+name = "pylint"
+version = "3.3.6"
+description = "python code static checker"
+optional = false
+python-versions = ">=3.9.0"
+groups = ["dev"]
+files = [
+ {file = "pylint-3.3.6-py3-none-any.whl", hash = "sha256:8b7c2d3e86ae3f94fb27703d521dd0b9b6b378775991f504d7c3a6275aa0a6a6"},
+ {file = "pylint-3.3.6.tar.gz", hash = "sha256:b634a041aac33706d56a0d217e6587228c66427e20ec21a019bc4cdee48c040a"},
+]
+
+[package.dependencies]
+astroid = ">=3.3.8,<=3.4.0.dev0"
+colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""}
+dill = [
+ {version = ">=0.3.6", markers = "python_version >= \"3.11\""},
+ {version = ">=0.3.7", markers = "python_version >= \"3.12\""},
+]
+isort = ">=4.2.5,<5.13 || >5.13,<7"
+mccabe = ">=0.6,<0.8"
+platformdirs = ">=2.2"
+tomlkit = ">=0.10.1"
+
+[package.extras]
+spelling = ["pyenchant (>=3.2,<4.0)"]
+testutils = ["gitpython (>3)"]
+
[[package]]
name = "pyparsing"
version = "3.2.3"
@@ -1731,6 +2199,25 @@ pluggy = ">=1.5,<2"
[package.extras]
dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"]
+[[package]]
+name = "pytest-cov"
+version = "5.0.0"
+description = "Pytest plugin for measuring coverage."
+optional = false
+python-versions = ">=3.8"
+groups = ["dev"]
+files = [
+ {file = "pytest-cov-5.0.0.tar.gz", hash = "sha256:5837b58e9f6ebd335b0f8060eecce69b662415b16dc503883a02f45dfeb14857"},
+ {file = "pytest_cov-5.0.0-py3-none-any.whl", hash = "sha256:4f0764a1219df53214206bf1feea4633c3b558a2925c8b59f144f682861ce652"},
+]
+
+[package.dependencies]
+coverage = {version = ">=5.2.1", extras = ["toml"]}
+pytest = ">=4.6"
+
+[package.extras]
+testing = ["fields", "hunter", "process-tests", "pytest-xdist", "virtualenv"]
+
[[package]]
name = "python-dateutil"
version = "2.9.0.post0"
@@ -1764,7 +2251,7 @@ version = "6.0.2"
description = "YAML parser and emitter for Python"
optional = false
python-versions = ">=3.8"
-groups = ["main"]
+groups = ["main", "docs"]
files = [
{file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"},
{file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"},
@@ -1849,7 +2336,7 @@ version = "2.32.3"
description = "Python HTTP for Humans."
optional = false
python-versions = ">=3.8"
-groups = ["main"]
+groups = ["main", "docs"]
files = [
{file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"},
{file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"},
@@ -1982,6 +2469,18 @@ files = [
{file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"},
]
+[[package]]
+name = "snowballstemmer"
+version = "2.2.0"
+description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms."
+optional = false
+python-versions = "*"
+groups = ["docs"]
+files = [
+ {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"},
+ {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"},
+]
+
[[package]]
name = "soupsieve"
version = "2.6"
@@ -1994,6 +2493,195 @@ files = [
{file = "soupsieve-2.6.tar.gz", hash = "sha256:e2e68417777af359ec65daac1057404a3c8a5455bb8abc36f1a9866ab1a51abb"},
]
+[[package]]
+name = "sphinx"
+version = "7.4.7"
+description = "Python documentation generator"
+optional = false
+python-versions = ">=3.9"
+groups = ["docs"]
+files = [
+ {file = "sphinx-7.4.7-py3-none-any.whl", hash = "sha256:c2419e2135d11f1951cd994d6eb18a1835bd8fdd8429f9ca375dc1f3281bd239"},
+ {file = "sphinx-7.4.7.tar.gz", hash = "sha256:242f92a7ea7e6c5b406fdc2615413890ba9f699114a9c09192d7dfead2ee9cfe"},
+]
+
+[package.dependencies]
+alabaster = ">=0.7.14,<0.8.0"
+babel = ">=2.13"
+colorama = {version = ">=0.4.6", markers = "sys_platform == \"win32\""}
+docutils = ">=0.20,<0.22"
+imagesize = ">=1.3"
+Jinja2 = ">=3.1"
+packaging = ">=23.0"
+Pygments = ">=2.17"
+requests = ">=2.30.0"
+snowballstemmer = ">=2.2"
+sphinxcontrib-applehelp = "*"
+sphinxcontrib-devhelp = "*"
+sphinxcontrib-htmlhelp = ">=2.0.0"
+sphinxcontrib-jsmath = "*"
+sphinxcontrib-qthelp = "*"
+sphinxcontrib-serializinghtml = ">=1.1.9"
+
+[package.extras]
+docs = ["sphinxcontrib-websupport"]
+lint = ["flake8 (>=6.0)", "importlib-metadata (>=6.0)", "mypy (==1.10.1)", "pytest (>=6.0)", "ruff (==0.5.2)", "sphinx-lint (>=0.9)", "tomli (>=2)", "types-docutils (==0.21.0.20240711)", "types-requests (>=2.30.0)"]
+test = ["cython (>=3.0)", "defusedxml (>=0.7.1)", "pytest (>=8.0)", "setuptools (>=70.0)", "typing_extensions (>=4.9)"]
+
+[[package]]
+name = "sphinx-copybutton"
+version = "0.5.2"
+description = "Add a copy button to each of your code cells."
+optional = false
+python-versions = ">=3.7"
+groups = ["docs"]
+files = [
+ {file = "sphinx-copybutton-0.5.2.tar.gz", hash = "sha256:4cf17c82fb9646d1bc9ca92ac280813a3b605d8c421225fd9913154103ee1fbd"},
+ {file = "sphinx_copybutton-0.5.2-py3-none-any.whl", hash = "sha256:fb543fd386d917746c9a2c50360c7905b605726b9355cd26e9974857afeae06e"},
+]
+
+[package.dependencies]
+sphinx = ">=1.8"
+
+[package.extras]
+code-style = ["pre-commit (==2.12.1)"]
+rtd = ["ipython", "myst-nb", "sphinx", "sphinx-book-theme", "sphinx-examples"]
+
+[[package]]
+name = "sphinx-rtd-theme"
+version = "2.0.0"
+description = "Read the Docs theme for Sphinx"
+optional = false
+python-versions = ">=3.6"
+groups = ["docs"]
+files = [
+ {file = "sphinx_rtd_theme-2.0.0-py2.py3-none-any.whl", hash = "sha256:ec93d0856dc280cf3aee9a4c9807c60e027c7f7b461b77aeffed682e68f0e586"},
+ {file = "sphinx_rtd_theme-2.0.0.tar.gz", hash = "sha256:bd5d7b80622406762073a04ef8fadc5f9151261563d47027de09910ce03afe6b"},
+]
+
+[package.dependencies]
+docutils = "<0.21"
+sphinx = ">=5,<8"
+sphinxcontrib-jquery = ">=4,<5"
+
+[package.extras]
+dev = ["bump2version", "sphinxcontrib-httpdomain", "transifex-client", "wheel"]
+
+[[package]]
+name = "sphinxcontrib-applehelp"
+version = "2.0.0"
+description = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books"
+optional = false
+python-versions = ">=3.9"
+groups = ["docs"]
+files = [
+ {file = "sphinxcontrib_applehelp-2.0.0-py3-none-any.whl", hash = "sha256:4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5"},
+ {file = "sphinxcontrib_applehelp-2.0.0.tar.gz", hash = "sha256:2f29ef331735ce958efa4734873f084941970894c6090408b079c61b2e1c06d1"},
+]
+
+[package.extras]
+lint = ["mypy", "ruff (==0.5.5)", "types-docutils"]
+standalone = ["Sphinx (>=5)"]
+test = ["pytest"]
+
+[[package]]
+name = "sphinxcontrib-devhelp"
+version = "2.0.0"
+description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp documents"
+optional = false
+python-versions = ">=3.9"
+groups = ["docs"]
+files = [
+ {file = "sphinxcontrib_devhelp-2.0.0-py3-none-any.whl", hash = "sha256:aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2"},
+ {file = "sphinxcontrib_devhelp-2.0.0.tar.gz", hash = "sha256:411f5d96d445d1d73bb5d52133377b4248ec79db5c793ce7dbe59e074b4dd1ad"},
+]
+
+[package.extras]
+lint = ["mypy", "ruff (==0.5.5)", "types-docutils"]
+standalone = ["Sphinx (>=5)"]
+test = ["pytest"]
+
+[[package]]
+name = "sphinxcontrib-htmlhelp"
+version = "2.1.0"
+description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files"
+optional = false
+python-versions = ">=3.9"
+groups = ["docs"]
+files = [
+ {file = "sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl", hash = "sha256:166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8"},
+ {file = "sphinxcontrib_htmlhelp-2.1.0.tar.gz", hash = "sha256:c9e2916ace8aad64cc13a0d233ee22317f2b9025b9cf3295249fa985cc7082e9"},
+]
+
+[package.extras]
+lint = ["mypy", "ruff (==0.5.5)", "types-docutils"]
+standalone = ["Sphinx (>=5)"]
+test = ["html5lib", "pytest"]
+
+[[package]]
+name = "sphinxcontrib-jquery"
+version = "4.1"
+description = "Extension to include jQuery on newer Sphinx releases"
+optional = false
+python-versions = ">=2.7"
+groups = ["docs"]
+files = [
+ {file = "sphinxcontrib-jquery-4.1.tar.gz", hash = "sha256:1620739f04e36a2c779f1a131a2dfd49b2fd07351bf1968ced074365933abc7a"},
+ {file = "sphinxcontrib_jquery-4.1-py2.py3-none-any.whl", hash = "sha256:f936030d7d0147dd026a4f2b5a57343d233f1fc7b363f68b3d4f1cb0993878ae"},
+]
+
+[package.dependencies]
+Sphinx = ">=1.8"
+
+[[package]]
+name = "sphinxcontrib-jsmath"
+version = "1.0.1"
+description = "A sphinx extension which renders display math in HTML via JavaScript"
+optional = false
+python-versions = ">=3.5"
+groups = ["docs"]
+files = [
+ {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"},
+ {file = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"},
+]
+
+[package.extras]
+test = ["flake8", "mypy", "pytest"]
+
+[[package]]
+name = "sphinxcontrib-qthelp"
+version = "2.0.0"
+description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp documents"
+optional = false
+python-versions = ">=3.9"
+groups = ["docs"]
+files = [
+ {file = "sphinxcontrib_qthelp-2.0.0-py3-none-any.whl", hash = "sha256:b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb"},
+ {file = "sphinxcontrib_qthelp-2.0.0.tar.gz", hash = "sha256:4fe7d0ac8fc171045be623aba3e2a8f613f8682731f9153bb2e40ece16b9bbab"},
+]
+
+[package.extras]
+lint = ["mypy", "ruff (==0.5.5)", "types-docutils"]
+standalone = ["Sphinx (>=5)"]
+test = ["defusedxml (>=0.7.1)", "pytest"]
+
+[[package]]
+name = "sphinxcontrib-serializinghtml"
+version = "2.0.0"
+description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)"
+optional = false
+python-versions = ">=3.9"
+groups = ["docs"]
+files = [
+ {file = "sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl", hash = "sha256:6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331"},
+ {file = "sphinxcontrib_serializinghtml-2.0.0.tar.gz", hash = "sha256:e9d912827f872c029017a53f0ef2180b327c3f7fd23c87229f7a8e8b70031d4d"},
+]
+
+[package.extras]
+lint = ["mypy", "ruff (==0.5.5)", "types-docutils"]
+standalone = ["Sphinx (>=5)"]
+test = ["pytest"]
+
[[package]]
name = "sqlalchemy"
version = "2.0.40"
@@ -2163,6 +2851,18 @@ webencodings = ">=0.5.1"
doc = ["sphinx", "sphinx_rtd_theme"]
test = ["pytest", "ruff"]
+[[package]]
+name = "tomlkit"
+version = "0.13.2"
+description = "Style preserving TOML library"
+optional = false
+python-versions = ">=3.8"
+groups = ["dev"]
+files = [
+ {file = "tomlkit-0.13.2-py3-none-any.whl", hash = "sha256:7a974427f6e119197f670fbbbeae7bef749a6c14e793db934baefc1b5f03efde"},
+ {file = "tomlkit-0.13.2.tar.gz", hash = "sha256:fff5fe59a87295b278abd31bec92c15d9bc4a06885ab12bcea52c71119392e79"},
+]
+
[[package]]
name = "traitlets"
version = "5.14.3"
@@ -2185,7 +2885,7 @@ version = "4.13.2"
description = "Backported and Experimental Type Hints for Python 3.8+"
optional = false
python-versions = ">=3.8"
-groups = ["main"]
+groups = ["main", "dev"]
files = [
{file = "typing_extensions-4.13.2-py3-none-any.whl", hash = "sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c"},
{file = "typing_extensions-4.13.2.tar.gz", hash = "sha256:e6c81219bd689f51865d9e372991c540bda33a0379d5573cddb9a3a23f7caaef"},
@@ -2209,7 +2909,7 @@ version = "2.4.0"
description = "HTTP library with thread-safe connection pooling, file post, and more."
optional = false
python-versions = ">=3.9"
-groups = ["main"]
+groups = ["main", "docs"]
files = [
{file = "urllib3-2.4.0-py3-none-any.whl", hash = "sha256:4e16665048960a0900c702d4a66415956a584919c03361cac9f1df5c5dd7e813"},
{file = "urllib3-2.4.0.tar.gz", hash = "sha256:414bc6535b787febd7567804cc015fee39daab8ad86268f1310a9250697de466"},
@@ -2385,4 +3085,4 @@ test = ["pytest"]
[metadata]
lock-version = "2.1"
python-versions = ">=3.11,<4.0"
-content-hash = "69d983706320fee22c0ff05ff64f480e68b1797c87c77f83c5cde24a64a8e61e"
+content-hash = "f4a8086c3d39ce050429f9d7319f83dd5c3314d59393d7bc76a9407295877b37"
diff --git a/strategy.csv b/strategy.csv
index df7a9d5..ff5a3ed 100644
--- a/strategy.csv
+++ b/strategy.csv
@@ -1,1001 +1,1001 @@
,Strategy
-2020-01-01,0.7357483921101974
-2020-01-02,1.9884270581800045
-2020-01-03,3.0632934316172475
-2020-01-06,2.846807905095898
-2020-01-07,2.3004606928801548
-2020-01-08,2.2390648562863524
-2020-01-09,2.042894997718815
-2020-01-10,2.174533777336096
-2020-01-13,2.0068978684665586
-2020-01-14,0.16501901395415874
-2020-01-15,0.4936492061384448
-2020-01-16,1.460313898401915
-2020-01-17,0.5146039121515958
-2020-01-20,0.7701443286326403
-2020-01-21,-0.7831351460158492
-2020-01-22,-1.9090707136353466
-2020-01-23,-0.991708128657373
-2020-01-24,-1.639063799630971
-2020-01-27,-2.077928799655441
-2020-01-28,-3.6934969082953373
-2020-01-29,-2.236978157868158
-2020-01-30,-1.1531615738294339
-2020-01-31,0.13030118388650358
-2020-02-03,0.47915357253375235
-2020-02-04,1.8676066754871128
-2020-02-05,1.1491350432501886
-2020-02-06,2.2791897386471707
-2020-02-07,1.7409721065917392
-2020-02-10,4.0651513323573685
-2020-02-11,3.3796783277771465
-2020-02-12,2.79028620566545
-2020-02-13,3.8699126737599627
-2020-02-14,6.184626397035899
-2020-02-17,6.458409171799424
-2020-02-18,6.678926983424501
-2020-02-19,7.376416324618663
-2020-02-20,7.598985243873085
-2020-02-21,7.025049032014206
-2020-02-24,7.325773875519349
-2020-02-25,7.149178619536133
-2020-02-26,7.0400057699032565
-2020-02-27,6.426419513901225
-2020-02-28,5.721775281698948
-2020-03-02,6.1907552379415
-2020-03-03,4.91568891067102
-2020-03-04,5.999938405119647
-2020-03-05,7.452879893484996
-2020-03-06,10.191811198683315
-2020-03-09,10.014044052333563
-2020-03-10,9.441496024756571
-2020-03-11,9.362377632428304
-2020-03-12,8.734253632856307
-2020-03-13,8.297603595918467
-2020-03-16,9.08441578580899
-2020-03-17,8.996413878694064
-2020-03-18,8.206123841952689
-2020-03-19,8.602720269634418
-2020-03-20,7.087080234133848
-2020-03-23,9.301069547951444
-2020-03-24,10.27219885801314
-2020-03-25,10.708544608326953
-2020-03-26,9.370269228969162
-2020-03-27,9.26455997852135
-2020-03-30,8.03714921269293
-2020-03-31,9.844859166273686
-2020-04-01,9.723588948779094
-2020-04-02,7.745025300892162
-2020-04-03,7.076608736945488
-2020-04-06,7.013149490533461
-2020-04-07,7.862955806224955
-2020-04-08,7.705822077575297
-2020-04-09,7.355406188564516
-2020-04-10,8.466116117648372
-2020-04-13,8.339570115922882
-2020-04-14,7.867840150970967
-2020-04-15,6.38741579352569
-2020-04-16,6.869897582258025
-2020-04-17,7.23894159572801
-2020-04-20,8.25654990927028
-2020-04-21,7.7626043551386665
-2020-04-22,6.216523548787761
-2020-04-23,7.5081870510305375
-2020-04-24,8.599819715917933
-2020-04-27,8.930241255348118
-2020-04-28,8.944356165925887
-2020-04-29,8.869691792202696
-2020-04-30,8.503182428972865
-2020-05-01,8.239786048619166
-2020-05-04,7.96700087350264
-2020-05-05,8.166872539193943
-2020-05-06,7.981905044653236
-2020-05-07,8.710331005938915
-2020-05-08,8.530533048280851
-2020-05-11,8.423735866748434
-2020-05-12,6.821248665462875
-2020-05-13,5.593183490606911
-2020-05-14,6.542441763893365
-2020-05-15,7.4563286292341235
-2020-05-18,7.318171256765534
-2020-05-19,7.895116507504331
-2020-05-20,6.896049941541767
-2020-05-21,7.806618670596854
-2020-05-22,7.26722301653827
-2020-05-25,7.523482285365853
-2020-05-26,8.447617549726553
-2020-05-27,8.94647889420785
-2020-05-28,9.758237036207309
-2020-05-29,8.86566983516092
-2020-06-01,7.523306057357549
-2020-06-02,7.369676161266769
-2020-06-03,7.978098244974991
-2020-06-04,9.918178215801976
-2020-06-05,8.796336940946428
-2020-06-08,7.58157646062617
-2020-06-09,6.7211196702635485
-2020-06-10,6.423492947466725
-2020-06-11,7.691044041910734
-2020-06-12,6.928655563134214
-2020-06-15,8.463929275185661
-2020-06-16,7.358397018892295
-2020-06-17,7.334936082595461
-2020-06-18,7.972273461402063
-2020-06-19,7.680030550282116
-2020-06-22,6.425465097942425
-2020-06-23,5.715339210562657
-2020-06-24,6.305671644846736
-2020-06-25,5.2541756791928265
-2020-06-26,5.061815699628423
-2020-06-29,6.257264109013702
-2020-06-30,5.193930014546892
-2020-07-01,5.4816034524637205
-2020-07-02,4.922265608193508
-2020-07-03,6.054780943561218
-2020-07-06,5.264929381504224
-2020-07-07,6.465428181586691
-2020-07-08,7.611756053747666
-2020-07-09,6.199703226750855
-2020-07-10,5.730827303863787
-2020-07-13,4.419790460205247
-2020-07-14,2.4862374400271525
-2020-07-15,2.3325755131334627
-2020-07-16,0.9871135258033139
-2020-07-17,0.9124360639190059
-2020-07-20,0.12901805414701706
-2020-07-21,0.1445945005390053
-2020-07-22,-0.04971855665972938
-2020-07-23,-0.6363897490480814
-2020-07-24,0.4753978422078884
-2020-07-27,1.4145569066190982
-2020-07-28,1.2464685754205411
-2020-07-29,0.23274129837973923
-2020-07-30,-0.11043009457742897
-2020-07-31,1.1008593042734154
-2020-08-03,-0.2424641423534566
-2020-08-04,-0.8308762788292392
-2020-08-05,-1.6536770197785675
-2020-08-06,-1.9149069120673283
-2020-08-07,-2.3642496429298134
-2020-08-10,-2.8543280068083483
-2020-08-11,-3.0454528801892744
-2020-08-12,-2.678572481105696
-2020-08-13,-5.100559102093797
-2020-08-14,-4.27492733370067
-2020-08-17,-4.936810256507032
-2020-08-18,-3.561294947496259
-2020-08-19,-3.9039185905026685
-2020-08-20,-4.911015158239838
-2020-08-21,-4.743619247785111
-2020-08-24,-5.071366031926051
-2020-08-25,-4.972662802653222
-2020-08-26,-6.236932844170688
-2020-08-27,-5.776101150030339
-2020-08-28,-6.479260839164142
-2020-08-31,-5.225662368259379
-2020-09-01,-5.873620913613141
-2020-09-02,-6.488711995225239
-2020-09-03,-6.3005820955522704
-2020-09-04,-7.937276742222109
-2020-09-07,-7.344915169111686
-2020-09-08,-6.7234540143340675
-2020-09-09,-5.9749625372196435
-2020-09-10,-6.38888809457606
-2020-09-11,-5.922833966584094
-2020-09-14,-6.305954749322908
-2020-09-15,-6.289641742913304
-2020-09-16,-5.832035971362423
-2020-09-17,-4.849750559306676
-2020-09-18,-5.982598301316996
-2020-09-21,-6.516078455968839
-2020-09-22,-6.66560974978881
-2020-09-23,-6.39067679589809
-2020-09-24,-7.1847937218521265
-2020-09-25,-6.945697238080128
-2020-09-28,-8.690549585704344
-2020-09-29,-9.62637013906905
-2020-09-30,-9.08194724670898
-2020-10-01,-9.24585875329302
-2020-10-02,-10.347262621226422
-2020-10-05,-11.366335487504852
-2020-10-06,-13.871168068628691
-2020-10-07,-13.520414714099175
-2020-10-08,-13.735641833279125
-2020-10-09,-13.372464544842346
-2020-10-12,-12.495201017992528
-2020-10-13,-13.302247191012265
-2020-10-14,-12.605367390833434
-2020-10-15,-12.932911727304987
-2020-10-16,-11.683377882575646
-2020-10-19,-14.251302722739567
-2020-10-20,-13.840226906283087
-2020-10-21,-13.475985198953893
-2020-10-22,-14.443601588922917
-2020-10-23,-14.427385968905812
-2020-10-26,-15.368600444562215
-2020-10-27,-15.099284098307388
-2020-10-28,-14.689004265253857
-2020-10-29,-14.085556807926663
-2020-10-30,-12.833672905382752
-2020-11-02,-11.65201750030643
-2020-11-03,-14.053724459421908
-2020-11-04,-15.734196676219533
-2020-11-05,-17.397206321575645
-2020-11-06,-15.00719916052451
-2020-11-09,-15.229359624041344
-2020-11-10,-16.780441103993905
-2020-11-11,-16.337292188961722
-2020-11-12,-15.893062544334496
-2020-11-13,-16.30245031928777
-2020-11-16,-15.448085545387592
-2020-11-17,-14.615669326546147
-2020-11-18,-16.280921197445434
-2020-11-19,-16.182290499990923
-2020-11-20,-16.217455830752616
-2020-11-23,-16.701039310101663
-2020-11-24,-16.310104037175652
-2020-11-25,-16.927163823329643
-2020-11-26,-18.836227714276127
-2020-11-27,-16.57621269011026
-2020-11-30,-16.934636655199174
-2020-12-01,-17.171219244097582
-2020-12-02,-17.163994840066195
-2020-12-03,-16.42119093421848
-2020-12-04,-15.923303690918397
-2020-12-07,-17.55266531344548
-2020-12-08,-19.05480045646565
-2020-12-09,-17.924919834078416
-2020-12-10,-16.400493820452066
-2020-12-11,-17.988365235356696
-2020-12-14,-17.609035429669806
-2020-12-15,-16.456762809908426
-2020-12-16,-16.401381217204683
-2020-12-17,-16.689942179226836
-2020-12-18,-15.67509734230434
-2020-12-21,-16.261705252378693
-2020-12-22,-15.458600579108285
-2020-12-23,-15.795479835033088
-2020-12-24,-14.946803233370751
-2020-12-25,-14.515290158892526
-2020-12-28,-14.550003753456412
-2020-12-29,-14.454954993963453
-2020-12-30,-15.998756781414432
-2020-12-31,-15.961096842663837
-2021-01-01,-15.811619588602879
-2021-01-04,-15.519983150304318
-2021-01-05,-15.938153702577452
-2021-01-06,-15.751358922500273
-2021-01-07,-16.542757741803268
-2021-01-08,-17.717588413596395
-2021-01-11,-15.82845277803899
-2021-01-12,-14.862070532287447
-2021-01-13,-14.919600582221882
-2021-01-14,-13.250662577676364
-2021-01-15,-14.141224672605277
-2021-01-18,-12.84878331893817
-2021-01-19,-12.59893838467718
-2021-01-20,-11.009235883381832
-2021-01-21,-12.510414008787027
-2021-01-22,-13.861139961574843
-2021-01-25,-13.477289680535824
-2021-01-26,-12.200340844893509
-2021-01-27,-12.45581387885933
-2021-01-28,-12.779524355989873
-2021-01-29,-12.580235322269727
-2021-02-01,-12.853697668372856
-2021-02-02,-12.917374392774883
-2021-02-03,-13.992453469538738
-2021-02-04,-13.829315471171315
-2021-02-05,-13.460082575223092
-2021-02-08,-15.328911050405187
-2021-02-09,-14.397999303806763
-2021-02-10,-13.648767141586497
-2021-02-11,-14.788221595292644
-2021-02-12,-14.506184884798081
-2021-02-15,-14.778563323595833
-2021-02-16,-16.18331585012604
-2021-02-17,-15.534711931321203
-2021-02-18,-15.609611931142345
-2021-02-19,-13.922663979142385
-2021-02-22,-11.584930163088956
-2021-02-23,-12.494320577330853
-2021-02-24,-13.787299389724758
-2021-02-25,-11.64135044409569
-2021-02-26,-13.212950910716716
-2021-03-01,-14.244840749195381
-2021-03-02,-13.914999799793314
-2021-03-03,-15.107831150581703
-2021-03-04,-14.979885124088609
-2021-03-05,-15.636631837370617
-2021-03-08,-17.369431549914683
-2021-03-09,-17.08966134399216
-2021-03-10,-19.239033414798797
-2021-03-11,-19.335603312779288
-2021-03-12,-20.85580877414719
-2021-03-15,-20.43764824911242
-2021-03-16,-19.266651699252087
-2021-03-17,-21.010290531468833
-2021-03-18,-20.304254959858927
-2021-03-19,-19.825005848167606
-2021-03-22,-21.12259965750392
-2021-03-23,-21.976120239268003
-2021-03-24,-24.261138284377523
-2021-03-25,-24.85974599214539
-2021-03-26,-25.949470862047953
-2021-03-29,-25.73906915841778
-2021-03-30,-26.000848805965912
-2021-03-31,-27.22692835016215
-2021-04-01,-27.813028080222004
-2021-04-02,-29.40665809412914
-2021-04-05,-29.01383912356667
-2021-04-06,-28.734983636132768
-2021-04-07,-27.543789241102427
-2021-04-08,-26.368522195440153
-2021-04-09,-25.472412567746606
-2021-04-12,-23.896814675646464
-2021-04-13,-24.660058979450785
-2021-04-14,-26.03837753194624
-2021-04-15,-25.54455242217195
-2021-04-16,-26.21826184881952
-2021-04-19,-25.521734965504074
-2021-04-20,-25.505759211253938
-2021-04-21,-24.684845393914557
-2021-04-22,-23.41307651076571
-2021-04-23,-22.72446123597517
-2021-04-26,-22.027164772163246
-2021-04-27,-21.130820739603223
-2021-04-28,-22.744670377073497
-2021-04-29,-23.470612779917573
-2021-04-30,-24.845735178964144
-2021-05-03,-25.544238624758385
-2021-05-04,-25.274151144058596
-2021-05-05,-24.47535778802616
-2021-05-06,-25.312028106034642
-2021-05-07,-25.020730163676994
-2021-05-10,-26.035600568892438
-2021-05-11,-26.997788645494
-2021-05-12,-28.433100317037848
-2021-05-13,-26.727680174039282
-2021-05-14,-26.29643606952335
-2021-05-17,-25.874166999880536
-2021-05-18,-25.232516067944466
-2021-05-19,-25.01354558935336
-2021-05-20,-24.868560371323394
-2021-05-21,-24.736726274618366
-2021-05-24,-25.59932065682704
-2021-05-25,-25.335489368632008
-2021-05-26,-24.06661013333725
-2021-05-27,-23.476279673693195
-2021-05-28,-23.879246338951663
-2021-05-31,-24.775080312653632
-2021-06-01,-25.521564267081892
-2021-06-02,-25.929230636734715
-2021-06-03,-26.25298867724052
-2021-06-04,-26.487467951448426
-2021-06-07,-26.32160508944221
-2021-06-08,-26.081634279093777
-2021-06-09,-26.43381563837989
-2021-06-10,-27.718210504639163
-2021-06-11,-26.586216598920196
-2021-06-14,-25.93795402253667
-2021-06-15,-25.863094489962027
-2021-06-16,-24.01283149975006
-2021-06-17,-24.05129435911145
-2021-06-18,-24.50920654681697
-2021-06-21,-22.924515950476575
-2021-06-22,-22.900795532135945
-2021-06-23,-20.923423084555125
-2021-06-24,-20.397372829499155
-2021-06-25,-20.83450842689843
-2021-06-28,-20.026479995338498
-2021-06-29,-20.262869053539763
-2021-06-30,-20.013998652946338
-2021-07-01,-20.918348233678177
-2021-07-02,-20.135702413057896
-2021-07-05,-20.93464314743621
-2021-07-06,-21.660588609757447
-2021-07-07,-22.653719934338532
-2021-07-08,-21.638524632338857
-2021-07-09,-24.7695995782453
-2021-07-12,-25.35903277750022
-2021-07-13,-26.524064818624232
-2021-07-14,-24.351186820487214
-2021-07-15,-24.173589619359127
-2021-07-16,-24.611353466487262
-2021-07-19,-24.290477706032647
-2021-07-20,-24.166120597140406
-2021-07-21,-22.92606121676822
-2021-07-22,-21.918013352988545
-2021-07-23,-20.810792076743866
-2021-07-26,-23.02435900497797
-2021-07-27,-24.1459071354794
-2021-07-28,-24.328717655545763
-2021-07-29,-25.632929308178348
-2021-07-30,-25.620440931315457
-2021-08-02,-25.088138392822163
-2021-08-03,-25.331852384923927
-2021-08-04,-25.045977276546623
-2021-08-05,-23.3295750564669
-2021-08-06,-23.337355940620977
-2021-08-09,-22.97991270794151
-2021-08-10,-25.3636437970718
-2021-08-11,-23.946638123656022
-2021-08-12,-22.722418679459132
-2021-08-13,-22.508192434451527
-2021-08-16,-21.90908561811054
-2021-08-17,-23.028809003830894
-2021-08-18,-23.641323523175515
-2021-08-19,-24.418589846792667
-2021-08-20,-25.524861350134934
-2021-08-23,-26.164466741568518
-2021-08-24,-25.829686786607443
-2021-08-25,-25.682292042852755
-2021-08-26,-25.719017571608493
-2021-08-27,-26.714088679875527
-2021-08-30,-26.13370888249698
-2021-08-31,-25.039802296441678
-2021-09-01,-24.600036860334022
-2021-09-02,-23.505197559119296
-2021-09-03,-23.039323278780618
-2021-09-06,-23.28473652931886
-2021-09-07,-23.63876979819942
-2021-09-08,-23.08901911439841
-2021-09-09,-22.583455995677948
-2021-09-10,-24.810867914030112
-2021-09-13,-24.876606774379386
-2021-09-14,-24.56107705048887
-2021-09-15,-21.62583272256351
-2021-09-16,-21.338741116257136
-2021-09-17,-19.727231500803306
-2021-09-20,-18.6838655316833
-2021-09-21,-18.102546279705177
-2021-09-22,-18.686353860987158
-2021-09-23,-20.390304582755327
-2021-09-24,-21.734154444462213
-2021-09-27,-20.083207023905914
-2021-09-28,-21.164981693526737
-2021-09-29,-20.839638154478862
-2021-09-30,-20.742560776757593
-2021-10-01,-20.89064705786595
-2021-10-04,-20.876065656273855
-2021-10-05,-22.246936166246904
-2021-10-06,-23.245291686634992
-2021-10-07,-22.593977898332493
-2021-10-08,-22.598766356882624
-2021-10-11,-22.481026386775284
-2021-10-12,-24.47109129376604
-2021-10-13,-24.021716730672296
-2021-10-14,-23.31685613126574
-2021-10-15,-22.97644471356057
-2021-10-18,-23.357196783923136
-2021-10-19,-22.648545500692926
-2021-10-20,-22.150231482696807
-2021-10-21,-22.18451492994748
-2021-10-22,-21.911162736645544
-2021-10-25,-20.56336932932944
-2021-10-26,-20.703184058022845
-2021-10-27,-19.06575184612793
-2021-10-28,-18.51910756573351
-2021-10-29,-18.367944126876456
-2021-11-01,-18.785807623193133
-2021-11-02,-17.96216703004906
-2021-11-03,-17.76207254143495
-2021-11-04,-19.129336735381052
-2021-11-05,-19.795612181085815
-2021-11-08,-18.356383267935612
-2021-11-09,-19.853312381864463
-2021-11-10,-19.102984545574117
-2021-11-11,-19.849703032050595
-2021-11-12,-17.794727505029414
-2021-11-15,-18.280938973082737
-2021-11-16,-18.544929439538517
-2021-11-17,-18.19650550652606
-2021-11-18,-19.01767132828341
-2021-11-19,-19.841796617650296
-2021-11-22,-19.987835327360784
-2021-11-23,-21.01414902813129
-2021-11-24,-20.671080713310342
-2021-11-25,-21.93892205482775
-2021-11-26,-23.790964334696305
-2021-11-29,-23.119161420019505
-2021-11-30,-24.77922921502363
-2021-12-01,-25.079314490885718
-2021-12-02,-25.850682447069854
-2021-12-03,-26.264279303488934
-2021-12-06,-27.871129217810584
-2021-12-07,-28.360118215902
-2021-12-08,-27.314102676650524
-2021-12-09,-27.81576084363791
-2021-12-10,-28.72238623454851
-2021-12-13,-31.110594789326722
-2021-12-14,-31.696555769544617
-2021-12-15,-31.55251716047754
-2021-12-16,-30.937766170084032
-2021-12-17,-30.902479920322627
-2021-12-20,-31.229108271162573
-2021-12-21,-30.355758130299268
-2021-12-22,-30.71894408197406
-2021-12-23,-29.438064148405353
-2021-12-24,-30.027021964785444
-2021-12-27,-30.693342987311638
-2021-12-28,-30.017683579966697
-2021-12-29,-29.882363433275852
-2021-12-30,-30.262443772307467
-2021-12-31,-29.461075838866392
-2022-01-03,-28.438066667885767
-2022-01-04,-28.077537221182713
-2022-01-05,-28.188083843067798
-2022-01-06,-28.986840318764433
-2022-01-07,-28.541907437140072
-2022-01-10,-28.30074805432464
-2022-01-11,-27.55219617244974
-2022-01-12,-25.901873351943348
-2022-01-13,-24.880556364633712
-2022-01-14,-24.282224541627464
-2022-01-17,-24.018854859378497
-2022-01-18,-25.42514364717359
-2022-01-19,-24.378838124266533
-2022-01-20,-24.044947262262763
-2022-01-21,-23.608475353782886
-2022-01-24,-24.382264685310187
-2022-01-25,-23.991626333267956
-2022-01-26,-23.513092616508366
-2022-01-27,-24.888498677420174
-2022-01-28,-24.759660072734064
-2022-01-31,-25.25168947580046
-2022-02-01,-24.47783340350817
-2022-02-02,-24.41453758600401
-2022-02-03,-22.39633651721798
-2022-02-04,-22.837995303921243
-2022-02-07,-22.76388350117432
-2022-02-08,-22.618381452708014
-2022-02-09,-23.063445616008426
-2022-02-10,-22.348991243406175
-2022-02-11,-20.94514393263075
-2022-02-14,-21.39461401814481
-2022-02-15,-20.04119426438795
-2022-02-16,-20.09918253750279
-2022-02-17,-18.478982776913707
-2022-02-18,-20.715119979901935
-2022-02-21,-22.537234664546478
-2022-02-22,-22.4891510503337
-2022-02-23,-22.778767914178193
-2022-02-24,-21.777954267483825
-2022-02-25,-22.205947383438424
-2022-02-28,-23.014790768615367
-2022-03-01,-23.25615680405102
-2022-03-02,-23.694714290757247
-2022-03-03,-24.459126948631386
-2022-03-04,-24.51301615175903
-2022-03-07,-24.99138425707097
-2022-03-08,-26.888450388082557
-2022-03-09,-26.62485346930636
-2022-03-10,-25.975579658445998
-2022-03-11,-27.728857105798316
-2022-03-14,-28.552961210217475
-2022-03-15,-31.340619069656412
-2022-03-16,-30.833939897368218
-2022-03-17,-32.85248670091075
-2022-03-18,-33.03402770158637
-2022-03-21,-33.405352812595
-2022-03-22,-33.375564405153284
-2022-03-23,-33.74874520021398
-2022-03-24,-32.79672985839452
-2022-03-25,-32.88503895474873
-2022-03-28,-31.763886088031853
-2022-03-29,-31.588818735369916
-2022-03-30,-32.47158327570414
-2022-03-31,-32.47885076193888
-2022-04-01,-33.304494950804326
-2022-04-04,-32.80739531420169
-2022-04-05,-31.939444030840594
-2022-04-06,-32.06309778209523
-2022-04-07,-32.38292873721041
-2022-04-08,-31.61875269712716
-2022-04-11,-32.860579724618646
-2022-04-12,-33.45383647202279
-2022-04-13,-33.395060619351064
-2022-04-14,-32.988538880342524
-2022-04-15,-32.89017156834002
-2022-04-18,-31.858264322838146
-2022-04-19,-29.374973468464137
-2022-04-20,-28.87748832866626
-2022-04-21,-28.969759327323715
-2022-04-22,-28.856817525353907
-2022-04-25,-29.474095497324022
-2022-04-26,-29.552139938437126
-2022-04-27,-26.924529167709018
-2022-04-28,-27.031873599800274
-2022-04-29,-25.577064046448182
-2022-05-02,-26.609717096449714
-2022-05-03,-25.81629314670327
-2022-05-04,-26.36917526371167
-2022-05-05,-27.138127025963936
-2022-05-06,-25.676568898992045
-2022-05-09,-25.976286336966442
-2022-05-10,-26.96355135973857
-2022-05-11,-26.304381284623126
-2022-05-12,-26.170906320387328
-2022-05-13,-26.446564410408612
-2022-05-16,-27.765940241820914
-2022-05-17,-28.209180466449734
-2022-05-18,-28.22057377479285
-2022-05-19,-26.660462133368185
-2022-05-20,-28.447209856909918
-2022-05-23,-27.082084791870635
-2022-05-24,-28.829319218864004
-2022-05-25,-27.883187941242966
-2022-05-26,-27.55820698218608
-2022-05-27,-26.44864661403492
-2022-05-30,-25.332607025313596
-2022-05-31,-23.286070499914032
-2022-06-01,-26.852400109212656
-2022-06-02,-26.49407096529366
-2022-06-03,-26.915955071634755
-2022-06-06,-27.136296051798286
-2022-06-07,-26.818637623528744
-2022-06-08,-27.043661248851958
-2022-06-09,-28.17006204024113
-2022-06-10,-27.341230174523652
-2022-06-13,-26.875023034360414
-2022-06-14,-25.957497026562425
-2022-06-15,-25.287581594664207
-2022-06-16,-24.86046578483189
-2022-06-17,-25.043628501289238
-2022-06-20,-24.66924459554092
-2022-06-21,-23.504810603986463
-2022-06-22,-24.23208829470466
-2022-06-23,-22.772390448017497
-2022-06-24,-23.561933988023313
-2022-06-27,-23.335475380035763
-2022-06-28,-24.36311447262759
-2022-06-29,-23.176538626290835
-2022-06-30,-21.211242641749987
-2022-07-01,-20.549115686756643
-2022-07-04,-19.041475959406803
-2022-07-05,-19.755327737285672
-2022-07-06,-19.372800434417275
-2022-07-07,-17.526007888047324
-2022-07-08,-17.68943197886716
-2022-07-11,-18.610408055550174
-2022-07-12,-17.576451406064745
-2022-07-13,-17.132597310552356
-2022-07-14,-16.45157263969346
-2022-07-15,-16.14291061173481
-2022-07-18,-15.775485734776954
-2022-07-19,-15.141508778408543
-2022-07-20,-15.527519746942314
-2022-07-21,-18.039400226413427
-2022-07-22,-16.35989169013943
-2022-07-25,-15.877951343763895
-2022-07-26,-15.002679334338156
-2022-07-27,-15.933780221587524
-2022-07-28,-15.759470960305697
-2022-07-29,-16.63435306112646
-2022-08-01,-16.667059552686215
-2022-08-02,-18.06244390849133
-2022-08-03,-18.650413252825516
-2022-08-04,-19.22742489892301
-2022-08-05,-19.23961099277372
-2022-08-08,-18.76748578040732
-2022-08-09,-18.525944310832674
-2022-08-10,-18.821036721553497
-2022-08-11,-19.54259882060613
-2022-08-12,-19.8194712252776
-2022-08-15,-18.94117245281435
-2022-08-16,-19.478224539947224
-2022-08-17,-19.188815324148344
-2022-08-18,-18.907202181308374
-2022-08-19,-18.1219932687302
-2022-08-22,-18.977301560675897
-2022-08-23,-19.242610323456
-2022-08-24,-21.22880486553673
-2022-08-25,-20.028755206275207
-2022-08-26,-20.440053888414578
-2022-08-29,-20.14532319151995
-2022-08-30,-18.96190807262992
-2022-08-31,-17.475250923420003
-2022-09-01,-19.0168063000493
-2022-09-02,-18.107033589169983
-2022-09-05,-17.624304020695533
-2022-09-06,-18.11581466021236
-2022-09-07,-18.630503510348863
-2022-09-08,-20.927720398849786
-2022-09-09,-21.20574852259398
-2022-09-12,-20.76063078633865
-2022-09-13,-20.98791734815219
-2022-09-14,-21.400170510729254
-2022-09-15,-19.432877768037674
-2022-09-16,-19.57505286998911
-2022-09-19,-18.964572069760482
-2022-09-20,-18.976957837145758
-2022-09-21,-18.435364648615206
-2022-09-22,-18.37937966616831
-2022-09-23,-18.759833546567002
-2022-09-26,-19.144127726656283
-2022-09-27,-19.066590333277603
-2022-09-28,-20.93602421347374
-2022-09-29,-19.321014898203646
-2022-09-30,-19.602873804180167
-2022-10-03,-20.18599125694262
-2022-10-04,-18.331152826392476
-2022-10-05,-19.871144702950822
-2022-10-06,-19.939094761473626
-2022-10-07,-19.132091092857817
-2022-10-10,-18.580064211777486
-2022-10-11,-18.840630644613345
-2022-10-12,-18.190131358936846
-2022-10-13,-18.417750475568717
-2022-10-14,-18.697321753856286
-2022-10-17,-18.213367446995033
-2022-10-18,-18.360912371704185
-2022-10-19,-18.597037751916545
-2022-10-20,-18.48376913280998
-2022-10-21,-16.844752580126396
-2022-10-24,-15.423830235878487
-2022-10-25,-14.910681061120338
-2022-10-26,-14.63871013071318
-2022-10-27,-13.710953742010116
-2022-10-28,-11.980914390448563
-2022-10-31,-13.929705342243654
-2022-11-01,-12.728922936522995
-2022-11-02,-12.46197114569199
-2022-11-03,-14.108996776028365
-2022-11-04,-13.765843200056684
-2022-11-07,-12.83471898440937
-2022-11-08,-13.65775995899109
-2022-11-09,-13.58305649192445
-2022-11-10,-14.212012621818257
-2022-11-11,-15.830338038218068
-2022-11-14,-14.97865304160815
-2022-11-15,-15.185659300212436
-2022-11-16,-13.927831165438107
-2022-11-17,-14.144603139554546
-2022-11-18,-12.71577894722676
-2022-11-21,-11.646420411896983
-2022-11-22,-12.920701745924394
-2022-11-23,-13.096172718471248
-2022-11-24,-11.151554892349374
-2022-11-25,-11.774275443108492
-2022-11-28,-11.901599146463404
-2022-11-29,-13.171450938829272
-2022-11-30,-14.416533795903664
-2022-12-01,-13.618542183545008
-2022-12-02,-12.834435287922565
-2022-12-05,-12.177642783305423
-2022-12-06,-13.472968074647682
-2022-12-07,-11.435488060652508
-2022-12-08,-11.176169976320937
-2022-12-09,-10.600199775355573
-2022-12-12,-9.667849006584278
-2022-12-13,-9.17990194225457
-2022-12-14,-7.118212157560748
-2022-12-15,-7.333756517360157
-2022-12-16,-7.120720963097033
-2022-12-19,-7.526770199694091
-2022-12-20,-8.05808186021616
-2022-12-21,-8.507730204191306
-2022-12-22,-9.984762780855723
-2022-12-23,-10.786632595180007
-2022-12-26,-11.430680688535483
-2022-12-27,-10.361663725232258
-2022-12-28,-10.303742613777738
-2022-12-29,-11.029059821084198
-2022-12-30,-9.953919855181235
-2023-01-02,-9.943878135830769
-2023-01-03,-8.884243178995206
-2023-01-04,-8.563607507381066
-2023-01-05,-9.6459499287799
-2023-01-06,-11.15983761498732
-2023-01-09,-11.892450948980954
-2023-01-10,-12.377339530560251
-2023-01-11,-11.046523377520511
-2023-01-12,-10.201333809684833
-2023-01-13,-11.213776700892485
-2023-01-16,-11.202138899892633
-2023-01-17,-11.655636624860422
-2023-01-18,-13.029517203222449
-2023-01-19,-11.451019335358422
-2023-01-20,-10.076062298220773
-2023-01-23,-10.697942640804376
-2023-01-24,-12.07369366832625
-2023-01-25,-12.6148939032052
-2023-01-26,-12.09080811633821
-2023-01-27,-10.860889185655639
-2023-01-30,-11.011035136272513
-2023-01-31,-12.48704294649522
-2023-02-01,-14.147253370814134
-2023-02-02,-13.94418038204476
-2023-02-03,-11.758087988641773
-2023-02-06,-12.247542633906523
-2023-02-07,-13.052390729580491
-2023-02-08,-12.148812449083819
-2023-02-09,-11.60549632297532
-2023-02-10,-10.006640833117338
-2023-02-13,-9.385386374112247
-2023-02-14,-8.13893587813793
-2023-02-15,-6.7478590581121285
-2023-02-16,-5.508499471252014
-2023-02-17,-7.115366384313958
-2023-02-20,-5.867473790174733
-2023-02-21,-6.2126701672398905
-2023-02-22,-7.275898273458848
-2023-02-23,-7.304527733618108
-2023-02-24,-8.552834018749857
-2023-02-27,-10.469126149966916
-2023-02-28,-11.576174472031864
-2023-03-01,-11.441082395516508
-2023-03-02,-12.06064140250497
-2023-03-03,-13.59261511027761
-2023-03-06,-13.841442433429327
-2023-03-07,-15.19947490759728
-2023-03-08,-14.450534453202371
-2023-03-09,-13.836338935715883
-2023-03-10,-11.758576097266628
-2023-03-13,-12.802960904710067
-2023-03-14,-13.159583449843467
-2023-03-15,-14.119040741036878
-2023-03-16,-14.807794110632145
-2023-03-17,-14.480312306001098
-2023-03-20,-15.065750022660044
-2023-03-21,-13.833100549805916
-2023-03-22,-14.804645696338044
-2023-03-23,-15.075771899236388
-2023-03-24,-14.90793499515383
-2023-03-27,-15.017429063927207
-2023-03-28,-16.861226372568428
-2023-03-29,-15.300732032419468
-2023-03-30,-15.413269419875578
-2023-03-31,-16.010482706876356
-2023-04-03,-16.041902081250402
-2023-04-04,-16.022626630176763
-2023-04-05,-14.920077536187492
-2023-04-06,-15.686675688213287
-2023-04-07,-13.090456832887888
-2023-04-10,-12.943394533908878
-2023-04-11,-12.176543246488459
-2023-04-12,-12.05383324086242
-2023-04-13,-12.539338760902144
-2023-04-14,-13.065308957547296
-2023-04-17,-11.51993782383242
-2023-04-18,-12.309093320676963
-2023-04-19,-11.388748060766742
-2023-04-20,-9.987111253625882
-2023-04-21,-9.156897004006385
-2023-04-24,-10.646673221129308
-2023-04-25,-9.988307129297631
-2023-04-26,-10.055854720229446
-2023-04-27,-12.042866829190043
-2023-04-28,-10.971603317597749
-2023-05-01,-10.14693001873918
-2023-05-02,-10.790535544201344
-2023-05-03,-9.822908684350097
-2023-05-04,-11.804096105203463
-2023-05-05,-11.098660275084843
-2023-05-08,-10.337218287744088
-2023-05-09,-10.92656107662687
-2023-05-10,-11.516148900990322
-2023-05-11,-9.304584316677214
-2023-05-12,-10.42700853592641
-2023-05-15,-11.373302455773844
-2023-05-16,-9.585411262782713
-2023-05-17,-10.823788444350972
-2023-05-18,-9.745023741778637
-2023-05-19,-10.842731412911371
-2023-05-22,-11.471059174507419
-2023-05-23,-12.356624549490027
-2023-05-24,-12.351648708187911
-2023-05-25,-12.059135592501331
-2023-05-26,-12.995117395709023
-2023-05-29,-14.939968441015026
-2023-05-30,-14.763125143737486
-2023-05-31,-15.131509744417878
-2023-06-01,-14.795609495045422
-2023-06-02,-12.866470075901779
-2023-06-05,-13.414814872402088
-2023-06-06,-13.016938162285458
-2023-06-07,-13.720305241424823
-2023-06-08,-13.06573796827308
-2023-06-09,-12.339765208078676
-2023-06-12,-11.717561776629001
-2023-06-13,-11.467497438809344
-2023-06-14,-11.625835879549205
-2023-06-15,-12.809057378071962
-2023-06-16,-13.664212322965057
-2023-06-19,-12.769257372175145
-2023-06-20,-14.177692746756508
-2023-06-21,-14.234983452326162
-2023-06-22,-13.61626511614906
-2023-06-23,-13.05593389294064
-2023-06-26,-15.100886625302241
-2023-06-27,-16.119776998129183
-2023-06-28,-15.397869711500693
-2023-06-29,-15.751091699754433
-2023-06-30,-14.554348274612506
-2023-07-03,-15.5295197900781
-2023-07-04,-15.849118808351482
-2023-07-05,-16.990963125226138
-2023-07-06,-16.75318678530952
-2023-07-07,-16.521474507033222
-2023-07-10,-16.09229330324436
-2023-07-11,-15.974017747189212
-2023-07-12,-14.397593438956012
-2023-07-13,-16.405273739775534
-2023-07-14,-17.23130737569353
-2023-07-17,-17.18703296224511
-2023-07-18,-17.072429461887953
-2023-07-19,-15.911004902540743
-2023-07-20,-16.39888397426041
-2023-07-21,-15.57817865825008
-2023-07-24,-15.33512194359571
-2023-07-25,-13.977199962222375
-2023-07-26,-15.389351486663992
-2023-07-27,-15.241405412928046
-2023-07-28,-14.596152717622974
-2023-07-31,-15.052817107540504
-2023-08-01,-13.99390278580566
-2023-08-02,-13.705514214234388
-2023-08-03,-13.761972523634295
-2023-08-04,-13.895395646794842
-2023-08-07,-13.466529247953403
-2023-08-08,-12.392828703196615
-2023-08-09,-12.895915395742108
-2023-08-10,-13.977959536046917
-2023-08-11,-11.586743344270216
-2023-08-14,-12.407601497222663
-2023-08-15,-12.024373951105021
-2023-08-16,-12.102092545632459
-2023-08-17,-12.325994966677511
-2023-08-18,-12.284999089653933
-2023-08-21,-13.190100246785182
-2023-08-22,-12.581086748018041
-2023-08-23,-14.24853846740408
-2023-08-24,-13.56587822013402
-2023-08-25,-13.738845318160811
-2023-08-28,-15.488767757554603
-2023-08-29,-15.714975864854672
-2023-08-30,-14.362340453372601
-2023-08-31,-13.87721445382738
-2023-09-01,-12.556971315555773
-2023-09-04,-11.917414527444542
-2023-09-05,-12.322506268949464
-2023-09-06,-11.636087002898359
-2023-09-07,-11.010665482613723
-2023-09-08,-11.554206685832046
-2023-09-11,-10.311163421138843
-2023-09-12,-8.983909002536869
-2023-09-13,-8.032187647159184
-2023-09-14,-6.613364795493982
-2023-09-15,-5.419329335596233
-2023-09-18,-5.608789678117726
-2023-09-19,-5.8881788137934485
-2023-09-20,-5.7977944455406
-2023-09-21,-7.159260128597837
-2023-09-22,-7.05793688641383
-2023-09-25,-7.8913955206497075
-2023-09-26,-8.508580959710397
-2023-09-27,-8.610728489699525
-2023-09-28,-8.188003764065195
-2023-09-29,-8.362784820286564
-2023-10-02,-7.949031205405605
-2023-10-03,-5.741631402195296
-2023-10-04,-4.914093847491602
-2023-10-05,-4.4674173602362695
-2023-10-06,-2.647838581850569
-2023-10-09,-2.048413664154259
-2023-10-10,-3.45405952241056
-2023-10-11,-5.707369707165629
-2023-10-12,-4.5778379205004205
-2023-10-13,-3.844323613302007
-2023-10-16,-3.8641625306182705
-2023-10-17,-5.772334058824401
-2023-10-18,-6.580926098544097
-2023-10-19,-7.934684057580862
-2023-10-20,-6.565233838214438
-2023-10-23,-6.841369791839616
-2023-10-24,-7.450522853193845
-2023-10-25,-7.896094107560107
-2023-10-26,-8.808606602333338
-2023-10-27,-7.94531145529377
-2023-10-30,-8.704153742927776
-2023-10-31,-7.810072294296702
+2020-01-01,100.41880037930366
+2020-01-02,98.8384685376672
+2020-01-03,97.93377826158496
+2020-01-06,97.47982440424616
+2020-01-07,99.43938581258811
+2020-01-08,99.14869772801907
+2020-01-09,97.35601733022777
+2020-01-10,98.16017147960984
+2020-01-13,98.51581966606808
+2020-01-14,98.42639270633707
+2020-01-15,100.24527393141585
+2020-01-16,100.71765218525475
+2020-01-17,100.9536032078628
+2020-01-20,102.26973268400373
+2020-01-21,101.22025973621696
+2020-01-22,100.29324194653744
+2020-01-23,100.57239431581402
+2020-01-24,99.24137054840095
+2020-01-27,98.38211500855094
+2020-01-28,97.69569609761264
+2020-01-29,97.26284627582054
+2020-01-30,97.77448153915009
+2020-01-31,98.00863250578918
+2020-02-03,98.89107218339957
+2020-02-04,97.34177371288851
+2020-02-05,97.02644624796012
+2020-02-06,96.79975446309484
+2020-02-07,96.5746464385124
+2020-02-10,97.84431178225718
+2020-02-11,97.23271184797764
+2020-02-12,97.56801569611004
+2020-02-13,97.43181449693975
+2020-02-14,96.81577709734866
+2020-02-17,98.00254350189938
+2020-02-18,97.10142218527264
+2020-02-19,96.06354898425771
+2020-02-20,94.08480399012309
+2020-02-21,93.8015363021097
+2020-02-24,93.08748759074233
+2020-02-25,94.97987563935783
+2020-02-26,96.02060554745455
+2020-02-27,97.05258941033296
+2020-02-28,99.19816865776536
+2020-03-02,99.20774614152128
+2020-03-03,99.63238145384877
+2020-03-04,102.01705603374351
+2020-03-05,100.9192031547445
+2020-03-06,100.29016827124701
+2020-03-09,97.7972430970185
+2020-03-10,98.82162709764971
+2020-03-11,97.08236734139648
+2020-03-12,97.62831036012493
+2020-03-13,98.60034867606055
+2020-03-16,97.93584212467539
+2020-03-17,98.97475999193335
+2020-03-18,97.87116452093395
+2020-03-19,97.7085697732295
+2020-03-20,97.66194274563847
+2020-03-23,97.46232938776657
+2020-03-24,97.73388151046845
+2020-03-25,97.10872562031147
+2020-03-26,96.68916462702411
+2020-03-27,97.57402920157766
+2020-03-30,98.33149999693795
+2020-03-31,98.69522632815844
+2020-04-01,98.3357557719807
+2020-04-02,97.71570319071373
+2020-04-03,96.72625069407715
+2020-04-06,95.31652406164419
+2020-04-07,96.76419847148419
+2020-04-08,96.27233737199641
+2020-04-09,95.48870062164436
+2020-04-10,97.04813895361502
+2020-04-13,97.50934487949064
+2020-04-14,98.82224404688054
+2020-04-15,97.4838899338018
+2020-04-16,96.98855876363778
+2020-04-17,98.61084222978684
+2020-04-20,99.32753943539578
+2020-04-21,99.34820115923873
+2020-04-22,99.32462887043663
+2020-04-23,99.54140580997675
+2020-04-24,98.28354156654294
+2020-04-27,98.558900289494
+2020-04-28,97.16230321181091
+2020-04-29,96.76977768451722
+2020-04-30,97.23827107668687
+2020-05-01,97.72421227773391
+2020-05-04,98.09655706195048
+2020-05-05,96.79649451832834
+2020-05-06,95.29831543277906
+2020-05-07,95.9307515015837
+2020-05-08,95.22420199944315
+2020-05-11,94.94524374685076
+2020-05-12,94.68539091048736
+2020-05-13,93.19596931078982
+2020-05-14,94.18820125700084
+2020-05-15,95.12870110037517
+2020-05-18,95.09158224218227
+2020-05-19,94.75589547557543
+2020-05-20,95.09980533633812
+2020-05-21,95.42743360407792
+2020-05-22,96.13869733821055
+2020-05-25,97.51865828015264
+2020-05-26,96.08223324081749
+2020-05-27,97.07446524704707
+2020-05-28,97.41062562347147
+2020-05-29,97.99427259806377
+2020-06-01,98.57219286879649
+2020-06-02,98.36569400590352
+2020-06-03,99.51015014356692
+2020-06-04,97.7920635266045
+2020-06-05,98.6171763152511
+2020-06-08,100.49683847256938
+2020-06-09,100.46517418256312
+2020-06-10,100.36862086781422
+2020-06-11,99.860978249344
+2020-06-12,100.72731272053537
+2020-06-15,99.51798574193343
+2020-06-16,99.07009271767478
+2020-06-17,97.4773942563283
+2020-06-18,97.98241249444139
+2020-06-19,97.38059717519434
+2020-06-22,98.53788842564691
+2020-06-23,98.34721170859191
+2020-06-24,97.86975894325307
+2020-06-25,99.26306107942153
+2020-06-26,98.40688170644776
+2020-06-29,98.5285498062234
+2020-06-30,98.3538803470668
+2020-07-01,98.48474493515333
+2020-07-02,98.92137561281422
+2020-07-03,100.28154217509677
+2020-07-06,100.16517922628101
+2020-07-07,99.7331032842054
+2020-07-08,98.91480327784335
+2020-07-09,99.66948590468303
+2020-07-10,99.7284880563705
+2020-07-13,97.55496019995175
+2020-07-14,96.97732353615781
+2020-07-15,95.92573822530204
+2020-07-16,97.60436843056115
+2020-07-17,98.48166025038796
+2020-07-20,97.78084854606979
+2020-07-21,98.0849066227443
+2020-07-22,98.81811269029603
+2020-07-23,100.06514240039334
+2020-07-24,98.31189496360054
+2020-07-27,99.80838324753049
+2020-07-28,100.44617248361885
+2020-07-29,100.9605137504942
+2020-07-30,99.73391846369762
+2020-07-31,99.44204007742331
+2020-08-03,100.0245637115821
+2020-08-04,100.05149685615804
+2020-08-05,99.62754813891401
+2020-08-06,99.99004071491841
+2020-08-07,102.2789678442715
+2020-08-10,103.69117914023983
+2020-08-11,104.62954337112652
+2020-08-12,105.29792166386736
+2020-08-13,104.86374327464196
+2020-08-14,103.73511335221377
+2020-08-17,103.06881136441307
+2020-08-18,101.92871930281495
+2020-08-19,101.80072102801341
+2020-08-20,102.09433478694467
+2020-08-21,102.91962667485366
+2020-08-24,103.51629859037479
+2020-08-25,104.36877473423034
+2020-08-26,104.75673972005649
+2020-08-27,106.14531269472761
+2020-08-28,106.8853757752142
+2020-08-31,108.56345720203018
+2020-09-01,107.91756318601153
+2020-09-02,105.86894800072697
+2020-09-03,106.43783674418785
+2020-09-04,109.25557392745627
+2020-09-07,108.51990438845274
+2020-09-08,107.67814477441071
+2020-09-09,107.59244907690355
+2020-09-10,109.20381958673069
+2020-09-11,107.17225458206154
+2020-09-14,107.63889547444417
+2020-09-15,107.66299003278338
+2020-09-16,104.60175588249862
+2020-09-17,104.59810419992144
+2020-09-18,105.32886529416004
+2020-09-21,105.13560793565513
+2020-09-22,105.38310142075322
+2020-09-23,107.17417548791823
+2020-09-24,105.36813657378347
+2020-09-25,106.18036336391256
+2020-09-28,105.91693935679342
+2020-09-29,106.1535520060084
+2020-09-30,106.28328243223764
+2020-10-01,104.51808655961679
+2020-10-02,105.63138875301851
+2020-10-05,105.03475105206195
+2020-10-06,104.8771295372807
+2020-10-07,104.63930792606237
+2020-10-08,103.90196383739865
+2020-10-09,105.58755337032278
+2020-10-12,105.00792906891733
+2020-10-13,104.56432167977292
+2020-10-14,105.00280600042254
+2020-10-15,105.27560480934514
+2020-10-16,104.8333030813479
+2020-10-19,104.59493680431264
+2020-10-20,104.18529529564108
+2020-10-21,105.11046803482131
+2020-10-22,105.80666449383074
+2020-10-23,108.649552431816
+2020-10-26,109.04225323745528
+2020-10-27,109.4732619802375
+2020-10-28,110.1396165396793
+2020-10-29,109.51969108423789
+2020-10-30,109.43702190204678
+2020-11-02,109.34687713057787
+2020-11-03,109.35718573702945
+2020-11-04,108.33688505941963
+2020-11-05,107.53818773111996
+2020-11-06,106.88782579022424
+2020-11-09,105.79185635206625
+2020-11-10,105.36228072437022
+2020-11-11,107.14589382876002
+2020-11-12,107.34462949269307
+2020-11-13,107.40398314463782
+2020-11-16,107.69809825934598
+2020-11-17,105.73070129255733
+2020-11-18,104.9790431704523
+2020-11-19,106.15100111752184
+2020-11-20,106.11933729272529
+2020-11-23,105.51451429860965
+2020-11-24,104.19881210032887
+2020-11-25,105.60558581471223
+2020-11-26,104.5376646481093
+2020-11-27,104.7407507016034
+2020-11-30,105.75200658385727
+2020-12-01,107.2685477357266
+2020-12-02,106.65667572337969
+2020-12-03,107.32541206642254
+2020-12-04,106.39038293802261
+2020-12-07,106.06169200273172
+2020-12-08,106.80646638769366
+2020-12-09,105.25718547466158
+2020-12-10,106.25972855693135
+2020-12-11,106.21149751015932
+2020-12-14,107.5227575965914
+2020-12-15,108.75801068034473
+2020-12-16,108.89941400684933
+2020-12-17,109.36983024195435
+2020-12-18,109.97573361597443
+2020-12-21,109.0882795543501
+2020-12-22,109.06867924333257
+2020-12-23,108.99758762234804
+2020-12-24,109.68810205815196
+2020-12-25,109.87507268911077
+2020-12-28,110.06056778391513
+2020-12-29,111.56526881325428
+2020-12-30,110.53486008693795
+2020-12-31,109.71378449289482
+2021-01-01,108.35064722692131
+2021-01-04,108.49549003684378
+2021-01-05,108.63444850734349
+2021-01-06,110.17886040053016
+2021-01-07,111.37947813733884
+2021-01-08,111.50749723278513
+2021-01-11,110.90251073250961
+2021-01-12,111.92808727751546
+2021-01-13,111.5692844837142
+2021-01-14,109.88403451258704
+2021-01-15,108.92768687207015
+2021-01-18,108.8210397667505
+2021-01-19,110.09731331336579
+2021-01-20,110.68262255818351
+2021-01-21,111.2270474878696
+2021-01-22,111.55515249356951
+2021-01-25,112.49129965708616
+2021-01-26,112.24002222973436
+2021-01-27,113.1033255286392
+2021-01-28,112.81060645574976
+2021-01-29,114.10500002547002
+2021-02-01,114.61045266867865
+2021-02-02,113.87289650509283
+2021-02-03,114.02385725953548
+2021-02-04,114.23403687187079
+2021-02-05,113.30515597704216
+2021-02-08,112.64956053294388
+2021-02-09,112.35922004941759
+2021-02-10,112.78707825946836
+2021-02-11,110.39942671458707
+2021-02-12,109.94507166341896
+2021-02-15,109.79855012894382
+2021-02-16,108.577682804911
+2021-02-17,109.8004756081757
+2021-02-18,110.614972631815
+2021-02-19,111.39859340049989
+2021-02-22,111.34424890354866
+2021-02-23,110.39240716057522
+2021-02-24,110.1286199933843
+2021-02-25,110.87647443732213
+2021-02-26,112.34276791472897
+2021-03-01,112.4150210574453
+2021-03-02,111.35452778707153
+2021-03-03,112.50873014779148
+2021-03-04,112.19683964488854
+2021-03-05,113.59941416632726
+2021-03-08,114.6155626632604
+2021-03-09,114.14600642518273
+2021-03-10,113.28388460768464
+2021-03-11,112.30795183229706
+2021-03-12,112.70113647622635
+2021-03-15,114.24069040689548
+2021-03-16,112.97737049090175
+2021-03-17,113.47453705590868
+2021-03-18,112.75412656150488
+2021-03-19,112.53140291058376
+2021-03-22,112.17019460849342
+2021-03-23,111.53484632353943
+2021-03-24,111.20427382485343
+2021-03-25,111.8111705299709
+2021-03-26,111.2706743642794
+2021-03-29,111.51831260215646
+2021-03-30,111.87752748672581
+2021-03-31,113.23279794014967
+2021-04-01,114.06422670138043
+2021-04-02,114.0734640616753
+2021-04-05,113.22232339582328
+2021-04-06,112.2260652137853
+2021-04-07,112.62540473412264
+2021-04-08,110.04032377520588
+2021-04-09,107.5250102115189
+2021-04-12,107.85026763056429
+2021-04-13,108.28521531156794
+2021-04-14,108.6212086527699
+2021-04-15,110.49973081090907
+2021-04-16,110.01988312490943
+2021-04-19,109.49037162038606
+2021-04-20,110.110371646419
+2021-04-21,111.14881049007823
+2021-04-22,111.33234609022946
+2021-04-23,110.83920108996605
+2021-04-26,112.01244264087666
+2021-04-27,112.21088169100226
+2021-04-28,110.68210562822041
+2021-04-29,109.70234549467553
+2021-04-30,110.86849943707928
+2021-05-03,111.82990125191152
+2021-05-04,112.55150952842376
+2021-05-05,111.56461335373125
+2021-05-06,111.51279133702685
+2021-05-07,110.41045468740356
+2021-05-10,109.03959334643645
+2021-05-11,108.18080315064928
+2021-05-12,109.10930848989162
+2021-05-13,108.58749089514134
+2021-05-14,108.3971465416357
+2021-05-17,107.09375053378716
+2021-05-18,108.54952809061795
+2021-05-19,111.10134630332458
+2021-05-20,110.7743616538686
+2021-05-21,110.18510011867562
+2021-05-24,110.68333466698172
+2021-05-25,110.09409250604382
+2021-05-26,110.33612291668138
+2021-05-27,112.02572171555252
+2021-05-28,111.90828717694225
+2021-05-31,113.28908153776918
+2021-06-01,112.58861457187325
+2021-06-02,111.1699295862876
+2021-06-03,112.76307580599824
+2021-06-04,113.28591949429068
+2021-06-07,113.69706888262137
+2021-06-08,114.27918176806048
+2021-06-09,116.46218299740542
+2021-06-10,117.48200409894709
+2021-06-11,118.73424680143852
+2021-06-14,116.94689123370206
+2021-06-15,116.54931873998325
+2021-06-16,116.02296697095365
+2021-06-17,116.31917535661556
+2021-06-18,116.26776185625806
+2021-06-21,116.4119835011982
+2021-06-22,117.25209019163485
+2021-06-23,118.83350745058299
+2021-06-24,119.4742484443078
+2021-06-25,118.85175585595549
+2021-06-28,118.78346202932677
+2021-06-29,119.80696177117063
+2021-06-30,119.08497944608449
+2021-07-01,118.65477864904885
+2021-07-02,117.59991288271017
+2021-07-05,118.32340344783461
+2021-07-06,117.45946805765983
+2021-07-07,118.07949753823772
+2021-07-08,117.40127538148319
+2021-07-09,118.4742777363142
+2021-07-12,118.55757751899503
+2021-07-13,119.60879058974479
+2021-07-14,122.02481426542104
+2021-07-15,121.4304096144493
+2021-07-16,120.00768520934697
+2021-07-19,121.02052181860823
+2021-07-20,121.89537843226155
+2021-07-21,120.84697850222864
+2021-07-22,119.69482696676832
+2021-07-23,118.79273154361046
+2021-07-26,118.23111283518395
+2021-07-27,118.18565251744128
+2021-07-28,118.72799952846474
+2021-07-29,117.7492412535324
+2021-07-30,117.80048538787426
+2021-08-02,117.89567799848437
+2021-08-03,117.51053347922638
+2021-08-04,116.58357269551898
+2021-08-05,117.82272411341287
+2021-08-06,118.24614925874629
+2021-08-09,118.62558014748639
+2021-08-10,119.58857168699974
+2021-08-11,117.69852163918273
+2021-08-12,118.85561838291945
+2021-08-13,117.73704889712818
+2021-08-16,117.85469112721196
+2021-08-17,116.76481473146765
+2021-08-18,117.08211192663391
+2021-08-19,117.78481659330089
+2021-08-20,118.85617064801421
+2021-08-23,121.28057592905357
+2021-08-24,119.3079483032084
+2021-08-25,118.96003922558505
+2021-08-26,119.06687414436139
+2021-08-27,119.6313672466849
+2021-08-30,118.68214328363074
+2021-08-31,119.40359273936892
+2021-09-01,118.78554258550334
+2021-09-02,117.72150021313676
+2021-09-03,118.16122220362757
+2021-09-06,116.99273395901298
+2021-09-07,117.55672262392451
+2021-09-08,115.89476657240343
+2021-09-09,114.53793589583941
+2021-09-10,113.61786090520584
+2021-09-13,113.84633152974399
+2021-09-14,114.65591797073094
+2021-09-15,114.97274252551082
+2021-09-16,114.41433600408735
+2021-09-17,114.57716425393826
+2021-09-20,113.04912753989385
+2021-09-21,110.7941963600997
+2021-09-22,109.21807445006102
+2021-09-23,108.3532050013972
+2021-09-24,108.9302393275076
+2021-09-27,108.22386986979036
+2021-09-28,110.77106377720102
+2021-09-29,110.82289834980217
+2021-09-30,110.03922998594832
+2021-10-01,110.46843214935971
+2021-10-04,109.60831362586481
+2021-10-05,109.60200315913207
+2021-10-06,108.87324194443482
+2021-10-07,109.31625747370998
+2021-10-08,109.12935193523938
+2021-10-11,107.73188313351103
+2021-10-12,109.0710883425476
+2021-10-13,109.87917087358797
+2021-10-14,109.57229744679711
+2021-10-15,108.2453016903129
+2021-10-18,108.73911632130306
+2021-10-19,110.8187256706882
+2021-10-20,110.08076014600879
+2021-10-21,110.36706152593743
+2021-10-22,109.0149787752009
+2021-10-25,108.25108301811785
+2021-10-26,108.06819810563826
+2021-10-27,106.17685056557833
+2021-10-28,106.55599714629993
+2021-10-29,104.9284410172542
+2021-11-01,103.37173568988047
+2021-11-02,104.36397718736103
+2021-11-03,104.91419121531035
+2021-11-04,105.34887125253019
+2021-11-05,104.48363632870593
+2021-11-08,103.39520244176485
+2021-11-09,101.85624112920806
+2021-11-10,99.57926012726868
+2021-11-11,99.58878166453663
+2021-11-12,101.61351182926582
+2021-11-15,101.62263221384302
+2021-11-16,100.89464129816949
+2021-11-17,100.88294633957389
+2021-11-18,100.98877364452802
+2021-11-19,99.04910954002052
+2021-11-22,98.85211506076261
+2021-11-23,98.74433182738952
+2021-11-24,98.94007072108325
+2021-11-25,99.06928333655762
+2021-11-26,97.717836346104
+2021-11-29,99.0598880909135
+2021-11-30,98.60596067081183
+2021-12-01,97.45636336010162
+2021-12-02,97.96312912683177
+2021-12-03,98.56416398101231
+2021-12-06,100.01647707807027
+2021-12-07,101.15528606207569
+2021-12-08,101.33452463160467
+2021-12-09,100.64322745316797
+2021-12-10,100.62428908530394
+2021-12-13,100.90497721233965
+2021-12-14,100.66842294986816
+2021-12-15,100.98982663923066
+2021-12-16,102.60405255498233
+2021-12-17,104.44814259766497
+2021-12-20,103.437038403961
+2021-12-21,102.38244808221471
+2021-12-22,105.30573902006401
+2021-12-23,105.31043421900084
+2021-12-24,104.5179014075718
+2021-12-27,103.73971224141425
+2021-12-28,103.94211000018763
+2021-12-29,103.09300282439014
+2021-12-30,102.11189562328065
+2021-12-31,102.55862786638221
+2022-01-03,102.43064455354163
+2022-01-04,103.89022277584559
+2022-01-05,103.08899653936172
+2022-01-06,101.99096283933495
+2022-01-07,101.55161951772789
+2022-01-10,103.55435705778584
+2022-01-11,101.8325111888162
+2022-01-12,101.99122292696575
+2022-01-13,102.39848939781237
+2022-01-14,101.24467294816822
+2022-01-17,99.03506690911918
+2022-01-18,99.2228257981884
+2022-01-19,98.84516206480903
+2022-01-20,100.55902284649687
+2022-01-21,100.91854366466141
+2022-01-24,99.68713864767643
+2022-01-25,100.96545902320379
+2022-01-26,98.29322712435798
+2022-01-27,99.60790184839742
+2022-01-28,99.31388308977242
+2022-01-31,99.43206063017549
+2022-02-01,99.7159775952767
+2022-02-02,100.39447208089133
+2022-02-03,101.73145974474463
+2022-02-04,101.6519142527159
+2022-02-07,102.26405682829404
+2022-02-08,102.53654297220135
+2022-02-09,104.01438422702627
+2022-02-10,104.42207242676002
+2022-02-11,103.40870228352668
+2022-02-14,104.71985477739862
+2022-02-15,103.9937695456507
+2022-02-16,103.90372302952267
+2022-02-17,101.22605371219282
+2022-02-18,100.28623588814696
+2022-02-21,99.5652540053712
+2022-02-22,99.8183735134854
+2022-02-23,100.24595032557919
+2022-02-24,98.72774294896831
+2022-02-25,98.57160743243224
+2022-02-28,97.8045415462564
+2022-03-01,99.48256093652179
+2022-03-02,100.456188990334
+2022-03-03,102.04336803572258
+2022-03-04,100.1207762715425
+2022-03-07,100.52388243967401
+2022-03-08,101.57636027339574
+2022-03-09,100.86339048366332
+2022-03-10,101.8425860252348
+2022-03-11,102.51175186172202
+2022-03-14,101.02393950399302
+2022-03-15,101.596393240563
+2022-03-16,100.72371241166087
+2022-03-17,101.55102622418116
+2022-03-18,102.39124473593013
+2022-03-21,101.07013996168739
+2022-03-22,100.94880732988733
+2022-03-23,99.96195564088914
+2022-03-24,100.03049098246215
+2022-03-25,99.57019473579996
+2022-03-28,99.29608009358968
+2022-03-29,99.00418620631808
+2022-03-30,99.4379786209415
+2022-03-31,98.8172464108606
+2022-04-01,98.75831331379207
+2022-04-04,97.7303754071647
+2022-04-05,95.98816401280921
+2022-04-06,96.1702275080129
+2022-04-07,95.82977444725043
+2022-04-08,96.56604760732415
+2022-04-11,96.65833511320206
+2022-04-12,94.87155585764863
+2022-04-13,95.9437369305589
+2022-04-14,96.88432807953522
+2022-04-15,97.66387916117985
+2022-04-18,96.6817318179565
+2022-04-19,97.75625333386844
+2022-04-20,96.82304835807172
+2022-04-21,94.83408475895143
+2022-04-22,93.29579265014881
+2022-04-25,92.43509485201655
+2022-04-26,91.65293965354672
+2022-04-27,91.03233764035424
+2022-04-28,91.38002676142898
+2022-04-29,92.01471537481373
+2022-05-02,92.75354485935966
+2022-05-03,93.93190603895609
+2022-05-04,94.03757010374751
+2022-05-05,91.66289063273378
+2022-05-06,90.46494542045312
+2022-05-09,90.01143347276641
+2022-05-10,89.12346796055142
+2022-05-11,89.14887395593189
+2022-05-12,89.53287197316399
+2022-05-13,88.8750294770643
+2022-05-16,90.9981979612398
+2022-05-17,91.17921150686712
+2022-05-18,91.9233926461424
+2022-05-19,90.859275756321
+2022-05-20,92.12853372085445
+2022-05-23,91.41018739976883
+2022-05-24,91.96506569259608
+2022-05-25,91.69130460979721
+2022-05-26,90.975248383358
+2022-05-27,90.01737899876989
+2022-05-30,90.1596507416652
+2022-05-31,90.07741177804975
+2022-06-01,90.08764730573849
+2022-06-02,89.39680372764649
+2022-06-03,90.22782230863207
+2022-06-06,89.27369772274909
+2022-06-07,89.96628001316974
+2022-06-08,90.13493806217878
+2022-06-09,90.40180598983808
+2022-06-10,88.68903445741691
+2022-06-13,87.73726592312518
+2022-06-14,88.61284134667162
+2022-06-15,88.71726511637797
+2022-06-16,88.8730997603316
+2022-06-17,89.57059372126878
+2022-06-20,90.75759796675597
+2022-06-21,90.94825279033569
+2022-06-22,89.81797394416003
+2022-06-23,89.40663226997646
+2022-06-24,88.30479166927307
+2022-06-27,89.00429413770094
+2022-06-28,87.86142189790957
+2022-06-29,88.75696832564536
+2022-06-30,88.26718990735277
+2022-07-01,87.83493372613985
+2022-07-04,88.6255923069959
+2022-07-05,89.66562921310916
+2022-07-06,88.5822285722538
+2022-07-07,87.77693722522322
+2022-07-08,89.40006076931084
+2022-07-11,89.06989986462428
+2022-07-12,90.62802393014698
+2022-07-13,89.91306216777056
+2022-07-14,89.39829179822996
+2022-07-15,90.61004180834426
+2022-07-18,90.591957787098
+2022-07-19,89.97282334889758
+2022-07-20,91.85834520363541
+2022-07-21,93.34535369691697
+2022-07-22,94.18118841291032
+2022-07-25,96.71999614559849
+2022-07-26,95.63565005424431
+2022-07-27,96.07045397007094
+2022-07-28,95.99456496290793
+2022-07-29,94.68884481392556
+2022-08-01,93.05561386489595
+2022-08-02,92.0235432336588
+2022-08-03,92.31824089504161
+2022-08-04,93.25034880333634
+2022-08-05,92.94739103838185
+2022-08-08,94.77208587712725
+2022-08-09,94.65022938645919
+2022-08-10,92.69403176403455
+2022-08-11,94.11659263761621
+2022-08-12,93.5711589281545
+2022-08-15,93.84515909463944
+2022-08-16,93.68732673535575
+2022-08-17,94.55439373034854
+2022-08-18,93.50863583956848
+2022-08-19,92.40293089231338
+2022-08-22,92.6844400372465
+2022-08-23,93.32348288941795
+2022-08-24,93.45235650980968
+2022-08-25,95.5312023988772
+2022-08-26,94.66136384184605
+2022-08-29,95.20170176501914
+2022-08-30,94.73085829856204
+2022-08-31,95.06144914571152
+2022-09-01,95.89294922786793
+2022-09-02,96.73079379218926
+2022-09-05,97.97349289523363
+2022-09-06,97.14232460741047
+2022-09-07,96.01953591751601
+2022-09-08,96.76871840032281
+2022-09-09,97.89092940760817
+2022-09-12,98.17097178233028
+2022-09-13,97.5966878378544
+2022-09-14,98.33697701738521
+2022-09-15,99.12470679950832
+2022-09-16,98.00967477033437
+2022-09-19,96.93947882412624
+2022-09-20,97.71295744574053
+2022-09-21,97.57348683951396
+2022-09-22,97.67354759094232
+2022-09-23,97.68122811841053
+2022-09-26,97.52666475215105
+2022-09-27,95.18976484462533
+2022-09-28,96.00646988936677
+2022-09-29,95.48835500900285
+2022-09-30,96.57358267455089
+2022-10-03,97.38987590505721
+2022-10-04,97.30973229270856
+2022-10-05,97.3792961164355
+2022-10-06,97.1878840031436
+2022-10-07,97.29606534733529
+2022-10-10,96.67347904182112
+2022-10-11,97.15953340085832
+2022-10-12,96.52530400462481
+2022-10-13,97.88364510278782
+2022-10-14,98.06844611176342
+2022-10-17,97.28351990978032
+2022-10-18,98.03926798810141
+2022-10-19,99.06940821281778
+2022-10-20,99.46093988626129
+2022-10-21,100.75716998062627
+2022-10-24,101.79799541901913
+2022-10-25,101.50366258860547
+2022-10-26,100.68267803468814
+2022-10-27,101.25601090648586
+2022-10-28,100.0391643707913
+2022-10-31,102.58142763465872
+2022-11-01,103.14290351360225
+2022-11-02,103.85891966840643
+2022-11-03,102.75050481423158
+2022-11-04,104.3314038086073
+2022-11-07,105.08019219624106
+2022-11-08,105.81816424468438
+2022-11-09,106.71671989155772
+2022-11-10,107.54938325860259
+2022-11-11,106.39399791864672
+2022-11-14,106.3777412643885
+2022-11-15,105.22079629790902
+2022-11-16,103.25756570255979
+2022-11-17,103.82664145275027
+2022-11-18,102.13398727315325
+2022-11-21,101.76945074987658
+2022-11-22,100.65744777478007
+2022-11-23,99.82524891823778
+2022-11-24,101.80271306762828
+2022-11-25,101.260539065177
+2022-11-28,100.90543726019479
+2022-11-29,101.44361834986908
+2022-11-30,100.36531235228831
+2022-12-01,100.19333100748393
+2022-12-02,97.9064940137259
+2022-12-05,99.90038819631981
+2022-12-06,100.95447421102924
+2022-12-07,103.85709244437051
+2022-12-08,103.21191066895716
+2022-12-09,101.43586726950477
+2022-12-12,99.44072112210885
+2022-12-13,100.23734117822376
+2022-12-14,101.45767841790767
+2022-12-15,100.49992295917573
+2022-12-16,100.05695308158286
+2022-12-19,100.06901077728814
+2022-12-20,100.8337395913798
+2022-12-21,101.50370640555676
+2022-12-22,101.86300137784885
+2022-12-23,103.1681485909314
+2022-12-26,103.55547312279205
+2022-12-27,105.40913352448729
+2022-12-28,107.22078012222266
+2022-12-29,107.06759329616685
+2022-12-30,104.93022808792396
+2023-01-02,104.14065609562833
+2023-01-03,104.24381243658816
+2023-01-04,103.08088734683565
+2023-01-05,103.76672118716613
+2023-01-06,103.53710257934705
+2023-01-09,103.93758289617854
+2023-01-10,102.59575302779385
+2023-01-11,101.46349206639087
+2023-01-12,100.61534260455855
+2023-01-13,102.84561750848485
+2023-01-16,103.28347839568619
+2023-01-17,103.94871226312878
+2023-01-18,104.04161744536509
+2023-01-19,103.11148165705524
+2023-01-20,102.71778496751247
+2023-01-23,102.03704051206302
+2023-01-24,100.47931199338637
+2023-01-25,101.8833839436347
+2023-01-26,102.12344837142302
+2023-01-27,101.0210494471518
+2023-01-30,100.57278895681985
+2023-01-31,101.21768786192291
+2023-02-01,100.8229596613104
+2023-02-02,100.97254587071451
+2023-02-03,100.99496808600968
+2023-02-06,100.86225154795339
+2023-02-07,99.97300072909465
+2023-02-08,100.10867115780803
+2023-02-09,101.881788069991
+2023-02-10,100.75729446345545
+2023-02-13,102.23837636832542
+2023-02-14,101.78023436435306
+2023-02-15,101.78899874734788
+2023-02-16,102.38319617350813
+2023-02-17,100.03590626470915
+2023-02-20,98.84031442537152
+2023-02-21,97.82232847170526
+2023-02-22,97.51503151970336
+2023-02-23,96.51549708077013
+2023-02-24,96.43393316110127
+2023-02-27,97.81930144377368
+2023-02-28,97.53372872447868
+2023-03-01,98.77838520431362
+2023-03-02,97.5717007299995
+2023-03-03,97.96329151535309
+2023-03-06,97.95423524929947
+2023-03-07,97.46488670249295
+2023-03-08,95.96566571664057
+2023-03-09,95.46733583723874
+2023-03-10,95.45687441132968
+2023-03-13,95.3805735940646
+2023-03-14,95.23258346345253
+2023-03-15,94.61522017143135
+2023-03-16,93.49354569146016
+2023-03-17,94.04073823797101
+2023-03-20,93.87251981243281
+2023-03-21,93.28905085456765
+2023-03-22,93.67145039857957
+2023-03-23,92.3795604786086
+2023-03-24,93.25749109434095
+2023-03-27,94.05827462026977
+2023-03-28,93.39365569263202
+2023-03-29,93.14853676473095
+2023-03-30,92.45126277883361
+2023-03-31,93.00677400699394
+2023-04-03,93.00977126711909
+2023-04-04,93.65670116255293
+2023-04-05,94.42473914860648
+2023-04-06,93.32586891536862
+2023-04-07,93.71340879376467
+2023-04-10,95.40622818542703
+2023-04-11,95.08466976128881
+2023-04-12,95.88159706356146
+2023-04-13,97.5074504565326
+2023-04-14,98.86499695012199
+2023-04-17,99.10854250053602
+2023-04-18,98.83783595014106
+2023-04-19,99.47638419484595
+2023-04-20,98.78010197101251
+2023-04-21,100.01145621555804
+2023-04-24,98.82169982983564
+2023-04-25,97.08123529183842
+2023-04-26,97.48606627298861
+2023-04-27,98.23941827777273
+2023-04-28,98.7779281595424
+2023-05-01,99.78506699375241
+2023-05-02,98.59055454767022
+2023-05-03,100.36079434039466
+2023-05-04,99.54832808026269
+2023-05-05,99.05503524161739
+2023-05-08,99.43519650806111
+2023-05-09,100.16578397108917
+2023-05-10,100.61912879412915
+2023-05-11,101.41570181352202
+2023-05-12,101.09917398201634
+2023-05-15,101.38978907147829
+2023-05-16,100.33451475211675
+2023-05-17,101.28990587318481
+2023-05-18,100.36146583106968
+2023-05-19,101.74959728478781
+2023-05-22,100.99877816971532
+2023-05-23,102.13036852965764
+2023-05-24,104.02949931123402
+2023-05-25,105.76936975078488
+2023-05-26,105.06517582110465
+2023-05-29,105.56114711025957
+2023-05-30,105.32576683953789
+2023-05-31,105.83546766085729
+2023-06-01,106.78559120062212
+2023-06-02,106.84508703733127
+2023-06-05,107.23419118214042
+2023-06-06,108.27026963147648
+2023-06-07,108.26489319917924
+2023-06-08,109.85805951890697
+2023-06-09,109.37168072549032
+2023-06-12,110.392238476581
+2023-06-13,111.32479618174114
+2023-06-14,110.25395332717099
+2023-06-15,108.12714693939276
+2023-06-16,108.82649635188446
+2023-06-19,108.80771969692529
+2023-06-20,110.79460695320873
+2023-06-21,112.79768252841116
+2023-06-22,112.21040905969744
+2023-06-23,112.24620715226905
+2023-06-26,112.76487688231967
+2023-06-27,111.56051589253542
+2023-06-28,110.57108581469244
+2023-06-29,111.94014726563456
+2023-06-30,114.09575074497296
+2023-07-03,116.32530036187933
+2023-07-04,118.40572273074086
+2023-07-05,118.97839121854645
+2023-07-06,121.06522318941157
+2023-07-07,120.00552313376265
+2023-07-10,120.24924103414973
+2023-07-11,119.7561997464045
+2023-07-12,120.31900462530251
+2023-07-13,119.25353362843518
+2023-07-14,119.76345279565872
+2023-07-17,120.24234781904796
+2023-07-18,120.25733140759502
+2023-07-19,120.16422516608516
+2023-07-20,120.04672759084222
+2023-07-21,119.70883722763772
+2023-07-24,119.79048942508913
+2023-07-25,119.7304419527948
+2023-07-26,121.82086582608767
+2023-07-27,122.32377393698668
+2023-07-28,124.72028382074913
+2023-07-31,125.00247099332826
+2023-08-01,126.40984231724914
+2023-08-02,126.55335969471935
+2023-08-03,126.62832754756255
+2023-08-04,125.81411033964798
+2023-08-07,125.36642969462106
+2023-08-08,126.12773696591215
+2023-08-09,127.18116073598271
+2023-08-10,126.94215985107778
+2023-08-11,126.61392487894683
+2023-08-14,127.61120941383473
+2023-08-15,127.3748262321434
+2023-08-16,127.61372708902148
+2023-08-17,128.68498900000822
+2023-08-18,125.94667734052712
+2023-08-21,125.24319075510546
+2023-08-22,126.46773905613588
+2023-08-23,127.2037779969587
+2023-08-24,128.3539627741257
+2023-08-25,128.94730019836095
+2023-08-28,132.03843904540616
+2023-08-29,132.98318699272616
+2023-08-30,133.54338226583417
+2023-08-31,129.75064856718154
+2023-09-01,129.1450277035221
+2023-09-04,129.99925223030218
+2023-09-05,131.84677511075128
+2023-09-06,130.82365478593096
+2023-09-07,129.89442839860752
+2023-09-08,128.22685514404532
+2023-09-11,127.58961169849852
+2023-09-12,126.05217569842469
+2023-09-13,125.10467792728188
+2023-09-14,125.3035824873038
+2023-09-15,124.50306139344977
+2023-09-18,124.51262006800113
+2023-09-19,125.30673101661915
+2023-09-20,124.20462721589864
+2023-09-21,124.34020299209129
+2023-09-22,123.87495890798863
+2023-09-25,122.75912317989246
+2023-09-26,124.17523017438872
+2023-09-27,124.44173232477667
+2023-09-28,122.34950811385983
+2023-09-29,121.1186723802804
+2023-10-02,122.18965986710879
+2023-10-03,122.17159606860979
+2023-10-04,122.57022372936366
+2023-10-05,123.81632940954144
+2023-10-06,124.96220363447226
+2023-10-09,124.00526878042442
+2023-10-10,122.9043994160635
+2023-10-11,123.72736064482888
+2023-10-12,124.33453981882032
+2023-10-13,123.99738955526323
+2023-10-16,126.85321051484087
+2023-10-17,125.38916740451126
+2023-10-18,126.16084204914095
+2023-10-19,126.32672761919237
+2023-10-20,126.18071616211932
+2023-10-23,126.2114853688129
+2023-10-24,129.03212497775274
+2023-10-25,129.04616018251983
+2023-10-26,126.74565887034473
+2023-10-27,124.62504241082522
+2023-10-30,124.73184114817204
+2023-10-31,126.09472379237981
diff --git a/test.py b/test.py
index cc85fc6..f47bb8e 100644
--- a/test.py
+++ b/test.py
@@ -1,26 +1,49 @@
-import quantstats as qs
import numpy as np
import pandas as pd
-from algosystem.backtesting.metrics import quant_stats
from algosystem.backtesting.engine import Engine
from rich import print
if __name__ == "__main__":
- dates = pd.date_range(start="2020-01-01", periods=1000, freq="B")
- data = pd.Series(np.random.randn(1000).cumsum(), index=dates, name="Strategy")
- benchmark = pd.Series(np.random.randn(1000).cumsum(), index=dates, name="Benchmark")
-
- data.to_csv("strategy.csv")
- benchmark.to_csv("benchmark.csv")
- engine = Engine(data)
-
+ # Create more realistic market data
+ dates = pd.date_range(start="2020-01-01", periods=1000, freq="B")
+
+ # Create percentage returns (more realistic than random walk)
+ strategy_returns = np.random.normal(0.0005, 0.01, 1000) # mean of 0.05% daily, 1% std
+ benchmark_returns = np.random.normal(0.0004, 0.012, 1000) # slightly lower mean, higher vol
+
+ # Convert returns to price series (starting at 100)
+ strategy_prices = 100 * (1 + pd.Series(strategy_returns, index=dates)).cumprod()
+ benchmark_prices = 100 * (1 + pd.Series(benchmark_returns, index=dates)).cumprod()
+
+ # Name the series
+ strategy_prices.name = "Strategy"
+ benchmark_prices.name = "Benchmark"
+
+ # Save to CSV
+ strategy_prices.to_csv("strategy.csv")
+ benchmark_prices.to_csv("benchmark.csv")
+
+ print("Running backtest...")
+
+ # Create and run engine
+ engine = Engine(strategy_prices, benchmark_prices)
engine.run()
+
+ print("Backtest complete!")
+
+ # Print key metrics
results = engine.get_results()
-
- for key, value in results.items():
- print(f"{key}: {type(value)}, {value}")
-
-
\ No newline at end of file
+ metrics = results.get('metrics', {})
+
+ print("\nKey Performance Metrics:")
+ important_metrics = [
+ 'total_return', 'annualized_return', 'annualized_volatility',
+ 'sharpe_ratio', 'max_drawdown', 'calmar_ratio'
+ ]
+
+ for metric in important_metrics:
+ if metric in metrics:
+ print(f"{metric}: {metrics[metric]:.4f}")
\ No newline at end of file
From 8d6b72d92c4af2a6e4a30ee7f7f24329c2ba01f2 Mon Sep 17 00:00:00 2001
From: BonelessWater
Date: Sun, 4 May 2025 22:30:09 -0400
Subject: [PATCH 05/54] dashboard creation draft
---
algosystem/backtesting/engine.py | 910 ++
algosystem/static/css/styles.css | 184 +
algosystem/static/html/index.html | 141 +
algosystem/static/js/script.js | 647 ++
algosystem/utils/graph_config.json | 54 +-
benchmark.csv | 2000 ++--
dashboard/dashboard.css | 125 +
dashboard/dashboard.html | 554 +
dashboard/dashboard_data.json | 16211 +++++++++++++++++++++++++++
strategy.csv | 2000 ++--
test.py | 20 +-
11 files changed, 20818 insertions(+), 2028 deletions(-)
create mode 100644 algosystem/static/css/styles.css
create mode 100644 algosystem/static/html/index.html
create mode 100644 algosystem/static/js/script.js
create mode 100644 dashboard/dashboard.css
create mode 100644 dashboard/dashboard.html
create mode 100644 dashboard/dashboard_data.json
diff --git a/algosystem/backtesting/engine.py b/algosystem/backtesting/engine.py
index 3308484..de1300b 100644
--- a/algosystem/backtesting/engine.py
+++ b/algosystem/backtesting/engine.py
@@ -1,5 +1,9 @@
import pandas as pd
+import numpy as np
import os
+import shutil
+import json
+import webbrowser
import matplotlib.pyplot as plt
from algosystem.utils._logging import get_logger
@@ -186,3 +190,909 @@ def get_plots(self, output_path=None, show_charts=True):
return plots
+ def _format_time_series(self, series):
+ """Format a time series for the dashboard"""
+ if series is None or series.empty:
+ return []
+
+ result = []
+ for date, value in series.items():
+ # Convert date to string
+ date_str = date.strftime('%Y-%m-%d') if hasattr(date, 'strftime') else str(date)
+
+ # Handle NumPy types
+ if isinstance(value, (np.integer, np.floating)):
+ value_float = float(value.item())
+ else:
+ value_float = float(value) if pd.notna(value) else None
+
+ result.append({'date': date_str, 'value': value_float})
+
+ return result
+
+
+ def generate_dashboard(self, output_dir=None, open_browser=True, config_path=None):
+ """
+ Generate an HTML dashboard for the backtest results using graph_config.json
+
+ Parameters:
+ -----------
+ output_dir : str, optional
+ Directory where dashboard files will be saved. Defaults to ./dashboard/
+ open_browser : bool, optional
+ Whether to automatically open the dashboard in browser. Defaults to True
+ config_path : str, optional
+ Path to the graph configuration file. Defaults to utils/graph_config.json
+
+ Returns:
+ --------
+ dashboard_path : str
+ Path to the generated dashboard HTML file
+ """
+ # Get results from the engine
+ if self.results is None:
+ raise ValueError("No backtest results available. Run the backtest first.")
+
+ # Set default output directory
+ if output_dir is None:
+ output_dir = os.path.join(os.getcwd(), "dashboard")
+
+ # Create output directory if it doesn't exist
+ os.makedirs(output_dir, exist_ok=True)
+
+ # Load graph configuration
+ if config_path is None:
+ config_path = os.path.join(os.path.dirname(os.path.dirname(__file__)), "utils", "graph_config.json")
+
+ with open(config_path, 'r') as f:
+ graph_config = json.load(f)
+
+ # Extract plot configurations
+ plots = graph_config.get('plots', [])
+ max_cols = graph_config.get('max_cols', 2)
+
+ # Generate HTML dashboard
+ dashboard_html = self._generate_dashboard_html(plots, max_cols)
+
+ # Write dashboard files
+ dashboard_path = os.path.join(output_dir, 'dashboard.html')
+ with open(dashboard_path, 'w') as f:
+ f.write(dashboard_html)
+
+ # Prepare and save the data for the dashboard
+ dashboard_data = self.prepare_dashboard_data()
+ data_path = os.path.join(output_dir, 'dashboard_data.json')
+ with open(data_path, 'w') as f:
+ json.dump(dashboard_data, f, indent=2)
+
+ # Create the CSS file
+ css_path = os.path.join(output_dir, 'dashboard.css')
+ with open(css_path, 'w') as f:
+ f.write(self._get_dashboard_css())
+
+ # Open in browser if requested
+ if open_browser:
+ webbrowser.open('file://' + os.path.abspath(dashboard_path))
+
+ return dashboard_path
+
+ def _generate_dashboard_html(self, plots, max_cols):
+ """Generate HTML for the dashboard based on plot configuration"""
+
+ # Get basic metrics
+ metrics = self.results.get('metrics', {})
+
+ # Convert metrics to standard Python types for JSON serialization
+ serializable_metrics = {}
+ for key, value in metrics.items():
+ if isinstance(value, (np.integer, np.floating, np.bool_)):
+ serializable_metrics[key] = value.item() # Convert NumPy types to Python native types
+ else:
+ serializable_metrics[key] = value
+
+ total_return = float(self.results.get('returns', 0) * 100) # Convert to percentage
+
+ # Generate metrics HTML
+ metrics_html = """
+
+
+
Annualized Return
+
{:.2f}%
+
+
+
+
Sharpe Ratio
+
{:.2f}
+
+
+
Max Drawdown
+
{:.2f}%
+
+
+ """.format(
+ serializable_metrics.get('annual_return', 0) * 100,
+ serializable_metrics.get('volatility', 0) * 100,
+ serializable_metrics.get('sharpe_ratio', 0),
+ serializable_metrics.get('max_drawdown', 0) * 100
+ )
+
+ # Sort plots by row and column
+ sorted_plots = sorted(plots, key=lambda p: (p.get('position', {}).get('row', 0), p.get('position', {}).get('col', 0)))
+
+ # Generate plots HTML
+ plots_html = ''
+
+ # Group plots by row
+ current_row = -1
+ for plot in sorted_plots:
+ row = plot.get('position', {}).get('row', 0)
+
+ # If new row, close previous row div and start new one
+ if row != current_row:
+ if current_row != -1:
+ plots_html += '
' # Close previous row
+ plots_html += f''
+ current_row = row
+
+ # Add plot div with appropriate ID
+ plot_id = f"plot_{plot.get('id', '')}"
+ plot_title = plot.get('title', plot.get('type', 'Plot'))
+ plots_html += f"""
+
+ """
+
+ # Close the last row and the plots grid
+ plots_html += '
'
+
+ # Generate JavaScript to create the plots
+ js = f"""
+
+ """
+
+ # Assemble the complete HTML
+ html = f"""
+
+
+
+
+ AlgoSystem Trading Dashboard
+
+
+
+
+
+
+
+
+
+ {metrics_html}
+
+ {plots_html}
+
+
+ {js}
+
+
+ """
+
+ return html
+
+ def _convert_series_to_js(self, series):
+ """Convert pandas Series to JavaScript-friendly format"""
+ if series.empty:
+ return "[]"
+
+ # Convert series to list of [date, value] pairs
+ data = []
+ for date, value in series.items():
+ # Format date as ISO string and ensure value is a number
+ date_str = date.strftime('%Y-%m-%d') if hasattr(date, 'strftime') else str(date)
+
+ # Handle NumPy types
+ if isinstance(value, (np.integer, np.floating)):
+ value_float = float(value.item())
+ else:
+ value_float = float(value) if pd.notna(value) else None
+
+ data.append([date_str, value_float])
+
+ return json.dumps(data)
+
+ def _get_dashboard_css(self):
+ """Return CSS for the dashboard"""
+ return """
+ /* Dashboard styles */
+ body {
+ font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
+ margin: 0;
+ padding: 0;
+ background-color: #f5f7fa;
+ color: #333;
+ }
+
+ .container {
+ max-width: 1200px;
+ margin: 0 auto;
+ padding: 20px;
+ }
+
+ .header {
+ background-color: #2c3e50;
+ color: white;
+ padding: 20px;
+ border-radius: 8px;
+ margin-bottom: 20px;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ }
+
+ .header h1 {
+ margin: 0;
+ font-size: 24px;
+ }
+
+ .date-range {
+ font-size: 14px;
+ opacity: 0.8;
+ }
+
+ .total-return {
+ font-size: 32px;
+ font-weight: bold;
+ margin: 0;
+ }
+
+ .positive-return {
+ color: #2ecc71;
+ }
+
+ .negative-return {
+ color: #e74c3c;
+ }
+
+ /* Metrics grid */
+ .metrics-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
+ grid-gap: 20px;
+ margin-bottom: 20px;
+ }
+
+ .metric-card {
+ background-color: white;
+ border-radius: 8px;
+ padding: 20px;
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
+ }
+
+ .metric-title {
+ font-size: 14px;
+ color: #7f8c8d;
+ margin: 0 0 5px 0;
+ }
+
+ .metric-value {
+ font-size: 24px;
+ font-weight: bold;
+ margin: 0;
+ }
+
+ /* Plots grid */
+ .plots-grid {
+ display: flex;
+ flex-direction: column;
+ gap: 20px;
+ }
+
+ .plot-row {
+ display: grid;
+ grid-template-columns: repeat(2, 1fr);
+ grid-gap: 20px;
+ }
+
+ .plot-card {
+ background-color: white;
+ border-radius: 8px;
+ padding: 20px;
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
+ }
+
+ .plot-title {
+ font-size: 18px;
+ margin-top: 0;
+ margin-bottom: 15px;
+ }
+
+ .plot-container {
+ height: 300px;
+ width: 100%;
+ }
+
+ /* Responsive layout */
+ @media (max-width: 768px) {
+ .plot-row {
+ grid-template-columns: 1fr;
+ }
+
+ .header {
+ flex-direction: column;
+ align-items: flex-start;
+ }
+
+ .header > div:last-child {
+ margin-top: 15px;
+ }
+ }
+ """
+
+ def prepare_dashboard_data(self):
+ """
+ Prepare backtest results data for the dashboard
+
+ Returns:
+ --------
+ dashboard_data : dict
+ Formatted data ready for the dashboard
+ """
+ if self.results is None:
+ raise ValueError("No backtest results available. Run the backtest first.")
+
+ # Extract metrics and ensure they're serializable
+ metrics = {}
+ for key, value in self.results.get('metrics', {}).items():
+ if isinstance(value, (np.integer, np.floating, np.bool_)):
+ metrics[key] = value.item() # Convert NumPy types to Python native types
+ else:
+ metrics[key] = value
+
+ # Format time series data
+ formatted_data = {}
+
+ # Add equity curve
+ if 'equity' in self.results:
+ equity = self.results['equity']
+ formatted_data['equity'] = self._format_time_series(equity)
+
+ # Add benchmark if available
+ plots = self.results.get('plots', {})
+ if 'benchmark_equity_curve' in plots:
+ benchmark = plots['benchmark_equity_curve']
+ formatted_data['benchmark'] = self._format_time_series(benchmark)
+
+ # Add drawdown
+ if 'drawdown_series' in plots:
+ drawdown = plots['drawdown_series']
+ formatted_data['drawdown'] = self._format_time_series(drawdown)
+
+ # Add rolling sharpe
+ if 'rolling_sharpe' in plots:
+ rolling_sharpe = plots['rolling_sharpe']
+ formatted_data['rolling_sharpe'] = self._format_time_series(rolling_sharpe)
+
+ # Add monthly returns
+ if 'monthly_returns' in plots:
+ monthly_returns = plots['monthly_returns']
+ formatted_data['monthly_returns'] = self._format_time_series(monthly_returns)
+
+ # Return the dashboard data
+ return {
+ 'metrics': metrics,
+ 'data': formatted_data,
+ 'start_date': self.start_date.strftime('%Y-%m-%d'),
+ 'end_date': self.end_date.strftime('%Y-%m-%d'),
+ 'total_return': float(self.results.get('returns', 0)) * 100 # Convert to percentage
+ }
diff --git a/algosystem/static/css/styles.css b/algosystem/static/css/styles.css
new file mode 100644
index 0000000..56aebc7
--- /dev/null
+++ b/algosystem/static/css/styles.css
@@ -0,0 +1,184 @@
+/* Main styles for the AlgoSystem Trading Dashboard */
+body {
+ font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
+ margin: 0;
+ padding: 0;
+ background-color: #f5f7fa;
+ color: #333;
+}
+
+.container {
+ max-width: 1200px;
+ margin: 0 auto;
+ padding: 20px;
+}
+
+.header {
+ background-color: #2c3e50;
+ color: white;
+ padding: 20px;
+ border-radius: 8px;
+ margin-bottom: 20px;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+}
+
+.header h1 {
+ margin: 0;
+ font-size: 24px;
+}
+
+.date-range {
+ font-size: 14px;
+ opacity: 0.8;
+}
+
+/* Metric cards grid layout */
+.metrics-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
+ grid-gap: 20px;
+ margin-bottom: 20px;
+}
+
+.metric-card {
+ background-color: white;
+ border-radius: 8px;
+ padding: 20px;
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
+}
+
+.metric-title {
+ font-size: 14px;
+ color: #7f8c8d;
+ margin-top: 0;
+ margin-bottom: 10px;
+}
+
+.metric-value {
+ font-size: 24px;
+ font-weight: bold;
+ margin: 0;
+ color: #2c3e50;
+}
+
+.metric-value.positive {
+ color: #27ae60;
+}
+
+.metric-value.negative {
+ color: #e74c3c;
+}
+
+/* Chart containers */
+.chart-container {
+ background-color: white;
+ border-radius: 8px;
+ padding: 20px;
+ margin-bottom: 20px;
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
+}
+
+.chart-title {
+ font-size: 18px;
+ margin-top: 0;
+ margin-bottom: 20px;
+ color: #2c3e50;
+}
+
+/* Two-column layout for charts */
+.two-column {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ grid-gap: 20px;
+}
+
+@media (max-width: 768px) {
+ .two-column {
+ grid-template-columns: 1fr;
+ }
+}
+
+/* Return statistics layout */
+.return-stats {
+ display: grid;
+ grid-template-columns: repeat(3, 1fr);
+ grid-gap: 10px;
+}
+
+/* Tab navigation */
+.tab-container {
+ margin-bottom: 20px;
+}
+
+.tabs {
+ display: flex;
+ border-bottom: 1px solid #ddd;
+ margin-bottom: 15px;
+}
+
+.tab {
+ padding: 10px 20px;
+ cursor: pointer;
+ border-bottom: 2px solid transparent;
+}
+
+.tab.active {
+ border-bottom: 2px solid #3498db;
+ font-weight: bold;
+}
+
+.tab-content {
+ display: none;
+}
+
+.tab-content.active {
+ display: block;
+}
+
+/* Monthly returns heatmap */
+.monthly-returns-table {
+ width: 100%;
+ border-collapse: collapse;
+}
+
+.monthly-returns-table th,
+.monthly-returns-table td {
+ padding: 8px;
+ text-align: center;
+}
+
+.monthly-returns-table th {
+ font-weight: bold;
+}
+
+/* Loading state */
+.loading {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ height: 200px;
+ font-size: 16px;
+ color: #7f8c8d;
+}
+
+/* Mobile responsive adjustments */
+@media (max-width: 576px) {
+ .metrics-grid {
+ grid-template-columns: 1fr;
+ }
+
+ .return-stats {
+ grid-template-columns: 1fr;
+ }
+
+ .header {
+ flex-direction: column;
+ align-items: flex-start;
+ }
+
+ .header > div:last-child {
+ margin-top: 15px;
+ }
+}
\ No newline at end of file
diff --git a/algosystem/static/html/index.html b/algosystem/static/html/index.html
new file mode 100644
index 0000000..b7a2ba4
--- /dev/null
+++ b/algosystem/static/html/index.html
@@ -0,0 +1,141 @@
+
+
+
+
+
+ AlgoSystem Trading Dashboard
+
+
+
+
+
+
+
+
+
+
+
+
Annualized Return
+
Loading...
+
+
+
Annualized Volatility
+
Loading...
+
+
+
Sharpe Ratio
+
Loading...
+
+
+
Sortino Ratio
+
Loading...
+
+
+
Max Drawdown
+
Loading...
+
+
+
Calmar Ratio
+
Loading...
+
+
+
+
+
+
+
+
Performance
+
Risk Metrics
+
Return Analysis
+
+
+
+
+
Equity Curve vs Benchmark
+
+
+
+
+
+
Relative Performance
+
+
+
+
Drawdown Analysis
+
+
+
+
+
+
+
+
+
Rolling Volatility
+
+
+
+
Rolling Sharpe Ratio
+
+
+
+
+
Value at Risk (VaR) Analysis
+
+
+
+
+
+
+
Daily Returns Distribution
+
+
+
+
+
Monthly Returns Heatmap
+
+
+
+
Rolling Returns
+
+
+
+
+
+
+
+
Trading Statistics
+
+
+
Win Rate
+
Loading...
+
+
+
Best Month
+
Loading...
+
+
+
Worst Month
+
Loading...
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/algosystem/static/js/script.js b/algosystem/static/js/script.js
new file mode 100644
index 0000000..1326d94
--- /dev/null
+++ b/algosystem/static/js/script.js
@@ -0,0 +1,647 @@
+// Main JavaScript file for the AlgoSystem Trading Dashboard
+
+// This will store all dashboard data
+let dashboardData = null;
+
+// Fetch the metrics data from the JSON file
+async function fetchDashboardData() {
+ try {
+ const response = await fetch('dashboard_data.json');
+ if (!response.ok) {
+ throw new Error(`HTTP error! status: ${response.status}`);
+ }
+ dashboardData = await response.json();
+
+ // Update the dashboard with the data
+ updateDashboard();
+ } catch (error) {
+ console.error('Error fetching dashboard data:', error);
+ document.body.innerHTML = `
+
+
Error Loading Dashboard
+
Could not load dashboard data. Error: ${error.message}
+
Please make sure dashboard_data.json is available in the same directory.
+
+
`;
+ }
+}
+
+// Update all dashboard elements with the data
+function updateDashboard() {
+ if (!dashboardData) return;
+
+ // Update header information
+ document.getElementById('dateRange').textContent =
+ `Backtest Period: ${dashboardData.startDate} - ${dashboardData.endDate}`;
+
+ const finalReturn = document.getElementById('finalReturn');
+ finalReturn.textContent =
+ `${dashboardData.finalReturn > 0 ? '+' : ''}${dashboardData.finalReturn.toFixed(2)}%`;
+ finalReturn.className = `metric-value ${dashboardData.finalReturn >= 0 ? 'positive' : 'negative'}`;
+
+ // Update metrics
+ updateMetrics();
+
+ // Create charts
+ createCharts();
+}
+
+// Update the metrics cards with data
+function updateMetrics() {
+ const metrics = dashboardData.metrics;
+
+ // Update each metric card
+ if (metrics.annualized_return !== undefined) {
+ const element = document.getElementById('annualizedReturn');
+ element.textContent = `${metrics.annualized_return.toFixed(2)}%`;
+ element.className = `metric-value ${metrics.annualized_return >= 0 ? 'positive' : 'negative'}`;
+ }
+
+ if (metrics.annualized_volatility !== undefined) {
+ document.getElementById('annualizedVolatility').textContent =
+ `${metrics.annualized_volatility.toFixed(2)}%`;
+ }
+
+ if (metrics.sharpe_ratio !== undefined) {
+ document.getElementById('sharpeRatio').textContent =
+ metrics.sharpe_ratio.toFixed(2);
+ }
+
+ if (metrics.sortino_ratio !== undefined) {
+ document.getElementById('sortinoRatio').textContent =
+ metrics.sortino_ratio.toFixed(2);
+ }
+
+ if (metrics.max_drawdown !== undefined) {
+ document.getElementById('maxDrawdown').textContent =
+ `${metrics.max_drawdown.toFixed(2)}%`;
+ }
+
+ if (metrics.calmar_ratio !== undefined) {
+ document.getElementById('calmarRatio').textContent =
+ metrics.calmar_ratio.toFixed(2);
+ }
+
+ if (metrics.alpha !== undefined) {
+ const element = document.getElementById('alpha');
+ element.textContent = `${metrics.alpha.toFixed(2)}%`;
+ element.className = `metric-value ${metrics.alpha >= 0 ? 'positive' : 'negative'}`;
+ }
+
+ if (metrics.beta !== undefined) {
+ document.getElementById('beta').textContent =
+ metrics.beta.toFixed(2);
+ }
+
+ // Update trading statistics
+ if (metrics.pct_positive_days !== undefined) {
+ document.getElementById('winRate').textContent =
+ `${metrics.pct_positive_days.toFixed(2)}%`;
+ }
+
+ if (metrics.best_month !== undefined) {
+ document.getElementById('bestMonth').textContent =
+ `+${metrics.best_month.toFixed(2)}%`;
+ }
+
+ if (metrics.worst_month !== undefined) {
+ document.getElementById('worstMonth').textContent =
+ `${metrics.worst_month.toFixed(2)}%`;
+ }
+}
+
+// Create all charts for the dashboard
+function createCharts() {
+ const timeSeries = dashboardData.timeSeries;
+
+ // Helper function to parse dates
+ const parseDates = (dateStrings) => dateStrings.map(d => new Date(d));
+
+ // Create Equity Curve Chart
+ if (timeSeries.equity_curve && timeSeries.benchmark_equity_curve) {
+ const equityCurveCtx = document.getElementById('equityCurveChart').getContext('2d');
+ new Chart(equityCurveCtx, {
+ type: 'line',
+ data: {
+ labels: parseDates(timeSeries.equity_curve.dates),
+ datasets: [
+ {
+ label: 'Strategy',
+ data: timeSeries.equity_curve.values,
+ borderColor: '#2ecc71',
+ backgroundColor: 'rgba(46, 204, 113, 0.1)',
+ fill: true,
+ tension: 0.1
+ },
+ {
+ label: 'Benchmark',
+ data: timeSeries.benchmark_equity_curve.values,
+ borderColor: '#3498db',
+ backgroundColor: 'rgba(52, 152, 219, 0.1)',
+ fill: true,
+ tension: 0.1,
+ borderDash: [5, 5]
+ }
+ ]
+ },
+ options: {
+ responsive: true,
+ plugins: {
+ tooltip: {
+ mode: 'index',
+ intersect: false
+ }
+ },
+ scales: {
+ x: {
+ type: 'time',
+ time: {
+ unit: 'month'
+ }
+ },
+ y: {
+ title: {
+ display: true,
+ text: 'Value ($)'
+ }
+ }
+ }
+ }
+ });
+ }
+
+ // Create Drawdown Chart
+ if (timeSeries.drawdown_series) {
+ const drawdownCtx = document.getElementById('drawdownChart').getContext('2d');
+ new Chart(drawdownCtx, {
+ type: 'line',
+ data: {
+ labels: parseDates(timeSeries.drawdown_series.dates),
+ datasets: [{
+ label: 'Drawdown',
+ data: timeSeries.drawdown_series.values,
+ borderColor: '#e74c3c',
+ backgroundColor: 'rgba(231, 76, 60, 0.1)',
+ fill: true,
+ tension: 0.1
+ }]
+ },
+ options: {
+ responsive: true,
+ plugins: {
+ tooltip: {
+ mode: 'index',
+ intersect: false
+ }
+ },
+ scales: {
+ x: {
+ type: 'time',
+ time: {
+ unit: 'month'
+ }
+ },
+ y: {
+ title: {
+ display: true,
+ text: 'Drawdown (%)'
+ },
+ max: 0,
+ min: Math.min(-5, Math.floor(dashboardData.metrics.max_drawdown)) // Dynamic minimum
+ }
+ }
+ }
+ });
+ }
+
+ // Create Relative Performance Chart
+ if (timeSeries.relative_performance) {
+ const relPerfCtx = document.getElementById('relativePerformanceChart').getContext('2d');
+ new Chart(relPerfCtx, {
+ type: 'line',
+ data: {
+ labels: parseDates(timeSeries.relative_performance.dates),
+ datasets: [{
+ label: 'Outperformance vs Benchmark',
+ data: timeSeries.relative_performance.values,
+ borderColor: '#9b59b6',
+ backgroundColor: 'rgba(155, 89, 182, 0.1)',
+ fill: true,
+ tension: 0.1
+ }]
+ },
+ options: {
+ responsive: true,
+ plugins: {
+ tooltip: {
+ mode: 'index',
+ intersect: false
+ }
+ },
+ scales: {
+ x: {
+ type: 'time',
+ time: {
+ unit: 'month'
+ }
+ },
+ y: {
+ title: {
+ display: true,
+ text: 'Relative Performance (%)'
+ }
+ }
+ }
+ }
+ });
+ }
+
+ // Create Rolling Volatility Chart
+ if (timeSeries.rolling_volatility) {
+ const rollingVolCtx = document.getElementById('rollingVolatilityChart').getContext('2d');
+ new Chart(rollingVolCtx, {
+ type: 'line',
+ data: {
+ labels: parseDates(timeSeries.rolling_volatility.dates),
+ datasets: [{
+ label: '30-Day Rolling Volatility',
+ data: timeSeries.rolling_volatility.values,
+ borderColor: '#f39c12',
+ backgroundColor: 'rgba(243, 156, 18, 0.1)',
+ fill: true,
+ tension: 0.1
+ }]
+ },
+ options: {
+ responsive: true,
+ plugins: {
+ tooltip: {
+ mode: 'index',
+ intersect: false
+ }
+ },
+ scales: {
+ x: {
+ type: 'time',
+ time: {
+ unit: 'month'
+ }
+ },
+ y: {
+ title: {
+ display: true,
+ text: 'Volatility (%)'
+ },
+ min: 0
+ }
+ }
+ }
+ });
+ }
+
+ // Create Rolling Sharpe Chart
+ if (timeSeries.rolling_sharpe) {
+ const rollingSharpCtx = document.getElementById('rollingSharpChart').getContext('2d');
+ new Chart(rollingSharpCtx, {
+ type: 'line',
+ data: {
+ labels: parseDates(timeSeries.rolling_sharpe.dates),
+ datasets: [{
+ label: '60-Day Rolling Sharpe',
+ data: timeSeries.rolling_sharpe.values,
+ borderColor: '#1abc9c',
+ backgroundColor: 'rgba(26, 188, 156, 0.1)',
+ fill: true,
+ tension: 0.1
+ }]
+ },
+ options: {
+ responsive: true,
+ plugins: {
+ tooltip: {
+ mode: 'index',
+ intersect: false
+ }
+ },
+ scales: {
+ x: {
+ type: 'time',
+ time: {
+ unit: 'month'
+ }
+ },
+ y: {
+ title: {
+ display: true,
+ text: 'Sharpe Ratio'
+ }
+ }
+ }
+ }
+ });
+ }
+
+ // Create Rolling VaR Chart
+ if (timeSeries.rolling_var) {
+ const rollingVarCtx = document.getElementById('rollingVarChart').getContext('2d');
+ new Chart(rollingVarCtx, {
+ type: 'line',
+ data: {
+ labels: parseDates(timeSeries.rolling_var.dates),
+ datasets: [{
+ label: '95% VaR (1-day)',
+ data: timeSeries.rolling_var.values,
+ borderColor: '#e67e22',
+ backgroundColor: 'rgba(230, 126, 34, 0.1)',
+ fill: true,
+ tension: 0.1
+ }]
+ },
+ options: {
+ responsive: true,
+ plugins: {
+ tooltip: {
+ mode: 'index',
+ intersect: false
+ }
+ },
+ scales: {
+ x: {
+ type: 'time',
+ time: {
+ unit: 'month'
+ }
+ },
+ y: {
+ title: {
+ display: true,
+ text: 'Value at Risk (%)'
+ }
+ }
+ }
+ }
+ });
+ }
+
+ // Create Daily Returns Distribution
+ if (timeSeries.daily_returns) {
+ const dailyReturnsCtx = document.getElementById('dailyReturnsChart').getContext('2d');
+
+ // Create histogram data from daily returns
+ const returns = timeSeries.daily_returns.values;
+ const binCount = 20;
+ const min = Math.min(...returns);
+ const max = Math.max(...returns);
+ const binWidth = (max - min) / binCount;
+
+ const bins = Array(binCount).fill(0);
+ const binLabels = [];
+
+ for (let i = 0; i < binCount; i++) {
+ const binStart = min + i * binWidth;
+ const binEnd = binStart + binWidth;
+ binLabels.push(`${(binStart * 100).toFixed(2)}% to ${(binEnd * 100).toFixed(2)}%`);
+ }
+
+ returns.forEach(ret => {
+ const binIndex = Math.min(binCount - 1, Math.floor((ret - min) / binWidth));
+ bins[binIndex]++;
+ });
+
+ new Chart(dailyReturnsCtx, {
+ type: 'bar',
+ data: {
+ labels: binLabels,
+ datasets: [{
+ label: 'Frequency',
+ data: bins,
+ backgroundColor: bins.map((_, i) => {
+ const midpoint = i / binCount;
+ if (midpoint < 0.4) return 'rgba(231, 76, 60, 0.7)'; // Red for negative returns
+ if (midpoint > 0.6) return 'rgba(46, 204, 113, 0.7)'; // Green for positive returns
+ return 'rgba(241, 196, 15, 0.7)'; // Yellow for near-zero returns
+ })
+ }]
+ },
+ options: {
+ responsive: true,
+ plugins: {
+ tooltip: {
+ callbacks: {
+ label: function(context) {
+ return `${context.raw} days`;
+ }
+ }
+ }
+ },
+ scales: {
+ x: {
+ title: {
+ display: true,
+ text: 'Daily Return Range'
+ }
+ },
+ y: {
+ title: {
+ display: true,
+ text: 'Number of Days'
+ }
+ }
+ }
+ }
+ });
+ }
+
+ // Create Rolling Returns Chart
+ if (timeSeries.rolling_3m_returns && timeSeries.rolling_6m_returns && timeSeries.rolling_1y_returns) {
+ const rollingReturnsCtx = document.getElementById('rollingReturnsChart').getContext('2d');
+ new Chart(rollingReturnsCtx, {
+ type: 'line',
+ data: {
+ labels: parseDates(timeSeries.rolling_3m_returns.dates),
+ datasets: [
+ {
+ label: '3-Month',
+ data: timeSeries.rolling_3m_returns.values,
+ borderColor: '#3498db',
+ tension: 0.1
+ },
+ {
+ label: '6-Month',
+ data: timeSeries.rolling_6m_returns.values,
+ borderColor: '#9b59b6',
+ tension: 0.1
+ },
+ {
+ label: '1-Year',
+ data: timeSeries.rolling_1y_returns.values,
+ borderColor: '#2ecc71',
+ tension: 0.1
+ }
+ ]
+ },
+ options: {
+ responsive: true,
+ plugins: {
+ tooltip: {
+ mode: 'index',
+ intersect: false
+ }
+ },
+ scales: {
+ x: {
+ type: 'time',
+ time: {
+ unit: 'month'
+ }
+ },
+ y: {
+ title: {
+ display: true,
+ text: 'Return (%)'
+ }
+ }
+ }
+ }
+ });
+ }
+
+ // Create Monthly Returns Heatmap
+ createMonthlyReturnsHeatmap();
+}
+
+// Create a Monthly Returns Heatmap
+function createMonthlyReturnsHeatmap() {
+ const heatmapContainer = document.getElementById('monthlyReturnsHeatmap');
+ if (!heatmapContainer) return;
+
+ // Check if we have monthly returns data
+ if (!dashboardData.timeSeries.monthly_returns) {
+ heatmapContainer.innerHTML = 'Monthly returns data not available
';
+ return;
+ }
+
+ heatmapContainer.innerHTML = '';
+
+ // Create the heatmap table
+ const table = document.createElement('table');
+ table.className = 'monthly-returns-table';
+
+ // Add header row with month names
+ const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
+ const headerRow = document.createElement('tr');
+
+ // Empty cell for the corner
+ const cornerCell = document.createElement('th');
+ headerRow.appendChild(cornerCell);
+
+ // Month headers
+ months.forEach(month => {
+ const th = document.createElement('th');
+ th.textContent = month;
+ headerRow.appendChild(th);
+ });
+
+ table.appendChild(headerRow);
+
+ // Process the monthly returns data into a year/month format
+ const monthlyReturns = dashboardData.timeSeries.monthly_returns;
+
+ // Extract years from dates
+ const years = [...new Set(monthlyReturns.dates.map(d => new Date(d).getFullYear()))].sort();
+
+ // Create a row for each year
+ years.forEach(year => {
+ const row = document.createElement('tr');
+
+ // Year cell
+ const yearCell = document.createElement('td');
+ yearCell.textContent = year;
+ yearCell.style.fontWeight = 'bold';
+ row.appendChild(yearCell);
+
+ // Month cells
+ for (let month = 0; month < 12; month++) {
+ const td = document.createElement('td');
+
+ // Find data for this year and month
+ const index = monthlyReturns.dates.findIndex(d => {
+ const date = new Date(d);
+ return date.getFullYear() === year && date.getMonth() === month;
+ });
+
+ if (index !== -1) {
+ const returnValue = monthlyReturns.values[index] * 100; // Convert to percentage
+ td.textContent = returnValue.toFixed(1) + '%';
+
+ // Color based on return value
+ if (returnValue > 3) {
+ td.style.backgroundColor = 'rgba(46, 204, 113, 0.8)';
+ td.style.color = 'white';
+ } else if (returnValue > 1) {
+ td.style.backgroundColor = 'rgba(46, 204, 113, 0.5)';
+ } else if (returnValue > 0) {
+ td.style.backgroundColor = 'rgba(46, 204, 113, 0.2)';
+ } else if (returnValue > -1) {
+ td.style.backgroundColor = 'rgba(231, 76, 60, 0.2)';
+ } else if (returnValue > -3) {
+ td.style.backgroundColor = 'rgba(231, 76, 60, 0.5)';
+ } else {
+ td.style.backgroundColor = 'rgba(231, 76, 60, 0.8)';
+ td.style.color = 'white';
+ }
+ } else {
+ // If data isn't available for this month, show empty cell
+ td.style.backgroundColor = '#f5f5f5';
+ }
+
+ row.appendChild(td);
+ }
+
+ table.appendChild(row);
+ });
+
+ heatmapContainer.appendChild(table);
+}
+
+// Tab switching functionality
+document.querySelectorAll('.tab').forEach(tab => {
+ tab.addEventListener('click', () => {
+ // Remove active class from all tabs
+ document.querySelectorAll('.tab').forEach(t => {
+ t.classList.remove('active');
+ });
+
+ // Add active class to clicked tab
+ tab.classList.add('active');
+
+ // Hide all tab content
+ document.querySelectorAll('.tab-content').forEach(content => {
+ content.classList.remove('active');
+ });
+
+ // Show selected tab content
+ const tabId = tab.getAttribute('data-tab');
+ document.getElementById(tabId).classList.add('active');
+ });
+});
+
+// Check for mobile devices and adjust layout
+function checkMobile() {
+ if (window.innerWidth < 768) {
+ document.querySelectorAll('.metrics-grid').forEach(grid => {
+ grid.style.gridTemplateColumns = '1fr';
+ });
+ } else {
+ document.querySelectorAll('.metrics-grid').forEach(grid => {
+ grid.style.gridTemplateColumns = 'repeat(auto-fill, minmax(280px, 1fr))';
+ });
+ }
+}
+
+// Run on load and on window resize
+window.addEventListener('load', checkMobile);
+window.addEventListener('resize', checkMobile);
+
+// Initialize the dashboard
+document.addEventListener('DOMContentLoaded', fetchDashboardData);
\ No newline at end of file
diff --git a/algosystem/utils/graph_config.json b/algosystem/utils/graph_config.json
index 98ab966..8684c8f 100644
--- a/algosystem/utils/graph_config.json
+++ b/algosystem/utils/graph_config.json
@@ -1,28 +1,46 @@
{
- "graphs": [
+ "plots": [
{
- "id": 2157940446288,
- "type": "scatter",
- "title": "Scatter Graph 1",
- "config": {}
+ "id": 2423685496048,
+ "type": "Equity Curve",
+ "title": "Equity Curve",
+ "config": {},
+ "position": {
+ "row": 0,
+ "col": 0
+ }
},
{
- "id": 2158012825136,
- "type": "scatter",
- "title": "Scatter Graph 2",
- "config": {}
+ "id": 2423686015376,
+ "type": "Drawdown Chart",
+ "title": "Drawdown Chart",
+ "config": {},
+ "position": {
+ "row": 0,
+ "col": 1
+ }
},
{
- "id": 2158013241200,
- "type": "line",
- "title": "Line Graph 3",
- "config": {}
+ "id": 2424164977552,
+ "type": "Monthly Returns Heatmap",
+ "title": "Monthly Returns Heatmap",
+ "config": {},
+ "position": {
+ "row": 1,
+ "col": 0
+ }
},
{
- "id": 2158013313456,
- "type": "bar",
- "title": "Bar Graph 4",
- "config": {}
+ "id": 2424165098960,
+ "type": "Rolling Sharpe Ratio",
+ "title": "Rolling Sharpe Ratio",
+ "config": {},
+ "position": {
+ "row": 1,
+ "col": 1
+ }
}
- ]
+ ],
+ "max_cols": 2,
+ "active_data_source": null
}
\ No newline at end of file
diff --git a/benchmark.csv b/benchmark.csv
index 23ead81..7d388a5 100644
--- a/benchmark.csv
+++ b/benchmark.csv
@@ -1,1001 +1,1001 @@
,Benchmark
-2020-01-01,97.57702437647528
-2020-01-02,99.0826558494808
-2020-01-03,98.76728244811761
-2020-01-06,99.6026691035
-2020-01-07,100.69868064034783
-2020-01-08,100.90031313125345
-2020-01-09,99.55300828943201
-2020-01-10,97.733502375462
-2020-01-13,96.69030771254177
-2020-01-14,96.90562100325828
-2020-01-15,98.16347129679782
-2020-01-16,99.14754123627974
-2020-01-17,99.97433309996117
-2020-01-20,100.47585000255368
-2020-01-21,101.78645973910452
-2020-01-22,99.91800538630086
-2020-01-23,99.45724777889909
-2020-01-24,98.2291132546761
-2020-01-27,99.19530526260506
-2020-01-28,99.8061729653942
-2020-01-29,98.9522018731699
-2020-01-30,98.58458937089416
-2020-01-31,97.52216170627067
-2020-02-03,96.7076673250575
-2020-02-04,97.23809634373022
-2020-02-05,96.61026089019913
-2020-02-06,96.93101934594085
-2020-02-07,95.99931887774004
-2020-02-10,95.26570170133155
-2020-02-11,95.45077283351401
-2020-02-12,96.33701840981158
-2020-02-13,96.60020295882546
-2020-02-14,97.27663837052565
-2020-02-17,95.62012600348888
-2020-02-18,94.977186938152
-2020-02-19,94.76302664791993
-2020-02-20,95.2602358089006
-2020-02-21,96.51283095499616
-2020-02-24,95.33925321345502
-2020-02-25,94.41050621035323
-2020-02-26,93.82239623284327
-2020-02-27,95.85537384824909
-2020-02-28,97.00332978474644
-2020-03-02,98.21789372873732
-2020-03-03,96.78707670575113
-2020-03-04,97.08040389206086
-2020-03-05,95.50666854675104
-2020-03-06,96.17412050562957
-2020-03-09,94.7255598112369
-2020-03-10,93.54527659882149
-2020-03-11,93.92467250799812
-2020-03-12,93.62670750000804
-2020-03-13,93.56160874744214
-2020-03-16,91.7152155269978
-2020-03-17,90.67765624018995
-2020-03-18,89.5926193367261
-2020-03-19,90.99105952897906
-2020-03-20,91.4889132257594
-2020-03-23,92.88845480119696
-2020-03-24,91.69952136703296
-2020-03-25,92.26741669596541
-2020-03-26,92.62720587003288
-2020-03-27,92.24709384683352
-2020-03-30,91.37387293871254
-2020-03-31,91.61423224418121
-2020-04-01,90.71023689601893
-2020-04-02,91.13231310928208
-2020-04-03,90.74108248586585
-2020-04-06,88.65721768622129
-2020-04-07,89.94418505067041
-2020-04-08,89.90976923952036
-2020-04-09,88.31711349938675
-2020-04-10,89.04233974922604
-2020-04-13,88.49760273252583
-2020-04-14,89.41844323109352
-2020-04-15,88.79494644374513
-2020-04-16,87.76910991343372
-2020-04-17,88.54458394966385
-2020-04-20,89.33893772008547
-2020-04-21,89.35851162746417
-2020-04-22,89.0988882390591
-2020-04-23,88.09380918930594
-2020-04-24,90.06284078206535
-2020-04-27,89.08634124393942
-2020-04-28,88.7654999995408
-2020-04-29,86.95048655048349
-2020-04-30,87.67776734386703
-2020-05-01,86.13897959040875
-2020-05-04,85.72818805672944
-2020-05-05,84.77013808156946
-2020-05-06,84.92562562123857
-2020-05-07,84.34806027472328
-2020-05-08,85.13711705704651
-2020-05-11,86.01492718316415
-2020-05-12,86.80024504859823
-2020-05-13,86.74122290433687
-2020-05-14,87.1036921542671
-2020-05-15,86.04649629961571
-2020-05-18,87.12121090751482
-2020-05-19,87.12182625183961
-2020-05-20,87.16892354545661
-2020-05-21,86.10184530325877
-2020-05-22,87.44060171201407
-2020-05-25,88.27949431685764
-2020-05-26,88.60080401880401
-2020-05-27,87.18149436524948
-2020-05-28,89.11022042855905
-2020-05-29,90.94863842186219
-2020-06-01,91.27085420129653
-2020-06-02,91.12215956396217
-2020-06-03,91.60801929077185
-2020-06-04,91.89612367936365
-2020-06-05,93.23478956829483
-2020-06-08,92.91528131292276
-2020-06-09,93.86229873706047
-2020-06-10,94.48962495261746
-2020-06-11,94.20724597024108
-2020-06-12,94.87452652997283
-2020-06-15,95.4393553888147
-2020-06-16,94.44414957033618
-2020-06-17,94.38789706972632
-2020-06-18,92.9914980149964
-2020-06-19,95.30222018963738
-2020-06-22,97.7432284844394
-2020-06-23,98.25048284709753
-2020-06-24,96.91979737868547
-2020-06-25,98.37280755672002
-2020-06-26,96.22944432027991
-2020-06-29,96.28944738249575
-2020-06-30,96.14488434517774
-2020-07-01,95.35384281512897
-2020-07-02,97.28514170330469
-2020-07-03,98.00002999519312
-2020-07-06,99.23065044423277
-2020-07-07,100.52183416313972
-2020-07-08,100.97424676986915
-2020-07-09,103.40676035365249
-2020-07-10,104.35084022604909
-2020-07-13,103.90288569059211
-2020-07-14,103.18028534641222
-2020-07-15,102.84704383309618
-2020-07-16,101.22498746505096
-2020-07-17,102.79144634884412
-2020-07-20,102.50739510437359
-2020-07-21,103.60749136819594
-2020-07-22,105.08957407032871
-2020-07-23,105.61602207777597
-2020-07-24,104.88604203189784
-2020-07-27,103.48286271263045
-2020-07-28,102.9432635853619
-2020-07-29,105.035535638457
-2020-07-30,105.3311731928158
-2020-07-31,108.20139048227271
-2020-08-03,107.08804943799188
-2020-08-04,106.71474332041227
-2020-08-05,104.88555211177595
-2020-08-06,105.29824330830809
-2020-08-07,105.17239272801953
-2020-08-10,104.758403343577
-2020-08-11,105.68826337676349
-2020-08-12,105.23185219774365
-2020-08-13,106.4449109645864
-2020-08-14,107.93859268386396
-2020-08-17,108.30447920289257
-2020-08-18,108.45410383026967
-2020-08-19,106.1881430656884
-2020-08-20,106.20827544849296
-2020-08-21,106.83550938094359
-2020-08-24,108.28101033810147
-2020-08-25,107.9040144942278
-2020-08-26,107.85823995702887
-2020-08-27,107.62367338326897
-2020-08-28,106.90815304831656
-2020-08-31,105.60072129825433
-2020-09-01,106.0892158029221
-2020-09-02,106.83130449128461
-2020-09-03,107.45370994601325
-2020-09-04,110.56424201898498
-2020-09-07,109.3399314285646
-2020-09-08,108.89232992821015
-2020-09-09,109.44534684235259
-2020-09-10,111.34721167302443
-2020-09-11,111.8026788337151
-2020-09-14,110.98985732025963
-2020-09-15,113.12118215973848
-2020-09-16,112.07413333998775
-2020-09-17,112.15133254896317
-2020-09-18,111.33101582973364
-2020-09-21,111.97459023790704
-2020-09-22,110.52659795406574
-2020-09-23,112.82182424570944
-2020-09-24,112.97167814059989
-2020-09-25,112.29741925010659
-2020-09-28,112.23190039802518
-2020-09-29,113.60257784033527
-2020-09-30,114.08549453595111
-2020-10-01,116.88463603265866
-2020-10-02,113.8999165922078
-2020-10-05,113.00561630772006
-2020-10-06,112.01050888485122
-2020-10-07,111.42535943771577
-2020-10-08,113.2587486816664
-2020-10-09,113.1009532042139
-2020-10-12,112.91209100909863
-2020-10-13,112.8073385123572
-2020-10-14,113.46133504645739
-2020-10-15,116.0958315211979
-2020-10-16,117.1519721234664
-2020-10-19,120.88719582603747
-2020-10-20,121.15334361924586
-2020-10-21,122.42501459378299
-2020-10-22,123.5892392114355
-2020-10-23,123.6294001549552
-2020-10-26,124.39901437950078
-2020-10-27,123.70945624388389
-2020-10-28,124.87526054920541
-2020-10-29,125.5354115481717
-2020-10-30,126.64471424249273
-2020-11-02,126.33796325272996
-2020-11-03,126.99404571683175
-2020-11-04,127.24895432084928
-2020-11-05,126.5909206974872
-2020-11-06,126.68968253885113
-2020-11-09,126.5003134266058
-2020-11-10,126.28555796499408
-2020-11-11,127.20442532651734
-2020-11-12,128.69936203713206
-2020-11-13,130.8664447423009
-2020-11-16,130.93552758636812
-2020-11-17,134.18585904272524
-2020-11-18,135.27263711034925
-2020-11-19,133.36247647775693
-2020-11-20,132.49424524791067
-2020-11-23,132.43063854099748
-2020-11-24,134.1344153174184
-2020-11-25,135.91155818756633
-2020-11-26,134.018829447304
-2020-11-27,131.42677358993402
-2020-11-30,133.41726055434586
-2020-12-01,134.26168649958282
-2020-12-02,133.9926211958157
-2020-12-03,133.01512019198702
-2020-12-04,134.13370641473585
-2020-12-07,136.18379803963109
-2020-12-08,135.9158925329548
-2020-12-09,135.75237196162072
-2020-12-10,138.24847278882163
-2020-12-11,141.64283732220832
-2020-12-14,143.0074894362117
-2020-12-15,143.6114297201736
-2020-12-16,145.75869755110358
-2020-12-17,148.4291589076902
-2020-12-18,148.7132282472261
-2020-12-21,149.95491019405114
-2020-12-22,149.05290925455796
-2020-12-23,148.55821817258231
-2020-12-24,147.69628021836058
-2020-12-25,147.92097465892323
-2020-12-28,151.80255237331482
-2020-12-29,153.72183875397414
-2020-12-30,152.95813947820358
-2020-12-31,152.7461734644106
-2021-01-01,152.44825753061392
-2021-01-04,154.9884443179099
-2021-01-05,152.18805385547537
-2021-01-06,157.84445191862343
-2021-01-07,156.830527489265
-2021-01-08,155.50100074853677
-2021-01-11,153.93860416015735
-2021-01-12,156.6879735236253
-2021-01-13,155.07668813976449
-2021-01-14,154.19406365565322
-2021-01-15,155.4386788048555
-2021-01-18,153.05001098569082
-2021-01-19,151.90999574290564
-2021-01-20,150.18859269959444
-2021-01-21,150.58837652882704
-2021-01-22,150.1610299974291
-2021-01-25,148.43198046062756
-2021-01-26,146.4142728271127
-2021-01-27,147.4060661994084
-2021-01-28,147.91682782254182
-2021-01-29,148.36187866366905
-2021-02-01,145.8026960320513
-2021-02-02,144.5771425973022
-2021-02-03,146.45208564686604
-2021-02-04,144.25694196505398
-2021-02-05,145.9108349488237
-2021-02-08,148.37430276444428
-2021-02-09,150.9134576950188
-2021-02-10,153.4027393911127
-2021-02-11,151.4922299675735
-2021-02-12,150.89195611647244
-2021-02-15,151.88297530890728
-2021-02-16,155.23054320178755
-2021-02-17,156.1057074974582
-2021-02-18,155.02043166401788
-2021-02-19,153.5845020397861
-2021-02-22,157.48763479081907
-2021-02-23,157.85994557995207
-2021-02-24,159.1888062430284
-2021-02-25,158.17554725087837
-2021-02-26,158.15055302265588
-2021-03-01,159.5674804742942
-2021-03-02,160.1900873826261
-2021-03-03,160.08562468687117
-2021-03-04,160.1602589531345
-2021-03-05,161.65418705690564
-2021-03-08,162.3167132453884
-2021-03-09,159.94388348224868
-2021-03-10,161.1737992502411
-2021-03-11,162.0831780391402
-2021-03-12,157.9794988337152
-2021-03-15,155.48669516414753
-2021-03-16,158.45536332557953
-2021-03-17,156.75240087510207
-2021-03-18,154.83086335101112
-2021-03-19,153.1171777151545
-2021-03-22,151.02668345449771
-2021-03-23,148.39819004321149
-2021-03-24,150.91918442863596
-2021-03-25,152.04897453309874
-2021-03-26,154.70256263484566
-2021-03-29,156.87948334390924
-2021-03-30,154.2374634049835
-2021-03-31,152.09881377735528
-2021-04-01,152.87488644554884
-2021-04-02,150.6154748354444
-2021-04-05,151.2198544843627
-2021-04-06,150.31491137243822
-2021-04-07,152.33858087261692
-2021-04-08,156.00109819494847
-2021-04-09,157.47583285199434
-2021-04-12,159.6819887010525
-2021-04-13,161.61985777742086
-2021-04-14,165.0379331058107
-2021-04-15,165.23516558051787
-2021-04-16,161.24092646359236
-2021-04-19,162.8172404006371
-2021-04-20,160.05247404667662
-2021-04-21,160.5038126740238
-2021-04-22,159.31799631968718
-2021-04-23,158.11402306191653
-2021-04-26,158.61041506291363
-2021-04-27,158.40049239041358
-2021-04-28,155.37103351382072
-2021-04-29,156.38955391185706
-2021-04-30,157.74363967756491
-2021-05-03,155.21396567042552
-2021-05-04,154.39469818798
-2021-05-05,155.638205925254
-2021-05-06,153.42898696860934
-2021-05-07,152.4142114911641
-2021-05-10,154.0587789432937
-2021-05-11,154.8125550863202
-2021-05-12,154.45158295868998
-2021-05-13,154.529518725034
-2021-05-14,154.4070791903728
-2021-05-17,152.69104002018068
-2021-05-18,153.40221449724027
-2021-05-19,155.53592887438222
-2021-05-20,153.53502386894274
-2021-05-21,151.89708945465912
-2021-05-24,152.2000546458047
-2021-05-25,154.64400328017294
-2021-05-26,154.6992497494517
-2021-05-27,153.80748267965865
-2021-05-28,155.0235191672109
-2021-05-31,153.01461465088983
-2021-06-01,150.90199122100563
-2021-06-02,150.22903646171585
-2021-06-03,151.37760036889975
-2021-06-04,149.3136541740237
-2021-06-07,151.05529898418408
-2021-06-08,152.82501294687893
-2021-06-09,155.2000715613283
-2021-06-10,151.42431940769575
-2021-06-11,151.4888411291017
-2021-06-14,148.74411078050804
-2021-06-15,146.5402499471355
-2021-06-16,149.79262515323887
-2021-06-17,149.01194988621737
-2021-06-18,147.3300769266786
-2021-06-21,146.8542029544321
-2021-06-22,148.05153655548017
-2021-06-23,147.04531689275933
-2021-06-24,144.2716242853234
-2021-06-25,145.29517110074775
-2021-06-28,145.48672469895922
-2021-06-29,147.18768812091912
-2021-06-30,147.97036442494743
-2021-07-01,149.56032356850199
-2021-07-02,149.0063513166557
-2021-07-05,148.48547760520688
-2021-07-06,148.5500444967593
-2021-07-07,147.59486429897623
-2021-07-08,147.1475502990905
-2021-07-09,144.83542303731429
-2021-07-12,143.17447788204038
-2021-07-13,142.76504151372706
-2021-07-14,142.7874079868805
-2021-07-15,143.7827786264102
-2021-07-16,143.86634538162798
-2021-07-19,144.40391680970956
-2021-07-20,145.6343674664777
-2021-07-21,144.55155542260044
-2021-07-22,143.31631581523143
-2021-07-23,144.5800572613743
-2021-07-26,145.67901022449993
-2021-07-27,142.81648136184972
-2021-07-28,143.24375572343416
-2021-07-29,144.6186769754535
-2021-07-30,143.94563287976837
-2021-08-02,140.63926965557178
-2021-08-03,139.72218291323867
-2021-08-04,139.29847295553813
-2021-08-05,137.44224858101552
-2021-08-06,136.9839256577605
-2021-08-09,136.97690698416883
-2021-08-10,135.67250681708606
-2021-08-11,136.34908137347637
-2021-08-12,136.7418150493157
-2021-08-13,137.11976636590458
-2021-08-16,138.66875522520604
-2021-08-17,139.01395267053172
-2021-08-18,139.84077400136644
-2021-08-19,140.78482632399502
-2021-08-20,141.66225311371412
-2021-08-23,141.59334232981985
-2021-08-24,141.7967303361371
-2021-08-25,143.8307771275189
-2021-08-26,141.75630622218972
-2021-08-27,141.3363376127338
-2021-08-30,138.07487169444562
-2021-08-31,139.01893555952083
-2021-09-01,138.20704802275353
-2021-09-02,137.89191428253392
-2021-09-03,135.556183678608
-2021-09-06,134.26107710884523
-2021-09-07,134.18346681822777
-2021-09-08,136.53145052712875
-2021-09-09,137.3781114550703
-2021-09-10,138.2804073118152
-2021-09-13,137.79633586331911
-2021-09-14,138.76570834541906
-2021-09-15,137.62569871611134
-2021-09-16,138.32460278219946
-2021-09-17,141.9603336347065
-2021-09-20,143.24707066125893
-2021-09-21,144.37843180381705
-2021-09-22,146.96618976414572
-2021-09-23,150.7472882964089
-2021-09-24,152.22266695202126
-2021-09-27,149.10306054325108
-2021-09-28,149.92534217541248
-2021-09-29,151.9168237974689
-2021-09-30,152.99176057860663
-2021-10-01,151.1938021727859
-2021-10-04,151.6150390119523
-2021-10-05,152.12918030844546
-2021-10-06,151.32302582979037
-2021-10-07,153.4030247604489
-2021-10-08,155.00822876155965
-2021-10-11,152.52229165188817
-2021-10-12,154.05818145383807
-2021-10-13,157.28866389047
-2021-10-14,158.49026714407748
-2021-10-15,159.38238675500796
-2021-10-18,161.48402932799885
-2021-10-19,163.22673420682898
-2021-10-20,166.3005996031823
-2021-10-21,168.70697196493555
-2021-10-22,167.777522543303
-2021-10-25,167.26586838821584
-2021-10-26,170.38707040373666
-2021-10-27,171.4539033209494
-2021-10-28,172.4617039474729
-2021-10-29,172.90536482661733
-2021-11-01,171.50018511413404
-2021-11-02,177.19024840344287
-2021-11-03,173.27233053028021
-2021-11-04,175.3508408320722
-2021-11-05,175.27166877833946
-2021-11-08,177.83259796782684
-2021-11-09,178.18832911895095
-2021-11-10,174.133187163972
-2021-11-11,172.4975425437551
-2021-11-12,173.74826392447738
-2021-11-15,173.90059388560917
-2021-11-16,171.48627984887048
-2021-11-17,170.1941636023399
-2021-11-18,168.94824614904599
-2021-11-19,170.24198431747288
-2021-11-22,167.98552299820358
-2021-11-23,166.4123780519975
-2021-11-24,167.32332114024098
-2021-11-25,165.84938975265277
-2021-11-26,165.39426206690052
-2021-11-29,166.27534629864041
-2021-11-30,166.20458446029184
-2021-12-01,165.1291154795997
-2021-12-02,164.84187639931815
-2021-12-03,165.88174841483024
-2021-12-06,164.09258150417972
-2021-12-07,164.91093635904767
-2021-12-08,164.61466091105385
-2021-12-09,163.13445069597338
-2021-12-10,159.79866385593198
-2021-12-13,159.31344957405597
-2021-12-14,158.53014762069324
-2021-12-15,159.32008766328076
-2021-12-16,159.91597199979896
-2021-12-17,161.98216945670657
-2021-12-20,160.25623977156346
-2021-12-21,159.6744379650403
-2021-12-22,158.06197056075914
-2021-12-23,160.2786474251664
-2021-12-24,159.97466397363087
-2021-12-27,161.2787327668567
-2021-12-28,159.65223230167453
-2021-12-29,160.36552229181703
-2021-12-30,157.9469025582666
-2021-12-31,158.87708452000265
-2022-01-03,159.83594782526905
-2022-01-04,162.22791473029574
-2022-01-05,156.57882125864765
-2022-01-06,160.20800152626188
-2022-01-07,157.3465787105788
-2022-01-10,158.80452234806916
-2022-01-11,159.77615703166703
-2022-01-12,155.27485850983643
-2022-01-13,156.16458456406158
-2022-01-14,152.09620289653364
-2022-01-17,153.4627693462549
-2022-01-18,154.62395490336945
-2022-01-19,153.30800177211648
-2022-01-20,151.81076396682187
-2022-01-21,149.52593994401167
-2022-01-24,149.36424040356263
-2022-01-25,147.45149967277354
-2022-01-26,146.4006298065155
-2022-01-27,145.96715596186655
-2022-01-28,147.12428560493746
-2022-01-31,150.80207447764
-2022-02-01,152.019944018683
-2022-02-02,151.1923695763314
-2022-02-03,150.60787334596594
-2022-02-04,147.28358543029273
-2022-02-07,143.06625228888618
-2022-02-08,144.9400814745243
-2022-02-09,144.19750746418526
-2022-02-10,145.53668501761138
-2022-02-11,147.38899559779844
-2022-02-14,146.72565125462452
-2022-02-15,146.26501060359965
-2022-02-16,142.96931647806508
-2022-02-17,147.4602407160341
-2022-02-18,145.99370534969756
-2022-02-21,146.95303978539297
-2022-02-22,145.0087243845887
-2022-02-23,143.8024256006902
-2022-02-24,143.33506548192915
-2022-02-25,142.55124053904677
-2022-02-28,142.79349629024162
-2022-03-01,144.88793795577658
-2022-03-02,145.34551872273022
-2022-03-03,144.43602570120706
-2022-03-04,145.81116822068313
-2022-03-07,147.27292875733252
-2022-03-08,148.42965188384454
-2022-03-09,147.12856999868862
-2022-03-10,152.31856529785003
-2022-03-11,150.02022925887718
-2022-03-14,152.89603492703856
-2022-03-15,153.51141340093886
-2022-03-16,154.51888081074054
-2022-03-17,158.50015788082757
-2022-03-18,156.5418633629111
-2022-03-21,156.31968672972965
-2022-03-22,156.21273516573297
-2022-03-23,153.4318809216275
-2022-03-24,154.65142099594672
-2022-03-25,157.27292799637894
-2022-03-28,158.5022402379138
-2022-03-29,159.59397821638083
-2022-03-30,159.09342768027878
-2022-03-31,156.42830023315713
-2022-04-01,158.11667624515817
-2022-04-04,159.15890615662195
-2022-04-05,164.5136836710028
-2022-04-06,162.22693007725258
-2022-04-07,162.66947989419936
-2022-04-08,164.88422774727653
-2022-04-11,166.0425285374737
-2022-04-12,166.06175252709238
-2022-04-13,165.8947111555726
-2022-04-14,167.49109126314264
-2022-04-15,165.59286092893066
-2022-04-18,165.95151449960255
-2022-04-19,163.89683071659206
-2022-04-20,160.49076409094587
-2022-04-21,157.65566503343928
-2022-04-22,155.0051725526472
-2022-04-25,155.8425064120163
-2022-04-26,155.75881848712038
-2022-04-27,155.03125906850119
-2022-04-28,150.23864313267964
-2022-04-29,148.16235483223133
-2022-05-02,145.49700898247272
-2022-05-03,142.5257790026109
-2022-05-04,139.02318139865963
-2022-05-05,137.30025372773648
-2022-05-06,136.01343628440495
-2022-05-09,135.31193212780943
-2022-05-10,136.41812033447252
-2022-05-11,135.47179327538453
-2022-05-12,136.08336060696755
-2022-05-13,136.66062296305336
-2022-05-16,137.3513688905394
-2022-05-17,140.05250987968597
-2022-05-18,139.13960107361774
-2022-05-19,139.34887211687465
-2022-05-20,139.1975202400449
-2022-05-23,140.08839342627275
-2022-05-24,139.63265466868398
-2022-05-25,141.2537039040779
-2022-05-26,140.7199527034628
-2022-05-27,142.9493815837039
-2022-05-30,140.4517311580356
-2022-05-31,142.5008953873872
-2022-06-01,143.00864349150743
-2022-06-02,143.09528458933795
-2022-06-03,147.59502406073537
-2022-06-06,148.78232181128755
-2022-06-07,148.67737154146712
-2022-06-08,149.27594099096066
-2022-06-09,146.6543164003087
-2022-06-10,145.68924445807764
-2022-06-13,145.6851653511604
-2022-06-14,145.05302060854862
-2022-06-15,144.02463413601973
-2022-06-16,144.86715751452442
-2022-06-17,142.89994789418336
-2022-06-20,144.33713068426897
-2022-06-21,142.6472052139543
-2022-06-22,142.51531447804294
-2022-06-23,143.7260117902195
-2022-06-24,145.11937180979356
-2022-06-27,143.32664815026527
-2022-06-28,140.88744187041294
-2022-06-29,141.0328609647516
-2022-06-30,137.5179778929155
-2022-07-01,139.2586146016543
-2022-07-04,140.6676243929693
-2022-07-05,140.6747927967246
-2022-07-06,137.91220935386855
-2022-07-07,140.89663823212217
-2022-07-08,140.64186795381232
-2022-07-11,140.1733934876074
-2022-07-12,138.03929856448133
-2022-07-13,136.83565182604943
-2022-07-14,136.6345242079653
-2022-07-15,138.18191431142142
-2022-07-18,141.37760204168106
-2022-07-19,139.26259613301363
-2022-07-20,140.76393349081957
-2022-07-21,141.13374322230652
-2022-07-22,140.19211597824548
-2022-07-25,143.48349522779714
-2022-07-26,143.04531947567955
-2022-07-27,142.10737142791479
-2022-07-28,143.07519360165998
-2022-07-29,140.18461434009905
-2022-08-01,140.79772148122308
-2022-08-02,143.1675044148629
-2022-08-03,141.11406438108014
-2022-08-04,138.46487177214323
-2022-08-05,140.24747331254565
-2022-08-08,139.94548511022128
-2022-08-09,139.85438878807275
-2022-08-10,139.8478855347522
-2022-08-11,139.77277512998
-2022-08-12,142.77278802865663
-2022-08-15,142.52309740421478
-2022-08-16,139.57495606548238
-2022-08-17,140.40649272128732
-2022-08-18,141.69845070263045
-2022-08-19,143.3435853050383
-2022-08-22,144.95640516089912
-2022-08-23,144.21915365452136
-2022-08-24,145.47434334361756
-2022-08-25,145.56247081202255
-2022-08-26,148.24750762704346
-2022-08-29,147.70913628170524
-2022-08-30,147.96049037948163
-2022-08-31,149.9394531503616
-2022-09-01,148.48103175791803
-2022-09-02,146.29878796497817
-2022-09-05,145.00767974910113
-2022-09-06,146.28965884197964
-2022-09-07,149.04100671191688
-2022-09-08,150.328418987405
-2022-09-09,151.70339494239317
-2022-09-12,153.8342857442242
-2022-09-13,152.89058123707233
-2022-09-14,153.17740903291954
-2022-09-15,150.65152893471335
-2022-09-16,150.11475798835653
-2022-09-19,149.97111426133586
-2022-09-20,148.23706747869082
-2022-09-21,147.0879341886841
-2022-09-22,146.0763774253312
-2022-09-23,145.86323329691936
-2022-09-26,146.50252437355363
-2022-09-27,146.62450931534667
-2022-09-28,148.2944856742223
-2022-09-29,144.29918615631686
-2022-09-30,148.5887625885448
-2022-10-03,145.3711066338473
-2022-10-04,147.80910156284736
-2022-10-05,150.49815515398092
-2022-10-06,147.96933884261563
-2022-10-07,145.15943360149848
-2022-10-10,146.35390411727877
-2022-10-11,145.65804175559865
-2022-10-12,144.50865881537106
-2022-10-13,146.34999018764663
-2022-10-14,145.78415651613287
-2022-10-17,147.6440139001408
-2022-10-18,146.86759510212218
-2022-10-19,146.81193177319182
-2022-10-20,144.89945787601246
-2022-10-21,148.1529648181113
-2022-10-24,148.2036526131792
-2022-10-25,148.72580976097993
-2022-10-26,149.60336156138388
-2022-10-27,148.6164090143911
-2022-10-28,149.89828079735972
-2022-10-31,151.59479160151324
-2022-11-01,153.56839001833478
-2022-11-02,153.9866041475702
-2022-11-03,151.30836506475669
-2022-11-04,152.49915308033567
-2022-11-07,152.8974006558365
-2022-11-08,154.24795603335195
-2022-11-09,158.08605318948358
-2022-11-10,156.9231839540279
-2022-11-11,158.60270091891715
-2022-11-14,156.37594186253466
-2022-11-15,156.98031984209436
-2022-11-16,154.96292859340844
-2022-11-17,157.48887240388643
-2022-11-18,154.22153729581146
-2022-11-21,152.05741705853862
-2022-11-22,151.82496978314634
-2022-11-23,153.0491865897984
-2022-11-24,151.8997006893588
-2022-11-25,153.55259456333602
-2022-11-28,154.24517379497445
-2022-11-29,152.55821941171303
-2022-11-30,153.71123047018412
-2022-12-01,149.94153613835852
-2022-12-02,150.91165676924942
-2022-12-05,149.02178079338466
-2022-12-06,148.305436950502
-2022-12-07,147.78041217777067
-2022-12-08,150.68829669684592
-2022-12-09,151.21340806491406
-2022-12-12,149.3302462155408
-2022-12-13,151.61732639450864
-2022-12-14,153.56310464692376
-2022-12-15,153.06369282923734
-2022-12-16,152.27595383415016
-2022-12-19,150.40648806459785
-2022-12-20,151.5211831879499
-2022-12-21,151.31255469618137
-2022-12-22,147.9496645698576
-2022-12-23,149.83305328900528
-2022-12-26,147.3589167465064
-2022-12-27,145.8380679400836
-2022-12-28,144.9739333210546
-2022-12-29,146.6857032998683
-2022-12-30,147.45406554726998
-2023-01-02,145.6329455397621
-2023-01-03,143.29364209038064
-2023-01-04,142.94301063640907
-2023-01-05,142.1857511220911
-2023-01-06,140.68450811516368
-2023-01-09,142.2757858970623
-2023-01-10,142.56989176682592
-2023-01-11,144.19262959295793
-2023-01-12,143.96122935543895
-2023-01-13,144.10912606974827
-2023-01-16,142.59383161326915
-2023-01-17,140.8970814699272
-2023-01-18,138.44106332935138
-2023-01-19,138.14170963100705
-2023-01-20,137.9761577095077
-2023-01-23,138.4306864178525
-2023-01-24,137.33941703162762
-2023-01-25,136.64374318448725
-2023-01-26,137.87800564348112
-2023-01-27,137.48220032349514
-2023-01-30,136.3195414592559
-2023-01-31,138.34360975676177
-2023-02-01,138.26281048825345
-2023-02-02,136.41105110376287
-2023-02-03,134.3238774768594
-2023-02-06,134.32637087672333
-2023-02-07,134.66680811826456
-2023-02-08,134.73436727580966
-2023-02-09,135.20759914763528
-2023-02-10,135.65449572440295
-2023-02-13,135.0971314744432
-2023-02-14,132.8443226392141
-2023-02-15,132.7338912774094
-2023-02-16,130.0197824995348
-2023-02-17,130.6477093349939
-2023-02-20,131.64803217960787
-2023-02-21,129.98994771489637
-2023-02-22,128.68573021228318
-2023-02-23,128.5035647780366
-2023-02-24,129.4133490201433
-2023-02-27,127.10095556006904
-2023-02-28,129.00144477205706
-2023-03-01,128.60864715699964
-2023-03-02,129.16001329608756
-2023-03-03,130.80822689646163
-2023-03-06,129.81799849469587
-2023-03-07,131.87839974175319
-2023-03-08,130.46164870634942
-2023-03-09,129.34108272908423
-2023-03-10,128.9943144287916
-2023-03-13,127.64278306057612
-2023-03-14,126.598675198041
-2023-03-15,127.07652658899265
-2023-03-16,124.57141995902575
-2023-03-17,127.01264991190229
-2023-03-20,129.41152486494641
-2023-03-21,126.67828708355657
-2023-03-22,126.31898279865514
-2023-03-23,127.08972517316424
-2023-03-24,127.93425269852752
-2023-03-27,126.93758923693565
-2023-03-28,124.50196642198233
-2023-03-29,124.12958139817032
-2023-03-30,120.98172947685795
-2023-03-31,121.91451035761793
-2023-04-03,123.2732014372364
-2023-04-04,122.81366891364381
-2023-04-05,123.66384511904968
-2023-04-06,122.58349755759819
-2023-04-07,122.3711296394041
-2023-04-10,121.82903098570246
-2023-04-11,119.61215495005217
-2023-04-12,117.09434691088228
-2023-04-13,116.08483434421564
-2023-04-14,116.68638604992223
-2023-04-17,118.24053402399548
-2023-04-18,117.61933573726138
-2023-04-19,121.82466776802326
-2023-04-20,121.64930848248972
-2023-04-21,118.65643643020461
-2023-04-24,119.17406927695077
-2023-04-25,119.40619745130712
-2023-04-26,117.7638255624095
-2023-04-27,115.46649557565377
-2023-04-28,115.26439832900405
-2023-05-01,114.32310257307847
-2023-05-02,114.62953042068482
-2023-05-03,113.87667565757566
-2023-05-04,115.91414954316322
-2023-05-05,116.07764921782353
-2023-05-08,116.64567057117598
-2023-05-09,114.92813048632316
-2023-05-10,113.45920476285465
-2023-05-11,115.06362132934764
-2023-05-12,112.83664726562228
-2023-05-15,111.47626686083973
-2023-05-16,111.6258936661087
-2023-05-17,114.13519616073229
-2023-05-18,114.59172231919301
-2023-05-19,117.1683218242539
-2023-05-22,116.86297798996802
-2023-05-23,118.22518252323653
-2023-05-24,116.91421838810302
-2023-05-25,114.74488867569299
-2023-05-26,115.3298694638784
-2023-05-29,116.3758516225258
-2023-05-30,114.96007651766334
-2023-05-31,115.26049289705864
-2023-06-01,115.84661296963328
-2023-06-02,115.46439084769786
-2023-06-05,114.87142265394594
-2023-06-06,112.93306021992231
-2023-06-07,111.1229493623187
-2023-06-08,112.16548671734353
-2023-06-09,113.36568041910485
-2023-06-12,114.65347370398796
-2023-06-13,114.42498739175086
-2023-06-14,113.70910966176821
-2023-06-15,113.20080252320004
-2023-06-16,110.93715459430067
-2023-06-19,110.26475312241438
-2023-06-20,110.15176804951827
-2023-06-21,110.79564682843296
-2023-06-22,110.42719721894998
-2023-06-23,109.28416949291272
-2023-06-26,107.56578165268937
-2023-06-27,106.84551022034066
-2023-06-28,108.75169919048484
-2023-06-29,107.62628167462933
-2023-06-30,105.72216183499386
-2023-07-03,105.68184035514005
-2023-07-04,106.36849391113232
-2023-07-05,107.66107999472847
-2023-07-06,107.67198903706196
-2023-07-07,106.97659095057317
-2023-07-10,108.57794963471741
-2023-07-11,107.81372715644176
-2023-07-12,106.44691005754296
-2023-07-13,104.48014519678249
-2023-07-14,103.5194432178588
-2023-07-17,105.08946115206656
-2023-07-18,104.10577531778402
-2023-07-19,102.08982546663154
-2023-07-20,99.40494237210909
-2023-07-21,99.78402345195869
-2023-07-24,99.76586624207985
-2023-07-25,99.84808001375052
-2023-07-26,100.01507622035541
-2023-07-27,101.42896388054818
-2023-07-28,100.12069156507684
-2023-07-31,100.36333378336155
-2023-08-01,100.00987880378062
-2023-08-02,101.26265975794068
-2023-08-03,100.80990834986542
-2023-08-04,100.15851670819104
-2023-08-07,100.03881543855361
-2023-08-08,100.75368331632701
-2023-08-09,100.73502537651197
-2023-08-10,99.28993620365094
-2023-08-11,98.03267346766646
-2023-08-14,97.63074671474679
-2023-08-15,95.19955796477767
-2023-08-16,93.63984035475414
-2023-08-17,93.23959488055276
-2023-08-18,93.82243285044053
-2023-08-21,93.93046231318203
-2023-08-22,94.47071658207716
-2023-08-23,96.5125094884775
-2023-08-24,96.09918437216697
-2023-08-25,98.46229019855772
-2023-08-28,97.37321792353009
-2023-08-29,96.62909541160901
-2023-08-30,94.49645775055795
-2023-08-31,94.09491296028709
-2023-09-01,94.36403095154961
-2023-09-04,94.01944806325682
-2023-09-05,94.78744066687547
-2023-09-06,94.72639891270013
-2023-09-07,94.57800481598153
-2023-09-08,94.26427916072976
-2023-09-11,95.72517810043519
-2023-09-12,96.54792188580271
-2023-09-13,97.60626883178992
-2023-09-14,96.95122852201942
-2023-09-15,95.5048075764875
-2023-09-18,93.80413965179079
-2023-09-19,93.05659076183758
-2023-09-20,92.73709252387009
-2023-09-21,91.38489477767664
-2023-09-22,90.91834042973404
-2023-09-25,92.33930327234047
-2023-09-26,90.76331056673128
-2023-09-27,91.5815752078348
-2023-09-28,92.29723823571311
-2023-09-29,93.06829582749342
-2023-10-02,94.0812809556984
-2023-10-03,93.48875630912696
-2023-10-04,91.88200255940929
-2023-10-05,91.138593602501
-2023-10-06,93.34779907043965
-2023-10-09,95.14687338554093
-2023-10-10,94.6563905707351
-2023-10-11,95.65634115157148
-2023-10-12,93.8454133242883
-2023-10-13,94.65565232917115
-2023-10-16,94.8123558971576
-2023-10-17,95.89941159998419
-2023-10-18,96.63076671862908
-2023-10-19,97.16051329374653
-2023-10-20,98.17750722999536
-2023-10-23,97.66410759453126
-2023-10-24,98.17079487949295
-2023-10-25,95.99500708510683
-2023-10-26,96.33701795699832
-2023-10-27,94.83405847810222
-2023-10-30,95.68491734707756
-2023-10-31,95.90164992956683
+2020-01-01,99.22140425033597
+2020-01-02,97.84838458960296
+2020-01-03,98.66577352387075
+2020-01-06,100.52283069424195
+2020-01-07,100.24868894466216
+2020-01-08,100.12937666669883
+2020-01-09,100.28752419014222
+2020-01-10,100.4733526542209
+2020-01-13,102.3800088426881
+2020-01-14,102.11703868701063
+2020-01-15,103.1228494980233
+2020-01-16,105.49052824998088
+2020-01-17,103.71991340015636
+2020-01-20,104.84096187199708
+2020-01-21,106.21186396505571
+2020-01-22,107.11376968363405
+2020-01-23,107.90893077779708
+2020-01-24,105.69914125409463
+2020-01-27,103.44228768347176
+2020-01-28,102.95630329927725
+2020-01-29,102.70227171384532
+2020-01-30,103.18077626286461
+2020-01-31,102.64537494177969
+2020-02-03,102.18974981667257
+2020-02-04,102.55436853893904
+2020-02-05,102.61824370232353
+2020-02-06,101.45476439414108
+2020-02-07,104.31807014943193
+2020-02-10,104.5731824873765
+2020-02-11,102.90012243077517
+2020-02-12,103.58177706568041
+2020-02-13,105.58871439404362
+2020-02-14,104.86446011140575
+2020-02-17,106.20871781565945
+2020-02-18,105.52958322722303
+2020-02-19,106.82639032041128
+2020-02-20,107.52642279451334
+2020-02-21,109.5545578824884
+2020-02-24,107.81486528092925
+2020-02-25,105.97273505675722
+2020-02-26,105.32415569661057
+2020-02-27,103.84317164318331
+2020-02-28,102.59420124882142
+2020-03-02,102.22741321481206
+2020-03-03,102.93281034032348
+2020-03-04,104.868391619484
+2020-03-05,101.56917266514769
+2020-03-06,102.2022729390353
+2020-03-09,102.12500608194918
+2020-03-10,103.23486230291357
+2020-03-11,104.10921008457834
+2020-03-12,104.71889045750495
+2020-03-13,106.44372146672623
+2020-03-16,105.28773025677923
+2020-03-17,104.39103525220918
+2020-03-18,102.96475508441438
+2020-03-19,103.15297323690773
+2020-03-20,103.39456136207855
+2020-03-23,102.41093688453404
+2020-03-24,103.60101134133409
+2020-03-25,103.07782668368459
+2020-03-26,103.71244549550968
+2020-03-27,101.88850197383661
+2020-03-30,101.49696112772372
+2020-03-31,102.17952379403192
+2020-04-01,103.7356579299075
+2020-04-02,104.94380649510342
+2020-04-03,105.22886223258969
+2020-04-06,105.79637097176018
+2020-04-07,104.9684950829244
+2020-04-08,105.1868069435373
+2020-04-09,105.30207967076204
+2020-04-10,105.98313858174923
+2020-04-13,105.11782989034862
+2020-04-14,105.26053249684296
+2020-04-15,106.64953102189143
+2020-04-16,104.94293315137125
+2020-04-17,105.66005822462876
+2020-04-20,105.15424633229864
+2020-04-21,104.71997025870081
+2020-04-22,105.76223392699535
+2020-04-23,105.7560669160941
+2020-04-24,102.79347685540698
+2020-04-27,104.07521231045722
+2020-04-28,102.87327005208007
+2020-04-29,102.96752088574502
+2020-04-30,102.26190297190823
+2020-05-01,102.66003307203879
+2020-05-04,103.26185455481607
+2020-05-05,105.28151135311145
+2020-05-06,103.75224482571824
+2020-05-07,103.74640555617356
+2020-05-08,102.9644256263962
+2020-05-11,103.05778109401007
+2020-05-12,103.78430348767978
+2020-05-13,105.3530758254175
+2020-05-14,105.01388158040552
+2020-05-15,105.0260001867829
+2020-05-18,105.7071205617382
+2020-05-19,103.25963989304938
+2020-05-20,101.90643310623688
+2020-05-21,103.46954867125302
+2020-05-22,102.96161143727613
+2020-05-25,101.46850739588461
+2020-05-26,101.04994902102919
+2020-05-27,102.74194775856755
+2020-05-28,99.89147195770411
+2020-05-29,100.9893987253444
+2020-06-01,101.3795859075032
+2020-06-02,102.14702644354846
+2020-06-03,102.71156826107968
+2020-06-04,103.58437087069481
+2020-06-05,101.21977225637923
+2020-06-08,101.37398295562932
+2020-06-09,101.29015605012826
+2020-06-10,103.68358677559586
+2020-06-11,103.13631275027151
+2020-06-12,104.07361804273192
+2020-06-15,104.02437699982782
+2020-06-16,103.4065621366709
+2020-06-17,105.76845753887855
+2020-06-18,105.92267488458322
+2020-06-19,104.43466740621909
+2020-06-22,104.30310730470629
+2020-06-23,103.62835188625574
+2020-06-24,103.56562184294589
+2020-06-25,103.67766495773942
+2020-06-26,102.32068945004345
+2020-06-29,103.32137825094034
+2020-06-30,102.42337982434053
+2020-07-01,102.37350561669012
+2020-07-02,103.59833817027398
+2020-07-03,102.3385854044558
+2020-07-06,102.78938026087339
+2020-07-07,103.20658465305175
+2020-07-08,104.21878731279031
+2020-07-09,104.25358431383167
+2020-07-10,105.0953146262444
+2020-07-13,105.76210442423779
+2020-07-14,104.60520067216936
+2020-07-15,105.7683838781101
+2020-07-16,106.8849311477785
+2020-07-17,106.53487468044005
+2020-07-20,105.3977879754994
+2020-07-21,105.45657948492169
+2020-07-22,106.68579441934457
+2020-07-23,105.99510509820189
+2020-07-24,107.34236020365306
+2020-07-27,107.13050207945136
+2020-07-28,108.11857624970536
+2020-07-29,107.83965854936139
+2020-07-30,106.58499038158176
+2020-07-31,105.61277387104562
+2020-08-03,107.43679748176065
+2020-08-04,107.94235716330675
+2020-08-05,107.04332087337134
+2020-08-06,108.45019245068582
+2020-08-07,107.16372729598422
+2020-08-10,104.61174710995351
+2020-08-11,106.35819918449378
+2020-08-12,105.67717821256406
+2020-08-13,106.05870936435657
+2020-08-14,106.43992076438961
+2020-08-17,105.5376467164703
+2020-08-18,106.30427432388892
+2020-08-19,107.6975113144766
+2020-08-20,108.19777800707801
+2020-08-21,108.53970752063998
+2020-08-24,107.44000592276662
+2020-08-25,109.80398063473828
+2020-08-26,110.2333958155836
+2020-08-27,107.40701150666104
+2020-08-28,105.68586523837595
+2020-08-31,105.06406154904948
+2020-09-01,106.80533092247666
+2020-09-02,107.32283743600604
+2020-09-03,106.97956635482649
+2020-09-04,108.34383883282686
+2020-09-07,108.00367227468995
+2020-09-08,110.311110815338
+2020-09-09,106.93050518087865
+2020-09-10,107.54832850231766
+2020-09-11,108.47280153792673
+2020-09-14,106.86070292214885
+2020-09-15,104.86794053222836
+2020-09-16,104.56136107410808
+2020-09-17,106.0149600672129
+2020-09-18,105.48904224207374
+2020-09-21,105.52069603943563
+2020-09-22,105.28627597386742
+2020-09-23,104.55564859224309
+2020-09-24,105.31391039258055
+2020-09-25,105.68518478564147
+2020-09-28,106.52804470526176
+2020-09-29,108.22818321960357
+2020-09-30,106.37928300394614
+2020-10-01,105.46804374679006
+2020-10-02,106.28876695415734
+2020-10-05,107.32286307722237
+2020-10-06,106.15766679527026
+2020-10-07,106.603497275037
+2020-10-08,106.38136244692278
+2020-10-09,107.97419418850178
+2020-10-12,107.82085379034069
+2020-10-13,109.512534733166
+2020-10-14,109.63042075305847
+2020-10-15,109.46304464558887
+2020-10-16,111.26647719722236
+2020-10-19,112.41989627160412
+2020-10-20,112.79383631889954
+2020-10-21,115.42860814639111
+2020-10-22,115.0716568518011
+2020-10-23,112.96284053566448
+2020-10-26,111.32433498244214
+2020-10-27,112.22300687110985
+2020-10-28,111.52757104566986
+2020-10-29,112.38381349822733
+2020-10-30,112.23063503997912
+2020-11-02,111.66588122899242
+2020-11-03,113.36100903977137
+2020-11-04,114.28659089473902
+2020-11-05,115.27976130705223
+2020-11-06,115.95330531761672
+2020-11-09,114.88454207477629
+2020-11-10,116.85178346252476
+2020-11-11,117.9390649527561
+2020-11-12,118.52299255630886
+2020-11-13,119.11715285906897
+2020-11-16,119.97739872039637
+2020-11-17,119.62551923674587
+2020-11-18,118.91702210399488
+2020-11-19,119.61359448645446
+2020-11-20,121.36518254351203
+2020-11-23,118.6315811660761
+2020-11-24,119.96146229993663
+2020-11-25,118.55890896929412
+2020-11-26,116.3602195728086
+2020-11-27,118.3628984372547
+2020-11-30,117.42891626070873
+2020-12-01,119.11307939178397
+2020-12-02,118.35420308765043
+2020-12-03,116.77041722875163
+2020-12-04,116.19259662319119
+2020-12-07,118.5374143066327
+2020-12-08,119.64052724916796
+2020-12-09,119.82027201742993
+2020-12-10,117.77691210135634
+2020-12-11,118.43724390236643
+2020-12-14,118.13809692753388
+2020-12-15,115.28367460127653
+2020-12-16,115.56307094121566
+2020-12-17,116.62976766283322
+2020-12-18,116.38694272560306
+2020-12-21,115.37810315491967
+2020-12-22,117.51370118430349
+2020-12-23,116.52949113362634
+2020-12-24,115.20910826093652
+2020-12-25,116.12471122424077
+2020-12-28,115.41796098382615
+2020-12-29,115.76143470125488
+2020-12-30,115.95746258236824
+2020-12-31,116.23113486744445
+2021-01-01,115.68348716044514
+2021-01-04,115.73663118604611
+2021-01-05,118.03526800962646
+2021-01-06,118.07941569781715
+2021-01-07,119.84912061400064
+2021-01-08,120.632783930529
+2021-01-11,121.09031568222457
+2021-01-12,122.28952602169119
+2021-01-13,123.28562101652525
+2021-01-14,124.3606087566715
+2021-01-15,126.2842667807322
+2021-01-18,126.53349720376548
+2021-01-19,125.1597772931791
+2021-01-20,124.99440915716275
+2021-01-21,124.12287891929685
+2021-01-22,125.59732553507584
+2021-01-25,125.73720372117721
+2021-01-26,123.95558182082347
+2021-01-27,124.10407366195788
+2021-01-28,125.46003740513567
+2021-01-29,125.55370011214899
+2021-02-01,126.42326182721091
+2021-02-02,126.91526694646807
+2021-02-03,129.532770668021
+2021-02-04,129.76457135525266
+2021-02-05,130.61062140361244
+2021-02-08,130.90157254007596
+2021-02-09,131.0620232610123
+2021-02-10,131.78043153430897
+2021-02-11,132.54765377499245
+2021-02-12,130.253964589323
+2021-02-15,130.1322814101103
+2021-02-16,129.46466513626706
+2021-02-17,129.47077585026938
+2021-02-18,125.65711266564283
+2021-02-19,125.86888120183102
+2021-02-22,124.91621544152618
+2021-02-23,122.18385546853392
+2021-02-24,123.62560648621665
+2021-02-25,124.69115344496262
+2021-02-26,125.96581609628421
+2021-03-01,125.60616067260308
+2021-03-02,125.25551698257603
+2021-03-03,124.29493807104225
+2021-03-04,127.52748578904722
+2021-03-05,125.92894505191398
+2021-03-08,127.59770078416966
+2021-03-09,125.32034055081782
+2021-03-10,125.26840564220065
+2021-03-11,125.8311780549494
+2021-03-12,126.30392724955706
+2021-03-15,124.95072821295314
+2021-03-16,128.35238869406547
+2021-03-17,130.26276833663402
+2021-03-18,129.18549177030602
+2021-03-19,129.6888327384172
+2021-03-22,129.2182917817037
+2021-03-23,131.1562648885446
+2021-03-24,130.81100090486663
+2021-03-25,130.48104239116577
+2021-03-26,130.19785389359453
+2021-03-29,130.462405887788
+2021-03-30,133.99827951778485
+2021-03-31,136.03497875543042
+2021-04-01,136.87864391929259
+2021-04-02,136.9831704278699
+2021-04-05,137.78199983047378
+2021-04-06,136.50410102630525
+2021-04-07,137.40791873361925
+2021-04-08,138.38495074705267
+2021-04-09,137.03944505079252
+2021-04-12,135.81230941279395
+2021-04-13,138.44529375606254
+2021-04-14,140.5076892771703
+2021-04-15,142.081489864982
+2021-04-16,146.02729643278985
+2021-04-19,145.88824257784273
+2021-04-20,145.43458502419946
+2021-04-21,148.8621362615833
+2021-04-22,149.38266318622345
+2021-04-23,149.7874041887111
+2021-04-26,148.7306605777684
+2021-04-27,148.21538842851382
+2021-04-28,149.6705590381976
+2021-04-29,148.05740322773363
+2021-04-30,149.2276364382074
+2021-05-03,149.545158353053
+2021-05-04,148.38353712675064
+2021-05-05,147.8947320562856
+2021-05-06,147.03021686525705
+2021-05-07,146.00120444747358
+2021-05-10,144.75040616451835
+2021-05-11,145.35830596687902
+2021-05-12,145.4986970510109
+2021-05-13,144.94369113802128
+2021-05-14,143.15803300592046
+2021-05-17,141.95818275300704
+2021-05-18,138.0904753465572
+2021-05-19,137.93020626426485
+2021-05-20,139.68408055468186
+2021-05-21,138.44255484853042
+2021-05-24,136.81444817270088
+2021-05-25,136.86151755471846
+2021-05-26,137.30838288703276
+2021-05-27,139.12501229013822
+2021-05-28,136.32464284707265
+2021-05-31,135.99210565954476
+2021-06-01,137.59584906484176
+2021-06-02,137.0552980893337
+2021-06-03,136.88230836718267
+2021-06-04,139.18022808320038
+2021-06-07,138.6822713152706
+2021-06-08,138.6144775475165
+2021-06-09,137.5465708123496
+2021-06-10,136.99161321831133
+2021-06-11,136.08246104967444
+2021-06-14,139.7471976071617
+2021-06-15,135.64666764914807
+2021-06-16,137.9872904404035
+2021-06-17,137.97867452103932
+2021-06-18,138.30537112283426
+2021-06-21,137.1261131876637
+2021-06-22,137.1639331864757
+2021-06-23,136.92917642071225
+2021-06-24,138.0055119359989
+2021-06-25,137.83899063171668
+2021-06-28,136.3825269268833
+2021-06-29,139.53092150296055
+2021-06-30,141.9769259595287
+2021-07-01,141.8336171136594
+2021-07-02,142.86901246115443
+2021-07-05,140.95669287012186
+2021-07-06,142.87525676039002
+2021-07-07,140.5495897098721
+2021-07-08,139.5215573537898
+2021-07-09,137.91378423862412
+2021-07-12,137.44326728102018
+2021-07-13,138.39308139497598
+2021-07-14,139.78533962257796
+2021-07-15,140.21232864047397
+2021-07-16,137.05684879796164
+2021-07-19,133.9399478026532
+2021-07-20,135.46878300733908
+2021-07-21,136.09130286157324
+2021-07-22,135.90737244795247
+2021-07-23,138.60996661951174
+2021-07-26,138.10440351257307
+2021-07-27,138.49151665335327
+2021-07-28,138.822172445874
+2021-07-29,140.5267310421297
+2021-07-30,140.8556795153327
+2021-08-02,142.310339849431
+2021-08-03,140.62152555680433
+2021-08-04,141.1654131515608
+2021-08-05,140.68691061806882
+2021-08-06,142.66156446542345
+2021-08-09,139.07639440185352
+2021-08-10,140.184094999209
+2021-08-11,142.51695286628004
+2021-08-12,146.05204590894826
+2021-08-13,145.9305395882594
+2021-08-16,145.58358009575707
+2021-08-17,143.83303402999067
+2021-08-18,142.74201885899046
+2021-08-19,142.12683762537816
+2021-08-20,141.86213072453234
+2021-08-23,144.60828808985517
+2021-08-24,145.85793107580446
+2021-08-25,146.21788939433833
+2021-08-26,146.08612514036474
+2021-08-27,144.74118190817532
+2021-08-30,144.59167789066524
+2021-08-31,142.13055459340285
+2021-09-01,139.7419537386364
+2021-09-02,140.9810620770975
+2021-09-03,140.9762239115945
+2021-09-06,141.74512704118328
+2021-09-07,140.99196516354243
+2021-09-08,142.13807013440018
+2021-09-09,141.33687188687605
+2021-09-10,138.3732793711246
+2021-09-13,140.1057321123215
+2021-09-14,137.78545128844473
+2021-09-15,137.4938293373593
+2021-09-16,139.02475970073885
+2021-09-17,138.11007166784702
+2021-09-20,136.4419893484931
+2021-09-21,134.22266821516516
+2021-09-22,133.44508552710354
+2021-09-23,135.23296361145287
+2021-09-24,138.48177752004875
+2021-09-27,137.78309214368866
+2021-09-28,135.35017967191183
+2021-09-29,133.96889792920172
+2021-09-30,135.2084186397563
+2021-10-01,135.01968866606487
+2021-10-04,139.20409777688002
+2021-10-05,137.81611429178855
+2021-10-06,139.75015480545204
+2021-10-07,139.30030684852363
+2021-10-08,139.1248963281783
+2021-10-11,139.28701091071025
+2021-10-12,142.56910568022383
+2021-10-13,143.57744531555727
+2021-10-14,144.73480191179507
+2021-10-15,145.04383544062875
+2021-10-18,147.88544723344899
+2021-10-19,148.73366168573284
+2021-10-20,149.4112566607525
+2021-10-21,148.44153109833147
+2021-10-22,147.81082129080082
+2021-10-25,145.95847338685755
+2021-10-26,143.39729415942602
+2021-10-27,142.54236544423011
+2021-10-28,138.98983788729714
+2021-10-29,138.5082921875457
+2021-11-01,138.97301134358236
+2021-11-02,138.3771994432178
+2021-11-03,138.73194882383515
+2021-11-04,139.02971834544823
+2021-11-05,141.84991868203505
+2021-11-08,141.85849147010086
+2021-11-09,140.7843275953645
+2021-11-10,140.19093422040885
+2021-11-11,141.04750209600024
+2021-11-12,140.51003934678025
+2021-11-15,141.79904115071852
+2021-11-16,143.83003955074844
+2021-11-17,146.21986394670856
+2021-11-18,149.02561749680075
+2021-11-19,149.62696257234472
+2021-11-22,147.82934382267385
+2021-11-23,148.44681192309343
+2021-11-24,151.60765178368746
+2021-11-25,151.47355191224224
+2021-11-26,151.7895042873425
+2021-11-29,153.58759041824183
+2021-11-30,152.00299234254993
+2021-12-01,151.73446142174313
+2021-12-02,153.28085595693815
+2021-12-03,153.7683349775816
+2021-12-06,153.22159994132437
+2021-12-07,153.76119412694067
+2021-12-08,152.58478599301276
+2021-12-09,153.1478941116409
+2021-12-10,151.7383379084021
+2021-12-13,152.26996387483763
+2021-12-14,151.82872302607626
+2021-12-15,156.1819237848615
+2021-12-16,154.62682615051384
+2021-12-17,156.95802165897362
+2021-12-20,155.93689903734642
+2021-12-21,158.2039119211116
+2021-12-22,161.45812012327528
+2021-12-23,161.1745793636623
+2021-12-24,161.05782993786272
+2021-12-27,155.2049983524158
+2021-12-28,157.83055679144167
+2021-12-29,159.84658069649674
+2021-12-30,157.33347990915115
+2021-12-31,158.21679109736624
+2022-01-03,159.48957472073067
+2022-01-04,158.07536717297356
+2022-01-05,156.27644066126237
+2022-01-06,157.98149172927666
+2022-01-07,159.38597286438008
+2022-01-10,157.79586118610106
+2022-01-11,160.17800322020886
+2022-01-12,160.78666501207607
+2022-01-13,158.99593578661876
+2022-01-14,161.22227246590472
+2022-01-17,166.48924904448577
+2022-01-18,162.28424265936252
+2022-01-19,163.82479128440758
+2022-01-20,164.72147788397174
+2022-01-21,166.20081313821157
+2022-01-24,167.80983286935168
+2022-01-25,165.17421754317155
+2022-01-26,161.87037411811318
+2022-01-27,164.10791450634792
+2022-01-28,165.2957473660669
+2022-01-31,162.09276297015037
+2022-02-01,164.6474192592848
+2022-02-02,159.88548497060145
+2022-02-03,157.8966746464551
+2022-02-04,159.5392744482951
+2022-02-07,158.71586100699594
+2022-02-08,157.1757358085854
+2022-02-09,155.70778675650075
+2022-02-10,153.8994515792374
+2022-02-11,154.1347146151082
+2022-02-14,153.88644336930108
+2022-02-15,157.54138997177827
+2022-02-16,157.2282215418383
+2022-02-17,156.5764993817669
+2022-02-18,155.45814147309463
+2022-02-21,155.6044052431052
+2022-02-22,155.57664498239083
+2022-02-23,153.94065605155149
+2022-02-24,152.65078154843889
+2022-02-25,152.67961474649076
+2022-02-28,153.86209716212318
+2022-03-01,154.46675032913964
+2022-03-02,153.63250696437197
+2022-03-03,155.84645925760574
+2022-03-04,155.29187799687088
+2022-03-07,156.07524763803906
+2022-03-08,155.4768385624453
+2022-03-09,157.4742596375646
+2022-03-10,157.0826639172136
+2022-03-11,153.41248623560674
+2022-03-14,157.58000037459038
+2022-03-15,157.13118956105885
+2022-03-16,158.56636829952262
+2022-03-17,161.38259424734377
+2022-03-18,162.21951503679708
+2022-03-21,160.74976329411183
+2022-03-22,157.5557824266427
+2022-03-23,155.29990097999553
+2022-03-24,155.9118704856974
+2022-03-25,154.92142301106077
+2022-03-28,152.61373706558226
+2022-03-29,153.1351792268738
+2022-03-30,153.22776778304114
+2022-03-31,150.9923306963147
+2022-04-01,152.33527510602005
+2022-04-04,154.1870960211724
+2022-04-05,153.85942213116078
+2022-04-06,151.94950090657764
+2022-04-07,154.75272512253483
+2022-04-08,152.0222626965824
+2022-04-11,152.1654919712044
+2022-04-12,149.8303731068464
+2022-04-13,149.954498048341
+2022-04-14,149.6029728277187
+2022-04-15,150.48848348854193
+2022-04-18,149.24178221119797
+2022-04-19,145.6395923882034
+2022-04-20,147.08057413286633
+2022-04-21,146.764703641565
+2022-04-22,147.09636995691022
+2022-04-25,146.56990168803554
+2022-04-26,147.9034797828061
+2022-04-27,146.06013959671273
+2022-04-28,144.83113216324176
+2022-04-29,144.08634979009034
+2022-05-02,145.39334163676924
+2022-05-03,147.58137812642116
+2022-05-04,149.35127825565198
+2022-05-05,151.6284654427399
+2022-05-06,152.89455894550562
+2022-05-09,155.66976279337962
+2022-05-10,154.66483839716565
+2022-05-11,159.221922743261
+2022-05-12,158.22633420152067
+2022-05-13,155.48829631817827
+2022-05-16,156.91503659973836
+2022-05-17,155.6238627839502
+2022-05-18,154.18440568116617
+2022-05-19,152.3546764537968
+2022-05-20,152.010940467939
+2022-05-23,153.0611983705364
+2022-05-24,155.40798323916485
+2022-05-25,157.53619671049773
+2022-05-26,157.0011877929036
+2022-05-27,156.71586359088593
+2022-05-30,155.64708719032328
+2022-05-31,154.83589680141463
+2022-06-01,151.7920923407624
+2022-06-02,152.12721895097079
+2022-06-03,152.76867965133366
+2022-06-06,152.4997398011023
+2022-06-07,151.80785856944536
+2022-06-08,151.0742152587646
+2022-06-09,153.8673269102192
+2022-06-10,154.87955946177388
+2022-06-13,154.50672279136833
+2022-06-14,153.50894785539785
+2022-06-15,152.7429490771083
+2022-06-16,153.9717775399979
+2022-06-17,153.45739911705942
+2022-06-20,152.95594643420594
+2022-06-21,151.88735080260415
+2022-06-22,150.58602222185647
+2022-06-23,151.25625880586855
+2022-06-24,148.96744563644165
+2022-06-27,150.12565741289842
+2022-06-28,149.76041867511702
+2022-06-29,150.37700117008015
+2022-06-30,151.41295344219907
+2022-07-01,150.70371237855758
+2022-07-04,152.4962577547739
+2022-07-05,150.3146557937062
+2022-07-06,150.73917703612395
+2022-07-07,148.77950029819274
+2022-07-08,144.74123273099346
+2022-07-11,142.39619459511806
+2022-07-12,141.85177759799518
+2022-07-13,143.71826310817698
+2022-07-14,147.3237767670324
+2022-07-15,146.36033327524316
+2022-07-18,146.2792598535708
+2022-07-19,147.62825114723375
+2022-07-20,146.2905611685952
+2022-07-21,146.27615655183058
+2022-07-22,143.3425948476813
+2022-07-25,139.96388019056826
+2022-07-26,139.3994061776239
+2022-07-27,137.87352827299165
+2022-07-28,137.87173052577845
+2022-07-29,135.6925276838354
+2022-08-01,133.4764601170562
+2022-08-02,134.08396165153323
+2022-08-03,137.6572060650333
+2022-08-04,141.52421844368902
+2022-08-05,142.96371043838627
+2022-08-08,143.89370885122997
+2022-08-09,146.060755515174
+2022-08-10,146.3002960401027
+2022-08-11,144.60360912918554
+2022-08-12,142.9932751822395
+2022-08-15,142.49193186705108
+2022-08-16,143.57595368183917
+2022-08-17,143.77895595366883
+2022-08-18,143.36534073430144
+2022-08-19,147.08248762056863
+2022-08-22,149.32012595151548
+2022-08-23,151.132626406228
+2022-08-24,152.36196421185326
+2022-08-25,155.32991442535942
+2022-08-26,159.56109842687644
+2022-08-29,163.61663025123133
+2022-08-30,167.46532770956998
+2022-08-31,169.5095749573437
+2022-09-01,168.08390636927888
+2022-09-02,170.33669770452659
+2022-09-05,166.27886393300406
+2022-09-06,164.0241256313164
+2022-09-07,161.00174196199723
+2022-09-08,159.66217514298236
+2022-09-09,161.69104938840775
+2022-09-12,163.11115040714137
+2022-09-13,162.8525747427424
+2022-09-14,161.4305203180373
+2022-09-15,163.38867766611222
+2022-09-16,165.32346692456093
+2022-09-19,165.5304986457962
+2022-09-20,160.68084147285916
+2022-09-21,162.90152913993137
+2022-09-22,163.2820203061998
+2022-09-23,164.722497336771
+2022-09-26,164.44897684512944
+2022-09-27,165.97064069821704
+2022-09-28,161.53040239186086
+2022-09-29,162.84009372963854
+2022-09-30,162.24687626733308
+2022-10-03,161.97562459024476
+2022-10-04,163.71048346732576
+2022-10-05,165.44845156712492
+2022-10-06,167.49960103561668
+2022-10-07,168.98199798401336
+2022-10-10,167.88923824543963
+2022-10-11,168.26794702785816
+2022-10-12,167.92839634717492
+2022-10-13,166.6134314142605
+2022-10-14,168.1199034828674
+2022-10-17,169.43935905881744
+2022-10-18,170.79189145729373
+2022-10-19,169.93887479946574
+2022-10-20,168.13724955226138
+2022-10-21,165.55024525524337
+2022-10-24,167.71046690774062
+2022-10-25,168.54766045101812
+2022-10-26,165.45970385373553
+2022-10-27,166.30671369550166
+2022-10-28,163.77929977204252
+2022-10-31,161.50058068487118
+2022-11-01,159.71432615526984
+2022-11-02,154.23906050606345
+2022-11-03,154.21300507448154
+2022-11-04,154.5639663230493
+2022-11-07,151.7080818165649
+2022-11-08,153.25726524383475
+2022-11-09,152.342371191868
+2022-11-10,153.89079939774643
+2022-11-11,154.2531086415062
+2022-11-14,154.42578809433982
+2022-11-15,154.99379764215627
+2022-11-16,156.17643027561672
+2022-11-17,155.41444643075258
+2022-11-18,153.64217899830922
+2022-11-21,153.74105793855026
+2022-11-22,153.41559257677798
+2022-11-23,152.87625867834248
+2022-11-24,155.10206459161876
+2022-11-25,157.07386488384975
+2022-11-28,156.2844108331991
+2022-11-29,153.99937439886816
+2022-11-30,154.56257935231866
+2022-12-01,154.02946878403344
+2022-12-02,152.59740690204592
+2022-12-05,150.72678271025458
+2022-12-06,148.8503900529083
+2022-12-07,146.29531256776087
+2022-12-08,145.12875471264374
+2022-12-09,143.7758149232168
+2022-12-12,144.46723063222814
+2022-12-13,148.4285057735582
+2022-12-14,147.87251162905198
+2022-12-15,146.00112916509102
+2022-12-16,147.12710251574828
+2022-12-19,147.64270242593804
+2022-12-20,147.86321433843244
+2022-12-21,148.99069595163644
+2022-12-22,151.5759275472779
+2022-12-23,151.3840442841964
+2022-12-26,150.1902725017095
+2022-12-27,148.1364472806788
+2022-12-28,146.12783083762605
+2022-12-29,146.79991000253943
+2022-12-30,149.73936089482547
+2023-01-02,151.04495648804297
+2023-01-03,147.83971577483857
+2023-01-04,148.1823086907268
+2023-01-05,150.7009339767803
+2023-01-06,150.1481187606042
+2023-01-09,152.19863089550697
+2023-01-10,152.96099068985288
+2023-01-11,151.20149662364574
+2023-01-12,151.78746280887412
+2023-01-13,152.8705367179022
+2023-01-16,157.48234726742592
+2023-01-17,159.29817071649245
+2023-01-18,161.4195555335567
+2023-01-19,159.4671038618748
+2023-01-20,157.07103925224786
+2023-01-23,160.84920821727923
+2023-01-24,160.05061414645024
+2023-01-25,158.8436008833294
+2023-01-26,160.08982175182095
+2023-01-27,162.27383554051374
+2023-01-30,161.68099438579517
+2023-01-31,164.90181704341873
+2023-02-01,162.94735675193945
+2023-02-02,161.63858413448247
+2023-02-03,160.88078617152175
+2023-02-06,162.06430324992218
+2023-02-07,160.51930673679234
+2023-02-08,155.7648902243846
+2023-02-09,152.87517235827409
+2023-02-10,150.021388470438
+2023-02-13,151.07461470485117
+2023-02-14,148.71366817459065
+2023-02-15,146.64327121519946
+2023-02-16,147.19495779327784
+2023-02-17,146.9850228230351
+2023-02-20,149.57093200653821
+2023-02-21,150.01083795350533
+2023-02-22,150.5699231735183
+2023-02-23,148.16352129341433
+2023-02-24,148.62297884345506
+2023-02-27,145.78940719521142
+2023-02-28,144.25740245778226
+2023-03-01,144.24491197033493
+2023-03-02,145.61567561209955
+2023-03-03,142.96807036956776
+2023-03-06,144.82930976980987
+2023-03-07,142.37121168916426
+2023-03-08,140.0675344718095
+2023-03-09,143.00822339811242
+2023-03-10,142.72222584573905
+2023-03-13,141.89373759344866
+2023-03-14,146.4399976514952
+2023-03-15,146.91725219339077
+2023-03-16,148.94085497673044
+2023-03-17,149.48034313233546
+2023-03-20,150.41077319306208
+2023-03-21,148.7551239131782
+2023-03-22,146.59886611040034
+2023-03-23,144.6568913668707
+2023-03-24,145.33661865233665
+2023-03-27,147.95009540059067
+2023-03-28,148.95101152159432
+2023-03-29,149.84617487496905
+2023-03-30,153.60183791004857
+2023-03-31,155.15164777624582
+2023-04-03,151.58878427255996
+2023-04-04,150.6339103429364
+2023-04-05,149.02065501859812
+2023-04-06,147.4479860645332
+2023-04-07,147.41001096932104
+2023-04-10,149.49778766768623
+2023-04-11,148.53704679945977
+2023-04-12,151.42790889190462
+2023-04-13,152.14682384253447
+2023-04-14,152.20603287449498
+2023-04-17,154.59468309548856
+2023-04-18,157.17881634364096
+2023-04-19,159.7020486171738
+2023-04-20,158.11045404909788
+2023-04-21,156.0970466013344
+2023-04-24,155.31687446006143
+2023-04-25,158.1969953340859
+2023-04-26,155.9899247859293
+2023-04-27,154.59025431581765
+2023-04-28,154.99091069831783
+2023-05-01,153.00441374989794
+2023-05-02,153.60063584155628
+2023-05-03,152.3883263320859
+2023-05-04,154.39807372162932
+2023-05-05,154.2303688399588
+2023-05-08,151.00196657895015
+2023-05-09,153.09172859625812
+2023-05-10,152.85482874835722
+2023-05-11,151.90765285229963
+2023-05-12,152.59161096214712
+2023-05-15,152.7248151598763
+2023-05-16,153.253224245044
+2023-05-17,153.12127345421044
+2023-05-18,153.2426386653409
+2023-05-19,150.84673271546146
+2023-05-22,152.37689046503
+2023-05-23,148.81306705408522
+2023-05-24,149.77183472875214
+2023-05-25,151.3142408918556
+2023-05-26,150.364513005112
+2023-05-29,149.39125115621297
+2023-05-30,148.7584596294977
+2023-05-31,149.27281167275947
+2023-06-01,151.38183092564012
+2023-06-02,149.3479800702181
+2023-06-05,151.98717150496853
+2023-06-06,154.3362639076767
+2023-06-07,154.8065650810542
+2023-06-08,154.5647640427515
+2023-06-09,151.0367586790359
+2023-06-12,150.97729471940463
+2023-06-13,149.55835584696027
+2023-06-14,150.72065536515484
+2023-06-15,152.68366819299922
+2023-06-16,153.2123824754658
+2023-06-19,152.0435211454033
+2023-06-20,152.0670528439284
+2023-06-21,150.04475281451298
+2023-06-22,147.74001153041218
+2023-06-23,147.4784156310284
+2023-06-26,148.25714026749048
+2023-06-27,148.0081346194863
+2023-06-28,146.46633923249232
+2023-06-29,146.25303044987177
+2023-06-30,145.68920452000592
+2023-07-03,146.5535665465175
+2023-07-04,145.68102917652277
+2023-07-05,145.26999869148412
+2023-07-06,148.5942159048766
+2023-07-07,151.8287289922331
+2023-07-10,150.4910023761106
+2023-07-11,151.76473848569444
+2023-07-12,153.54156754483017
+2023-07-13,150.36387299225274
+2023-07-14,149.7448284449084
+2023-07-17,150.82440003241987
+2023-07-18,150.72410941884596
+2023-07-19,149.48097391540486
+2023-07-20,146.79729070761357
+2023-07-21,148.95568341517637
+2023-07-24,147.5572496916775
+2023-07-25,149.42683111724332
+2023-07-26,149.21526565864298
+2023-07-27,148.94855765524815
+2023-07-28,152.02574279891215
+2023-07-31,151.36814617158035
+2023-08-01,148.70632588966996
+2023-08-02,152.99841019316221
+2023-08-03,154.95926333307406
+2023-08-04,153.9111502284755
+2023-08-07,150.74487546344866
+2023-08-08,150.91208918613518
+2023-08-09,152.5907657813715
+2023-08-10,153.2347330427395
+2023-08-11,149.58297968759885
+2023-08-14,145.46569817097847
+2023-08-15,146.23507299154429
+2023-08-16,149.41355069173085
+2023-08-17,147.97659947995476
+2023-08-18,146.8023016111197
+2023-08-21,145.79252686126702
+2023-08-22,144.07249183569078
+2023-08-23,145.3299558671373
+2023-08-24,145.98817567128745
+2023-08-25,146.05340403986676
+2023-08-28,145.53145159729024
+2023-08-29,146.8171532798474
+2023-08-30,143.089470258461
+2023-08-31,143.58709754990218
+2023-09-01,143.03821774464686
+2023-09-04,145.55322358116675
+2023-09-05,145.14087541857862
+2023-09-06,145.47346239845356
+2023-09-07,144.7964898725708
+2023-09-08,144.62940647096306
+2023-09-11,143.81266677602912
+2023-09-12,144.78809388682896
+2023-09-13,146.5614197820804
+2023-09-14,146.4305859817037
+2023-09-15,148.82635082007815
+2023-09-18,148.6055946637589
+2023-09-19,146.56220486635686
+2023-09-20,148.41333713495385
+2023-09-21,146.97882578500273
+2023-09-22,146.79530213577027
+2023-09-25,145.50415437064714
+2023-09-26,144.4925222607878
+2023-09-27,143.89167712510778
+2023-09-28,142.3660152377865
+2023-09-29,142.06681659073837
+2023-10-02,143.35790419478954
+2023-10-03,144.9071654870919
+2023-10-04,145.61339578628804
+2023-10-05,146.01154598608633
+2023-10-06,143.80057893558447
+2023-10-09,144.02145005028333
+2023-10-10,143.11149212150937
+2023-10-11,143.3154990610562
+2023-10-12,142.88759350916897
+2023-10-13,140.044571662969
+2023-10-16,140.63373474526378
+2023-10-17,141.79069397256947
+2023-10-18,141.01418789992692
+2023-10-19,139.23730534060937
+2023-10-20,140.10247222063367
+2023-10-23,140.66264851967142
+2023-10-24,141.42460286838636
+2023-10-25,141.99345523462114
+2023-10-26,143.1764539741685
+2023-10-27,143.49571237510713
+2023-10-30,142.27148272510618
+2023-10-31,143.1247230421164
diff --git a/dashboard/dashboard.css b/dashboard/dashboard.css
new file mode 100644
index 0000000..c6ef620
--- /dev/null
+++ b/dashboard/dashboard.css
@@ -0,0 +1,125 @@
+
+ /* Dashboard styles */
+ body {
+ font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
+ margin: 0;
+ padding: 0;
+ background-color: #f5f7fa;
+ color: #333;
+ }
+
+ .container {
+ max-width: 1200px;
+ margin: 0 auto;
+ padding: 20px;
+ }
+
+ .header {
+ background-color: #2c3e50;
+ color: white;
+ padding: 20px;
+ border-radius: 8px;
+ margin-bottom: 20px;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ }
+
+ .header h1 {
+ margin: 0;
+ font-size: 24px;
+ }
+
+ .date-range {
+ font-size: 14px;
+ opacity: 0.8;
+ }
+
+ .total-return {
+ font-size: 32px;
+ font-weight: bold;
+ margin: 0;
+ }
+
+ .positive-return {
+ color: #2ecc71;
+ }
+
+ .negative-return {
+ color: #e74c3c;
+ }
+
+ /* Metrics grid */
+ .metrics-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
+ grid-gap: 20px;
+ margin-bottom: 20px;
+ }
+
+ .metric-card {
+ background-color: white;
+ border-radius: 8px;
+ padding: 20px;
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
+ }
+
+ .metric-title {
+ font-size: 14px;
+ color: #7f8c8d;
+ margin: 0 0 5px 0;
+ }
+
+ .metric-value {
+ font-size: 24px;
+ font-weight: bold;
+ margin: 0;
+ }
+
+ /* Plots grid */
+ .plots-grid {
+ display: flex;
+ flex-direction: column;
+ gap: 20px;
+ }
+
+ .plot-row {
+ display: grid;
+ grid-template-columns: repeat(2, 1fr);
+ grid-gap: 20px;
+ }
+
+ .plot-card {
+ background-color: white;
+ border-radius: 8px;
+ padding: 20px;
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
+ }
+
+ .plot-title {
+ font-size: 18px;
+ margin-top: 0;
+ margin-bottom: 15px;
+ }
+
+ .plot-container {
+ height: 300px;
+ width: 100%;
+ }
+
+ /* Responsive layout */
+ @media (max-width: 768px) {
+ .plot-row {
+ grid-template-columns: 1fr;
+ }
+
+ .header {
+ flex-direction: column;
+ align-items: flex-start;
+ }
+
+ .header > div:last-child {
+ margin-top: 15px;
+ }
+ }
+
\ No newline at end of file
diff --git a/dashboard/dashboard.html b/dashboard/dashboard.html
new file mode 100644
index 0000000..4561a08
--- /dev/null
+++ b/dashboard/dashboard.html
@@ -0,0 +1,554 @@
+
+
+
+
+
+ AlgoSystem Trading Dashboard
+
+
+
+
+
+
+
+
+
+
+
+
+
Annualized Return
+
0.00%
+
+
+
+
+
Max Drawdown
+
-14.83%
+
+
+
+
+
+
+
Monthly Returns Heatmap
+
+
+
+
+
Rolling Sharpe Ratio
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/dashboard/dashboard_data.json b/dashboard/dashboard_data.json
new file mode 100644
index 0000000..692fe46
--- /dev/null
+++ b/dashboard/dashboard_data.json
@@ -0,0 +1,16211 @@
+{
+ "metrics": {
+ "total_return": 0.8897025257152138,
+ "annualized_return": 0.17414266304309534,
+ "annualized_volatility": 0.15920432118905606,
+ "max_drawdown": -0.1483063614514647,
+ "risk_metrics_error": "value_at_risk() got an unexpected keyword argument 'cutoff'",
+ "sharpe_ratio": 1.0881549013955605,
+ "sortino_ratio": 1.6280415685265508,
+ "calmar_ratio": 0.8196456408920249,
+ "positive_days": 537,
+ "negative_days": 462,
+ "pct_positive_days": 0.5375375375375375,
+ "best_month": 0.12243839646812993,
+ "worst_month": -0.07759771866113996,
+ "avg_monthly_return": 0.014946989399733884,
+ "monthly_volatility": 0.04623656501148044,
+ "pct_positive_months": 0.5217391304347826,
+ "alpha": 0.1725763946708265,
+ "beta": 0.006009254653426389,
+ "correlation": 0.007129779592087118,
+ "benchmark_metrics_error": "'risk'"
+ },
+ "data": {
+ "equity": [
+ {
+ "date": "2020-01-01",
+ "value": 99.43580221643582
+ },
+ {
+ "date": "2020-01-02",
+ "value": 100.9651267250002
+ },
+ {
+ "date": "2020-01-03",
+ "value": 101.47618581438884
+ },
+ {
+ "date": "2020-01-06",
+ "value": 101.40970154137707
+ },
+ {
+ "date": "2020-01-07",
+ "value": 101.68043817071772
+ },
+ {
+ "date": "2020-01-08",
+ "value": 100.76913361541695
+ },
+ {
+ "date": "2020-01-09",
+ "value": 100.20637401722436
+ },
+ {
+ "date": "2020-01-10",
+ "value": 99.85261881167817
+ },
+ {
+ "date": "2020-01-13",
+ "value": 101.71377134584947
+ },
+ {
+ "date": "2020-01-14",
+ "value": 103.00351325730517
+ },
+ {
+ "date": "2020-01-15",
+ "value": 103.33757964669755
+ },
+ {
+ "date": "2020-01-16",
+ "value": 103.22895658836936
+ },
+ {
+ "date": "2020-01-17",
+ "value": 104.38877831800492
+ },
+ {
+ "date": "2020-01-20",
+ "value": 105.61930775679943
+ },
+ {
+ "date": "2020-01-21",
+ "value": 105.0070722569902
+ },
+ {
+ "date": "2020-01-22",
+ "value": 103.6517193120229
+ },
+ {
+ "date": "2020-01-23",
+ "value": 101.90359231184911
+ },
+ {
+ "date": "2020-01-24",
+ "value": 102.06947592549463
+ },
+ {
+ "date": "2020-01-27",
+ "value": 102.84836632845578
+ },
+ {
+ "date": "2020-01-28",
+ "value": 104.26252142014215
+ },
+ {
+ "date": "2020-01-29",
+ "value": 105.2408515472917
+ },
+ {
+ "date": "2020-01-30",
+ "value": 105.61895221757905
+ },
+ {
+ "date": "2020-01-31",
+ "value": 106.26208478900571
+ },
+ {
+ "date": "2020-02-03",
+ "value": 108.1074270811467
+ },
+ {
+ "date": "2020-02-04",
+ "value": 109.13189403904622
+ },
+ {
+ "date": "2020-02-05",
+ "value": 109.06959873071365
+ },
+ {
+ "date": "2020-02-06",
+ "value": 110.8481558387983
+ },
+ {
+ "date": "2020-02-07",
+ "value": 109.22556045218472
+ },
+ {
+ "date": "2020-02-10",
+ "value": 109.7368109956686
+ },
+ {
+ "date": "2020-02-11",
+ "value": 110.7903331615751
+ },
+ {
+ "date": "2020-02-12",
+ "value": 110.50595899966031
+ },
+ {
+ "date": "2020-02-13",
+ "value": 111.25900364915633
+ },
+ {
+ "date": "2020-02-14",
+ "value": 110.20260700058732
+ },
+ {
+ "date": "2020-02-17",
+ "value": 111.01462783557128
+ },
+ {
+ "date": "2020-02-18",
+ "value": 111.11533321566574
+ },
+ {
+ "date": "2020-02-19",
+ "value": 111.01682639595774
+ },
+ {
+ "date": "2020-02-20",
+ "value": 109.69837253168812
+ },
+ {
+ "date": "2020-02-21",
+ "value": 110.24692985358509
+ },
+ {
+ "date": "2020-02-24",
+ "value": 112.08222160559293
+ },
+ {
+ "date": "2020-02-25",
+ "value": 111.17319245651824
+ },
+ {
+ "date": "2020-02-26",
+ "value": 110.69013060522236
+ },
+ {
+ "date": "2020-02-27",
+ "value": 112.25507242161761
+ },
+ {
+ "date": "2020-02-28",
+ "value": 112.6830799751081
+ },
+ {
+ "date": "2020-03-02",
+ "value": 113.71581643219085
+ },
+ {
+ "date": "2020-03-03",
+ "value": 113.17854572744545
+ },
+ {
+ "date": "2020-03-04",
+ "value": 113.75921983444772
+ },
+ {
+ "date": "2020-03-05",
+ "value": 113.32026252181355
+ },
+ {
+ "date": "2020-03-06",
+ "value": 112.03211147356515
+ },
+ {
+ "date": "2020-03-09",
+ "value": 112.82006669016774
+ },
+ {
+ "date": "2020-03-10",
+ "value": 112.84437806321476
+ },
+ {
+ "date": "2020-03-11",
+ "value": 114.30747876982505
+ },
+ {
+ "date": "2020-03-12",
+ "value": 112.56251325106797
+ },
+ {
+ "date": "2020-03-13",
+ "value": 111.96513168754036
+ },
+ {
+ "date": "2020-03-16",
+ "value": 110.63111762876252
+ },
+ {
+ "date": "2020-03-17",
+ "value": 109.54403310457893
+ },
+ {
+ "date": "2020-03-18",
+ "value": 109.75025608523028
+ },
+ {
+ "date": "2020-03-19",
+ "value": 110.42078550355777
+ },
+ {
+ "date": "2020-03-20",
+ "value": 108.48747422991907
+ },
+ {
+ "date": "2020-03-23",
+ "value": 106.84231787763778
+ },
+ {
+ "date": "2020-03-24",
+ "value": 108.05769872428064
+ },
+ {
+ "date": "2020-03-25",
+ "value": 108.46490121066374
+ },
+ {
+ "date": "2020-03-26",
+ "value": 109.01358029275761
+ },
+ {
+ "date": "2020-03-27",
+ "value": 108.31182966919212
+ },
+ {
+ "date": "2020-03-30",
+ "value": 109.34711795756972
+ },
+ {
+ "date": "2020-03-31",
+ "value": 109.91873287828615
+ },
+ {
+ "date": "2020-04-01",
+ "value": 108.76841353136577
+ },
+ {
+ "date": "2020-04-02",
+ "value": 108.56142029421156
+ },
+ {
+ "date": "2020-04-03",
+ "value": 108.57503373916619
+ },
+ {
+ "date": "2020-04-06",
+ "value": 109.11968623888735
+ },
+ {
+ "date": "2020-04-07",
+ "value": 109.89103052547156
+ },
+ {
+ "date": "2020-04-08",
+ "value": 111.59658406702775
+ },
+ {
+ "date": "2020-04-09",
+ "value": 111.40140859701464
+ },
+ {
+ "date": "2020-04-10",
+ "value": 110.00520614997991
+ },
+ {
+ "date": "2020-04-13",
+ "value": 108.25535297673422
+ },
+ {
+ "date": "2020-04-14",
+ "value": 106.56435545963771
+ },
+ {
+ "date": "2020-04-15",
+ "value": 106.10140494625668
+ },
+ {
+ "date": "2020-04-16",
+ "value": 106.1382004292148
+ },
+ {
+ "date": "2020-04-17",
+ "value": 105.53688799930704
+ },
+ {
+ "date": "2020-04-20",
+ "value": 107.03010116809916
+ },
+ {
+ "date": "2020-04-21",
+ "value": 106.37434182181832
+ },
+ {
+ "date": "2020-04-22",
+ "value": 105.11696511574607
+ },
+ {
+ "date": "2020-04-23",
+ "value": 106.79048037738696
+ },
+ {
+ "date": "2020-04-24",
+ "value": 107.79455229295299
+ },
+ {
+ "date": "2020-04-27",
+ "value": 108.41826089371769
+ },
+ {
+ "date": "2020-04-28",
+ "value": 108.41840213894028
+ },
+ {
+ "date": "2020-04-29",
+ "value": 107.68236006496588
+ },
+ {
+ "date": "2020-04-30",
+ "value": 108.00999183706253
+ },
+ {
+ "date": "2020-05-01",
+ "value": 109.15652176507885
+ },
+ {
+ "date": "2020-05-04",
+ "value": 108.85838951632515
+ },
+ {
+ "date": "2020-05-05",
+ "value": 107.70801695379939
+ },
+ {
+ "date": "2020-05-06",
+ "value": 107.5502371683424
+ },
+ {
+ "date": "2020-05-07",
+ "value": 107.69816892268304
+ },
+ {
+ "date": "2020-05-08",
+ "value": 108.57083826155684
+ },
+ {
+ "date": "2020-05-11",
+ "value": 109.06191573293904
+ },
+ {
+ "date": "2020-05-12",
+ "value": 109.62083517308925
+ },
+ {
+ "date": "2020-05-13",
+ "value": 109.26100654215402
+ },
+ {
+ "date": "2020-05-14",
+ "value": 109.34413929791722
+ },
+ {
+ "date": "2020-05-15",
+ "value": 111.08865718202084
+ },
+ {
+ "date": "2020-05-18",
+ "value": 111.90238322093597
+ },
+ {
+ "date": "2020-05-19",
+ "value": 109.94784560683959
+ },
+ {
+ "date": "2020-05-20",
+ "value": 110.44254338306736
+ },
+ {
+ "date": "2020-05-21",
+ "value": 110.39880823549504
+ },
+ {
+ "date": "2020-05-22",
+ "value": 110.99789507737019
+ },
+ {
+ "date": "2020-05-25",
+ "value": 111.47255781126826
+ },
+ {
+ "date": "2020-05-26",
+ "value": 112.48426532617538
+ },
+ {
+ "date": "2020-05-27",
+ "value": 112.89891169119555
+ },
+ {
+ "date": "2020-05-28",
+ "value": 111.68972646654223
+ },
+ {
+ "date": "2020-05-29",
+ "value": 112.27706364375562
+ },
+ {
+ "date": "2020-06-01",
+ "value": 111.7866990229521
+ },
+ {
+ "date": "2020-06-02",
+ "value": 112.16856155708766
+ },
+ {
+ "date": "2020-06-03",
+ "value": 113.0388760604244
+ },
+ {
+ "date": "2020-06-04",
+ "value": 114.15970321786271
+ },
+ {
+ "date": "2020-06-05",
+ "value": 114.37176554199432
+ },
+ {
+ "date": "2020-06-08",
+ "value": 113.18850716893176
+ },
+ {
+ "date": "2020-06-09",
+ "value": 114.59879342622527
+ },
+ {
+ "date": "2020-06-10",
+ "value": 114.76767954947526
+ },
+ {
+ "date": "2020-06-11",
+ "value": 115.86569808386041
+ },
+ {
+ "date": "2020-06-12",
+ "value": 115.89729328497046
+ },
+ {
+ "date": "2020-06-15",
+ "value": 117.59517612992418
+ },
+ {
+ "date": "2020-06-16",
+ "value": 118.04217570022453
+ },
+ {
+ "date": "2020-06-17",
+ "value": 116.03202007034066
+ },
+ {
+ "date": "2020-06-18",
+ "value": 116.08806278730988
+ },
+ {
+ "date": "2020-06-19",
+ "value": 113.58402678744588
+ },
+ {
+ "date": "2020-06-22",
+ "value": 112.27825027079915
+ },
+ {
+ "date": "2020-06-23",
+ "value": 113.34110288672068
+ },
+ {
+ "date": "2020-06-24",
+ "value": 113.2858213194299
+ },
+ {
+ "date": "2020-06-25",
+ "value": 113.79491938324426
+ },
+ {
+ "date": "2020-06-26",
+ "value": 115.74635558178987
+ },
+ {
+ "date": "2020-06-29",
+ "value": 114.23567729250816
+ },
+ {
+ "date": "2020-06-30",
+ "value": 112.44821338065843
+ },
+ {
+ "date": "2020-07-01",
+ "value": 113.96065677583198
+ },
+ {
+ "date": "2020-07-02",
+ "value": 113.96292312659098
+ },
+ {
+ "date": "2020-07-03",
+ "value": 113.71070764449343
+ },
+ {
+ "date": "2020-07-06",
+ "value": 112.96103095682206
+ },
+ {
+ "date": "2020-07-07",
+ "value": 113.27644568205466
+ },
+ {
+ "date": "2020-07-08",
+ "value": 114.07374151560322
+ },
+ {
+ "date": "2020-07-09",
+ "value": 112.48671624045785
+ },
+ {
+ "date": "2020-07-10",
+ "value": 112.55428791936357
+ },
+ {
+ "date": "2020-07-13",
+ "value": 111.77529535945338
+ },
+ {
+ "date": "2020-07-14",
+ "value": 112.27870722155203
+ },
+ {
+ "date": "2020-07-15",
+ "value": 112.9984045711358
+ },
+ {
+ "date": "2020-07-16",
+ "value": 114.71358509938608
+ },
+ {
+ "date": "2020-07-17",
+ "value": 113.56059064372768
+ },
+ {
+ "date": "2020-07-20",
+ "value": 114.13232522188697
+ },
+ {
+ "date": "2020-07-21",
+ "value": 115.71009481869916
+ },
+ {
+ "date": "2020-07-22",
+ "value": 116.804352031123
+ },
+ {
+ "date": "2020-07-23",
+ "value": 116.51365896277713
+ },
+ {
+ "date": "2020-07-24",
+ "value": 115.02784440326543
+ },
+ {
+ "date": "2020-07-27",
+ "value": 113.89225350594961
+ },
+ {
+ "date": "2020-07-28",
+ "value": 112.37720825737492
+ },
+ {
+ "date": "2020-07-29",
+ "value": 112.02290401081866
+ },
+ {
+ "date": "2020-07-30",
+ "value": 110.80100341698481
+ },
+ {
+ "date": "2020-07-31",
+ "value": 112.37799166697957
+ },
+ {
+ "date": "2020-08-03",
+ "value": 110.79700612990432
+ },
+ {
+ "date": "2020-08-04",
+ "value": 110.32943351523271
+ },
+ {
+ "date": "2020-08-05",
+ "value": 108.47298813427295
+ },
+ {
+ "date": "2020-08-06",
+ "value": 106.87288257116631
+ },
+ {
+ "date": "2020-08-07",
+ "value": 105.80768676021788
+ },
+ {
+ "date": "2020-08-10",
+ "value": 107.26980473042657
+ },
+ {
+ "date": "2020-08-11",
+ "value": 108.6290147336622
+ },
+ {
+ "date": "2020-08-12",
+ "value": 109.22536254559019
+ },
+ {
+ "date": "2020-08-13",
+ "value": 107.15057429112711
+ },
+ {
+ "date": "2020-08-14",
+ "value": 107.90368395258356
+ },
+ {
+ "date": "2020-08-17",
+ "value": 108.0922801390854
+ },
+ {
+ "date": "2020-08-18",
+ "value": 107.68719787690982
+ },
+ {
+ "date": "2020-08-19",
+ "value": 106.25467057437086
+ },
+ {
+ "date": "2020-08-20",
+ "value": 106.14640769426633
+ },
+ {
+ "date": "2020-08-21",
+ "value": 107.68973168415422
+ },
+ {
+ "date": "2020-08-24",
+ "value": 107.83871573152605
+ },
+ {
+ "date": "2020-08-25",
+ "value": 108.1372426661455
+ },
+ {
+ "date": "2020-08-26",
+ "value": 107.85272848931056
+ },
+ {
+ "date": "2020-08-27",
+ "value": 107.08321556475632
+ },
+ {
+ "date": "2020-08-28",
+ "value": 108.96556522485842
+ },
+ {
+ "date": "2020-08-31",
+ "value": 108.61892256633577
+ },
+ {
+ "date": "2020-09-01",
+ "value": 107.76663594988969
+ },
+ {
+ "date": "2020-09-02",
+ "value": 107.33816413653514
+ },
+ {
+ "date": "2020-09-03",
+ "value": 107.2500978350738
+ },
+ {
+ "date": "2020-09-04",
+ "value": 105.63445779545569
+ },
+ {
+ "date": "2020-09-07",
+ "value": 105.99025801348601
+ },
+ {
+ "date": "2020-09-08",
+ "value": 105.02837195723261
+ },
+ {
+ "date": "2020-09-09",
+ "value": 106.25158607586384
+ },
+ {
+ "date": "2020-09-10",
+ "value": 106.69187760302962
+ },
+ {
+ "date": "2020-09-11",
+ "value": 106.92300119068555
+ },
+ {
+ "date": "2020-09-14",
+ "value": 107.89970569289889
+ },
+ {
+ "date": "2020-09-15",
+ "value": 106.4310418905338
+ },
+ {
+ "date": "2020-09-16",
+ "value": 107.55553431367784
+ },
+ {
+ "date": "2020-09-17",
+ "value": 107.40736421503628
+ },
+ {
+ "date": "2020-09-18",
+ "value": 109.13286377498119
+ },
+ {
+ "date": "2020-09-21",
+ "value": 109.58976121935923
+ },
+ {
+ "date": "2020-09-22",
+ "value": 109.48213490988276
+ },
+ {
+ "date": "2020-09-23",
+ "value": 108.69140077652644
+ },
+ {
+ "date": "2020-09-24",
+ "value": 108.64733048570723
+ },
+ {
+ "date": "2020-09-25",
+ "value": 107.76424625279112
+ },
+ {
+ "date": "2020-09-28",
+ "value": 108.15323775811498
+ },
+ {
+ "date": "2020-09-29",
+ "value": 108.79169095474222
+ },
+ {
+ "date": "2020-09-30",
+ "value": 108.5640232627655
+ },
+ {
+ "date": "2020-10-01",
+ "value": 106.65968049332571
+ },
+ {
+ "date": "2020-10-02",
+ "value": 106.78726418865061
+ },
+ {
+ "date": "2020-10-05",
+ "value": 106.55264508528558
+ },
+ {
+ "date": "2020-10-06",
+ "value": 107.45425766625118
+ },
+ {
+ "date": "2020-10-07",
+ "value": 108.54744656821792
+ },
+ {
+ "date": "2020-10-08",
+ "value": 108.42946475228617
+ },
+ {
+ "date": "2020-10-09",
+ "value": 109.40287009911592
+ },
+ {
+ "date": "2020-10-12",
+ "value": 110.60492422629999
+ },
+ {
+ "date": "2020-10-13",
+ "value": 109.9937902998957
+ },
+ {
+ "date": "2020-10-14",
+ "value": 108.10275983174138
+ },
+ {
+ "date": "2020-10-15",
+ "value": 106.94811431862108
+ },
+ {
+ "date": "2020-10-16",
+ "value": 106.48783317670407
+ },
+ {
+ "date": "2020-10-19",
+ "value": 105.04515595316427
+ },
+ {
+ "date": "2020-10-20",
+ "value": 104.27426996826011
+ },
+ {
+ "date": "2020-10-21",
+ "value": 103.16512654106967
+ },
+ {
+ "date": "2020-10-22",
+ "value": 105.48721153249204
+ },
+ {
+ "date": "2020-10-23",
+ "value": 106.23925374839332
+ },
+ {
+ "date": "2020-10-26",
+ "value": 104.65590699770867
+ },
+ {
+ "date": "2020-10-27",
+ "value": 103.8161021393682
+ },
+ {
+ "date": "2020-10-28",
+ "value": 103.28060517572901
+ },
+ {
+ "date": "2020-10-29",
+ "value": 101.88105037672126
+ },
+ {
+ "date": "2020-10-30",
+ "value": 102.62115862628733
+ },
+ {
+ "date": "2020-11-02",
+ "value": 102.34520240915302
+ },
+ {
+ "date": "2020-11-03",
+ "value": 102.72819927329266
+ },
+ {
+ "date": "2020-11-04",
+ "value": 101.54044992831739
+ },
+ {
+ "date": "2020-11-05",
+ "value": 103.9453993559438
+ },
+ {
+ "date": "2020-11-06",
+ "value": 104.02596423417285
+ },
+ {
+ "date": "2020-11-09",
+ "value": 102.57520262498666
+ },
+ {
+ "date": "2020-11-10",
+ "value": 101.53317677624645
+ },
+ {
+ "date": "2020-11-11",
+ "value": 101.49004441566407
+ },
+ {
+ "date": "2020-11-12",
+ "value": 102.6739927632276
+ },
+ {
+ "date": "2020-11-13",
+ "value": 102.26528249035867
+ },
+ {
+ "date": "2020-11-16",
+ "value": 103.37469608518064
+ },
+ {
+ "date": "2020-11-17",
+ "value": 104.42056733397412
+ },
+ {
+ "date": "2020-11-18",
+ "value": 105.65830189878898
+ },
+ {
+ "date": "2020-11-19",
+ "value": 106.4827912150845
+ },
+ {
+ "date": "2020-11-20",
+ "value": 106.89018392144578
+ },
+ {
+ "date": "2020-11-23",
+ "value": 106.63316107419844
+ },
+ {
+ "date": "2020-11-24",
+ "value": 105.6136217894413
+ },
+ {
+ "date": "2020-11-25",
+ "value": 105.78465797634861
+ },
+ {
+ "date": "2020-11-26",
+ "value": 105.5478724728399
+ },
+ {
+ "date": "2020-11-27",
+ "value": 105.86670997178011
+ },
+ {
+ "date": "2020-11-30",
+ "value": 107.0163959295204
+ },
+ {
+ "date": "2020-12-01",
+ "value": 109.8329592296616
+ },
+ {
+ "date": "2020-12-02",
+ "value": 109.83359683892893
+ },
+ {
+ "date": "2020-12-03",
+ "value": 107.1155579904278
+ },
+ {
+ "date": "2020-12-04",
+ "value": 108.48422988142562
+ },
+ {
+ "date": "2020-12-07",
+ "value": 108.82721158840572
+ },
+ {
+ "date": "2020-12-08",
+ "value": 109.33777754589042
+ },
+ {
+ "date": "2020-12-09",
+ "value": 108.80747594544889
+ },
+ {
+ "date": "2020-12-10",
+ "value": 108.89641628469397
+ },
+ {
+ "date": "2020-12-11",
+ "value": 109.77802113807068
+ },
+ {
+ "date": "2020-12-14",
+ "value": 111.6540093895013
+ },
+ {
+ "date": "2020-12-15",
+ "value": 113.88671894077221
+ },
+ {
+ "date": "2020-12-16",
+ "value": 113.0211355366511
+ },
+ {
+ "date": "2020-12-17",
+ "value": 113.27605567708315
+ },
+ {
+ "date": "2020-12-18",
+ "value": 112.62755385995702
+ },
+ {
+ "date": "2020-12-21",
+ "value": 113.25566180441369
+ },
+ {
+ "date": "2020-12-22",
+ "value": 112.01950453825579
+ },
+ {
+ "date": "2020-12-23",
+ "value": 111.11786292141512
+ },
+ {
+ "date": "2020-12-24",
+ "value": 110.87161307907016
+ },
+ {
+ "date": "2020-12-25",
+ "value": 111.92844289248936
+ },
+ {
+ "date": "2020-12-28",
+ "value": 112.65211015384175
+ },
+ {
+ "date": "2020-12-29",
+ "value": 112.02155153371172
+ },
+ {
+ "date": "2020-12-30",
+ "value": 110.4021173355066
+ },
+ {
+ "date": "2020-12-31",
+ "value": 110.24875534577065
+ },
+ {
+ "date": "2021-01-01",
+ "value": 111.55698291741388
+ },
+ {
+ "date": "2021-01-04",
+ "value": 112.11099827578752
+ },
+ {
+ "date": "2021-01-05",
+ "value": 112.21469304019647
+ },
+ {
+ "date": "2021-01-06",
+ "value": 111.7089899696558
+ },
+ {
+ "date": "2021-01-07",
+ "value": 111.05589152453298
+ },
+ {
+ "date": "2021-01-08",
+ "value": 112.99107782406708
+ },
+ {
+ "date": "2021-01-11",
+ "value": 113.14432628579534
+ },
+ {
+ "date": "2021-01-12",
+ "value": 113.09121999544746
+ },
+ {
+ "date": "2021-01-13",
+ "value": 112.18628530919763
+ },
+ {
+ "date": "2021-01-14",
+ "value": 112.65873434136309
+ },
+ {
+ "date": "2021-01-15",
+ "value": 111.32218645231897
+ },
+ {
+ "date": "2021-01-18",
+ "value": 111.95270189607022
+ },
+ {
+ "date": "2021-01-19",
+ "value": 109.83892472640349
+ },
+ {
+ "date": "2021-01-20",
+ "value": 109.92757000218975
+ },
+ {
+ "date": "2021-01-21",
+ "value": 109.90657221503866
+ },
+ {
+ "date": "2021-01-22",
+ "value": 112.7175076942548
+ },
+ {
+ "date": "2021-01-25",
+ "value": 112.47899829050142
+ },
+ {
+ "date": "2021-01-26",
+ "value": 111.1730463265318
+ },
+ {
+ "date": "2021-01-27",
+ "value": 110.69078482044053
+ },
+ {
+ "date": "2021-01-28",
+ "value": 111.740333662976
+ },
+ {
+ "date": "2021-01-29",
+ "value": 112.25686492310084
+ },
+ {
+ "date": "2021-02-01",
+ "value": 112.97290434996975
+ },
+ {
+ "date": "2021-02-02",
+ "value": 112.19891035467566
+ },
+ {
+ "date": "2021-02-03",
+ "value": 112.20408583357356
+ },
+ {
+ "date": "2021-02-04",
+ "value": 113.05418914805038
+ },
+ {
+ "date": "2021-02-05",
+ "value": 115.31147396065242
+ },
+ {
+ "date": "2021-02-08",
+ "value": 117.14261041505097
+ },
+ {
+ "date": "2021-02-09",
+ "value": 118.75073387494835
+ },
+ {
+ "date": "2021-02-10",
+ "value": 119.97059520929973
+ },
+ {
+ "date": "2021-02-11",
+ "value": 119.33598531518169
+ },
+ {
+ "date": "2021-02-12",
+ "value": 119.33842238791192
+ },
+ {
+ "date": "2021-02-15",
+ "value": 119.80899498362048
+ },
+ {
+ "date": "2021-02-16",
+ "value": 120.21291198772232
+ },
+ {
+ "date": "2021-02-17",
+ "value": 119.24137001820353
+ },
+ {
+ "date": "2021-02-18",
+ "value": 117.71221954914728
+ },
+ {
+ "date": "2021-02-19",
+ "value": 117.06056274928764
+ },
+ {
+ "date": "2021-02-22",
+ "value": 115.34310483477738
+ },
+ {
+ "date": "2021-02-23",
+ "value": 117.58465250237354
+ },
+ {
+ "date": "2021-02-24",
+ "value": 116.83625647253942
+ },
+ {
+ "date": "2021-02-25",
+ "value": 116.31422686898986
+ },
+ {
+ "date": "2021-02-26",
+ "value": 115.99985398705333
+ },
+ {
+ "date": "2021-03-01",
+ "value": 116.39283322440295
+ },
+ {
+ "date": "2021-03-02",
+ "value": 116.14198011825607
+ },
+ {
+ "date": "2021-03-03",
+ "value": 114.89445660946463
+ },
+ {
+ "date": "2021-03-04",
+ "value": 113.91032422291222
+ },
+ {
+ "date": "2021-03-05",
+ "value": 114.47291435059232
+ },
+ {
+ "date": "2021-03-08",
+ "value": 115.04257789701055
+ },
+ {
+ "date": "2021-03-09",
+ "value": 115.28665481083875
+ },
+ {
+ "date": "2021-03-10",
+ "value": 114.00941870659521
+ },
+ {
+ "date": "2021-03-11",
+ "value": 114.00049971766694
+ },
+ {
+ "date": "2021-03-12",
+ "value": 113.1633388548541
+ },
+ {
+ "date": "2021-03-15",
+ "value": 113.64283037975981
+ },
+ {
+ "date": "2021-03-16",
+ "value": 114.00045494178141
+ },
+ {
+ "date": "2021-03-17",
+ "value": 114.17709906044958
+ },
+ {
+ "date": "2021-03-18",
+ "value": 113.4310215155243
+ },
+ {
+ "date": "2021-03-19",
+ "value": 113.62486997778254
+ },
+ {
+ "date": "2021-03-22",
+ "value": 112.45477166883045
+ },
+ {
+ "date": "2021-03-23",
+ "value": 111.38387202093759
+ },
+ {
+ "date": "2021-03-24",
+ "value": 111.0132235184502
+ },
+ {
+ "date": "2021-03-25",
+ "value": 111.00939619097393
+ },
+ {
+ "date": "2021-03-26",
+ "value": 111.81202121475272
+ },
+ {
+ "date": "2021-03-29",
+ "value": 111.62440230213564
+ },
+ {
+ "date": "2021-03-30",
+ "value": 110.37373856994205
+ },
+ {
+ "date": "2021-03-31",
+ "value": 111.94477267944393
+ },
+ {
+ "date": "2021-04-01",
+ "value": 111.67210601527873
+ },
+ {
+ "date": "2021-04-02",
+ "value": 112.61305079961348
+ },
+ {
+ "date": "2021-04-05",
+ "value": 112.66894897310175
+ },
+ {
+ "date": "2021-04-06",
+ "value": 111.24071042608527
+ },
+ {
+ "date": "2021-04-07",
+ "value": 112.56370264476224
+ },
+ {
+ "date": "2021-04-08",
+ "value": 114.9102624872365
+ },
+ {
+ "date": "2021-04-09",
+ "value": 114.47530130216553
+ },
+ {
+ "date": "2021-04-12",
+ "value": 114.22313517763867
+ },
+ {
+ "date": "2021-04-13",
+ "value": 116.96905436533177
+ },
+ {
+ "date": "2021-04-14",
+ "value": 116.36930975670481
+ },
+ {
+ "date": "2021-04-15",
+ "value": 114.7788158849487
+ },
+ {
+ "date": "2021-04-16",
+ "value": 112.45210019758264
+ },
+ {
+ "date": "2021-04-19",
+ "value": 112.82910498254856
+ },
+ {
+ "date": "2021-04-20",
+ "value": 113.59976131561828
+ },
+ {
+ "date": "2021-04-21",
+ "value": 113.48246758229968
+ },
+ {
+ "date": "2021-04-22",
+ "value": 111.84582185307184
+ },
+ {
+ "date": "2021-04-23",
+ "value": 110.09964883420619
+ },
+ {
+ "date": "2021-04-26",
+ "value": 109.93033900994162
+ },
+ {
+ "date": "2021-04-27",
+ "value": 109.53716068636264
+ },
+ {
+ "date": "2021-04-28",
+ "value": 109.53275232320064
+ },
+ {
+ "date": "2021-04-29",
+ "value": 108.96941749564763
+ },
+ {
+ "date": "2021-04-30",
+ "value": 109.53937938382833
+ },
+ {
+ "date": "2021-05-03",
+ "value": 110.57486090892088
+ },
+ {
+ "date": "2021-05-04",
+ "value": 109.05775579404727
+ },
+ {
+ "date": "2021-05-05",
+ "value": 109.3735774681303
+ },
+ {
+ "date": "2021-05-06",
+ "value": 107.26457722946235
+ },
+ {
+ "date": "2021-05-07",
+ "value": 107.70564544645298
+ },
+ {
+ "date": "2021-05-10",
+ "value": 107.85848530733882
+ },
+ {
+ "date": "2021-05-11",
+ "value": 108.0004384143622
+ },
+ {
+ "date": "2021-05-12",
+ "value": 108.26859268200303
+ },
+ {
+ "date": "2021-05-13",
+ "value": 106.67686195523855
+ },
+ {
+ "date": "2021-05-14",
+ "value": 105.49751881500805
+ },
+ {
+ "date": "2021-05-17",
+ "value": 107.08166624731227
+ },
+ {
+ "date": "2021-05-18",
+ "value": 106.49094562639893
+ },
+ {
+ "date": "2021-05-19",
+ "value": 104.54290084618822
+ },
+ {
+ "date": "2021-05-20",
+ "value": 106.30079143497102
+ },
+ {
+ "date": "2021-05-21",
+ "value": 108.27595402944907
+ },
+ {
+ "date": "2021-05-24",
+ "value": 109.15372038326949
+ },
+ {
+ "date": "2021-05-25",
+ "value": 110.18772267492137
+ },
+ {
+ "date": "2021-05-26",
+ "value": 110.63871310810087
+ },
+ {
+ "date": "2021-05-27",
+ "value": 110.95652901010713
+ },
+ {
+ "date": "2021-05-28",
+ "value": 109.78417455749685
+ },
+ {
+ "date": "2021-05-31",
+ "value": 108.4782440028188
+ },
+ {
+ "date": "2021-06-01",
+ "value": 109.40624410672118
+ },
+ {
+ "date": "2021-06-02",
+ "value": 110.10782228572887
+ },
+ {
+ "date": "2021-06-03",
+ "value": 111.44800131707278
+ },
+ {
+ "date": "2021-06-04",
+ "value": 112.18940233327245
+ },
+ {
+ "date": "2021-06-07",
+ "value": 112.67018032544003
+ },
+ {
+ "date": "2021-06-08",
+ "value": 112.07624749951353
+ },
+ {
+ "date": "2021-06-09",
+ "value": 110.62490091235706
+ },
+ {
+ "date": "2021-06-10",
+ "value": 111.1326584689505
+ },
+ {
+ "date": "2021-06-11",
+ "value": 111.3929639453091
+ },
+ {
+ "date": "2021-06-14",
+ "value": 110.63813241414792
+ },
+ {
+ "date": "2021-06-15",
+ "value": 109.45504024178206
+ },
+ {
+ "date": "2021-06-16",
+ "value": 108.80580084222709
+ },
+ {
+ "date": "2021-06-17",
+ "value": 108.78548477915652
+ },
+ {
+ "date": "2021-06-18",
+ "value": 109.0082591146714
+ },
+ {
+ "date": "2021-06-21",
+ "value": 107.44451262611777
+ },
+ {
+ "date": "2021-06-22",
+ "value": 107.64858191727407
+ },
+ {
+ "date": "2021-06-23",
+ "value": 104.88021261302538
+ },
+ {
+ "date": "2021-06-24",
+ "value": 106.81318973244305
+ },
+ {
+ "date": "2021-06-25",
+ "value": 106.56121391325395
+ },
+ {
+ "date": "2021-06-28",
+ "value": 108.38484335568917
+ },
+ {
+ "date": "2021-06-29",
+ "value": 107.09253999454265
+ },
+ {
+ "date": "2021-06-30",
+ "value": 107.27632182135052
+ },
+ {
+ "date": "2021-07-01",
+ "value": 107.71610751775349
+ },
+ {
+ "date": "2021-07-02",
+ "value": 106.7648227126679
+ },
+ {
+ "date": "2021-07-05",
+ "value": 107.01187708537687
+ },
+ {
+ "date": "2021-07-06",
+ "value": 106.4457845493731
+ },
+ {
+ "date": "2021-07-07",
+ "value": 107.85844618640157
+ },
+ {
+ "date": "2021-07-08",
+ "value": 107.27530324149485
+ },
+ {
+ "date": "2021-07-09",
+ "value": 106.82912976329091
+ },
+ {
+ "date": "2021-07-12",
+ "value": 106.88263101324765
+ },
+ {
+ "date": "2021-07-13",
+ "value": 106.71591818796959
+ },
+ {
+ "date": "2021-07-14",
+ "value": 108.4115967590868
+ },
+ {
+ "date": "2021-07-15",
+ "value": 108.60615839870187
+ },
+ {
+ "date": "2021-07-16",
+ "value": 109.95575169695475
+ },
+ {
+ "date": "2021-07-19",
+ "value": 110.50671471613266
+ },
+ {
+ "date": "2021-07-20",
+ "value": 110.01640573244575
+ },
+ {
+ "date": "2021-07-21",
+ "value": 110.49557869952231
+ },
+ {
+ "date": "2021-07-22",
+ "value": 109.71950117970239
+ },
+ {
+ "date": "2021-07-23",
+ "value": 110.00205171450695
+ },
+ {
+ "date": "2021-07-26",
+ "value": 110.97913201018153
+ },
+ {
+ "date": "2021-07-27",
+ "value": 111.77530137649045
+ },
+ {
+ "date": "2021-07-28",
+ "value": 111.87950302732173
+ },
+ {
+ "date": "2021-07-29",
+ "value": 116.55162934947975
+ },
+ {
+ "date": "2021-07-30",
+ "value": 117.45334500784858
+ },
+ {
+ "date": "2021-08-02",
+ "value": 117.05227423597174
+ },
+ {
+ "date": "2021-08-03",
+ "value": 117.85539494177848
+ },
+ {
+ "date": "2021-08-04",
+ "value": 120.11996716942733
+ },
+ {
+ "date": "2021-08-05",
+ "value": 119.27084225050906
+ },
+ {
+ "date": "2021-08-06",
+ "value": 120.93990434254371
+ },
+ {
+ "date": "2021-08-09",
+ "value": 123.37713689565653
+ },
+ {
+ "date": "2021-08-10",
+ "value": 124.42964398526402
+ },
+ {
+ "date": "2021-08-11",
+ "value": 124.41172371189502
+ },
+ {
+ "date": "2021-08-12",
+ "value": 127.13257134687157
+ },
+ {
+ "date": "2021-08-13",
+ "value": 128.7958670441943
+ },
+ {
+ "date": "2021-08-16",
+ "value": 129.243561902145
+ },
+ {
+ "date": "2021-08-17",
+ "value": 130.314568048835
+ },
+ {
+ "date": "2021-08-18",
+ "value": 130.30692717835814
+ },
+ {
+ "date": "2021-08-19",
+ "value": 130.69018505906976
+ },
+ {
+ "date": "2021-08-20",
+ "value": 132.78453105863207
+ },
+ {
+ "date": "2021-08-23",
+ "value": 133.53440858527335
+ },
+ {
+ "date": "2021-08-24",
+ "value": 131.34975210977385
+ },
+ {
+ "date": "2021-08-25",
+ "value": 131.1176931888569
+ },
+ {
+ "date": "2021-08-26",
+ "value": 130.17493206600352
+ },
+ {
+ "date": "2021-08-27",
+ "value": 130.89519170439863
+ },
+ {
+ "date": "2021-08-30",
+ "value": 131.42630872248228
+ },
+ {
+ "date": "2021-08-31",
+ "value": 131.56771000848107
+ },
+ {
+ "date": "2021-09-01",
+ "value": 130.9179764122107
+ },
+ {
+ "date": "2021-09-02",
+ "value": 129.8517846795634
+ },
+ {
+ "date": "2021-09-03",
+ "value": 130.4460434881794
+ },
+ {
+ "date": "2021-09-06",
+ "value": 129.0320080994763
+ },
+ {
+ "date": "2021-09-07",
+ "value": 130.5589204649636
+ },
+ {
+ "date": "2021-09-08",
+ "value": 130.71681292042388
+ },
+ {
+ "date": "2021-09-09",
+ "value": 130.27376241393816
+ },
+ {
+ "date": "2021-09-10",
+ "value": 129.2423075454972
+ },
+ {
+ "date": "2021-09-13",
+ "value": 128.18654187246847
+ },
+ {
+ "date": "2021-09-14",
+ "value": 127.10758756715033
+ },
+ {
+ "date": "2021-09-15",
+ "value": 127.46654824869688
+ },
+ {
+ "date": "2021-09-16",
+ "value": 126.7916655857689
+ },
+ {
+ "date": "2021-09-17",
+ "value": 129.39058635411632
+ },
+ {
+ "date": "2021-09-20",
+ "value": 128.23769787400946
+ },
+ {
+ "date": "2021-09-21",
+ "value": 129.7395113249166
+ },
+ {
+ "date": "2021-09-22",
+ "value": 129.6042088263965
+ },
+ {
+ "date": "2021-09-23",
+ "value": 127.65433652783338
+ },
+ {
+ "date": "2021-09-24",
+ "value": 128.47536500112628
+ },
+ {
+ "date": "2021-09-27",
+ "value": 128.74445511020804
+ },
+ {
+ "date": "2021-09-28",
+ "value": 129.9904741028447
+ },
+ {
+ "date": "2021-09-29",
+ "value": 131.21267279154895
+ },
+ {
+ "date": "2021-09-30",
+ "value": 133.2122868513819
+ },
+ {
+ "date": "2021-10-01",
+ "value": 133.2518055229709
+ },
+ {
+ "date": "2021-10-04",
+ "value": 133.9212964012735
+ },
+ {
+ "date": "2021-10-05",
+ "value": 133.98650520346098
+ },
+ {
+ "date": "2021-10-06",
+ "value": 135.3928927365497
+ },
+ {
+ "date": "2021-10-07",
+ "value": 138.27886923527132
+ },
+ {
+ "date": "2021-10-08",
+ "value": 137.73371581342596
+ },
+ {
+ "date": "2021-10-11",
+ "value": 137.88175215634504
+ },
+ {
+ "date": "2021-10-12",
+ "value": 139.72305688531213
+ },
+ {
+ "date": "2021-10-13",
+ "value": 139.3376575539446
+ },
+ {
+ "date": "2021-10-14",
+ "value": 139.66745930332883
+ },
+ {
+ "date": "2021-10-15",
+ "value": 140.64236799369547
+ },
+ {
+ "date": "2021-10-18",
+ "value": 142.86308490060298
+ },
+ {
+ "date": "2021-10-19",
+ "value": 144.8225709650348
+ },
+ {
+ "date": "2021-10-20",
+ "value": 146.19698759289906
+ },
+ {
+ "date": "2021-10-21",
+ "value": 148.73051182297706
+ },
+ {
+ "date": "2021-10-22",
+ "value": 147.13370997805652
+ },
+ {
+ "date": "2021-10-25",
+ "value": 145.31995815652186
+ },
+ {
+ "date": "2021-10-26",
+ "value": 143.70572750971567
+ },
+ {
+ "date": "2021-10-27",
+ "value": 144.2904217850907
+ },
+ {
+ "date": "2021-10-28",
+ "value": 143.5624971194626
+ },
+ {
+ "date": "2021-10-29",
+ "value": 141.48939660309537
+ },
+ {
+ "date": "2021-11-01",
+ "value": 141.8292760761498
+ },
+ {
+ "date": "2021-11-02",
+ "value": 140.26657284870538
+ },
+ {
+ "date": "2021-11-03",
+ "value": 139.0405577830699
+ },
+ {
+ "date": "2021-11-04",
+ "value": 137.83263139000687
+ },
+ {
+ "date": "2021-11-05",
+ "value": 136.68074053796536
+ },
+ {
+ "date": "2021-11-08",
+ "value": 134.67820244424445
+ },
+ {
+ "date": "2021-11-09",
+ "value": 136.01997470082424
+ },
+ {
+ "date": "2021-11-10",
+ "value": 136.03168164983353
+ },
+ {
+ "date": "2021-11-11",
+ "value": 134.3072934602167
+ },
+ {
+ "date": "2021-11-12",
+ "value": 136.33708527853153
+ },
+ {
+ "date": "2021-11-15",
+ "value": 137.67165339614854
+ },
+ {
+ "date": "2021-11-16",
+ "value": 138.1011740610324
+ },
+ {
+ "date": "2021-11-17",
+ "value": 140.0821501246444
+ },
+ {
+ "date": "2021-11-18",
+ "value": 140.01946008570454
+ },
+ {
+ "date": "2021-11-19",
+ "value": 138.6686656126261
+ },
+ {
+ "date": "2021-11-22",
+ "value": 139.12977261948808
+ },
+ {
+ "date": "2021-11-23",
+ "value": 138.65862565170715
+ },
+ {
+ "date": "2021-11-24",
+ "value": 137.34777714352714
+ },
+ {
+ "date": "2021-11-25",
+ "value": 137.6827265476837
+ },
+ {
+ "date": "2021-11-26",
+ "value": 138.8374887884231
+ },
+ {
+ "date": "2021-11-29",
+ "value": 140.07625230856448
+ },
+ {
+ "date": "2021-11-30",
+ "value": 141.64885879424276
+ },
+ {
+ "date": "2021-12-01",
+ "value": 140.13392774336606
+ },
+ {
+ "date": "2021-12-02",
+ "value": 142.14247390644599
+ },
+ {
+ "date": "2021-12-03",
+ "value": 142.12049041900332
+ },
+ {
+ "date": "2021-12-06",
+ "value": 143.5022856757484
+ },
+ {
+ "date": "2021-12-07",
+ "value": 144.44429583647965
+ },
+ {
+ "date": "2021-12-08",
+ "value": 143.77029514207365
+ },
+ {
+ "date": "2021-12-09",
+ "value": 143.2690102167239
+ },
+ {
+ "date": "2021-12-10",
+ "value": 145.06866566838747
+ },
+ {
+ "date": "2021-12-13",
+ "value": 146.62988025591144
+ },
+ {
+ "date": "2021-12-14",
+ "value": 147.95991285009094
+ },
+ {
+ "date": "2021-12-15",
+ "value": 149.74143520031055
+ },
+ {
+ "date": "2021-12-16",
+ "value": 151.08858499668625
+ },
+ {
+ "date": "2021-12-17",
+ "value": 150.4270874570294
+ },
+ {
+ "date": "2021-12-20",
+ "value": 151.34835155582863
+ },
+ {
+ "date": "2021-12-21",
+ "value": 151.81428959866443
+ },
+ {
+ "date": "2021-12-22",
+ "value": 153.7786716261007
+ },
+ {
+ "date": "2021-12-23",
+ "value": 153.65163790076963
+ },
+ {
+ "date": "2021-12-24",
+ "value": 154.75245304237853
+ },
+ {
+ "date": "2021-12-27",
+ "value": 154.9515474491684
+ },
+ {
+ "date": "2021-12-28",
+ "value": 159.8549170922545
+ },
+ {
+ "date": "2021-12-29",
+ "value": 159.2007464469846
+ },
+ {
+ "date": "2021-12-30",
+ "value": 161.1200899155655
+ },
+ {
+ "date": "2021-12-31",
+ "value": 158.99211792655052
+ },
+ {
+ "date": "2022-01-03",
+ "value": 158.81592136987916
+ },
+ {
+ "date": "2022-01-04",
+ "value": 158.11621191829818
+ },
+ {
+ "date": "2022-01-05",
+ "value": 156.38229707337658
+ },
+ {
+ "date": "2022-01-06",
+ "value": 158.86551424755498
+ },
+ {
+ "date": "2022-01-07",
+ "value": 160.19950727978824
+ },
+ {
+ "date": "2022-01-10",
+ "value": 157.28432062701538
+ },
+ {
+ "date": "2022-01-11",
+ "value": 159.6083284257281
+ },
+ {
+ "date": "2022-01-12",
+ "value": 159.59819939777105
+ },
+ {
+ "date": "2022-01-13",
+ "value": 159.3746738378807
+ },
+ {
+ "date": "2022-01-14",
+ "value": 160.64615632074114
+ },
+ {
+ "date": "2022-01-17",
+ "value": 161.37935328011739
+ },
+ {
+ "date": "2022-01-18",
+ "value": 165.31151685621435
+ },
+ {
+ "date": "2022-01-19",
+ "value": 165.84965437995552
+ },
+ {
+ "date": "2022-01-20",
+ "value": 164.14786563562015
+ },
+ {
+ "date": "2022-01-21",
+ "value": 163.3103787261028
+ },
+ {
+ "date": "2022-01-24",
+ "value": 165.2672995312545
+ },
+ {
+ "date": "2022-01-25",
+ "value": 166.35742325062137
+ },
+ {
+ "date": "2022-01-26",
+ "value": 164.99943906937028
+ },
+ {
+ "date": "2022-01-27",
+ "value": 167.83231635309664
+ },
+ {
+ "date": "2022-01-28",
+ "value": 167.84043759747897
+ },
+ {
+ "date": "2022-01-31",
+ "value": 169.2909919904233
+ },
+ {
+ "date": "2022-02-01",
+ "value": 173.0362612303292
+ },
+ {
+ "date": "2022-02-02",
+ "value": 174.32071958423472
+ },
+ {
+ "date": "2022-02-03",
+ "value": 173.34117863355226
+ },
+ {
+ "date": "2022-02-04",
+ "value": 173.85056826633138
+ },
+ {
+ "date": "2022-02-07",
+ "value": 173.96180569473188
+ },
+ {
+ "date": "2022-02-08",
+ "value": 175.94626257551414
+ },
+ {
+ "date": "2022-02-09",
+ "value": 175.72751051112118
+ },
+ {
+ "date": "2022-02-10",
+ "value": 177.72156459252196
+ },
+ {
+ "date": "2022-02-11",
+ "value": 179.48912531096113
+ },
+ {
+ "date": "2022-02-14",
+ "value": 182.45011698381361
+ },
+ {
+ "date": "2022-02-15",
+ "value": 184.10263294573227
+ },
+ {
+ "date": "2022-02-16",
+ "value": 182.06835610781187
+ },
+ {
+ "date": "2022-02-17",
+ "value": 182.9754413201202
+ },
+ {
+ "date": "2022-02-18",
+ "value": 184.00837886978516
+ },
+ {
+ "date": "2022-02-21",
+ "value": 181.95737477122867
+ },
+ {
+ "date": "2022-02-22",
+ "value": 183.43003274749267
+ },
+ {
+ "date": "2022-02-23",
+ "value": 184.63504273348735
+ },
+ {
+ "date": "2022-02-24",
+ "value": 186.76242773214312
+ },
+ {
+ "date": "2022-02-25",
+ "value": 187.15916674670675
+ },
+ {
+ "date": "2022-02-28",
+ "value": 186.8080005755995
+ },
+ {
+ "date": "2022-03-01",
+ "value": 185.39214669477138
+ },
+ {
+ "date": "2022-03-02",
+ "value": 185.31917197236584
+ },
+ {
+ "date": "2022-03-03",
+ "value": 188.08622316729543
+ },
+ {
+ "date": "2022-03-04",
+ "value": 186.67033015661386
+ },
+ {
+ "date": "2022-03-07",
+ "value": 185.53705481486102
+ },
+ {
+ "date": "2022-03-08",
+ "value": 183.21144722096244
+ },
+ {
+ "date": "2022-03-09",
+ "value": 186.1417944296348
+ },
+ {
+ "date": "2022-03-10",
+ "value": 185.81301058385327
+ },
+ {
+ "date": "2022-03-11",
+ "value": 184.24074125656801
+ },
+ {
+ "date": "2022-03-14",
+ "value": 183.9229673664176
+ },
+ {
+ "date": "2022-03-15",
+ "value": 184.43616404142233
+ },
+ {
+ "date": "2022-03-16",
+ "value": 183.79739764900205
+ },
+ {
+ "date": "2022-03-17",
+ "value": 182.46987104539326
+ },
+ {
+ "date": "2022-03-18",
+ "value": 183.9489588511815
+ },
+ {
+ "date": "2022-03-21",
+ "value": 183.8845624902127
+ },
+ {
+ "date": "2022-03-22",
+ "value": 184.16310619887147
+ },
+ {
+ "date": "2022-03-23",
+ "value": 183.62958885901327
+ },
+ {
+ "date": "2022-03-24",
+ "value": 180.93198866075522
+ },
+ {
+ "date": "2022-03-25",
+ "value": 183.16221074653217
+ },
+ {
+ "date": "2022-03-28",
+ "value": 183.12814012060423
+ },
+ {
+ "date": "2022-03-29",
+ "value": 184.12756949048182
+ },
+ {
+ "date": "2022-03-30",
+ "value": 182.830284670905
+ },
+ {
+ "date": "2022-03-31",
+ "value": 181.0475648799499
+ },
+ {
+ "date": "2022-04-01",
+ "value": 179.0985721974346
+ },
+ {
+ "date": "2022-04-04",
+ "value": 179.4762445538653
+ },
+ {
+ "date": "2022-04-05",
+ "value": 182.05725458900338
+ },
+ {
+ "date": "2022-04-06",
+ "value": 183.69428514809778
+ },
+ {
+ "date": "2022-04-07",
+ "value": 185.43545976381952
+ },
+ {
+ "date": "2022-04-08",
+ "value": 186.31415821495116
+ },
+ {
+ "date": "2022-04-11",
+ "value": 186.349598977634
+ },
+ {
+ "date": "2022-04-12",
+ "value": 184.6951866057011
+ },
+ {
+ "date": "2022-04-13",
+ "value": 184.9112224580043
+ },
+ {
+ "date": "2022-04-14",
+ "value": 186.85720071514308
+ },
+ {
+ "date": "2022-04-15",
+ "value": 186.5150636274145
+ },
+ {
+ "date": "2022-04-18",
+ "value": 184.0013671688719
+ },
+ {
+ "date": "2022-04-19",
+ "value": 183.22119140891155
+ },
+ {
+ "date": "2022-04-20",
+ "value": 180.89168022941516
+ },
+ {
+ "date": "2022-04-21",
+ "value": 181.49778760000828
+ },
+ {
+ "date": "2022-04-22",
+ "value": 183.51413057252051
+ },
+ {
+ "date": "2022-04-25",
+ "value": 183.56084798874787
+ },
+ {
+ "date": "2022-04-26",
+ "value": 181.56200149904475
+ },
+ {
+ "date": "2022-04-27",
+ "value": 181.96541417158653
+ },
+ {
+ "date": "2022-04-28",
+ "value": 180.61106280843848
+ },
+ {
+ "date": "2022-04-29",
+ "value": 179.8050174260012
+ },
+ {
+ "date": "2022-05-02",
+ "value": 178.17842407204353
+ },
+ {
+ "date": "2022-05-03",
+ "value": 176.3530719056853
+ },
+ {
+ "date": "2022-05-04",
+ "value": 179.38379146454741
+ },
+ {
+ "date": "2022-05-05",
+ "value": 179.0038512692933
+ },
+ {
+ "date": "2022-05-06",
+ "value": 178.31455055897578
+ },
+ {
+ "date": "2022-05-09",
+ "value": 179.30810193029086
+ },
+ {
+ "date": "2022-05-10",
+ "value": 178.36921694847953
+ },
+ {
+ "date": "2022-05-11",
+ "value": 180.83385388040523
+ },
+ {
+ "date": "2022-05-12",
+ "value": 180.23708917299183
+ },
+ {
+ "date": "2022-05-13",
+ "value": 180.7340599928502
+ },
+ {
+ "date": "2022-05-16",
+ "value": 181.56786413326586
+ },
+ {
+ "date": "2022-05-17",
+ "value": 177.35540133164906
+ },
+ {
+ "date": "2022-05-18",
+ "value": 174.87105963479013
+ },
+ {
+ "date": "2022-05-19",
+ "value": 174.90906792094364
+ },
+ {
+ "date": "2022-05-20",
+ "value": 173.74643847462914
+ },
+ {
+ "date": "2022-05-23",
+ "value": 172.88714199626858
+ },
+ {
+ "date": "2022-05-24",
+ "value": 174.5664369991185
+ },
+ {
+ "date": "2022-05-25",
+ "value": 174.6928178065059
+ },
+ {
+ "date": "2022-05-26",
+ "value": 174.05066162384247
+ },
+ {
+ "date": "2022-05-27",
+ "value": 174.2116679325527
+ },
+ {
+ "date": "2022-05-30",
+ "value": 176.37889054283085
+ },
+ {
+ "date": "2022-05-31",
+ "value": 176.47856868570588
+ },
+ {
+ "date": "2022-06-01",
+ "value": 174.09229238082372
+ },
+ {
+ "date": "2022-06-02",
+ "value": 172.40012324155524
+ },
+ {
+ "date": "2022-06-03",
+ "value": 174.50565113850527
+ },
+ {
+ "date": "2022-06-06",
+ "value": 174.366094057243
+ },
+ {
+ "date": "2022-06-07",
+ "value": 174.49210217163363
+ },
+ {
+ "date": "2022-06-08",
+ "value": 174.90038874549148
+ },
+ {
+ "date": "2022-06-09",
+ "value": 173.9236029518884
+ },
+ {
+ "date": "2022-06-10",
+ "value": 173.05774071050277
+ },
+ {
+ "date": "2022-06-13",
+ "value": 173.09068689819102
+ },
+ {
+ "date": "2022-06-14",
+ "value": 172.07364223925927
+ },
+ {
+ "date": "2022-06-15",
+ "value": 173.784451218063
+ },
+ {
+ "date": "2022-06-16",
+ "value": 175.15653004360462
+ },
+ {
+ "date": "2022-06-17",
+ "value": 174.9698412771693
+ },
+ {
+ "date": "2022-06-20",
+ "value": 174.3686476460181
+ },
+ {
+ "date": "2022-06-21",
+ "value": 175.0226464692796
+ },
+ {
+ "date": "2022-06-22",
+ "value": 176.79215747894534
+ },
+ {
+ "date": "2022-06-23",
+ "value": 175.4311580647934
+ },
+ {
+ "date": "2022-06-24",
+ "value": 171.79995980405977
+ },
+ {
+ "date": "2022-06-27",
+ "value": 171.45915511728157
+ },
+ {
+ "date": "2022-06-28",
+ "value": 172.64690714409667
+ },
+ {
+ "date": "2022-06-29",
+ "value": 173.53854563500676
+ },
+ {
+ "date": "2022-06-30",
+ "value": 172.60981102336527
+ },
+ {
+ "date": "2022-07-01",
+ "value": 174.14763456896873
+ },
+ {
+ "date": "2022-07-04",
+ "value": 173.64910010627236
+ },
+ {
+ "date": "2022-07-05",
+ "value": 175.41015228773728
+ },
+ {
+ "date": "2022-07-06",
+ "value": 177.39399191817654
+ },
+ {
+ "date": "2022-07-07",
+ "value": 175.83519716160004
+ },
+ {
+ "date": "2022-07-08",
+ "value": 176.5996329036696
+ },
+ {
+ "date": "2022-07-11",
+ "value": 178.66313731575636
+ },
+ {
+ "date": "2022-07-12",
+ "value": 175.4721169640538
+ },
+ {
+ "date": "2022-07-13",
+ "value": 173.34529344223154
+ },
+ {
+ "date": "2022-07-14",
+ "value": 176.1434925362978
+ },
+ {
+ "date": "2022-07-15",
+ "value": 176.09295654485638
+ },
+ {
+ "date": "2022-07-18",
+ "value": 177.9578953976064
+ },
+ {
+ "date": "2022-07-19",
+ "value": 180.34166457631486
+ },
+ {
+ "date": "2022-07-20",
+ "value": 180.52263434757566
+ },
+ {
+ "date": "2022-07-21",
+ "value": 182.45894689934755
+ },
+ {
+ "date": "2022-07-22",
+ "value": 179.95826622515435
+ },
+ {
+ "date": "2022-07-25",
+ "value": 179.80881211698275
+ },
+ {
+ "date": "2022-07-26",
+ "value": 181.2910718479497
+ },
+ {
+ "date": "2022-07-27",
+ "value": 182.378695977059
+ },
+ {
+ "date": "2022-07-28",
+ "value": 180.84344329595197
+ },
+ {
+ "date": "2022-07-29",
+ "value": 179.0400365941173
+ },
+ {
+ "date": "2022-08-01",
+ "value": 182.5058884293554
+ },
+ {
+ "date": "2022-08-02",
+ "value": 184.03424724305236
+ },
+ {
+ "date": "2022-08-03",
+ "value": 183.38969089840745
+ },
+ {
+ "date": "2022-08-04",
+ "value": 182.61277134606993
+ },
+ {
+ "date": "2022-08-05",
+ "value": 179.40753996211657
+ },
+ {
+ "date": "2022-08-08",
+ "value": 180.52094189084272
+ },
+ {
+ "date": "2022-08-09",
+ "value": 179.42182098973754
+ },
+ {
+ "date": "2022-08-10",
+ "value": 177.66694936100592
+ },
+ {
+ "date": "2022-08-11",
+ "value": 175.6931955615347
+ },
+ {
+ "date": "2022-08-12",
+ "value": 177.8507455830907
+ },
+ {
+ "date": "2022-08-15",
+ "value": 184.1859121957383
+ },
+ {
+ "date": "2022-08-16",
+ "value": 183.86127363269907
+ },
+ {
+ "date": "2022-08-17",
+ "value": 185.02694195228707
+ },
+ {
+ "date": "2022-08-18",
+ "value": 185.97467354970206
+ },
+ {
+ "date": "2022-08-19",
+ "value": 183.97069473336333
+ },
+ {
+ "date": "2022-08-22",
+ "value": 183.24960740109978
+ },
+ {
+ "date": "2022-08-23",
+ "value": 184.70816477316203
+ },
+ {
+ "date": "2022-08-24",
+ "value": 183.69216485239534
+ },
+ {
+ "date": "2022-08-25",
+ "value": 183.7320791915035
+ },
+ {
+ "date": "2022-08-26",
+ "value": 183.60803023985468
+ },
+ {
+ "date": "2022-08-29",
+ "value": 183.7033854224083
+ },
+ {
+ "date": "2022-08-30",
+ "value": 184.7211364433535
+ },
+ {
+ "date": "2022-08-31",
+ "value": 184.50539162349799
+ },
+ {
+ "date": "2022-09-01",
+ "value": 184.99582132566803
+ },
+ {
+ "date": "2022-09-02",
+ "value": 184.97130992332012
+ },
+ {
+ "date": "2022-09-05",
+ "value": 187.10419154971632
+ },
+ {
+ "date": "2022-09-06",
+ "value": 189.03232079906977
+ },
+ {
+ "date": "2022-09-07",
+ "value": 190.6272160451858
+ },
+ {
+ "date": "2022-09-08",
+ "value": 188.61621773872483
+ },
+ {
+ "date": "2022-09-09",
+ "value": 189.20727342066888
+ },
+ {
+ "date": "2022-09-12",
+ "value": 188.9445968133091
+ },
+ {
+ "date": "2022-09-13",
+ "value": 190.81195875240917
+ },
+ {
+ "date": "2022-09-14",
+ "value": 193.17920295608212
+ },
+ {
+ "date": "2022-09-15",
+ "value": 192.78385659650397
+ },
+ {
+ "date": "2022-09-16",
+ "value": 194.60037529329378
+ },
+ {
+ "date": "2022-09-19",
+ "value": 192.65429456712272
+ },
+ {
+ "date": "2022-09-20",
+ "value": 192.22330222309907
+ },
+ {
+ "date": "2022-09-21",
+ "value": 192.20061513938995
+ },
+ {
+ "date": "2022-09-22",
+ "value": 193.13041030614298
+ },
+ {
+ "date": "2022-09-23",
+ "value": 188.5256509096753
+ },
+ {
+ "date": "2022-09-26",
+ "value": 188.8850606986893
+ },
+ {
+ "date": "2022-09-27",
+ "value": 187.3738802677684
+ },
+ {
+ "date": "2022-09-28",
+ "value": 186.1395354554199
+ },
+ {
+ "date": "2022-09-29",
+ "value": 186.85527763157418
+ },
+ {
+ "date": "2022-09-30",
+ "value": 189.10419957521412
+ },
+ {
+ "date": "2022-10-03",
+ "value": 191.0269793991275
+ },
+ {
+ "date": "2022-10-04",
+ "value": 189.1331492012651
+ },
+ {
+ "date": "2022-10-05",
+ "value": 191.04670158604046
+ },
+ {
+ "date": "2022-10-06",
+ "value": 190.56348417020038
+ },
+ {
+ "date": "2022-10-07",
+ "value": 189.6732851002448
+ },
+ {
+ "date": "2022-10-10",
+ "value": 191.55888078817955
+ },
+ {
+ "date": "2022-10-11",
+ "value": 190.99318748349734
+ },
+ {
+ "date": "2022-10-12",
+ "value": 193.98002901494834
+ },
+ {
+ "date": "2022-10-13",
+ "value": 194.72171657802693
+ },
+ {
+ "date": "2022-10-14",
+ "value": 195.178714086525
+ },
+ {
+ "date": "2022-10-17",
+ "value": 193.81816193113087
+ },
+ {
+ "date": "2022-10-18",
+ "value": 196.1790187955128
+ },
+ {
+ "date": "2022-10-19",
+ "value": 199.78893038035324
+ },
+ {
+ "date": "2022-10-20",
+ "value": 198.46918763798556
+ },
+ {
+ "date": "2022-10-21",
+ "value": 195.67856673311104
+ },
+ {
+ "date": "2022-10-24",
+ "value": 196.9528197515824
+ },
+ {
+ "date": "2022-10-25",
+ "value": 194.11150733864554
+ },
+ {
+ "date": "2022-10-26",
+ "value": 189.21022809575342
+ },
+ {
+ "date": "2022-10-27",
+ "value": 187.3841744467867
+ },
+ {
+ "date": "2022-10-28",
+ "value": 184.6848559238856
+ },
+ {
+ "date": "2022-10-31",
+ "value": 183.6859297254932
+ },
+ {
+ "date": "2022-11-01",
+ "value": 187.20185044905156
+ },
+ {
+ "date": "2022-11-02",
+ "value": 190.06719489595858
+ },
+ {
+ "date": "2022-11-03",
+ "value": 188.67288825335592
+ },
+ {
+ "date": "2022-11-04",
+ "value": 186.58428353745188
+ },
+ {
+ "date": "2022-11-07",
+ "value": 187.1708341682027
+ },
+ {
+ "date": "2022-11-08",
+ "value": 185.03707527418004
+ },
+ {
+ "date": "2022-11-09",
+ "value": 186.65641644148653
+ },
+ {
+ "date": "2022-11-10",
+ "value": 187.94059518931388
+ },
+ {
+ "date": "2022-11-11",
+ "value": 188.8657212111467
+ },
+ {
+ "date": "2022-11-14",
+ "value": 187.9141596525209
+ },
+ {
+ "date": "2022-11-15",
+ "value": 186.59760171883298
+ },
+ {
+ "date": "2022-11-16",
+ "value": 186.33184829862
+ },
+ {
+ "date": "2022-11-17",
+ "value": 185.20206017936923
+ },
+ {
+ "date": "2022-11-18",
+ "value": 187.10391675587033
+ },
+ {
+ "date": "2022-11-21",
+ "value": 191.38578062421303
+ },
+ {
+ "date": "2022-11-22",
+ "value": 191.98484721969515
+ },
+ {
+ "date": "2022-11-23",
+ "value": 192.8369047649446
+ },
+ {
+ "date": "2022-11-24",
+ "value": 192.7841076975567
+ },
+ {
+ "date": "2022-11-25",
+ "value": 191.82755410191814
+ },
+ {
+ "date": "2022-11-28",
+ "value": 191.3776806281394
+ },
+ {
+ "date": "2022-11-29",
+ "value": 191.90821058066808
+ },
+ {
+ "date": "2022-11-30",
+ "value": 189.43143267985812
+ },
+ {
+ "date": "2022-12-01",
+ "value": 187.67609302599112
+ },
+ {
+ "date": "2022-12-02",
+ "value": 185.08797754125206
+ },
+ {
+ "date": "2022-12-05",
+ "value": 183.61848411539103
+ },
+ {
+ "date": "2022-12-06",
+ "value": 181.91965480460536
+ },
+ {
+ "date": "2022-12-07",
+ "value": 181.15791758064142
+ },
+ {
+ "date": "2022-12-08",
+ "value": 180.9360107168567
+ },
+ {
+ "date": "2022-12-09",
+ "value": 183.44984063523944
+ },
+ {
+ "date": "2022-12-12",
+ "value": 184.22790807444798
+ },
+ {
+ "date": "2022-12-13",
+ "value": 184.68321353898867
+ },
+ {
+ "date": "2022-12-14",
+ "value": 182.6441778787343
+ },
+ {
+ "date": "2022-12-15",
+ "value": 181.41502029424456
+ },
+ {
+ "date": "2022-12-16",
+ "value": 179.35285583592298
+ },
+ {
+ "date": "2022-12-19",
+ "value": 181.49020026746882
+ },
+ {
+ "date": "2022-12-20",
+ "value": 181.01809304808353
+ },
+ {
+ "date": "2022-12-21",
+ "value": 180.90349572222635
+ },
+ {
+ "date": "2022-12-22",
+ "value": 181.0765910747008
+ },
+ {
+ "date": "2022-12-23",
+ "value": 181.28118957564126
+ },
+ {
+ "date": "2022-12-26",
+ "value": 184.07188249813314
+ },
+ {
+ "date": "2022-12-27",
+ "value": 184.73712745236998
+ },
+ {
+ "date": "2022-12-28",
+ "value": 185.64726367624743
+ },
+ {
+ "date": "2022-12-29",
+ "value": 187.4738980891586
+ },
+ {
+ "date": "2022-12-30",
+ "value": 185.60928614554504
+ },
+ {
+ "date": "2023-01-02",
+ "value": 186.09872819273735
+ },
+ {
+ "date": "2023-01-03",
+ "value": 186.59338769818044
+ },
+ {
+ "date": "2023-01-04",
+ "value": 185.20247736286356
+ },
+ {
+ "date": "2023-01-05",
+ "value": 185.99851113750842
+ },
+ {
+ "date": "2023-01-06",
+ "value": 187.36920933380065
+ },
+ {
+ "date": "2023-01-09",
+ "value": 186.38500391952104
+ },
+ {
+ "date": "2023-01-10",
+ "value": 188.24015064747533
+ },
+ {
+ "date": "2023-01-11",
+ "value": 189.49906153256492
+ },
+ {
+ "date": "2023-01-12",
+ "value": 193.51915839364443
+ },
+ {
+ "date": "2023-01-13",
+ "value": 192.51803619100002
+ },
+ {
+ "date": "2023-01-16",
+ "value": 193.37519920944985
+ },
+ {
+ "date": "2023-01-17",
+ "value": 190.62328201432342
+ },
+ {
+ "date": "2023-01-18",
+ "value": 187.0995208599165
+ },
+ {
+ "date": "2023-01-19",
+ "value": 190.65133235148573
+ },
+ {
+ "date": "2023-01-20",
+ "value": 189.78444462385363
+ },
+ {
+ "date": "2023-01-23",
+ "value": 191.4725053543529
+ },
+ {
+ "date": "2023-01-24",
+ "value": 190.90369910024796
+ },
+ {
+ "date": "2023-01-25",
+ "value": 191.1236545235688
+ },
+ {
+ "date": "2023-01-26",
+ "value": 186.2802727194917
+ },
+ {
+ "date": "2023-01-27",
+ "value": 186.63667832264045
+ },
+ {
+ "date": "2023-01-30",
+ "value": 186.10932823737494
+ },
+ {
+ "date": "2023-01-31",
+ "value": 185.51561122454322
+ },
+ {
+ "date": "2023-02-01",
+ "value": 183.685578927406
+ },
+ {
+ "date": "2023-02-02",
+ "value": 181.3722193638272
+ },
+ {
+ "date": "2023-02-03",
+ "value": 183.59299115728209
+ },
+ {
+ "date": "2023-02-06",
+ "value": 183.29349235298292
+ },
+ {
+ "date": "2023-02-07",
+ "value": 180.58374220576752
+ },
+ {
+ "date": "2023-02-08",
+ "value": 180.74373792259436
+ },
+ {
+ "date": "2023-02-09",
+ "value": 183.51997975371714
+ },
+ {
+ "date": "2023-02-10",
+ "value": 182.9198960423718
+ },
+ {
+ "date": "2023-02-13",
+ "value": 180.65871004965194
+ },
+ {
+ "date": "2023-02-14",
+ "value": 181.78026515743096
+ },
+ {
+ "date": "2023-02-15",
+ "value": 182.1023329014378
+ },
+ {
+ "date": "2023-02-16",
+ "value": 182.0191599162744
+ },
+ {
+ "date": "2023-02-17",
+ "value": 183.60361311627068
+ },
+ {
+ "date": "2023-02-20",
+ "value": 183.1867265918316
+ },
+ {
+ "date": "2023-02-21",
+ "value": 184.14910209288558
+ },
+ {
+ "date": "2023-02-22",
+ "value": 184.75306693537138
+ },
+ {
+ "date": "2023-02-23",
+ "value": 187.11550249796431
+ },
+ {
+ "date": "2023-02-24",
+ "value": 184.77654438770332
+ },
+ {
+ "date": "2023-02-27",
+ "value": 182.51478408673626
+ },
+ {
+ "date": "2023-02-28",
+ "value": 183.78438960636677
+ },
+ {
+ "date": "2023-03-01",
+ "value": 181.75561194065034
+ },
+ {
+ "date": "2023-03-02",
+ "value": 177.6806898937575
+ },
+ {
+ "date": "2023-03-03",
+ "value": 177.3419319160619
+ },
+ {
+ "date": "2023-03-06",
+ "value": 175.04303128348488
+ },
+ {
+ "date": "2023-03-07",
+ "value": 172.75063205544774
+ },
+ {
+ "date": "2023-03-08",
+ "value": 175.44086129908587
+ },
+ {
+ "date": "2023-03-09",
+ "value": 177.0679533676764
+ },
+ {
+ "date": "2023-03-10",
+ "value": 174.2087032138339
+ },
+ {
+ "date": "2023-03-13",
+ "value": 175.6308924954282
+ },
+ {
+ "date": "2023-03-14",
+ "value": 177.12986072644125
+ },
+ {
+ "date": "2023-03-15",
+ "value": 176.97368831631985
+ },
+ {
+ "date": "2023-03-16",
+ "value": 174.88543070517892
+ },
+ {
+ "date": "2023-03-17",
+ "value": 174.66399283237416
+ },
+ {
+ "date": "2023-03-20",
+ "value": 173.04506203907368
+ },
+ {
+ "date": "2023-03-21",
+ "value": 173.56979344167723
+ },
+ {
+ "date": "2023-03-22",
+ "value": 171.83650540886987
+ },
+ {
+ "date": "2023-03-23",
+ "value": 170.93622221433546
+ },
+ {
+ "date": "2023-03-24",
+ "value": 171.38490933760713
+ },
+ {
+ "date": "2023-03-27",
+ "value": 171.54599601503662
+ },
+ {
+ "date": "2023-03-28",
+ "value": 171.49217127609975
+ },
+ {
+ "date": "2023-03-29",
+ "value": 172.5256006647191
+ },
+ {
+ "date": "2023-03-30",
+ "value": 173.4793671129438
+ },
+ {
+ "date": "2023-03-31",
+ "value": 174.81869024884065
+ },
+ {
+ "date": "2023-04-03",
+ "value": 175.8735744574504
+ },
+ {
+ "date": "2023-04-04",
+ "value": 176.66952752652503
+ },
+ {
+ "date": "2023-04-05",
+ "value": 172.2934611229302
+ },
+ {
+ "date": "2023-04-06",
+ "value": 172.3394748941266
+ },
+ {
+ "date": "2023-04-07",
+ "value": 172.70275212508918
+ },
+ {
+ "date": "2023-04-10",
+ "value": 175.99892968716037
+ },
+ {
+ "date": "2023-04-11",
+ "value": 176.22469911241808
+ },
+ {
+ "date": "2023-04-12",
+ "value": 173.6605081265277
+ },
+ {
+ "date": "2023-04-13",
+ "value": 174.289768301988
+ },
+ {
+ "date": "2023-04-14",
+ "value": 178.02777084414623
+ },
+ {
+ "date": "2023-04-17",
+ "value": 177.48990340871725
+ },
+ {
+ "date": "2023-04-18",
+ "value": 176.3843740413107
+ },
+ {
+ "date": "2023-04-19",
+ "value": 175.7308283170942
+ },
+ {
+ "date": "2023-04-20",
+ "value": 176.35407950553414
+ },
+ {
+ "date": "2023-04-21",
+ "value": 175.24457570255464
+ },
+ {
+ "date": "2023-04-24",
+ "value": 171.91189844925566
+ },
+ {
+ "date": "2023-04-25",
+ "value": 170.7119665517016
+ },
+ {
+ "date": "2023-04-26",
+ "value": 170.15896105736294
+ },
+ {
+ "date": "2023-04-27",
+ "value": 170.81728367092293
+ },
+ {
+ "date": "2023-04-28",
+ "value": 174.6471191812896
+ },
+ {
+ "date": "2023-05-01",
+ "value": 172.0404090265938
+ },
+ {
+ "date": "2023-05-02",
+ "value": 173.2373382774029
+ },
+ {
+ "date": "2023-05-03",
+ "value": 173.17347604724432
+ },
+ {
+ "date": "2023-05-04",
+ "value": 173.54076607348253
+ },
+ {
+ "date": "2023-05-05",
+ "value": 172.94776771203163
+ },
+ {
+ "date": "2023-05-08",
+ "value": 172.03274633055622
+ },
+ {
+ "date": "2023-05-09",
+ "value": 172.28222135727924
+ },
+ {
+ "date": "2023-05-10",
+ "value": 170.8424219898911
+ },
+ {
+ "date": "2023-05-11",
+ "value": 172.55978778180017
+ },
+ {
+ "date": "2023-05-12",
+ "value": 174.48686090075483
+ },
+ {
+ "date": "2023-05-15",
+ "value": 175.23930199352804
+ },
+ {
+ "date": "2023-05-16",
+ "value": 173.84837044049394
+ },
+ {
+ "date": "2023-05-17",
+ "value": 175.39846525804884
+ },
+ {
+ "date": "2023-05-18",
+ "value": 176.4328057920585
+ },
+ {
+ "date": "2023-05-19",
+ "value": 175.63857022334636
+ },
+ {
+ "date": "2023-05-22",
+ "value": 175.54075505996798
+ },
+ {
+ "date": "2023-05-23",
+ "value": 178.74495261482184
+ },
+ {
+ "date": "2023-05-24",
+ "value": 175.929344242635
+ },
+ {
+ "date": "2023-05-25",
+ "value": 181.17154485143277
+ },
+ {
+ "date": "2023-05-26",
+ "value": 177.85657554690445
+ },
+ {
+ "date": "2023-05-29",
+ "value": 178.73008865810465
+ },
+ {
+ "date": "2023-05-30",
+ "value": 178.02036723993183
+ },
+ {
+ "date": "2023-05-31",
+ "value": 178.09622703227
+ },
+ {
+ "date": "2023-06-01",
+ "value": 176.69880166989947
+ },
+ {
+ "date": "2023-06-02",
+ "value": 179.4142601410467
+ },
+ {
+ "date": "2023-06-05",
+ "value": 184.95091577335958
+ },
+ {
+ "date": "2023-06-06",
+ "value": 184.3853459138249
+ },
+ {
+ "date": "2023-06-07",
+ "value": 186.68842120529558
+ },
+ {
+ "date": "2023-06-08",
+ "value": 188.41187344720126
+ },
+ {
+ "date": "2023-06-09",
+ "value": 188.71085034483028
+ },
+ {
+ "date": "2023-06-12",
+ "value": 191.76170495041674
+ },
+ {
+ "date": "2023-06-13",
+ "value": 188.08858340531293
+ },
+ {
+ "date": "2023-06-14",
+ "value": 188.02709423638
+ },
+ {
+ "date": "2023-06-15",
+ "value": 186.35054878487927
+ },
+ {
+ "date": "2023-06-16",
+ "value": 186.04348214524245
+ },
+ {
+ "date": "2023-06-19",
+ "value": 184.36222863855448
+ },
+ {
+ "date": "2023-06-20",
+ "value": 184.46918689583623
+ },
+ {
+ "date": "2023-06-21",
+ "value": 185.06567181273883
+ },
+ {
+ "date": "2023-06-22",
+ "value": 181.99420495375193
+ },
+ {
+ "date": "2023-06-23",
+ "value": 183.66798376800165
+ },
+ {
+ "date": "2023-06-26",
+ "value": 186.30226086350095
+ },
+ {
+ "date": "2023-06-27",
+ "value": 188.8078925538689
+ },
+ {
+ "date": "2023-06-28",
+ "value": 189.61097779265913
+ },
+ {
+ "date": "2023-06-29",
+ "value": 190.70761726530182
+ },
+ {
+ "date": "2023-06-30",
+ "value": 189.9505789987774
+ },
+ {
+ "date": "2023-07-03",
+ "value": 190.18680276788743
+ },
+ {
+ "date": "2023-07-04",
+ "value": 189.25160492480052
+ },
+ {
+ "date": "2023-07-05",
+ "value": 189.90480166860257
+ },
+ {
+ "date": "2023-07-06",
+ "value": 188.07957779523696
+ },
+ {
+ "date": "2023-07-07",
+ "value": 186.48046141913733
+ },
+ {
+ "date": "2023-07-10",
+ "value": 186.37435506682962
+ },
+ {
+ "date": "2023-07-11",
+ "value": 186.89855422732649
+ },
+ {
+ "date": "2023-07-12",
+ "value": 184.51980273198956
+ },
+ {
+ "date": "2023-07-13",
+ "value": 184.5390410967608
+ },
+ {
+ "date": "2023-07-14",
+ "value": 184.16137990339564
+ },
+ {
+ "date": "2023-07-17",
+ "value": 185.08088970767486
+ },
+ {
+ "date": "2023-07-18",
+ "value": 187.30122261092268
+ },
+ {
+ "date": "2023-07-19",
+ "value": 186.41035992506934
+ },
+ {
+ "date": "2023-07-20",
+ "value": 184.2043663642878
+ },
+ {
+ "date": "2023-07-21",
+ "value": 180.76985396530773
+ },
+ {
+ "date": "2023-07-24",
+ "value": 181.11643258658245
+ },
+ {
+ "date": "2023-07-25",
+ "value": 183.43402676331198
+ },
+ {
+ "date": "2023-07-26",
+ "value": 183.76535021363975
+ },
+ {
+ "date": "2023-07-27",
+ "value": 182.65142576574974
+ },
+ {
+ "date": "2023-07-28",
+ "value": 184.3735122284462
+ },
+ {
+ "date": "2023-07-31",
+ "value": 185.46080587893164
+ },
+ {
+ "date": "2023-08-01",
+ "value": 185.6612723684105
+ },
+ {
+ "date": "2023-08-02",
+ "value": 185.7287728519883
+ },
+ {
+ "date": "2023-08-03",
+ "value": 184.0683640292839
+ },
+ {
+ "date": "2023-08-04",
+ "value": 184.42982670735412
+ },
+ {
+ "date": "2023-08-07",
+ "value": 186.01565085510006
+ },
+ {
+ "date": "2023-08-08",
+ "value": 184.11037468747696
+ },
+ {
+ "date": "2023-08-09",
+ "value": 186.88298163317174
+ },
+ {
+ "date": "2023-08-10",
+ "value": 186.46436343191166
+ },
+ {
+ "date": "2023-08-11",
+ "value": 189.5963155253309
+ },
+ {
+ "date": "2023-08-14",
+ "value": 191.55852305836615
+ },
+ {
+ "date": "2023-08-15",
+ "value": 186.3016063745689
+ },
+ {
+ "date": "2023-08-16",
+ "value": 190.90796758094498
+ },
+ {
+ "date": "2023-08-17",
+ "value": 189.14663512008775
+ },
+ {
+ "date": "2023-08-18",
+ "value": 190.34758440345828
+ },
+ {
+ "date": "2023-08-21",
+ "value": 191.51095724875836
+ },
+ {
+ "date": "2023-08-22",
+ "value": 189.7519553350147
+ },
+ {
+ "date": "2023-08-23",
+ "value": 190.09222947282876
+ },
+ {
+ "date": "2023-08-24",
+ "value": 192.46349522272084
+ },
+ {
+ "date": "2023-08-25",
+ "value": 193.1642463655746
+ },
+ {
+ "date": "2023-08-28",
+ "value": 190.12987942133208
+ },
+ {
+ "date": "2023-08-29",
+ "value": 190.0994584388733
+ },
+ {
+ "date": "2023-08-30",
+ "value": 187.91993444992517
+ },
+ {
+ "date": "2023-08-31",
+ "value": 187.90223482783756
+ },
+ {
+ "date": "2023-09-01",
+ "value": 188.2623208518311
+ },
+ {
+ "date": "2023-09-04",
+ "value": 188.0983797608217
+ },
+ {
+ "date": "2023-09-05",
+ "value": 184.339278249868
+ },
+ {
+ "date": "2023-09-06",
+ "value": 187.74644524845627
+ },
+ {
+ "date": "2023-09-07",
+ "value": 185.218991153022
+ },
+ {
+ "date": "2023-09-08",
+ "value": 189.17515381417493
+ },
+ {
+ "date": "2023-09-11",
+ "value": 188.94134617757138
+ },
+ {
+ "date": "2023-09-12",
+ "value": 188.77895266612848
+ },
+ {
+ "date": "2023-09-13",
+ "value": 186.05452249244848
+ },
+ {
+ "date": "2023-09-14",
+ "value": 186.71908106569126
+ },
+ {
+ "date": "2023-09-15",
+ "value": 180.25524900550784
+ },
+ {
+ "date": "2023-09-18",
+ "value": 180.6349812493157
+ },
+ {
+ "date": "2023-09-19",
+ "value": 180.1298300795995
+ },
+ {
+ "date": "2023-09-20",
+ "value": 180.52779292472934
+ },
+ {
+ "date": "2023-09-21",
+ "value": 179.11256730446442
+ },
+ {
+ "date": "2023-09-22",
+ "value": 173.6585149140688
+ },
+ {
+ "date": "2023-09-25",
+ "value": 172.14267167272254
+ },
+ {
+ "date": "2023-09-26",
+ "value": 173.21180691946253
+ },
+ {
+ "date": "2023-09-27",
+ "value": 172.80526816693447
+ },
+ {
+ "date": "2023-09-28",
+ "value": 173.1333447679249
+ },
+ {
+ "date": "2023-09-29",
+ "value": 173.32145007386768
+ },
+ {
+ "date": "2023-10-02",
+ "value": 175.8738348116072
+ },
+ {
+ "date": "2023-10-03",
+ "value": 176.26424674293054
+ },
+ {
+ "date": "2023-10-04",
+ "value": 177.80887601666402
+ },
+ {
+ "date": "2023-10-05",
+ "value": 178.9524581096299
+ },
+ {
+ "date": "2023-10-06",
+ "value": 180.80089768811322
+ },
+ {
+ "date": "2023-10-09",
+ "value": 181.26206745455445
+ },
+ {
+ "date": "2023-10-10",
+ "value": 179.02339137141374
+ },
+ {
+ "date": "2023-10-11",
+ "value": 181.23078735971703
+ },
+ {
+ "date": "2023-10-12",
+ "value": 178.2730202636627
+ },
+ {
+ "date": "2023-10-13",
+ "value": 177.70873598843266
+ },
+ {
+ "date": "2023-10-16",
+ "value": 179.95324850796487
+ },
+ {
+ "date": "2023-10-17",
+ "value": 181.5908215617823
+ },
+ {
+ "date": "2023-10-18",
+ "value": 182.30521846449918
+ },
+ {
+ "date": "2023-10-19",
+ "value": 183.46018507602122
+ },
+ {
+ "date": "2023-10-20",
+ "value": 184.31559234082957
+ },
+ {
+ "date": "2023-10-23",
+ "value": 185.14459091336803
+ },
+ {
+ "date": "2023-10-24",
+ "value": 187.5086172270963
+ },
+ {
+ "date": "2023-10-25",
+ "value": 186.9369894183306
+ },
+ {
+ "date": "2023-10-26",
+ "value": 189.50764942400474
+ },
+ {
+ "date": "2023-10-27",
+ "value": 186.66447742061771
+ },
+ {
+ "date": "2023-10-30",
+ "value": 186.25129798947611
+ },
+ {
+ "date": "2023-10-31",
+ "value": 187.90408659491803
+ }
+ ],
+ "benchmark": [
+ {
+ "date": "2020-01-02",
+ "value": 0.9861620617939565
+ },
+ {
+ "date": "2020-01-03",
+ "value": 0.9944000920903785
+ },
+ {
+ "date": "2020-01-06",
+ "value": 1.0131163880791534
+ },
+ {
+ "date": "2020-01-07",
+ "value": 1.01035345853133
+ },
+ {
+ "date": "2020-01-08",
+ "value": 1.0091509732524249
+ },
+ {
+ "date": "2020-01-09",
+ "value": 1.010744858408942
+ },
+ {
+ "date": "2020-01-10",
+ "value": 1.0126177251102622
+ },
+ {
+ "date": "2020-01-13",
+ "value": 1.0318339033418935
+ },
+ {
+ "date": "2020-01-14",
+ "value": 1.029183566374136
+ },
+ {
+ "date": "2020-01-15",
+ "value": 1.0393206010050409
+ },
+ {
+ "date": "2020-01-16",
+ "value": 1.063183181562598
+ },
+ {
+ "date": "2020-01-17",
+ "value": 1.0453380919551454
+ },
+ {
+ "date": "2020-01-20",
+ "value": 1.0566365459561826
+ },
+ {
+ "date": "2020-01-21",
+ "value": 1.0704531423187966
+ },
+ {
+ "date": "2020-01-22",
+ "value": 1.0795429725363053
+ },
+ {
+ "date": "2020-01-23",
+ "value": 1.0875569802009908
+ },
+ {
+ "date": "2020-01-24",
+ "value": 1.0652856815795044
+ },
+ {
+ "date": "2020-01-27",
+ "value": 1.042540049347483
+ },
+ {
+ "date": "2020-01-28",
+ "value": 1.037642070046884
+ },
+ {
+ "date": "2020-01-29",
+ "value": 1.0350818201960452
+ },
+ {
+ "date": "2020-01-30",
+ "value": 1.0399044141981622
+ },
+ {
+ "date": "2020-01-31",
+ "value": 1.034508387754774
+ },
+ {
+ "date": "2020-02-03",
+ "value": 1.029916383352603
+ },
+ {
+ "date": "2020-02-04",
+ "value": 1.0335911824044943
+ },
+ {
+ "date": "2020-02-05",
+ "value": 1.034234946357112
+ },
+ {
+ "date": "2020-02-06",
+ "value": 1.022508854421878
+ },
+ {
+ "date": "2020-02-07",
+ "value": 1.0513665971329844
+ },
+ {
+ "date": "2020-02-10",
+ "value": 1.0539377393161864
+ },
+ {
+ "date": "2020-02-11",
+ "value": 1.0370758528185897
+ },
+ {
+ "date": "2020-02-12",
+ "value": 1.0439458889771733
+ },
+ {
+ "date": "2020-02-13",
+ "value": 1.0641727477232932
+ },
+ {
+ "date": "2020-02-14",
+ "value": 1.0568733722698822
+ },
+ {
+ "date": "2020-02-17",
+ "value": 1.070421433944782
+ },
+ {
+ "date": "2020-02-18",
+ "value": 1.063576796000302
+ },
+ {
+ "date": "2020-02-19",
+ "value": 1.0766466280893177
+ },
+ {
+ "date": "2020-02-20",
+ "value": 1.0837018847588955
+ },
+ {
+ "date": "2020-02-21",
+ "value": 1.1041423845008471
+ },
+ {
+ "date": "2020-02-24",
+ "value": 1.0866089438616693
+ },
+ {
+ "date": "2020-02-25",
+ "value": 1.0680430886604635
+ },
+ {
+ "date": "2020-02-26",
+ "value": 1.0615064006842454
+ },
+ {
+ "date": "2020-02-27",
+ "value": 1.0465803465267096
+ },
+ {
+ "date": "2020-02-28",
+ "value": 1.0339926351977031
+ },
+ {
+ "date": "2020-03-02",
+ "value": 1.0302959728013117
+ },
+ {
+ "date": "2020-03-03",
+ "value": 1.037405296952094
+ },
+ {
+ "date": "2020-03-04",
+ "value": 1.0569129958582397
+ },
+ {
+ "date": "2020-03-05",
+ "value": 1.0236619148111263
+ },
+ {
+ "date": "2020-03-06",
+ "value": 1.0300425972724458
+ },
+ {
+ "date": "2020-03-09",
+ "value": 1.0292638655293316
+ },
+ {
+ "date": "2020-03-10",
+ "value": 1.0404495187595986
+ },
+ {
+ "date": "2020-03-11",
+ "value": 1.0492616071216903
+ },
+ {
+ "date": "2020-03-12",
+ "value": 1.0554062528010477
+ },
+ {
+ "date": "2020-03-13",
+ "value": 1.0727899113196222
+ },
+ {
+ "date": "2020-03-16",
+ "value": 1.0611392879618795
+ },
+ {
+ "date": "2020-03-17",
+ "value": 1.052101973772013
+ },
+ {
+ "date": "2020-03-18",
+ "value": 1.037727251114427
+ },
+ {
+ "date": "2020-03-19",
+ "value": 1.0396242022200421
+ },
+ {
+ "date": "2020-03-20",
+ "value": 1.0420590410231827
+ },
+ {
+ "date": "2020-03-23",
+ "value": 1.0321456107006
+ },
+ {
+ "date": "2020-03-24",
+ "value": 1.0441397410577704
+ },
+ {
+ "date": "2020-03-25",
+ "value": 1.0388668398969534
+ },
+ {
+ "date": "2020-03-26",
+ "value": 1.0452628268981445
+ },
+ {
+ "date": "2020-03-27",
+ "value": 1.026880265842354
+ },
+ {
+ "date": "2020-03-30",
+ "value": 1.0229341329583137
+ },
+ {
+ "date": "2020-03-31",
+ "value": 1.0298133206846443
+ },
+ {
+ "date": "2020-04-01",
+ "value": 1.0454967727344606
+ },
+ {
+ "date": "2020-04-02",
+ "value": 1.057673062460695
+ },
+ {
+ "date": "2020-04-03",
+ "value": 1.0605459883141437
+ },
+ {
+ "date": "2020-04-06",
+ "value": 1.0662656084249282
+ },
+ {
+ "date": "2020-04-07",
+ "value": 1.0579218856658041
+ },
+ {
+ "date": "2020-04-08",
+ "value": 1.06012213532224
+ },
+ {
+ "date": "2020-04-09",
+ "value": 1.0612839081080183
+ },
+ {
+ "date": "2020-04-10",
+ "value": 1.068147940280642
+ },
+ {
+ "date": "2020-04-13",
+ "value": 1.0594269521235158
+ },
+ {
+ "date": "2020-04-14",
+ "value": 1.0608651761395185
+ },
+ {
+ "date": "2020-04-15",
+ "value": 1.0748641568588806
+ },
+ {
+ "date": "2020-04-16",
+ "value": 1.0576642604916167
+ },
+ {
+ "date": "2020-04-17",
+ "value": 1.0648917844182908
+ },
+ {
+ "date": "2020-04-20",
+ "value": 1.0597939741610005
+ },
+ {
+ "date": "2020-04-21",
+ "value": 1.055417135545593
+ },
+ {
+ "date": "2020-04-22",
+ "value": 1.0659215592248317
+ },
+ {
+ "date": "2020-04-23",
+ "value": 1.0658594051871233
+ },
+ {
+ "date": "2020-04-24",
+ "value": 1.0360010285286707
+ },
+ {
+ "date": "2020-04-27",
+ "value": 1.0489189615566736
+ },
+ {
+ "date": "2020-04-28",
+ "value": 1.0368052219108947
+ },
+ {
+ "date": "2020-04-29",
+ "value": 1.0377551261616667
+ },
+ {
+ "date": "2020-04-30",
+ "value": 1.030643576802251
+ },
+ {
+ "date": "2020-05-01",
+ "value": 1.0346561192888106
+ },
+ {
+ "date": "2020-05-04",
+ "value": 1.0407215593752952
+ },
+ {
+ "date": "2020-05-05",
+ "value": 1.0610766109244527
+ },
+ {
+ "date": "2020-05-06",
+ "value": 1.0456639432752943
+ },
+ {
+ "date": "2020-05-07",
+ "value": 1.045605092369194
+ },
+ {
+ "date": "2020-05-08",
+ "value": 1.037723930681496
+ },
+ {
+ "date": "2020-05-11",
+ "value": 1.0386648110118966
+ },
+ {
+ "date": "2020-05-12",
+ "value": 1.045987045555531
+ },
+ {
+ "date": "2020-05-13",
+ "value": 1.0617978713505347
+ },
+ {
+ "date": "2020-05-14",
+ "value": 1.058379312143731
+ },
+ {
+ "date": "2020-05-15",
+ "value": 1.058501449161131
+ },
+ {
+ "date": "2020-05-18",
+ "value": 1.0653661007965467
+ },
+ {
+ "date": "2020-05-19",
+ "value": 1.0406992389719165
+ },
+ {
+ "date": "2020-05-20",
+ "value": 1.0270609842320586
+ },
+ {
+ "date": "2020-05-21",
+ "value": 1.0428147984098182
+ },
+ {
+ "date": "2020-05-22",
+ "value": 1.0376955679593463
+ },
+ {
+ "date": "2020-05-25",
+ "value": 1.0226473628601278
+ },
+ {
+ "date": "2020-05-26",
+ "value": 1.0184289346085038
+ },
+ {
+ "date": "2020-05-27",
+ "value": 1.035481694044053
+ },
+ {
+ "date": "2020-05-28",
+ "value": 1.006753257650715
+ },
+ {
+ "date": "2020-05-29",
+ "value": 1.0178186802370575
+ },
+ {
+ "date": "2020-06-01",
+ "value": 1.0217511702588107
+ },
+ {
+ "date": "2020-06-02",
+ "value": 1.0294857970950626
+ },
+ {
+ "date": "2020-06-03",
+ "value": 1.0351755151735014
+ },
+ {
+ "date": "2020-06-04",
+ "value": 1.0439720305646065
+ },
+ {
+ "date": "2020-06-05",
+ "value": 1.0201404930835436
+ },
+ {
+ "date": "2020-06-08",
+ "value": 1.0216947010733943
+ },
+ {
+ "date": "2020-06-09",
+ "value": 1.0208498540755675
+ },
+ {
+ "date": "2020-06-10",
+ "value": 1.0449719751395765
+ },
+ {
+ "date": "2020-06-11",
+ "value": 1.0394562899962423
+ },
+ {
+ "date": "2020-06-12",
+ "value": 1.048902893776366
+ },
+ {
+ "date": "2020-06-15",
+ "value": 1.0484066193759367
+ },
+ {
+ "date": "2020-06-16",
+ "value": 1.0421799904764084
+ },
+ {
+ "date": "2020-06-17",
+ "value": 1.0659842837138693
+ },
+ {
+ "date": "2020-06-18",
+ "value": 1.067538558689817
+ },
+ {
+ "date": "2020-06-19",
+ "value": 1.052541719150942
+ },
+ {
+ "date": "2020-06-22",
+ "value": 1.0512157945431742
+ },
+ {
+ "date": "2020-06-23",
+ "value": 1.044415291934401
+ },
+ {
+ "date": "2020-06-24",
+ "value": 1.0437830690407237
+ },
+ {
+ "date": "2020-06-25",
+ "value": 1.0449122922727476
+ },
+ {
+ "date": "2020-06-26",
+ "value": 1.0312360545904797
+ },
+ {
+ "date": "2020-06-29",
+ "value": 1.0413214671933104
+ },
+ {
+ "date": "2020-06-30",
+ "value": 1.0322710165029114
+ },
+ {
+ "date": "2020-07-01",
+ "value": 1.0317683607702373
+ },
+ {
+ "date": "2020-07-02",
+ "value": 1.0441127995819839
+ },
+ {
+ "date": "2020-07-03",
+ "value": 1.0314164184398684
+ },
+ {
+ "date": "2020-07-06",
+ "value": 1.0359597411213357
+ },
+ {
+ "date": "2020-07-07",
+ "value": 1.040164523298433
+ },
+ {
+ "date": "2020-07-08",
+ "value": 1.050365977988439
+ },
+ {
+ "date": "2020-07-09",
+ "value": 1.0507166785384288
+ },
+ {
+ "date": "2020-07-10",
+ "value": 1.0592000326974673
+ },
+ {
+ "date": "2020-07-13",
+ "value": 1.065920254035104
+ },
+ {
+ "date": "2020-07-14",
+ "value": 1.0542604336484709
+ },
+ {
+ "date": "2020-07-15",
+ "value": 1.0659835413259842
+ },
+ {
+ "date": "2020-07-16",
+ "value": 1.077236630093518
+ },
+ {
+ "date": "2020-07-17",
+ "value": 1.0737085962989625
+ },
+ {
+ "date": "2020-07-20",
+ "value": 1.0622485014380616
+ },
+ {
+ "date": "2020-07-21",
+ "value": 1.0628410299339692
+ },
+ {
+ "date": "2020-07-22",
+ "value": 1.0752296364419116
+ },
+ {
+ "date": "2020-07-23",
+ "value": 1.0682685444642162
+ },
+ {
+ "date": "2020-07-24",
+ "value": 1.0818468153587908
+ },
+ {
+ "date": "2020-07-27",
+ "value": 1.0797116094946693
+ },
+ {
+ "date": "2020-07-28",
+ "value": 1.089669885914151
+ },
+ {
+ "date": "2020-07-29",
+ "value": 1.0868588220872346
+ },
+ {
+ "date": "2020-07-30",
+ "value": 1.074213685916675
+ },
+ {
+ "date": "2020-07-31",
+ "value": 1.064415230453545
+ },
+ {
+ "date": "2020-08-03",
+ "value": 1.0827985986843858
+ },
+ {
+ "date": "2020-08-04",
+ "value": 1.0878938670427187
+ },
+ {
+ "date": "2020-08-05",
+ "value": 1.078832956277264
+ },
+ {
+ "date": "2020-08-06",
+ "value": 1.0930120700274075
+ },
+ {
+ "date": "2020-08-07",
+ "value": 1.0800464688607898
+ },
+ {
+ "date": "2020-08-10",
+ "value": 1.0543264117288422
+ },
+ {
+ "date": "2020-08-11",
+ "value": 1.0719279775173487
+ },
+ {
+ "date": "2020-08-12",
+ "value": 1.0650643277123983
+ },
+ {
+ "date": "2020-08-13",
+ "value": 1.0689095781870834
+ },
+ {
+ "date": "2020-08-14",
+ "value": 1.0727516060530795
+ },
+ {
+ "date": "2020-08-17",
+ "value": 1.0636580636391577
+ },
+ {
+ "date": "2020-08-18",
+ "value": 1.0713844973981923
+ },
+ {
+ "date": "2020-08-19",
+ "value": 1.0854261953676398
+ },
+ {
+ "date": "2020-08-20",
+ "value": 1.090468118492808
+ },
+ {
+ "date": "2020-08-21",
+ "value": 1.0939142450231207
+ },
+ {
+ "date": "2020-08-24",
+ "value": 1.0828309348625549
+ },
+ {
+ "date": "2020-08-25",
+ "value": 1.106656184362223
+ },
+ {
+ "date": "2020-08-26",
+ "value": 1.1109840326132103
+ },
+ {
+ "date": "2020-08-27",
+ "value": 1.082498401611742
+ },
+ {
+ "date": "2020-08-28",
+ "value": 1.0651518796461525
+ },
+ {
+ "date": "2020-08-31",
+ "value": 1.0588850494795723
+ },
+ {
+ "date": "2020-09-01",
+ "value": 1.0764343815675756
+ },
+ {
+ "date": "2020-09-02",
+ "value": 1.0816500557201376
+ },
+ {
+ "date": "2020-09-03",
+ "value": 1.0781904082401093
+ },
+ {
+ "date": "2020-09-04",
+ "value": 1.0919401882226452
+ },
+ {
+ "date": "2020-09-07",
+ "value": 1.088511829586653
+ },
+ {
+ "date": "2020-09-08",
+ "value": 1.111767280949006
+ },
+ {
+ "date": "2020-09-09",
+ "value": 1.0776959466436573
+ },
+ {
+ "date": "2020-09-10",
+ "value": 1.0839226607897323
+ },
+ {
+ "date": "2020-09-11",
+ "value": 1.093239935047176
+ },
+ {
+ "date": "2020-09-14",
+ "value": 1.0769924466351943
+ },
+ {
+ "date": "2020-09-15",
+ "value": 1.056908449588622
+ },
+ {
+ "date": "2020-09-16",
+ "value": 1.0538185975507817
+ },
+ {
+ "date": "2020-09-17",
+ "value": 1.0684686521845317
+ },
+ {
+ "date": "2020-09-18",
+ "value": 1.06316820487568
+ },
+ {
+ "date": "2020-09-21",
+ "value": 1.063487226739975
+ },
+ {
+ "date": "2020-09-22",
+ "value": 1.0611246310143918
+ },
+ {
+ "date": "2020-09-23",
+ "value": 1.0537610244705764
+ },
+ {
+ "date": "2020-09-24",
+ "value": 1.061403143689373
+ },
+ {
+ "date": "2020-09-25",
+ "value": 1.065145021723312
+ },
+ {
+ "date": "2020-09-28",
+ "value": 1.0736397605953174
+ },
+ {
+ "date": "2020-09-29",
+ "value": 1.0907745565316092
+ },
+ {
+ "date": "2020-09-30",
+ "value": 1.0721404701706396
+ },
+ {
+ "date": "2020-10-01",
+ "value": 1.0629565721595107
+ },
+ {
+ "date": "2020-10-02",
+ "value": 1.071228206829149
+ },
+ {
+ "date": "2020-10-05",
+ "value": 1.0816503141443812
+ },
+ {
+ "date": "2020-10-06",
+ "value": 1.0699069177395861
+ },
+ {
+ "date": "2020-10-07",
+ "value": 1.0744002070972123
+ },
+ {
+ "date": "2020-10-08",
+ "value": 1.0721614277754263
+ },
+ {
+ "date": "2020-10-09",
+ "value": 1.0882147355633336
+ },
+ {
+ "date": "2020-10-12",
+ "value": 1.086669298877372
+ },
+ {
+ "date": "2020-10-13",
+ "value": 1.103718855428267
+ },
+ {
+ "date": "2020-10-14",
+ "value": 1.104906966207218
+ },
+ {
+ "date": "2020-10-15",
+ "value": 1.1032200710384366
+ },
+ {
+ "date": "2020-10-16",
+ "value": 1.1213959128868691
+ },
+ {
+ "date": "2020-10-19",
+ "value": 1.1330206130520843
+ },
+ {
+ "date": "2020-10-20",
+ "value": 1.1367893568037044
+ },
+ {
+ "date": "2020-10-21",
+ "value": 1.1633438270553451
+ },
+ {
+ "date": "2020-10-22",
+ "value": 1.1597463039474336
+ },
+ {
+ "date": "2020-10-23",
+ "value": 1.13849266082406
+ },
+ {
+ "date": "2020-10-26",
+ "value": 1.121979030870906
+ },
+ {
+ "date": "2020-10-27",
+ "value": 1.1310362690289184
+ },
+ {
+ "date": "2020-10-28",
+ "value": 1.1240273395474791
+ },
+ {
+ "date": "2020-10-29",
+ "value": 1.1326569538834863
+ },
+ {
+ "date": "2020-10-30",
+ "value": 1.1311131493041664
+ },
+ {
+ "date": "2020-11-02",
+ "value": 1.1254212946559312
+ },
+ {
+ "date": "2020-11-03",
+ "value": 1.1425055903639636
+ },
+ {
+ "date": "2020-11-04",
+ "value": 1.1518340398246505
+ },
+ {
+ "date": "2020-11-05",
+ "value": 1.1618436785696076
+ },
+ {
+ "date": "2020-11-06",
+ "value": 1.1686319720396852
+ },
+ {
+ "date": "2020-11-09",
+ "value": 1.1578604731789763
+ },
+ {
+ "date": "2020-11-10",
+ "value": 1.1776872575569228
+ },
+ {
+ "date": "2020-11-11",
+ "value": 1.188645392028474
+ },
+ {
+ "date": "2020-11-12",
+ "value": 1.1945304891802893
+ },
+ {
+ "date": "2020-11-13",
+ "value": 1.2005187162896438
+ },
+ {
+ "date": "2020-11-16",
+ "value": 1.2091886788630115
+ },
+ {
+ "date": "2020-11-17",
+ "value": 1.205642271852255
+ },
+ {
+ "date": "2020-11-18",
+ "value": 1.1985017043698252
+ },
+ {
+ "date": "2020-11-19",
+ "value": 1.2055220886077072
+ },
+ {
+ "date": "2020-11-20",
+ "value": 1.223175417244725
+ },
+ {
+ "date": "2020-11-23",
+ "value": 1.195624896285164
+ },
+ {
+ "date": "2020-11-24",
+ "value": 1.2090280641188427
+ },
+ {
+ "date": "2020-11-25",
+ "value": 1.1948924716905813
+ },
+ {
+ "date": "2020-11-26",
+ "value": 1.1727330453742775
+ },
+ {
+ "date": "2020-11-27",
+ "value": 1.1929169853172492
+ },
+ {
+ "date": "2020-11-30",
+ "value": 1.183503873462981
+ },
+ {
+ "date": "2020-12-01",
+ "value": 1.200477661969603
+ },
+ {
+ "date": "2020-12-02",
+ "value": 1.1928293494923992
+ },
+ {
+ "date": "2020-12-03",
+ "value": 1.1768672103666222
+ },
+ {
+ "date": "2020-12-04",
+ "value": 1.1710436624141805
+ },
+ {
+ "date": "2020-12-07",
+ "value": 1.1946758383661105
+ },
+ {
+ "date": "2020-12-08",
+ "value": 1.2057935296633644
+ },
+ {
+ "date": "2020-12-09",
+ "value": 1.2076050820156017
+ },
+ {
+ "date": "2020-12-10",
+ "value": 1.1870111392921325
+ },
+ {
+ "date": "2020-12-11",
+ "value": 1.1936662738974044
+ },
+ {
+ "date": "2020-12-14",
+ "value": 1.190651329923443
+ },
+ {
+ "date": "2020-12-15",
+ "value": 1.1618831185901741
+ },
+ {
+ "date": "2020-12-16",
+ "value": 1.1646990063721512
+ },
+ {
+ "date": "2020-12-17",
+ "value": 1.1754496778595882
+ },
+ {
+ "date": "2020-12-18",
+ "value": 1.17300237388254
+ },
+ {
+ "date": "2020-12-21",
+ "value": 1.162834813986511
+ },
+ {
+ "date": "2020-12-22",
+ "value": 1.184358375817945
+ },
+ {
+ "date": "2020-12-23",
+ "value": 1.1744390438137942
+ },
+ {
+ "date": "2020-12-24",
+ "value": 1.1611316039255368
+ },
+ {
+ "date": "2020-12-25",
+ "value": 1.1703594814205396
+ },
+ {
+ "date": "2020-12-28",
+ "value": 1.163236519941064
+ },
+ {
+ "date": "2020-12-29",
+ "value": 1.1666982096845606
+ },
+ {
+ "date": "2020-12-30",
+ "value": 1.1686738709100233
+ },
+ {
+ "date": "2020-12-31",
+ "value": 1.1714320689736764
+ },
+ {
+ "date": "2021-01-01",
+ "value": 1.1659126176905883
+ },
+ {
+ "date": "2021-01-04",
+ "value": 1.166448228187159
+ },
+ {
+ "date": "2021-01-05",
+ "value": 1.189614971703315
+ },
+ {
+ "date": "2021-01-06",
+ "value": 1.190059912878299
+ },
+ {
+ "date": "2021-01-07",
+ "value": 1.207895831746354
+ },
+ {
+ "date": "2021-01-08",
+ "value": 1.215793959397835
+ },
+ {
+ "date": "2021-01-11",
+ "value": 1.2204051796799147
+ },
+ {
+ "date": "2021-01-12",
+ "value": 1.232491385761427
+ },
+ {
+ "date": "2021-01-13",
+ "value": 1.242530499825172
+ },
+ {
+ "date": "2021-01-14",
+ "value": 1.253364732098624
+ },
+ {
+ "date": "2021-01-15",
+ "value": 1.2727522628294663
+ },
+ {
+ "date": "2021-01-18",
+ "value": 1.2752641243064968
+ },
+ {
+ "date": "2021-01-19",
+ "value": 1.2614191286529333
+ },
+ {
+ "date": "2021-01-20",
+ "value": 1.2597524707652952
+ },
+ {
+ "date": "2021-01-21",
+ "value": 1.250968778935385
+ },
+ {
+ "date": "2021-01-22",
+ "value": 1.265828945720154
+ },
+ {
+ "date": "2021-01-25",
+ "value": 1.267238703898424
+ },
+ {
+ "date": "2021-01-26",
+ "value": 1.2492826800564443
+ },
+ {
+ "date": "2021-01-27",
+ "value": 1.250779250703235
+ },
+ {
+ "date": "2021-01-28",
+ "value": 1.2644452913466095
+ },
+ {
+ "date": "2021-01-29",
+ "value": 1.2653892681802472
+ },
+ {
+ "date": "2021-02-01",
+ "value": 1.2741531203110639
+ },
+ {
+ "date": "2021-02-02",
+ "value": 1.2791117794126408
+ },
+ {
+ "date": "2021-02-03",
+ "value": 1.3054922135672407
+ },
+ {
+ "date": "2021-02-04",
+ "value": 1.3078284099654174
+ },
+ {
+ "date": "2021-02-05",
+ "value": 1.316355300455953
+ },
+ {
+ "date": "2021-02-08",
+ "value": 1.3192876429143345
+ },
+ {
+ "date": "2021-02-09",
+ "value": 1.3209047407789398
+ },
+ {
+ "date": "2021-02-10",
+ "value": 1.3281451973994098
+ },
+ {
+ "date": "2021-02-11",
+ "value": 1.3358776241522885
+ },
+ {
+ "date": "2021-02-12",
+ "value": 1.3127607452590766
+ },
+ {
+ "date": "2021-02-15",
+ "value": 1.3115343649217686
+ },
+ {
+ "date": "2021-02-16",
+ "value": 1.3048058139716243
+ },
+ {
+ "date": "2021-02-17",
+ "value": 1.304867400622695
+ },
+ {
+ "date": "2021-02-18",
+ "value": 1.2664315085544406
+ },
+ {
+ "date": "2021-02-19",
+ "value": 1.2685658115084069
+ },
+ {
+ "date": "2021-02-22",
+ "value": 1.258964397705582
+ },
+ {
+ "date": "2021-02-23",
+ "value": 1.231426388204139
+ },
+ {
+ "date": "2021-02-24",
+ "value": 1.2459570333666
+ },
+ {
+ "date": "2021-02-25",
+ "value": 1.256696117002804
+ },
+ {
+ "date": "2021-02-26",
+ "value": 1.2695427669867692
+ },
+ {
+ "date": "2021-03-01",
+ "value": 1.2659179903934676
+ },
+ {
+ "date": "2021-03-02",
+ "value": 1.2623840382923426
+ },
+ {
+ "date": "2021-03-03",
+ "value": 1.2527028720279525
+ },
+ {
+ "date": "2021-03-04",
+ "value": 1.2852820089836163
+ },
+ {
+ "date": "2021-03-05",
+ "value": 1.2691711632521843
+ },
+ {
+ "date": "2021-03-08",
+ "value": 1.2859896687436547
+ },
+ {
+ "date": "2021-03-09",
+ "value": 1.2630373607153784
+ },
+ {
+ "date": "2021-03-10",
+ "value": 1.2625139362687123
+ },
+ {
+ "date": "2021-03-11",
+ "value": 1.2681858214531718
+ },
+ {
+ "date": "2021-03-12",
+ "value": 1.272950410285385
+ },
+ {
+ "date": "2021-03-15",
+ "value": 1.259312233655776
+ },
+ {
+ "date": "2021-03-16",
+ "value": 1.2935957686129103
+ },
+ {
+ "date": "2021-03-17",
+ "value": 1.3128494735670215
+ },
+ {
+ "date": "2021-03-18",
+ "value": 1.3019921734263176
+ },
+ {
+ "date": "2021-03-19",
+ "value": 1.3070650805466526
+ },
+ {
+ "date": "2021-03-22",
+ "value": 1.3023227473750083
+ },
+ {
+ "date": "2021-03-23",
+ "value": 1.3218545522459755
+ },
+ {
+ "date": "2021-03-24",
+ "value": 1.3183748193568212
+ },
+ {
+ "date": "2021-03-25",
+ "value": 1.3150493421959821
+ },
+ {
+ "date": "2021-03-26",
+ "value": 1.3121952352650144
+ },
+ {
+ "date": "2021-03-29",
+ "value": 1.3148615147456597
+ },
+ {
+ "date": "2021-03-30",
+ "value": 1.3504977129703475
+ },
+ {
+ "date": "2021-03-31",
+ "value": 1.3710245262424814
+ },
+ {
+ "date": "2021-04-01",
+ "value": 1.379527380744859
+ },
+ {
+ "date": "2021-04-02",
+ "value": 1.3805808480825474
+ },
+ {
+ "date": "2021-04-05",
+ "value": 1.3886318266857973
+ },
+ {
+ "date": "2021-04-06",
+ "value": 1.3757525612306905
+ },
+ {
+ "date": "2021-04-07",
+ "value": 1.3848616613703506
+ },
+ {
+ "date": "2021-04-08",
+ "value": 1.3947086497375818
+ },
+ {
+ "date": "2021-04-09",
+ "value": 1.381148010212007
+ },
+ {
+ "date": "2021-04-12",
+ "value": 1.368780359831828
+ },
+ {
+ "date": "2021-04-13",
+ "value": 1.3953168149763808
+ },
+ {
+ "date": "2021-04-14",
+ "value": 1.4161026074844605
+ },
+ {
+ "date": "2021-04-15",
+ "value": 1.4319641103497192
+ },
+ {
+ "date": "2021-04-16",
+ "value": 1.471731805612856
+ },
+ {
+ "date": "2021-04-19",
+ "value": 1.4703303554318419
+ },
+ {
+ "date": "2021-04-20",
+ "value": 1.4657581811407112
+ },
+ {
+ "date": "2021-04-21",
+ "value": 1.5003026553222711
+ },
+ {
+ "date": "2021-04-22",
+ "value": 1.5055487705992419
+ },
+ {
+ "date": "2021-04-23",
+ "value": 1.5096279408704718
+ },
+ {
+ "date": "2021-04-26",
+ "value": 1.498977581515785
+ },
+ {
+ "date": "2021-04-27",
+ "value": 1.4937844263377498
+ },
+ {
+ "date": "2021-04-28",
+ "value": 1.5084503204628963
+ },
+ {
+ "date": "2021-04-29",
+ "value": 1.4921921771454123
+ },
+ {
+ "date": "2021-04-30",
+ "value": 1.5039863380859417
+ },
+ {
+ "date": "2021-05-03",
+ "value": 1.5071864733515592
+ },
+ {
+ "date": "2021-05-04",
+ "value": 1.4954791080398206
+ },
+ {
+ "date": "2021-05-05",
+ "value": 1.4905527005357322
+ },
+ {
+ "date": "2021-05-06",
+ "value": 1.481839709648732
+ },
+ {
+ "date": "2021-05-07",
+ "value": 1.4714688383074308
+ },
+ {
+ "date": "2021-05-10",
+ "value": 1.45886270465708
+ },
+ {
+ "date": "2021-05-11",
+ "value": 1.4649894049084384
+ },
+ {
+ "date": "2021-05-12",
+ "value": 1.466404332314401
+ },
+ {
+ "date": "2021-05-13",
+ "value": 1.460810721568988
+ },
+ {
+ "date": "2021-05-14",
+ "value": 1.4428140186842395
+ },
+ {
+ "date": "2021-05-17",
+ "value": 1.4307213632539033
+ },
+ {
+ "date": "2021-05-18",
+ "value": 1.3917407880879684
+ },
+ {
+ "date": "2021-05-19",
+ "value": 1.390125520863086
+ },
+ {
+ "date": "2021-05-20",
+ "value": 1.407801891235672
+ },
+ {
+ "date": "2021-05-21",
+ "value": 1.3952892109774984
+ },
+ {
+ "date": "2021-05-24",
+ "value": 1.378880385803831
+ },
+ {
+ "date": "2021-05-25",
+ "value": 1.3793547731839857
+ },
+ {
+ "date": "2021-05-26",
+ "value": 1.383858492272529
+ },
+ {
+ "date": "2021-05-27",
+ "value": 1.4021673381997857
+ },
+ {
+ "date": "2021-05-28",
+ "value": 1.3739438972575448
+ },
+ {
+ "date": "2021-05-31",
+ "value": 1.3705924310084996
+ },
+ {
+ "date": "2021-06-01",
+ "value": 1.386755711677767
+ },
+ {
+ "date": "2021-06-02",
+ "value": 1.381307784593967
+ },
+ {
+ "date": "2021-06-03",
+ "value": 1.3795643127749777
+ },
+ {
+ "date": "2021-06-04",
+ "value": 1.402723828943687
+ },
+ {
+ "date": "2021-06-07",
+ "value": 1.3977051863262795
+ },
+ {
+ "date": "2021-06-08",
+ "value": 1.3970219288349515
+ },
+ {
+ "date": "2021-06-09",
+ "value": 1.3862590622616004
+ },
+ {
+ "date": "2021-06-10",
+ "value": 1.3806659384973157
+ },
+ {
+ "date": "2021-06-11",
+ "value": 1.3715030751463484
+ },
+ {
+ "date": "2021-06-14",
+ "value": 1.4084380145898694
+ },
+ {
+ "date": "2021-06-15",
+ "value": 1.367110944196187
+ },
+ {
+ "date": "2021-06-16",
+ "value": 1.3907008420507876
+ },
+ {
+ "date": "2021-06-17",
+ "value": 1.3906140067612722
+ },
+ {
+ "date": "2021-06-18",
+ "value": 1.3939066088390526
+ },
+ {
+ "date": "2021-06-21",
+ "value": 1.3820214924765055
+ },
+ {
+ "date": "2021-06-22",
+ "value": 1.3824026602204793
+ },
+ {
+ "date": "2021-06-23",
+ "value": 1.3800366710718965
+ },
+ {
+ "date": "2021-06-24",
+ "value": 1.3908844868574002
+ },
+ {
+ "date": "2021-06-25",
+ "value": 1.3892062067973632
+ },
+ {
+ "date": "2021-06-28",
+ "value": 1.3745272802508417
+ },
+ {
+ "date": "2021-06-29",
+ "value": 1.4062582822444627
+ },
+ {
+ "date": "2021-06-30",
+ "value": 1.4309102661087192
+ },
+ {
+ "date": "2021-07-01",
+ "value": 1.4294659321270338
+ },
+ {
+ "date": "2021-07-02",
+ "value": 1.439901133637413
+ },
+ {
+ "date": "2021-07-05",
+ "value": 1.4206278769698517
+ },
+ {
+ "date": "2021-07-06",
+ "value": 1.4399640666233222
+ },
+ {
+ "date": "2021-07-07",
+ "value": 1.4165248997611979
+ },
+ {
+ "date": "2021-07-08",
+ "value": 1.4061639059428825
+ },
+ {
+ "date": "2021-07-09",
+ "value": 1.3899600119614057
+ },
+ {
+ "date": "2021-07-12",
+ "value": 1.3852179206640802
+ },
+ {
+ "date": "2021-07-13",
+ "value": 1.3947905942331764
+ },
+ {
+ "date": "2021-07-14",
+ "value": 1.4088224277687038
+ },
+ {
+ "date": "2021-07-15",
+ "value": 1.4131258240078732
+ },
+ {
+ "date": "2021-07-16",
+ "value": 1.3813234133651953
+ },
+ {
+ "date": "2021-07-19",
+ "value": 1.3499098184976555
+ },
+ {
+ "date": "2021-07-20",
+ "value": 1.3653181390736133
+ },
+ {
+ "date": "2021-07-21",
+ "value": 1.37159218708712
+ },
+ {
+ "date": "2021-07-22",
+ "value": 1.3697384498314296
+ },
+ {
+ "date": "2021-07-23",
+ "value": 1.3969764655799328
+ },
+ {
+ "date": "2021-07-26",
+ "value": 1.3918811626988818
+ },
+ {
+ "date": "2021-07-27",
+ "value": 1.395782671085152
+ },
+ {
+ "date": "2021-07-28",
+ "value": 1.3991151757500373
+ },
+ {
+ "date": "2021-07-29",
+ "value": 1.4162945193516971
+ },
+ {
+ "date": "2021-07-30",
+ "value": 1.419609816849131
+ },
+ {
+ "date": "2021-08-02",
+ "value": 1.43427056817682
+ },
+ {
+ "date": "2021-08-03",
+ "value": 1.41724990307551
+ },
+ {
+ "date": "2021-08-04",
+ "value": 1.4227314581781192
+ },
+ {
+ "date": "2021-08-05",
+ "value": 1.4179088844894348
+ },
+ {
+ "date": "2021-08-06",
+ "value": 1.4378103751231752
+ },
+ {
+ "date": "2021-08-09",
+ "value": 1.4016773442448323
+ },
+ {
+ "date": "2021-08-10",
+ "value": 1.4128412720860546
+ },
+ {
+ "date": "2021-08-11",
+ "value": 1.4363529113809916
+ },
+ {
+ "date": "2021-08-12",
+ "value": 1.4719812424792813
+ },
+ {
+ "date": "2021-08-13",
+ "value": 1.4707566446053961
+ },
+ {
+ "date": "2021-08-16",
+ "value": 1.4672598235804997
+ },
+ {
+ "date": "2021-08-17",
+ "value": 1.4496169966220163
+ },
+ {
+ "date": "2021-08-18",
+ "value": 1.438621232358818
+ },
+ {
+ "date": "2021-08-19",
+ "value": 1.4324211464170769
+ },
+ {
+ "date": "2021-08-20",
+ "value": 1.429753305714299
+ },
+ {
+ "date": "2021-08-23",
+ "value": 1.45743037182792
+ },
+ {
+ "date": "2021-08-24",
+ "value": 1.470024861851428
+ },
+ {
+ "date": "2021-08-25",
+ "value": 1.4736526911615806
+ },
+ {
+ "date": "2021-08-26",
+ "value": 1.4723247090092504
+ },
+ {
+ "date": "2021-08-27",
+ "value": 1.4587697382612441
+ },
+ {
+ "date": "2021-08-30",
+ "value": 1.4572629664246666
+ },
+ {
+ "date": "2021-08-31",
+ "value": 1.4324586077698245
+ },
+ {
+ "date": "2021-09-01",
+ "value": 1.4083851644154046
+ },
+ {
+ "date": "2021-09-02",
+ "value": 1.4208734813045187
+ },
+ {
+ "date": "2021-09-03",
+ "value": 1.4208247199960131
+ },
+ {
+ "date": "2021-09-06",
+ "value": 1.4285740875382102
+ },
+ {
+ "date": "2021-09-07",
+ "value": 1.4209833677400845
+ },
+ {
+ "date": "2021-09-08",
+ "value": 1.4325343529283825
+ },
+ {
+ "date": "2021-09-09",
+ "value": 1.424459499991382
+ },
+ {
+ "date": "2021-09-10",
+ "value": 1.3945910201190925
+ },
+ {
+ "date": "2021-09-13",
+ "value": 1.4120514940388722
+ },
+ {
+ "date": "2021-09-14",
+ "value": 1.38866661210329
+ },
+ {
+ "date": "2021-09-15",
+ "value": 1.3857275088595011
+ },
+ {
+ "date": "2021-09-16",
+ "value": 1.4011569454306367
+ },
+ {
+ "date": "2021-09-17",
+ "value": 1.3919382890348446
+ },
+ {
+ "date": "2021-09-20",
+ "value": 1.375126570515468
+ },
+ {
+ "date": "2021-09-21",
+ "value": 1.352759207847141
+ },
+ {
+ "date": "2021-09-22",
+ "value": 1.3449223636305467
+ },
+ {
+ "date": "2021-09-23",
+ "value": 1.3629414402386393
+ },
+ {
+ "date": "2021-09-24",
+ "value": 1.395684515517025
+ },
+ {
+ "date": "2021-09-27",
+ "value": 1.3886428355323586
+ },
+ {
+ "date": "2021-09-28",
+ "value": 1.3641227988511744
+ },
+ {
+ "date": "2021-09-29",
+ "value": 1.3502015914952985
+ },
+ {
+ "date": "2021-09-30",
+ "value": 1.3626940644644099
+ },
+ {
+ "date": "2021-10-01",
+ "value": 1.3607919549839265
+ },
+ {
+ "date": "2021-10-04",
+ "value": 1.402964398948314
+ },
+ {
+ "date": "2021-10-05",
+ "value": 1.388975648279259
+ },
+ {
+ "date": "2021-10-06",
+ "value": 1.408467818625729
+ },
+ {
+ "date": "2021-10-07",
+ "value": 1.4039340392428707
+ },
+ {
+ "date": "2021-10-08",
+ "value": 1.4021661694805887
+ },
+ {
+ "date": "2021-10-11",
+ "value": 1.4038000365252732
+ },
+ {
+ "date": "2021-10-12",
+ "value": 1.436878531980073
+ },
+ {
+ "date": "2021-10-13",
+ "value": 1.4470410532924038
+ },
+ {
+ "date": "2021-10-14",
+ "value": 1.4587054376556585
+ },
+ {
+ "date": "2021-10-15",
+ "value": 1.461820022972895
+ },
+ {
+ "date": "2021-10-18",
+ "value": 1.4904591237222742
+ },
+ {
+ "date": "2021-10-19",
+ "value": 1.4990078280940025
+ },
+ {
+ "date": "2021-10-20",
+ "value": 1.5058369490900136
+ },
+ {
+ "date": "2021-10-21",
+ "value": 1.4960635985740864
+ },
+ {
+ "date": "2021-10-22",
+ "value": 1.4897070083575303
+ },
+ {
+ "date": "2021-10-25",
+ "value": 1.4710381745717296
+ },
+ {
+ "date": "2021-10-26",
+ "value": 1.4452254051719973
+ },
+ {
+ "date": "2021-10-27",
+ "value": 1.43660903129929
+ },
+ {
+ "date": "2021-10-28",
+ "value": 1.4008049869625465
+ },
+ {
+ "date": "2021-10-29",
+ "value": 1.3959517428123578
+ },
+ {
+ "date": "2021-11-01",
+ "value": 1.4006354011373718
+ },
+ {
+ "date": "2021-11-02",
+ "value": 1.3946305284502112
+ },
+ {
+ "date": "2021-11-03",
+ "value": 1.3982058596330105
+ },
+ {
+ "date": "2021-11-04",
+ "value": 1.4012069209852749
+ },
+ {
+ "date": "2021-11-05",
+ "value": 1.429630227003717
+ },
+ {
+ "date": "2021-11-08",
+ "value": 1.429716627595712
+ },
+ {
+ "date": "2021-11-09",
+ "value": 1.4188906986255247
+ },
+ {
+ "date": "2021-11-10",
+ "value": 1.4129102009754562
+ },
+ {
+ "date": "2021-11-11",
+ "value": 1.421543095077925
+ },
+ {
+ "date": "2021-11-12",
+ "value": 1.4161262925918003
+ },
+ {
+ "date": "2021-11-15",
+ "value": 1.4291174593030285
+ },
+ {
+ "date": "2021-11-16",
+ "value": 1.4495868168511812
+ },
+ {
+ "date": "2021-11-17",
+ "value": 1.47367259162948
+ },
+ {
+ "date": "2021-11-18",
+ "value": 1.5019502961357905
+ },
+ {
+ "date": "2021-11-19",
+ "value": 1.5080109347660076
+ },
+ {
+ "date": "2021-11-22",
+ "value": 1.4898936871493997
+ },
+ {
+ "date": "2021-11-23",
+ "value": 1.4961168212108944
+ },
+ {
+ "date": "2021-11-24",
+ "value": 1.5279732526379202
+ },
+ {
+ "date": "2021-11-25",
+ "value": 1.5266217310337018
+ },
+ {
+ "date": "2021-11-26",
+ "value": 1.5298060477392295
+ },
+ {
+ "date": "2021-11-29",
+ "value": 1.5479280058437808
+ },
+ {
+ "date": "2021-11-30",
+ "value": 1.53195768081498
+ },
+ {
+ "date": "2021-12-01",
+ "value": 1.5292512998396683
+ },
+ {
+ "date": "2021-12-02",
+ "value": 1.5448365916109223
+ },
+ {
+ "date": "2021-12-03",
+ "value": 1.549749634560945
+ },
+ {
+ "date": "2021-12-06",
+ "value": 1.5442393816030469
+ },
+ {
+ "date": "2021-12-07",
+ "value": 1.5496776657081066
+ },
+ {
+ "date": "2021-12-08",
+ "value": 1.5378212709834378
+ },
+ {
+ "date": "2021-12-09",
+ "value": 1.5434965395697142
+ },
+ {
+ "date": "2021-12-10",
+ "value": 1.5292903688962725
+ },
+ {
+ "date": "2021-12-13",
+ "value": 1.5346483455390365
+ },
+ {
+ "date": "2021-12-14",
+ "value": 1.5302013126423026
+ },
+ {
+ "date": "2021-12-15",
+ "value": 1.574074918258709
+ },
+ {
+ "date": "2021-12-16",
+ "value": 1.5584019125590098
+ },
+ {
+ "date": "2021-12-17",
+ "value": 1.5818967978216512
+ },
+ {
+ "date": "2021-12-20",
+ "value": 1.5716054435585034
+ },
+ {
+ "date": "2021-12-21",
+ "value": 1.5944534661287695
+ },
+ {
+ "date": "2021-12-22",
+ "value": 1.6272509076359802
+ },
+ {
+ "date": "2021-12-23",
+ "value": 1.6243932504424012
+ },
+ {
+ "date": "2021-12-24",
+ "value": 1.623216594793535
+ },
+ {
+ "date": "2021-12-27",
+ "value": 1.5642290040648228
+ },
+ {
+ "date": "2021-12-28",
+ "value": 1.5906906174522082
+ },
+ {
+ "date": "2021-12-29",
+ "value": 1.6110090549938567
+ },
+ {
+ "date": "2021-12-30",
+ "value": 1.5856808427362976
+ },
+ {
+ "date": "2021-12-31",
+ "value": 1.5945832685272743
+ },
+ {
+ "date": "2022-01-03",
+ "value": 1.6074109807833232
+ },
+ {
+ "date": "2022-01-04",
+ "value": 1.5931579316711673
+ },
+ {
+ "date": "2022-01-05",
+ "value": 1.5750275038133585
+ },
+ {
+ "date": "2022-01-06",
+ "value": 1.5922118107771306
+ },
+ {
+ "date": "2022-01-07",
+ "value": 1.6063668325258647
+ },
+ {
+ "date": "2022-01-10",
+ "value": 1.5903409388158023
+ },
+ {
+ "date": "2022-01-11",
+ "value": 1.6143492871364697
+ },
+ {
+ "date": "2022-01-12",
+ "value": 1.620483667076624
+ },
+ {
+ "date": "2022-01-13",
+ "value": 1.6024358553268598
+ },
+ {
+ "date": "2022-01-14",
+ "value": 1.6248739239684697
+ },
+ {
+ "date": "2022-01-17",
+ "value": 1.6779569922678506
+ },
+ {
+ "date": "2022-01-18",
+ "value": 1.6355769592810765
+ },
+ {
+ "date": "2022-01-19",
+ "value": 1.6511033332190856
+ },
+ {
+ "date": "2022-01-20",
+ "value": 1.660140562699348
+ },
+ {
+ "date": "2022-01-21",
+ "value": 1.6750499994828416
+ },
+ {
+ "date": "2022-01-24",
+ "value": 1.6912664574466951
+ },
+ {
+ "date": "2022-01-25",
+ "value": 1.6647034860183685
+ },
+ {
+ "date": "2022-01-26",
+ "value": 1.6314057973793046
+ },
+ {
+ "date": "2022-01-27",
+ "value": 1.6539567822715302
+ },
+ {
+ "date": "2022-01-28",
+ "value": 1.6659283207585491
+ },
+ {
+ "date": "2022-01-31",
+ "value": 1.633647136873715
+ },
+ {
+ "date": "2022-02-01",
+ "value": 1.6593941650319641
+ },
+ {
+ "date": "2022-02-02",
+ "value": 1.6114011505744288
+ },
+ {
+ "date": "2022-02-03",
+ "value": 1.5913569843063464
+ },
+ {
+ "date": "2022-02-04",
+ "value": 1.6079118780235904
+ },
+ {
+ "date": "2022-02-07",
+ "value": 1.599613129910515
+ },
+ {
+ "date": "2022-02-08",
+ "value": 1.5840910234653691
+ },
+ {
+ "date": "2022-02-09",
+ "value": 1.5692963421848967
+ },
+ {
+ "date": "2022-02-10",
+ "value": 1.5510710893684687
+ },
+ {
+ "date": "2022-02-11",
+ "value": 1.5534421809454158
+ },
+ {
+ "date": "2022-02-14",
+ "value": 1.5509399865078048
+ },
+ {
+ "date": "2022-02-15",
+ "value": 1.587776258178137
+ },
+ {
+ "date": "2022-02-16",
+ "value": 1.5846199993819015
+ },
+ {
+ "date": "2022-02-17",
+ "value": 1.5780516367892181
+ },
+ {
+ "date": "2022-02-18",
+ "value": 1.5667802995498192
+ },
+ {
+ "date": "2022-02-21",
+ "value": 1.56825441464742
+ },
+ {
+ "date": "2022-02-22",
+ "value": 1.5679746336775364
+ },
+ {
+ "date": "2022-02-23",
+ "value": 1.5514863674289379
+ },
+ {
+ "date": "2022-02-24",
+ "value": 1.538486405244788
+ },
+ {
+ "date": "2022-02-25",
+ "value": 1.5387769997820222
+ },
+ {
+ "date": "2022-02-28",
+ "value": 1.5506946139759215
+ },
+ {
+ "date": "2022-03-01",
+ "value": 1.5567885931085987
+ },
+ {
+ "date": "2022-03-02",
+ "value": 1.54838069593086
+ },
+ {
+ "date": "2022-03-03",
+ "value": 1.5706939489024465
+ },
+ {
+ "date": "2022-03-04",
+ "value": 1.5651046180022745
+ },
+ {
+ "date": "2022-03-07",
+ "value": 1.5729997858552889
+ },
+ {
+ "date": "2022-03-08",
+ "value": 1.566968737614085
+ },
+ {
+ "date": "2022-03-09",
+ "value": 1.5870996870822038
+ },
+ {
+ "date": "2022-03-10",
+ "value": 1.5831530011497716
+ },
+ {
+ "date": "2022-03-11",
+ "value": 1.5461632234970888
+ },
+ {
+ "date": "2022-03-14",
+ "value": 1.5881653919855434
+ },
+ {
+ "date": "2022-03-15",
+ "value": 1.5836420654218597
+ },
+ {
+ "date": "2022-03-16",
+ "value": 1.5981064720618103
+ },
+ {
+ "date": "2022-03-17",
+ "value": 1.62648972232015
+ },
+ {
+ "date": "2022-03-18",
+ "value": 1.6349246038437146
+ },
+ {
+ "date": "2022-03-21",
+ "value": 1.6201117541991252
+ },
+ {
+ "date": "2022-03-22",
+ "value": 1.587921312110534
+ },
+ {
+ "date": "2022-03-23",
+ "value": 1.5651854774013658
+ },
+ {
+ "date": "2022-03-24",
+ "value": 1.5713531940379684
+ },
+ {
+ "date": "2022-03-25",
+ "value": 1.561370998340176
+ },
+ {
+ "date": "2022-03-28",
+ "value": 1.538113053515527
+ },
+ {
+ "date": "2022-03-29",
+ "value": 1.5433683929781286
+ },
+ {
+ "date": "2022-03-30",
+ "value": 1.5443015440141064
+ },
+ {
+ "date": "2022-03-31",
+ "value": 1.5217717571841756
+ },
+ {
+ "date": "2022-04-01",
+ "value": 1.535306582858655
+ },
+ {
+ "date": "2022-04-04",
+ "value": 1.55397010540345
+ },
+ {
+ "date": "2022-04-05",
+ "value": 1.5506676537551656
+ },
+ {
+ "date": "2022-04-06",
+ "value": 1.5314185689532167
+ },
+ {
+ "date": "2022-04-07",
+ "value": 1.5596707816399535
+ },
+ {
+ "date": "2022-04-08",
+ "value": 1.532151896510456
+ },
+ {
+ "date": "2022-04-11",
+ "value": 1.5335954285356692
+ },
+ {
+ "date": "2022-04-12",
+ "value": 1.5100610018461769
+ },
+ {
+ "date": "2022-04-13",
+ "value": 1.5113119914127169
+ },
+ {
+ "date": "2022-04-14",
+ "value": 1.5077691548314545
+ },
+ {
+ "date": "2022-04-15",
+ "value": 1.5166937479423228
+ },
+ {
+ "date": "2022-04-18",
+ "value": 1.5041289058423408
+ },
+ {
+ "date": "2022-04-19",
+ "value": 1.467824341819983
+ },
+ {
+ "date": "2022-04-20",
+ "value": 1.4823472338869743
+ },
+ {
+ "date": "2022-04-21",
+ "value": 1.4791637424449022
+ },
+ {
+ "date": "2022-04-22",
+ "value": 1.4825064316343075
+ },
+ {
+ "date": "2022-04-25",
+ "value": 1.4772004366944818
+ },
+ {
+ "date": "2022-04-26",
+ "value": 1.490640864239792
+ },
+ {
+ "date": "2022-04-27",
+ "value": 1.4720628144730035
+ },
+ {
+ "date": "2022-04-28",
+ "value": 1.4596762992572927
+ },
+ {
+ "date": "2022-04-29",
+ "value": 1.452170032048331
+ },
+ {
+ "date": "2022-05-02",
+ "value": 1.465342510875393
+ },
+ {
+ "date": "2022-05-03",
+ "value": 1.4873945721839743
+ },
+ {
+ "date": "2022-05-04",
+ "value": 1.5052324585009766
+ },
+ {
+ "date": "2022-05-05",
+ "value": 1.5281830224875794
+ },
+ {
+ "date": "2022-05-06",
+ "value": 1.5409433085602433
+ },
+ {
+ "date": "2022-05-09",
+ "value": 1.568913118792642
+ },
+ {
+ "date": "2022-05-10",
+ "value": 1.558785017867175
+ },
+ {
+ "date": "2022-05-11",
+ "value": 1.6047134582125446
+ },
+ {
+ "date": "2022-05-12",
+ "value": 1.5946794484213864
+ },
+ {
+ "date": "2022-05-13",
+ "value": 1.5670842142677321
+ },
+ {
+ "date": "2022-05-16",
+ "value": 1.581463574168348
+ },
+ {
+ "date": "2022-05-17",
+ "value": 1.5684505168996712
+ },
+ {
+ "date": "2022-05-18",
+ "value": 1.5539429908909457
+ },
+ {
+ "date": "2022-05-19",
+ "value": 1.535502118770723
+ },
+ {
+ "date": "2022-05-20",
+ "value": 1.5320377857625895
+ },
+ {
+ "date": "2022-05-23",
+ "value": 1.5426227790967655
+ },
+ {
+ "date": "2022-05-24",
+ "value": 1.5662747812666553
+ },
+ {
+ "date": "2022-05-25",
+ "value": 1.5877239180472982
+ },
+ {
+ "date": "2022-05-26",
+ "value": 1.582331846430933
+ },
+ {
+ "date": "2022-05-27",
+ "value": 1.5794562148656126
+ },
+ {
+ "date": "2022-05-30",
+ "value": 1.5686845833951877
+ },
+ {
+ "date": "2022-05-31",
+ "value": 1.560509024955579
+ },
+ {
+ "date": "2022-06-01",
+ "value": 1.5298321313593877
+ },
+ {
+ "date": "2022-06-02",
+ "value": 1.5332096950286427
+ },
+ {
+ "date": "2022-06-03",
+ "value": 1.5396746378019222
+ },
+ {
+ "date": "2022-06-06",
+ "value": 1.536964135443451
+ },
+ {
+ "date": "2022-06-07",
+ "value": 1.5299910308307474
+ },
+ {
+ "date": "2022-06-08",
+ "value": 1.5225970283347763
+ },
+ {
+ "date": "2022-06-09",
+ "value": 1.5507473218380567
+ },
+ {
+ "date": "2022-06-10",
+ "value": 1.560949077791851
+ },
+ {
+ "date": "2022-06-13",
+ "value": 1.5571914543917138
+ },
+ {
+ "date": "2022-06-14",
+ "value": 1.547135409090711
+ },
+ {
+ "date": "2022-06-15",
+ "value": 1.5394153129675305
+ },
+ {
+ "date": "2022-06-16",
+ "value": 1.5518000244335088
+ },
+ {
+ "date": "2022-06-17",
+ "value": 1.546615876649824
+ },
+ {
+ "date": "2022-06-20",
+ "value": 1.5415620005568358
+ },
+ {
+ "date": "2022-06-21",
+ "value": 1.530792190961058
+ },
+ {
+ "date": "2022-06-22",
+ "value": 1.5176767891928626
+ },
+ {
+ "date": "2022-06-23",
+ "value": 1.5244317488618577
+ },
+ {
+ "date": "2022-06-24",
+ "value": 1.5013640127547148
+ },
+ {
+ "date": "2022-06-27",
+ "value": 1.5130370160266156
+ },
+ {
+ "date": "2022-06-28",
+ "value": 1.5093559681666207
+ },
+ {
+ "date": "2022-06-29",
+ "value": 1.5155701766796095
+ },
+ {
+ "date": "2022-06-30",
+ "value": 1.5260109911384052
+ },
+ {
+ "date": "2022-07-01",
+ "value": 1.518862925970409
+ },
+ {
+ "date": "2022-07-04",
+ "value": 1.5369290417421
+ },
+ {
+ "date": "2022-07-05",
+ "value": 1.514941830640315
+ },
+ {
+ "date": "2022-07-06",
+ "value": 1.5192203554770194
+ },
+ {
+ "date": "2022-07-07",
+ "value": 1.4994698111994265
+ },
+ {
+ "date": "2022-07-08",
+ "value": 1.4587702504775208
+ },
+ {
+ "date": "2022-07-11",
+ "value": 1.4351358527022298
+ },
+ {
+ "date": "2022-07-12",
+ "value": 1.4296489620334651
+ },
+ {
+ "date": "2022-07-13",
+ "value": 1.4484602812672935
+ },
+ {
+ "date": "2022-07-14",
+ "value": 1.4847983444714659
+ },
+ {
+ "date": "2022-07-15",
+ "value": 1.4750883076193522
+ },
+ {
+ "date": "2022-07-18",
+ "value": 1.4742712115271843
+ },
+ {
+ "date": "2022-07-19",
+ "value": 1.487866980543509
+ },
+ {
+ "date": "2022-07-20",
+ "value": 1.4743851114977577
+ },
+ {
+ "date": "2022-07-21",
+ "value": 1.4742399349920083
+ },
+ {
+ "date": "2022-07-22",
+ "value": 1.4446741197698423
+ },
+ {
+ "date": "2022-07-25",
+ "value": 1.4106218436239761
+ },
+ {
+ "date": "2022-07-26",
+ "value": 1.4049328089120685
+ },
+ {
+ "date": "2022-07-27",
+ "value": 1.3895542933975888
+ },
+ {
+ "date": "2022-07-28",
+ "value": 1.3895361748552562
+ },
+ {
+ "date": "2022-07-29",
+ "value": 1.3675731432048988
+ },
+ {
+ "date": "2022-08-01",
+ "value": 1.3452385715111939
+ },
+ {
+ "date": "2022-08-02",
+ "value": 1.3513612578314185
+ },
+ {
+ "date": "2022-08-03",
+ "value": 1.387374096396823
+ },
+ {
+ "date": "2022-08-04",
+ "value": 1.4263476667456083
+ },
+ {
+ "date": "2022-08-05",
+ "value": 1.4408555444114535
+ },
+ {
+ "date": "2022-08-08",
+ "value": 1.450228506020597
+ },
+ {
+ "date": "2022-08-09",
+ "value": 1.4720690219890726
+ },
+ {
+ "date": "2022-08-10",
+ "value": 1.4744832241134884
+ },
+ {
+ "date": "2022-08-11",
+ "value": 1.4573832150606392
+ },
+ {
+ "date": "2022-08-12",
+ "value": 1.4411535118114978
+ },
+ {
+ "date": "2022-08-15",
+ "value": 1.4361007379773003
+ },
+ {
+ "date": "2022-08-16",
+ "value": 1.4470260199059162
+ },
+ {
+ "date": "2022-08-17",
+ "value": 1.4490719723227705
+ },
+ {
+ "date": "2022-08-18",
+ "value": 1.4449033635181234
+ },
+ {
+ "date": "2022-08-19",
+ "value": 1.4823665189164166
+ },
+ {
+ "date": "2022-08-22",
+ "value": 1.5049184909213813
+ },
+ {
+ "date": "2022-08-23",
+ "value": 1.5231857233638852
+ },
+ {
+ "date": "2022-08-24",
+ "value": 1.5355755682256211
+ },
+ {
+ "date": "2022-08-25",
+ "value": 1.565487967026368
+ },
+ {
+ "date": "2022-08-26",
+ "value": 1.6081318303488599
+ },
+ {
+ "date": "2022-08-29",
+ "value": 1.6490053883779598
+ },
+ {
+ "date": "2022-08-30",
+ "value": 1.687794372341827
+ },
+ {
+ "date": "2022-08-31",
+ "value": 1.708397258011698
+ },
+ {
+ "date": "2022-09-01",
+ "value": 1.6940286991424056
+ },
+ {
+ "date": "2022-09-02",
+ "value": 1.7167333902548585
+ },
+ {
+ "date": "2022-09-05",
+ "value": 1.6758366321190372
+ },
+ {
+ "date": "2022-09-06",
+ "value": 1.6531123185626704
+ },
+ {
+ "date": "2022-09-07",
+ "value": 1.622651313780943
+ },
+ {
+ "date": "2022-09-08",
+ "value": 1.609150529054745
+ },
+ {
+ "date": "2022-09-09",
+ "value": 1.6295984783732864
+ },
+ {
+ "date": "2022-09-12",
+ "value": 1.6439109246590768
+ },
+ {
+ "date": "2022-09-13",
+ "value": 1.6413048774422225
+ },
+ {
+ "date": "2022-09-14",
+ "value": 1.6269727438118897
+ },
+ {
+ "date": "2022-09-15",
+ "value": 1.646707974963572
+ },
+ {
+ "date": "2022-09-16",
+ "value": 1.6662076915123043
+ },
+ {
+ "date": "2022-09-19",
+ "value": 1.6682942546162989
+ },
+ {
+ "date": "2022-09-20",
+ "value": 1.6194171276538407
+ },
+ {
+ "date": "2022-09-21",
+ "value": 1.6417982628922556
+ },
+ {
+ "date": "2022-09-22",
+ "value": 1.6456330319034709
+ },
+ {
+ "date": "2022-09-23",
+ "value": 1.6601508372243556
+ },
+ {
+ "date": "2022-09-26",
+ "value": 1.6573941690063623
+ },
+ {
+ "date": "2022-09-27",
+ "value": 1.6727302133264812
+ },
+ {
+ "date": "2022-09-28",
+ "value": 1.6279794023507217
+ },
+ {
+ "date": "2022-09-29",
+ "value": 1.6411790879193044
+ },
+ {
+ "date": "2022-09-30",
+ "value": 1.635200363199699
+ },
+ {
+ "date": "2022-10-03",
+ "value": 1.6324665611623488
+ },
+ {
+ "date": "2022-10-04",
+ "value": 1.6499512852517595
+ },
+ {
+ "date": "2022-10-05",
+ "value": 1.6674673455507478
+ },
+ {
+ "date": "2022-10-06",
+ "value": 1.6881397950488088
+ },
+ {
+ "date": "2022-10-07",
+ "value": 1.7030800890266748
+ },
+ {
+ "date": "2022-10-10",
+ "value": 1.692066742190576
+ },
+ {
+ "date": "2022-10-11",
+ "value": 1.695883547498663
+ },
+ {
+ "date": "2022-10-12",
+ "value": 1.692461395965446
+ },
+ {
+ "date": "2022-10-13",
+ "value": 1.6792085606236202
+ },
+ {
+ "date": "2022-10-14",
+ "value": 1.6943914949913503
+ },
+ {
+ "date": "2022-10-17",
+ "value": 1.707689589146731
+ },
+ {
+ "date": "2022-10-18",
+ "value": 1.7213210470836076
+ },
+ {
+ "date": "2022-10-19",
+ "value": 1.7127239438247601
+ },
+ {
+ "date": "2022-10-20",
+ "value": 1.6945663168407794
+ },
+ {
+ "date": "2022-10-21",
+ "value": 1.6684932702379416
+ },
+ {
+ "date": "2022-10-24",
+ "value": 1.6902650005295932
+ },
+ {
+ "date": "2022-10-25",
+ "value": 1.6987026309945406
+ },
+ {
+ "date": "2022-10-26",
+ "value": 1.6675807513898973
+ },
+ {
+ "date": "2022-10-27",
+ "value": 1.6761173151300062
+ },
+ {
+ "date": "2022-10-28",
+ "value": 1.6506448483517446
+ },
+ {
+ "date": "2022-10-31",
+ "value": 1.627678845155276
+ },
+ {
+ "date": "2022-11-01",
+ "value": 1.6096761314958863
+ },
+ {
+ "date": "2022-11-02",
+ "value": 1.5544938279337206
+ },
+ {
+ "date": "2022-11-03",
+ "value": 1.5542312290340299
+ },
+ {
+ "date": "2022-11-04",
+ "value": 1.5577683816395531
+ },
+ {
+ "date": "2022-11-07",
+ "value": 1.5289854337659372
+ },
+ {
+ "date": "2022-11-08",
+ "value": 1.5445988333038156
+ },
+ {
+ "date": "2022-11-09",
+ "value": 1.5353781005508458
+ },
+ {
+ "date": "2022-11-10",
+ "value": 1.5509838886121772
+ },
+ {
+ "date": "2022-11-11",
+ "value": 1.5546354116529684
+ },
+ {
+ "date": "2022-11-14",
+ "value": 1.556375756431782
+ },
+ {
+ "date": "2022-11-15",
+ "value": 1.5621004239277525
+ },
+ {
+ "date": "2022-11-16",
+ "value": 1.5740195520876066
+ },
+ {
+ "date": "2022-11-17",
+ "value": 1.566339920352687
+ },
+ {
+ "date": "2022-11-18",
+ "value": 1.54847817523999
+ },
+ {
+ "date": "2022-11-21",
+ "value": 1.54947472372656
+ },
+ {
+ "date": "2022-11-22",
+ "value": 1.5461945306650797
+ },
+ {
+ "date": "2022-11-23",
+ "value": 1.5407588698567045
+ },
+ {
+ "date": "2022-11-24",
+ "value": 1.5631915891887207
+ },
+ {
+ "date": "2022-11-25",
+ "value": 1.583064320351204
+ },
+ {
+ "date": "2022-11-28",
+ "value": 1.5751078309564475
+ },
+ {
+ "date": "2022-11-29",
+ "value": 1.5520781585627188
+ },
+ {
+ "date": "2022-11-30",
+ "value": 1.5577544030958999
+ },
+ {
+ "date": "2022-12-01",
+ "value": 1.5523814639371254
+ },
+ {
+ "date": "2022-12-02",
+ "value": 1.5379484704433584
+ },
+ {
+ "date": "2022-12-05",
+ "value": 1.5190954396288403
+ },
+ {
+ "date": "2022-12-06",
+ "value": 1.5001842715041467
+ },
+ {
+ "date": "2022-12-07",
+ "value": 1.4744329983342876
+ },
+ {
+ "date": "2022-12-08",
+ "value": 1.4626758793544563
+ },
+ {
+ "date": "2022-12-09",
+ "value": 1.4490403155398839
+ },
+ {
+ "date": "2022-12-12",
+ "value": 1.4560087283963163
+ },
+ {
+ "date": "2022-12-13",
+ "value": 1.4959323232220432
+ },
+ {
+ "date": "2022-12-14",
+ "value": 1.4903287526144005
+ },
+ {
+ "date": "2022-12-15",
+ "value": 1.471468079576157
+ },
+ {
+ "date": "2022-12-16",
+ "value": 1.482816168823276
+ },
+ {
+ "date": "2022-12-19",
+ "value": 1.4880126273302419
+ },
+ {
+ "date": "2022-12-20",
+ "value": 1.4902350501447592
+ },
+ {
+ "date": "2022-12-21",
+ "value": 1.501598340371527
+ },
+ {
+ "date": "2022-12-22",
+ "value": 1.5276535208557593
+ },
+ {
+ "date": "2022-12-23",
+ "value": 1.5257196310410437
+ },
+ {
+ "date": "2022-12-26",
+ "value": 1.5136882372958493
+ },
+ {
+ "date": "2022-12-27",
+ "value": 1.4929888203046435
+ },
+ {
+ "date": "2022-12-28",
+ "value": 1.4727450386505863
+ },
+ {
+ "date": "2022-12-29",
+ "value": 1.4795185687169188
+ },
+ {
+ "date": "2022-12-30",
+ "value": 1.5091437379482449
+ },
+ {
+ "date": "2023-01-02",
+ "value": 1.522302144675925
+ },
+ {
+ "date": "2023-01-03",
+ "value": 1.489998220563769
+ },
+ {
+ "date": "2023-01-04",
+ "value": 1.4934510331748854
+ },
+ {
+ "date": "2023-01-05",
+ "value": 1.5188349239299384
+ },
+ {
+ "date": "2023-01-06",
+ "value": 1.5132633920578298
+ },
+ {
+ "date": "2023-01-09",
+ "value": 1.533929418208088
+ },
+ {
+ "date": "2023-01-10",
+ "value": 1.5416128389387853
+ },
+ {
+ "date": "2023-01-11",
+ "value": 1.5238798298214387
+ },
+ {
+ "date": "2023-01-12",
+ "value": 1.529785472758622
+ },
+ {
+ "date": "2023-01-13",
+ "value": 1.5407012012469579
+ },
+ {
+ "date": "2023-01-16",
+ "value": 1.587181198021526
+ },
+ {
+ "date": "2023-01-17",
+ "value": 1.6054819211647422
+ },
+ {
+ "date": "2023-01-18",
+ "value": 1.626862235554488
+ },
+ {
+ "date": "2023-01-19",
+ "value": 1.6071845088942618
+ },
+ {
+ "date": "2023-01-20",
+ "value": 1.5830358423063384
+ },
+ {
+ "date": "2023-01-23",
+ "value": 1.621114006927946
+ },
+ {
+ "date": "2023-01-24",
+ "value": 1.6130654001090572
+ },
+ {
+ "date": "2023-01-25",
+ "value": 1.6009005524913442
+ },
+ {
+ "date": "2023-01-26",
+ "value": 1.6134605528048587
+ },
+ {
+ "date": "2023-01-27",
+ "value": 1.6354720714403188
+ },
+ {
+ "date": "2023-01-30",
+ "value": 1.6294971393256428
+ },
+ {
+ "date": "2023-01-31",
+ "value": 1.6619581056056343
+ },
+ {
+ "date": "2023-02-01",
+ "value": 1.6422601351299477
+ },
+ {
+ "date": "2023-02-02",
+ "value": 1.6290697088570545
+ },
+ {
+ "date": "2023-02-03",
+ "value": 1.6214322644095964
+ },
+ {
+ "date": "2023-02-06",
+ "value": 1.6333603064217255
+ },
+ {
+ "date": "2023-02-07",
+ "value": 1.6177891045746744
+ },
+ {
+ "date": "2023-02-08",
+ "value": 1.5698718578038835
+ },
+ {
+ "date": "2023-02-09",
+ "value": 1.5407479214118955
+ },
+ {
+ "date": "2023-02-10",
+ "value": 1.5119861445614493
+ },
+ {
+ "date": "2023-02-13",
+ "value": 1.5226010541403932
+ },
+ {
+ "date": "2023-02-14",
+ "value": 1.4988063240809006
+ },
+ {
+ "date": "2023-02-15",
+ "value": 1.4779398893127778
+ },
+ {
+ "date": "2023-02-16",
+ "value": 1.4835000462390642
+ },
+ {
+ "date": "2023-02-17",
+ "value": 1.4813842228254681
+ },
+ {
+ "date": "2023-02-20",
+ "value": 1.5074462323590043
+ },
+ {
+ "date": "2023-02-21",
+ "value": 1.5118798114873266
+ },
+ {
+ "date": "2023-02-22",
+ "value": 1.5175145354084114
+ },
+ {
+ "date": "2023-02-23",
+ "value": 1.493261684944487
+ },
+ {
+ "date": "2023-02-24",
+ "value": 1.4978923143284606
+ },
+ {
+ "date": "2023-02-27",
+ "value": 1.4693342459393604
+ },
+ {
+ "date": "2023-02-28",
+ "value": 1.4538939813210132
+ },
+ {
+ "date": "2023-03-01",
+ "value": 1.453768096311204
+ },
+ {
+ "date": "2023-03-02",
+ "value": 1.4675832972965297
+ },
+ {
+ "date": "2023-03-03",
+ "value": 1.4408994858494362
+ },
+ {
+ "date": "2023-03-06",
+ "value": 1.4596579323187706
+ },
+ {
+ "date": "2023-03-07",
+ "value": 1.4348840632204878
+ },
+ {
+ "date": "2023-03-08",
+ "value": 1.4116665202441498
+ },
+ {
+ "date": "2023-03-09",
+ "value": 1.4413041669648468
+ },
+ {
+ "date": "2023-03-10",
+ "value": 1.438421749057801
+ },
+ {
+ "date": "2023-03-13",
+ "value": 1.430071854611638
+ },
+ {
+ "date": "2023-03-14",
+ "value": 1.4758912026887554
+ },
+ {
+ "date": "2023-03-15",
+ "value": 1.4807011985308973
+ },
+ {
+ "date": "2023-03-16",
+ "value": 1.5010960195740877
+ },
+ {
+ "date": "2023-03-17",
+ "value": 1.506533235058802
+ },
+ {
+ "date": "2023-03-20",
+ "value": 1.5159105470184187
+ },
+ {
+ "date": "2023-03-21",
+ "value": 1.4992241345211044
+ },
+ {
+ "date": "2023-03-22",
+ "value": 1.4774923537720874
+ },
+ {
+ "date": "2023-03-23",
+ "value": 1.457920218523628
+ },
+ {
+ "date": "2023-03-24",
+ "value": 1.464770829947661
+ },
+ {
+ "date": "2023-03-27",
+ "value": 1.4911106783704893
+ },
+ {
+ "date": "2023-03-28",
+ "value": 1.5011983820123198
+ },
+ {
+ "date": "2023-03-29",
+ "value": 1.510220259500732
+ },
+ {
+ "date": "2023-03-30",
+ "value": 1.548071598770271
+ },
+ {
+ "date": "2023-03-31",
+ "value": 1.5636913118544262
+ },
+ {
+ "date": "2023-04-03",
+ "value": 1.5277830969827968
+ },
+ {
+ "date": "2023-04-04",
+ "value": 1.5181594282105384
+ },
+ {
+ "date": "2023-04-05",
+ "value": 1.5019002819454037
+ },
+ {
+ "date": "2023-04-06",
+ "value": 1.4860501842175278
+ },
+ {
+ "date": "2023-04-07",
+ "value": 1.4856674533390535
+ },
+ {
+ "date": "2023-04-10",
+ "value": 1.506709049294476
+ },
+ {
+ "date": "2023-04-11",
+ "value": 1.4970262507543293
+ },
+ {
+ "date": "2023-04-12",
+ "value": 1.5261617191977226
+ },
+ {
+ "date": "2023-04-13",
+ "value": 1.5334072823507698
+ },
+ {
+ "date": "2023-04-14",
+ "value": 1.53400401883528
+ },
+ {
+ "date": "2023-04-17",
+ "value": 1.5580779597257657
+ },
+ {
+ "date": "2023-04-18",
+ "value": 1.584122070547183
+ },
+ {
+ "date": "2023-04-19",
+ "value": 1.60955239268984
+ },
+ {
+ "date": "2023-04-20",
+ "value": 1.5935115537186406
+ },
+ {
+ "date": "2023-04-21",
+ "value": 1.5732194860647335
+ },
+ {
+ "date": "2023-04-24",
+ "value": 1.5653565441202253
+ },
+ {
+ "date": "2023-04-25",
+ "value": 1.59438375751017
+ },
+ {
+ "date": "2023-04-26",
+ "value": 1.5721398620036304
+ },
+ {
+ "date": "2023-04-27",
+ "value": 1.5580333244003095
+ },
+ {
+ "date": "2023-04-28",
+ "value": 1.5620713279493155
+ },
+ {
+ "date": "2023-05-01",
+ "value": 1.5420504769703478
+ },
+ {
+ "date": "2023-05-02",
+ "value": 1.5480594837583799
+ },
+ {
+ "date": "2023-05-03",
+ "value": 1.535841258077843
+ },
+ {
+ "date": "2023-05-04",
+ "value": 1.5560964379427926
+ },
+ {
+ "date": "2023-05-05",
+ "value": 1.554406229232912
+ },
+ {
+ "date": "2023-05-08",
+ "value": 1.5218688721434739
+ },
+ {
+ "date": "2023-05-09",
+ "value": 1.54293047707738
+ },
+ {
+ "date": "2023-05-10",
+ "value": 1.5405428889386028
+ },
+ {
+ "date": "2023-05-11",
+ "value": 1.5309968045708806
+ },
+ {
+ "date": "2023-05-12",
+ "value": 1.5378900562338167
+ },
+ {
+ "date": "2023-05-15",
+ "value": 1.5392325508168718
+ },
+ {
+ "date": "2023-05-16",
+ "value": 1.5445581062165366
+ },
+ {
+ "date": "2023-05-17",
+ "value": 1.5432282440579577
+ },
+ {
+ "date": "2023-05-18",
+ "value": 1.544451419763315
+ },
+ {
+ "date": "2023-05-19",
+ "value": 1.5203043522229829
+ },
+ {
+ "date": "2023-05-22",
+ "value": 1.5357260020285826
+ },
+ {
+ "date": "2023-05-23",
+ "value": 1.49980811275992
+ },
+ {
+ "date": "2023-05-24",
+ "value": 1.509471024526901
+ },
+ {
+ "date": "2023-05-25",
+ "value": 1.5250161196075147
+ },
+ {
+ "date": "2023-05-26",
+ "value": 1.5154443150768366
+ },
+ {
+ "date": "2023-05-29",
+ "value": 1.5056353242018086
+ },
+ {
+ "date": "2023-05-30",
+ "value": 1.4992577534397709
+ },
+ {
+ "date": "2023-05-31",
+ "value": 1.504441635356661
+ },
+ {
+ "date": "2023-06-01",
+ "value": 1.5256973237720315
+ },
+ {
+ "date": "2023-06-02",
+ "value": 1.5051992178362337
+ },
+ {
+ "date": "2023-06-05",
+ "value": 1.5317982309694458
+ },
+ {
+ "date": "2023-06-06",
+ "value": 1.5554734895535856
+ },
+ {
+ "date": "2023-06-07",
+ "value": 1.5602134060759412
+ },
+ {
+ "date": "2023-06-08",
+ "value": 1.5577764214340728
+ },
+ {
+ "date": "2023-06-09",
+ "value": 1.522219523299327
+ },
+ {
+ "date": "2023-06-12",
+ "value": 1.5216202175337963
+ },
+ {
+ "date": "2023-06-13",
+ "value": 1.5073194839051491
+ },
+ {
+ "date": "2023-06-14",
+ "value": 1.519033685361743
+ },
+ {
+ "date": "2023-06-15",
+ "value": 1.5388178523232559
+ },
+ {
+ "date": "2023-06-16",
+ "value": 1.5441464836449075
+ },
+ {
+ "date": "2023-06-19",
+ "value": 1.5323661491606921
+ },
+ {
+ "date": "2023-06-20",
+ "value": 1.5326033126911107
+ },
+ {
+ "date": "2023-06-21",
+ "value": 1.5122216214149709
+ },
+ {
+ "date": "2023-06-22",
+ "value": 1.488993354273277
+ },
+ {
+ "date": "2023-06-23",
+ "value": 1.4863568677070944
+ },
+ {
+ "date": "2023-06-26",
+ "value": 1.4942052210170047
+ },
+ {
+ "date": "2023-06-27",
+ "value": 1.4916956249284838
+ },
+ {
+ "date": "2023-06-28",
+ "value": 1.4761566855368982
+ },
+ {
+ "date": "2023-06-29",
+ "value": 1.4740068592546338
+ },
+ {
+ "date": "2023-06-30",
+ "value": 1.4683243562289428
+ },
+ {
+ "date": "2023-07-03",
+ "value": 1.4770358034518702
+ },
+ {
+ "date": "2023-07-04",
+ "value": 1.4682419612704665
+ },
+ {
+ "date": "2023-07-05",
+ "value": 1.464099402634614
+ },
+ {
+ "date": "2023-07-06",
+ "value": 1.4976024278992581
+ },
+ {
+ "date": "2023-07-07",
+ "value": 1.530201372772038
+ },
+ {
+ "date": "2023-07-10",
+ "value": 1.5167191344764843
+ },
+ {
+ "date": "2023-07-11",
+ "value": 1.5295564463368387
+ },
+ {
+ "date": "2023-07-12",
+ "value": 1.547464165669784
+ },
+ {
+ "date": "2023-07-13",
+ "value": 1.5154378647260873
+ },
+ {
+ "date": "2023-07-14",
+ "value": 1.5091988424906986
+ },
+ {
+ "date": "2023-07-17",
+ "value": 1.5200792729347965
+ },
+ {
+ "date": "2023-07-18",
+ "value": 1.5190684969401242
+ },
+ {
+ "date": "2023-07-19",
+ "value": 1.506539592387386
+ },
+ {
+ "date": "2023-07-20",
+ "value": 1.4794921702301633
+ },
+ {
+ "date": "2023-07-21",
+ "value": 1.5012454675541678
+ },
+ {
+ "date": "2023-07-24",
+ "value": 1.4871513944651533
+ },
+ {
+ "date": "2023-07-25",
+ "value": 1.5059939157909843
+ },
+ {
+ "date": "2023-07-26",
+ "value": 1.503861659548505
+ },
+ {
+ "date": "2023-07-27",
+ "value": 1.501173650792633
+ },
+ {
+ "date": "2023-07-28",
+ "value": 1.532186970619273
+ },
+ {
+ "date": "2023-07-31",
+ "value": 1.5255594023813484
+ },
+ {
+ "date": "2023-08-01",
+ "value": 1.498732325078606
+ },
+ {
+ "date": "2023-08-02",
+ "value": 1.5419899703006321
+ },
+ {
+ "date": "2023-08-03",
+ "value": 1.561752370910934
+ },
+ {
+ "date": "2023-08-04",
+ "value": 1.5511889938602104
+ },
+ {
+ "date": "2023-08-07",
+ "value": 1.519277786908953
+ },
+ {
+ "date": "2023-08-08",
+ "value": 1.5209630454874814
+ },
+ {
+ "date": "2023-08-09",
+ "value": 1.537881538104266
+ },
+ {
+ "date": "2023-08-10",
+ "value": 1.544371743178801
+ },
+ {
+ "date": "2023-08-11",
+ "value": 1.5075676545576882
+ },
+ {
+ "date": "2023-08-14",
+ "value": 1.4660717540740338
+ },
+ {
+ "date": "2023-08-15",
+ "value": 1.4738258755398483
+ },
+ {
+ "date": "2023-08-16",
+ "value": 1.5058600694136546
+ },
+ {
+ "date": "2023-08-17",
+ "value": 1.4913777989536372
+ },
+ {
+ "date": "2023-08-18",
+ "value": 1.4795426724735454
+ },
+ {
+ "date": "2023-08-21",
+ "value": 1.469365687401806
+ },
+ {
+ "date": "2023-08-22",
+ "value": 1.452030365063124
+ },
+ {
+ "date": "2023-08-23",
+ "value": 1.4647036792632933
+ },
+ {
+ "date": "2023-08-24",
+ "value": 1.4713375281704248
+ },
+ {
+ "date": "2023-08-25",
+ "value": 1.471994930361738
+ },
+ {
+ "date": "2023-08-28",
+ "value": 1.4667344480442368
+ },
+ {
+ "date": "2023-08-29",
+ "value": 1.4796923545793361
+ },
+ {
+ "date": "2023-08-30",
+ "value": 1.442123011053604
+ },
+ {
+ "date": "2023-08-31",
+ "value": 1.4471383330519267
+ },
+ {
+ "date": "2023-09-01",
+ "value": 1.441606464102859
+ },
+ {
+ "date": "2023-09-04",
+ "value": 1.4669538763424048
+ },
+ {
+ "date": "2023-09-05",
+ "value": 1.462798037532184
+ },
+ {
+ "date": "2023-09-06",
+ "value": 1.4661500056119325
+ },
+ {
+ "date": "2023-09-07",
+ "value": 1.4593271579512124
+ },
+ {
+ "date": "2023-09-08",
+ "value": 1.4576432128098378
+ },
+ {
+ "date": "2023-09-11",
+ "value": 1.4494117258529176
+ },
+ {
+ "date": "2023-09-12",
+ "value": 1.4592425392562316
+ },
+ {
+ "date": "2023-09-13",
+ "value": 1.477114952055161
+ },
+ {
+ "date": "2023-09-14",
+ "value": 1.4757963474519988
+ },
+ {
+ "date": "2023-09-15",
+ "value": 1.4999419928041844
+ },
+ {
+ "date": "2023-09-18",
+ "value": 1.4977171083854728
+ },
+ {
+ "date": "2023-09-19",
+ "value": 1.4771228645039152
+ },
+ {
+ "date": "2023-09-20",
+ "value": 1.495779446544687
+ },
+ {
+ "date": "2023-09-21",
+ "value": 1.481321766160202
+ },
+ {
+ "date": "2023-09-22",
+ "value": 1.4794721284674173
+ },
+ {
+ "date": "2023-09-25",
+ "value": 1.4664593337496006
+ },
+ {
+ "date": "2023-09-26",
+ "value": 1.456263629329746
+ },
+ {
+ "date": "2023-09-27",
+ "value": 1.450208029328721
+ },
+ {
+ "date": "2023-09-28",
+ "value": 1.434831690938347
+ },
+ {
+ "date": "2023-09-29",
+ "value": 1.4318162261874827
+ },
+ {
+ "date": "2023-10-02",
+ "value": 1.444828414573708
+ },
+ {
+ "date": "2023-10-03",
+ "value": 1.460442598872023
+ },
+ {
+ "date": "2023-10-04",
+ "value": 1.4675603201392442
+ },
+ {
+ "date": "2023-10-05",
+ "value": 1.471573065199713
+ },
+ {
+ "date": "2023-10-06",
+ "value": 1.4492898989090648
+ },
+ {
+ "date": "2023-10-09",
+ "value": 1.451515941932419
+ },
+ {
+ "date": "2023-10-10",
+ "value": 1.4423449577516456
+ },
+ {
+ "date": "2023-10-11",
+ "value": 1.444401035682493
+ },
+ {
+ "date": "2023-10-12",
+ "value": 1.4400884021824911
+ },
+ {
+ "date": "2023-10-13",
+ "value": 1.41143509025166
+ },
+ {
+ "date": "2023-10-16",
+ "value": 1.417372953021757
+ },
+ {
+ "date": "2023-10-17",
+ "value": 1.4290333325139346
+ },
+ {
+ "date": "2023-10-18",
+ "value": 1.4212073389341278
+ },
+ {
+ "date": "2023-10-19",
+ "value": 1.4032990804011756
+ },
+ {
+ "date": "2023-10-20",
+ "value": 1.412018639316523
+ },
+ {
+ "date": "2023-10-23",
+ "value": 1.4176643596454193
+ },
+ {
+ "date": "2023-10-24",
+ "value": 1.4253436941042676
+ },
+ {
+ "date": "2023-10-25",
+ "value": 1.4310768559208407
+ },
+ {
+ "date": "2023-10-26",
+ "value": 1.4429996738701076
+ },
+ {
+ "date": "2023-10-27",
+ "value": 1.4462173102596625
+ },
+ {
+ "date": "2023-10-30",
+ "value": 1.4338789477939164
+ },
+ {
+ "date": "2023-10-31",
+ "value": 1.4424783051952437
+ }
+ ],
+ "drawdown": [
+ {
+ "date": "2020-01-02",
+ "value": 0.0
+ },
+ {
+ "date": "2020-01-03",
+ "value": 0.0
+ },
+ {
+ "date": "2020-01-06",
+ "value": -0.0006551711860099951
+ },
+ {
+ "date": "2020-01-07",
+ "value": 0.0
+ },
+ {
+ "date": "2020-01-08",
+ "value": -0.008962437335003681
+ },
+ {
+ "date": "2020-01-09",
+ "value": -0.014497027943747187
+ },
+ {
+ "date": "2020-01-10",
+ "value": -0.017976116074270854
+ },
+ {
+ "date": "2020-01-13",
+ "value": 0.0
+ },
+ {
+ "date": "2020-01-14",
+ "value": 0.0
+ },
+ {
+ "date": "2020-01-15",
+ "value": 0.0
+ },
+ {
+ "date": "2020-01-16",
+ "value": -0.0010511476918617646
+ },
+ {
+ "date": "2020-01-17",
+ "value": 0.0
+ },
+ {
+ "date": "2020-01-20",
+ "value": 0.0
+ },
+ {
+ "date": "2020-01-21",
+ "value": -0.005796624810484263
+ },
+ {
+ "date": "2020-01-22",
+ "value": -0.01862906022170796
+ },
+ {
+ "date": "2020-01-23",
+ "value": -0.035180266978327324
+ },
+ {
+ "date": "2020-01-24",
+ "value": -0.03360968658759522
+ },
+ {
+ "date": "2020-01-27",
+ "value": -0.02623517884366411
+ },
+ {
+ "date": "2020-01-28",
+ "value": -0.012846006714808511
+ },
+ {
+ "date": "2020-01-29",
+ "value": -0.003583210471130416
+ },
+ {
+ "date": "2020-01-30",
+ "value": -3.3662332001860307e-06
+ },
+ {
+ "date": "2020-01-31",
+ "value": 0.0
+ },
+ {
+ "date": "2020-02-03",
+ "value": 0.0
+ },
+ {
+ "date": "2020-02-04",
+ "value": 0.0
+ },
+ {
+ "date": "2020-02-05",
+ "value": -0.0005708258697525448
+ },
+ {
+ "date": "2020-02-06",
+ "value": 0.0
+ },
+ {
+ "date": "2020-02-07",
+ "value": -0.014638000734746082
+ },
+ {
+ "date": "2020-02-10",
+ "value": -0.010025830693528803
+ },
+ {
+ "date": "2020-02-11",
+ "value": -0.0005216386035982179
+ },
+ {
+ "date": "2020-02-12",
+ "value": -0.0030870774217988117
+ },
+ {
+ "date": "2020-02-13",
+ "value": 0.0
+ },
+ {
+ "date": "2020-02-14",
+ "value": -0.00949493177109717
+ },
+ {
+ "date": "2020-02-17",
+ "value": -0.002196458763514153
+ },
+ {
+ "date": "2020-02-18",
+ "value": -0.0012913151185824923
+ },
+ {
+ "date": "2020-02-19",
+ "value": -0.002176698022231749
+ },
+ {
+ "date": "2020-02-20",
+ "value": -0.014027009646693345
+ },
+ {
+ "date": "2020-02-21",
+ "value": -0.00909655634489337
+ },
+ {
+ "date": "2020-02-24",
+ "value": 0.0
+ },
+ {
+ "date": "2020-02-25",
+ "value": -0.008110377685709103
+ },
+ {
+ "date": "2020-02-26",
+ "value": -0.01242026594787915
+ },
+ {
+ "date": "2020-02-27",
+ "value": 0.0
+ },
+ {
+ "date": "2020-02-28",
+ "value": 0.0
+ },
+ {
+ "date": "2020-03-02",
+ "value": 0.0
+ },
+ {
+ "date": "2020-03-03",
+ "value": -0.004724678779101654
+ },
+ {
+ "date": "2020-03-04",
+ "value": 0.0
+ },
+ {
+ "date": "2020-03-05",
+ "value": -0.0038586526285340206
+ },
+ {
+ "date": "2020-03-06",
+ "value": -0.015182139640162795
+ },
+ {
+ "date": "2020-03-09",
+ "value": -0.008255622231294502
+ },
+ {
+ "date": "2020-03-10",
+ "value": -0.008041913196700112
+ },
+ {
+ "date": "2020-03-11",
+ "value": 0.0
+ },
+ {
+ "date": "2020-03-12",
+ "value": -0.015265541131134763
+ },
+ {
+ "date": "2020-03-13",
+ "value": -0.020491634558761795
+ },
+ {
+ "date": "2020-03-16",
+ "value": -0.03216203507091098
+ },
+ {
+ "date": "2020-03-17",
+ "value": -0.04167221354639461
+ },
+ {
+ "date": "2020-03-18",
+ "value": -0.03986810603855073
+ },
+ {
+ "date": "2020-03-19",
+ "value": -0.03400209074765559
+ },
+ {
+ "date": "2020-03-20",
+ "value": -0.05091534344507276
+ },
+ {
+ "date": "2020-03-23",
+ "value": -0.06530772065421453
+ },
+ {
+ "date": "2020-03-24",
+ "value": -0.05467516310222609
+ },
+ {
+ "date": "2020-03-25",
+ "value": -0.05111281975631898
+ },
+ {
+ "date": "2020-03-26",
+ "value": -0.04631279190163495
+ },
+ {
+ "date": "2020-03-27",
+ "value": -0.05245194072302195
+ },
+ {
+ "date": "2020-03-30",
+ "value": -0.0433948930169632
+ },
+ {
+ "date": "2020-03-31",
+ "value": -0.038394214786035996
+ },
+ {
+ "date": "2020-04-01",
+ "value": -0.04845759260960547
+ },
+ {
+ "date": "2020-04-02",
+ "value": -0.050268438578581986
+ },
+ {
+ "date": "2020-04-03",
+ "value": -0.050149343615582764
+ },
+ {
+ "date": "2020-04-06",
+ "value": -0.04538454164826877
+ },
+ {
+ "date": "2020-04-07",
+ "value": -0.0386365642203228
+ },
+ {
+ "date": "2020-04-08",
+ "value": -0.023715812228315647
+ },
+ {
+ "date": "2020-04-09",
+ "value": -0.025423272423515275
+ },
+ {
+ "date": "2020-04-10",
+ "value": -0.03763771772543789
+ },
+ {
+ "date": "2020-04-13",
+ "value": -0.052946017690388536
+ },
+ {
+ "date": "2020-04-14",
+ "value": -0.06773942871908933
+ },
+ {
+ "date": "2020-04-15",
+ "value": -0.07178947442356387
+ },
+ {
+ "date": "2020-04-16",
+ "value": -0.07146757524991287
+ },
+ {
+ "date": "2020-04-17",
+ "value": -0.07672805720944065
+ },
+ {
+ "date": "2020-04-20",
+ "value": -0.06366492971452908
+ },
+ {
+ "date": "2020-04-21",
+ "value": -0.06940173148234074
+ },
+ {
+ "date": "2020-04-22",
+ "value": -0.08040168283814109
+ },
+ {
+ "date": "2020-04-23",
+ "value": -0.0657612124187843
+ },
+ {
+ "date": "2020-04-24",
+ "value": -0.056977255967537
+ },
+ {
+ "date": "2020-04-27",
+ "value": -0.05152084482561492
+ },
+ {
+ "date": "2020-04-28",
+ "value": -0.05151960916523546
+ },
+ {
+ "date": "2020-04-29",
+ "value": -0.05795875104725112
+ },
+ {
+ "date": "2020-04-30",
+ "value": -0.055092518884468644
+ },
+ {
+ "date": "2020-05-01",
+ "value": -0.045062292163039364
+ },
+ {
+ "date": "2020-05-04",
+ "value": -0.04767045264354519
+ },
+ {
+ "date": "2020-05-05",
+ "value": -0.05773429601500302
+ },
+ {
+ "date": "2020-05-06",
+ "value": -0.05911460627252074
+ },
+ {
+ "date": "2020-05-07",
+ "value": -0.057820449880194746
+ },
+ {
+ "date": "2020-05-08",
+ "value": -0.05018604705489016
+ },
+ {
+ "date": "2020-05-11",
+ "value": -0.04588993732814983
+ },
+ {
+ "date": "2020-05-12",
+ "value": -0.041000323401175987
+ },
+ {
+ "date": "2020-05-13",
+ "value": -0.044148224437990824
+ },
+ {
+ "date": "2020-05-14",
+ "value": -0.04342095132639856
+ },
+ {
+ "date": "2020-05-15",
+ "value": -0.02815932625271056
+ },
+ {
+ "date": "2020-05-18",
+ "value": -0.02104057910097179
+ },
+ {
+ "date": "2020-05-19",
+ "value": -0.03813952691375777
+ },
+ {
+ "date": "2020-05-20",
+ "value": -0.03381174555114097
+ },
+ {
+ "date": "2020-05-21",
+ "value": -0.034194355228504
+ },
+ {
+ "date": "2020-05-22",
+ "value": -0.028953343456374014
+ },
+ {
+ "date": "2020-05-25",
+ "value": -0.024800835335239912
+ },
+ {
+ "date": "2020-05-26",
+ "value": -0.015950080110865295
+ },
+ {
+ "date": "2020-05-27",
+ "value": -0.012322615228579581
+ },
+ {
+ "date": "2020-05-28",
+ "value": -0.022900971410227178
+ },
+ {
+ "date": "2020-05-29",
+ "value": -0.01776274962864033
+ },
+ {
+ "date": "2020-06-01",
+ "value": -0.022052623100444646
+ },
+ {
+ "date": "2020-06-02",
+ "value": -0.0187119621196834
+ },
+ {
+ "date": "2020-06-03",
+ "value": -0.011098160182110628
+ },
+ {
+ "date": "2020-06-04",
+ "value": -0.001292789881753853
+ },
+ {
+ "date": "2020-06-05",
+ "value": 0.0
+ },
+ {
+ "date": "2020-06-08",
+ "value": -0.010345720969290206
+ },
+ {
+ "date": "2020-06-09",
+ "value": 0.0
+ },
+ {
+ "date": "2020-06-10",
+ "value": 0.0
+ },
+ {
+ "date": "2020-06-11",
+ "value": 0.0
+ },
+ {
+ "date": "2020-06-12",
+ "value": 0.0
+ },
+ {
+ "date": "2020-06-15",
+ "value": 0.0
+ },
+ {
+ "date": "2020-06-16",
+ "value": 0.0
+ },
+ {
+ "date": "2020-06-17",
+ "value": -0.017029130630299316
+ },
+ {
+ "date": "2020-06-18",
+ "value": -0.01655436204325167
+ },
+ {
+ "date": "2020-06-19",
+ "value": -0.03776742411204259
+ },
+ {
+ "date": "2020-06-22",
+ "value": -0.048829373020565225
+ },
+ {
+ "date": "2020-06-23",
+ "value": -0.03982536568490991
+ },
+ {
+ "date": "2020-06-24",
+ "value": -0.0402936861556471
+ },
+ {
+ "date": "2020-06-25",
+ "value": -0.03598083728790635
+ },
+ {
+ "date": "2020-06-26",
+ "value": -0.019449151159878775
+ },
+ {
+ "date": "2020-06-29",
+ "value": -0.032246935344390826
+ },
+ {
+ "date": "2020-06-30",
+ "value": -0.04738952231592464
+ },
+ {
+ "date": "2020-07-01",
+ "value": -0.03457678495148897
+ },
+ {
+ "date": "2020-07-02",
+ "value": -0.034557585451432504
+ },
+ {
+ "date": "2020-07-03",
+ "value": -0.036694241105239334
+ },
+ {
+ "date": "2020-07-06",
+ "value": -0.04304516341944009
+ },
+ {
+ "date": "2020-07-07",
+ "value": -0.040373112321079985
+ },
+ {
+ "date": "2020-07-08",
+ "value": -0.03361878210970404
+ },
+ {
+ "date": "2020-07-09",
+ "value": -0.047063343477123376
+ },
+ {
+ "date": "2020-07-10",
+ "value": -0.0464909067314867
+ },
+ {
+ "date": "2020-07-13",
+ "value": -0.05309017987508324
+ },
+ {
+ "date": "2020-07-14",
+ "value": -0.04882550194016366
+ },
+ {
+ "date": "2020-07-15",
+ "value": -0.04272855103838169
+ },
+ {
+ "date": "2020-07-16",
+ "value": -0.028198316246656918
+ },
+ {
+ "date": "2020-07-17",
+ "value": -0.0379659645369298
+ },
+ {
+ "date": "2020-07-20",
+ "value": -0.03312248740879509
+ },
+ {
+ "date": "2020-07-21",
+ "value": -0.01975633596798254
+ },
+ {
+ "date": "2020-07-22",
+ "value": -0.01048628307432209
+ },
+ {
+ "date": "2020-07-23",
+ "value": -0.012948903460819339
+ },
+ {
+ "date": "2020-07-24",
+ "value": -0.025536053356167043
+ },
+ {
+ "date": "2020-07-27",
+ "value": -0.035156266560299465
+ },
+ {
+ "date": "2020-07-28",
+ "value": -0.047991045651649356
+ },
+ {
+ "date": "2020-07-29",
+ "value": -0.05099255121061186
+ },
+ {
+ "date": "2020-07-30",
+ "value": -0.0613439411827601
+ },
+ {
+ "date": "2020-07-31",
+ "value": -0.047984408959297675
+ },
+ {
+ "date": "2020-08-03",
+ "value": -0.061377804393572544
+ },
+ {
+ "date": "2020-08-04",
+ "value": -0.06533886841071712
+ },
+ {
+ "date": "2020-08-05",
+ "value": -0.08106583523378141
+ },
+ {
+ "date": "2020-08-06",
+ "value": -0.0946212068932315
+ },
+ {
+ "date": "2020-08-07",
+ "value": -0.1036450647188748
+ },
+ {
+ "date": "2020-08-10",
+ "value": -0.09125866162578167
+ },
+ {
+ "date": "2020-08-11",
+ "value": -0.07974404835156157
+ },
+ {
+ "date": "2020-08-12",
+ "value": -0.07469205902325193
+ },
+ {
+ "date": "2020-08-13",
+ "value": -0.09226872805832742
+ },
+ {
+ "date": "2020-08-14",
+ "value": -0.08588872314068674
+ },
+ {
+ "date": "2020-08-17",
+ "value": -0.08429102142616751
+ },
+ {
+ "date": "2020-08-18",
+ "value": -0.08772269540008948
+ },
+ {
+ "date": "2020-08-19",
+ "value": -0.09985841972100473
+ },
+ {
+ "date": "2020-08-20",
+ "value": -0.10077557394543601
+ },
+ {
+ "date": "2020-08-21",
+ "value": -0.08770123012948283
+ },
+ {
+ "date": "2020-08-24",
+ "value": -0.08643910456725845
+ },
+ {
+ "date": "2020-08-25",
+ "value": -0.08391011920377633
+ },
+ {
+ "date": "2020-08-26",
+ "value": -0.08632039481202569
+ },
+ {
+ "date": "2020-08-27",
+ "value": -0.0928393607662662
+ },
+ {
+ "date": "2020-08-28",
+ "value": -0.07689294458970863
+ },
+ {
+ "date": "2020-08-31",
+ "value": -0.07982954463512781
+ },
+ {
+ "date": "2020-09-01",
+ "value": -0.08704973192319099
+ },
+ {
+ "date": "2020-09-02",
+ "value": -0.09067955161105135
+ },
+ {
+ "date": "2020-09-03",
+ "value": -0.0914256095427941
+ },
+ {
+ "date": "2020-09-04",
+ "value": -0.10511258227126308
+ },
+ {
+ "date": "2020-09-07",
+ "value": -0.10209840351761224
+ },
+ {
+ "date": "2020-09-08",
+ "value": -0.1102470677602655
+ },
+ {
+ "date": "2020-09-09",
+ "value": -0.099884550199274
+ },
+ {
+ "date": "2020-09-10",
+ "value": -0.09615459923425673
+ },
+ {
+ "date": "2020-09-11",
+ "value": -0.09419662458422251
+ },
+ {
+ "date": "2020-09-14",
+ "value": -0.08592242515999515
+ },
+ {
+ "date": "2020-09-15",
+ "value": -0.09836428158675958
+ },
+ {
+ "date": "2020-09-16",
+ "value": -0.08883808964329898
+ },
+ {
+ "date": "2020-09-17",
+ "value": -0.09009331979949198
+ },
+ {
+ "date": "2020-09-18",
+ "value": -0.07547566683173479
+ },
+ {
+ "date": "2020-09-21",
+ "value": -0.07160503803598672
+ },
+ {
+ "date": "2020-09-22",
+ "value": -0.07251679952155776
+ },
+ {
+ "date": "2020-09-23",
+ "value": -0.0792155419724292
+ },
+ {
+ "date": "2020-09-24",
+ "value": -0.07958888557235677
+ },
+ {
+ "date": "2020-09-25",
+ "value": -0.08706997635772795
+ },
+ {
+ "date": "2020-09-28",
+ "value": -0.08377461600862923
+ },
+ {
+ "date": "2020-09-29",
+ "value": -0.07836592887761074
+ },
+ {
+ "date": "2020-09-30",
+ "value": -0.08029462674027055
+ },
+ {
+ "date": "2020-10-01",
+ "value": -0.0964273586061758
+ },
+ {
+ "date": "2020-10-02",
+ "value": -0.09534652716124459
+ },
+ {
+ "date": "2020-10-05",
+ "value": -0.09733411424165284
+ },
+ {
+ "date": "2020-10-06",
+ "value": -0.08969605965974381
+ },
+ {
+ "date": "2020-10-07",
+ "value": -0.08043505700978448
+ },
+ {
+ "date": "2020-10-08",
+ "value": -0.08143454566908692
+ },
+ {
+ "date": "2020-10-09",
+ "value": -0.07318829519923986
+ },
+ {
+ "date": "2020-10-12",
+ "value": -0.06300503552909664
+ },
+ {
+ "date": "2020-10-13",
+ "value": -0.06818228614125321
+ },
+ {
+ "date": "2020-10-14",
+ "value": -0.08420224220303152
+ },
+ {
+ "date": "2020-10-15",
+ "value": -0.09398387750643855
+ },
+ {
+ "date": "2020-10-16",
+ "value": -0.09788317145952463
+ },
+ {
+ "date": "2020-10-19",
+ "value": -0.11010488132705176
+ },
+ {
+ "date": "2020-10-20",
+ "value": -0.11663547922844819
+ },
+ {
+ "date": "2020-10-21",
+ "value": -0.12603164141040601
+ },
+ {
+ "date": "2020-10-22",
+ "value": -0.10635998610883435
+ },
+ {
+ "date": "2020-10-23",
+ "value": -0.09998902410783606
+ },
+ {
+ "date": "2020-10-26",
+ "value": -0.11340242267739209
+ },
+ {
+ "date": "2020-10-27",
+ "value": -0.12051687014804202
+ },
+ {
+ "date": "2020-10-28",
+ "value": -0.1250533585723076
+ },
+ {
+ "date": "2020-10-29",
+ "value": -0.1369097547349979
+ },
+ {
+ "date": "2020-10-30",
+ "value": -0.1306398919069387
+ },
+ {
+ "date": "2020-11-02",
+ "value": -0.13297766834571856
+ },
+ {
+ "date": "2020-11-03",
+ "value": -0.1297330918893146
+ },
+ {
+ "date": "2020-11-04",
+ "value": -0.13979516790519242
+ },
+ {
+ "date": "2020-11-05",
+ "value": -0.11942152252496885
+ },
+ {
+ "date": "2020-11-06",
+ "value": -0.11873901326290948
+ },
+ {
+ "date": "2020-11-09",
+ "value": -0.1310292103944033
+ },
+ {
+ "date": "2020-11-10",
+ "value": -0.13985678276469327
+ },
+ {
+ "date": "2020-11-11",
+ "value": -0.14022218064326097
+ },
+ {
+ "date": "2020-11-12",
+ "value": -0.13019230496077405
+ },
+ {
+ "date": "2020-11-13",
+ "value": -0.1336547138027364
+ },
+ {
+ "date": "2020-11-16",
+ "value": -0.12425626288262293
+ },
+ {
+ "date": "2020-11-17",
+ "value": -0.11539611401981709
+ },
+ {
+ "date": "2020-11-18",
+ "value": -0.1049105857967676
+ },
+ {
+ "date": "2020-11-19",
+ "value": -0.09792588468121577
+ },
+ {
+ "date": "2020-11-20",
+ "value": -0.09447463766764086
+ },
+ {
+ "date": "2020-11-23",
+ "value": -0.09665201914779997
+ },
+ {
+ "date": "2020-11-24",
+ "value": -0.10528909550385024
+ },
+ {
+ "date": "2020-11-25",
+ "value": -0.10384015417510284
+ },
+ {
+ "date": "2020-11-26",
+ "value": -0.10584609401909595
+ },
+ {
+ "date": "2020-11-27",
+ "value": -0.10314504672774538
+ },
+ {
+ "date": "2020-11-30",
+ "value": -0.09340542653758577
+ },
+ {
+ "date": "2020-12-01",
+ "value": -0.06954477433058093
+ },
+ {
+ "date": "2020-12-02",
+ "value": -0.06953937279283784
+ },
+ {
+ "date": "2020-12-03",
+ "value": -0.09256537034310108
+ },
+ {
+ "date": "2020-12-04",
+ "value": -0.08097060022912406
+ },
+ {
+ "date": "2020-12-07",
+ "value": -0.07806501411174227
+ },
+ {
+ "date": "2020-12-08",
+ "value": -0.07373972991178546
+ },
+ {
+ "date": "2020-12-09",
+ "value": -0.07823220556547283
+ },
+ {
+ "date": "2020-12-10",
+ "value": -0.07747874318037629
+ },
+ {
+ "date": "2020-12-11",
+ "value": -0.07001018503031631
+ },
+ {
+ "date": "2020-12-14",
+ "value": -0.054117659834959086
+ },
+ {
+ "date": "2020-12-15",
+ "value": -0.03520315289685405
+ },
+ {
+ "date": "2020-12-16",
+ "value": -0.042535984564742835
+ },
+ {
+ "date": "2020-12-17",
+ "value": -0.040376416267057125
+ },
+ {
+ "date": "2020-12-18",
+ "value": -0.04587023077258656
+ },
+ {
+ "date": "2020-12-21",
+ "value": -0.04054918394563056
+ },
+ {
+ "date": "2020-12-22",
+ "value": -0.051021350006828836
+ },
+ {
+ "date": "2020-12-23",
+ "value": -0.05865965056755762
+ },
+ {
+ "date": "2020-12-24",
+ "value": -0.06074576801570042
+ },
+ {
+ "date": "2020-12-25",
+ "value": -0.05179278314270819
+ },
+ {
+ "date": "2020-12-28",
+ "value": -0.045662200941392284
+ },
+ {
+ "date": "2020-12-29",
+ "value": -0.05100400878583067
+ },
+ {
+ "date": "2020-12-30",
+ "value": -0.06472312391225621
+ },
+ {
+ "date": "2020-12-31",
+ "value": -0.0660223374249369
+ },
+ {
+ "date": "2021-01-01",
+ "value": -0.05493962428547772
+ },
+ {
+ "date": "2021-01-04",
+ "value": -0.05024625638466407
+ },
+ {
+ "date": "2021-01-05",
+ "value": -0.04936780117326334
+ },
+ {
+ "date": "2021-01-06",
+ "value": -0.05365188919130304
+ },
+ {
+ "date": "2021-01-07",
+ "value": -0.05918464425320058
+ },
+ {
+ "date": "2021-01-08",
+ "value": -0.04279061993049893
+ },
+ {
+ "date": "2021-01-11",
+ "value": -0.04149236817582569
+ },
+ {
+ "date": "2021-01-12",
+ "value": -0.04194226068274409
+ },
+ {
+ "date": "2021-01-13",
+ "value": -0.04960845864022645
+ },
+ {
+ "date": "2021-01-14",
+ "value": -0.04560608381645781
+ },
+ {
+ "date": "2021-01-15",
+ "value": -0.05692871389435783
+ },
+ {
+ "date": "2021-01-18",
+ "value": -0.05158727182070044
+ },
+ {
+ "date": "2021-01-19",
+ "value": -0.06949423733643945
+ },
+ {
+ "date": "2021-01-20",
+ "value": -0.06874327459570373
+ },
+ {
+ "date": "2021-01-21",
+ "value": -0.06892115836501356
+ },
+ {
+ "date": "2021-01-22",
+ "value": -0.045108182515138595
+ },
+ {
+ "date": "2021-01-25",
+ "value": -0.0471287264634227
+ },
+ {
+ "date": "2021-01-26",
+ "value": -0.0581921616824258
+ },
+ {
+ "date": "2021-01-27",
+ "value": -0.062277663353591306
+ },
+ {
+ "date": "2021-01-28",
+ "value": -0.05338635957755056
+ },
+ {
+ "date": "2021-01-29",
+ "value": -0.04901054002779415
+ },
+ {
+ "date": "2021-02-01",
+ "value": -0.04294457739518964
+ },
+ {
+ "date": "2021-02-02",
+ "value": -0.04950150495690864
+ },
+ {
+ "date": "2021-02-03",
+ "value": -0.0494576606371373
+ },
+ {
+ "date": "2021-02-04",
+ "value": -0.042255969297291696
+ },
+ {
+ "date": "2021-02-05",
+ "value": -0.023133271844352987
+ },
+ {
+ "date": "2021-02-08",
+ "value": -0.00762071081659943
+ },
+ {
+ "date": "2021-02-09",
+ "value": 0.0
+ },
+ {
+ "date": "2021-02-10",
+ "value": 0.0
+ },
+ {
+ "date": "2021-02-11",
+ "value": -0.005289711974929445
+ },
+ {
+ "date": "2021-02-12",
+ "value": -0.005269398057790142
+ },
+ {
+ "date": "2021-02-15",
+ "value": -0.001346998615763484
+ },
+ {
+ "date": "2021-02-16",
+ "value": 0.0
+ },
+ {
+ "date": "2021-02-17",
+ "value": -0.008081843734207395
+ },
+ {
+ "date": "2021-02-18",
+ "value": -0.020802195015710567
+ },
+ {
+ "date": "2021-02-19",
+ "value": -0.02622305030558325
+ },
+ {
+ "date": "2021-02-22",
+ "value": -0.0405098510003844
+ },
+ {
+ "date": "2021-02-23",
+ "value": -0.021863370929881665
+ },
+ {
+ "date": "2021-02-24",
+ "value": -0.028088958659680197
+ },
+ {
+ "date": "2021-02-25",
+ "value": -0.0324315005290835
+ },
+ {
+ "date": "2021-02-26",
+ "value": -0.03504663460027746
+ },
+ {
+ "date": "2021-03-01",
+ "value": -0.03177760774740701
+ },
+ {
+ "date": "2021-03-02",
+ "value": -0.03386434786541104
+ },
+ {
+ "date": "2021-03-03",
+ "value": -0.04424196444722106
+ },
+ {
+ "date": "2021-03-04",
+ "value": -0.05242854249678108
+ },
+ {
+ "date": "2021-03-05",
+ "value": -0.047748594907311426
+ },
+ {
+ "date": "2021-03-08",
+ "value": -0.04300980656087816
+ },
+ {
+ "date": "2021-03-09",
+ "value": -0.04097943469988263
+ },
+ {
+ "date": "2021-03-10",
+ "value": -0.05160421770467327
+ },
+ {
+ "date": "2021-03-11",
+ "value": -0.051678410973772126
+ },
+ {
+ "date": "2021-03-12",
+ "value": -0.05864239553225559
+ },
+ {
+ "date": "2021-03-15",
+ "value": -0.05465370981640949
+ },
+ {
+ "date": "2021-03-16",
+ "value": -0.05167878344528798
+ },
+ {
+ "date": "2021-03-17",
+ "value": -0.05020935627854395
+ },
+ {
+ "date": "2021-03-18",
+ "value": -0.056415657520139995
+ },
+ {
+ "date": "2021-03-19",
+ "value": -0.05480311474871091
+ },
+ {
+ "date": "2021-03-22",
+ "value": -0.06453666407884928
+ },
+ {
+ "date": "2021-03-23",
+ "value": -0.07344502200966996
+ },
+ {
+ "date": "2021-03-24",
+ "value": -0.07652828899288089
+ },
+ {
+ "date": "2021-03-25",
+ "value": -0.07656012689958325
+ },
+ {
+ "date": "2021-03-26",
+ "value": -0.06988343127257135
+ },
+ {
+ "date": "2021-03-29",
+ "value": -0.07144415307453755
+ },
+ {
+ "date": "2021-03-30",
+ "value": -0.08184789183698693
+ },
+ {
+ "date": "2021-03-31",
+ "value": -0.06877912839448475
+ },
+ {
+ "date": "2021-04-01",
+ "value": -0.071047326208319
+ },
+ {
+ "date": "2021-04-02",
+ "value": -0.0632200074222069
+ },
+ {
+ "date": "2021-04-05",
+ "value": -0.0627550143314981
+ },
+ {
+ "date": "2021-04-06",
+ "value": -0.0746359223254941
+ },
+ {
+ "date": "2021-04-07",
+ "value": -0.06363051369840667
+ },
+ {
+ "date": "2021-04-08",
+ "value": -0.04411048208388335
+ },
+ {
+ "date": "2021-04-09",
+ "value": -0.04772873887409723
+ },
+ {
+ "date": "2021-04-12",
+ "value": -0.04982640143261374
+ },
+ {
+ "date": "2021-04-13",
+ "value": -0.02698426956600064
+ },
+ {
+ "date": "2021-04-14",
+ "value": -0.03197328945338351
+ },
+ {
+ "date": "2021-04-15",
+ "value": -0.0452039303675521
+ },
+ {
+ "date": "2021-04-16",
+ "value": -0.06455888691002143
+ },
+ {
+ "date": "2021-04-19",
+ "value": -0.061422744720866174
+ },
+ {
+ "date": "2021-04-20",
+ "value": -0.05501198301210375
+ },
+ {
+ "date": "2021-04-21",
+ "value": -0.055987699608425645
+ },
+ {
+ "date": "2021-04-22",
+ "value": -0.06960225816262655
+ },
+ {
+ "date": "2021-04-23",
+ "value": -0.08412792757694032
+ },
+ {
+ "date": "2021-04-26",
+ "value": -0.08553634387320197
+ },
+ {
+ "date": "2021-04-27",
+ "value": -0.08880702683959696
+ },
+ {
+ "date": "2021-04-28",
+ "value": -0.08884369813462745
+ },
+ {
+ "date": "2021-04-29",
+ "value": -0.09352984056507241
+ },
+ {
+ "date": "2021-04-30",
+ "value": -0.08878857044062094
+ },
+ {
+ "date": "2021-05-03",
+ "value": -0.08017484078404047
+ },
+ {
+ "date": "2021-05-04",
+ "value": -0.09279499189583251
+ },
+ {
+ "date": "2021-05-05",
+ "value": -0.09016780594000684
+ },
+ {
+ "date": "2021-05-06",
+ "value": -0.10771168041900914
+ },
+ {
+ "date": "2021-05-07",
+ "value": -0.1040426218320607
+ },
+ {
+ "date": "2021-05-10",
+ "value": -0.10277121214437701
+ },
+ {
+ "date": "2021-05-11",
+ "value": -0.10159036472394456
+ },
+ {
+ "date": "2021-05-12",
+ "value": -0.09935970361436053
+ },
+ {
+ "date": "2021-05-13",
+ "value": -0.1126006333984011
+ },
+ {
+ "date": "2021-05-14",
+ "value": -0.12241108654132926
+ },
+ {
+ "date": "2021-05-17",
+ "value": -0.10923323895316006
+ },
+ {
+ "date": "2021-05-18",
+ "value": -0.11414719213128177
+ },
+ {
+ "date": "2021-05-19",
+ "value": -0.13035214672392714
+ },
+ {
+ "date": "2021-05-20",
+ "value": -0.11572900383755957
+ },
+ {
+ "date": "2021-05-21",
+ "value": -0.0992984677011437
+ },
+ {
+ "date": "2021-05-24",
+ "value": -0.0919967033623007
+ },
+ {
+ "date": "2021-05-25",
+ "value": -0.08339527881850883
+ },
+ {
+ "date": "2021-05-26",
+ "value": -0.07964368154228973
+ },
+ {
+ "date": "2021-05-27",
+ "value": -0.07699990645398058
+ },
+ {
+ "date": "2021-05-28",
+ "value": -0.08675222368201696
+ },
+ {
+ "date": "2021-05-31",
+ "value": -0.0976157035951517
+ },
+ {
+ "date": "2021-06-01",
+ "value": -0.08989606609067846
+ },
+ {
+ "date": "2021-06-02",
+ "value": -0.0840599361158938
+ },
+ {
+ "date": "2021-06-03",
+ "value": -0.07291155771640223
+ },
+ {
+ "date": "2021-06-04",
+ "value": -0.06674415852491278
+ },
+ {
+ "date": "2021-06-07",
+ "value": -0.0627447712359942
+ },
+ {
+ "date": "2021-06-08",
+ "value": -0.06768544537911092
+ },
+ {
+ "date": "2021-06-09",
+ "value": -0.07975857931421348
+ },
+ {
+ "date": "2021-06-10",
+ "value": -0.07553476052305663
+ },
+ {
+ "date": "2021-06-11",
+ "value": -0.07336939016429533
+ },
+ {
+ "date": "2021-06-14",
+ "value": -0.07964851208788926
+ },
+ {
+ "date": "2021-06-15",
+ "value": -0.0894901518319351
+ },
+ {
+ "date": "2021-06-16",
+ "value": -0.09489089779856874
+ },
+ {
+ "date": "2021-06-17",
+ "value": -0.09505989847191276
+ },
+ {
+ "date": "2021-06-18",
+ "value": -0.09320673368427645
+ },
+ {
+ "date": "2021-06-21",
+ "value": -0.1062148745128868
+ },
+ {
+ "date": "2021-06-22",
+ "value": -0.10451730902027867
+ },
+ {
+ "date": "2021-06-23",
+ "value": -0.1275461938419976
+ },
+ {
+ "date": "2021-06-24",
+ "value": -0.11146658070014903
+ },
+ {
+ "date": "2021-06-25",
+ "value": -0.11356266018963712
+ },
+ {
+ "date": "2021-06-28",
+ "value": -0.09839266378674272
+ },
+ {
+ "date": "2021-06-29",
+ "value": -0.1091427848825407
+ },
+ {
+ "date": "2021-06-30",
+ "value": -0.10761398216269114
+ },
+ {
+ "date": "2021-07-01",
+ "value": -0.10395559231811369
+ },
+ {
+ "date": "2021-07-02",
+ "value": -0.11186892533164827
+ },
+ {
+ "date": "2021-07-05",
+ "value": -0.10981378525872332
+ },
+ {
+ "date": "2021-07-06",
+ "value": -0.11452286789089172
+ },
+ {
+ "date": "2021-07-07",
+ "value": -0.10277153757478763
+ },
+ {
+ "date": "2021-07-08",
+ "value": -0.10762245529456038
+ },
+ {
+ "date": "2021-07-09",
+ "value": -0.11133398237452585
+ },
+ {
+ "date": "2021-07-12",
+ "value": -0.11088892826950414
+ },
+ {
+ "date": "2021-07-13",
+ "value": -0.11227574123760775
+ },
+ {
+ "date": "2021-07-14",
+ "value": -0.09817011362174555
+ },
+ {
+ "date": "2021-07-15",
+ "value": -0.09655163823172319
+ },
+ {
+ "date": "2021-07-16",
+ "value": -0.08532494655661671
+ },
+ {
+ "date": "2021-07-19",
+ "value": -0.08074171992922918
+ },
+ {
+ "date": "2021-07-20",
+ "value": -0.08482039147606768
+ },
+ {
+ "date": "2021-07-21",
+ "value": -0.08083435570708553
+ },
+ {
+ "date": "2021-07-22",
+ "value": -0.08729021395881131
+ },
+ {
+ "date": "2021-07-23",
+ "value": -0.08493979643599636
+ },
+ {
+ "date": "2021-07-26",
+ "value": -0.07681188172601605
+ },
+ {
+ "date": "2021-07-27",
+ "value": -0.07018888796316458
+ },
+ {
+ "date": "2021-07-28",
+ "value": -0.06932207882337837
+ },
+ {
+ "date": "2021-07-29",
+ "value": -0.030456650435492838
+ },
+ {
+ "date": "2021-07-30",
+ "value": -0.022955662035337276
+ },
+ {
+ "date": "2021-08-02",
+ "value": -0.026291998916668335
+ },
+ {
+ "date": "2021-08-03",
+ "value": -0.01961117992204353
+ },
+ {
+ "date": "2021-08-04",
+ "value": -0.0007731683457152805
+ },
+ {
+ "date": "2021-08-05",
+ "value": -0.007836676789841457
+ },
+ {
+ "date": "2021-08-06",
+ "value": 0.0
+ },
+ {
+ "date": "2021-08-09",
+ "value": 0.0
+ },
+ {
+ "date": "2021-08-10",
+ "value": 0.0
+ },
+ {
+ "date": "2021-08-11",
+ "value": -0.0001440193252592037
+ },
+ {
+ "date": "2021-08-12",
+ "value": 0.0
+ },
+ {
+ "date": "2021-08-13",
+ "value": 0.0
+ },
+ {
+ "date": "2021-08-16",
+ "value": 0.0
+ },
+ {
+ "date": "2021-08-17",
+ "value": 0.0
+ },
+ {
+ "date": "2021-08-18",
+ "value": -5.8634046762873204e-05
+ },
+ {
+ "date": "2021-08-19",
+ "value": 0.0
+ },
+ {
+ "date": "2021-08-20",
+ "value": 0.0
+ },
+ {
+ "date": "2021-08-23",
+ "value": 0.0
+ },
+ {
+ "date": "2021-08-24",
+ "value": -0.01636025125392615
+ },
+ {
+ "date": "2021-08-25",
+ "value": -0.0180980724145956
+ },
+ {
+ "date": "2021-08-26",
+ "value": -0.02515813380881926
+ },
+ {
+ "date": "2021-08-27",
+ "value": -0.0197643207382715
+ },
+ {
+ "date": "2021-08-30",
+ "value": -0.015786941247018627
+ },
+ {
+ "date": "2021-08-31",
+ "value": -0.014728028510616942
+ },
+ {
+ "date": "2021-09-01",
+ "value": -0.019593692747677527
+ },
+ {
+ "date": "2021-09-02",
+ "value": -0.02757808975772924
+ },
+ {
+ "date": "2021-09-03",
+ "value": -0.023127859926243333
+ },
+ {
+ "date": "2021-09-06",
+ "value": -0.033717156001195625
+ },
+ {
+ "date": "2021-09-07",
+ "value": -0.022282557371043787
+ },
+ {
+ "date": "2021-09-08",
+ "value": -0.021100147105906353
+ },
+ {
+ "date": "2021-09-09",
+ "value": -0.02441802233506718
+ },
+ {
+ "date": "2021-09-10",
+ "value": -0.03214228516266848
+ },
+ {
+ "date": "2021-09-13",
+ "value": -0.04004860447178149
+ },
+ {
+ "date": "2021-09-14",
+ "value": -0.048128576643367005
+ },
+ {
+ "date": "2021-09-15",
+ "value": -0.04544042543687621
+ },
+ {
+ "date": "2021-09-16",
+ "value": -0.05049442365409984
+ },
+ {
+ "date": "2021-09-17",
+ "value": -0.031031868677584007
+ },
+ {
+ "date": "2021-09-20",
+ "value": -0.03966551218805525
+ },
+ {
+ "date": "2021-09-21",
+ "value": -0.028418871963875825
+ },
+ {
+ "date": "2021-09-22",
+ "value": -0.029432112670548682
+ },
+ {
+ "date": "2021-09-23",
+ "value": -0.04403413412120705
+ },
+ {
+ "date": "2021-09-24",
+ "value": -0.03788569281689258
+ },
+ {
+ "date": "2021-09-27",
+ "value": -0.03587055595492106
+ },
+ {
+ "date": "2021-09-28",
+ "value": -0.026539485365418503
+ },
+ {
+ "date": "2021-09-29",
+ "value": -0.01738679804195775
+ },
+ {
+ "date": "2021-09-30",
+ "value": -0.002412275137952835
+ },
+ {
+ "date": "2021-10-01",
+ "value": -0.002116331403242744
+ },
+ {
+ "date": "2021-10-04",
+ "value": 0.0
+ },
+ {
+ "date": "2021-10-05",
+ "value": 0.0
+ },
+ {
+ "date": "2021-10-06",
+ "value": 0.0
+ },
+ {
+ "date": "2021-10-07",
+ "value": 0.0
+ },
+ {
+ "date": "2021-10-08",
+ "value": -0.003942420305143024
+ },
+ {
+ "date": "2021-10-11",
+ "value": -0.0028718565687038122
+ },
+ {
+ "date": "2021-10-12",
+ "value": 0.0
+ },
+ {
+ "date": "2021-10-13",
+ "value": -0.002758308757042638
+ },
+ {
+ "date": "2021-10-14",
+ "value": -0.00039791272265787825
+ },
+ {
+ "date": "2021-10-15",
+ "value": 0.0
+ },
+ {
+ "date": "2021-10-18",
+ "value": 0.0
+ },
+ {
+ "date": "2021-10-19",
+ "value": 0.0
+ },
+ {
+ "date": "2021-10-20",
+ "value": 0.0
+ },
+ {
+ "date": "2021-10-21",
+ "value": 0.0
+ },
+ {
+ "date": "2021-10-22",
+ "value": -0.010736208901244826
+ },
+ {
+ "date": "2021-10-25",
+ "value": -0.022931096145991536
+ },
+ {
+ "date": "2021-10-26",
+ "value": -0.03378448881586604
+ },
+ {
+ "date": "2021-10-27",
+ "value": -0.029853255955785807
+ },
+ {
+ "date": "2021-10-28",
+ "value": -0.034747508363755175
+ },
+ {
+ "date": "2021-10-29",
+ "value": -0.04868614469975241
+ },
+ {
+ "date": "2021-11-01",
+ "value": -0.046400941287967123
+ },
+ {
+ "date": "2021-11-02",
+ "value": -0.05690788574939942
+ },
+ {
+ "date": "2021-11-03",
+ "value": -0.06515108380343926
+ },
+ {
+ "date": "2021-11-04",
+ "value": -0.07327266140212796
+ },
+ {
+ "date": "2021-11-05",
+ "value": -0.08101748012105048
+ },
+ {
+ "date": "2021-11-08",
+ "value": -0.09448168507251586
+ },
+ {
+ "date": "2021-11-09",
+ "value": -0.0854601854479009
+ },
+ {
+ "date": "2021-11-10",
+ "value": -0.08538147295733112
+ },
+ {
+ "date": "2021-11-11",
+ "value": -0.09697551757185685
+ },
+ {
+ "date": "2021-11-12",
+ "value": -0.08332807029667533
+ },
+ {
+ "date": "2021-11-15",
+ "value": -0.07435500820430896
+ },
+ {
+ "date": "2021-11-16",
+ "value": -0.07146709596882161
+ },
+ {
+ "date": "2021-11-17",
+ "value": -0.058147864835066065
+ },
+ {
+ "date": "2021-11-18",
+ "value": -0.05856936569707116
+ },
+ {
+ "date": "2021-11-19",
+ "value": -0.06765152682542241
+ },
+ {
+ "date": "2021-11-22",
+ "value": -0.06455124161016823
+ },
+ {
+ "date": "2021-11-23",
+ "value": -0.06771903120496037
+ },
+ {
+ "date": "2021-11-24",
+ "value": -0.07653261284408108
+ },
+ {
+ "date": "2021-11-25",
+ "value": -0.07428055709539105
+ },
+ {
+ "date": "2021-11-26",
+ "value": -0.06651643239370364
+ },
+ {
+ "date": "2021-11-29",
+ "value": -0.0581875192140342
+ },
+ {
+ "date": "2021-11-30",
+ "value": -0.04761398950312978
+ },
+ {
+ "date": "2021-12-01",
+ "value": -0.05779973439372621
+ },
+ {
+ "date": "2021-12-02",
+ "value": -0.04429513376765859
+ },
+ {
+ "date": "2021-12-03",
+ "value": -0.04444294128323312
+ },
+ {
+ "date": "2021-12-06",
+ "value": -0.035152344217382114
+ },
+ {
+ "date": "2021-12-07",
+ "value": -0.028818673007721674
+ },
+ {
+ "date": "2021-12-08",
+ "value": -0.03335036382317602
+ },
+ {
+ "date": "2021-12-09",
+ "value": -0.03672078808384427
+ },
+ {
+ "date": "2021-12-10",
+ "value": -0.02462067876797236
+ },
+ {
+ "date": "2021-12-13",
+ "value": -0.014123743281176049
+ },
+ {
+ "date": "2021-12-14",
+ "value": -0.005181176097903473
+ },
+ {
+ "date": "2021-12-15",
+ "value": 0.0
+ },
+ {
+ "date": "2021-12-16",
+ "value": 0.0
+ },
+ {
+ "date": "2021-12-17",
+ "value": -0.004378209906932273
+ },
+ {
+ "date": "2021-12-20",
+ "value": 0.0
+ },
+ {
+ "date": "2021-12-21",
+ "value": 0.0
+ },
+ {
+ "date": "2021-12-22",
+ "value": 0.0
+ },
+ {
+ "date": "2021-12-23",
+ "value": -0.000826081562467551
+ },
+ {
+ "date": "2021-12-24",
+ "value": 0.0
+ },
+ {
+ "date": "2021-12-27",
+ "value": 0.0
+ },
+ {
+ "date": "2021-12-28",
+ "value": 0.0
+ },
+ {
+ "date": "2021-12-29",
+ "value": -0.004092277279730938
+ },
+ {
+ "date": "2021-12-30",
+ "value": 0.0
+ },
+ {
+ "date": "2021-12-31",
+ "value": -0.013207365947537353
+ },
+ {
+ "date": "2022-01-03",
+ "value": -0.014300938802193075
+ },
+ {
+ "date": "2022-01-04",
+ "value": -0.018643720958953724
+ },
+ {
+ "date": "2022-01-05",
+ "value": -0.02940535127973043
+ },
+ {
+ "date": "2022-01-06",
+ "value": -0.01399313809464764
+ },
+ {
+ "date": "2022-01-07",
+ "value": -0.00571364276335562
+ },
+ {
+ "date": "2022-01-10",
+ "value": -0.023806896399823585
+ },
+ {
+ "date": "2022-01-11",
+ "value": -0.009382824268715728
+ },
+ {
+ "date": "2022-01-12",
+ "value": -0.00944569059384226
+ },
+ {
+ "date": "2022-01-13",
+ "value": -0.010833013304545225
+ },
+ {
+ "date": "2022-01-14",
+ "value": -0.0029414928645632443
+ },
+ {
+ "date": "2022-01-17",
+ "value": 0.0
+ },
+ {
+ "date": "2022-01-18",
+ "value": 0.0
+ },
+ {
+ "date": "2022-01-19",
+ "value": 0.0
+ },
+ {
+ "date": "2022-01-20",
+ "value": -0.010261032805269799
+ },
+ {
+ "date": "2022-01-21",
+ "value": -0.015310708143143392
+ },
+ {
+ "date": "2022-01-24",
+ "value": -0.0035113419492986964
+ },
+ {
+ "date": "2022-01-25",
+ "value": 0.0
+ },
+ {
+ "date": "2022-01-26",
+ "value": -0.008163051306735225
+ },
+ {
+ "date": "2022-01-27",
+ "value": 0.0
+ },
+ {
+ "date": "2022-01-28",
+ "value": 0.0
+ },
+ {
+ "date": "2022-01-31",
+ "value": 0.0
+ },
+ {
+ "date": "2022-02-01",
+ "value": 0.0
+ },
+ {
+ "date": "2022-02-02",
+ "value": 0.0
+ },
+ {
+ "date": "2022-02-03",
+ "value": -0.005619188315759138
+ },
+ {
+ "date": "2022-02-04",
+ "value": -0.00269704782669955
+ },
+ {
+ "date": "2022-02-07",
+ "value": -0.0020589284530198038
+ },
+ {
+ "date": "2022-02-08",
+ "value": 0.0
+ },
+ {
+ "date": "2022-02-09",
+ "value": -0.0012432890655978968
+ },
+ {
+ "date": "2022-02-10",
+ "value": 0.0
+ },
+ {
+ "date": "2022-02-11",
+ "value": 0.0
+ },
+ {
+ "date": "2022-02-14",
+ "value": 0.0
+ },
+ {
+ "date": "2022-02-15",
+ "value": 0.0
+ },
+ {
+ "date": "2022-02-16",
+ "value": -0.01104968899885339
+ },
+ {
+ "date": "2022-02-17",
+ "value": -0.00612262631759497
+ },
+ {
+ "date": "2022-02-18",
+ "value": -0.0005119648450376824
+ },
+ {
+ "date": "2022-02-21",
+ "value": -0.01165251218941521
+ },
+ {
+ "date": "2022-02-22",
+ "value": -0.0036533980393307353
+ },
+ {
+ "date": "2022-02-23",
+ "value": 0.0
+ },
+ {
+ "date": "2022-02-24",
+ "value": 0.0
+ },
+ {
+ "date": "2022-02-25",
+ "value": 0.0
+ },
+ {
+ "date": "2022-02-28",
+ "value": -0.001876296935979127
+ },
+ {
+ "date": "2022-03-01",
+ "value": -0.009441269068732105
+ },
+ {
+ "date": "2022-03-02",
+ "value": -0.009831176352858462
+ },
+ {
+ "date": "2022-03-03",
+ "value": 0.0
+ },
+ {
+ "date": "2022-03-04",
+ "value": -0.007527893254691942
+ },
+ {
+ "date": "2022-03-07",
+ "value": -0.013553190177927221
+ },
+ {
+ "date": "2022-03-08",
+ "value": -0.025917772520728688
+ },
+ {
+ "date": "2022-03-09",
+ "value": -0.010337964710637526
+ },
+ {
+ "date": "2022-03-10",
+ "value": -0.012086013239896887
+ },
+ {
+ "date": "2022-03-11",
+ "value": -0.020445314101006695
+ },
+ {
+ "date": "2022-03-14",
+ "value": -0.022134825883418197
+ },
+ {
+ "date": "2022-03-15",
+ "value": -0.01940630772635843
+ },
+ {
+ "date": "2022-03-16",
+ "value": -0.022802443720073007
+ },
+ {
+ "date": "2022-03-17",
+ "value": -0.029860518369315026
+ },
+ {
+ "date": "2022-03-18",
+ "value": -0.02199663668313412
+ },
+ {
+ "date": "2022-03-21",
+ "value": -0.022339013492473803
+ },
+ {
+ "date": "2022-03-22",
+ "value": -0.020858077228412486
+ },
+ {
+ "date": "2022-03-23",
+ "value": -0.02369463447792275
+ },
+ {
+ "date": "2022-03-24",
+ "value": -0.038036993810953934
+ },
+ {
+ "date": "2022-03-25",
+ "value": -0.026179548601938052
+ },
+ {
+ "date": "2022-03-28",
+ "value": -0.02636069225698201
+ },
+ {
+ "date": "2022-03-29",
+ "value": -0.02104701561949307
+ },
+ {
+ "date": "2022-03-30",
+ "value": -0.027944303457650976
+ },
+ {
+ "date": "2022-03-31",
+ "value": -0.03742250851134821
+ },
+ {
+ "date": "2022-04-01",
+ "value": -0.047784738395573956
+ },
+ {
+ "date": "2022-04-04",
+ "value": -0.04577676380779794
+ },
+ {
+ "date": "2022-04-05",
+ "value": -0.03205428062069948
+ },
+ {
+ "date": "2022-04-06",
+ "value": -0.023350663037617236
+ },
+ {
+ "date": "2022-04-07",
+ "value": -0.014093341653833358
+ },
+ {
+ "date": "2022-04-08",
+ "value": -0.009421556361243977
+ },
+ {
+ "date": "2022-04-11",
+ "value": -0.00923312808571164
+ },
+ {
+ "date": "2022-04-12",
+ "value": -0.018029159735841294
+ },
+ {
+ "date": "2022-04-13",
+ "value": -0.01688055964878954
+ },
+ {
+ "date": "2022-04-14",
+ "value": -0.00653435659165269
+ },
+ {
+ "date": "2022-04-15",
+ "value": -0.008353400442749903
+ },
+ {
+ "date": "2022-04-18",
+ "value": -0.021717996829518582
+ },
+ {
+ "date": "2022-04-19",
+ "value": -0.025865965494221932
+ },
+ {
+ "date": "2022-04-20",
+ "value": -0.03825130207160854
+ },
+ {
+ "date": "2022-04-21",
+ "value": -0.03502880464257552
+ },
+ {
+ "date": "2022-04-22",
+ "value": -0.02430849276349245
+ },
+ {
+ "date": "2022-04-25",
+ "value": -0.024060109785512096
+ },
+ {
+ "date": "2022-04-26",
+ "value": -0.034687397930509456
+ },
+ {
+ "date": "2022-04-27",
+ "value": -0.03254256953346646
+ },
+ {
+ "date": "2022-04-28",
+ "value": -0.03974326366375058
+ },
+ {
+ "date": "2022-04-29",
+ "value": -0.04402877362223556
+ },
+ {
+ "date": "2022-05-02",
+ "value": -0.05267689960704458
+ },
+ {
+ "date": "2022-05-03",
+ "value": -0.06238176865922729
+ },
+ {
+ "date": "2022-05-04",
+ "value": -0.046268310119702005
+ },
+ {
+ "date": "2022-05-05",
+ "value": -0.04828834214999145
+ },
+ {
+ "date": "2022-05-06",
+ "value": -0.05195315448292037
+ },
+ {
+ "date": "2022-05-09",
+ "value": -0.0466707294621822
+ },
+ {
+ "date": "2022-05-10",
+ "value": -0.051662509115156685
+ },
+ {
+ "date": "2022-05-11",
+ "value": -0.03855874802929826
+ },
+ {
+ "date": "2022-05-12",
+ "value": -0.04173157322278731
+ },
+ {
+ "date": "2022-05-13",
+ "value": -0.039089323240361296
+ },
+ {
+ "date": "2022-05-16",
+ "value": -0.034656228001514244
+ },
+ {
+ "date": "2022-05-17",
+ "value": -0.05705267326305785
+ },
+ {
+ "date": "2022-05-18",
+ "value": -0.07026119887978632
+ },
+ {
+ "date": "2022-05-19",
+ "value": -0.07005911982522584
+ },
+ {
+ "date": "2022-05-20",
+ "value": -0.07624048402477368
+ },
+ {
+ "date": "2022-05-23",
+ "value": -0.08080911464476459
+ },
+ {
+ "date": "2022-05-24",
+ "value": -0.07188078924925567
+ },
+ {
+ "date": "2022-05-25",
+ "value": -0.07120885908202068
+ },
+ {
+ "date": "2022-05-26",
+ "value": -0.07462301760915668
+ },
+ {
+ "date": "2022-05-27",
+ "value": -0.07376699367503259
+ },
+ {
+ "date": "2022-05-30",
+ "value": -0.06224449843969315
+ },
+ {
+ "date": "2022-05-31",
+ "value": -0.06171453860958698
+ },
+ {
+ "date": "2022-06-01",
+ "value": -0.07440167892586458
+ },
+ {
+ "date": "2022-06-02",
+ "value": -0.08339845237781163
+ },
+ {
+ "date": "2022-06-03",
+ "value": -0.07220397007339918
+ },
+ {
+ "date": "2022-06-06",
+ "value": -0.0729459546744623
+ },
+ {
+ "date": "2022-06-07",
+ "value": -0.07227600600800121
+ },
+ {
+ "date": "2022-06-08",
+ "value": -0.07010526448859344
+ },
+ {
+ "date": "2022-06-09",
+ "value": -0.07529855178605949
+ },
+ {
+ "date": "2022-06-10",
+ "value": -0.07990209066734955
+ },
+ {
+ "date": "2022-06-13",
+ "value": -0.07972692532491521
+ },
+ {
+ "date": "2022-06-14",
+ "value": -0.0851342573549021
+ },
+ {
+ "date": "2022-06-15",
+ "value": -0.07603838127214368
+ },
+ {
+ "date": "2022-06-16",
+ "value": -0.06874343535618888
+ },
+ {
+ "date": "2022-06-17",
+ "value": -0.06973600548329095
+ },
+ {
+ "date": "2022-06-20",
+ "value": -0.07293237798217655
+ },
+ {
+ "date": "2022-06-21",
+ "value": -0.06945525556327514
+ },
+ {
+ "date": "2022-06-22",
+ "value": -0.06004727777591834
+ },
+ {
+ "date": "2022-06-23",
+ "value": -0.06728331766886364
+ },
+ {
+ "date": "2022-06-24",
+ "value": -0.08658934763525739
+ },
+ {
+ "date": "2022-06-27",
+ "value": -0.08840130749621466
+ },
+ {
+ "date": "2022-06-28",
+ "value": -0.0820863738088139
+ },
+ {
+ "date": "2022-06-29",
+ "value": -0.0773457900707002
+ },
+ {
+ "date": "2022-06-30",
+ "value": -0.08228360314388539
+ },
+ {
+ "date": "2022-07-01",
+ "value": -0.07410744053235985
+ },
+ {
+ "date": "2022-07-04",
+ "value": -0.07675800395110077
+ },
+ {
+ "date": "2022-07-05",
+ "value": -0.06739499930456405
+ },
+ {
+ "date": "2022-07-06",
+ "value": -0.056847498285976794
+ },
+ {
+ "date": "2022-07-07",
+ "value": -0.06513515875534581
+ },
+ {
+ "date": "2022-07-08",
+ "value": -0.06107087520923182
+ },
+ {
+ "date": "2022-07-11",
+ "value": -0.05009981960857057
+ },
+ {
+ "date": "2022-07-12",
+ "value": -0.06706555105857825
+ },
+ {
+ "date": "2022-07-13",
+ "value": -0.0783732560356224
+ },
+ {
+ "date": "2022-07-14",
+ "value": -0.06349604149568566
+ },
+ {
+ "date": "2022-07-15",
+ "value": -0.06376472673264999
+ },
+ {
+ "date": "2022-07-18",
+ "value": -0.05384938672876649
+ },
+ {
+ "date": "2022-07-19",
+ "value": -0.041175576076573184
+ },
+ {
+ "date": "2022-07-20",
+ "value": -0.04021341219123731
+ },
+ {
+ "date": "2022-07-21",
+ "value": -0.029918598891436887
+ },
+ {
+ "date": "2022-07-22",
+ "value": -0.043213994120724575
+ },
+ {
+ "date": "2022-07-25",
+ "value": -0.044008598348800665
+ },
+ {
+ "date": "2022-07-26",
+ "value": -0.036127852454676646
+ },
+ {
+ "date": "2022-07-27",
+ "value": -0.03034526981361907
+ },
+ {
+ "date": "2022-07-28",
+ "value": -0.03850776388284971
+ },
+ {
+ "date": "2022-07-29",
+ "value": -0.048095955253094846
+ },
+ {
+ "date": "2022-08-01",
+ "value": -0.029669024365363894
+ },
+ {
+ "date": "2022-08-02",
+ "value": -0.02154318299346536
+ },
+ {
+ "date": "2022-08-03",
+ "value": -0.024970102487040347
+ },
+ {
+ "date": "2022-08-04",
+ "value": -0.029100758838443985
+ },
+ {
+ "date": "2022-08-05",
+ "value": -0.04614204623301532
+ },
+ {
+ "date": "2022-08-08",
+ "value": -0.040222410493741534
+ },
+ {
+ "date": "2022-08-09",
+ "value": -0.04606611814333139
+ },
+ {
+ "date": "2022-08-10",
+ "value": -0.055396262580176825
+ },
+ {
+ "date": "2022-08-11",
+ "value": -0.06589014015522732
+ },
+ {
+ "date": "2022-08-12",
+ "value": -0.05441907127403156
+ },
+ {
+ "date": "2022-08-15",
+ "value": -0.020736824345118032
+ },
+ {
+ "date": "2022-08-16",
+ "value": -0.022462833606043286
+ },
+ {
+ "date": "2022-08-17",
+ "value": -0.01626531259701558
+ },
+ {
+ "date": "2022-08-18",
+ "value": -0.011226498049859535
+ },
+ {
+ "date": "2022-08-19",
+ "value": -0.021881073289834796
+ },
+ {
+ "date": "2022-08-22",
+ "value": -0.025714885889826067
+ },
+ {
+ "date": "2022-08-23",
+ "value": -0.017960158576465712
+ },
+ {
+ "date": "2022-08-24",
+ "value": -0.023361936036067288
+ },
+ {
+ "date": "2022-08-25",
+ "value": -0.02314972304972507
+ },
+ {
+ "date": "2022-08-26",
+ "value": -0.023809255415040642
+ },
+ {
+ "date": "2022-08-29",
+ "value": -0.023302279513521262
+ },
+ {
+ "date": "2022-08-30",
+ "value": -0.017891191961191932
+ },
+ {
+ "date": "2022-08-31",
+ "value": -0.019038244712969554
+ },
+ {
+ "date": "2022-09-01",
+ "value": -0.016430771959721535
+ },
+ {
+ "date": "2022-09-02",
+ "value": -0.016561091990264676
+ },
+ {
+ "date": "2022-09-05",
+ "value": -0.0052211778249454666
+ },
+ {
+ "date": "2022-09-06",
+ "value": 0.0
+ },
+ {
+ "date": "2022-09-07",
+ "value": 0.0
+ },
+ {
+ "date": "2022-09-08",
+ "value": -0.010549376674442446
+ },
+ {
+ "date": "2022-09-09",
+ "value": -0.0074487927483574135
+ },
+ {
+ "date": "2022-09-12",
+ "value": -0.008826752374529234
+ },
+ {
+ "date": "2022-09-13",
+ "value": 0.0
+ },
+ {
+ "date": "2022-09-14",
+ "value": 0.0
+ },
+ {
+ "date": "2022-09-15",
+ "value": -0.002046526507659463
+ },
+ {
+ "date": "2022-09-16",
+ "value": 0.0
+ },
+ {
+ "date": "2022-09-19",
+ "value": -0.010000395545167962
+ },
+ {
+ "date": "2022-09-20",
+ "value": -0.01221515152071051
+ },
+ {
+ "date": "2022-09-21",
+ "value": -0.012331734459848809
+ },
+ {
+ "date": "2022-09-22",
+ "value": -0.007553762344678638
+ },
+ {
+ "date": "2022-09-23",
+ "value": -0.031216406311976086
+ },
+ {
+ "date": "2022-09-26",
+ "value": -0.02936949420570545
+ },
+ {
+ "date": "2022-09-27",
+ "value": -0.03713505184475574
+ },
+ {
+ "date": "2022-09-28",
+ "value": -0.04347802425931646
+ },
+ {
+ "date": "2022-09-29",
+ "value": -0.03980001400329536
+ },
+ {
+ "date": "2022-09-30",
+ "value": -0.02824339732025738
+ },
+ {
+ "date": "2022-10-03",
+ "value": -0.018362738965845504
+ },
+ {
+ "date": "2022-10-04",
+ "value": -0.0280946328278594
+ },
+ {
+ "date": "2022-10-05",
+ "value": -0.01826139184930875
+ },
+ {
+ "date": "2022-10-06",
+ "value": -0.020744518693806335
+ },
+ {
+ "date": "2022-10-07",
+ "value": -0.025319016911571235
+ },
+ {
+ "date": "2022-10-10",
+ "value": -0.01562943802410588
+ },
+ {
+ "date": "2022-10-11",
+ "value": -0.01853638670716795
+ },
+ {
+ "date": "2022-10-12",
+ "value": -0.003187795899214141
+ },
+ {
+ "date": "2022-10-13",
+ "value": 0.0
+ },
+ {
+ "date": "2022-10-14",
+ "value": 0.0
+ },
+ {
+ "date": "2022-10-17",
+ "value": -0.006970801922544512
+ },
+ {
+ "date": "2022-10-18",
+ "value": 0.0
+ },
+ {
+ "date": "2022-10-19",
+ "value": 0.0
+ },
+ {
+ "date": "2022-10-20",
+ "value": -0.006605685008950091
+ },
+ {
+ "date": "2022-10-21",
+ "value": -0.020573530472469015
+ },
+ {
+ "date": "2022-10-24",
+ "value": -0.014195534374059182
+ },
+ {
+ "date": "2022-10-25",
+ "value": -0.028417105146412047
+ },
+ {
+ "date": "2022-10-26",
+ "value": -0.05294939146258171
+ },
+ {
+ "date": "2022-10-27",
+ "value": -0.06208930549831104
+ },
+ {
+ "date": "2022-10-28",
+ "value": -0.07560015676400522
+ },
+ {
+ "date": "2022-10-31",
+ "value": -0.08060006439898137
+ },
+ {
+ "date": "2022-11-01",
+ "value": -0.06300188857980626
+ },
+ {
+ "date": "2022-11-02",
+ "value": -0.048660030692824985
+ },
+ {
+ "date": "2022-11-03",
+ "value": -0.05563892907297152
+ },
+ {
+ "date": "2022-11-04",
+ "value": -0.06609298532087171
+ },
+ {
+ "date": "2022-11-07",
+ "value": -0.06315713382182153
+ },
+ {
+ "date": "2022-11-08",
+ "value": -0.0738371994789151
+ },
+ {
+ "date": "2022-11-09",
+ "value": -0.06573193977196512
+ },
+ {
+ "date": "2022-11-10",
+ "value": -0.05930426259594457
+ },
+ {
+ "date": "2022-11-11",
+ "value": -0.05467374567955885
+ },
+ {
+ "date": "2022-11-14",
+ "value": -0.05943657992074647
+ },
+ {
+ "date": "2022-11-15",
+ "value": -0.06602632406313458
+ },
+ {
+ "date": "2022-11-16",
+ "value": -0.06735649495752316
+ },
+ {
+ "date": "2022-11-17",
+ "value": -0.073011403450701
+ },
+ {
+ "date": "2022-11-18",
+ "value": -0.06349207436234561
+ },
+ {
+ "date": "2022-11-21",
+ "value": -0.04206013686615395
+ },
+ {
+ "date": "2022-11-22",
+ "value": -0.0390616394301766
+ },
+ {
+ "date": "2022-11-23",
+ "value": -0.03479685086743045
+ },
+ {
+ "date": "2022-11-24",
+ "value": -0.03506111509512011
+ },
+ {
+ "date": "2022-11-25",
+ "value": -0.03984893589088434
+ },
+ {
+ "date": "2022-11-28",
+ "value": -0.04210067963325437
+ },
+ {
+ "date": "2022-11-29",
+ "value": -0.0394452274441931
+ },
+ {
+ "date": "2022-11-30",
+ "value": -0.05184220006972717
+ },
+ {
+ "date": "2022-12-01",
+ "value": -0.06062817059634862
+ },
+ {
+ "date": "2022-12-02",
+ "value": -0.07358241926173692
+ },
+ {
+ "date": "2022-12-05",
+ "value": -0.08093764871846132
+ },
+ {
+ "date": "2022-12-06",
+ "value": -0.08944076902423337
+ },
+ {
+ "date": "2022-12-07",
+ "value": -0.09325347888014857
+ },
+ {
+ "date": "2022-12-08",
+ "value": -0.09436418538106561
+ },
+ {
+ "date": "2022-12-09",
+ "value": -0.08178175694723322
+ },
+ {
+ "date": "2022-12-12",
+ "value": -0.07788730975375124
+ },
+ {
+ "date": "2022-12-13",
+ "value": -0.07560837736408443
+ },
+ {
+ "date": "2022-12-14",
+ "value": -0.0858143264943616
+ },
+ {
+ "date": "2022-12-15",
+ "value": -0.09196660721456817
+ },
+ {
+ "date": "2022-12-16",
+ "value": -0.10228832250878239
+ },
+ {
+ "date": "2022-12-19",
+ "value": -0.09159031022413355
+ },
+ {
+ "date": "2022-12-20",
+ "value": -0.09395334014018808
+ },
+ {
+ "date": "2022-12-21",
+ "value": -0.09452693210866692
+ },
+ {
+ "date": "2022-12-22",
+ "value": -0.0936605410020882
+ },
+ {
+ "date": "2022-12-23",
+ "value": -0.09263646774361989
+ },
+ {
+ "date": "2022-12-26",
+ "value": -0.07866826181159459
+ },
+ {
+ "date": "2022-12-27",
+ "value": -0.07533852300689525
+ },
+ {
+ "date": "2022-12-28",
+ "value": -0.07078303426112365
+ },
+ {
+ "date": "2022-12-29",
+ "value": -0.061640213337893934
+ },
+ {
+ "date": "2022-12-30",
+ "value": -0.07097312252392218
+ },
+ {
+ "date": "2023-01-02",
+ "value": -0.06852332690080876
+ },
+ {
+ "date": "2023-01-03",
+ "value": -0.0660474164261825
+ },
+ {
+ "date": "2023-01-04",
+ "value": -0.0730093153295347
+ },
+ {
+ "date": "2023-01-05",
+ "value": -0.0690249415550247
+ },
+ {
+ "date": "2023-01-06",
+ "value": -0.06216421011368434
+ },
+ {
+ "date": "2023-01-09",
+ "value": -0.06709043606827503
+ },
+ {
+ "date": "2023-01-10",
+ "value": -0.05780490295879537
+ },
+ {
+ "date": "2023-01-11",
+ "value": -0.0515036985692785
+ },
+ {
+ "date": "2023-01-12",
+ "value": -0.03138197884523708
+ },
+ {
+ "date": "2023-01-13",
+ "value": -0.036392878101459525
+ },
+ {
+ "date": "2023-01-16",
+ "value": -0.032102535203992866
+ },
+ {
+ "date": "2023-01-17",
+ "value": -0.04587665767357807
+ },
+ {
+ "date": "2023-01-18",
+ "value": -0.06351407706262258
+ },
+ {
+ "date": "2023-01-19",
+ "value": -0.04573625781704471
+ },
+ {
+ "date": "2023-01-20",
+ "value": -0.05007527562940173
+ },
+ {
+ "date": "2023-01-23",
+ "value": -0.04162605510809669
+ },
+ {
+ "date": "2023-01-24",
+ "value": -0.04447309099252761
+ },
+ {
+ "date": "2023-01-25",
+ "value": -0.04337215200205358
+ },
+ {
+ "date": "2023-01-26",
+ "value": -0.06761464529162864
+ },
+ {
+ "date": "2023-01-27",
+ "value": -0.06583073462915989
+ },
+ {
+ "date": "2023-01-30",
+ "value": -0.06847027068484401
+ },
+ {
+ "date": "2023-01-31",
+ "value": -0.0714419919493876
+ },
+ {
+ "date": "2023-02-01",
+ "value": -0.080601820242443
+ },
+ {
+ "date": "2023-02-02",
+ "value": -0.09218083795465892
+ },
+ {
+ "date": "2023-02-03",
+ "value": -0.08106524817084537
+ },
+ {
+ "date": "2023-02-06",
+ "value": -0.08256432423941928
+ },
+ {
+ "date": "2023-02-07",
+ "value": -0.09612738872981252
+ },
+ {
+ "date": "2023-02-08",
+ "value": -0.09532656499787573
+ },
+ {
+ "date": "2023-02-09",
+ "value": -0.08143069085791488
+ },
+ {
+ "date": "2023-02-10",
+ "value": -0.08443427924593483
+ },
+ {
+ "date": "2023-02-13",
+ "value": -0.09575215350661104
+ },
+ {
+ "date": "2023-02-14",
+ "value": -0.09013845356015349
+ },
+ {
+ "date": "2023-02-15",
+ "value": -0.0885264135767887
+ },
+ {
+ "date": "2023-02-16",
+ "value": -0.08894271784852714
+ },
+ {
+ "date": "2023-02-17",
+ "value": -0.08101208226736734
+ },
+ {
+ "date": "2023-02-20",
+ "value": -0.08309871701557592
+ },
+ {
+ "date": "2023-02-21",
+ "value": -0.07828175593959519
+ },
+ {
+ "date": "2023-02-22",
+ "value": -0.07525874139451527
+ },
+ {
+ "date": "2023-02-23",
+ "value": -0.06343408445233423
+ },
+ {
+ "date": "2023-02-24",
+ "value": -0.0751412301175528
+ },
+ {
+ "date": "2023-02-27",
+ "value": -0.08646197895314245
+ },
+ {
+ "date": "2023-02-28",
+ "value": -0.08010724489849042
+ },
+ {
+ "date": "2023-03-01",
+ "value": -0.09026184987011765
+ },
+ {
+ "date": "2023-03-02",
+ "value": -0.11065798512713676
+ },
+ {
+ "date": "2023-03-03",
+ "value": -0.11235356444201994
+ },
+ {
+ "date": "2023-03-06",
+ "value": -0.12386021112259649
+ },
+ {
+ "date": "2023-03-07",
+ "value": -0.13533431643800564
+ },
+ {
+ "date": "2023-03-08",
+ "value": -0.12186895958106403
+ },
+ {
+ "date": "2023-03-09",
+ "value": -0.1137249044249905
+ },
+ {
+ "date": "2023-03-10",
+ "value": -0.12803625865467239
+ },
+ {
+ "date": "2023-03-13",
+ "value": -0.12091779979468054
+ },
+ {
+ "date": "2023-03-14",
+ "value": -0.11341504061698571
+ },
+ {
+ "date": "2023-03-15",
+ "value": -0.11419672761948418
+ },
+ {
+ "date": "2023-03-16",
+ "value": -0.12464904651005204
+ },
+ {
+ "date": "2023-03-17",
+ "value": -0.12575740557871118
+ },
+ {
+ "date": "2023-03-20",
+ "value": -0.13386061124790616
+ },
+ {
+ "date": "2023-03-21",
+ "value": -0.13123418243823903
+ },
+ {
+ "date": "2023-03-22",
+ "value": -0.13990977837594964
+ },
+ {
+ "date": "2023-03-23",
+ "value": -0.14441594992819973
+ },
+ {
+ "date": "2023-03-24",
+ "value": -0.14217014420504237
+ },
+ {
+ "date": "2023-03-27",
+ "value": -0.14136385990729472
+ },
+ {
+ "date": "2023-03-28",
+ "value": -0.1416332679212141
+ },
+ {
+ "date": "2023-03-29",
+ "value": -0.13646066207837826
+ },
+ {
+ "date": "2023-03-30",
+ "value": -0.13168679174227416
+ },
+ {
+ "date": "2023-03-31",
+ "value": -0.12498310133586843
+ },
+ {
+ "date": "2023-04-03",
+ "value": -0.1197031080619595
+ },
+ {
+ "date": "2023-04-04",
+ "value": -0.11571913824161306
+ },
+ {
+ "date": "2023-04-05",
+ "value": -0.13762258602154653
+ },
+ {
+ "date": "2023-04-06",
+ "value": -0.13739227410632282
+ },
+ {
+ "date": "2023-04-07",
+ "value": -0.13557396900668095
+ },
+ {
+ "date": "2023-04-10",
+ "value": -0.11907566974757777
+ },
+ {
+ "date": "2023-04-11",
+ "value": -0.11794563003602876
+ },
+ {
+ "date": "2023-04-12",
+ "value": -0.1307801298304304
+ },
+ {
+ "date": "2023-04-13",
+ "value": -0.12763050500255668
+ },
+ {
+ "date": "2023-04-14",
+ "value": -0.1089207469842225
+ },
+ {
+ "date": "2023-04-17",
+ "value": -0.11161292534668232
+ },
+ {
+ "date": "2023-04-18",
+ "value": -0.11714641193826614
+ },
+ {
+ "date": "2023-04-19",
+ "value": -0.12041759279384356
+ },
+ {
+ "date": "2023-04-20",
+ "value": -0.11729804464243487
+ },
+ {
+ "date": "2023-04-21",
+ "value": -0.12285142440610475
+ },
+ {
+ "date": "2023-04-24",
+ "value": -0.13953241492421953
+ },
+ {
+ "date": "2023-04-25",
+ "value": -0.1455384128304581
+ },
+ {
+ "date": "2023-04-26",
+ "value": -0.1483063614514647
+ },
+ {
+ "date": "2023-04-27",
+ "value": -0.14501127091613475
+ },
+ {
+ "date": "2023-04-28",
+ "value": -0.12584186296607702
+ },
+ {
+ "date": "2023-05-01",
+ "value": -0.13888918320415622
+ },
+ {
+ "date": "2023-05-02",
+ "value": -0.132898214392569
+ },
+ {
+ "date": "2023-05-03",
+ "value": -0.13321786288378912
+ },
+ {
+ "date": "2023-05-04",
+ "value": -0.13137947261091976
+ },
+ {
+ "date": "2023-05-05",
+ "value": -0.13434759682241626
+ },
+ {
+ "date": "2023-05-08",
+ "value": -0.13892753716111972
+ },
+ {
+ "date": "2023-05-09",
+ "value": -0.13767884422178578
+ },
+ {
+ "date": "2023-05-10",
+ "value": -0.14488544653277013
+ },
+ {
+ "date": "2023-05-11",
+ "value": -0.13628954590584552
+ },
+ {
+ "date": "2023-05-12",
+ "value": -0.1266440009034976
+ },
+ {
+ "date": "2023-05-15",
+ "value": -0.12287782080863097
+ },
+ {
+ "date": "2023-05-16",
+ "value": -0.12983982591264787
+ },
+ {
+ "date": "2023-05-17",
+ "value": -0.12208116373549993
+ },
+ {
+ "date": "2023-05-18",
+ "value": -0.11690399735275525
+ },
+ {
+ "date": "2023-05-19",
+ "value": -0.12087937059891096
+ },
+ {
+ "date": "2023-05-22",
+ "value": -0.12136896310632461
+ },
+ {
+ "date": "2023-05-23",
+ "value": -0.10533104975069574
+ },
+ {
+ "date": "2023-05-24",
+ "value": -0.11942396454245385
+ },
+ {
+ "date": "2023-05-25",
+ "value": -0.09318527054265224
+ },
+ {
+ "date": "2023-05-26",
+ "value": -0.10977762777794742
+ },
+ {
+ "date": "2023-05-29",
+ "value": -0.10540544805038587
+ },
+ {
+ "date": "2023-05-30",
+ "value": -0.10895780411346534
+ },
+ {
+ "date": "2023-05-31",
+ "value": -0.10857810443644245
+ },
+ {
+ "date": "2023-06-01",
+ "value": -0.11557261288948917
+ },
+ {
+ "date": "2023-06-02",
+ "value": -0.10198097662627081
+ },
+ {
+ "date": "2023-06-05",
+ "value": -0.07426845210465516
+ },
+ {
+ "date": "2023-06-06",
+ "value": -0.0770992889205786
+ },
+ {
+ "date": "2023-06-07",
+ "value": -0.06557174689366974
+ },
+ {
+ "date": "2023-06-08",
+ "value": -0.056945381866214895
+ },
+ {
+ "date": "2023-06-09",
+ "value": -0.05544891808786723
+ },
+ {
+ "date": "2023-06-12",
+ "value": -0.04017852948436307
+ },
+ {
+ "date": "2023-06-13",
+ "value": -0.05856353979555007
+ },
+ {
+ "date": "2023-06-14",
+ "value": -0.05887131044538474
+ },
+ {
+ "date": "2023-06-15",
+ "value": -0.06726289374436423
+ },
+ {
+ "date": "2023-06-16",
+ "value": -0.06879984896531788
+ },
+ {
+ "date": "2023-06-19",
+ "value": -0.07721499740966475
+ },
+ {
+ "date": "2023-06-20",
+ "value": -0.07667964113603076
+ },
+ {
+ "date": "2023-06-21",
+ "value": -0.0736940657301911
+ },
+ {
+ "date": "2023-06-22",
+ "value": -0.08906762448111649
+ },
+ {
+ "date": "2023-06-23",
+ "value": -0.08068988898264218
+ },
+ {
+ "date": "2023-06-26",
+ "value": -0.06750458842327567
+ },
+ {
+ "date": "2023-06-27",
+ "value": -0.054963194435141305
+ },
+ {
+ "date": "2023-06-28",
+ "value": -0.0509435260918486
+ },
+ {
+ "date": "2023-06-29",
+ "value": -0.04545453593330995
+ },
+ {
+ "date": "2023-06-30",
+ "value": -0.049243726180653646
+ },
+ {
+ "date": "2023-07-03",
+ "value": -0.04806135952670376
+ },
+ {
+ "date": "2023-07-04",
+ "value": -0.05274228875189424
+ },
+ {
+ "date": "2023-07-05",
+ "value": -0.04947285464181361
+ },
+ {
+ "date": "2023-07-06",
+ "value": -0.058608615416401055
+ },
+ {
+ "date": "2023-07-07",
+ "value": -0.06661264433359526
+ },
+ {
+ "date": "2023-07-10",
+ "value": -0.06714373658232853
+ },
+ {
+ "date": "2023-07-11",
+ "value": -0.06451997179466529
+ },
+ {
+ "date": "2023-07-12",
+ "value": -0.07642629458646522
+ },
+ {
+ "date": "2023-07-13",
+ "value": -0.07633000113950295
+ },
+ {
+ "date": "2023-07-14",
+ "value": -0.07822030203178043
+ },
+ {
+ "date": "2023-07-17",
+ "value": -0.07361789586979384
+ },
+ {
+ "date": "2023-07-18",
+ "value": -0.06250450285537212
+ },
+ {
+ "date": "2023-07-19",
+ "value": -0.06696352210212086
+ },
+ {
+ "date": "2023-07-20",
+ "value": -0.07800514265928504
+ },
+ {
+ "date": "2023-07-21",
+ "value": -0.09519584683114046
+ },
+ {
+ "date": "2023-07-24",
+ "value": -0.09346112298725728
+ },
+ {
+ "date": "2023-07-25",
+ "value": -0.08186090984072647
+ },
+ {
+ "date": "2023-07-26",
+ "value": -0.08020254243419878
+ },
+ {
+ "date": "2023-07-27",
+ "value": -0.08577804877366091
+ },
+ {
+ "date": "2023-07-28",
+ "value": -0.07715851985672839
+ },
+ {
+ "date": "2023-07-31",
+ "value": -0.07171630817655439
+ },
+ {
+ "date": "2023-08-01",
+ "value": -0.07071291680198111
+ },
+ {
+ "date": "2023-08-02",
+ "value": -0.07037505782526354
+ },
+ {
+ "date": "2023-08-03",
+ "value": -0.07868587274150207
+ },
+ {
+ "date": "2023-08-04",
+ "value": -0.07687664999136223
+ },
+ {
+ "date": "2023-08-07",
+ "value": -0.06893915242967619
+ },
+ {
+ "date": "2023-08-08",
+ "value": -0.07847559753699962
+ },
+ {
+ "date": "2023-08-09",
+ "value": -0.06459791702478934
+ },
+ {
+ "date": "2023-08-10",
+ "value": -0.06669321930436567
+ },
+ {
+ "date": "2023-08-11",
+ "value": -0.05101691487920712
+ },
+ {
+ "date": "2023-08-14",
+ "value": -0.041195512215407515
+ },
+ {
+ "date": "2023-08-15",
+ "value": -0.06750786432515277
+ },
+ {
+ "date": "2023-08-16",
+ "value": -0.04445172604158221
+ },
+ {
+ "date": "2023-08-17",
+ "value": -0.05326769225905004
+ },
+ {
+ "date": "2023-08-18",
+ "value": -0.04725660204957649
+ },
+ {
+ "date": "2023-08-21",
+ "value": -0.04143359252104417
+ },
+ {
+ "date": "2023-08-22",
+ "value": -0.05023789369225984
+ },
+ {
+ "date": "2023-08-23",
+ "value": -0.04853472556794869
+ },
+ {
+ "date": "2023-08-24",
+ "value": -0.036665871045439724
+ },
+ {
+ "date": "2023-08-25",
+ "value": -0.03315841374277695
+ },
+ {
+ "date": "2023-08-28",
+ "value": -0.048346276946537925
+ },
+ {
+ "date": "2023-08-29",
+ "value": -0.048498542552048995
+ },
+ {
+ "date": "2023-08-30",
+ "value": -0.059407675429425266
+ },
+ {
+ "date": "2023-08-31",
+ "value": -0.05949626703484556
+ },
+ {
+ "date": "2023-09-01",
+ "value": -0.05769393482701002
+ },
+ {
+ "date": "2023-09-04",
+ "value": -0.05851450627056942
+ },
+ {
+ "date": "2023-09-05",
+ "value": -0.07732987058428409
+ },
+ {
+ "date": "2023-09-06",
+ "value": -0.060276037861411114
+ },
+ {
+ "date": "2023-09-07",
+ "value": -0.07292665914769847
+ },
+ {
+ "date": "2023-09-08",
+ "value": -0.05312494814388413
+ },
+ {
+ "date": "2023-09-11",
+ "value": -0.05429522137252807
+ },
+ {
+ "date": "2023-09-12",
+ "value": -0.055108046743452044
+ },
+ {
+ "date": "2023-09-13",
+ "value": -0.06874458891069468
+ },
+ {
+ "date": "2023-09-14",
+ "value": -0.06541828563664653
+ },
+ {
+ "date": "2023-09-15",
+ "value": -0.09777158993572721
+ },
+ {
+ "date": "2023-09-18",
+ "value": -0.09587092285129506
+ },
+ {
+ "date": "2023-09-19",
+ "value": -0.09839934706756415
+ },
+ {
+ "date": "2023-09-20",
+ "value": -0.09640743067674007
+ },
+ {
+ "date": "2023-09-21",
+ "value": -0.10349103444583108
+ },
+ {
+ "date": "2023-09-22",
+ "value": -0.13079010642150213
+ },
+ {
+ "date": "2023-09-25",
+ "value": -0.1383773297899863
+ },
+ {
+ "date": "2023-09-26",
+ "value": -0.13302600604695114
+ },
+ {
+ "date": "2023-09-27",
+ "value": -0.13506084727541212
+ },
+ {
+ "date": "2023-09-28",
+ "value": -0.13341873126645276
+ },
+ {
+ "date": "2023-09-29",
+ "value": -0.13247721110522725
+ },
+ {
+ "date": "2023-10-02",
+ "value": -0.11970180491590365
+ },
+ {
+ "date": "2023-10-03",
+ "value": -0.11774768298041871
+ },
+ {
+ "date": "2023-10-04",
+ "value": -0.11001637739310288
+ },
+ {
+ "date": "2023-10-05",
+ "value": -0.10429242616723289
+ },
+ {
+ "date": "2023-10-06",
+ "value": -0.0950404642343855
+ },
+ {
+ "date": "2023-10-09",
+ "value": -0.09273217935812494
+ },
+ {
+ "date": "2023-10-10",
+ "value": -0.10393738516646867
+ },
+ {
+ "date": "2023-10-11",
+ "value": -0.09288874506363165
+ },
+ {
+ "date": "2023-10-12",
+ "value": -0.10769320440191132
+ },
+ {
+ "date": "2023-10-13",
+ "value": -0.11051760650544995
+ },
+ {
+ "date": "2023-10-16",
+ "value": -0.09928318768525224
+ },
+ {
+ "date": "2023-10-17",
+ "value": -0.0910866722391771
+ },
+ {
+ "date": "2023-10-18",
+ "value": -0.08751091405599432
+ },
+ {
+ "date": "2023-10-19",
+ "value": -0.08172998010072852
+ },
+ {
+ "date": "2023-10-20",
+ "value": -0.07744842524591322
+ },
+ {
+ "date": "2023-10-23",
+ "value": -0.07329905335148323
+ },
+ {
+ "date": "2023-10-24",
+ "value": -0.061466434250777024
+ },
+ {
+ "date": "2023-10-25",
+ "value": -0.06432759281285272
+ },
+ {
+ "date": "2023-10-26",
+ "value": -0.05146071374813077
+ },
+ {
+ "date": "2023-10-27",
+ "value": -0.06569159229567734
+ },
+ {
+ "date": "2023-10-30",
+ "value": -0.06775967199536337
+ },
+ {
+ "date": "2023-10-31",
+ "value": -0.05948699841782645
+ }
+ ],
+ "rolling_sharpe": [
+ {
+ "date": "2020-01-02",
+ "value": null
+ },
+ {
+ "date": "2020-01-03",
+ "value": null
+ },
+ {
+ "date": "2020-01-06",
+ "value": null
+ },
+ {
+ "date": "2020-01-07",
+ "value": null
+ },
+ {
+ "date": "2020-01-08",
+ "value": null
+ },
+ {
+ "date": "2020-01-09",
+ "value": null
+ },
+ {
+ "date": "2020-01-10",
+ "value": null
+ },
+ {
+ "date": "2020-01-13",
+ "value": null
+ },
+ {
+ "date": "2020-01-14",
+ "value": null
+ },
+ {
+ "date": "2020-01-15",
+ "value": null
+ },
+ {
+ "date": "2020-01-16",
+ "value": null
+ },
+ {
+ "date": "2020-01-17",
+ "value": null
+ },
+ {
+ "date": "2020-01-20",
+ "value": null
+ },
+ {
+ "date": "2020-01-21",
+ "value": null
+ },
+ {
+ "date": "2020-01-22",
+ "value": null
+ },
+ {
+ "date": "2020-01-23",
+ "value": null
+ },
+ {
+ "date": "2020-01-24",
+ "value": null
+ },
+ {
+ "date": "2020-01-27",
+ "value": null
+ },
+ {
+ "date": "2020-01-28",
+ "value": null
+ },
+ {
+ "date": "2020-01-29",
+ "value": null
+ },
+ {
+ "date": "2020-01-30",
+ "value": null
+ },
+ {
+ "date": "2020-01-31",
+ "value": null
+ },
+ {
+ "date": "2020-02-03",
+ "value": null
+ },
+ {
+ "date": "2020-02-04",
+ "value": null
+ },
+ {
+ "date": "2020-02-05",
+ "value": null
+ },
+ {
+ "date": "2020-02-06",
+ "value": null
+ },
+ {
+ "date": "2020-02-07",
+ "value": null
+ },
+ {
+ "date": "2020-02-10",
+ "value": null
+ },
+ {
+ "date": "2020-02-11",
+ "value": null
+ },
+ {
+ "date": "2020-02-12",
+ "value": null
+ },
+ {
+ "date": "2020-02-13",
+ "value": null
+ },
+ {
+ "date": "2020-02-14",
+ "value": null
+ },
+ {
+ "date": "2020-02-17",
+ "value": null
+ },
+ {
+ "date": "2020-02-18",
+ "value": null
+ },
+ {
+ "date": "2020-02-19",
+ "value": null
+ },
+ {
+ "date": "2020-02-20",
+ "value": null
+ },
+ {
+ "date": "2020-02-21",
+ "value": null
+ },
+ {
+ "date": "2020-02-24",
+ "value": null
+ },
+ {
+ "date": "2020-02-25",
+ "value": null
+ },
+ {
+ "date": "2020-02-26",
+ "value": null
+ },
+ {
+ "date": "2020-02-27",
+ "value": null
+ },
+ {
+ "date": "2020-02-28",
+ "value": null
+ },
+ {
+ "date": "2020-03-02",
+ "value": null
+ },
+ {
+ "date": "2020-03-03",
+ "value": null
+ },
+ {
+ "date": "2020-03-04",
+ "value": null
+ },
+ {
+ "date": "2020-03-05",
+ "value": null
+ },
+ {
+ "date": "2020-03-06",
+ "value": null
+ },
+ {
+ "date": "2020-03-09",
+ "value": null
+ },
+ {
+ "date": "2020-03-10",
+ "value": null
+ },
+ {
+ "date": "2020-03-11",
+ "value": null
+ },
+ {
+ "date": "2020-03-12",
+ "value": null
+ },
+ {
+ "date": "2020-03-13",
+ "value": null
+ },
+ {
+ "date": "2020-03-16",
+ "value": null
+ },
+ {
+ "date": "2020-03-17",
+ "value": null
+ },
+ {
+ "date": "2020-03-18",
+ "value": null
+ },
+ {
+ "date": "2020-03-19",
+ "value": null
+ },
+ {
+ "date": "2020-03-20",
+ "value": null
+ },
+ {
+ "date": "2020-03-23",
+ "value": null
+ },
+ {
+ "date": "2020-03-24",
+ "value": null
+ },
+ {
+ "date": "2020-03-25",
+ "value": null
+ },
+ {
+ "date": "2020-03-26",
+ "value": null
+ },
+ {
+ "date": "2020-03-27",
+ "value": null
+ },
+ {
+ "date": "2020-03-30",
+ "value": null
+ },
+ {
+ "date": "2020-03-31",
+ "value": null
+ },
+ {
+ "date": "2020-04-01",
+ "value": null
+ },
+ {
+ "date": "2020-04-02",
+ "value": null
+ },
+ {
+ "date": "2020-04-03",
+ "value": null
+ },
+ {
+ "date": "2020-04-06",
+ "value": null
+ },
+ {
+ "date": "2020-04-07",
+ "value": null
+ },
+ {
+ "date": "2020-04-08",
+ "value": null
+ },
+ {
+ "date": "2020-04-09",
+ "value": null
+ },
+ {
+ "date": "2020-04-10",
+ "value": null
+ },
+ {
+ "date": "2020-04-13",
+ "value": null
+ },
+ {
+ "date": "2020-04-14",
+ "value": null
+ },
+ {
+ "date": "2020-04-15",
+ "value": null
+ },
+ {
+ "date": "2020-04-16",
+ "value": null
+ },
+ {
+ "date": "2020-04-17",
+ "value": null
+ },
+ {
+ "date": "2020-04-20",
+ "value": null
+ },
+ {
+ "date": "2020-04-21",
+ "value": null
+ },
+ {
+ "date": "2020-04-22",
+ "value": null
+ },
+ {
+ "date": "2020-04-23",
+ "value": null
+ },
+ {
+ "date": "2020-04-24",
+ "value": null
+ },
+ {
+ "date": "2020-04-27",
+ "value": null
+ },
+ {
+ "date": "2020-04-28",
+ "value": null
+ },
+ {
+ "date": "2020-04-29",
+ "value": null
+ },
+ {
+ "date": "2020-04-30",
+ "value": null
+ },
+ {
+ "date": "2020-05-01",
+ "value": null
+ },
+ {
+ "date": "2020-05-04",
+ "value": null
+ },
+ {
+ "date": "2020-05-05",
+ "value": null
+ },
+ {
+ "date": "2020-05-06",
+ "value": null
+ },
+ {
+ "date": "2020-05-07",
+ "value": null
+ },
+ {
+ "date": "2020-05-08",
+ "value": null
+ },
+ {
+ "date": "2020-05-11",
+ "value": null
+ },
+ {
+ "date": "2020-05-12",
+ "value": null
+ },
+ {
+ "date": "2020-05-13",
+ "value": null
+ },
+ {
+ "date": "2020-05-14",
+ "value": null
+ },
+ {
+ "date": "2020-05-15",
+ "value": null
+ },
+ {
+ "date": "2020-05-18",
+ "value": null
+ },
+ {
+ "date": "2020-05-19",
+ "value": null
+ },
+ {
+ "date": "2020-05-20",
+ "value": null
+ },
+ {
+ "date": "2020-05-21",
+ "value": null
+ },
+ {
+ "date": "2020-05-22",
+ "value": null
+ },
+ {
+ "date": "2020-05-25",
+ "value": null
+ },
+ {
+ "date": "2020-05-26",
+ "value": null
+ },
+ {
+ "date": "2020-05-27",
+ "value": null
+ },
+ {
+ "date": "2020-05-28",
+ "value": null
+ },
+ {
+ "date": "2020-05-29",
+ "value": null
+ },
+ {
+ "date": "2020-06-01",
+ "value": null
+ },
+ {
+ "date": "2020-06-02",
+ "value": null
+ },
+ {
+ "date": "2020-06-03",
+ "value": null
+ },
+ {
+ "date": "2020-06-04",
+ "value": null
+ },
+ {
+ "date": "2020-06-05",
+ "value": null
+ },
+ {
+ "date": "2020-06-08",
+ "value": null
+ },
+ {
+ "date": "2020-06-09",
+ "value": null
+ },
+ {
+ "date": "2020-06-10",
+ "value": null
+ },
+ {
+ "date": "2020-06-11",
+ "value": null
+ },
+ {
+ "date": "2020-06-12",
+ "value": null
+ },
+ {
+ "date": "2020-06-15",
+ "value": null
+ },
+ {
+ "date": "2020-06-16",
+ "value": null
+ },
+ {
+ "date": "2020-06-17",
+ "value": null
+ },
+ {
+ "date": "2020-06-18",
+ "value": null
+ },
+ {
+ "date": "2020-06-19",
+ "value": null
+ },
+ {
+ "date": "2020-06-22",
+ "value": null
+ },
+ {
+ "date": "2020-06-23",
+ "value": null
+ },
+ {
+ "date": "2020-06-24",
+ "value": null
+ },
+ {
+ "date": "2020-06-25",
+ "value": -45.444050378740286
+ },
+ {
+ "date": "2020-06-26",
+ "value": -45.30696855874398
+ },
+ {
+ "date": "2020-06-29",
+ "value": -45.17089914309896
+ },
+ {
+ "date": "2020-06-30",
+ "value": -44.819620369857944
+ },
+ {
+ "date": "2020-07-01",
+ "value": -44.37278246178799
+ },
+ {
+ "date": "2020-07-02",
+ "value": -44.44597316755636
+ },
+ {
+ "date": "2020-07-03",
+ "value": -44.46685253137314
+ },
+ {
+ "date": "2020-07-06",
+ "value": -44.43384742063737
+ },
+ {
+ "date": "2020-07-07",
+ "value": -45.26783331545697
+ },
+ {
+ "date": "2020-07-08",
+ "value": -45.554345623104325
+ },
+ {
+ "date": "2020-07-09",
+ "value": -45.35052223066262
+ },
+ {
+ "date": "2020-07-10",
+ "value": -45.3348393327659
+ },
+ {
+ "date": "2020-07-13",
+ "value": -45.689955441211
+ },
+ {
+ "date": "2020-07-14",
+ "value": -46.01872931675876
+ },
+ {
+ "date": "2020-07-15",
+ "value": -45.86809069255321
+ },
+ {
+ "date": "2020-07-16",
+ "value": -45.44287485936189
+ },
+ {
+ "date": "2020-07-17",
+ "value": -45.7615299175832
+ },
+ {
+ "date": "2020-07-20",
+ "value": -45.68026748742035
+ },
+ {
+ "date": "2020-07-21",
+ "value": -45.341850312461496
+ },
+ {
+ "date": "2020-07-22",
+ "value": -45.59162826238078
+ },
+ {
+ "date": "2020-07-23",
+ "value": -45.881504558273434
+ },
+ {
+ "date": "2020-07-24",
+ "value": -45.73150793930833
+ },
+ {
+ "date": "2020-07-27",
+ "value": -45.776335539024025
+ },
+ {
+ "date": "2020-07-28",
+ "value": -46.39084028775021
+ },
+ {
+ "date": "2020-07-29",
+ "value": -46.716555333299915
+ },
+ {
+ "date": "2020-07-30",
+ "value": -46.59247119164196
+ },
+ {
+ "date": "2020-07-31",
+ "value": -46.754496689422275
+ },
+ {
+ "date": "2020-08-03",
+ "value": -46.78234963906571
+ },
+ {
+ "date": "2020-08-04",
+ "value": -46.906837403457864
+ },
+ {
+ "date": "2020-08-05",
+ "value": -46.85604148709348
+ },
+ {
+ "date": "2020-08-06",
+ "value": -46.58540111148493
+ },
+ {
+ "date": "2020-08-07",
+ "value": -46.718501333985344
+ },
+ {
+ "date": "2020-08-10",
+ "value": -46.179313407473714
+ },
+ {
+ "date": "2020-08-11",
+ "value": -45.893132716082036
+ },
+ {
+ "date": "2020-08-12",
+ "value": -45.772829221210834
+ },
+ {
+ "date": "2020-08-13",
+ "value": -45.32064936212113
+ },
+ {
+ "date": "2020-08-14",
+ "value": -45.239589474894125
+ },
+ {
+ "date": "2020-08-17",
+ "value": -45.325046990489
+ },
+ {
+ "date": "2020-08-18",
+ "value": -46.12205843962057
+ },
+ {
+ "date": "2020-08-19",
+ "value": -45.97500824959783
+ },
+ {
+ "date": "2020-08-20",
+ "value": -45.962887058473775
+ },
+ {
+ "date": "2020-08-21",
+ "value": -45.93443211192661
+ },
+ {
+ "date": "2020-08-24",
+ "value": -45.993943884203986
+ },
+ {
+ "date": "2020-08-25",
+ "value": -46.23808261809548
+ },
+ {
+ "date": "2020-08-26",
+ "value": -46.23860204344242
+ },
+ {
+ "date": "2020-08-27",
+ "value": -46.36912030829003
+ },
+ {
+ "date": "2020-08-28",
+ "value": -45.48281781733673
+ },
+ {
+ "date": "2020-08-31",
+ "value": -45.599338818209525
+ },
+ {
+ "date": "2020-09-01",
+ "value": -45.784218931272605
+ },
+ {
+ "date": "2020-09-02",
+ "value": -45.81341950025582
+ },
+ {
+ "date": "2020-09-03",
+ "value": -46.34619945881993
+ },
+ {
+ "date": "2020-09-04",
+ "value": -46.3554259868679
+ },
+ {
+ "date": "2020-09-07",
+ "value": -46.26073553459674
+ },
+ {
+ "date": "2020-09-08",
+ "value": -46.33887234392338
+ },
+ {
+ "date": "2020-09-09",
+ "value": -45.954628549679484
+ },
+ {
+ "date": "2020-09-10",
+ "value": -45.8962342058434
+ },
+ {
+ "date": "2020-09-11",
+ "value": -46.015920494415894
+ },
+ {
+ "date": "2020-09-14",
+ "value": -46.10350352261767
+ },
+ {
+ "date": "2020-09-15",
+ "value": -46.17429554153766
+ },
+ {
+ "date": "2020-09-16",
+ "value": -46.22147926898513
+ },
+ {
+ "date": "2020-09-17",
+ "value": -46.315428061328184
+ },
+ {
+ "date": "2020-09-18",
+ "value": -45.69926219926204
+ },
+ {
+ "date": "2020-09-21",
+ "value": -45.61117366901314
+ },
+ {
+ "date": "2020-09-22",
+ "value": -45.9276437917552
+ },
+ {
+ "date": "2020-09-23",
+ "value": -46.04161600806433
+ },
+ {
+ "date": "2020-09-24",
+ "value": -46.130814813648136
+ },
+ {
+ "date": "2020-09-25",
+ "value": -46.08562949108101
+ },
+ {
+ "date": "2020-09-28",
+ "value": -46.01311841669221
+ },
+ {
+ "date": "2020-09-29",
+ "value": -45.981833662032116
+ },
+ {
+ "date": "2020-09-30",
+ "value": -46.19633019392806
+ },
+ {
+ "date": "2020-10-01",
+ "value": -46.52181368724153
+ },
+ {
+ "date": "2020-10-02",
+ "value": -46.48258718351056
+ },
+ {
+ "date": "2020-10-05",
+ "value": -46.64890023962169
+ },
+ {
+ "date": "2020-10-06",
+ "value": -46.69253182526522
+ },
+ {
+ "date": "2020-10-07",
+ "value": -46.654116700076834
+ },
+ {
+ "date": "2020-10-08",
+ "value": -46.65087630115671
+ },
+ {
+ "date": "2020-10-09",
+ "value": -46.372244653116454
+ },
+ {
+ "date": "2020-10-12",
+ "value": -45.98682251386646
+ },
+ {
+ "date": "2020-10-13",
+ "value": -46.58202491494976
+ },
+ {
+ "date": "2020-10-14",
+ "value": -46.1767922302853
+ },
+ {
+ "date": "2020-10-15",
+ "value": -46.21564498729761
+ },
+ {
+ "date": "2020-10-16",
+ "value": -46.976512571952235
+ },
+ {
+ "date": "2020-10-19",
+ "value": -47.08795966723353
+ },
+ {
+ "date": "2020-10-20",
+ "value": -47.23267142760718
+ },
+ {
+ "date": "2020-10-21",
+ "value": -47.14746802606913
+ },
+ {
+ "date": "2020-10-22",
+ "value": -45.78716171942512
+ },
+ {
+ "date": "2020-10-23",
+ "value": -45.65005667407574
+ },
+ {
+ "date": "2020-10-26",
+ "value": -45.787031465946995
+ },
+ {
+ "date": "2020-10-27",
+ "value": -45.75121431935232
+ },
+ {
+ "date": "2020-10-28",
+ "value": -45.84049365308786
+ },
+ {
+ "date": "2020-10-29",
+ "value": -45.66037571272713
+ },
+ {
+ "date": "2020-10-30",
+ "value": -45.47860137819171
+ },
+ {
+ "date": "2020-11-02",
+ "value": -45.74597822896944
+ },
+ {
+ "date": "2020-11-03",
+ "value": -45.76984097013385
+ },
+ {
+ "date": "2020-11-04",
+ "value": -45.81025475238431
+ },
+ {
+ "date": "2020-11-05",
+ "value": -44.40534243514406
+ },
+ {
+ "date": "2020-11-06",
+ "value": -44.40510726910293
+ },
+ {
+ "date": "2020-11-09",
+ "value": -44.939936060736144
+ },
+ {
+ "date": "2020-11-10",
+ "value": -45.1124478589726
+ },
+ {
+ "date": "2020-11-11",
+ "value": -45.41600711271898
+ },
+ {
+ "date": "2020-11-12",
+ "value": -45.0953650609707
+ },
+ {
+ "date": "2020-11-13",
+ "value": -45.11928039803274
+ },
+ {
+ "date": "2020-11-16",
+ "value": -44.879040220929774
+ },
+ {
+ "date": "2020-11-17",
+ "value": -44.643559356911275
+ },
+ {
+ "date": "2020-11-18",
+ "value": -44.50046926289967
+ },
+ {
+ "date": "2020-11-19",
+ "value": -44.35881969060029
+ },
+ {
+ "date": "2020-11-20",
+ "value": -44.334569414998
+ },
+ {
+ "date": "2020-11-23",
+ "value": -44.47903969147849
+ },
+ {
+ "date": "2020-11-24",
+ "value": -44.422920966996095
+ },
+ {
+ "date": "2020-11-25",
+ "value": -44.46415861029073
+ },
+ {
+ "date": "2020-11-26",
+ "value": -44.70478607238437
+ },
+ {
+ "date": "2020-11-27",
+ "value": -44.96594174435969
+ },
+ {
+ "date": "2020-11-30",
+ "value": -44.62928075026923
+ },
+ {
+ "date": "2020-12-01",
+ "value": -43.12688826346321
+ },
+ {
+ "date": "2020-12-02",
+ "value": -43.54871161671933
+ },
+ {
+ "date": "2020-12-03",
+ "value": -42.90660727876288
+ },
+ {
+ "date": "2020-12-04",
+ "value": -42.74971569221733
+ },
+ {
+ "date": "2020-12-07",
+ "value": -42.695129377901814
+ },
+ {
+ "date": "2020-12-08",
+ "value": -43.13683995764358
+ },
+ {
+ "date": "2020-12-09",
+ "value": -43.24299972521676
+ },
+ {
+ "date": "2020-12-10",
+ "value": -43.46667611429035
+ },
+ {
+ "date": "2020-12-11",
+ "value": -43.25531398027673
+ },
+ {
+ "date": "2020-12-14",
+ "value": -43.03451820804466
+ },
+ {
+ "date": "2020-12-15",
+ "value": -42.220069396243915
+ },
+ {
+ "date": "2020-12-16",
+ "value": -42.473735446168575
+ },
+ {
+ "date": "2020-12-17",
+ "value": -42.432853568728525
+ },
+ {
+ "date": "2020-12-18",
+ "value": -42.53716589719479
+ },
+ {
+ "date": "2020-12-21",
+ "value": -43.10902133809853
+ },
+ {
+ "date": "2020-12-22",
+ "value": -43.1666489228486
+ },
+ {
+ "date": "2020-12-23",
+ "value": -43.37226343228798
+ },
+ {
+ "date": "2020-12-24",
+ "value": -43.874991855441195
+ },
+ {
+ "date": "2020-12-25",
+ "value": -43.59521175011429
+ },
+ {
+ "date": "2020-12-28",
+ "value": -43.42231623524896
+ },
+ {
+ "date": "2020-12-29",
+ "value": -43.430476362381924
+ },
+ {
+ "date": "2020-12-30",
+ "value": -43.31038304743983
+ },
+ {
+ "date": "2020-12-31",
+ "value": -43.49989953070001
+ },
+ {
+ "date": "2021-01-01",
+ "value": -43.25864161911789
+ },
+ {
+ "date": "2021-01-04",
+ "value": -43.16370457325581
+ },
+ {
+ "date": "2021-01-05",
+ "value": -43.14651615063281
+ },
+ {
+ "date": "2021-01-06",
+ "value": -43.25707661037058
+ },
+ {
+ "date": "2021-01-07",
+ "value": -43.42268911168145
+ },
+ {
+ "date": "2021-01-08",
+ "value": -43.27085257423354
+ },
+ {
+ "date": "2021-01-11",
+ "value": -43.29518742452271
+ },
+ {
+ "date": "2021-01-12",
+ "value": -43.40629697079982
+ },
+ {
+ "date": "2021-01-13",
+ "value": -43.90519066459895
+ },
+ {
+ "date": "2021-01-14",
+ "value": -44.09999232766349
+ },
+ {
+ "date": "2021-01-15",
+ "value": -43.99198716393086
+ },
+ {
+ "date": "2021-01-18",
+ "value": -43.97306529809917
+ },
+ {
+ "date": "2021-01-19",
+ "value": -43.64549954882212
+ },
+ {
+ "date": "2021-01-20",
+ "value": -43.762850086155574
+ },
+ {
+ "date": "2021-01-21",
+ "value": -43.74172994491016
+ },
+ {
+ "date": "2021-01-22",
+ "value": -42.40324468348284
+ },
+ {
+ "date": "2021-01-25",
+ "value": -42.92060959344512
+ },
+ {
+ "date": "2021-01-26",
+ "value": -42.99531922859971
+ },
+ {
+ "date": "2021-01-27",
+ "value": -42.9950721356086
+ },
+ {
+ "date": "2021-01-28",
+ "value": -43.007683696499974
+ },
+ {
+ "date": "2021-01-29",
+ "value": -43.12343960155912
+ },
+ {
+ "date": "2021-02-01",
+ "value": -43.047054112915525
+ },
+ {
+ "date": "2021-02-02",
+ "value": -43.52514168149138
+ },
+ {
+ "date": "2021-02-03",
+ "value": -43.9565228697821
+ },
+ {
+ "date": "2021-02-04",
+ "value": -43.88311405442021
+ },
+ {
+ "date": "2021-02-05",
+ "value": -43.384931406870216
+ },
+ {
+ "date": "2021-02-08",
+ "value": -42.93721842867742
+ },
+ {
+ "date": "2021-02-09",
+ "value": -42.49934203747057
+ },
+ {
+ "date": "2021-02-10",
+ "value": -42.20965050862811
+ },
+ {
+ "date": "2021-02-11",
+ "value": -42.38547278947219
+ },
+ {
+ "date": "2021-02-12",
+ "value": -42.37757028074409
+ },
+ {
+ "date": "2021-02-15",
+ "value": -42.81481399222149
+ },
+ {
+ "date": "2021-02-16",
+ "value": -42.779339804787995
+ },
+ {
+ "date": "2021-02-17",
+ "value": -42.784249822676216
+ },
+ {
+ "date": "2021-02-18",
+ "value": -42.61534913240323
+ },
+ {
+ "date": "2021-02-19",
+ "value": -42.63378011993492
+ },
+ {
+ "date": "2021-02-22",
+ "value": -43.13161519748388
+ },
+ {
+ "date": "2021-02-23",
+ "value": -42.27202169258755
+ },
+ {
+ "date": "2021-02-24",
+ "value": -42.29173532797211
+ },
+ {
+ "date": "2021-02-25",
+ "value": -42.28986812478389
+ },
+ {
+ "date": "2021-02-26",
+ "value": -42.29810979767552
+ },
+ {
+ "date": "2021-03-01",
+ "value": -42.47365058400459
+ },
+ {
+ "date": "2021-03-02",
+ "value": -42.539520106622604
+ },
+ {
+ "date": "2021-03-03",
+ "value": -42.500272677387606
+ },
+ {
+ "date": "2021-03-04",
+ "value": -42.81306362958054
+ },
+ {
+ "date": "2021-03-05",
+ "value": -42.7924019829309
+ },
+ {
+ "date": "2021-03-08",
+ "value": -42.72886991697957
+ },
+ {
+ "date": "2021-03-09",
+ "value": -42.93745633021214
+ },
+ {
+ "date": "2021-03-10",
+ "value": -43.01835676351323
+ },
+ {
+ "date": "2021-03-11",
+ "value": -43.327019514072354
+ },
+ {
+ "date": "2021-03-12",
+ "value": -43.30130130682836
+ },
+ {
+ "date": "2021-03-15",
+ "value": -43.86018282284898
+ },
+ {
+ "date": "2021-03-16",
+ "value": -43.88584157937001
+ },
+ {
+ "date": "2021-03-17",
+ "value": -43.85430484848826
+ },
+ {
+ "date": "2021-03-18",
+ "value": -43.863545804351126
+ },
+ {
+ "date": "2021-03-19",
+ "value": -43.83456936371816
+ },
+ {
+ "date": "2021-03-22",
+ "value": -43.78723188187978
+ },
+ {
+ "date": "2021-03-23",
+ "value": -43.799776409654406
+ },
+ {
+ "date": "2021-03-24",
+ "value": -43.95156360291959
+ },
+ {
+ "date": "2021-03-25",
+ "value": -43.93482736993474
+ },
+ {
+ "date": "2021-03-26",
+ "value": -44.110910465627875
+ },
+ {
+ "date": "2021-03-29",
+ "value": -44.14099798589298
+ },
+ {
+ "date": "2021-03-30",
+ "value": -44.02381891907831
+ },
+ {
+ "date": "2021-03-31",
+ "value": -43.72144944219191
+ },
+ {
+ "date": "2021-04-01",
+ "value": -44.043128461267656
+ },
+ {
+ "date": "2021-04-02",
+ "value": -43.80655063608521
+ },
+ {
+ "date": "2021-04-05",
+ "value": -44.0500711095046
+ },
+ {
+ "date": "2021-04-06",
+ "value": -44.26362741917654
+ },
+ {
+ "date": "2021-04-07",
+ "value": -43.85249738407104
+ },
+ {
+ "date": "2021-04-08",
+ "value": -43.1767698011518
+ },
+ {
+ "date": "2021-04-09",
+ "value": -43.277484002887526
+ },
+ {
+ "date": "2021-04-12",
+ "value": -43.27927598617057
+ },
+ {
+ "date": "2021-04-13",
+ "value": -42.22496031721777
+ },
+ {
+ "date": "2021-04-14",
+ "value": -42.25016851543557
+ },
+ {
+ "date": "2021-04-15",
+ "value": -42.15584585866615
+ },
+ {
+ "date": "2021-04-16",
+ "value": -42.747797946941226
+ },
+ {
+ "date": "2021-04-19",
+ "value": -42.85536600566994
+ },
+ {
+ "date": "2021-04-20",
+ "value": -42.92843173307424
+ },
+ {
+ "date": "2021-04-21",
+ "value": -42.96755948609587
+ },
+ {
+ "date": "2021-04-22",
+ "value": -42.74867928105655
+ },
+ {
+ "date": "2021-04-23",
+ "value": -42.66756590898509
+ },
+ {
+ "date": "2021-04-26",
+ "value": -42.84510055088623
+ },
+ {
+ "date": "2021-04-27",
+ "value": -42.844969784867985
+ },
+ {
+ "date": "2021-04-28",
+ "value": -42.90906108510861
+ },
+ {
+ "date": "2021-04-29",
+ "value": -43.02563583080954
+ },
+ {
+ "date": "2021-04-30",
+ "value": -44.18225449840421
+ },
+ {
+ "date": "2021-05-03",
+ "value": -43.9227245314391
+ },
+ {
+ "date": "2021-05-04",
+ "value": -43.93171599071321
+ },
+ {
+ "date": "2021-05-05",
+ "value": -43.96620064090336
+ },
+ {
+ "date": "2021-05-06",
+ "value": -43.4961638783508
+ },
+ {
+ "date": "2021-05-07",
+ "value": -43.793127467799955
+ },
+ {
+ "date": "2021-05-10",
+ "value": -43.757783630214334
+ },
+ {
+ "date": "2021-05-11",
+ "value": -44.07572856276569
+ },
+ {
+ "date": "2021-05-12",
+ "value": -44.341177579361975
+ },
+ {
+ "date": "2021-05-13",
+ "value": -44.5200966604299
+ },
+ {
+ "date": "2021-05-14",
+ "value": -44.645223994692216
+ },
+ {
+ "date": "2021-05-17",
+ "value": -44.11943845422451
+ },
+ {
+ "date": "2021-05-18",
+ "value": -44.114210534037205
+ },
+ {
+ "date": "2021-05-19",
+ "value": -43.79478223499915
+ },
+ {
+ "date": "2021-05-20",
+ "value": -43.12725191670329
+ },
+ {
+ "date": "2021-05-21",
+ "value": -42.32324886247591
+ },
+ {
+ "date": "2021-05-24",
+ "value": -42.17483610523046
+ },
+ {
+ "date": "2021-05-25",
+ "value": -42.23556632902509
+ },
+ {
+ "date": "2021-05-26",
+ "value": -43.6245636703111
+ },
+ {
+ "date": "2021-05-27",
+ "value": -43.57534640846003
+ },
+ {
+ "date": "2021-05-28",
+ "value": -44.2997927568182
+ },
+ {
+ "date": "2021-05-31",
+ "value": -44.64364021286032
+ },
+ {
+ "date": "2021-06-01",
+ "value": -44.45905188841153
+ },
+ {
+ "date": "2021-06-02",
+ "value": -44.40251937160737
+ },
+ {
+ "date": "2021-06-03",
+ "value": -43.96936214468736
+ },
+ {
+ "date": "2021-06-04",
+ "value": -43.82242717476135
+ },
+ {
+ "date": "2021-06-07",
+ "value": -43.9518198869541
+ },
+ {
+ "date": "2021-06-08",
+ "value": -44.70910326741394
+ },
+ {
+ "date": "2021-06-09",
+ "value": -45.584742852006855
+ },
+ {
+ "date": "2021-06-10",
+ "value": -45.490984274258
+ },
+ {
+ "date": "2021-06-11",
+ "value": -45.48904821013233
+ },
+ {
+ "date": "2021-06-14",
+ "value": -45.47756378846994
+ },
+ {
+ "date": "2021-06-15",
+ "value": -45.5378226305547
+ },
+ {
+ "date": "2021-06-16",
+ "value": -45.63202979793997
+ },
+ {
+ "date": "2021-06-17",
+ "value": -45.65140945632659
+ },
+ {
+ "date": "2021-06-18",
+ "value": -45.59538639062651
+ },
+ {
+ "date": "2021-06-21",
+ "value": -45.69916562323388
+ },
+ {
+ "date": "2021-06-22",
+ "value": -45.8383781632795
+ },
+ {
+ "date": "2021-06-23",
+ "value": -44.936522037252224
+ },
+ {
+ "date": "2021-06-24",
+ "value": -44.24479517920197
+ },
+ {
+ "date": "2021-06-25",
+ "value": -44.25132522148609
+ },
+ {
+ "date": "2021-06-28",
+ "value": -43.91467274708348
+ },
+ {
+ "date": "2021-06-29",
+ "value": -43.93683897279878
+ },
+ {
+ "date": "2021-06-30",
+ "value": -43.922518541416494
+ },
+ {
+ "date": "2021-07-01",
+ "value": -43.81308619206828
+ },
+ {
+ "date": "2021-07-02",
+ "value": -43.77770150235526
+ },
+ {
+ "date": "2021-07-05",
+ "value": -44.50530452968731
+ },
+ {
+ "date": "2021-07-06",
+ "value": -44.55214425133335
+ },
+ {
+ "date": "2021-07-07",
+ "value": -44.05182488304984
+ },
+ {
+ "date": "2021-07-08",
+ "value": -44.07701944272394
+ },
+ {
+ "date": "2021-07-09",
+ "value": -44.192496945067425
+ },
+ {
+ "date": "2021-07-12",
+ "value": -44.27020382798072
+ },
+ {
+ "date": "2021-07-13",
+ "value": -44.42157570983605
+ },
+ {
+ "date": "2021-07-14",
+ "value": -44.14369605902224
+ },
+ {
+ "date": "2021-07-15",
+ "value": -44.12644281834956
+ },
+ {
+ "date": "2021-07-16",
+ "value": -43.69555768559424
+ },
+ {
+ "date": "2021-07-19",
+ "value": -45.101549624702514
+ },
+ {
+ "date": "2021-07-20",
+ "value": -45.10376897193469
+ },
+ {
+ "date": "2021-07-21",
+ "value": -45.1134781419313
+ },
+ {
+ "date": "2021-07-22",
+ "value": -45.09022328732693
+ },
+ {
+ "date": "2021-07-23",
+ "value": -45.340581882827706
+ },
+ {
+ "date": "2021-07-26",
+ "value": -45.173928710420476
+ },
+ {
+ "date": "2021-07-27",
+ "value": -45.142917663109316
+ },
+ {
+ "date": "2021-07-28",
+ "value": -45.129871640310355
+ },
+ {
+ "date": "2021-07-29",
+ "value": -41.64014062741049
+ },
+ {
+ "date": "2021-07-30",
+ "value": -41.63459559644814
+ },
+ {
+ "date": "2021-08-02",
+ "value": -42.51124426083416
+ },
+ {
+ "date": "2021-08-03",
+ "value": -42.954565550903
+ },
+ {
+ "date": "2021-08-04",
+ "value": -42.59230870835695
+ },
+ {
+ "date": "2021-08-05",
+ "value": -42.89229335965955
+ },
+ {
+ "date": "2021-08-06",
+ "value": -42.38831960978
+ },
+ {
+ "date": "2021-08-09",
+ "value": -41.524068996700144
+ },
+ {
+ "date": "2021-08-10",
+ "value": -41.386570980330575
+ },
+ {
+ "date": "2021-08-11",
+ "value": -41.442466993016836
+ },
+ {
+ "date": "2021-08-12",
+ "value": -40.513272996856095
+ },
+ {
+ "date": "2021-08-13",
+ "value": -40.245373037689696
+ },
+ {
+ "date": "2021-08-16",
+ "value": -40.18561320862313
+ },
+ {
+ "date": "2021-08-17",
+ "value": -40.18508499970501
+ },
+ {
+ "date": "2021-08-18",
+ "value": -40.926964033921834
+ },
+ {
+ "date": "2021-08-19",
+ "value": -40.88803496303501
+ },
+ {
+ "date": "2021-08-20",
+ "value": -40.346899634194344
+ },
+ {
+ "date": "2021-08-23",
+ "value": -40.23785328808613
+ },
+ {
+ "date": "2021-08-24",
+ "value": -40.03853936678274
+ },
+ {
+ "date": "2021-08-25",
+ "value": -40.03722849153913
+ },
+ {
+ "date": "2021-08-26",
+ "value": -40.097261730531415
+ },
+ {
+ "date": "2021-08-27",
+ "value": -40.03537881398886
+ },
+ {
+ "date": "2021-08-30",
+ "value": -40.05452995126846
+ },
+ {
+ "date": "2021-08-31",
+ "value": -40.122860297563015
+ },
+ {
+ "date": "2021-09-01",
+ "value": -40.1561444390508
+ },
+ {
+ "date": "2021-09-02",
+ "value": -40.21253367796436
+ },
+ {
+ "date": "2021-09-03",
+ "value": -40.1410004844888
+ },
+ {
+ "date": "2021-09-06",
+ "value": -40.07905551372793
+ },
+ {
+ "date": "2021-09-07",
+ "value": -39.836820345426794
+ },
+ {
+ "date": "2021-09-08",
+ "value": -39.86567581283363
+ },
+ {
+ "date": "2021-09-09",
+ "value": -39.895748653878854
+ },
+ {
+ "date": "2021-09-10",
+ "value": -39.879304802652655
+ },
+ {
+ "date": "2021-09-13",
+ "value": -39.876374667039094
+ },
+ {
+ "date": "2021-09-14",
+ "value": -39.90956055628241
+ },
+ {
+ "date": "2021-09-15",
+ "value": -39.918743676953426
+ },
+ {
+ "date": "2021-09-16",
+ "value": -39.911572070723636
+ },
+ {
+ "date": "2021-09-17",
+ "value": -39.14726167628288
+ },
+ {
+ "date": "2021-09-20",
+ "value": -39.24672305738531
+ },
+ {
+ "date": "2021-09-21",
+ "value": -38.950664076520496
+ },
+ {
+ "date": "2021-09-22",
+ "value": -39.03572070137046
+ },
+ {
+ "date": "2021-09-23",
+ "value": -39.25053001130871
+ },
+ {
+ "date": "2021-09-24",
+ "value": -39.12560237369096
+ },
+ {
+ "date": "2021-09-27",
+ "value": -39.271005866312215
+ },
+ {
+ "date": "2021-09-28",
+ "value": -39.06493624755818
+ },
+ {
+ "date": "2021-09-29",
+ "value": -38.98044434247391
+ },
+ {
+ "date": "2021-09-30",
+ "value": -38.830426705673545
+ },
+ {
+ "date": "2021-10-01",
+ "value": -39.59935849279014
+ },
+ {
+ "date": "2021-10-04",
+ "value": -39.51056151983005
+ },
+ {
+ "date": "2021-10-05",
+ "value": -39.49500983489172
+ },
+ {
+ "date": "2021-10-06",
+ "value": -40.285976276819504
+ },
+ {
+ "date": "2021-10-07",
+ "value": -39.44747630357924
+ },
+ {
+ "date": "2021-10-08",
+ "value": -39.61695220960149
+ },
+ {
+ "date": "2021-10-11",
+ "value": -40.06450278270476
+ },
+ {
+ "date": "2021-10-12",
+ "value": -39.74280213296102
+ },
+ {
+ "date": "2021-10-13",
+ "value": -39.868925141459336
+ },
+ {
+ "date": "2021-10-14",
+ "value": -39.837841478372546
+ },
+ {
+ "date": "2021-10-15",
+ "value": -39.93121315046893
+ },
+ {
+ "date": "2021-10-18",
+ "value": -39.72683002051892
+ },
+ {
+ "date": "2021-10-19",
+ "value": -39.35805285448671
+ },
+ {
+ "date": "2021-10-20",
+ "value": -39.171386445266734
+ },
+ {
+ "date": "2021-10-21",
+ "value": -38.64046983802422
+ },
+ {
+ "date": "2021-10-22",
+ "value": -38.54096688289618
+ },
+ {
+ "date": "2021-10-25",
+ "value": -38.458336053512525
+ },
+ {
+ "date": "2021-10-26",
+ "value": -38.529914754243656
+ },
+ {
+ "date": "2021-10-27",
+ "value": -38.66898642931481
+ },
+ {
+ "date": "2021-10-28",
+ "value": -38.68983232821047
+ },
+ {
+ "date": "2021-10-29",
+ "value": -38.896854548138386
+ },
+ {
+ "date": "2021-11-01",
+ "value": -38.922672430927754
+ },
+ {
+ "date": "2021-11-02",
+ "value": -38.82299102502026
+ },
+ {
+ "date": "2021-11-03",
+ "value": -38.77794211243254
+ },
+ {
+ "date": "2021-11-04",
+ "value": -38.75091949451742
+ },
+ {
+ "date": "2021-11-05",
+ "value": -38.917512340917305
+ },
+ {
+ "date": "2021-11-08",
+ "value": -38.809088867052594
+ },
+ {
+ "date": "2021-11-09",
+ "value": -39.020962711553075
+ },
+ {
+ "date": "2021-11-10",
+ "value": -39.028684299688805
+ },
+ {
+ "date": "2021-11-11",
+ "value": -39.24590116160988
+ },
+ {
+ "date": "2021-11-12",
+ "value": -39.33633160905607
+ },
+ {
+ "date": "2021-11-15",
+ "value": -39.76431655380805
+ },
+ {
+ "date": "2021-11-16",
+ "value": -39.8813227815565
+ },
+ {
+ "date": "2021-11-17",
+ "value": -39.674419069409055
+ },
+ {
+ "date": "2021-11-18",
+ "value": -39.728496130636714
+ },
+ {
+ "date": "2021-11-19",
+ "value": -39.684362504133546
+ },
+ {
+ "date": "2021-11-22",
+ "value": -39.7434116947756
+ },
+ {
+ "date": "2021-11-23",
+ "value": -39.88741825767299
+ },
+ {
+ "date": "2021-11-24",
+ "value": -39.97834153659613
+ },
+ {
+ "date": "2021-11-25",
+ "value": -40.05869607679096
+ },
+ {
+ "date": "2021-11-26",
+ "value": -40.204030999890094
+ },
+ {
+ "date": "2021-11-29",
+ "value": -40.13410901319857
+ },
+ {
+ "date": "2021-11-30",
+ "value": -39.92289596739257
+ },
+ {
+ "date": "2021-12-01",
+ "value": -39.827984504581096
+ },
+ {
+ "date": "2021-12-02",
+ "value": -39.59549187466823
+ },
+ {
+ "date": "2021-12-03",
+ "value": -39.65652740761864
+ },
+ {
+ "date": "2021-12-06",
+ "value": -39.477404022136525
+ },
+ {
+ "date": "2021-12-07",
+ "value": -39.4024760920551
+ },
+ {
+ "date": "2021-12-08",
+ "value": -39.50764589656295
+ },
+ {
+ "date": "2021-12-09",
+ "value": -39.52895853350066
+ },
+ {
+ "date": "2021-12-10",
+ "value": -39.22172973659695
+ },
+ {
+ "date": "2021-12-13",
+ "value": -39.00996675898016
+ },
+ {
+ "date": "2021-12-14",
+ "value": -39.08127691742645
+ },
+ {
+ "date": "2021-12-15",
+ "value": -38.82378379865047
+ },
+ {
+ "date": "2021-12-16",
+ "value": -39.593166205233054
+ },
+ {
+ "date": "2021-12-17",
+ "value": -40.19696380632909
+ },
+ {
+ "date": "2021-12-20",
+ "value": -40.1140836400687
+ },
+ {
+ "date": "2021-12-21",
+ "value": -40.642602848523694
+ },
+ {
+ "date": "2021-12-22",
+ "value": -40.518260731553084
+ },
+ {
+ "date": "2021-12-23",
+ "value": -40.5296535095648
+ },
+ {
+ "date": "2021-12-24",
+ "value": -40.46104799075404
+ },
+ {
+ "date": "2021-12-27",
+ "value": -40.56577106192743
+ },
+ {
+ "date": "2021-12-28",
+ "value": -38.84489859385069
+ },
+ {
+ "date": "2021-12-29",
+ "value": -38.85951132486532
+ },
+ {
+ "date": "2021-12-30",
+ "value": -38.91081793132373
+ },
+ {
+ "date": "2021-12-31",
+ "value": -38.70545841741951
+ },
+ {
+ "date": "2022-01-03",
+ "value": -38.721888725975695
+ },
+ {
+ "date": "2022-01-04",
+ "value": -38.70591106598131
+ },
+ {
+ "date": "2022-01-05",
+ "value": -38.55445043730906
+ },
+ {
+ "date": "2022-01-06",
+ "value": -38.55498750969691
+ },
+ {
+ "date": "2022-01-07",
+ "value": -38.433279248501286
+ },
+ {
+ "date": "2022-01-10",
+ "value": -38.27734752991743
+ },
+ {
+ "date": "2022-01-11",
+ "value": -37.961772992471225
+ },
+ {
+ "date": "2022-01-12",
+ "value": -37.97391035721423
+ },
+ {
+ "date": "2022-01-13",
+ "value": -38.01944097295472
+ },
+ {
+ "date": "2022-01-14",
+ "value": -37.94538990567497
+ },
+ {
+ "date": "2022-01-17",
+ "value": -37.91824779187916
+ },
+ {
+ "date": "2022-01-18",
+ "value": -37.14545365578252
+ },
+ {
+ "date": "2022-01-19",
+ "value": -37.21433459731629
+ },
+ {
+ "date": "2022-01-20",
+ "value": -37.11154565903753
+ },
+ {
+ "date": "2022-01-21",
+ "value": -39.82286594620729
+ },
+ {
+ "date": "2022-01-24",
+ "value": -39.67177877964661
+ },
+ {
+ "date": "2022-01-25",
+ "value": -39.58385217213214
+ },
+ {
+ "date": "2022-01-26",
+ "value": -39.609169485830115
+ },
+ {
+ "date": "2022-01-27",
+ "value": -39.73614612767917
+ },
+ {
+ "date": "2022-01-28",
+ "value": -39.78908526608617
+ },
+ {
+ "date": "2022-01-31",
+ "value": -40.006577836992435
+ },
+ {
+ "date": "2022-02-01",
+ "value": -39.863178079558246
+ },
+ {
+ "date": "2022-02-02",
+ "value": -39.8961333025676
+ },
+ {
+ "date": "2022-02-03",
+ "value": -39.8664810834327
+ },
+ {
+ "date": "2022-02-04",
+ "value": -40.723612046707345
+ },
+ {
+ "date": "2022-02-07",
+ "value": -41.07130379552535
+ },
+ {
+ "date": "2022-02-08",
+ "value": -40.83297223860522
+ },
+ {
+ "date": "2022-02-09",
+ "value": -40.990624711408536
+ },
+ {
+ "date": "2022-02-10",
+ "value": -40.71974163439366
+ },
+ {
+ "date": "2022-02-11",
+ "value": -40.537252181096726
+ },
+ {
+ "date": "2022-02-14",
+ "value": -40.509482951739116
+ },
+ {
+ "date": "2022-02-15",
+ "value": -40.411262685809966
+ },
+ {
+ "date": "2022-02-16",
+ "value": -40.6358296638352
+ },
+ {
+ "date": "2022-02-17",
+ "value": -40.573121599464336
+ },
+ {
+ "date": "2022-02-18",
+ "value": -40.561653314889405
+ },
+ {
+ "date": "2022-02-21",
+ "value": -40.462535392054484
+ },
+ {
+ "date": "2022-02-22",
+ "value": -40.36452438929495
+ },
+ {
+ "date": "2022-02-23",
+ "value": -40.27362167416249
+ },
+ {
+ "date": "2022-02-24",
+ "value": -40.03560951461395
+ },
+ {
+ "date": "2022-02-25",
+ "value": -40.106797286897944
+ },
+ {
+ "date": "2022-02-28",
+ "value": -40.15577969742903
+ },
+ {
+ "date": "2022-03-01",
+ "value": -40.2471862110642
+ },
+ {
+ "date": "2022-03-02",
+ "value": -40.524122072774055
+ },
+ {
+ "date": "2022-03-03",
+ "value": -40.10495814304551
+ },
+ {
+ "date": "2022-03-04",
+ "value": -40.04213605665816
+ },
+ {
+ "date": "2022-03-07",
+ "value": -40.07951540125021
+ },
+ {
+ "date": "2022-03-08",
+ "value": -39.94309820456025
+ },
+ {
+ "date": "2022-03-09",
+ "value": -39.56602151500856
+ },
+ {
+ "date": "2022-03-10",
+ "value": -39.58679844669844
+ },
+ {
+ "date": "2022-03-11",
+ "value": -39.525305521905814
+ },
+ {
+ "date": "2022-03-14",
+ "value": -40.28464471449788
+ },
+ {
+ "date": "2022-03-15",
+ "value": -40.37003301634379
+ },
+ {
+ "date": "2022-03-16",
+ "value": -40.63231865005461
+ },
+ {
+ "date": "2022-03-17",
+ "value": -40.56517171360174
+ },
+ {
+ "date": "2022-03-18",
+ "value": -40.77324231651806
+ },
+ {
+ "date": "2022-03-21",
+ "value": -40.86500787642102
+ },
+ {
+ "date": "2022-03-22",
+ "value": -40.87037455461885
+ },
+ {
+ "date": "2022-03-23",
+ "value": -41.05986360464427
+ },
+ {
+ "date": "2022-03-24",
+ "value": -40.92175915143384
+ },
+ {
+ "date": "2022-03-25",
+ "value": -41.07339129003927
+ },
+ {
+ "date": "2022-03-28",
+ "value": -41.07540946333865
+ },
+ {
+ "date": "2022-03-29",
+ "value": -41.06572465090644
+ },
+ {
+ "date": "2022-03-30",
+ "value": -41.0104928714047
+ },
+ {
+ "date": "2022-03-31",
+ "value": -41.127701951329094
+ },
+ {
+ "date": "2022-04-01",
+ "value": -41.88766152883277
+ },
+ {
+ "date": "2022-04-04",
+ "value": -41.87479939424966
+ },
+ {
+ "date": "2022-04-05",
+ "value": -41.440796964929206
+ },
+ {
+ "date": "2022-04-06",
+ "value": -41.63499790145938
+ },
+ {
+ "date": "2022-04-07",
+ "value": -41.428721621792974
+ },
+ {
+ "date": "2022-04-08",
+ "value": -41.387680510518635
+ },
+ {
+ "date": "2022-04-11",
+ "value": -41.50644145091534
+ },
+ {
+ "date": "2022-04-12",
+ "value": -41.93916998151852
+ },
+ {
+ "date": "2022-04-13",
+ "value": -42.34921890884305
+ },
+ {
+ "date": "2022-04-14",
+ "value": -42.30533325276214
+ },
+ {
+ "date": "2022-04-15",
+ "value": -42.973425717145396
+ },
+ {
+ "date": "2022-04-18",
+ "value": -42.86551827711438
+ },
+ {
+ "date": "2022-04-19",
+ "value": -43.06927084133469
+ },
+ {
+ "date": "2022-04-20",
+ "value": -43.00603959221462
+ },
+ {
+ "date": "2022-04-21",
+ "value": -43.02058518611044
+ },
+ {
+ "date": "2022-04-22",
+ "value": -42.73923186207612
+ },
+ {
+ "date": "2022-04-25",
+ "value": -43.058604505779755
+ },
+ {
+ "date": "2022-04-26",
+ "value": -42.91285704776622
+ },
+ {
+ "date": "2022-04-27",
+ "value": -43.065990379119654
+ },
+ {
+ "date": "2022-04-28",
+ "value": -43.10026994554567
+ },
+ {
+ "date": "2022-04-29",
+ "value": -43.18796841616006
+ },
+ {
+ "date": "2022-05-02",
+ "value": -43.16778201009611
+ },
+ {
+ "date": "2022-05-03",
+ "value": -43.363784690043424
+ },
+ {
+ "date": "2022-05-04",
+ "value": -42.94239374915016
+ },
+ {
+ "date": "2022-05-05",
+ "value": -42.94405459762269
+ },
+ {
+ "date": "2022-05-06",
+ "value": -43.19109523456168
+ },
+ {
+ "date": "2022-05-09",
+ "value": -43.63189886358276
+ },
+ {
+ "date": "2022-05-10",
+ "value": -43.84386814069978
+ },
+ {
+ "date": "2022-05-11",
+ "value": -43.423734257182886
+ },
+ {
+ "date": "2022-05-12",
+ "value": -43.907500104946806
+ },
+ {
+ "date": "2022-05-13",
+ "value": -43.875715129890345
+ },
+ {
+ "date": "2022-05-16",
+ "value": -43.95457758517259
+ },
+ {
+ "date": "2022-05-17",
+ "value": -43.03787705012179
+ },
+ {
+ "date": "2022-05-18",
+ "value": -42.750343405237686
+ },
+ {
+ "date": "2022-05-19",
+ "value": -42.861100727686
+ },
+ {
+ "date": "2022-05-20",
+ "value": -42.842733743476444
+ },
+ {
+ "date": "2022-05-23",
+ "value": -43.01286179929275
+ },
+ {
+ "date": "2022-05-24",
+ "value": -42.97991653393708
+ },
+ {
+ "date": "2022-05-25",
+ "value": -43.28763022326731
+ },
+ {
+ "date": "2022-05-26",
+ "value": -43.436178546336976
+ },
+ {
+ "date": "2022-05-27",
+ "value": -43.92804852724305
+ },
+ {
+ "date": "2022-05-30",
+ "value": -43.53869403612223
+ },
+ {
+ "date": "2022-05-31",
+ "value": -43.784529604270666
+ },
+ {
+ "date": "2022-06-01",
+ "value": -43.652180761503594
+ },
+ {
+ "date": "2022-06-02",
+ "value": -43.54956504909564
+ },
+ {
+ "date": "2022-06-03",
+ "value": -43.17428685427011
+ },
+ {
+ "date": "2022-06-06",
+ "value": -43.57078190005514
+ },
+ {
+ "date": "2022-06-07",
+ "value": -43.870326171539936
+ },
+ {
+ "date": "2022-06-08",
+ "value": -44.07358299745931
+ },
+ {
+ "date": "2022-06-09",
+ "value": -44.44349420359648
+ },
+ {
+ "date": "2022-06-10",
+ "value": -44.67699803749705
+ },
+ {
+ "date": "2022-06-13",
+ "value": -44.67545316258204
+ },
+ {
+ "date": "2022-06-14",
+ "value": -44.78828275198723
+ },
+ {
+ "date": "2022-06-15",
+ "value": -44.547146304312676
+ },
+ {
+ "date": "2022-06-16",
+ "value": -44.803602020599
+ },
+ {
+ "date": "2022-06-17",
+ "value": -44.80484915036008
+ },
+ {
+ "date": "2022-06-20",
+ "value": -44.98262689973105
+ },
+ {
+ "date": "2022-06-21",
+ "value": -44.93439281956884
+ },
+ {
+ "date": "2022-06-22",
+ "value": -47.09036573999023
+ },
+ {
+ "date": "2022-06-23",
+ "value": -47.02899731185216
+ },
+ {
+ "date": "2022-06-24",
+ "value": -46.74296969423462
+ },
+ {
+ "date": "2022-06-27",
+ "value": -46.9997873481102
+ },
+ {
+ "date": "2022-06-28",
+ "value": -46.8077796428029
+ },
+ {
+ "date": "2022-06-29",
+ "value": -46.69129337715973
+ },
+ {
+ "date": "2022-06-30",
+ "value": -46.840619226730716
+ },
+ {
+ "date": "2022-07-01",
+ "value": -47.3094852168626
+ },
+ {
+ "date": "2022-07-04",
+ "value": -47.57476506455891
+ },
+ {
+ "date": "2022-07-05",
+ "value": -47.82857513252915
+ },
+ {
+ "date": "2022-07-06",
+ "value": -48.0841962961632
+ },
+ {
+ "date": "2022-07-07",
+ "value": -47.98299228440482
+ },
+ {
+ "date": "2022-07-08",
+ "value": -47.88341571324466
+ },
+ {
+ "date": "2022-07-11",
+ "value": -47.67027625135996
+ },
+ {
+ "date": "2022-07-12",
+ "value": -47.19960486851681
+ },
+ {
+ "date": "2022-07-13",
+ "value": -48.68092622331927
+ },
+ {
+ "date": "2022-07-14",
+ "value": -47.922204856600054
+ },
+ {
+ "date": "2022-07-15",
+ "value": -48.060370915248285
+ },
+ {
+ "date": "2022-07-18",
+ "value": -47.6826417117101
+ },
+ {
+ "date": "2022-07-19",
+ "value": -47.5827058766692
+ },
+ {
+ "date": "2022-07-20",
+ "value": -47.74325739562489
+ },
+ {
+ "date": "2022-07-21",
+ "value": -47.43132583189915
+ },
+ {
+ "date": "2022-07-22",
+ "value": -48.01524363709631
+ },
+ {
+ "date": "2022-07-25",
+ "value": -48.0234859454322
+ },
+ {
+ "date": "2022-07-26",
+ "value": -48.044189735394305
+ },
+ {
+ "date": "2022-07-27",
+ "value": -49.36339347370638
+ },
+ {
+ "date": "2022-07-28",
+ "value": -49.51870374649426
+ },
+ {
+ "date": "2022-07-29",
+ "value": -49.399584186481306
+ },
+ {
+ "date": "2022-08-01",
+ "value": -48.28520817910183
+ },
+ {
+ "date": "2022-08-02",
+ "value": -48.02598428464526
+ },
+ {
+ "date": "2022-08-03",
+ "value": -48.489328332482856
+ },
+ {
+ "date": "2022-08-04",
+ "value": -48.486467291474526
+ },
+ {
+ "date": "2022-08-05",
+ "value": -48.428724524004814
+ },
+ {
+ "date": "2022-08-08",
+ "value": -48.623817405136826
+ },
+ {
+ "date": "2022-08-09",
+ "value": -49.51995437891165
+ },
+ {
+ "date": "2022-08-10",
+ "value": -49.76866589149966
+ },
+ {
+ "date": "2022-08-11",
+ "value": -49.76625723675744
+ },
+ {
+ "date": "2022-08-12",
+ "value": -49.34149911413414
+ },
+ {
+ "date": "2022-08-15",
+ "value": -46.1427325393518
+ },
+ {
+ "date": "2022-08-16",
+ "value": -46.27135658971943
+ },
+ {
+ "date": "2022-08-17",
+ "value": -46.34662968051379
+ },
+ {
+ "date": "2022-08-18",
+ "value": -46.40069597661825
+ },
+ {
+ "date": "2022-08-19",
+ "value": -46.7328870535123
+ },
+ {
+ "date": "2022-08-22",
+ "value": -46.793418901336636
+ },
+ {
+ "date": "2022-08-23",
+ "value": -46.532844632196635
+ },
+ {
+ "date": "2022-08-24",
+ "value": -46.56162653929384
+ },
+ {
+ "date": "2022-08-25",
+ "value": -46.55362147158954
+ },
+ {
+ "date": "2022-08-26",
+ "value": -47.2431620453146
+ },
+ {
+ "date": "2022-08-29",
+ "value": -47.252999036196165
+ },
+ {
+ "date": "2022-08-30",
+ "value": -47.10734470147535
+ },
+ {
+ "date": "2022-08-31",
+ "value": -47.29749081881628
+ },
+ {
+ "date": "2022-09-01",
+ "value": -48.03974181979452
+ },
+ {
+ "date": "2022-09-02",
+ "value": -48.024338892767865
+ },
+ {
+ "date": "2022-09-05",
+ "value": -47.61621370678322
+ },
+ {
+ "date": "2022-09-06",
+ "value": -47.23008029518652
+ },
+ {
+ "date": "2022-09-07",
+ "value": -47.0190981262044
+ },
+ {
+ "date": "2022-09-08",
+ "value": -46.88896977270363
+ },
+ {
+ "date": "2022-09-09",
+ "value": -46.85375475506762
+ },
+ {
+ "date": "2022-09-12",
+ "value": -47.11152285696
+ },
+ {
+ "date": "2022-09-13",
+ "value": -46.77095665376406
+ },
+ {
+ "date": "2022-09-14",
+ "value": -46.31435658958847
+ },
+ {
+ "date": "2022-09-15",
+ "value": -46.31336737440164
+ },
+ {
+ "date": "2022-09-16",
+ "value": -46.3133463813651
+ },
+ {
+ "date": "2022-09-19",
+ "value": -46.67862611156745
+ },
+ {
+ "date": "2022-09-20",
+ "value": -46.691818094493705
+ },
+ {
+ "date": "2022-09-21",
+ "value": -46.82311140437831
+ },
+ {
+ "date": "2022-09-22",
+ "value": -46.740987397048286
+ },
+ {
+ "date": "2022-09-23",
+ "value": -45.89749704100952
+ },
+ {
+ "date": "2022-09-26",
+ "value": -45.98289280368821
+ },
+ {
+ "date": "2022-09-27",
+ "value": -45.97636303595162
+ },
+ {
+ "date": "2022-09-28",
+ "value": -46.57567280308698
+ },
+ {
+ "date": "2022-09-29",
+ "value": -46.78255678967493
+ },
+ {
+ "date": "2022-09-30",
+ "value": -46.6319192179128
+ },
+ {
+ "date": "2022-10-03",
+ "value": -46.39181659812328
+ },
+ {
+ "date": "2022-10-04",
+ "value": -46.31231329557254
+ },
+ {
+ "date": "2022-10-05",
+ "value": -46.027926282816274
+ },
+ {
+ "date": "2022-10-06",
+ "value": -46.062383644507946
+ },
+ {
+ "date": "2022-10-07",
+ "value": -46.43767862194547
+ },
+ {
+ "date": "2022-10-10",
+ "value": -46.090728103017376
+ },
+ {
+ "date": "2022-10-11",
+ "value": -46.32515623565491
+ },
+ {
+ "date": "2022-10-12",
+ "value": -45.621292292249265
+ },
+ {
+ "date": "2022-10-13",
+ "value": -45.741914562019254
+ },
+ {
+ "date": "2022-10-14",
+ "value": -45.764721149776605
+ },
+ {
+ "date": "2022-10-17",
+ "value": -46.12360312592148
+ },
+ {
+ "date": "2022-10-18",
+ "value": -45.67954748301278
+ },
+ {
+ "date": "2022-10-19",
+ "value": -44.92327005268669
+ },
+ {
+ "date": "2022-10-20",
+ "value": -44.9361468132304
+ },
+ {
+ "date": "2022-10-21",
+ "value": -44.72431592261863
+ },
+ {
+ "date": "2022-10-24",
+ "value": -44.56694245094029
+ },
+ {
+ "date": "2022-10-25",
+ "value": -44.378061454365465
+ },
+ {
+ "date": "2022-10-26",
+ "value": -43.547248975039075
+ },
+ {
+ "date": "2022-10-27",
+ "value": -44.211241289002174
+ },
+ {
+ "date": "2022-10-28",
+ "value": -43.98214333293305
+ },
+ {
+ "date": "2022-10-31",
+ "value": -43.974341014153026
+ },
+ {
+ "date": "2022-11-01",
+ "value": -43.226229319806
+ },
+ {
+ "date": "2022-11-02",
+ "value": -42.649103559534566
+ },
+ {
+ "date": "2022-11-03",
+ "value": -43.11305362402486
+ },
+ {
+ "date": "2022-11-04",
+ "value": -43.01073301945384
+ },
+ {
+ "date": "2022-11-07",
+ "value": -43.00246972070236
+ },
+ {
+ "date": "2022-11-08",
+ "value": -43.004700715318684
+ },
+ {
+ "date": "2022-11-09",
+ "value": -43.43292805526232
+ },
+ {
+ "date": "2022-11-10",
+ "value": -43.471047738168785
+ },
+ {
+ "date": "2022-11-11",
+ "value": -43.378546058264405
+ },
+ {
+ "date": "2022-11-14",
+ "value": -43.395330385194654
+ },
+ {
+ "date": "2022-11-15",
+ "value": -43.37287983438121
+ },
+ {
+ "date": "2022-11-16",
+ "value": -43.656290979697594
+ },
+ {
+ "date": "2022-11-17",
+ "value": -43.6647037882319
+ },
+ {
+ "date": "2022-11-18",
+ "value": -43.35088635532934
+ },
+ {
+ "date": "2022-11-21",
+ "value": -42.23021131593194
+ },
+ {
+ "date": "2022-11-22",
+ "value": -42.56600332209104
+ },
+ {
+ "date": "2022-11-23",
+ "value": -42.49432173016935
+ },
+ {
+ "date": "2022-11-24",
+ "value": -42.67517919852687
+ },
+ {
+ "date": "2022-11-25",
+ "value": -42.750065164184434
+ },
+ {
+ "date": "2022-11-28",
+ "value": -43.14417687761632
+ },
+ {
+ "date": "2022-11-29",
+ "value": -43.096211045462915
+ },
+ {
+ "date": "2022-11-30",
+ "value": -42.94277818929717
+ },
+ {
+ "date": "2022-12-01",
+ "value": -42.92433761048164
+ },
+ {
+ "date": "2022-12-02",
+ "value": -42.74035217998319
+ },
+ {
+ "date": "2022-12-05",
+ "value": -42.707602700791966
+ },
+ {
+ "date": "2022-12-06",
+ "value": -42.66679908240009
+ },
+ {
+ "date": "2022-12-07",
+ "value": -42.676682877547606
+ },
+ {
+ "date": "2022-12-08",
+ "value": -42.964369019070624
+ },
+ {
+ "date": "2022-12-09",
+ "value": -42.677861676811155
+ },
+ {
+ "date": "2022-12-12",
+ "value": -42.59152683511461
+ },
+ {
+ "date": "2022-12-13",
+ "value": -42.53696635908492
+ },
+ {
+ "date": "2022-12-14",
+ "value": -42.52051972547619
+ },
+ {
+ "date": "2022-12-15",
+ "value": -42.80547014317991
+ },
+ {
+ "date": "2022-12-16",
+ "value": -42.73220739539409
+ },
+ {
+ "date": "2022-12-19",
+ "value": -42.84376396945771
+ },
+ {
+ "date": "2022-12-20",
+ "value": -42.84569160530289
+ },
+ {
+ "date": "2022-12-21",
+ "value": -43.00977645063594
+ },
+ {
+ "date": "2022-12-22",
+ "value": -43.10080263794774
+ },
+ {
+ "date": "2022-12-23",
+ "value": -43.07545175428431
+ },
+ {
+ "date": "2022-12-26",
+ "value": -42.73660475706003
+ },
+ {
+ "date": "2022-12-27",
+ "value": -42.6587092092242
+ },
+ {
+ "date": "2022-12-28",
+ "value": -42.84744959221684
+ },
+ {
+ "date": "2022-12-29",
+ "value": -42.916287717802
+ },
+ {
+ "date": "2022-12-30",
+ "value": -42.89198317071697
+ },
+ {
+ "date": "2023-01-02",
+ "value": -42.931003920357526
+ },
+ {
+ "date": "2023-01-03",
+ "value": -43.253460958189045
+ },
+ {
+ "date": "2023-01-04",
+ "value": -43.60060069085764
+ },
+ {
+ "date": "2023-01-05",
+ "value": -43.653415665776734
+ },
+ {
+ "date": "2023-01-06",
+ "value": -44.12606357476967
+ },
+ {
+ "date": "2023-01-09",
+ "value": -44.12962117840251
+ },
+ {
+ "date": "2023-01-10",
+ "value": -44.160966234768495
+ },
+ {
+ "date": "2023-01-11",
+ "value": -44.48847968254713
+ },
+ {
+ "date": "2023-01-12",
+ "value": -43.442838149550255
+ },
+ {
+ "date": "2023-01-13",
+ "value": -43.773664136056865
+ },
+ {
+ "date": "2023-01-16",
+ "value": -43.88269433864633
+ },
+ {
+ "date": "2023-01-17",
+ "value": -43.66037926480316
+ },
+ {
+ "date": "2023-01-18",
+ "value": -43.47655983167016
+ },
+ {
+ "date": "2023-01-19",
+ "value": -42.77428581529256
+ },
+ {
+ "date": "2023-01-20",
+ "value": -42.81572991453831
+ },
+ {
+ "date": "2023-01-23",
+ "value": -42.646329844673645
+ },
+ {
+ "date": "2023-01-24",
+ "value": -43.520377788239244
+ },
+ {
+ "date": "2023-01-25",
+ "value": -43.72453082242308
+ },
+ {
+ "date": "2023-01-26",
+ "value": -42.89479227638277
+ },
+ {
+ "date": "2023-01-27",
+ "value": -42.84633995671555
+ },
+ {
+ "date": "2023-01-30",
+ "value": -43.18349636731249
+ },
+ {
+ "date": "2023-01-31",
+ "value": -43.34051703887034
+ },
+ {
+ "date": "2023-02-01",
+ "value": -43.281016371842
+ },
+ {
+ "date": "2023-02-02",
+ "value": -43.20648513499742
+ },
+ {
+ "date": "2023-02-03",
+ "value": -42.89378171052384
+ },
+ {
+ "date": "2023-02-06",
+ "value": -43.30471192838252
+ },
+ {
+ "date": "2023-02-07",
+ "value": -45.88220910916782
+ },
+ {
+ "date": "2023-02-08",
+ "value": -45.85100371923284
+ },
+ {
+ "date": "2023-02-09",
+ "value": -45.34679108035061
+ },
+ {
+ "date": "2023-02-10",
+ "value": -45.487924582379485
+ },
+ {
+ "date": "2023-02-13",
+ "value": -45.43789928521629
+ },
+ {
+ "date": "2023-02-14",
+ "value": -45.25923559284493
+ },
+ {
+ "date": "2023-02-15",
+ "value": -45.45722432523736
+ },
+ {
+ "date": "2023-02-16",
+ "value": -45.44904678558626
+ },
+ {
+ "date": "2023-02-17",
+ "value": -45.19210489695797
+ },
+ {
+ "date": "2023-02-20",
+ "value": -45.2035855836128
+ },
+ {
+ "date": "2023-02-21",
+ "value": -45.09046748251004
+ },
+ {
+ "date": "2023-02-22",
+ "value": -45.157582102663454
+ },
+ {
+ "date": "2023-02-23",
+ "value": -44.67452423934894
+ },
+ {
+ "date": "2023-02-24",
+ "value": -44.58622850045172
+ },
+ {
+ "date": "2023-02-27",
+ "value": -44.4666530144336
+ },
+ {
+ "date": "2023-02-28",
+ "value": -44.68123010618957
+ },
+ {
+ "date": "2023-03-01",
+ "value": -44.939361372775764
+ },
+ {
+ "date": "2023-03-02",
+ "value": -44.59110107489021
+ },
+ {
+ "date": "2023-03-03",
+ "value": -44.65983121559474
+ },
+ {
+ "date": "2023-03-06",
+ "value": -44.60924665513301
+ },
+ {
+ "date": "2023-03-07",
+ "value": -44.482784764244066
+ },
+ {
+ "date": "2023-03-08",
+ "value": -44.14901796802155
+ },
+ {
+ "date": "2023-03-09",
+ "value": -44.31149187178775
+ },
+ {
+ "date": "2023-03-10",
+ "value": -44.081435747246125
+ },
+ {
+ "date": "2023-03-13",
+ "value": -44.13761224214945
+ },
+ {
+ "date": "2023-03-14",
+ "value": -43.91169257437105
+ },
+ {
+ "date": "2023-03-15",
+ "value": -43.899305350315515
+ },
+ {
+ "date": "2023-03-16",
+ "value": -43.83531406283612
+ },
+ {
+ "date": "2023-03-17",
+ "value": -43.96145220092596
+ },
+ {
+ "date": "2023-03-20",
+ "value": -44.57488433779829
+ },
+ {
+ "date": "2023-03-21",
+ "value": -44.54853015251555
+ },
+ {
+ "date": "2023-03-22",
+ "value": -44.51504844425376
+ },
+ {
+ "date": "2023-03-23",
+ "value": -44.52317276652188
+ },
+ {
+ "date": "2023-03-24",
+ "value": -44.55500542314319
+ },
+ {
+ "date": "2023-03-27",
+ "value": -44.97688191700164
+ },
+ {
+ "date": "2023-03-28",
+ "value": -45.325405521151986
+ },
+ {
+ "date": "2023-03-29",
+ "value": -45.193569474962004
+ },
+ {
+ "date": "2023-03-30",
+ "value": -45.395577053157815
+ },
+ {
+ "date": "2023-03-31",
+ "value": -45.14221840570411
+ },
+ {
+ "date": "2023-04-03",
+ "value": -44.956884867529716
+ },
+ {
+ "date": "2023-04-04",
+ "value": -45.18003661349423
+ },
+ {
+ "date": "2023-04-05",
+ "value": -44.42956295644702
+ },
+ {
+ "date": "2023-04-06",
+ "value": -45.095999499805345
+ },
+ {
+ "date": "2023-04-07",
+ "value": -45.14127500433212
+ },
+ {
+ "date": "2023-04-10",
+ "value": -44.25613276208458
+ },
+ {
+ "date": "2023-04-11",
+ "value": -44.213389947089205
+ },
+ {
+ "date": "2023-04-12",
+ "value": -44.50995479163519
+ },
+ {
+ "date": "2023-04-13",
+ "value": -45.316749450577454
+ },
+ {
+ "date": "2023-04-14",
+ "value": -44.152195827948
+ },
+ {
+ "date": "2023-04-17",
+ "value": -44.308115237029845
+ },
+ {
+ "date": "2023-04-18",
+ "value": -44.506386918857984
+ },
+ {
+ "date": "2023-04-19",
+ "value": -44.6826339632907
+ },
+ {
+ "date": "2023-04-20",
+ "value": -45.38798095969449
+ },
+ {
+ "date": "2023-04-21",
+ "value": -45.439312230116705
+ },
+ {
+ "date": "2023-04-24",
+ "value": -45.21896317595053
+ },
+ {
+ "date": "2023-04-25",
+ "value": -45.20602671975826
+ },
+ {
+ "date": "2023-04-26",
+ "value": -46.22235738570344
+ },
+ {
+ "date": "2023-04-27",
+ "value": -46.84075495083485
+ },
+ {
+ "date": "2023-04-28",
+ "value": -45.50181626534017
+ },
+ {
+ "date": "2023-05-01",
+ "value": -45.37193144433643
+ },
+ {
+ "date": "2023-05-02",
+ "value": -45.24364021172596
+ },
+ {
+ "date": "2023-05-03",
+ "value": -45.32287958780878
+ },
+ {
+ "date": "2023-05-04",
+ "value": -45.55609656560482
+ },
+ {
+ "date": "2023-05-05",
+ "value": -45.77858179343577
+ },
+ {
+ "date": "2023-05-08",
+ "value": -45.92830763895354
+ },
+ {
+ "date": "2023-05-09",
+ "value": -45.87280627533537
+ },
+ {
+ "date": "2023-05-10",
+ "value": -45.853791624450736
+ },
+ {
+ "date": "2023-05-11",
+ "value": -45.49220834922897
+ },
+ {
+ "date": "2023-05-12",
+ "value": -45.076410642832805
+ },
+ {
+ "date": "2023-05-15",
+ "value": -45.32395289805268
+ },
+ {
+ "date": "2023-05-16",
+ "value": -46.687395993719804
+ },
+ {
+ "date": "2023-05-17",
+ "value": -46.45651676895497
+ },
+ {
+ "date": "2023-05-18",
+ "value": -46.40374042013702
+ },
+ {
+ "date": "2023-05-19",
+ "value": -46.43008163676558
+ },
+ {
+ "date": "2023-05-22",
+ "value": -46.40914043524608
+ },
+ {
+ "date": "2023-05-23",
+ "value": -45.463339592578535
+ },
+ {
+ "date": "2023-05-24",
+ "value": -45.29062478288522
+ },
+ {
+ "date": "2023-05-25",
+ "value": -43.42068308266848
+ },
+ {
+ "date": "2023-05-26",
+ "value": -43.132183868822814
+ },
+ {
+ "date": "2023-05-29",
+ "value": -43.15596502326843
+ },
+ {
+ "date": "2023-05-30",
+ "value": -43.182266830392045
+ },
+ {
+ "date": "2023-05-31",
+ "value": -43.19939044145629
+ },
+ {
+ "date": "2023-06-01",
+ "value": -43.173113572765324
+ },
+ {
+ "date": "2023-06-02",
+ "value": -42.58257915276001
+ },
+ {
+ "date": "2023-06-05",
+ "value": -41.21551451977261
+ },
+ {
+ "date": "2023-06-06",
+ "value": -41.31306562816233
+ },
+ {
+ "date": "2023-06-07",
+ "value": -40.978447001499404
+ },
+ {
+ "date": "2023-06-08",
+ "value": -40.804404826709956
+ },
+ {
+ "date": "2023-06-09",
+ "value": -40.77569177056704
+ },
+ {
+ "date": "2023-06-12",
+ "value": -40.297643098684254
+ },
+ {
+ "date": "2023-06-13",
+ "value": -40.30624413257228
+ },
+ {
+ "date": "2023-06-14",
+ "value": -40.29109604324112
+ },
+ {
+ "date": "2023-06-15",
+ "value": -40.270486876685986
+ },
+ {
+ "date": "2023-06-16",
+ "value": -40.2963979758846
+ },
+ {
+ "date": "2023-06-19",
+ "value": -40.297309736106705
+ },
+ {
+ "date": "2023-06-20",
+ "value": -40.79636577433415
+ },
+ {
+ "date": "2023-06-21",
+ "value": -40.804458475863065
+ },
+ {
+ "date": "2023-06-22",
+ "value": -40.70399854748913
+ },
+ {
+ "date": "2023-06-23",
+ "value": -40.72870539650954
+ },
+ {
+ "date": "2023-06-26",
+ "value": -40.297997799161436
+ },
+ {
+ "date": "2023-06-27",
+ "value": -39.94086336610613
+ },
+ {
+ "date": "2023-06-28",
+ "value": -39.908432784149326
+ },
+ {
+ "date": "2023-06-29",
+ "value": -39.793654763993885
+ },
+ {
+ "date": "2023-06-30",
+ "value": -39.88707839006434
+ },
+ {
+ "date": "2023-07-03",
+ "value": -40.0256004241589
+ },
+ {
+ "date": "2023-07-04",
+ "value": -40.02648874467419
+ },
+ {
+ "date": "2023-07-05",
+ "value": -40.217492050968175
+ },
+ {
+ "date": "2023-07-06",
+ "value": -40.33863566545978
+ },
+ {
+ "date": "2023-07-07",
+ "value": -41.22324206066041
+ },
+ {
+ "date": "2023-07-10",
+ "value": -41.20415973642279
+ },
+ {
+ "date": "2023-07-11",
+ "value": -41.24150225679602
+ },
+ {
+ "date": "2023-07-12",
+ "value": -41.28124367436584
+ },
+ {
+ "date": "2023-07-13",
+ "value": -41.554322382274634
+ },
+ {
+ "date": "2023-07-14",
+ "value": -42.356823849332095
+ },
+ {
+ "date": "2023-07-17",
+ "value": -42.22966045479802
+ },
+ {
+ "date": "2023-07-18",
+ "value": -42.09098313638343
+ },
+ {
+ "date": "2023-07-19",
+ "value": -42.09197477175278
+ },
+ {
+ "date": "2023-07-20",
+ "value": -42.04336376556133
+ },
+ {
+ "date": "2023-07-21",
+ "value": -42.41262112384793
+ },
+ {
+ "date": "2023-07-24",
+ "value": -42.41254715089136
+ },
+ {
+ "date": "2023-07-25",
+ "value": -41.976949454976236
+ },
+ {
+ "date": "2023-07-26",
+ "value": -41.92678832898597
+ },
+ {
+ "date": "2023-07-27",
+ "value": -41.97384031027158
+ },
+ {
+ "date": "2023-07-28",
+ "value": -41.821794256309445
+ },
+ {
+ "date": "2023-07-31",
+ "value": -42.07436833916447
+ },
+ {
+ "date": "2023-08-01",
+ "value": -42.04498604250201
+ },
+ {
+ "date": "2023-08-02",
+ "value": -42.215528570171074
+ },
+ {
+ "date": "2023-08-03",
+ "value": -42.202410394149254
+ },
+ {
+ "date": "2023-08-04",
+ "value": -42.73396500238902
+ },
+ {
+ "date": "2023-08-07",
+ "value": -42.49051015638709
+ },
+ {
+ "date": "2023-08-08",
+ "value": -42.543414405073875
+ },
+ {
+ "date": "2023-08-09",
+ "value": -42.139270828396896
+ },
+ {
+ "date": "2023-08-10",
+ "value": -42.182062784959
+ },
+ {
+ "date": "2023-08-11",
+ "value": -41.54896309561613
+ },
+ {
+ "date": "2023-08-14",
+ "value": -41.483058397450534
+ },
+ {
+ "date": "2023-08-15",
+ "value": -40.66130458412212
+ },
+ {
+ "date": "2023-08-16",
+ "value": -39.64769292017008
+ },
+ {
+ "date": "2023-08-17",
+ "value": -39.6833218811221
+ },
+ {
+ "date": "2023-08-18",
+ "value": -39.91784950004277
+ },
+ {
+ "date": "2023-08-21",
+ "value": -39.87603332381206
+ },
+ {
+ "date": "2023-08-22",
+ "value": -39.932258005852
+ },
+ {
+ "date": "2023-08-23",
+ "value": -40.04905187824905
+ },
+ {
+ "date": "2023-08-24",
+ "value": -39.75626423568918
+ },
+ {
+ "date": "2023-08-25",
+ "value": -40.1743402878126
+ },
+ {
+ "date": "2023-08-28",
+ "value": -39.969820106629534
+ },
+ {
+ "date": "2023-08-29",
+ "value": -40.077792431947216
+ },
+ {
+ "date": "2023-08-30",
+ "value": -40.11842351267732
+ },
+ {
+ "date": "2023-08-31",
+ "value": -40.62303747999593
+ },
+ {
+ "date": "2023-09-01",
+ "value": -40.81916746455671
+ },
+ {
+ "date": "2023-09-04",
+ "value": -41.05048926326658
+ },
+ {
+ "date": "2023-09-05",
+ "value": -40.847587738535715
+ },
+ {
+ "date": "2023-09-06",
+ "value": -40.355865478728695
+ },
+ {
+ "date": "2023-09-07",
+ "value": -40.233366913262266
+ },
+ {
+ "date": "2023-09-08",
+ "value": -39.46195515345874
+ },
+ {
+ "date": "2023-09-11",
+ "value": -39.46176062261705
+ },
+ {
+ "date": "2023-09-12",
+ "value": -39.494925006108566
+ },
+ {
+ "date": "2023-09-13",
+ "value": -39.398893480731324
+ },
+ {
+ "date": "2023-09-14",
+ "value": -39.38175836821938
+ },
+ {
+ "date": "2023-09-15",
+ "value": -38.187924497873624
+ },
+ {
+ "date": "2023-09-18",
+ "value": -38.196053409149314
+ },
+ {
+ "date": "2023-09-19",
+ "value": -38.225266429630686
+ },
+ {
+ "date": "2023-09-20",
+ "value": -38.194155446639584
+ },
+ {
+ "date": "2023-09-21",
+ "value": -38.30484184974148
+ },
+ {
+ "date": "2023-09-22",
+ "value": -37.64510269212615
+ },
+ {
+ "date": "2023-09-25",
+ "value": -37.8045229052574
+ },
+ {
+ "date": "2023-09-26",
+ "value": -37.80016816258572
+ },
+ {
+ "date": "2023-09-27",
+ "value": -37.892697920552514
+ },
+ {
+ "date": "2023-09-28",
+ "value": -38.30183048187201
+ },
+ {
+ "date": "2023-09-29",
+ "value": -38.29168117788573
+ },
+ {
+ "date": "2023-10-02",
+ "value": -37.91031107768021
+ },
+ {
+ "date": "2023-10-03",
+ "value": -38.5119393373163
+ },
+ {
+ "date": "2023-10-04",
+ "value": -38.34158431341362
+ },
+ {
+ "date": "2023-10-05",
+ "value": -38.3223356490599
+ },
+ {
+ "date": "2023-10-06",
+ "value": -38.141692664418755
+ },
+ {
+ "date": "2023-10-09",
+ "value": -38.88984223919421
+ },
+ {
+ "date": "2023-10-10",
+ "value": -38.81369823729917
+ },
+ {
+ "date": "2023-10-11",
+ "value": -38.47745441157
+ },
+ {
+ "date": "2023-10-12",
+ "value": -38.30859056617639
+ },
+ {
+ "date": "2023-10-13",
+ "value": -38.383552711261494
+ },
+ {
+ "date": "2023-10-16",
+ "value": -38.04204787904703
+ },
+ {
+ "date": "2023-10-17",
+ "value": -38.08480895047849
+ },
+ {
+ "date": "2023-10-18",
+ "value": -38.01684064330877
+ },
+ {
+ "date": "2023-10-19",
+ "value": -37.888970066035135
+ },
+ {
+ "date": "2023-10-20",
+ "value": -37.87333464326343
+ },
+ {
+ "date": "2023-10-23",
+ "value": -38.6352054376864
+ },
+ {
+ "date": "2023-10-24",
+ "value": -38.43973607543679
+ },
+ {
+ "date": "2023-10-25",
+ "value": -38.584598071306544
+ },
+ {
+ "date": "2023-10-26",
+ "value": -38.21538088866472
+ },
+ {
+ "date": "2023-10-27",
+ "value": -38.10991224010419
+ },
+ {
+ "date": "2023-10-30",
+ "value": -38.106475145286524
+ },
+ {
+ "date": "2023-10-31",
+ "value": -37.91081724240727
+ }
+ ],
+ "monthly_returns": [
+ {
+ "date": "2020-01-31",
+ "value": 0.06865014834105287
+ },
+ {
+ "date": "2020-02-29",
+ "value": 0.06042602306224176
+ },
+ {
+ "date": "2020-03-31",
+ "value": -0.02453205128429814
+ },
+ {
+ "date": "2020-04-30",
+ "value": -0.0173650204222896
+ },
+ {
+ "date": "2020-05-31",
+ "value": 0.03950626913415678
+ },
+ {
+ "date": "2020-06-30",
+ "value": 0.0015243517362180103
+ },
+ {
+ "date": "2020-07-31",
+ "value": -0.0006244804747685961
+ },
+ {
+ "date": "2020-08-31",
+ "value": -0.03345022494959138
+ },
+ {
+ "date": "2020-09-30",
+ "value": -0.0005054303824160167
+ },
+ {
+ "date": "2020-10-31",
+ "value": -0.054740644809139094
+ },
+ {
+ "date": "2020-11-30",
+ "value": 0.04282973766880871
+ },
+ {
+ "date": "2020-12-31",
+ "value": 0.0302043382060726
+ },
+ {
+ "date": "2021-01-31",
+ "value": 0.01821435145487227
+ },
+ {
+ "date": "2021-02-28",
+ "value": 0.03334307497823441
+ },
+ {
+ "date": "2021-03-31",
+ "value": -0.03495764148170355
+ },
+ {
+ "date": "2021-04-30",
+ "value": -0.021487321274960447
+ },
+ {
+ "date": "2021-05-31",
+ "value": -0.009687250256286917
+ },
+ {
+ "date": "2021-06-30",
+ "value": -0.011079845479772699
+ },
+ {
+ "date": "2021-07-31",
+ "value": 0.09486737626450359
+ },
+ {
+ "date": "2021-08-31",
+ "value": 0.1201699704652035
+ },
+ {
+ "date": "2021-09-30",
+ "value": 0.012499851542561391
+ },
+ {
+ "date": "2021-10-31",
+ "value": 0.06213473206827991
+ },
+ {
+ "date": "2021-11-30",
+ "value": 0.0011270257346189805
+ },
+ {
+ "date": "2021-12-31",
+ "value": 0.12243839646812993
+ },
+ {
+ "date": "2022-01-31",
+ "value": 0.06477600398172245
+ },
+ {
+ "date": "2022-02-28",
+ "value": 0.10347277418143497
+ },
+ {
+ "date": "2022-03-31",
+ "value": -0.030836129490708464
+ },
+ {
+ "date": "2022-04-30",
+ "value": -0.006863099510742154
+ },
+ {
+ "date": "2022-05-31",
+ "value": -0.018500310991956925
+ },
+ {
+ "date": "2022-06-30",
+ "value": -0.021921968719219143
+ },
+ {
+ "date": "2022-07-31",
+ "value": 0.03725295527889538
+ },
+ {
+ "date": "2022-08-31",
+ "value": 0.030525881994598825
+ },
+ {
+ "date": "2022-09-30",
+ "value": 0.024925059973859298
+ },
+ {
+ "date": "2022-10-31",
+ "value": -0.028652297843686503
+ },
+ {
+ "date": "2022-11-30",
+ "value": 0.03127894968847755
+ },
+ {
+ "date": "2022-12-31",
+ "value": -0.02017693938245524
+ },
+ {
+ "date": "2023-01-31",
+ "value": -0.0005046887628690211
+ },
+ {
+ "date": "2023-02-28",
+ "value": -0.009331945741649972
+ },
+ {
+ "date": "2023-03-31",
+ "value": -0.04878379157625412
+ },
+ {
+ "date": "2023-04-30",
+ "value": -0.0009814229091111848
+ },
+ {
+ "date": "2023-05-31",
+ "value": 0.019749010846265902
+ },
+ {
+ "date": "2023-06-30",
+ "value": 0.06656149972430003
+ },
+ {
+ "date": "2023-07-31",
+ "value": -0.023636532952472145
+ },
+ {
+ "date": "2023-08-31",
+ "value": 0.013164123477925838
+ },
+ {
+ "date": "2023-09-30",
+ "value": -0.07759771866113996
+ },
+ {
+ "date": "2023-10-31",
+ "value": 0.08413636347281495
+ }
+ ]
+ },
+ "start_date": "2020-01-01",
+ "end_date": "2023-10-31",
+ "total_return": 88.9702525715222
+}
\ No newline at end of file
diff --git a/strategy.csv b/strategy.csv
index ff5a3ed..0daed08 100644
--- a/strategy.csv
+++ b/strategy.csv
@@ -1,1001 +1,1001 @@
,Strategy
-2020-01-01,100.41880037930366
-2020-01-02,98.8384685376672
-2020-01-03,97.93377826158496
-2020-01-06,97.47982440424616
-2020-01-07,99.43938581258811
-2020-01-08,99.14869772801907
-2020-01-09,97.35601733022777
-2020-01-10,98.16017147960984
-2020-01-13,98.51581966606808
-2020-01-14,98.42639270633707
-2020-01-15,100.24527393141585
-2020-01-16,100.71765218525475
-2020-01-17,100.9536032078628
-2020-01-20,102.26973268400373
-2020-01-21,101.22025973621696
-2020-01-22,100.29324194653744
-2020-01-23,100.57239431581402
-2020-01-24,99.24137054840095
-2020-01-27,98.38211500855094
-2020-01-28,97.69569609761264
-2020-01-29,97.26284627582054
-2020-01-30,97.77448153915009
-2020-01-31,98.00863250578918
-2020-02-03,98.89107218339957
-2020-02-04,97.34177371288851
-2020-02-05,97.02644624796012
-2020-02-06,96.79975446309484
-2020-02-07,96.5746464385124
-2020-02-10,97.84431178225718
-2020-02-11,97.23271184797764
-2020-02-12,97.56801569611004
-2020-02-13,97.43181449693975
-2020-02-14,96.81577709734866
-2020-02-17,98.00254350189938
-2020-02-18,97.10142218527264
-2020-02-19,96.06354898425771
-2020-02-20,94.08480399012309
-2020-02-21,93.8015363021097
-2020-02-24,93.08748759074233
-2020-02-25,94.97987563935783
-2020-02-26,96.02060554745455
-2020-02-27,97.05258941033296
-2020-02-28,99.19816865776536
-2020-03-02,99.20774614152128
-2020-03-03,99.63238145384877
-2020-03-04,102.01705603374351
-2020-03-05,100.9192031547445
-2020-03-06,100.29016827124701
-2020-03-09,97.7972430970185
-2020-03-10,98.82162709764971
-2020-03-11,97.08236734139648
-2020-03-12,97.62831036012493
-2020-03-13,98.60034867606055
-2020-03-16,97.93584212467539
-2020-03-17,98.97475999193335
-2020-03-18,97.87116452093395
-2020-03-19,97.7085697732295
-2020-03-20,97.66194274563847
-2020-03-23,97.46232938776657
-2020-03-24,97.73388151046845
-2020-03-25,97.10872562031147
-2020-03-26,96.68916462702411
-2020-03-27,97.57402920157766
-2020-03-30,98.33149999693795
-2020-03-31,98.69522632815844
-2020-04-01,98.3357557719807
-2020-04-02,97.71570319071373
-2020-04-03,96.72625069407715
-2020-04-06,95.31652406164419
-2020-04-07,96.76419847148419
-2020-04-08,96.27233737199641
-2020-04-09,95.48870062164436
-2020-04-10,97.04813895361502
-2020-04-13,97.50934487949064
-2020-04-14,98.82224404688054
-2020-04-15,97.4838899338018
-2020-04-16,96.98855876363778
-2020-04-17,98.61084222978684
-2020-04-20,99.32753943539578
-2020-04-21,99.34820115923873
-2020-04-22,99.32462887043663
-2020-04-23,99.54140580997675
-2020-04-24,98.28354156654294
-2020-04-27,98.558900289494
-2020-04-28,97.16230321181091
-2020-04-29,96.76977768451722
-2020-04-30,97.23827107668687
-2020-05-01,97.72421227773391
-2020-05-04,98.09655706195048
-2020-05-05,96.79649451832834
-2020-05-06,95.29831543277906
-2020-05-07,95.9307515015837
-2020-05-08,95.22420199944315
-2020-05-11,94.94524374685076
-2020-05-12,94.68539091048736
-2020-05-13,93.19596931078982
-2020-05-14,94.18820125700084
-2020-05-15,95.12870110037517
-2020-05-18,95.09158224218227
-2020-05-19,94.75589547557543
-2020-05-20,95.09980533633812
-2020-05-21,95.42743360407792
-2020-05-22,96.13869733821055
-2020-05-25,97.51865828015264
-2020-05-26,96.08223324081749
-2020-05-27,97.07446524704707
-2020-05-28,97.41062562347147
-2020-05-29,97.99427259806377
-2020-06-01,98.57219286879649
-2020-06-02,98.36569400590352
-2020-06-03,99.51015014356692
-2020-06-04,97.7920635266045
-2020-06-05,98.6171763152511
-2020-06-08,100.49683847256938
-2020-06-09,100.46517418256312
-2020-06-10,100.36862086781422
-2020-06-11,99.860978249344
-2020-06-12,100.72731272053537
-2020-06-15,99.51798574193343
-2020-06-16,99.07009271767478
-2020-06-17,97.4773942563283
-2020-06-18,97.98241249444139
-2020-06-19,97.38059717519434
-2020-06-22,98.53788842564691
-2020-06-23,98.34721170859191
-2020-06-24,97.86975894325307
-2020-06-25,99.26306107942153
-2020-06-26,98.40688170644776
-2020-06-29,98.5285498062234
-2020-06-30,98.3538803470668
-2020-07-01,98.48474493515333
-2020-07-02,98.92137561281422
-2020-07-03,100.28154217509677
-2020-07-06,100.16517922628101
-2020-07-07,99.7331032842054
-2020-07-08,98.91480327784335
-2020-07-09,99.66948590468303
-2020-07-10,99.7284880563705
-2020-07-13,97.55496019995175
-2020-07-14,96.97732353615781
-2020-07-15,95.92573822530204
-2020-07-16,97.60436843056115
-2020-07-17,98.48166025038796
-2020-07-20,97.78084854606979
-2020-07-21,98.0849066227443
-2020-07-22,98.81811269029603
-2020-07-23,100.06514240039334
-2020-07-24,98.31189496360054
-2020-07-27,99.80838324753049
-2020-07-28,100.44617248361885
-2020-07-29,100.9605137504942
-2020-07-30,99.73391846369762
-2020-07-31,99.44204007742331
-2020-08-03,100.0245637115821
-2020-08-04,100.05149685615804
-2020-08-05,99.62754813891401
-2020-08-06,99.99004071491841
-2020-08-07,102.2789678442715
-2020-08-10,103.69117914023983
-2020-08-11,104.62954337112652
-2020-08-12,105.29792166386736
-2020-08-13,104.86374327464196
-2020-08-14,103.73511335221377
-2020-08-17,103.06881136441307
-2020-08-18,101.92871930281495
-2020-08-19,101.80072102801341
-2020-08-20,102.09433478694467
-2020-08-21,102.91962667485366
-2020-08-24,103.51629859037479
-2020-08-25,104.36877473423034
-2020-08-26,104.75673972005649
-2020-08-27,106.14531269472761
-2020-08-28,106.8853757752142
-2020-08-31,108.56345720203018
-2020-09-01,107.91756318601153
-2020-09-02,105.86894800072697
-2020-09-03,106.43783674418785
-2020-09-04,109.25557392745627
-2020-09-07,108.51990438845274
-2020-09-08,107.67814477441071
-2020-09-09,107.59244907690355
-2020-09-10,109.20381958673069
-2020-09-11,107.17225458206154
-2020-09-14,107.63889547444417
-2020-09-15,107.66299003278338
-2020-09-16,104.60175588249862
-2020-09-17,104.59810419992144
-2020-09-18,105.32886529416004
-2020-09-21,105.13560793565513
-2020-09-22,105.38310142075322
-2020-09-23,107.17417548791823
-2020-09-24,105.36813657378347
-2020-09-25,106.18036336391256
-2020-09-28,105.91693935679342
-2020-09-29,106.1535520060084
-2020-09-30,106.28328243223764
-2020-10-01,104.51808655961679
-2020-10-02,105.63138875301851
-2020-10-05,105.03475105206195
-2020-10-06,104.8771295372807
-2020-10-07,104.63930792606237
-2020-10-08,103.90196383739865
-2020-10-09,105.58755337032278
-2020-10-12,105.00792906891733
-2020-10-13,104.56432167977292
-2020-10-14,105.00280600042254
-2020-10-15,105.27560480934514
-2020-10-16,104.8333030813479
-2020-10-19,104.59493680431264
-2020-10-20,104.18529529564108
-2020-10-21,105.11046803482131
-2020-10-22,105.80666449383074
-2020-10-23,108.649552431816
-2020-10-26,109.04225323745528
-2020-10-27,109.4732619802375
-2020-10-28,110.1396165396793
-2020-10-29,109.51969108423789
-2020-10-30,109.43702190204678
-2020-11-02,109.34687713057787
-2020-11-03,109.35718573702945
-2020-11-04,108.33688505941963
-2020-11-05,107.53818773111996
-2020-11-06,106.88782579022424
-2020-11-09,105.79185635206625
-2020-11-10,105.36228072437022
-2020-11-11,107.14589382876002
-2020-11-12,107.34462949269307
-2020-11-13,107.40398314463782
-2020-11-16,107.69809825934598
-2020-11-17,105.73070129255733
-2020-11-18,104.9790431704523
-2020-11-19,106.15100111752184
-2020-11-20,106.11933729272529
-2020-11-23,105.51451429860965
-2020-11-24,104.19881210032887
-2020-11-25,105.60558581471223
-2020-11-26,104.5376646481093
-2020-11-27,104.7407507016034
-2020-11-30,105.75200658385727
-2020-12-01,107.2685477357266
-2020-12-02,106.65667572337969
-2020-12-03,107.32541206642254
-2020-12-04,106.39038293802261
-2020-12-07,106.06169200273172
-2020-12-08,106.80646638769366
-2020-12-09,105.25718547466158
-2020-12-10,106.25972855693135
-2020-12-11,106.21149751015932
-2020-12-14,107.5227575965914
-2020-12-15,108.75801068034473
-2020-12-16,108.89941400684933
-2020-12-17,109.36983024195435
-2020-12-18,109.97573361597443
-2020-12-21,109.0882795543501
-2020-12-22,109.06867924333257
-2020-12-23,108.99758762234804
-2020-12-24,109.68810205815196
-2020-12-25,109.87507268911077
-2020-12-28,110.06056778391513
-2020-12-29,111.56526881325428
-2020-12-30,110.53486008693795
-2020-12-31,109.71378449289482
-2021-01-01,108.35064722692131
-2021-01-04,108.49549003684378
-2021-01-05,108.63444850734349
-2021-01-06,110.17886040053016
-2021-01-07,111.37947813733884
-2021-01-08,111.50749723278513
-2021-01-11,110.90251073250961
-2021-01-12,111.92808727751546
-2021-01-13,111.5692844837142
-2021-01-14,109.88403451258704
-2021-01-15,108.92768687207015
-2021-01-18,108.8210397667505
-2021-01-19,110.09731331336579
-2021-01-20,110.68262255818351
-2021-01-21,111.2270474878696
-2021-01-22,111.55515249356951
-2021-01-25,112.49129965708616
-2021-01-26,112.24002222973436
-2021-01-27,113.1033255286392
-2021-01-28,112.81060645574976
-2021-01-29,114.10500002547002
-2021-02-01,114.61045266867865
-2021-02-02,113.87289650509283
-2021-02-03,114.02385725953548
-2021-02-04,114.23403687187079
-2021-02-05,113.30515597704216
-2021-02-08,112.64956053294388
-2021-02-09,112.35922004941759
-2021-02-10,112.78707825946836
-2021-02-11,110.39942671458707
-2021-02-12,109.94507166341896
-2021-02-15,109.79855012894382
-2021-02-16,108.577682804911
-2021-02-17,109.8004756081757
-2021-02-18,110.614972631815
-2021-02-19,111.39859340049989
-2021-02-22,111.34424890354866
-2021-02-23,110.39240716057522
-2021-02-24,110.1286199933843
-2021-02-25,110.87647443732213
-2021-02-26,112.34276791472897
-2021-03-01,112.4150210574453
-2021-03-02,111.35452778707153
-2021-03-03,112.50873014779148
-2021-03-04,112.19683964488854
-2021-03-05,113.59941416632726
-2021-03-08,114.6155626632604
-2021-03-09,114.14600642518273
-2021-03-10,113.28388460768464
-2021-03-11,112.30795183229706
-2021-03-12,112.70113647622635
-2021-03-15,114.24069040689548
-2021-03-16,112.97737049090175
-2021-03-17,113.47453705590868
-2021-03-18,112.75412656150488
-2021-03-19,112.53140291058376
-2021-03-22,112.17019460849342
-2021-03-23,111.53484632353943
-2021-03-24,111.20427382485343
-2021-03-25,111.8111705299709
-2021-03-26,111.2706743642794
-2021-03-29,111.51831260215646
-2021-03-30,111.87752748672581
-2021-03-31,113.23279794014967
-2021-04-01,114.06422670138043
-2021-04-02,114.0734640616753
-2021-04-05,113.22232339582328
-2021-04-06,112.2260652137853
-2021-04-07,112.62540473412264
-2021-04-08,110.04032377520588
-2021-04-09,107.5250102115189
-2021-04-12,107.85026763056429
-2021-04-13,108.28521531156794
-2021-04-14,108.6212086527699
-2021-04-15,110.49973081090907
-2021-04-16,110.01988312490943
-2021-04-19,109.49037162038606
-2021-04-20,110.110371646419
-2021-04-21,111.14881049007823
-2021-04-22,111.33234609022946
-2021-04-23,110.83920108996605
-2021-04-26,112.01244264087666
-2021-04-27,112.21088169100226
-2021-04-28,110.68210562822041
-2021-04-29,109.70234549467553
-2021-04-30,110.86849943707928
-2021-05-03,111.82990125191152
-2021-05-04,112.55150952842376
-2021-05-05,111.56461335373125
-2021-05-06,111.51279133702685
-2021-05-07,110.41045468740356
-2021-05-10,109.03959334643645
-2021-05-11,108.18080315064928
-2021-05-12,109.10930848989162
-2021-05-13,108.58749089514134
-2021-05-14,108.3971465416357
-2021-05-17,107.09375053378716
-2021-05-18,108.54952809061795
-2021-05-19,111.10134630332458
-2021-05-20,110.7743616538686
-2021-05-21,110.18510011867562
-2021-05-24,110.68333466698172
-2021-05-25,110.09409250604382
-2021-05-26,110.33612291668138
-2021-05-27,112.02572171555252
-2021-05-28,111.90828717694225
-2021-05-31,113.28908153776918
-2021-06-01,112.58861457187325
-2021-06-02,111.1699295862876
-2021-06-03,112.76307580599824
-2021-06-04,113.28591949429068
-2021-06-07,113.69706888262137
-2021-06-08,114.27918176806048
-2021-06-09,116.46218299740542
-2021-06-10,117.48200409894709
-2021-06-11,118.73424680143852
-2021-06-14,116.94689123370206
-2021-06-15,116.54931873998325
-2021-06-16,116.02296697095365
-2021-06-17,116.31917535661556
-2021-06-18,116.26776185625806
-2021-06-21,116.4119835011982
-2021-06-22,117.25209019163485
-2021-06-23,118.83350745058299
-2021-06-24,119.4742484443078
-2021-06-25,118.85175585595549
-2021-06-28,118.78346202932677
-2021-06-29,119.80696177117063
-2021-06-30,119.08497944608449
-2021-07-01,118.65477864904885
-2021-07-02,117.59991288271017
-2021-07-05,118.32340344783461
-2021-07-06,117.45946805765983
-2021-07-07,118.07949753823772
-2021-07-08,117.40127538148319
-2021-07-09,118.4742777363142
-2021-07-12,118.55757751899503
-2021-07-13,119.60879058974479
-2021-07-14,122.02481426542104
-2021-07-15,121.4304096144493
-2021-07-16,120.00768520934697
-2021-07-19,121.02052181860823
-2021-07-20,121.89537843226155
-2021-07-21,120.84697850222864
-2021-07-22,119.69482696676832
-2021-07-23,118.79273154361046
-2021-07-26,118.23111283518395
-2021-07-27,118.18565251744128
-2021-07-28,118.72799952846474
-2021-07-29,117.7492412535324
-2021-07-30,117.80048538787426
-2021-08-02,117.89567799848437
-2021-08-03,117.51053347922638
-2021-08-04,116.58357269551898
-2021-08-05,117.82272411341287
-2021-08-06,118.24614925874629
-2021-08-09,118.62558014748639
-2021-08-10,119.58857168699974
-2021-08-11,117.69852163918273
-2021-08-12,118.85561838291945
-2021-08-13,117.73704889712818
-2021-08-16,117.85469112721196
-2021-08-17,116.76481473146765
-2021-08-18,117.08211192663391
-2021-08-19,117.78481659330089
-2021-08-20,118.85617064801421
-2021-08-23,121.28057592905357
-2021-08-24,119.3079483032084
-2021-08-25,118.96003922558505
-2021-08-26,119.06687414436139
-2021-08-27,119.6313672466849
-2021-08-30,118.68214328363074
-2021-08-31,119.40359273936892
-2021-09-01,118.78554258550334
-2021-09-02,117.72150021313676
-2021-09-03,118.16122220362757
-2021-09-06,116.99273395901298
-2021-09-07,117.55672262392451
-2021-09-08,115.89476657240343
-2021-09-09,114.53793589583941
-2021-09-10,113.61786090520584
-2021-09-13,113.84633152974399
-2021-09-14,114.65591797073094
-2021-09-15,114.97274252551082
-2021-09-16,114.41433600408735
-2021-09-17,114.57716425393826
-2021-09-20,113.04912753989385
-2021-09-21,110.7941963600997
-2021-09-22,109.21807445006102
-2021-09-23,108.3532050013972
-2021-09-24,108.9302393275076
-2021-09-27,108.22386986979036
-2021-09-28,110.77106377720102
-2021-09-29,110.82289834980217
-2021-09-30,110.03922998594832
-2021-10-01,110.46843214935971
-2021-10-04,109.60831362586481
-2021-10-05,109.60200315913207
-2021-10-06,108.87324194443482
-2021-10-07,109.31625747370998
-2021-10-08,109.12935193523938
-2021-10-11,107.73188313351103
-2021-10-12,109.0710883425476
-2021-10-13,109.87917087358797
-2021-10-14,109.57229744679711
-2021-10-15,108.2453016903129
-2021-10-18,108.73911632130306
-2021-10-19,110.8187256706882
-2021-10-20,110.08076014600879
-2021-10-21,110.36706152593743
-2021-10-22,109.0149787752009
-2021-10-25,108.25108301811785
-2021-10-26,108.06819810563826
-2021-10-27,106.17685056557833
-2021-10-28,106.55599714629993
-2021-10-29,104.9284410172542
-2021-11-01,103.37173568988047
-2021-11-02,104.36397718736103
-2021-11-03,104.91419121531035
-2021-11-04,105.34887125253019
-2021-11-05,104.48363632870593
-2021-11-08,103.39520244176485
-2021-11-09,101.85624112920806
-2021-11-10,99.57926012726868
-2021-11-11,99.58878166453663
-2021-11-12,101.61351182926582
-2021-11-15,101.62263221384302
-2021-11-16,100.89464129816949
-2021-11-17,100.88294633957389
-2021-11-18,100.98877364452802
-2021-11-19,99.04910954002052
-2021-11-22,98.85211506076261
-2021-11-23,98.74433182738952
-2021-11-24,98.94007072108325
-2021-11-25,99.06928333655762
-2021-11-26,97.717836346104
-2021-11-29,99.0598880909135
-2021-11-30,98.60596067081183
-2021-12-01,97.45636336010162
-2021-12-02,97.96312912683177
-2021-12-03,98.56416398101231
-2021-12-06,100.01647707807027
-2021-12-07,101.15528606207569
-2021-12-08,101.33452463160467
-2021-12-09,100.64322745316797
-2021-12-10,100.62428908530394
-2021-12-13,100.90497721233965
-2021-12-14,100.66842294986816
-2021-12-15,100.98982663923066
-2021-12-16,102.60405255498233
-2021-12-17,104.44814259766497
-2021-12-20,103.437038403961
-2021-12-21,102.38244808221471
-2021-12-22,105.30573902006401
-2021-12-23,105.31043421900084
-2021-12-24,104.5179014075718
-2021-12-27,103.73971224141425
-2021-12-28,103.94211000018763
-2021-12-29,103.09300282439014
-2021-12-30,102.11189562328065
-2021-12-31,102.55862786638221
-2022-01-03,102.43064455354163
-2022-01-04,103.89022277584559
-2022-01-05,103.08899653936172
-2022-01-06,101.99096283933495
-2022-01-07,101.55161951772789
-2022-01-10,103.55435705778584
-2022-01-11,101.8325111888162
-2022-01-12,101.99122292696575
-2022-01-13,102.39848939781237
-2022-01-14,101.24467294816822
-2022-01-17,99.03506690911918
-2022-01-18,99.2228257981884
-2022-01-19,98.84516206480903
-2022-01-20,100.55902284649687
-2022-01-21,100.91854366466141
-2022-01-24,99.68713864767643
-2022-01-25,100.96545902320379
-2022-01-26,98.29322712435798
-2022-01-27,99.60790184839742
-2022-01-28,99.31388308977242
-2022-01-31,99.43206063017549
-2022-02-01,99.7159775952767
-2022-02-02,100.39447208089133
-2022-02-03,101.73145974474463
-2022-02-04,101.6519142527159
-2022-02-07,102.26405682829404
-2022-02-08,102.53654297220135
-2022-02-09,104.01438422702627
-2022-02-10,104.42207242676002
-2022-02-11,103.40870228352668
-2022-02-14,104.71985477739862
-2022-02-15,103.9937695456507
-2022-02-16,103.90372302952267
-2022-02-17,101.22605371219282
-2022-02-18,100.28623588814696
-2022-02-21,99.5652540053712
-2022-02-22,99.8183735134854
-2022-02-23,100.24595032557919
-2022-02-24,98.72774294896831
-2022-02-25,98.57160743243224
-2022-02-28,97.8045415462564
-2022-03-01,99.48256093652179
-2022-03-02,100.456188990334
-2022-03-03,102.04336803572258
-2022-03-04,100.1207762715425
-2022-03-07,100.52388243967401
-2022-03-08,101.57636027339574
-2022-03-09,100.86339048366332
-2022-03-10,101.8425860252348
-2022-03-11,102.51175186172202
-2022-03-14,101.02393950399302
-2022-03-15,101.596393240563
-2022-03-16,100.72371241166087
-2022-03-17,101.55102622418116
-2022-03-18,102.39124473593013
-2022-03-21,101.07013996168739
-2022-03-22,100.94880732988733
-2022-03-23,99.96195564088914
-2022-03-24,100.03049098246215
-2022-03-25,99.57019473579996
-2022-03-28,99.29608009358968
-2022-03-29,99.00418620631808
-2022-03-30,99.4379786209415
-2022-03-31,98.8172464108606
-2022-04-01,98.75831331379207
-2022-04-04,97.7303754071647
-2022-04-05,95.98816401280921
-2022-04-06,96.1702275080129
-2022-04-07,95.82977444725043
-2022-04-08,96.56604760732415
-2022-04-11,96.65833511320206
-2022-04-12,94.87155585764863
-2022-04-13,95.9437369305589
-2022-04-14,96.88432807953522
-2022-04-15,97.66387916117985
-2022-04-18,96.6817318179565
-2022-04-19,97.75625333386844
-2022-04-20,96.82304835807172
-2022-04-21,94.83408475895143
-2022-04-22,93.29579265014881
-2022-04-25,92.43509485201655
-2022-04-26,91.65293965354672
-2022-04-27,91.03233764035424
-2022-04-28,91.38002676142898
-2022-04-29,92.01471537481373
-2022-05-02,92.75354485935966
-2022-05-03,93.93190603895609
-2022-05-04,94.03757010374751
-2022-05-05,91.66289063273378
-2022-05-06,90.46494542045312
-2022-05-09,90.01143347276641
-2022-05-10,89.12346796055142
-2022-05-11,89.14887395593189
-2022-05-12,89.53287197316399
-2022-05-13,88.8750294770643
-2022-05-16,90.9981979612398
-2022-05-17,91.17921150686712
-2022-05-18,91.9233926461424
-2022-05-19,90.859275756321
-2022-05-20,92.12853372085445
-2022-05-23,91.41018739976883
-2022-05-24,91.96506569259608
-2022-05-25,91.69130460979721
-2022-05-26,90.975248383358
-2022-05-27,90.01737899876989
-2022-05-30,90.1596507416652
-2022-05-31,90.07741177804975
-2022-06-01,90.08764730573849
-2022-06-02,89.39680372764649
-2022-06-03,90.22782230863207
-2022-06-06,89.27369772274909
-2022-06-07,89.96628001316974
-2022-06-08,90.13493806217878
-2022-06-09,90.40180598983808
-2022-06-10,88.68903445741691
-2022-06-13,87.73726592312518
-2022-06-14,88.61284134667162
-2022-06-15,88.71726511637797
-2022-06-16,88.8730997603316
-2022-06-17,89.57059372126878
-2022-06-20,90.75759796675597
-2022-06-21,90.94825279033569
-2022-06-22,89.81797394416003
-2022-06-23,89.40663226997646
-2022-06-24,88.30479166927307
-2022-06-27,89.00429413770094
-2022-06-28,87.86142189790957
-2022-06-29,88.75696832564536
-2022-06-30,88.26718990735277
-2022-07-01,87.83493372613985
-2022-07-04,88.6255923069959
-2022-07-05,89.66562921310916
-2022-07-06,88.5822285722538
-2022-07-07,87.77693722522322
-2022-07-08,89.40006076931084
-2022-07-11,89.06989986462428
-2022-07-12,90.62802393014698
-2022-07-13,89.91306216777056
-2022-07-14,89.39829179822996
-2022-07-15,90.61004180834426
-2022-07-18,90.591957787098
-2022-07-19,89.97282334889758
-2022-07-20,91.85834520363541
-2022-07-21,93.34535369691697
-2022-07-22,94.18118841291032
-2022-07-25,96.71999614559849
-2022-07-26,95.63565005424431
-2022-07-27,96.07045397007094
-2022-07-28,95.99456496290793
-2022-07-29,94.68884481392556
-2022-08-01,93.05561386489595
-2022-08-02,92.0235432336588
-2022-08-03,92.31824089504161
-2022-08-04,93.25034880333634
-2022-08-05,92.94739103838185
-2022-08-08,94.77208587712725
-2022-08-09,94.65022938645919
-2022-08-10,92.69403176403455
-2022-08-11,94.11659263761621
-2022-08-12,93.5711589281545
-2022-08-15,93.84515909463944
-2022-08-16,93.68732673535575
-2022-08-17,94.55439373034854
-2022-08-18,93.50863583956848
-2022-08-19,92.40293089231338
-2022-08-22,92.6844400372465
-2022-08-23,93.32348288941795
-2022-08-24,93.45235650980968
-2022-08-25,95.5312023988772
-2022-08-26,94.66136384184605
-2022-08-29,95.20170176501914
-2022-08-30,94.73085829856204
-2022-08-31,95.06144914571152
-2022-09-01,95.89294922786793
-2022-09-02,96.73079379218926
-2022-09-05,97.97349289523363
-2022-09-06,97.14232460741047
-2022-09-07,96.01953591751601
-2022-09-08,96.76871840032281
-2022-09-09,97.89092940760817
-2022-09-12,98.17097178233028
-2022-09-13,97.5966878378544
-2022-09-14,98.33697701738521
-2022-09-15,99.12470679950832
-2022-09-16,98.00967477033437
-2022-09-19,96.93947882412624
-2022-09-20,97.71295744574053
-2022-09-21,97.57348683951396
-2022-09-22,97.67354759094232
-2022-09-23,97.68122811841053
-2022-09-26,97.52666475215105
-2022-09-27,95.18976484462533
-2022-09-28,96.00646988936677
-2022-09-29,95.48835500900285
-2022-09-30,96.57358267455089
-2022-10-03,97.38987590505721
-2022-10-04,97.30973229270856
-2022-10-05,97.3792961164355
-2022-10-06,97.1878840031436
-2022-10-07,97.29606534733529
-2022-10-10,96.67347904182112
-2022-10-11,97.15953340085832
-2022-10-12,96.52530400462481
-2022-10-13,97.88364510278782
-2022-10-14,98.06844611176342
-2022-10-17,97.28351990978032
-2022-10-18,98.03926798810141
-2022-10-19,99.06940821281778
-2022-10-20,99.46093988626129
-2022-10-21,100.75716998062627
-2022-10-24,101.79799541901913
-2022-10-25,101.50366258860547
-2022-10-26,100.68267803468814
-2022-10-27,101.25601090648586
-2022-10-28,100.0391643707913
-2022-10-31,102.58142763465872
-2022-11-01,103.14290351360225
-2022-11-02,103.85891966840643
-2022-11-03,102.75050481423158
-2022-11-04,104.3314038086073
-2022-11-07,105.08019219624106
-2022-11-08,105.81816424468438
-2022-11-09,106.71671989155772
-2022-11-10,107.54938325860259
-2022-11-11,106.39399791864672
-2022-11-14,106.3777412643885
-2022-11-15,105.22079629790902
-2022-11-16,103.25756570255979
-2022-11-17,103.82664145275027
-2022-11-18,102.13398727315325
-2022-11-21,101.76945074987658
-2022-11-22,100.65744777478007
-2022-11-23,99.82524891823778
-2022-11-24,101.80271306762828
-2022-11-25,101.260539065177
-2022-11-28,100.90543726019479
-2022-11-29,101.44361834986908
-2022-11-30,100.36531235228831
-2022-12-01,100.19333100748393
-2022-12-02,97.9064940137259
-2022-12-05,99.90038819631981
-2022-12-06,100.95447421102924
-2022-12-07,103.85709244437051
-2022-12-08,103.21191066895716
-2022-12-09,101.43586726950477
-2022-12-12,99.44072112210885
-2022-12-13,100.23734117822376
-2022-12-14,101.45767841790767
-2022-12-15,100.49992295917573
-2022-12-16,100.05695308158286
-2022-12-19,100.06901077728814
-2022-12-20,100.8337395913798
-2022-12-21,101.50370640555676
-2022-12-22,101.86300137784885
-2022-12-23,103.1681485909314
-2022-12-26,103.55547312279205
-2022-12-27,105.40913352448729
-2022-12-28,107.22078012222266
-2022-12-29,107.06759329616685
-2022-12-30,104.93022808792396
-2023-01-02,104.14065609562833
-2023-01-03,104.24381243658816
-2023-01-04,103.08088734683565
-2023-01-05,103.76672118716613
-2023-01-06,103.53710257934705
-2023-01-09,103.93758289617854
-2023-01-10,102.59575302779385
-2023-01-11,101.46349206639087
-2023-01-12,100.61534260455855
-2023-01-13,102.84561750848485
-2023-01-16,103.28347839568619
-2023-01-17,103.94871226312878
-2023-01-18,104.04161744536509
-2023-01-19,103.11148165705524
-2023-01-20,102.71778496751247
-2023-01-23,102.03704051206302
-2023-01-24,100.47931199338637
-2023-01-25,101.8833839436347
-2023-01-26,102.12344837142302
-2023-01-27,101.0210494471518
-2023-01-30,100.57278895681985
-2023-01-31,101.21768786192291
-2023-02-01,100.8229596613104
-2023-02-02,100.97254587071451
-2023-02-03,100.99496808600968
-2023-02-06,100.86225154795339
-2023-02-07,99.97300072909465
-2023-02-08,100.10867115780803
-2023-02-09,101.881788069991
-2023-02-10,100.75729446345545
-2023-02-13,102.23837636832542
-2023-02-14,101.78023436435306
-2023-02-15,101.78899874734788
-2023-02-16,102.38319617350813
-2023-02-17,100.03590626470915
-2023-02-20,98.84031442537152
-2023-02-21,97.82232847170526
-2023-02-22,97.51503151970336
-2023-02-23,96.51549708077013
-2023-02-24,96.43393316110127
-2023-02-27,97.81930144377368
-2023-02-28,97.53372872447868
-2023-03-01,98.77838520431362
-2023-03-02,97.5717007299995
-2023-03-03,97.96329151535309
-2023-03-06,97.95423524929947
-2023-03-07,97.46488670249295
-2023-03-08,95.96566571664057
-2023-03-09,95.46733583723874
-2023-03-10,95.45687441132968
-2023-03-13,95.3805735940646
-2023-03-14,95.23258346345253
-2023-03-15,94.61522017143135
-2023-03-16,93.49354569146016
-2023-03-17,94.04073823797101
-2023-03-20,93.87251981243281
-2023-03-21,93.28905085456765
-2023-03-22,93.67145039857957
-2023-03-23,92.3795604786086
-2023-03-24,93.25749109434095
-2023-03-27,94.05827462026977
-2023-03-28,93.39365569263202
-2023-03-29,93.14853676473095
-2023-03-30,92.45126277883361
-2023-03-31,93.00677400699394
-2023-04-03,93.00977126711909
-2023-04-04,93.65670116255293
-2023-04-05,94.42473914860648
-2023-04-06,93.32586891536862
-2023-04-07,93.71340879376467
-2023-04-10,95.40622818542703
-2023-04-11,95.08466976128881
-2023-04-12,95.88159706356146
-2023-04-13,97.5074504565326
-2023-04-14,98.86499695012199
-2023-04-17,99.10854250053602
-2023-04-18,98.83783595014106
-2023-04-19,99.47638419484595
-2023-04-20,98.78010197101251
-2023-04-21,100.01145621555804
-2023-04-24,98.82169982983564
-2023-04-25,97.08123529183842
-2023-04-26,97.48606627298861
-2023-04-27,98.23941827777273
-2023-04-28,98.7779281595424
-2023-05-01,99.78506699375241
-2023-05-02,98.59055454767022
-2023-05-03,100.36079434039466
-2023-05-04,99.54832808026269
-2023-05-05,99.05503524161739
-2023-05-08,99.43519650806111
-2023-05-09,100.16578397108917
-2023-05-10,100.61912879412915
-2023-05-11,101.41570181352202
-2023-05-12,101.09917398201634
-2023-05-15,101.38978907147829
-2023-05-16,100.33451475211675
-2023-05-17,101.28990587318481
-2023-05-18,100.36146583106968
-2023-05-19,101.74959728478781
-2023-05-22,100.99877816971532
-2023-05-23,102.13036852965764
-2023-05-24,104.02949931123402
-2023-05-25,105.76936975078488
-2023-05-26,105.06517582110465
-2023-05-29,105.56114711025957
-2023-05-30,105.32576683953789
-2023-05-31,105.83546766085729
-2023-06-01,106.78559120062212
-2023-06-02,106.84508703733127
-2023-06-05,107.23419118214042
-2023-06-06,108.27026963147648
-2023-06-07,108.26489319917924
-2023-06-08,109.85805951890697
-2023-06-09,109.37168072549032
-2023-06-12,110.392238476581
-2023-06-13,111.32479618174114
-2023-06-14,110.25395332717099
-2023-06-15,108.12714693939276
-2023-06-16,108.82649635188446
-2023-06-19,108.80771969692529
-2023-06-20,110.79460695320873
-2023-06-21,112.79768252841116
-2023-06-22,112.21040905969744
-2023-06-23,112.24620715226905
-2023-06-26,112.76487688231967
-2023-06-27,111.56051589253542
-2023-06-28,110.57108581469244
-2023-06-29,111.94014726563456
-2023-06-30,114.09575074497296
-2023-07-03,116.32530036187933
-2023-07-04,118.40572273074086
-2023-07-05,118.97839121854645
-2023-07-06,121.06522318941157
-2023-07-07,120.00552313376265
-2023-07-10,120.24924103414973
-2023-07-11,119.7561997464045
-2023-07-12,120.31900462530251
-2023-07-13,119.25353362843518
-2023-07-14,119.76345279565872
-2023-07-17,120.24234781904796
-2023-07-18,120.25733140759502
-2023-07-19,120.16422516608516
-2023-07-20,120.04672759084222
-2023-07-21,119.70883722763772
-2023-07-24,119.79048942508913
-2023-07-25,119.7304419527948
-2023-07-26,121.82086582608767
-2023-07-27,122.32377393698668
-2023-07-28,124.72028382074913
-2023-07-31,125.00247099332826
-2023-08-01,126.40984231724914
-2023-08-02,126.55335969471935
-2023-08-03,126.62832754756255
-2023-08-04,125.81411033964798
-2023-08-07,125.36642969462106
-2023-08-08,126.12773696591215
-2023-08-09,127.18116073598271
-2023-08-10,126.94215985107778
-2023-08-11,126.61392487894683
-2023-08-14,127.61120941383473
-2023-08-15,127.3748262321434
-2023-08-16,127.61372708902148
-2023-08-17,128.68498900000822
-2023-08-18,125.94667734052712
-2023-08-21,125.24319075510546
-2023-08-22,126.46773905613588
-2023-08-23,127.2037779969587
-2023-08-24,128.3539627741257
-2023-08-25,128.94730019836095
-2023-08-28,132.03843904540616
-2023-08-29,132.98318699272616
-2023-08-30,133.54338226583417
-2023-08-31,129.75064856718154
-2023-09-01,129.1450277035221
-2023-09-04,129.99925223030218
-2023-09-05,131.84677511075128
-2023-09-06,130.82365478593096
-2023-09-07,129.89442839860752
-2023-09-08,128.22685514404532
-2023-09-11,127.58961169849852
-2023-09-12,126.05217569842469
-2023-09-13,125.10467792728188
-2023-09-14,125.3035824873038
-2023-09-15,124.50306139344977
-2023-09-18,124.51262006800113
-2023-09-19,125.30673101661915
-2023-09-20,124.20462721589864
-2023-09-21,124.34020299209129
-2023-09-22,123.87495890798863
-2023-09-25,122.75912317989246
-2023-09-26,124.17523017438872
-2023-09-27,124.44173232477667
-2023-09-28,122.34950811385983
-2023-09-29,121.1186723802804
-2023-10-02,122.18965986710879
-2023-10-03,122.17159606860979
-2023-10-04,122.57022372936366
-2023-10-05,123.81632940954144
-2023-10-06,124.96220363447226
-2023-10-09,124.00526878042442
-2023-10-10,122.9043994160635
-2023-10-11,123.72736064482888
-2023-10-12,124.33453981882032
-2023-10-13,123.99738955526323
-2023-10-16,126.85321051484087
-2023-10-17,125.38916740451126
-2023-10-18,126.16084204914095
-2023-10-19,126.32672761919237
-2023-10-20,126.18071616211932
-2023-10-23,126.2114853688129
-2023-10-24,129.03212497775274
-2023-10-25,129.04616018251983
-2023-10-26,126.74565887034473
-2023-10-27,124.62504241082522
-2023-10-30,124.73184114817204
-2023-10-31,126.09472379237981
+2020-01-01,99.43580221643582
+2020-01-02,100.9651267250002
+2020-01-03,101.47618581438884
+2020-01-06,101.40970154137709
+2020-01-07,101.68043817071772
+2020-01-08,100.76913361541695
+2020-01-09,100.20637401722436
+2020-01-10,99.85261881167818
+2020-01-13,101.71377134584947
+2020-01-14,103.00351325730519
+2020-01-15,103.33757964669755
+2020-01-16,103.22895658836937
+2020-01-17,104.38877831800492
+2020-01-20,105.61930775679942
+2020-01-21,105.0070722569902
+2020-01-22,103.6517193120229
+2020-01-23,101.9035923118491
+2020-01-24,102.06947592549463
+2020-01-27,102.8483663284558
+2020-01-28,104.26252142014216
+2020-01-29,105.24085154729168
+2020-01-30,105.61895221757905
+2020-01-31,106.2620847890057
+2020-02-03,108.1074270811467
+2020-02-04,109.1318940390462
+2020-02-05,109.06959873071365
+2020-02-06,110.8481558387983
+2020-02-07,109.22556045218474
+2020-02-10,109.7368109956686
+2020-02-11,110.79033316157512
+2020-02-12,110.50595899966031
+2020-02-13,111.25900364915633
+2020-02-14,110.20260700058732
+2020-02-17,111.01462783557128
+2020-02-18,111.11533321566576
+2020-02-19,111.01682639595774
+2020-02-20,109.69837253168812
+2020-02-21,110.24692985358509
+2020-02-24,112.08222160559293
+2020-02-25,111.17319245651822
+2020-02-26,110.69013060522236
+2020-02-27,112.25507242161763
+2020-02-28,112.68307997510811
+2020-03-02,113.71581643219085
+2020-03-03,113.17854572744545
+2020-03-04,113.75921983444772
+2020-03-05,113.32026252181355
+2020-03-06,112.03211147356515
+2020-03-09,112.82006669016774
+2020-03-10,112.84437806321475
+2020-03-11,114.30747876982505
+2020-03-12,112.56251325106797
+2020-03-13,111.96513168754036
+2020-03-16,110.63111762876252
+2020-03-17,109.54403310457894
+2020-03-18,109.75025608523026
+2020-03-19,110.42078550355777
+2020-03-20,108.48747422991907
+2020-03-23,106.84231787763778
+2020-03-24,108.05769872428064
+2020-03-25,108.46490121066374
+2020-03-26,109.01358029275761
+2020-03-27,108.31182966919212
+2020-03-30,109.34711795756972
+2020-03-31,109.91873287828615
+2020-04-01,108.76841353136577
+2020-04-02,108.56142029421154
+2020-04-03,108.57503373916617
+2020-04-06,109.11968623888735
+2020-04-07,109.89103052547158
+2020-04-08,111.59658406702775
+2020-04-09,111.40140859701464
+2020-04-10,110.00520614997991
+2020-04-13,108.25535297673423
+2020-04-14,106.56435545963771
+2020-04-15,106.10140494625668
+2020-04-16,106.1382004292148
+2020-04-17,105.53688799930703
+2020-04-20,107.03010116809915
+2020-04-21,106.37434182181833
+2020-04-22,105.11696511574607
+2020-04-23,106.79048037738694
+2020-04-24,107.79455229295299
+2020-04-27,108.41826089371769
+2020-04-28,108.41840213894028
+2020-04-29,107.68236006496588
+2020-04-30,108.00999183706253
+2020-05-01,109.15652176507886
+2020-05-04,108.85838951632513
+2020-05-05,107.70801695379939
+2020-05-06,107.5502371683424
+2020-05-07,107.69816892268305
+2020-05-08,108.57083826155684
+2020-05-11,109.06191573293904
+2020-05-12,109.62083517308925
+2020-05-13,109.26100654215402
+2020-05-14,109.34413929791722
+2020-05-15,111.08865718202084
+2020-05-18,111.90238322093597
+2020-05-19,109.94784560683959
+2020-05-20,110.44254338306736
+2020-05-21,110.39880823549504
+2020-05-22,110.99789507737017
+2020-05-25,111.47255781126826
+2020-05-26,112.48426532617538
+2020-05-27,112.89891169119555
+2020-05-28,111.68972646654223
+2020-05-29,112.27706364375561
+2020-06-01,111.7866990229521
+2020-06-02,112.16856155708766
+2020-06-03,113.0388760604244
+2020-06-04,114.15970321786271
+2020-06-05,114.37176554199431
+2020-06-08,113.18850716893176
+2020-06-09,114.59879342622526
+2020-06-10,114.76767954947526
+2020-06-11,115.86569808386041
+2020-06-12,115.89729328497047
+2020-06-15,117.59517612992418
+2020-06-16,118.04217570022453
+2020-06-17,116.03202007034068
+2020-06-18,116.08806278730988
+2020-06-19,113.58402678744588
+2020-06-22,112.27825027079916
+2020-06-23,113.34110288672066
+2020-06-24,113.28582131942989
+2020-06-25,113.79491938324426
+2020-06-26,115.74635558178987
+2020-06-29,114.23567729250817
+2020-06-30,112.44821338065843
+2020-07-01,113.96065677583198
+2020-07-02,113.962923126591
+2020-07-03,113.71070764449343
+2020-07-06,112.96103095682204
+2020-07-07,113.27644568205466
+2020-07-08,114.07374151560322
+2020-07-09,112.48671624045785
+2020-07-10,112.55428791936357
+2020-07-13,111.77529535945338
+2020-07-14,112.27870722155203
+2020-07-15,112.9984045711358
+2020-07-16,114.7135850993861
+2020-07-17,113.56059064372768
+2020-07-20,114.13232522188696
+2020-07-21,115.71009481869916
+2020-07-22,116.804352031123
+2020-07-23,116.51365896277713
+2020-07-24,115.02784440326543
+2020-07-27,113.8922535059496
+2020-07-28,112.37720825737492
+2020-07-29,112.02290401081866
+2020-07-30,110.8010034169848
+2020-07-31,112.37799166697957
+2020-08-03,110.7970061299043
+2020-08-04,110.32943351523272
+2020-08-05,108.47298813427295
+2020-08-06,106.87288257116631
+2020-08-07,105.80768676021788
+2020-08-10,107.26980473042657
+2020-08-11,108.6290147336622
+2020-08-12,109.22536254559019
+2020-08-13,107.15057429112711
+2020-08-14,107.90368395258356
+2020-08-17,108.0922801390854
+2020-08-18,107.68719787690983
+2020-08-19,106.25467057437086
+2020-08-20,106.14640769426633
+2020-08-21,107.68973168415421
+2020-08-24,107.83871573152607
+2020-08-25,108.13724266614551
+2020-08-26,107.85272848931058
+2020-08-27,107.0832155647563
+2020-08-28,108.96556522485842
+2020-08-31,108.61892256633577
+2020-09-01,107.76663594988969
+2020-09-02,107.33816413653514
+2020-09-03,107.25009783507382
+2020-09-04,105.63445779545569
+2020-09-07,105.99025801348603
+2020-09-08,105.02837195723261
+2020-09-09,106.25158607586384
+2020-09-10,106.69187760302962
+2020-09-11,106.92300119068557
+2020-09-14,107.8997056928989
+2020-09-15,106.4310418905338
+2020-09-16,107.55553431367784
+2020-09-17,107.4073642150363
+2020-09-18,109.13286377498117
+2020-09-21,109.58976121935923
+2020-09-22,109.48213490988275
+2020-09-23,108.69140077652644
+2020-09-24,108.64733048570723
+2020-09-25,107.76424625279111
+2020-09-28,108.15323775811498
+2020-09-29,108.79169095474224
+2020-09-30,108.5640232627655
+2020-10-01,106.65968049332571
+2020-10-02,106.78726418865061
+2020-10-05,106.55264508528558
+2020-10-06,107.45425766625118
+2020-10-07,108.54744656821794
+2020-10-08,108.42946475228617
+2020-10-09,109.40287009911592
+2020-10-12,110.6049242263
+2020-10-13,109.9937902998957
+2020-10-14,108.10275983174138
+2020-10-15,106.94811431862108
+2020-10-16,106.48783317670407
+2020-10-19,105.04515595316428
+2020-10-20,104.2742699682601
+2020-10-21,103.16512654106968
+2020-10-22,105.48721153249205
+2020-10-23,106.23925374839334
+2020-10-26,104.65590699770866
+2020-10-27,103.81610213936821
+2020-10-28,103.28060517572901
+2020-10-29,101.88105037672128
+2020-10-30,102.62115862628734
+2020-11-02,102.34520240915302
+2020-11-03,102.72819927329266
+2020-11-04,101.54044992831739
+2020-11-05,103.9453993559438
+2020-11-06,104.02596423417285
+2020-11-09,102.57520262498667
+2020-11-10,101.53317677624645
+2020-11-11,101.49004441566407
+2020-11-12,102.6739927632276
+2020-11-13,102.26528249035867
+2020-11-16,103.37469608518064
+2020-11-17,104.4205673339741
+2020-11-18,105.65830189878898
+2020-11-19,106.4827912150845
+2020-11-20,106.89018392144578
+2020-11-23,106.63316107419844
+2020-11-24,105.61362178944131
+2020-11-25,105.78465797634861
+2020-11-26,105.5478724728399
+2020-11-27,105.86670997178011
+2020-11-30,107.01639592952039
+2020-12-01,109.83295922966161
+2020-12-02,109.83359683892893
+2020-12-03,107.1155579904278
+2020-12-04,108.48422988142563
+2020-12-07,108.82721158840572
+2020-12-08,109.3377775458904
+2020-12-09,108.80747594544889
+2020-12-10,108.89641628469397
+2020-12-11,109.7780211380707
+2020-12-14,111.6540093895013
+2020-12-15,113.8867189407722
+2020-12-16,113.02113553665112
+2020-12-17,113.27605567708315
+2020-12-18,112.62755385995702
+2020-12-21,113.25566180441369
+2020-12-22,112.0195045382558
+2020-12-23,111.11786292141512
+2020-12-24,110.87161307907016
+2020-12-25,111.92844289248937
+2020-12-28,112.65211015384176
+2020-12-29,112.02155153371172
+2020-12-30,110.4021173355066
+2020-12-31,110.24875534577066
+2021-01-01,111.55698291741388
+2021-01-04,112.11099827578752
+2021-01-05,112.21469304019647
+2021-01-06,111.70898996965579
+2021-01-07,111.05589152453297
+2021-01-08,112.99107782406708
+2021-01-11,113.14432628579534
+2021-01-12,113.09121999544746
+2021-01-13,112.18628530919763
+2021-01-14,112.65873434136307
+2021-01-15,111.32218645231897
+2021-01-18,111.95270189607022
+2021-01-19,109.8389247264035
+2021-01-20,109.92757000218975
+2021-01-21,109.90657221503865
+2021-01-22,112.71750769425479
+2021-01-25,112.47899829050141
+2021-01-26,111.1730463265318
+2021-01-27,110.69078482044054
+2021-01-28,111.740333662976
+2021-01-29,112.25686492310084
+2021-02-01,112.97290434996974
+2021-02-02,112.19891035467566
+2021-02-03,112.20408583357357
+2021-02-04,113.05418914805038
+2021-02-05,115.31147396065242
+2021-02-08,117.14261041505097
+2021-02-09,118.75073387494837
+2021-02-10,119.97059520929973
+2021-02-11,119.33598531518169
+2021-02-12,119.33842238791192
+2021-02-15,119.80899498362048
+2021-02-16,120.21291198772232
+2021-02-17,119.24137001820353
+2021-02-18,117.71221954914728
+2021-02-19,117.06056274928764
+2021-02-22,115.34310483477736
+2021-02-23,117.58465250237356
+2021-02-24,116.83625647253942
+2021-02-25,116.31422686898986
+2021-02-26,115.99985398705333
+2021-03-01,116.39283322440295
+2021-03-02,116.14198011825607
+2021-03-03,114.89445660946463
+2021-03-04,113.91032422291222
+2021-03-05,114.47291435059232
+2021-03-08,115.04257789701053
+2021-03-09,115.28665481083875
+2021-03-10,114.0094187065952
+2021-03-11,114.00049971766694
+2021-03-12,113.16333885485412
+2021-03-15,113.64283037975981
+2021-03-16,114.00045494178141
+2021-03-17,114.17709906044959
+2021-03-18,113.4310215155243
+2021-03-19,113.62486997778254
+2021-03-22,112.45477166883045
+2021-03-23,111.3838720209376
+2021-03-24,111.01322351845022
+2021-03-25,111.00939619097392
+2021-03-26,111.8120212147527
+2021-03-29,111.62440230213564
+2021-03-30,110.37373856994206
+2021-03-31,111.94477267944394
+2021-04-01,111.67210601527873
+2021-04-02,112.61305079961346
+2021-04-05,112.66894897310173
+2021-04-06,111.24071042608527
+2021-04-07,112.56370264476223
+2021-04-08,114.91026248723651
+2021-04-09,114.47530130216555
+2021-04-12,114.22313517763867
+2021-04-13,116.96905436533176
+2021-04-14,116.36930975670481
+2021-04-15,114.7788158849487
+2021-04-16,112.45210019758262
+2021-04-19,112.82910498254854
+2021-04-20,113.59976131561828
+2021-04-21,113.48246758229968
+2021-04-22,111.84582185307185
+2021-04-23,110.09964883420619
+2021-04-26,109.93033900994162
+2021-04-27,109.53716068636264
+2021-04-28,109.53275232320064
+2021-04-29,108.96941749564763
+2021-04-30,109.53937938382832
+2021-05-03,110.57486090892088
+2021-05-04,109.05775579404727
+2021-05-05,109.3735774681303
+2021-05-06,107.26457722946235
+2021-05-07,107.70564544645298
+2021-05-10,107.85848530733884
+2021-05-11,108.0004384143622
+2021-05-12,108.26859268200305
+2021-05-13,106.67686195523854
+2021-05-14,105.49751881500804
+2021-05-17,107.08166624731228
+2021-05-18,106.49094562639894
+2021-05-19,104.54290084618822
+2021-05-20,106.300791434971
+2021-05-21,108.27595402944907
+2021-05-24,109.15372038326949
+2021-05-25,110.18772267492136
+2021-05-26,110.63871310810087
+2021-05-27,110.95652901010713
+2021-05-28,109.78417455749685
+2021-05-31,108.4782440028188
+2021-06-01,109.40624410672118
+2021-06-02,110.10782228572889
+2021-06-03,111.44800131707278
+2021-06-04,112.18940233327245
+2021-06-07,112.67018032544004
+2021-06-08,112.07624749951353
+2021-06-09,110.62490091235706
+2021-06-10,111.13265846895048
+2021-06-11,111.3929639453091
+2021-06-14,110.6381324141479
+2021-06-15,109.45504024178206
+2021-06-16,108.80580084222709
+2021-06-17,108.7854847791565
+2021-06-18,109.00825911467142
+2021-06-21,107.44451262611778
+2021-06-22,107.64858191727407
+2021-06-23,104.88021261302538
+2021-06-24,106.81318973244305
+2021-06-25,106.56121391325395
+2021-06-28,108.38484335568917
+2021-06-29,107.09253999454265
+2021-06-30,107.27632182135052
+2021-07-01,107.71610751775349
+2021-07-02,106.76482271266788
+2021-07-05,107.01187708537687
+2021-07-06,106.4457845493731
+2021-07-07,107.85844618640157
+2021-07-08,107.27530324149485
+2021-07-09,106.82912976329091
+2021-07-12,106.88263101324765
+2021-07-13,106.71591818796958
+2021-07-14,108.4115967590868
+2021-07-15,108.60615839870185
+2021-07-16,109.95575169695475
+2021-07-19,110.50671471613268
+2021-07-20,110.01640573244575
+2021-07-21,110.49557869952231
+2021-07-22,109.71950117970239
+2021-07-23,110.00205171450695
+2021-07-26,110.97913201018154
+2021-07-27,111.77530137649043
+2021-07-28,111.87950302732173
+2021-07-29,116.55162934947975
+2021-07-30,117.45334500784858
+2021-08-02,117.05227423597174
+2021-08-03,117.85539494177848
+2021-08-04,120.11996716942733
+2021-08-05,119.27084225050906
+2021-08-06,120.93990434254371
+2021-08-09,123.37713689565655
+2021-08-10,124.42964398526404
+2021-08-11,124.41172371189504
+2021-08-12,127.13257134687157
+2021-08-13,128.7958670441943
+2021-08-16,129.243561902145
+2021-08-17,130.314568048835
+2021-08-18,130.30692717835814
+2021-08-19,130.69018505906976
+2021-08-20,132.78453105863207
+2021-08-23,133.53440858527335
+2021-08-24,131.34975210977385
+2021-08-25,131.1176931888569
+2021-08-26,130.17493206600352
+2021-08-27,130.89519170439863
+2021-08-30,131.42630872248228
+2021-08-31,131.56771000848107
+2021-09-01,130.9179764122107
+2021-09-02,129.8517846795634
+2021-09-03,130.4460434881794
+2021-09-06,129.0320080994763
+2021-09-07,130.5589204649636
+2021-09-08,130.71681292042388
+2021-09-09,130.27376241393816
+2021-09-10,129.2423075454972
+2021-09-13,128.18654187246847
+2021-09-14,127.10758756715033
+2021-09-15,127.4665482486969
+2021-09-16,126.79166558576891
+2021-09-17,129.39058635411632
+2021-09-20,128.23769787400946
+2021-09-21,129.7395113249166
+2021-09-22,129.6042088263965
+2021-09-23,127.65433652783338
+2021-09-24,128.47536500112628
+2021-09-27,128.74445511020804
+2021-09-28,129.9904741028447
+2021-09-29,131.21267279154895
+2021-09-30,133.2122868513819
+2021-10-01,133.2518055229709
+2021-10-04,133.9212964012735
+2021-10-05,133.98650520346098
+2021-10-06,135.3928927365497
+2021-10-07,138.27886923527132
+2021-10-08,137.73371581342596
+2021-10-11,137.88175215634504
+2021-10-12,139.72305688531213
+2021-10-13,139.3376575539446
+2021-10-14,139.66745930332883
+2021-10-15,140.64236799369547
+2021-10-18,142.86308490060298
+2021-10-19,144.8225709650348
+2021-10-20,146.19698759289906
+2021-10-21,148.73051182297706
+2021-10-22,147.13370997805652
+2021-10-25,145.31995815652186
+2021-10-26,143.70572750971567
+2021-10-27,144.2904217850907
+2021-10-28,143.5624971194626
+2021-10-29,141.48939660309537
+2021-11-01,141.8292760761498
+2021-11-02,140.26657284870538
+2021-11-03,139.0405577830699
+2021-11-04,137.83263139000687
+2021-11-05,136.68074053796536
+2021-11-08,134.67820244424445
+2021-11-09,136.01997470082424
+2021-11-10,136.03168164983353
+2021-11-11,134.3072934602167
+2021-11-12,136.33708527853153
+2021-11-15,137.67165339614854
+2021-11-16,138.1011740610324
+2021-11-17,140.0821501246444
+2021-11-18,140.01946008570454
+2021-11-19,138.6686656126261
+2021-11-22,139.12977261948808
+2021-11-23,138.65862565170715
+2021-11-24,137.34777714352714
+2021-11-25,137.6827265476837
+2021-11-26,138.8374887884231
+2021-11-29,140.07625230856448
+2021-11-30,141.64885879424276
+2021-12-01,140.13392774336606
+2021-12-02,142.14247390644599
+2021-12-03,142.12049041900332
+2021-12-06,143.5022856757484
+2021-12-07,144.44429583647965
+2021-12-08,143.77029514207365
+2021-12-09,143.2690102167239
+2021-12-10,145.06866566838747
+2021-12-13,146.62988025591144
+2021-12-14,147.95991285009094
+2021-12-15,149.74143520031055
+2021-12-16,151.08858499668625
+2021-12-17,150.4270874570294
+2021-12-20,151.34835155582863
+2021-12-21,151.81428959866443
+2021-12-22,153.7786716261007
+2021-12-23,153.65163790076963
+2021-12-24,154.75245304237853
+2021-12-27,154.9515474491684
+2021-12-28,159.8549170922545
+2021-12-29,159.2007464469846
+2021-12-30,161.1200899155655
+2021-12-31,158.99211792655052
+2022-01-03,158.81592136987916
+2022-01-04,158.11621191829818
+2022-01-05,156.38229707337658
+2022-01-06,158.86551424755498
+2022-01-07,160.19950727978824
+2022-01-10,157.28432062701538
+2022-01-11,159.6083284257281
+2022-01-12,159.59819939777105
+2022-01-13,159.3746738378807
+2022-01-14,160.64615632074114
+2022-01-17,161.37935328011739
+2022-01-18,165.31151685621435
+2022-01-19,165.84965437995552
+2022-01-20,164.14786563562015
+2022-01-21,163.3103787261028
+2022-01-24,165.2672995312545
+2022-01-25,166.35742325062137
+2022-01-26,164.99943906937028
+2022-01-27,167.83231635309664
+2022-01-28,167.84043759747897
+2022-01-31,169.2909919904233
+2022-02-01,173.0362612303292
+2022-02-02,174.32071958423472
+2022-02-03,173.34117863355226
+2022-02-04,173.85056826633138
+2022-02-07,173.96180569473188
+2022-02-08,175.94626257551414
+2022-02-09,175.72751051112118
+2022-02-10,177.72156459252196
+2022-02-11,179.48912531096113
+2022-02-14,182.45011698381361
+2022-02-15,184.10263294573227
+2022-02-16,182.06835610781187
+2022-02-17,182.9754413201202
+2022-02-18,184.00837886978516
+2022-02-21,181.95737477122867
+2022-02-22,183.43003274749267
+2022-02-23,184.63504273348735
+2022-02-24,186.76242773214312
+2022-02-25,187.15916674670675
+2022-02-28,186.8080005755995
+2022-03-01,185.39214669477138
+2022-03-02,185.31917197236584
+2022-03-03,188.08622316729543
+2022-03-04,186.67033015661386
+2022-03-07,185.53705481486102
+2022-03-08,183.21144722096244
+2022-03-09,186.1417944296348
+2022-03-10,185.81301058385327
+2022-03-11,184.24074125656801
+2022-03-14,183.9229673664176
+2022-03-15,184.43616404142233
+2022-03-16,183.79739764900205
+2022-03-17,182.46987104539326
+2022-03-18,183.9489588511815
+2022-03-21,183.8845624902127
+2022-03-22,184.16310619887147
+2022-03-23,183.62958885901327
+2022-03-24,180.93198866075522
+2022-03-25,183.16221074653217
+2022-03-28,183.12814012060423
+2022-03-29,184.12756949048182
+2022-03-30,182.830284670905
+2022-03-31,181.0475648799499
+2022-04-01,179.0985721974346
+2022-04-04,179.4762445538653
+2022-04-05,182.05725458900338
+2022-04-06,183.69428514809778
+2022-04-07,185.43545976381952
+2022-04-08,186.31415821495116
+2022-04-11,186.349598977634
+2022-04-12,184.6951866057011
+2022-04-13,184.9112224580043
+2022-04-14,186.85720071514308
+2022-04-15,186.5150636274145
+2022-04-18,184.0013671688719
+2022-04-19,183.22119140891155
+2022-04-20,180.89168022941516
+2022-04-21,181.49778760000828
+2022-04-22,183.51413057252051
+2022-04-25,183.56084798874787
+2022-04-26,181.56200149904475
+2022-04-27,181.96541417158653
+2022-04-28,180.61106280843848
+2022-04-29,179.8050174260012
+2022-05-02,178.17842407204353
+2022-05-03,176.3530719056853
+2022-05-04,179.38379146454741
+2022-05-05,179.0038512692933
+2022-05-06,178.31455055897578
+2022-05-09,179.30810193029086
+2022-05-10,178.36921694847953
+2022-05-11,180.83385388040523
+2022-05-12,180.23708917299183
+2022-05-13,180.7340599928502
+2022-05-16,181.56786413326586
+2022-05-17,177.35540133164906
+2022-05-18,174.87105963479013
+2022-05-19,174.90906792094364
+2022-05-20,173.74643847462914
+2022-05-23,172.88714199626858
+2022-05-24,174.5664369991185
+2022-05-25,174.6928178065059
+2022-05-26,174.05066162384247
+2022-05-27,174.2116679325527
+2022-05-30,176.37889054283085
+2022-05-31,176.47856868570588
+2022-06-01,174.09229238082372
+2022-06-02,172.40012324155524
+2022-06-03,174.50565113850527
+2022-06-06,174.366094057243
+2022-06-07,174.49210217163363
+2022-06-08,174.90038874549148
+2022-06-09,173.9236029518884
+2022-06-10,173.05774071050277
+2022-06-13,173.09068689819102
+2022-06-14,172.07364223925927
+2022-06-15,173.784451218063
+2022-06-16,175.15653004360462
+2022-06-17,174.9698412771693
+2022-06-20,174.3686476460181
+2022-06-21,175.0226464692796
+2022-06-22,176.79215747894534
+2022-06-23,175.4311580647934
+2022-06-24,171.79995980405977
+2022-06-27,171.45915511728157
+2022-06-28,172.64690714409667
+2022-06-29,173.53854563500676
+2022-06-30,172.60981102336527
+2022-07-01,174.14763456896873
+2022-07-04,173.64910010627236
+2022-07-05,175.41015228773728
+2022-07-06,177.39399191817654
+2022-07-07,175.83519716160004
+2022-07-08,176.5996329036696
+2022-07-11,178.66313731575636
+2022-07-12,175.4721169640538
+2022-07-13,173.34529344223154
+2022-07-14,176.1434925362978
+2022-07-15,176.09295654485638
+2022-07-18,177.9578953976064
+2022-07-19,180.34166457631486
+2022-07-20,180.52263434757566
+2022-07-21,182.45894689934755
+2022-07-22,179.95826622515435
+2022-07-25,179.80881211698275
+2022-07-26,181.2910718479497
+2022-07-27,182.378695977059
+2022-07-28,180.84344329595197
+2022-07-29,179.0400365941173
+2022-08-01,182.5058884293554
+2022-08-02,184.03424724305236
+2022-08-03,183.38969089840745
+2022-08-04,182.61277134606993
+2022-08-05,179.40753996211657
+2022-08-08,180.52094189084272
+2022-08-09,179.42182098973754
+2022-08-10,177.66694936100592
+2022-08-11,175.6931955615347
+2022-08-12,177.8507455830907
+2022-08-15,184.1859121957383
+2022-08-16,183.86127363269907
+2022-08-17,185.02694195228707
+2022-08-18,185.97467354970206
+2022-08-19,183.97069473336333
+2022-08-22,183.24960740109978
+2022-08-23,184.70816477316203
+2022-08-24,183.69216485239534
+2022-08-25,183.7320791915035
+2022-08-26,183.60803023985468
+2022-08-29,183.7033854224083
+2022-08-30,184.7211364433535
+2022-08-31,184.50539162349799
+2022-09-01,184.99582132566803
+2022-09-02,184.97130992332012
+2022-09-05,187.10419154971632
+2022-09-06,189.03232079906977
+2022-09-07,190.6272160451858
+2022-09-08,188.61621773872483
+2022-09-09,189.20727342066888
+2022-09-12,188.9445968133091
+2022-09-13,190.81195875240917
+2022-09-14,193.17920295608212
+2022-09-15,192.78385659650397
+2022-09-16,194.60037529329378
+2022-09-19,192.65429456712272
+2022-09-20,192.22330222309907
+2022-09-21,192.20061513938995
+2022-09-22,193.13041030614298
+2022-09-23,188.5256509096753
+2022-09-26,188.8850606986893
+2022-09-27,187.3738802677684
+2022-09-28,186.1395354554199
+2022-09-29,186.85527763157418
+2022-09-30,189.10419957521412
+2022-10-03,191.0269793991275
+2022-10-04,189.1331492012651
+2022-10-05,191.04670158604046
+2022-10-06,190.56348417020038
+2022-10-07,189.6732851002448
+2022-10-10,191.55888078817955
+2022-10-11,190.99318748349734
+2022-10-12,193.98002901494834
+2022-10-13,194.72171657802693
+2022-10-14,195.178714086525
+2022-10-17,193.81816193113087
+2022-10-18,196.1790187955128
+2022-10-19,199.78893038035324
+2022-10-20,198.46918763798556
+2022-10-21,195.67856673311104
+2022-10-24,196.9528197515824
+2022-10-25,194.11150733864554
+2022-10-26,189.21022809575342
+2022-10-27,187.3841744467867
+2022-10-28,184.6848559238856
+2022-10-31,183.6859297254932
+2022-11-01,187.20185044905156
+2022-11-02,190.06719489595858
+2022-11-03,188.67288825335592
+2022-11-04,186.58428353745188
+2022-11-07,187.1708341682027
+2022-11-08,185.03707527418004
+2022-11-09,186.65641644148653
+2022-11-10,187.94059518931388
+2022-11-11,188.8657212111467
+2022-11-14,187.9141596525209
+2022-11-15,186.59760171883298
+2022-11-16,186.33184829862
+2022-11-17,185.20206017936923
+2022-11-18,187.10391675587033
+2022-11-21,191.38578062421303
+2022-11-22,191.98484721969515
+2022-11-23,192.8369047649446
+2022-11-24,192.7841076975567
+2022-11-25,191.82755410191814
+2022-11-28,191.3776806281394
+2022-11-29,191.90821058066808
+2022-11-30,189.43143267985812
+2022-12-01,187.67609302599112
+2022-12-02,185.08797754125206
+2022-12-05,183.61848411539103
+2022-12-06,181.91965480460536
+2022-12-07,181.15791758064142
+2022-12-08,180.9360107168567
+2022-12-09,183.44984063523944
+2022-12-12,184.22790807444798
+2022-12-13,184.68321353898867
+2022-12-14,182.6441778787343
+2022-12-15,181.41502029424456
+2022-12-16,179.35285583592298
+2022-12-19,181.49020026746882
+2022-12-20,181.01809304808353
+2022-12-21,180.90349572222635
+2022-12-22,181.0765910747008
+2022-12-23,181.28118957564126
+2022-12-26,184.07188249813314
+2022-12-27,184.73712745236998
+2022-12-28,185.64726367624743
+2022-12-29,187.4738980891586
+2022-12-30,185.60928614554504
+2023-01-02,186.09872819273735
+2023-01-03,186.59338769818044
+2023-01-04,185.20247736286356
+2023-01-05,185.99851113750842
+2023-01-06,187.36920933380065
+2023-01-09,186.38500391952104
+2023-01-10,188.24015064747533
+2023-01-11,189.49906153256492
+2023-01-12,193.51915839364443
+2023-01-13,192.51803619100002
+2023-01-16,193.37519920944985
+2023-01-17,190.62328201432342
+2023-01-18,187.0995208599165
+2023-01-19,190.65133235148573
+2023-01-20,189.78444462385363
+2023-01-23,191.4725053543529
+2023-01-24,190.90369910024796
+2023-01-25,191.1236545235688
+2023-01-26,186.2802727194917
+2023-01-27,186.63667832264045
+2023-01-30,186.10932823737494
+2023-01-31,185.51561122454322
+2023-02-01,183.685578927406
+2023-02-02,181.3722193638272
+2023-02-03,183.59299115728209
+2023-02-06,183.29349235298292
+2023-02-07,180.58374220576752
+2023-02-08,180.74373792259436
+2023-02-09,183.51997975371714
+2023-02-10,182.9198960423718
+2023-02-13,180.65871004965194
+2023-02-14,181.78026515743096
+2023-02-15,182.1023329014378
+2023-02-16,182.0191599162744
+2023-02-17,183.60361311627068
+2023-02-20,183.1867265918316
+2023-02-21,184.14910209288558
+2023-02-22,184.75306693537138
+2023-02-23,187.11550249796431
+2023-02-24,184.77654438770332
+2023-02-27,182.51478408673626
+2023-02-28,183.78438960636677
+2023-03-01,181.75561194065034
+2023-03-02,177.6806898937575
+2023-03-03,177.3419319160619
+2023-03-06,175.04303128348488
+2023-03-07,172.75063205544774
+2023-03-08,175.44086129908587
+2023-03-09,177.0679533676764
+2023-03-10,174.2087032138339
+2023-03-13,175.6308924954282
+2023-03-14,177.12986072644125
+2023-03-15,176.97368831631985
+2023-03-16,174.88543070517892
+2023-03-17,174.66399283237416
+2023-03-20,173.04506203907368
+2023-03-21,173.56979344167723
+2023-03-22,171.83650540886987
+2023-03-23,170.93622221433546
+2023-03-24,171.38490933760713
+2023-03-27,171.54599601503662
+2023-03-28,171.49217127609975
+2023-03-29,172.5256006647191
+2023-03-30,173.4793671129438
+2023-03-31,174.81869024884065
+2023-04-03,175.8735744574504
+2023-04-04,176.66952752652503
+2023-04-05,172.2934611229302
+2023-04-06,172.3394748941266
+2023-04-07,172.70275212508918
+2023-04-10,175.99892968716037
+2023-04-11,176.22469911241808
+2023-04-12,173.6605081265277
+2023-04-13,174.289768301988
+2023-04-14,178.02777084414623
+2023-04-17,177.48990340871725
+2023-04-18,176.3843740413107
+2023-04-19,175.7308283170942
+2023-04-20,176.35407950553414
+2023-04-21,175.24457570255464
+2023-04-24,171.91189844925566
+2023-04-25,170.7119665517016
+2023-04-26,170.15896105736294
+2023-04-27,170.81728367092293
+2023-04-28,174.6471191812896
+2023-05-01,172.0404090265938
+2023-05-02,173.2373382774029
+2023-05-03,173.17347604724432
+2023-05-04,173.54076607348253
+2023-05-05,172.94776771203163
+2023-05-08,172.03274633055622
+2023-05-09,172.28222135727924
+2023-05-10,170.8424219898911
+2023-05-11,172.55978778180017
+2023-05-12,174.48686090075483
+2023-05-15,175.23930199352804
+2023-05-16,173.84837044049394
+2023-05-17,175.39846525804884
+2023-05-18,176.4328057920585
+2023-05-19,175.63857022334636
+2023-05-22,175.54075505996798
+2023-05-23,178.74495261482184
+2023-05-24,175.929344242635
+2023-05-25,181.17154485143277
+2023-05-26,177.85657554690445
+2023-05-29,178.73008865810465
+2023-05-30,178.02036723993183
+2023-05-31,178.09622703227
+2023-06-01,176.69880166989947
+2023-06-02,179.4142601410467
+2023-06-05,184.95091577335958
+2023-06-06,184.3853459138249
+2023-06-07,186.68842120529558
+2023-06-08,188.41187344720126
+2023-06-09,188.71085034483028
+2023-06-12,191.76170495041674
+2023-06-13,188.08858340531293
+2023-06-14,188.02709423638
+2023-06-15,186.35054878487927
+2023-06-16,186.04348214524245
+2023-06-19,184.36222863855448
+2023-06-20,184.46918689583623
+2023-06-21,185.06567181273883
+2023-06-22,181.99420495375193
+2023-06-23,183.66798376800165
+2023-06-26,186.30226086350095
+2023-06-27,188.8078925538689
+2023-06-28,189.61097779265913
+2023-06-29,190.70761726530182
+2023-06-30,189.9505789987774
+2023-07-03,190.18680276788743
+2023-07-04,189.25160492480052
+2023-07-05,189.90480166860257
+2023-07-06,188.07957779523696
+2023-07-07,186.48046141913733
+2023-07-10,186.37435506682962
+2023-07-11,186.89855422732649
+2023-07-12,184.51980273198956
+2023-07-13,184.5390410967608
+2023-07-14,184.16137990339564
+2023-07-17,185.08088970767486
+2023-07-18,187.30122261092268
+2023-07-19,186.41035992506934
+2023-07-20,184.2043663642878
+2023-07-21,180.76985396530773
+2023-07-24,181.11643258658245
+2023-07-25,183.43402676331198
+2023-07-26,183.76535021363975
+2023-07-27,182.65142576574974
+2023-07-28,184.3735122284462
+2023-07-31,185.46080587893164
+2023-08-01,185.6612723684105
+2023-08-02,185.7287728519883
+2023-08-03,184.0683640292839
+2023-08-04,184.42982670735412
+2023-08-07,186.01565085510006
+2023-08-08,184.11037468747696
+2023-08-09,186.88298163317174
+2023-08-10,186.46436343191166
+2023-08-11,189.5963155253309
+2023-08-14,191.55852305836615
+2023-08-15,186.3016063745689
+2023-08-16,190.90796758094498
+2023-08-17,189.14663512008775
+2023-08-18,190.34758440345828
+2023-08-21,191.51095724875836
+2023-08-22,189.7519553350147
+2023-08-23,190.09222947282876
+2023-08-24,192.46349522272084
+2023-08-25,193.1642463655746
+2023-08-28,190.12987942133208
+2023-08-29,190.0994584388733
+2023-08-30,187.91993444992517
+2023-08-31,187.90223482783756
+2023-09-01,188.2623208518311
+2023-09-04,188.0983797608217
+2023-09-05,184.339278249868
+2023-09-06,187.74644524845627
+2023-09-07,185.218991153022
+2023-09-08,189.17515381417493
+2023-09-11,188.94134617757138
+2023-09-12,188.77895266612848
+2023-09-13,186.05452249244848
+2023-09-14,186.71908106569126
+2023-09-15,180.25524900550784
+2023-09-18,180.6349812493157
+2023-09-19,180.1298300795995
+2023-09-20,180.52779292472934
+2023-09-21,179.11256730446442
+2023-09-22,173.6585149140688
+2023-09-25,172.14267167272254
+2023-09-26,173.21180691946253
+2023-09-27,172.80526816693447
+2023-09-28,173.1333447679249
+2023-09-29,173.32145007386768
+2023-10-02,175.8738348116072
+2023-10-03,176.26424674293054
+2023-10-04,177.80887601666402
+2023-10-05,178.9524581096299
+2023-10-06,180.80089768811322
+2023-10-09,181.26206745455445
+2023-10-10,179.02339137141374
+2023-10-11,181.23078735971703
+2023-10-12,178.2730202636627
+2023-10-13,177.70873598843266
+2023-10-16,179.95324850796487
+2023-10-17,181.5908215617823
+2023-10-18,182.30521846449918
+2023-10-19,183.46018507602122
+2023-10-20,184.31559234082957
+2023-10-23,185.14459091336803
+2023-10-24,187.5086172270963
+2023-10-25,186.9369894183306
+2023-10-26,189.50764942400474
+2023-10-27,186.66447742061771
+2023-10-30,186.25129798947611
+2023-10-31,187.90408659491803
diff --git a/test.py b/test.py
index f47bb8e..66e93e9 100644
--- a/test.py
+++ b/test.py
@@ -5,7 +5,6 @@
from rich import print
-
if __name__ == "__main__":
# Create more realistic market data
dates = pd.date_range(start="2020-01-01", periods=1000, freq="B")
@@ -38,12 +37,13 @@
results = engine.get_results()
metrics = results.get('metrics', {})
- print("\nKey Performance Metrics:")
- important_metrics = [
- 'total_return', 'annualized_return', 'annualized_volatility',
- 'sharpe_ratio', 'max_drawdown', 'calmar_ratio'
- ]
-
- for metric in important_metrics:
- if metric in metrics:
- print(f"{metric}: {metrics[metric]:.4f}")
\ No newline at end of file
+ print("Available metrics:", metrics.keys())
+
+ plots = results.get('plots', {})
+ print("Available plots:", plots.keys())
+
+ # Generate the dashboard
+ dashboard_path = engine.generate_dashboard()
+
+ print(f"Dashboard generated at: {dashboard_path}")
+ print("Open this file in a web browser to view your dashboard.")
\ No newline at end of file
From cc9795cd8ea0e0f14417491f24cc3fb10432362d Mon Sep 17 00:00:00 2001
From: BonelessWater
Date: Mon, 5 May 2025 17:40:02 -0400
Subject: [PATCH 06/54] dashboard created dynamically from components
---
algosystem/backtesting/dashboard/__init__.py | 0
.../dashboard/components/__init__.py | 0
.../dashboard/components/chart_components.py | 0
.../dashboard/components/metric_components.py | 0
.../dashboard/dashboard_generator.py | 100 +
.../dashboard/static/css/dashboard.css | 223 +
.../dashboard/static/html/dashboard.html} | 0
.../static/images/logo_transparent.png | Bin
.../dashboard/static/js/chart_factory.js | 157 +
.../dashboard/static/js/dashboard.js | 211 +
.../dashboard/static/js/metric_factory.js | 60 +
.../dashboard/template/base_template.py | 194 +
.../dashboard/template/chart_templates.py | 145 +
.../dashboard/template/metric_templates.py | 167 +
.../backtesting/dashboard/utils/__init__.py | 0
.../dashboard/utils/config_parser.py | 199 +
.../dashboard/utils/data_formatter.py | 345 +
algosystem/backtesting/engine.py | 872 +-
.../backtesting/utils/graph_config.json | 102 +
algosystem/static/css/styles.css | 184 -
algosystem/static/js/script.js | 647 -
algosystem/utils/graph_config.json | 136 +-
benchmark.csv | 2000 +-
dashboard/css/dashboard.css | 223 +
dashboard/dashboard.html | 650 +-
dashboard/dashboard_data.json | 22415 +++++-----------
dashboard/js/chart_factory.js | 157 +
dashboard/js/dashboard.js | 211 +
dashboard/js/metric_factory.js | 60 +
strategy.csv | 2000 +-
system-architecture.mermaid | 44 +
31 files changed, 11006 insertions(+), 20496 deletions(-)
create mode 100644 algosystem/backtesting/dashboard/__init__.py
create mode 100644 algosystem/backtesting/dashboard/components/__init__.py
create mode 100644 algosystem/backtesting/dashboard/components/chart_components.py
create mode 100644 algosystem/backtesting/dashboard/components/metric_components.py
create mode 100644 algosystem/backtesting/dashboard/dashboard_generator.py
create mode 100644 algosystem/backtesting/dashboard/static/css/dashboard.css
rename algosystem/{static/html/index.html => backtesting/dashboard/static/html/dashboard.html} (100%)
rename algosystem/{ => backtesting/dashboard}/static/images/logo_transparent.png (100%)
create mode 100644 algosystem/backtesting/dashboard/static/js/chart_factory.js
create mode 100644 algosystem/backtesting/dashboard/static/js/dashboard.js
create mode 100644 algosystem/backtesting/dashboard/static/js/metric_factory.js
create mode 100644 algosystem/backtesting/dashboard/template/base_template.py
create mode 100644 algosystem/backtesting/dashboard/template/chart_templates.py
create mode 100644 algosystem/backtesting/dashboard/template/metric_templates.py
create mode 100644 algosystem/backtesting/dashboard/utils/__init__.py
create mode 100644 algosystem/backtesting/dashboard/utils/config_parser.py
create mode 100644 algosystem/backtesting/dashboard/utils/data_formatter.py
create mode 100644 algosystem/backtesting/utils/graph_config.json
delete mode 100644 algosystem/static/css/styles.css
delete mode 100644 algosystem/static/js/script.js
create mode 100644 dashboard/css/dashboard.css
create mode 100644 dashboard/js/chart_factory.js
create mode 100644 dashboard/js/dashboard.js
create mode 100644 dashboard/js/metric_factory.js
create mode 100644 system-architecture.mermaid
diff --git a/algosystem/backtesting/dashboard/__init__.py b/algosystem/backtesting/dashboard/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/algosystem/backtesting/dashboard/components/__init__.py b/algosystem/backtesting/dashboard/components/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/algosystem/backtesting/dashboard/components/chart_components.py b/algosystem/backtesting/dashboard/components/chart_components.py
new file mode 100644
index 0000000..e69de29
diff --git a/algosystem/backtesting/dashboard/components/metric_components.py b/algosystem/backtesting/dashboard/components/metric_components.py
new file mode 100644
index 0000000..e69de29
diff --git a/algosystem/backtesting/dashboard/dashboard_generator.py b/algosystem/backtesting/dashboard/dashboard_generator.py
new file mode 100644
index 0000000..efa89a8
--- /dev/null
+++ b/algosystem/backtesting/dashboard/dashboard_generator.py
@@ -0,0 +1,100 @@
+import os
+import json
+import webbrowser
+import shutil
+
+from .template.base_template import generate_html
+from .utils.data_formatter import prepare_dashboard_data
+from .utils.config_parser import validate_config
+
+
+def generate_dashboard(engine, output_dir=None, open_browser=True, config_path=None):
+ """
+ Generate an HTML dashboard for the backtest results based on graph_config.json
+
+ Parameters:
+ -----------
+ engine : Engine
+ Backtesting engine with results
+ output_dir : str, optional
+ Directory where dashboard files will be saved. Defaults to ./dashboard/
+ open_browser : bool, optional
+ Whether to automatically open the dashboard in browser. Defaults to True
+ config_path : str, optional
+ Path to the graph configuration file. Defaults to utils/graph_config.json
+
+ Returns:
+ --------
+ dashboard_path : str
+ Path to the generated dashboard HTML file
+ """
+ # Check if backtest results are available
+ if engine.results is None:
+ raise ValueError("No backtest results available. Run the backtest first.")
+
+ # Set default output directory
+ if output_dir is None:
+ output_dir = os.path.join(os.getcwd(), "dashboard")
+
+ # Create output directory if it doesn't exist
+ os.makedirs(output_dir, exist_ok=True)
+
+ # Load graph configuration
+ if config_path is None:
+ config_path = os.path.join(os.path.dirname(os.path.dirname(__file__)),
+ "utils", "graph_config.json")
+
+ with open(config_path, 'r') as f:
+ config = json.load(f)
+
+ # Validate configuration
+ validate_config(config)
+
+ # Prepare data for the dashboard
+ dashboard_data = prepare_dashboard_data(engine, config)
+
+ # Generate HTML content
+ html_content = generate_html(engine, config, dashboard_data)
+
+ # Write HTML file
+ dashboard_path = os.path.join(output_dir, 'dashboard.html')
+ with open(dashboard_path, 'w') as f:
+ f.write(html_content)
+
+ # Write data file
+ data_path = os.path.join(output_dir, 'dashboard_data.json')
+ with open(data_path, 'w') as f:
+ json.dump(dashboard_data, f, indent=2)
+
+ # Copy static files
+ static_dir = os.path.join(os.path.dirname(__file__), 'static')
+
+ # Create js directory
+ js_dir = os.path.join(output_dir, 'js')
+ os.makedirs(js_dir, exist_ok=True)
+
+ # Copy main JS file
+ main_js_path = os.path.join(static_dir, 'js', 'dashboard.js')
+ shutil.copy(main_js_path, js_dir)
+
+ # Copy chart factory JS file
+ chart_factory_js_path = os.path.join(static_dir, 'js', 'chart_factory.js')
+ shutil.copy(chart_factory_js_path, js_dir)
+
+ # Copy metric factory JS file
+ metric_factory_js_path = os.path.join(static_dir, 'js', 'metric_factory.js')
+ shutil.copy(metric_factory_js_path, js_dir)
+
+ # Create css directory
+ css_dir = os.path.join(output_dir, 'css')
+ os.makedirs(css_dir, exist_ok=True)
+
+ # Copy CSS file
+ css_path = os.path.join(static_dir, 'css', 'dashboard.css')
+ shutil.copy(css_path, css_dir)
+
+ # Open in browser if requested
+ if open_browser:
+ webbrowser.open('file://' + os.path.abspath(dashboard_path))
+
+ return dashboard_path
\ No newline at end of file
diff --git a/algosystem/backtesting/dashboard/static/css/dashboard.css b/algosystem/backtesting/dashboard/static/css/dashboard.css
new file mode 100644
index 0000000..4cf08da
--- /dev/null
+++ b/algosystem/backtesting/dashboard/static/css/dashboard.css
@@ -0,0 +1,223 @@
+/**
+ * Dashboard Styling
+ */
+
+/* Reset and base styles */
+* {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+body {
+ font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
+ background-color: #f5f7fa;
+ color: #333;
+ line-height: 1.6;
+}
+
+/* Container */
+.dashboard-container {
+ max-width: 1200px;
+ margin: 0 auto;
+ padding: 20px;
+}
+
+/* Header styles */
+.dashboard-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ padding: 20px;
+ background-color: #2c3e50;
+ color: white;
+ border-radius: 8px;
+ margin-bottom: 20px;
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
+}
+
+.header-info h1 {
+ font-size: 24px;
+ margin-bottom: 5px;
+}
+
+.date-range {
+ font-size: 14px;
+ opacity: 0.8;
+}
+
+.header-summary h2 {
+ font-size: 28px;
+ font-weight: bold;
+ margin-bottom: 5px;
+}
+
+.header-summary .label {
+ font-size: 14px;
+ color: rgba(255, 255, 255, 0.8);
+}
+
+/* Metrics section */
+.metrics-section {
+ margin-bottom: 20px;
+}
+
+.metrics-row {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
+ gap: 20px;
+ margin-bottom: 20px;
+}
+
+.metric-card {
+ background-color: white;
+ border-radius: 8px;
+ padding: 20px;
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
+ transition: transform 0.2s ease-in-out, box-shadow 0.2s ease-in-out;
+}
+
+.metric-card:hover {
+ transform: translateY(-3px);
+ box-shadow: 0 6px 8px rgba(0, 0, 0, 0.15);
+}
+
+.metric-title {
+ font-size: 14px;
+ color: #7f8c8d;
+ margin-bottom: 10px;
+}
+
+.metric-value {
+ font-size: 24px;
+ font-weight: bold;
+}
+
+/* Charts section */
+.charts-section {
+ margin-bottom: 20px;
+}
+
+.charts-row {
+ display: grid;
+ gap: 20px;
+ margin-bottom: 20px;
+}
+
+.chart-card {
+ background-color: white;
+ border-radius: 8px;
+ padding: 20px;
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
+ transition: transform 0.2s ease-in-out, box-shadow 0.2s ease-in-out;
+}
+
+.chart-card:hover {
+ transform: translateY(-3px);
+ box-shadow: 0 6px 8px rgba(0, 0, 0, 0.15);
+}
+
+.chart-header {
+ margin-bottom: 15px;
+}
+
+.chart-title {
+ font-size: 18px;
+ color: #333;
+}
+
+.chart-container {
+ height: 300px;
+ width: 100%;
+ position: relative;
+}
+
+/* Heatmap table */
+.heatmap-table {
+ width: 100%;
+ border-collapse: collapse;
+ font-size: 14px;
+}
+
+.heatmap-table th,
+.heatmap-table td {
+ padding: 8px;
+ text-align: center;
+ border: 1px solid #ddd;
+}
+
+.heatmap-table th {
+ background-color: #f2f2f2;
+ font-weight: bold;
+}
+
+/* Value formatting */
+.positive {
+ color: #2ecc71;
+}
+
+.negative {
+ color: #e74c3c;
+}
+
+.positive-return {
+ color: #2ecc71;
+}
+
+.negative-return {
+ color: #e74c3c;
+}
+
+/* Error messages */
+.error-message {
+ color: #e74c3c;
+ text-align: center;
+ padding: 20px;
+ font-weight: bold;
+}
+
+/* Responsive design */
+@media (max-width: 768px) {
+ .dashboard-header {
+ flex-direction: column;
+ align-items: flex-start;
+ }
+
+ .header-summary {
+ margin-top: 15px;
+ }
+
+ .charts-row {
+ grid-template-columns: 1fr !important;
+ }
+
+ .metrics-row {
+ grid-template-columns: 1fr;
+ }
+}
+
+@media (max-width: 480px) {
+ .dashboard-container {
+ padding: 10px;
+ }
+
+ .dashboard-header {
+ padding: 15px;
+ }
+
+ .header-info h1 {
+ font-size: 20px;
+ }
+
+ .header-summary h2 {
+ font-size: 24px;
+ }
+
+ .metric-value {
+ font-size: 20px;
+ }
+
+ .chart-container {
+ height: 250px;
+ }
+}
\ No newline at end of file
diff --git a/algosystem/static/html/index.html b/algosystem/backtesting/dashboard/static/html/dashboard.html
similarity index 100%
rename from algosystem/static/html/index.html
rename to algosystem/backtesting/dashboard/static/html/dashboard.html
diff --git a/algosystem/static/images/logo_transparent.png b/algosystem/backtesting/dashboard/static/images/logo_transparent.png
similarity index 100%
rename from algosystem/static/images/logo_transparent.png
rename to algosystem/backtesting/dashboard/static/images/logo_transparent.png
diff --git a/algosystem/backtesting/dashboard/static/js/chart_factory.js b/algosystem/backtesting/dashboard/static/js/chart_factory.js
new file mode 100644
index 0000000..b4436ac
--- /dev/null
+++ b/algosystem/backtesting/dashboard/static/js/chart_factory.js
@@ -0,0 +1,157 @@
+/**
+ * Chart Factory - Functions for creating various chart types
+ */
+
+// Store chart instances for later reference
+const chartInstances = {};
+
+/**
+ * Create a line chart
+ * @param {string} containerId - ID of the container element
+ * @param {object} data - Chart data
+ * @param {object} options - Chart options
+ */
+function createLineChart(containerId, data, options) {
+ const container = document.getElementById(containerId);
+ if (!container) return;
+
+ // Clear existing content
+ container.innerHTML = '';
+
+ // Create canvas element
+ const canvas = document.createElement('canvas');
+ container.appendChild(canvas);
+
+ // Check if data is available
+ if (!data || !data.labels || !data.datasets || data.labels.length === 0) {
+ container.innerHTML = 'No data available
';
+ return;
+ }
+
+ // Create chart instance
+ chartInstances[containerId] = new Chart(canvas, {
+ type: 'line',
+ data: data,
+ options: options || {}
+ });
+}
+
+/**
+ * Create a heatmap table
+ * @param {string} containerId - ID of the container element
+ * @param {object} data - Heatmap data
+ */
+function createHeatmapTable(containerId, data) {
+ const container = document.getElementById(containerId);
+ if (!container) return;
+
+ // Clear existing content
+ container.innerHTML = '';
+
+ // Check if data is available
+ if (!data || !data.years || !data.months || data.years.length === 0) {
+ container.innerHTML = 'No data available
';
+ return;
+ }
+
+ // Create table element
+ const table = document.createElement('table');
+ table.className = 'heatmap-table';
+ container.appendChild(table);
+
+ // Create header row
+ const headerRow = document.createElement('tr');
+
+ // Add empty corner cell
+ const cornerCell = document.createElement('th');
+ headerRow.appendChild(cornerCell);
+
+ // Add month headers
+ for (const month of data.months) {
+ const cell = document.createElement('th');
+ cell.textContent = month;
+ headerRow.appendChild(cell);
+ }
+
+ table.appendChild(headerRow);
+
+ // Create data rows
+ for (const year of data.years) {
+ const row = document.createElement('tr');
+
+ // Add year header
+ const yearCell = document.createElement('th');
+ yearCell.textContent = year;
+ row.appendChild(yearCell);
+
+ // Add data cells
+ for (let month = 1; month <= 12; month++) {
+ const cell = document.createElement('td');
+ const key = `${year}-${month}`;
+
+ if (key in data.data) {
+ const value = data.data[key];
+
+ // Format value
+ cell.textContent = formatAsPercentage(value);
+
+ // Apply color scale
+ applyHeatmapColor(cell, value);
+ }
+
+ row.appendChild(cell);
+ }
+
+ table.appendChild(row);
+ }
+}
+
+/**
+ * Apply color to heatmap cell based on value
+ * @param {HTMLElement} cell - Table cell element
+ * @param {number} value - Cell value
+ */
+function applyHeatmapColor(cell, value) {
+ if (value > 0.03) {
+ cell.style.backgroundColor = 'rgba(46, 204, 113, 0.8)';
+ cell.style.color = 'white';
+ } else if (value > 0.01) {
+ cell.style.backgroundColor = 'rgba(46, 204, 113, 0.5)';
+ } else if (value > 0) {
+ cell.style.backgroundColor = 'rgba(46, 204, 113, 0.2)';
+ } else if (value > -0.01) {
+ cell.style.backgroundColor = 'rgba(231, 76, 60, 0.2)';
+ } else if (value > -0.03) {
+ cell.style.backgroundColor = 'rgba(231, 76, 60, 0.5)';
+ } else {
+ cell.style.backgroundColor = 'rgba(231, 76, 60, 0.8)';
+ cell.style.color = 'white';
+ }
+}
+
+/**
+ * Format value as percentage
+ * @param {number} value - Value to format
+ * @returns {string} - Formatted percentage
+ */
+function formatAsPercentage(value) {
+ return `${(value * 100).toFixed(1)}%`;
+}
+
+/**
+ * Format value
+ * @param {number} value - Value to format
+ * @returns {string} - Formatted value
+ */
+function formatValue(value) {
+ return value.toFixed(2);
+}
+
+/**
+ * Format value as currency
+ * @param {number} value - Value to format
+ * @returns {string} - Formatted currency
+ */
+function formatAsCurrency(value) {
+ return `$${value.toFixed(2)}`;
+}
\ No newline at end of file
diff --git a/algosystem/backtesting/dashboard/static/js/dashboard.js b/algosystem/backtesting/dashboard/static/js/dashboard.js
new file mode 100644
index 0000000..89cb68a
--- /dev/null
+++ b/algosystem/backtesting/dashboard/static/js/dashboard.js
@@ -0,0 +1,211 @@
+/**
+ * Dashboard - Main dashboard functionality
+ */
+
+// Global data object
+let chartData;
+
+/**
+ * Initialize the dashboard
+ */
+function initDashboard() {
+ // Load data
+ fetch('dashboard_data.json')
+ .then(response => response.json())
+ .then(data => {
+ // Store data globally
+ chartData = data;
+
+ // Initialize dashboard components
+ createDashboard();
+ })
+ .catch(error => {
+ console.error('Error loading dashboard data:', error);
+ document.body.innerHTML = `Error loading dashboard data: ${error.message}
`;
+ });
+}
+
+/**
+ * Create the dashboard
+ */
+function createDashboard() {
+ // Update metadata in the header
+ updateHeader();
+
+ // Create metrics
+ createMetrics();
+
+ // Create charts
+ createCharts();
+
+ // Add window resize handler
+ window.addEventListener('resize', handleResize);
+}
+
+/**
+ * Update the dashboard header with metadata
+ */
+function updateHeader() {
+ // Update title if needed
+ const titleElement = document.querySelector('.dashboard-header h1');
+ if (titleElement && chartData.metadata.title) {
+ titleElement.textContent = chartData.metadata.title;
+ }
+
+ // Update date range
+ const dateRangeElement = document.querySelector('.date-range');
+ if (dateRangeElement) {
+ dateRangeElement.textContent = `Backtest Period: ${chartData.metadata.start_date} to ${chartData.metadata.end_date}`;
+ }
+
+ // Update total return
+ const totalReturnElement = document.querySelector('.header-summary h2');
+ if (totalReturnElement) {
+ const totalReturn = chartData.metadata.total_return;
+ const sign = totalReturn >= 0 ? '+' : '';
+ totalReturnElement.textContent = `${sign}${totalReturn.toFixed(2)}%`;
+ totalReturnElement.className = totalReturn >= 0 ? 'positive-return' : 'negative-return';
+ }
+}
+
+/**
+ * Create metrics based on data
+ */
+function createMetrics() {
+ // Check if metrics data is available
+ if (!chartData.metrics) return;
+
+ // Update each metric
+ for (const metricId in chartData.metrics) {
+ const metric = chartData.metrics[metricId];
+
+ // Update based on metric type
+ switch (metric.type) {
+ case 'Percentage':
+ updatePercentageMetric(metricId, metric.value);
+ break;
+ case 'Value':
+ updateValueMetric(metricId, metric.value);
+ break;
+ case 'Currency':
+ updateCurrencyMetric(metricId, metric.value);
+ break;
+ default:
+ // Unsupported metric type
+ console.warn(`Unsupported metric type: ${metric.type}`);
+ }
+ }
+}
+
+/**
+ * Create charts based on data
+ */
+function createCharts() {
+ // Check if charts data is available
+ if (!chartData.charts) return;
+
+ // Create each chart
+ for (const chartId in chartData.charts) {
+ const chart = chartData.charts[chartId];
+
+ // Create based on chart type
+ switch (chart.type) {
+ case 'LineChart':
+ createLineChart(
+ chartId,
+ chart.data,
+ getChartOptions(chart)
+ );
+ break;
+ case 'HeatmapTable':
+ createHeatmapTable(
+ chartId,
+ chart.data
+ );
+ break;
+ default:
+ // Unsupported chart type
+ console.warn(`Unsupported chart type: ${chart.type}`);
+ }
+ }
+}
+
+/**
+ * Get chart options based on chart configuration
+ * @param {object} chart - Chart configuration
+ * @returns {object} - Chart options
+ */
+function getChartOptions(chart) {
+ // Base options
+ const options = {
+ responsive: true,
+ maintainAspectRatio: false,
+ plugins: {
+ legend: {
+ display: true,
+ position: 'top',
+ },
+ tooltip: {
+ mode: 'index',
+ intersect: false
+ }
+ },
+ scales: {
+ x: {
+ type: 'time',
+ time: {
+ unit: 'month',
+ displayFormats: {
+ month: 'MMM YYYY'
+ }
+ },
+ title: {
+ display: true,
+ text: 'Date'
+ }
+ },
+ y: {
+ title: {
+ display: true,
+ text: chart.config.y_axis_label || 'Value'
+ }
+ }
+ }
+ };
+
+ // Add percentage formatting if needed
+ if (chart.config.percentage_format) {
+ options.plugins.tooltip.callbacks = {
+ label: function(context) {
+ let label = context.dataset.label || '';
+ if (label) {
+ label += ': ';
+ }
+ if (context.parsed.y !== null) {
+ label += formatAsPercentage(context.parsed.y);
+ }
+ return label;
+ }
+ };
+
+ options.scales.y.ticks = {
+ callback: function(value) {
+ return formatAsPercentage(value);
+ }
+ };
+ }
+
+ return options;
+}
+
+/**
+ * Handle window resize event
+ */
+function handleResize() {
+ // Redraw charts if needed
+ for (const chartId in chartInstances) {
+ if (chartInstances[chartId]) {
+ chartInstances[chartId].resize();
+ }
+ }
+}
\ No newline at end of file
diff --git a/algosystem/backtesting/dashboard/static/js/metric_factory.js b/algosystem/backtesting/dashboard/static/js/metric_factory.js
new file mode 100644
index 0000000..80d9a0d
--- /dev/null
+++ b/algosystem/backtesting/dashboard/static/js/metric_factory.js
@@ -0,0 +1,60 @@
+/**
+ * Metric Factory - Functions for updating various metric types
+ */
+
+/**
+ * Update a percentage metric
+ * @param {string} metricId - ID of the metric element
+ * @param {number} value - Metric value
+ */
+function updatePercentageMetric(metricId, value) {
+ const element = document.getElementById(metricId);
+ if (!element) return;
+
+ // Format value
+ const formattedValue = formatAsPercentage(value);
+
+ // Determine class based on value
+ const className = value >= 0 ? 'positive' : 'negative';
+
+ // Update element
+ element.innerHTML = `${formattedValue} `;
+}
+
+/**
+ * Update a value metric
+ * @param {string} metricId - ID of the metric element
+ * @param {number} value - Metric value
+ */
+function updateValueMetric(metricId, value) {
+ const element = document.getElementById(metricId);
+ if (!element) return;
+
+ // Format value
+ const formattedValue = formatValue(value);
+
+ // Determine class based on value
+ const className = value >= 0 ? 'positive' : 'negative';
+
+ // Update element
+ element.innerHTML = `${formattedValue} `;
+}
+
+/**
+ * Update a currency metric
+ * @param {string} metricId - ID of the metric element
+ * @param {number} value - Metric value
+ */
+function updateCurrencyMetric(metricId, value) {
+ const element = document.getElementById(metricId);
+ if (!element) return;
+
+ // Format value
+ const formattedValue = formatAsCurrency(value);
+
+ // Determine class based on value
+ const className = value >= 0 ? 'positive' : 'negative';
+
+ // Update element
+ element.innerHTML = `${formattedValue} `;
+}
\ No newline at end of file
diff --git a/algosystem/backtesting/dashboard/template/base_template.py b/algosystem/backtesting/dashboard/template/base_template.py
new file mode 100644
index 0000000..04c43c6
--- /dev/null
+++ b/algosystem/backtesting/dashboard/template/base_template.py
@@ -0,0 +1,194 @@
+from .chart_templates import generate_chart_html
+from .metric_templates import generate_metric_html
+from ..utils.config_parser import get_component_rows, get_max_row
+
+
+def generate_html(engine, config, dashboard_data):
+ """
+ Generate HTML for the dashboard
+
+ Parameters:
+ -----------
+ engine : Engine
+ Backtesting engine with results
+ config : dict
+ Dashboard configuration
+ dashboard_data : dict
+ Formatted dashboard data
+
+ Returns:
+ --------
+ str
+ Complete HTML content for the dashboard
+ """
+ # Generate header
+ header_html = generate_header_html(dashboard_data)
+
+ # Generate metrics section
+ metrics_html = generate_metrics_section(config, dashboard_data)
+
+ # Generate charts section
+ charts_html = generate_charts_section(config, dashboard_data)
+
+ # Assemble the complete HTML
+ html = f'''
+
+
+
+
+ {config['layout']['title']}
+
+
+
+
+
+
+
+
+
+
+ {header_html}
+ {metrics_html}
+ {charts_html}
+
+
+
+
+
+'''
+
+ return html
+
+
+def generate_header_html(dashboard_data):
+ """
+ Generate HTML for the dashboard header
+
+ Parameters:
+ -----------
+ dashboard_data : dict
+ Dashboard data
+
+ Returns:
+ --------
+ str
+ HTML for the header section
+ """
+ metadata = dashboard_data['metadata']
+ total_return = metadata['total_return']
+ total_return_class = "positive-return" if total_return >= 0 else "negative-return"
+ total_return_sign = "+" if total_return >= 0 else ""
+
+ header_html = f'''
+
+'''
+
+ return header_html
+
+
+def generate_metrics_section(config, dashboard_data):
+ """
+ Generate HTML for the metrics section
+
+ Parameters:
+ -----------
+ config : dict
+ Dashboard configuration
+ dashboard_data : dict
+ Dashboard data
+
+ Returns:
+ --------
+ str
+ HTML for the metrics section
+ """
+ metrics_html = ''
+
+ # Get metrics grouped by row
+ metrics_rows = get_component_rows(config['metrics'])
+
+ # Generate HTML for each row
+ for row in sorted(metrics_rows.keys()):
+ metrics_row = metrics_rows[row]
+ metrics_html += f''
+# Generate HTML for each metric in this row
+ for metric_config in metrics_row:
+ metric_id = metric_config['id']
+ metric_data = dashboard_data['metrics'].get(metric_id, {})
+
+ # Skip if metric data is not available
+ if not metric_data:
+ continue
+
+ # Generate HTML for this metric
+ metric_html = generate_metric_html(metric_config, metric_data)
+ metrics_html += metric_html
+
+ metrics_html += '
'
+
+ metrics_html += ' '
+
+ return metrics_html
+
+
+def generate_charts_section(config, dashboard_data):
+ """
+ Generate HTML for the charts section
+
+ Parameters:
+ -----------
+ config : dict
+ Dashboard configuration
+ dashboard_data : dict
+ Dashboard data
+
+ Returns:
+ --------
+ str
+ HTML for the charts section
+ """
+ charts_html = ''
+
+ # Get charts grouped by row
+ charts_rows = get_component_rows(config['charts'])
+
+ # Get maximum number of columns
+ max_cols = config['layout']['max_cols']
+
+ # Generate HTML for each row
+ for row in sorted(charts_rows.keys()):
+ charts_row = charts_rows[row]
+ charts_html += f''
+
+ # Generate HTML for each chart in this row
+ for chart_config in charts_row:
+ chart_id = chart_config['id']
+ chart_data = dashboard_data['charts'].get(chart_id, {})
+
+ # Skip if chart data is not available
+ if not chart_data:
+ continue
+
+ # Generate HTML for this chart
+ chart_html = generate_chart_html(chart_config, chart_data)
+ charts_html += chart_html
+
+ charts_html += '
'
+
+ charts_html += ' '
+
+ return charts_html
\ No newline at end of file
diff --git a/algosystem/backtesting/dashboard/template/chart_templates.py b/algosystem/backtesting/dashboard/template/chart_templates.py
new file mode 100644
index 0000000..29ffb50
--- /dev/null
+++ b/algosystem/backtesting/dashboard/template/chart_templates.py
@@ -0,0 +1,145 @@
+def generate_chart_html(chart_config, chart_data):
+ """
+ Generate HTML for a chart component
+
+ Parameters:
+ -----------
+ chart_config : dict
+ Chart configuration
+ chart_data : dict
+ Chart data
+
+ Returns:
+ --------
+ str
+ HTML for the chart component
+ """
+ chart_id = chart_config['id']
+ chart_title = chart_config['title']
+ chart_type = chart_config['type']
+
+ # Base chart container
+ chart_html = f'''
+
+'''
+
+ return chart_html
+
+
+def generate_line_chart_js(chart_id, chart_data, chart_config):
+ """
+ Generate JavaScript for a line chart
+
+ Parameters:
+ -----------
+ chart_id : str
+ Chart ID
+ chart_data : dict
+ Chart data
+ chart_config : dict
+ Chart configuration
+
+ Returns:
+ --------
+ str
+ JavaScript for the line chart
+ """
+ # Extract configuration
+ y_axis_label = chart_config.get('config', {}).get('y_axis_label', 'Value')
+ percentage_format = chart_config.get('config', {}).get('percentage_format', False)
+
+ # Generate JavaScript
+ js = f'''
+// Create chart: {chart_id}
+createLineChart(
+ '{chart_id}',
+ chartData.charts['{chart_id}'].data,
+ {{
+ responsive: true,
+ maintainAspectRatio: false,
+ plugins: {{
+ legend: {{
+ display: true,
+ position: 'top',
+ }},
+ tooltip: {{
+ mode: 'index',
+ intersect: false,
+ callbacks: {{
+ label: function(context) {{
+ let label = context.dataset.label || '';
+ if (label) {{
+ label += ': ';
+ }}
+ if (context.parsed.y !== null) {{
+ label += {"formatAsPercentage(context.parsed.y)" if percentage_format else "formatValue(context.parsed.y)"};
+ }}
+ return label;
+ }}
+ }}
+ }}
+ }},
+ scales: {{
+ x: {{
+ type: 'time',
+ time: {{
+ unit: 'month',
+ displayFormats: {{
+ month: 'MMM YYYY'
+ }}
+ }},
+ title: {{
+ display: true,
+ text: 'Date'
+ }}
+ }},
+ y: {{
+ title: {{
+ display: true,
+ text: '{y_axis_label}'
+ }},
+ {"ticks: { callback: function(value) { return formatAsPercentage(value); } }," if percentage_format else ""}
+ }}
+ }}
+ }}
+);
+'''
+
+ return js
+
+
+def generate_heatmap_table_js(chart_id, chart_data, chart_config):
+ """
+ Generate JavaScript for a heatmap table
+
+ Parameters:
+ -----------
+ chart_id : str
+ Chart ID
+ chart_data : dict
+ Chart data
+ chart_config : dict
+ Chart configuration
+
+ Returns:
+ --------
+ str
+ JavaScript for the heatmap table
+ """
+ # Generate JavaScript
+ js = f'''
+// Create heatmap table: {chart_id}
+createHeatmapTable(
+ '{chart_id}',
+ chartData.charts['{chart_id}'].data
+);
+'''
+
+ return js
\ No newline at end of file
diff --git a/algosystem/backtesting/dashboard/template/metric_templates.py b/algosystem/backtesting/dashboard/template/metric_templates.py
new file mode 100644
index 0000000..3e5bb73
--- /dev/null
+++ b/algosystem/backtesting/dashboard/template/metric_templates.py
@@ -0,0 +1,167 @@
+def generate_metric_html(metric_config, metric_data):
+ """
+ Generate HTML for a metric component
+
+ Parameters:
+ -----------
+ metric_config : dict
+ Metric configuration
+ metric_data : dict
+ Metric data
+
+ Returns:
+ --------
+ str
+ HTML for the metric component
+ """
+ metric_id = metric_config['id']
+ metric_title = metric_config['title']
+ metric_type = metric_config['type']
+ metric_value = metric_data.get('value', 0)
+
+ # Determine the value format
+ value_html = format_metric_value(metric_value, metric_type)
+
+ # Base metric card
+ metric_html = f'''
+
+
+
{metric_title}
+
{value_html}
+
+
+'''
+
+ return metric_html
+
+
+def format_metric_value(value, metric_type):
+ """
+ Format a metric value based on its type
+
+ Parameters:
+ -----------
+ value : float
+ Metric value
+ metric_type : str
+ Metric type
+
+ Returns:
+ --------
+ str
+ Formatted metric value
+ """
+ if metric_type == 'Percentage':
+ # Format as percentage
+ formatted_value = f'{value:.2f}%'
+
+ # Add class based on sign
+ sign_class = 'positive' if value >= 0 else 'negative'
+
+ return f'{formatted_value} '
+
+ elif metric_type == 'Value':
+ # Format as number
+ formatted_value = f'{value:.2f}'
+
+ # Add class based on sign
+ sign_class = 'positive' if value >= 0 else 'negative'
+
+ return f'{formatted_value} '
+
+ elif metric_type == 'Currency':
+ # Format as currency
+ formatted_value = f'${value:,.2f}'
+
+ # Add class based on sign
+ sign_class = 'positive' if value >= 0 else 'negative'
+
+ return f'{formatted_value} '
+
+ else:
+ # Default format
+ return f'{value}'
+
+
+def generate_percentage_metric_js(metric_id, metric_data):
+ """
+ Generate JavaScript for a percentage metric
+
+ Parameters:
+ -----------
+ metric_id : str
+ Metric ID
+ metric_data : dict
+ Metric data
+
+ Returns:
+ --------
+ str
+ JavaScript for the percentage metric
+ """
+ # Generate JavaScript
+ js = f'''
+// Update percentage metric: {metric_id}
+updatePercentageMetric(
+ '{metric_id}',
+ chartData.metrics['{metric_id}'].value
+);
+'''
+
+ return js
+
+
+def generate_value_metric_js(metric_id, metric_data):
+ """
+ Generate JavaScript for a value metric
+
+ Parameters:
+ -----------
+ metric_id : str
+ Metric ID
+ metric_data : dict
+ Metric data
+
+ Returns:
+ --------
+ str
+ JavaScript for the value metric
+ """
+ # Generate JavaScript
+ js = f'''
+// Update value metric: {metric_id}
+updateValueMetric(
+ '{metric_id}',
+ chartData.metrics['{metric_id}'].value
+);
+'''
+
+ return js
+
+
+def generate_currency_metric_js(metric_id, metric_data):
+ """
+ Generate JavaScript for a currency metric
+
+ Parameters:
+ -----------
+ metric_id : str
+ Metric ID
+ metric_data : dict
+ Metric data
+
+ Returns:
+ --------
+ str
+ JavaScript for the currency metric
+ """
+ # Generate JavaScript
+ js = f'''
+// Update currency metric: {metric_id}
+updateCurrencyMetric(
+ '{metric_id}',
+ chartData.metrics['{metric_id}'].value
+);
+'''
+
+ return js
\ No newline at end of file
diff --git a/algosystem/backtesting/dashboard/utils/__init__.py b/algosystem/backtesting/dashboard/utils/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/algosystem/backtesting/dashboard/utils/config_parser.py b/algosystem/backtesting/dashboard/utils/config_parser.py
new file mode 100644
index 0000000..7a30660
--- /dev/null
+++ b/algosystem/backtesting/dashboard/utils/config_parser.py
@@ -0,0 +1,199 @@
+def validate_config(config):
+ """
+ Validate the dashboard configuration
+
+ Parameters:
+ -----------
+ config : dict
+ Dashboard configuration from graph_config.json
+
+ Returns:
+ --------
+ bool
+ True if configuration is valid
+
+ Raises:
+ -------
+ ValueError
+ If configuration is invalid
+ """
+ # Check for required sections
+ required_sections = ['metrics', 'charts', 'layout']
+ for section in required_sections:
+ if section not in config:
+ raise ValueError(f"Missing required section '{section}' in dashboard configuration")
+
+ # Validate metrics
+ validate_components(config['metrics'], 'metrics')
+
+ # Validate charts
+ validate_components(config['charts'], 'charts')
+
+ # Validate layout
+ validate_layout(config['layout'])
+
+ return True
+
+
+def validate_components(components, component_type):
+ """
+ Validate component configurations (metrics or charts)
+
+ Parameters:
+ -----------
+ components : list
+ List of component configurations
+ component_type : str
+ Type of components ('metrics' or 'charts')
+
+ Raises:
+ -------
+ ValueError
+ If configuration is invalid
+ """
+ if not isinstance(components, list):
+ raise ValueError(f"'{component_type}' must be a list")
+
+ # Check if list is empty
+ if len(components) == 0:
+ raise ValueError(f"No {component_type} specified in configuration")
+
+ # Required fields for all components
+ required_fields = ['id', 'type', 'title', 'position']
+
+ # Additional required fields based on component type
+ if component_type == 'metrics':
+ required_fields.append('value_key')
+ elif component_type == 'charts':
+ required_fields.append('data_key')
+ required_fields.append('config')
+
+ # Check each component
+ ids = set()
+ for i, component in enumerate(components):
+ # Check required fields
+ for field in required_fields:
+ if field not in component:
+ raise ValueError(f"Missing required field '{field}' in {component_type}[{i}]")
+
+ # Check for duplicate IDs
+ if component['id'] in ids:
+ raise ValueError(f"Duplicate ID '{component['id']}' in {component_type}")
+ ids.add(component['id'])
+
+ # Validate position
+ validate_position(component['position'], f"{component_type}[{i}]")
+
+
+def validate_position(position, context):
+ """
+ Validate component position configuration
+
+ Parameters:
+ -----------
+ position : dict
+ Position configuration
+ context : str
+ Context for error messages
+
+ Raises:
+ -------
+ ValueError
+ If position configuration is invalid
+ """
+ # Check required fields
+ required_fields = ['row', 'col']
+ for field in required_fields:
+ if field not in position:
+ raise ValueError(f"Missing required field '{field}' in position of {context}")
+
+ # Check that row and col are non-negative integers
+ if not isinstance(position['row'], int) or position['row'] < 0:
+ raise ValueError(f"'row' must be a non-negative integer in position of {context}")
+
+ if not isinstance(position['col'], int) or position['col'] < 0:
+ raise ValueError(f"'col' must be a non-negative integer in position of {context}")
+
+
+def validate_layout(layout):
+ """
+ Validate layout configuration
+
+ Parameters:
+ -----------
+ layout : dict
+ Layout configuration
+
+ Raises:
+ -------
+ ValueError
+ If layout configuration is invalid
+ """
+ # Check required fields
+ required_fields = ['max_cols', 'title']
+ for field in required_fields:
+ if field not in layout:
+ raise ValueError(f"Missing required field '{field}' in layout")
+
+ # Check that max_cols is a positive integer
+ if not isinstance(layout['max_cols'], int) or layout['max_cols'] <= 0:
+ raise ValueError("'max_cols' must be a positive integer in layout")
+
+ # Check that title is a string
+ if not isinstance(layout['title'], str):
+ raise ValueError("'title' must be a string in layout")
+
+
+def get_component_rows(components):
+ """
+ Group components by row
+
+ Parameters:
+ -----------
+ components : list
+ List of component configurations
+
+ Returns:
+ --------
+ dict
+ Dictionary with rows as keys and lists of components as values
+ """
+ rows = {}
+ for component in components:
+ row = component['position']['row']
+ if row not in rows:
+ rows[row] = []
+ rows[row].append(component)
+
+ # Sort components within each row by column
+ for row in rows:
+ rows[row].sort(key=lambda x: x['position']['col'])
+
+ return rows
+
+
+def get_max_row(config):
+ """
+ Get the maximum row number used in the configuration
+
+ Parameters:
+ -----------
+ config : dict
+ Dashboard configuration
+
+ Returns:
+ --------
+ int
+ Maximum row number
+ """
+ max_row = 0
+
+ # Check metrics
+ for metric in config['metrics']:
+ max_row = max(max_row, metric['position']['row'])
+
+ # Check charts
+ for chart in config['charts']:
+ max_row = max(max_row, chart['position']['row'])
+
+ return max_row
\ No newline at end of file
diff --git a/algosystem/backtesting/dashboard/utils/data_formatter.py b/algosystem/backtesting/dashboard/utils/data_formatter.py
new file mode 100644
index 0000000..2133355
--- /dev/null
+++ b/algosystem/backtesting/dashboard/utils/data_formatter.py
@@ -0,0 +1,345 @@
+import pandas as pd
+import numpy as np
+from datetime import datetime
+
+
+def prepare_dashboard_data(engine, config):
+ """
+ Prepare data for the dashboard based on configuration
+
+ Parameters:
+ -----------
+ engine : Engine
+ Backtesting engine with results
+ config : dict
+ Dashboard configuration
+
+ Returns:
+ --------
+ dict
+ Formatted data for the dashboard
+ """
+ if engine.results is None:
+ raise ValueError("No backtest results available. Run the backtest first.")
+
+ # Prepare basic data
+ dashboard_data = {
+ 'metadata': {
+ 'title': config['layout']['title'],
+ 'start_date': engine.start_date.strftime('%Y-%m-%d'),
+ 'end_date': engine.end_date.strftime('%Y-%m-%d'),
+ 'total_return': float(engine.results.get('returns', 0)) * 100, # Convert to percentage
+ 'initial_capital': float(engine.results.get('initial_capital', 0)),
+ 'final_capital': float(engine.results.get('final_capital', 0)),
+ 'run_date': datetime.now().strftime('%Y-%m-%d %H:%M:%S')
+ },
+ 'metrics': prepare_metrics_data(engine, config),
+ 'charts': prepare_charts_data(engine, config)
+ }
+
+ return dashboard_data
+
+
+def prepare_metrics_data(engine, config):
+ """
+ Prepare metrics data for the dashboard
+
+ Parameters:
+ -----------
+ engine : Engine
+ Backtesting engine with results
+ config : dict
+ Dashboard configuration
+
+ Returns:
+ --------
+ dict
+ Formatted metrics data
+ """
+ # Extract metrics and ensure they're serializable
+ metrics = {}
+ for key, value in engine.results.get('metrics', {}).items():
+ if isinstance(value, (np.integer, np.floating, np.bool_)):
+ metrics[key] = value.item() # Convert NumPy types to Python native types
+ else:
+ metrics[key] = value
+
+ # Format metrics based on configuration
+ formatted_metrics = {}
+ for metric_config in config['metrics']:
+ metric_id = metric_config['id']
+ value_key = metric_config['value_key']
+
+ # Get the value if available, else use 0
+ value = metrics.get(value_key, 0)
+
+ # Format based on metric type
+ if metric_config['type'] == 'Percentage':
+ formatted_value = value * 100 # Convert to percentage
+ else:
+ formatted_value = value
+
+ # Store the formatted metric
+ formatted_metrics[metric_id] = {
+ 'id': metric_id,
+ 'title': metric_config['title'],
+ 'type': metric_config['type'],
+ 'value': formatted_value,
+ 'position': metric_config['position']
+ }
+
+ return formatted_metrics
+
+
+def prepare_charts_data(engine, config):
+ """
+ Prepare chart data for the dashboard
+
+ Parameters:
+ -----------
+ engine : Engine
+ Backtesting engine with results
+ config : dict
+ Dashboard configuration
+
+ Returns:
+ --------
+ dict
+ Formatted chart data
+ """
+ # Initialize charts data
+ charts_data = {}
+
+ # Get available data series
+ data_series = {
+ 'equity': engine.results.get('equity', None),
+ 'drawdown': engine.results.get('plots', {}).get('drawdown_series', None),
+ 'rolling_sharpe': engine.results.get('plots', {}).get('rolling_sharpe', None),
+ 'monthly_returns': engine.results.get('plots', {}).get('monthly_returns', None),
+ 'benchmark': engine.results.get('plots', {}).get('benchmark_equity_curve', None)
+ }
+
+ # Prepare each chart's data based on configuration
+ for chart_config in config['charts']:
+ chart_id = chart_config['id']
+ data_key = chart_config['data_key']
+
+ # Skip if data is not available and can't be calculated
+ if data_key not in data_series or data_series[data_key] is None:
+ if data_key == 'drawdown' and data_series['equity'] is not None:
+ # Calculate drawdown from equity
+ data_series['drawdown'] = calculate_drawdown(data_series['equity'])
+ elif data_key == 'rolling_sharpe' and data_series['equity'] is not None:
+ # Calculate rolling sharpe from equity
+ window_size = chart_config.get('config', {}).get('window_size', 252)
+ data_series['rolling_sharpe'] = calculate_rolling_sharpe(data_series['equity'], window_size)
+ elif data_key == 'monthly_returns' and data_series['equity'] is not None:
+ # Calculate monthly returns from equity
+ data_series['monthly_returns'] = calculate_monthly_returns(data_series['equity'])
+ else:
+ # Skip this chart
+ continue
+
+ # Format data based on chart type
+ if chart_config['type'] == 'LineChart':
+ chart_data = format_line_chart_data(data_series[data_key], chart_config)
+ elif chart_config['type'] == 'HeatmapTable':
+ chart_data = format_heatmap_table_data(data_series[data_key], chart_config)
+ else:
+ # Skip unsupported chart types
+ continue
+
+ # Add to charts data
+ charts_data[chart_id] = {
+ 'id': chart_id,
+ 'title': chart_config['title'],
+ 'type': chart_config['type'],
+ 'data': chart_data,
+ 'config': chart_config['config'],
+ 'position': chart_config['position']
+ }
+
+ return charts_data
+
+
+def format_line_chart_data(series, chart_config):
+ """
+ Format data for a line chart
+
+ Parameters:
+ -----------
+ series : pd.Series
+ Time series data
+ chart_config : dict
+ Chart configuration
+
+ Returns:
+ --------
+ dict
+ Formatted line chart data
+ """
+ if series is None or (hasattr(series, 'empty') and series.empty):
+ return {'labels': [], 'datasets': []}
+
+ # Format labels (dates)
+ labels = []
+ data = []
+
+ for date, value in series.items():
+ # Format date
+ date_str = date.strftime('%Y-%m-%d') if hasattr(date, 'strftime') else str(date)
+ labels.append(date_str)
+
+ # Format value
+ if isinstance(value, (np.integer, np.floating)):
+ value_float = float(value.item())
+ else:
+ value_float = float(value) if pd.notna(value) else None
+
+ data.append(value_float)
+
+ # Create dataset
+ dataset = {
+ 'label': chart_config['title'],
+ 'data': data,
+ 'borderColor': '#2ecc71', # Default color - can be overridden in future
+ 'backgroundColor': 'rgba(46, 204, 113, 0.1)',
+ 'fill': True,
+ 'tension': 0.1
+ }
+
+ return {
+ 'labels': labels,
+ 'datasets': [dataset]
+ }
+
+
+def format_heatmap_table_data(series, chart_config):
+ """
+ Format data for a heatmap table
+
+ Parameters:
+ -----------
+ series : pd.Series
+ Monthly returns data
+ chart_config : dict
+ Chart configuration
+
+ Returns:
+ --------
+ dict
+ Formatted heatmap table data
+ """
+ if series is None or (hasattr(series, 'empty') and series.empty):
+ return {'years': [], 'months': [], 'data': {}}
+
+ # Extract data
+ years = set()
+ monthly_data = {}
+
+ for date, value in series.items():
+ # Extract year and month
+ year = date.year
+ month = date.month
+
+ # Add year to set
+ years.add(year)
+
+ # Format value
+ if isinstance(value, (np.integer, np.floating)):
+ value_float = float(value.item())
+ else:
+ value_float = float(value) if pd.notna(value) else None
+
+ # Store value
+ key = f"{year}-{month}"
+ monthly_data[key] = value_float
+
+ # Sort years
+ years = sorted(list(years))
+
+ # Define months
+ months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
+
+ return {
+ 'years': years,
+ 'months': months,
+ 'data': monthly_data
+ }
+
+
+def calculate_drawdown(equity_series):
+ """
+ Calculate drawdown series from equity series
+
+ Parameters:
+ -----------
+ equity_series : pd.Series
+ Equity curve
+
+ Returns:
+ --------
+ pd.Series
+ Drawdown series
+ """
+ # Calculate running maximum
+ running_max = equity_series.cummax()
+
+ # Calculate drawdown
+ drawdown = (equity_series / running_max) - 1
+
+ return drawdown
+
+
+def calculate_rolling_sharpe(equity_series, window=252):
+ """
+ Calculate rolling Sharpe ratio from equity series
+
+ Parameters:
+ -----------
+ equity_series : pd.Series
+ Equity curve
+ window : int
+ Rolling window size
+
+ Returns:
+ --------
+ pd.Series
+ Rolling Sharpe ratio series
+ """
+ # Calculate returns
+ returns = equity_series.pct_change().dropna()
+
+ # Calculate rolling mean (annualized)
+ rolling_mean = returns.rolling(window=window).mean() * 252
+
+ # Calculate rolling standard deviation (annualized)
+ rolling_std = returns.rolling(window=window).std() * np.sqrt(252)
+
+ # Calculate rolling Sharpe ratio
+ rolling_sharpe = rolling_mean / rolling_std
+
+ return rolling_sharpe
+
+
+def calculate_monthly_returns(equity_series):
+ """
+ Calculate monthly returns from equity series
+
+ Parameters:
+ -----------
+ equity_series : pd.Series
+ Equity curve
+
+ Returns:
+ --------
+ pd.Series
+ Monthly returns series
+ """
+ # Resample to monthly frequency, taking the last value of each month
+ monthly_values = equity_series.resample('M').last()
+
+ # Calculate percentage change
+ monthly_returns = monthly_values.pct_change().dropna()
+
+ return monthly_returns
\ No newline at end of file
diff --git a/algosystem/backtesting/engine.py b/algosystem/backtesting/engine.py
index de1300b..6002cff 100644
--- a/algosystem/backtesting/engine.py
+++ b/algosystem/backtesting/engine.py
@@ -210,10 +210,9 @@ def _format_time_series(self, series):
return result
-
def generate_dashboard(self, output_dir=None, open_browser=True, config_path=None):
"""
- Generate an HTML dashboard for the backtest results using graph_config.json
+ Generate an HTML dashboard for the backtest results based on graph_config.json
Parameters:
-----------
@@ -229,870 +228,5 @@ def generate_dashboard(self, output_dir=None, open_browser=True, config_path=Non
dashboard_path : str
Path to the generated dashboard HTML file
"""
- # Get results from the engine
- if self.results is None:
- raise ValueError("No backtest results available. Run the backtest first.")
-
- # Set default output directory
- if output_dir is None:
- output_dir = os.path.join(os.getcwd(), "dashboard")
-
- # Create output directory if it doesn't exist
- os.makedirs(output_dir, exist_ok=True)
-
- # Load graph configuration
- if config_path is None:
- config_path = os.path.join(os.path.dirname(os.path.dirname(__file__)), "utils", "graph_config.json")
-
- with open(config_path, 'r') as f:
- graph_config = json.load(f)
-
- # Extract plot configurations
- plots = graph_config.get('plots', [])
- max_cols = graph_config.get('max_cols', 2)
-
- # Generate HTML dashboard
- dashboard_html = self._generate_dashboard_html(plots, max_cols)
-
- # Write dashboard files
- dashboard_path = os.path.join(output_dir, 'dashboard.html')
- with open(dashboard_path, 'w') as f:
- f.write(dashboard_html)
-
- # Prepare and save the data for the dashboard
- dashboard_data = self.prepare_dashboard_data()
- data_path = os.path.join(output_dir, 'dashboard_data.json')
- with open(data_path, 'w') as f:
- json.dump(dashboard_data, f, indent=2)
-
- # Create the CSS file
- css_path = os.path.join(output_dir, 'dashboard.css')
- with open(css_path, 'w') as f:
- f.write(self._get_dashboard_css())
-
- # Open in browser if requested
- if open_browser:
- webbrowser.open('file://' + os.path.abspath(dashboard_path))
-
- return dashboard_path
-
- def _generate_dashboard_html(self, plots, max_cols):
- """Generate HTML for the dashboard based on plot configuration"""
-
- # Get basic metrics
- metrics = self.results.get('metrics', {})
-
- # Convert metrics to standard Python types for JSON serialization
- serializable_metrics = {}
- for key, value in metrics.items():
- if isinstance(value, (np.integer, np.floating, np.bool_)):
- serializable_metrics[key] = value.item() # Convert NumPy types to Python native types
- else:
- serializable_metrics[key] = value
-
- total_return = float(self.results.get('returns', 0) * 100) # Convert to percentage
-
- # Generate metrics HTML
- metrics_html = """
-
-
-
Annualized Return
-
{:.2f}%
-
-
-
-
Sharpe Ratio
-
{:.2f}
-
-
-
Max Drawdown
-
{:.2f}%
-
-
- """.format(
- serializable_metrics.get('annual_return', 0) * 100,
- serializable_metrics.get('volatility', 0) * 100,
- serializable_metrics.get('sharpe_ratio', 0),
- serializable_metrics.get('max_drawdown', 0) * 100
- )
-
- # Sort plots by row and column
- sorted_plots = sorted(plots, key=lambda p: (p.get('position', {}).get('row', 0), p.get('position', {}).get('col', 0)))
-
- # Generate plots HTML
- plots_html = ''
-
- # Group plots by row
- current_row = -1
- for plot in sorted_plots:
- row = plot.get('position', {}).get('row', 0)
-
- # If new row, close previous row div and start new one
- if row != current_row:
- if current_row != -1:
- plots_html += '
' # Close previous row
- plots_html += f''
- current_row = row
-
- # Add plot div with appropriate ID
- plot_id = f"plot_{plot.get('id', '')}"
- plot_title = plot.get('title', plot.get('type', 'Plot'))
- plots_html += f"""
-
- """
-
- # Close the last row and the plots grid
- plots_html += '
'
-
- # Generate JavaScript to create the plots
- js = f"""
-
- """
-
- # Assemble the complete HTML
- html = f"""
-
-
-
-
- AlgoSystem Trading Dashboard
-
-
-
-
-
-
-
-
-
- {metrics_html}
-
- {plots_html}
-
-
- {js}
-
-
- """
-
- return html
-
- def _convert_series_to_js(self, series):
- """Convert pandas Series to JavaScript-friendly format"""
- if series.empty:
- return "[]"
-
- # Convert series to list of [date, value] pairs
- data = []
- for date, value in series.items():
- # Format date as ISO string and ensure value is a number
- date_str = date.strftime('%Y-%m-%d') if hasattr(date, 'strftime') else str(date)
-
- # Handle NumPy types
- if isinstance(value, (np.integer, np.floating)):
- value_float = float(value.item())
- else:
- value_float = float(value) if pd.notna(value) else None
-
- data.append([date_str, value_float])
-
- return json.dumps(data)
-
- def _get_dashboard_css(self):
- """Return CSS for the dashboard"""
- return """
- /* Dashboard styles */
- body {
- font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
- margin: 0;
- padding: 0;
- background-color: #f5f7fa;
- color: #333;
- }
-
- .container {
- max-width: 1200px;
- margin: 0 auto;
- padding: 20px;
- }
-
- .header {
- background-color: #2c3e50;
- color: white;
- padding: 20px;
- border-radius: 8px;
- margin-bottom: 20px;
- display: flex;
- justify-content: space-between;
- align-items: center;
- }
-
- .header h1 {
- margin: 0;
- font-size: 24px;
- }
-
- .date-range {
- font-size: 14px;
- opacity: 0.8;
- }
-
- .total-return {
- font-size: 32px;
- font-weight: bold;
- margin: 0;
- }
-
- .positive-return {
- color: #2ecc71;
- }
-
- .negative-return {
- color: #e74c3c;
- }
-
- /* Metrics grid */
- .metrics-grid {
- display: grid;
- grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
- grid-gap: 20px;
- margin-bottom: 20px;
- }
-
- .metric-card {
- background-color: white;
- border-radius: 8px;
- padding: 20px;
- box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
- }
-
- .metric-title {
- font-size: 14px;
- color: #7f8c8d;
- margin: 0 0 5px 0;
- }
-
- .metric-value {
- font-size: 24px;
- font-weight: bold;
- margin: 0;
- }
-
- /* Plots grid */
- .plots-grid {
- display: flex;
- flex-direction: column;
- gap: 20px;
- }
-
- .plot-row {
- display: grid;
- grid-template-columns: repeat(2, 1fr);
- grid-gap: 20px;
- }
-
- .plot-card {
- background-color: white;
- border-radius: 8px;
- padding: 20px;
- box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
- }
-
- .plot-title {
- font-size: 18px;
- margin-top: 0;
- margin-bottom: 15px;
- }
-
- .plot-container {
- height: 300px;
- width: 100%;
- }
-
- /* Responsive layout */
- @media (max-width: 768px) {
- .plot-row {
- grid-template-columns: 1fr;
- }
-
- .header {
- flex-direction: column;
- align-items: flex-start;
- }
-
- .header > div:last-child {
- margin-top: 15px;
- }
- }
- """
-
- def prepare_dashboard_data(self):
- """
- Prepare backtest results data for the dashboard
-
- Returns:
- --------
- dashboard_data : dict
- Formatted data ready for the dashboard
- """
- if self.results is None:
- raise ValueError("No backtest results available. Run the backtest first.")
-
- # Extract metrics and ensure they're serializable
- metrics = {}
- for key, value in self.results.get('metrics', {}).items():
- if isinstance(value, (np.integer, np.floating, np.bool_)):
- metrics[key] = value.item() # Convert NumPy types to Python native types
- else:
- metrics[key] = value
-
- # Format time series data
- formatted_data = {}
-
- # Add equity curve
- if 'equity' in self.results:
- equity = self.results['equity']
- formatted_data['equity'] = self._format_time_series(equity)
-
- # Add benchmark if available
- plots = self.results.get('plots', {})
- if 'benchmark_equity_curve' in plots:
- benchmark = plots['benchmark_equity_curve']
- formatted_data['benchmark'] = self._format_time_series(benchmark)
-
- # Add drawdown
- if 'drawdown_series' in plots:
- drawdown = plots['drawdown_series']
- formatted_data['drawdown'] = self._format_time_series(drawdown)
-
- # Add rolling sharpe
- if 'rolling_sharpe' in plots:
- rolling_sharpe = plots['rolling_sharpe']
- formatted_data['rolling_sharpe'] = self._format_time_series(rolling_sharpe)
-
- # Add monthly returns
- if 'monthly_returns' in plots:
- monthly_returns = plots['monthly_returns']
- formatted_data['monthly_returns'] = self._format_time_series(monthly_returns)
-
- # Return the dashboard data
- return {
- 'metrics': metrics,
- 'data': formatted_data,
- 'start_date': self.start_date.strftime('%Y-%m-%d'),
- 'end_date': self.end_date.strftime('%Y-%m-%d'),
- 'total_return': float(self.results.get('returns', 0)) * 100 # Convert to percentage
- }
+ from .dashboard.dashboard_generator import generate_dashboard
+ return generate_dashboard(self, output_dir, open_browser, config_path)
diff --git a/algosystem/backtesting/utils/graph_config.json b/algosystem/backtesting/utils/graph_config.json
new file mode 100644
index 0000000..2f49794
--- /dev/null
+++ b/algosystem/backtesting/utils/graph_config.json
@@ -0,0 +1,102 @@
+{
+ "metrics": [
+ {
+ "id": "annual_return",
+ "type": "Percentage",
+ "title": "Annualized Return",
+ "value_key": "annual_return",
+ "position": {
+ "row": 0,
+ "col": 0
+ }
+ },
+ {
+ "id": "volatility",
+ "type": "Percentage",
+ "title": "Volatility",
+ "value_key": "volatility",
+ "position": {
+ "row": 0,
+ "col": 1
+ }
+ },
+ {
+ "id": "sharpe_ratio",
+ "type": "Value",
+ "title": "Sharpe Ratio",
+ "value_key": "sharpe_ratio",
+ "position": {
+ "row": 0,
+ "col": 2
+ }
+ },
+ {
+ "id": "max_drawdown",
+ "type": "Percentage",
+ "title": "Max Drawdown",
+ "value_key": "max_drawdown",
+ "position": {
+ "row": 0,
+ "col": 3
+ }
+ }
+ ],
+ "charts": [
+ {
+ "id": "equity_curve",
+ "type": "LineChart",
+ "title": "Equity Curve",
+ "data_key": "equity",
+ "position": {
+ "row": 1,
+ "col": 0
+ },
+ "config": {
+ "y_axis_label": "Value ($)"
+ }
+ },
+ {
+ "id": "drawdown",
+ "type": "LineChart",
+ "title": "Drawdown Chart",
+ "data_key": "drawdown",
+ "position": {
+ "row": 1,
+ "col": 1
+ },
+ "config": {
+ "y_axis_label": "Drawdown (%)",
+ "percentage_format": true
+ }
+ },
+ {
+ "id": "monthly_returns",
+ "type": "HeatmapTable",
+ "title": "Monthly Returns Heatmap",
+ "data_key": "monthly_returns",
+ "position": {
+ "row": 2,
+ "col": 0
+ },
+ "config": {}
+ },
+ {
+ "id": "rolling_sharpe",
+ "type": "LineChart",
+ "title": "Rolling Sharpe Ratio",
+ "data_key": "rolling_sharpe",
+ "position": {
+ "row": 2,
+ "col": 1
+ },
+ "config": {
+ "y_axis_label": "Sharpe Ratio",
+ "window_size": 252
+ }
+ }
+ ],
+ "layout": {
+ "max_cols": 2,
+ "title": "AlgoSystem Trading Dashboard"
+ }
+ }
\ No newline at end of file
diff --git a/algosystem/static/css/styles.css b/algosystem/static/css/styles.css
deleted file mode 100644
index 56aebc7..0000000
--- a/algosystem/static/css/styles.css
+++ /dev/null
@@ -1,184 +0,0 @@
-/* Main styles for the AlgoSystem Trading Dashboard */
-body {
- font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
- margin: 0;
- padding: 0;
- background-color: #f5f7fa;
- color: #333;
-}
-
-.container {
- max-width: 1200px;
- margin: 0 auto;
- padding: 20px;
-}
-
-.header {
- background-color: #2c3e50;
- color: white;
- padding: 20px;
- border-radius: 8px;
- margin-bottom: 20px;
- display: flex;
- justify-content: space-between;
- align-items: center;
-}
-
-.header h1 {
- margin: 0;
- font-size: 24px;
-}
-
-.date-range {
- font-size: 14px;
- opacity: 0.8;
-}
-
-/* Metric cards grid layout */
-.metrics-grid {
- display: grid;
- grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
- grid-gap: 20px;
- margin-bottom: 20px;
-}
-
-.metric-card {
- background-color: white;
- border-radius: 8px;
- padding: 20px;
- box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
-}
-
-.metric-title {
- font-size: 14px;
- color: #7f8c8d;
- margin-top: 0;
- margin-bottom: 10px;
-}
-
-.metric-value {
- font-size: 24px;
- font-weight: bold;
- margin: 0;
- color: #2c3e50;
-}
-
-.metric-value.positive {
- color: #27ae60;
-}
-
-.metric-value.negative {
- color: #e74c3c;
-}
-
-/* Chart containers */
-.chart-container {
- background-color: white;
- border-radius: 8px;
- padding: 20px;
- margin-bottom: 20px;
- box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
-}
-
-.chart-title {
- font-size: 18px;
- margin-top: 0;
- margin-bottom: 20px;
- color: #2c3e50;
-}
-
-/* Two-column layout for charts */
-.two-column {
- display: grid;
- grid-template-columns: 1fr 1fr;
- grid-gap: 20px;
-}
-
-@media (max-width: 768px) {
- .two-column {
- grid-template-columns: 1fr;
- }
-}
-
-/* Return statistics layout */
-.return-stats {
- display: grid;
- grid-template-columns: repeat(3, 1fr);
- grid-gap: 10px;
-}
-
-/* Tab navigation */
-.tab-container {
- margin-bottom: 20px;
-}
-
-.tabs {
- display: flex;
- border-bottom: 1px solid #ddd;
- margin-bottom: 15px;
-}
-
-.tab {
- padding: 10px 20px;
- cursor: pointer;
- border-bottom: 2px solid transparent;
-}
-
-.tab.active {
- border-bottom: 2px solid #3498db;
- font-weight: bold;
-}
-
-.tab-content {
- display: none;
-}
-
-.tab-content.active {
- display: block;
-}
-
-/* Monthly returns heatmap */
-.monthly-returns-table {
- width: 100%;
- border-collapse: collapse;
-}
-
-.monthly-returns-table th,
-.monthly-returns-table td {
- padding: 8px;
- text-align: center;
-}
-
-.monthly-returns-table th {
- font-weight: bold;
-}
-
-/* Loading state */
-.loading {
- display: flex;
- justify-content: center;
- align-items: center;
- height: 200px;
- font-size: 16px;
- color: #7f8c8d;
-}
-
-/* Mobile responsive adjustments */
-@media (max-width: 576px) {
- .metrics-grid {
- grid-template-columns: 1fr;
- }
-
- .return-stats {
- grid-template-columns: 1fr;
- }
-
- .header {
- flex-direction: column;
- align-items: flex-start;
- }
-
- .header > div:last-child {
- margin-top: 15px;
- }
-}
\ No newline at end of file
diff --git a/algosystem/static/js/script.js b/algosystem/static/js/script.js
deleted file mode 100644
index 1326d94..0000000
--- a/algosystem/static/js/script.js
+++ /dev/null
@@ -1,647 +0,0 @@
-// Main JavaScript file for the AlgoSystem Trading Dashboard
-
-// This will store all dashboard data
-let dashboardData = null;
-
-// Fetch the metrics data from the JSON file
-async function fetchDashboardData() {
- try {
- const response = await fetch('dashboard_data.json');
- if (!response.ok) {
- throw new Error(`HTTP error! status: ${response.status}`);
- }
- dashboardData = await response.json();
-
- // Update the dashboard with the data
- updateDashboard();
- } catch (error) {
- console.error('Error fetching dashboard data:', error);
- document.body.innerHTML = `
-
-
Error Loading Dashboard
-
Could not load dashboard data. Error: ${error.message}
-
Please make sure dashboard_data.json is available in the same directory.
-
-
`;
- }
-}
-
-// Update all dashboard elements with the data
-function updateDashboard() {
- if (!dashboardData) return;
-
- // Update header information
- document.getElementById('dateRange').textContent =
- `Backtest Period: ${dashboardData.startDate} - ${dashboardData.endDate}`;
-
- const finalReturn = document.getElementById('finalReturn');
- finalReturn.textContent =
- `${dashboardData.finalReturn > 0 ? '+' : ''}${dashboardData.finalReturn.toFixed(2)}%`;
- finalReturn.className = `metric-value ${dashboardData.finalReturn >= 0 ? 'positive' : 'negative'}`;
-
- // Update metrics
- updateMetrics();
-
- // Create charts
- createCharts();
-}
-
-// Update the metrics cards with data
-function updateMetrics() {
- const metrics = dashboardData.metrics;
-
- // Update each metric card
- if (metrics.annualized_return !== undefined) {
- const element = document.getElementById('annualizedReturn');
- element.textContent = `${metrics.annualized_return.toFixed(2)}%`;
- element.className = `metric-value ${metrics.annualized_return >= 0 ? 'positive' : 'negative'}`;
- }
-
- if (metrics.annualized_volatility !== undefined) {
- document.getElementById('annualizedVolatility').textContent =
- `${metrics.annualized_volatility.toFixed(2)}%`;
- }
-
- if (metrics.sharpe_ratio !== undefined) {
- document.getElementById('sharpeRatio').textContent =
- metrics.sharpe_ratio.toFixed(2);
- }
-
- if (metrics.sortino_ratio !== undefined) {
- document.getElementById('sortinoRatio').textContent =
- metrics.sortino_ratio.toFixed(2);
- }
-
- if (metrics.max_drawdown !== undefined) {
- document.getElementById('maxDrawdown').textContent =
- `${metrics.max_drawdown.toFixed(2)}%`;
- }
-
- if (metrics.calmar_ratio !== undefined) {
- document.getElementById('calmarRatio').textContent =
- metrics.calmar_ratio.toFixed(2);
- }
-
- if (metrics.alpha !== undefined) {
- const element = document.getElementById('alpha');
- element.textContent = `${metrics.alpha.toFixed(2)}%`;
- element.className = `metric-value ${metrics.alpha >= 0 ? 'positive' : 'negative'}`;
- }
-
- if (metrics.beta !== undefined) {
- document.getElementById('beta').textContent =
- metrics.beta.toFixed(2);
- }
-
- // Update trading statistics
- if (metrics.pct_positive_days !== undefined) {
- document.getElementById('winRate').textContent =
- `${metrics.pct_positive_days.toFixed(2)}%`;
- }
-
- if (metrics.best_month !== undefined) {
- document.getElementById('bestMonth').textContent =
- `+${metrics.best_month.toFixed(2)}%`;
- }
-
- if (metrics.worst_month !== undefined) {
- document.getElementById('worstMonth').textContent =
- `${metrics.worst_month.toFixed(2)}%`;
- }
-}
-
-// Create all charts for the dashboard
-function createCharts() {
- const timeSeries = dashboardData.timeSeries;
-
- // Helper function to parse dates
- const parseDates = (dateStrings) => dateStrings.map(d => new Date(d));
-
- // Create Equity Curve Chart
- if (timeSeries.equity_curve && timeSeries.benchmark_equity_curve) {
- const equityCurveCtx = document.getElementById('equityCurveChart').getContext('2d');
- new Chart(equityCurveCtx, {
- type: 'line',
- data: {
- labels: parseDates(timeSeries.equity_curve.dates),
- datasets: [
- {
- label: 'Strategy',
- data: timeSeries.equity_curve.values,
- borderColor: '#2ecc71',
- backgroundColor: 'rgba(46, 204, 113, 0.1)',
- fill: true,
- tension: 0.1
- },
- {
- label: 'Benchmark',
- data: timeSeries.benchmark_equity_curve.values,
- borderColor: '#3498db',
- backgroundColor: 'rgba(52, 152, 219, 0.1)',
- fill: true,
- tension: 0.1,
- borderDash: [5, 5]
- }
- ]
- },
- options: {
- responsive: true,
- plugins: {
- tooltip: {
- mode: 'index',
- intersect: false
- }
- },
- scales: {
- x: {
- type: 'time',
- time: {
- unit: 'month'
- }
- },
- y: {
- title: {
- display: true,
- text: 'Value ($)'
- }
- }
- }
- }
- });
- }
-
- // Create Drawdown Chart
- if (timeSeries.drawdown_series) {
- const drawdownCtx = document.getElementById('drawdownChart').getContext('2d');
- new Chart(drawdownCtx, {
- type: 'line',
- data: {
- labels: parseDates(timeSeries.drawdown_series.dates),
- datasets: [{
- label: 'Drawdown',
- data: timeSeries.drawdown_series.values,
- borderColor: '#e74c3c',
- backgroundColor: 'rgba(231, 76, 60, 0.1)',
- fill: true,
- tension: 0.1
- }]
- },
- options: {
- responsive: true,
- plugins: {
- tooltip: {
- mode: 'index',
- intersect: false
- }
- },
- scales: {
- x: {
- type: 'time',
- time: {
- unit: 'month'
- }
- },
- y: {
- title: {
- display: true,
- text: 'Drawdown (%)'
- },
- max: 0,
- min: Math.min(-5, Math.floor(dashboardData.metrics.max_drawdown)) // Dynamic minimum
- }
- }
- }
- });
- }
-
- // Create Relative Performance Chart
- if (timeSeries.relative_performance) {
- const relPerfCtx = document.getElementById('relativePerformanceChart').getContext('2d');
- new Chart(relPerfCtx, {
- type: 'line',
- data: {
- labels: parseDates(timeSeries.relative_performance.dates),
- datasets: [{
- label: 'Outperformance vs Benchmark',
- data: timeSeries.relative_performance.values,
- borderColor: '#9b59b6',
- backgroundColor: 'rgba(155, 89, 182, 0.1)',
- fill: true,
- tension: 0.1
- }]
- },
- options: {
- responsive: true,
- plugins: {
- tooltip: {
- mode: 'index',
- intersect: false
- }
- },
- scales: {
- x: {
- type: 'time',
- time: {
- unit: 'month'
- }
- },
- y: {
- title: {
- display: true,
- text: 'Relative Performance (%)'
- }
- }
- }
- }
- });
- }
-
- // Create Rolling Volatility Chart
- if (timeSeries.rolling_volatility) {
- const rollingVolCtx = document.getElementById('rollingVolatilityChart').getContext('2d');
- new Chart(rollingVolCtx, {
- type: 'line',
- data: {
- labels: parseDates(timeSeries.rolling_volatility.dates),
- datasets: [{
- label: '30-Day Rolling Volatility',
- data: timeSeries.rolling_volatility.values,
- borderColor: '#f39c12',
- backgroundColor: 'rgba(243, 156, 18, 0.1)',
- fill: true,
- tension: 0.1
- }]
- },
- options: {
- responsive: true,
- plugins: {
- tooltip: {
- mode: 'index',
- intersect: false
- }
- },
- scales: {
- x: {
- type: 'time',
- time: {
- unit: 'month'
- }
- },
- y: {
- title: {
- display: true,
- text: 'Volatility (%)'
- },
- min: 0
- }
- }
- }
- });
- }
-
- // Create Rolling Sharpe Chart
- if (timeSeries.rolling_sharpe) {
- const rollingSharpCtx = document.getElementById('rollingSharpChart').getContext('2d');
- new Chart(rollingSharpCtx, {
- type: 'line',
- data: {
- labels: parseDates(timeSeries.rolling_sharpe.dates),
- datasets: [{
- label: '60-Day Rolling Sharpe',
- data: timeSeries.rolling_sharpe.values,
- borderColor: '#1abc9c',
- backgroundColor: 'rgba(26, 188, 156, 0.1)',
- fill: true,
- tension: 0.1
- }]
- },
- options: {
- responsive: true,
- plugins: {
- tooltip: {
- mode: 'index',
- intersect: false
- }
- },
- scales: {
- x: {
- type: 'time',
- time: {
- unit: 'month'
- }
- },
- y: {
- title: {
- display: true,
- text: 'Sharpe Ratio'
- }
- }
- }
- }
- });
- }
-
- // Create Rolling VaR Chart
- if (timeSeries.rolling_var) {
- const rollingVarCtx = document.getElementById('rollingVarChart').getContext('2d');
- new Chart(rollingVarCtx, {
- type: 'line',
- data: {
- labels: parseDates(timeSeries.rolling_var.dates),
- datasets: [{
- label: '95% VaR (1-day)',
- data: timeSeries.rolling_var.values,
- borderColor: '#e67e22',
- backgroundColor: 'rgba(230, 126, 34, 0.1)',
- fill: true,
- tension: 0.1
- }]
- },
- options: {
- responsive: true,
- plugins: {
- tooltip: {
- mode: 'index',
- intersect: false
- }
- },
- scales: {
- x: {
- type: 'time',
- time: {
- unit: 'month'
- }
- },
- y: {
- title: {
- display: true,
- text: 'Value at Risk (%)'
- }
- }
- }
- }
- });
- }
-
- // Create Daily Returns Distribution
- if (timeSeries.daily_returns) {
- const dailyReturnsCtx = document.getElementById('dailyReturnsChart').getContext('2d');
-
- // Create histogram data from daily returns
- const returns = timeSeries.daily_returns.values;
- const binCount = 20;
- const min = Math.min(...returns);
- const max = Math.max(...returns);
- const binWidth = (max - min) / binCount;
-
- const bins = Array(binCount).fill(0);
- const binLabels = [];
-
- for (let i = 0; i < binCount; i++) {
- const binStart = min + i * binWidth;
- const binEnd = binStart + binWidth;
- binLabels.push(`${(binStart * 100).toFixed(2)}% to ${(binEnd * 100).toFixed(2)}%`);
- }
-
- returns.forEach(ret => {
- const binIndex = Math.min(binCount - 1, Math.floor((ret - min) / binWidth));
- bins[binIndex]++;
- });
-
- new Chart(dailyReturnsCtx, {
- type: 'bar',
- data: {
- labels: binLabels,
- datasets: [{
- label: 'Frequency',
- data: bins,
- backgroundColor: bins.map((_, i) => {
- const midpoint = i / binCount;
- if (midpoint < 0.4) return 'rgba(231, 76, 60, 0.7)'; // Red for negative returns
- if (midpoint > 0.6) return 'rgba(46, 204, 113, 0.7)'; // Green for positive returns
- return 'rgba(241, 196, 15, 0.7)'; // Yellow for near-zero returns
- })
- }]
- },
- options: {
- responsive: true,
- plugins: {
- tooltip: {
- callbacks: {
- label: function(context) {
- return `${context.raw} days`;
- }
- }
- }
- },
- scales: {
- x: {
- title: {
- display: true,
- text: 'Daily Return Range'
- }
- },
- y: {
- title: {
- display: true,
- text: 'Number of Days'
- }
- }
- }
- }
- });
- }
-
- // Create Rolling Returns Chart
- if (timeSeries.rolling_3m_returns && timeSeries.rolling_6m_returns && timeSeries.rolling_1y_returns) {
- const rollingReturnsCtx = document.getElementById('rollingReturnsChart').getContext('2d');
- new Chart(rollingReturnsCtx, {
- type: 'line',
- data: {
- labels: parseDates(timeSeries.rolling_3m_returns.dates),
- datasets: [
- {
- label: '3-Month',
- data: timeSeries.rolling_3m_returns.values,
- borderColor: '#3498db',
- tension: 0.1
- },
- {
- label: '6-Month',
- data: timeSeries.rolling_6m_returns.values,
- borderColor: '#9b59b6',
- tension: 0.1
- },
- {
- label: '1-Year',
- data: timeSeries.rolling_1y_returns.values,
- borderColor: '#2ecc71',
- tension: 0.1
- }
- ]
- },
- options: {
- responsive: true,
- plugins: {
- tooltip: {
- mode: 'index',
- intersect: false
- }
- },
- scales: {
- x: {
- type: 'time',
- time: {
- unit: 'month'
- }
- },
- y: {
- title: {
- display: true,
- text: 'Return (%)'
- }
- }
- }
- }
- });
- }
-
- // Create Monthly Returns Heatmap
- createMonthlyReturnsHeatmap();
-}
-
-// Create a Monthly Returns Heatmap
-function createMonthlyReturnsHeatmap() {
- const heatmapContainer = document.getElementById('monthlyReturnsHeatmap');
- if (!heatmapContainer) return;
-
- // Check if we have monthly returns data
- if (!dashboardData.timeSeries.monthly_returns) {
- heatmapContainer.innerHTML = 'Monthly returns data not available
';
- return;
- }
-
- heatmapContainer.innerHTML = '';
-
- // Create the heatmap table
- const table = document.createElement('table');
- table.className = 'monthly-returns-table';
-
- // Add header row with month names
- const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
- const headerRow = document.createElement('tr');
-
- // Empty cell for the corner
- const cornerCell = document.createElement('th');
- headerRow.appendChild(cornerCell);
-
- // Month headers
- months.forEach(month => {
- const th = document.createElement('th');
- th.textContent = month;
- headerRow.appendChild(th);
- });
-
- table.appendChild(headerRow);
-
- // Process the monthly returns data into a year/month format
- const monthlyReturns = dashboardData.timeSeries.monthly_returns;
-
- // Extract years from dates
- const years = [...new Set(monthlyReturns.dates.map(d => new Date(d).getFullYear()))].sort();
-
- // Create a row for each year
- years.forEach(year => {
- const row = document.createElement('tr');
-
- // Year cell
- const yearCell = document.createElement('td');
- yearCell.textContent = year;
- yearCell.style.fontWeight = 'bold';
- row.appendChild(yearCell);
-
- // Month cells
- for (let month = 0; month < 12; month++) {
- const td = document.createElement('td');
-
- // Find data for this year and month
- const index = monthlyReturns.dates.findIndex(d => {
- const date = new Date(d);
- return date.getFullYear() === year && date.getMonth() === month;
- });
-
- if (index !== -1) {
- const returnValue = monthlyReturns.values[index] * 100; // Convert to percentage
- td.textContent = returnValue.toFixed(1) + '%';
-
- // Color based on return value
- if (returnValue > 3) {
- td.style.backgroundColor = 'rgba(46, 204, 113, 0.8)';
- td.style.color = 'white';
- } else if (returnValue > 1) {
- td.style.backgroundColor = 'rgba(46, 204, 113, 0.5)';
- } else if (returnValue > 0) {
- td.style.backgroundColor = 'rgba(46, 204, 113, 0.2)';
- } else if (returnValue > -1) {
- td.style.backgroundColor = 'rgba(231, 76, 60, 0.2)';
- } else if (returnValue > -3) {
- td.style.backgroundColor = 'rgba(231, 76, 60, 0.5)';
- } else {
- td.style.backgroundColor = 'rgba(231, 76, 60, 0.8)';
- td.style.color = 'white';
- }
- } else {
- // If data isn't available for this month, show empty cell
- td.style.backgroundColor = '#f5f5f5';
- }
-
- row.appendChild(td);
- }
-
- table.appendChild(row);
- });
-
- heatmapContainer.appendChild(table);
-}
-
-// Tab switching functionality
-document.querySelectorAll('.tab').forEach(tab => {
- tab.addEventListener('click', () => {
- // Remove active class from all tabs
- document.querySelectorAll('.tab').forEach(t => {
- t.classList.remove('active');
- });
-
- // Add active class to clicked tab
- tab.classList.add('active');
-
- // Hide all tab content
- document.querySelectorAll('.tab-content').forEach(content => {
- content.classList.remove('active');
- });
-
- // Show selected tab content
- const tabId = tab.getAttribute('data-tab');
- document.getElementById(tabId).classList.add('active');
- });
-});
-
-// Check for mobile devices and adjust layout
-function checkMobile() {
- if (window.innerWidth < 768) {
- document.querySelectorAll('.metrics-grid').forEach(grid => {
- grid.style.gridTemplateColumns = '1fr';
- });
- } else {
- document.querySelectorAll('.metrics-grid').forEach(grid => {
- grid.style.gridTemplateColumns = 'repeat(auto-fill, minmax(280px, 1fr))';
- });
- }
-}
-
-// Run on load and on window resize
-window.addEventListener('load', checkMobile);
-window.addEventListener('resize', checkMobile);
-
-// Initialize the dashboard
-document.addEventListener('DOMContentLoaded', fetchDashboardData);
\ No newline at end of file
diff --git a/algosystem/utils/graph_config.json b/algosystem/utils/graph_config.json
index 8684c8f..2f49794 100644
--- a/algosystem/utils/graph_config.json
+++ b/algosystem/utils/graph_config.json
@@ -1,46 +1,102 @@
{
- "plots": [
- {
- "id": 2423685496048,
- "type": "Equity Curve",
- "title": "Equity Curve",
- "config": {},
- "position": {
- "row": 0,
- "col": 0
- }
+ "metrics": [
+ {
+ "id": "annual_return",
+ "type": "Percentage",
+ "title": "Annualized Return",
+ "value_key": "annual_return",
+ "position": {
+ "row": 0,
+ "col": 0
+ }
+ },
+ {
+ "id": "volatility",
+ "type": "Percentage",
+ "title": "Volatility",
+ "value_key": "volatility",
+ "position": {
+ "row": 0,
+ "col": 1
+ }
+ },
+ {
+ "id": "sharpe_ratio",
+ "type": "Value",
+ "title": "Sharpe Ratio",
+ "value_key": "sharpe_ratio",
+ "position": {
+ "row": 0,
+ "col": 2
+ }
+ },
+ {
+ "id": "max_drawdown",
+ "type": "Percentage",
+ "title": "Max Drawdown",
+ "value_key": "max_drawdown",
+ "position": {
+ "row": 0,
+ "col": 3
+ }
+ }
+ ],
+ "charts": [
+ {
+ "id": "equity_curve",
+ "type": "LineChart",
+ "title": "Equity Curve",
+ "data_key": "equity",
+ "position": {
+ "row": 1,
+ "col": 0
+ },
+ "config": {
+ "y_axis_label": "Value ($)"
+ }
+ },
+ {
+ "id": "drawdown",
+ "type": "LineChart",
+ "title": "Drawdown Chart",
+ "data_key": "drawdown",
+ "position": {
+ "row": 1,
+ "col": 1
},
- {
- "id": 2423686015376,
- "type": "Drawdown Chart",
- "title": "Drawdown Chart",
- "config": {},
- "position": {
- "row": 0,
- "col": 1
- }
+ "config": {
+ "y_axis_label": "Drawdown (%)",
+ "percentage_format": true
+ }
+ },
+ {
+ "id": "monthly_returns",
+ "type": "HeatmapTable",
+ "title": "Monthly Returns Heatmap",
+ "data_key": "monthly_returns",
+ "position": {
+ "row": 2,
+ "col": 0
},
- {
- "id": 2424164977552,
- "type": "Monthly Returns Heatmap",
- "title": "Monthly Returns Heatmap",
- "config": {},
- "position": {
- "row": 1,
- "col": 0
- }
+ "config": {}
+ },
+ {
+ "id": "rolling_sharpe",
+ "type": "LineChart",
+ "title": "Rolling Sharpe Ratio",
+ "data_key": "rolling_sharpe",
+ "position": {
+ "row": 2,
+ "col": 1
},
- {
- "id": 2424165098960,
- "type": "Rolling Sharpe Ratio",
- "title": "Rolling Sharpe Ratio",
- "config": {},
- "position": {
- "row": 1,
- "col": 1
- }
+ "config": {
+ "y_axis_label": "Sharpe Ratio",
+ "window_size": 252
}
+ }
],
- "max_cols": 2,
- "active_data_source": null
-}
\ No newline at end of file
+ "layout": {
+ "max_cols": 2,
+ "title": "AlgoSystem Trading Dashboard"
+ }
+ }
\ No newline at end of file
diff --git a/benchmark.csv b/benchmark.csv
index 7d388a5..af44f0c 100644
--- a/benchmark.csv
+++ b/benchmark.csv
@@ -1,1001 +1,1001 @@
,Benchmark
-2020-01-01,99.22140425033597
-2020-01-02,97.84838458960296
-2020-01-03,98.66577352387075
-2020-01-06,100.52283069424195
-2020-01-07,100.24868894466216
-2020-01-08,100.12937666669883
-2020-01-09,100.28752419014222
-2020-01-10,100.4733526542209
-2020-01-13,102.3800088426881
-2020-01-14,102.11703868701063
-2020-01-15,103.1228494980233
-2020-01-16,105.49052824998088
-2020-01-17,103.71991340015636
-2020-01-20,104.84096187199708
-2020-01-21,106.21186396505571
-2020-01-22,107.11376968363405
-2020-01-23,107.90893077779708
-2020-01-24,105.69914125409463
-2020-01-27,103.44228768347176
-2020-01-28,102.95630329927725
-2020-01-29,102.70227171384532
-2020-01-30,103.18077626286461
-2020-01-31,102.64537494177969
-2020-02-03,102.18974981667257
-2020-02-04,102.55436853893904
-2020-02-05,102.61824370232353
-2020-02-06,101.45476439414108
-2020-02-07,104.31807014943193
-2020-02-10,104.5731824873765
-2020-02-11,102.90012243077517
-2020-02-12,103.58177706568041
-2020-02-13,105.58871439404362
-2020-02-14,104.86446011140575
-2020-02-17,106.20871781565945
-2020-02-18,105.52958322722303
-2020-02-19,106.82639032041128
-2020-02-20,107.52642279451334
-2020-02-21,109.5545578824884
-2020-02-24,107.81486528092925
-2020-02-25,105.97273505675722
-2020-02-26,105.32415569661057
-2020-02-27,103.84317164318331
-2020-02-28,102.59420124882142
-2020-03-02,102.22741321481206
-2020-03-03,102.93281034032348
-2020-03-04,104.868391619484
-2020-03-05,101.56917266514769
-2020-03-06,102.2022729390353
-2020-03-09,102.12500608194918
-2020-03-10,103.23486230291357
-2020-03-11,104.10921008457834
-2020-03-12,104.71889045750495
-2020-03-13,106.44372146672623
-2020-03-16,105.28773025677923
-2020-03-17,104.39103525220918
-2020-03-18,102.96475508441438
-2020-03-19,103.15297323690773
-2020-03-20,103.39456136207855
-2020-03-23,102.41093688453404
-2020-03-24,103.60101134133409
-2020-03-25,103.07782668368459
-2020-03-26,103.71244549550968
-2020-03-27,101.88850197383661
-2020-03-30,101.49696112772372
-2020-03-31,102.17952379403192
-2020-04-01,103.7356579299075
-2020-04-02,104.94380649510342
-2020-04-03,105.22886223258969
-2020-04-06,105.79637097176018
-2020-04-07,104.9684950829244
-2020-04-08,105.1868069435373
-2020-04-09,105.30207967076204
-2020-04-10,105.98313858174923
-2020-04-13,105.11782989034862
-2020-04-14,105.26053249684296
-2020-04-15,106.64953102189143
-2020-04-16,104.94293315137125
-2020-04-17,105.66005822462876
-2020-04-20,105.15424633229864
-2020-04-21,104.71997025870081
-2020-04-22,105.76223392699535
-2020-04-23,105.7560669160941
-2020-04-24,102.79347685540698
-2020-04-27,104.07521231045722
-2020-04-28,102.87327005208007
-2020-04-29,102.96752088574502
-2020-04-30,102.26190297190823
-2020-05-01,102.66003307203879
-2020-05-04,103.26185455481607
-2020-05-05,105.28151135311145
-2020-05-06,103.75224482571824
-2020-05-07,103.74640555617356
-2020-05-08,102.9644256263962
-2020-05-11,103.05778109401007
-2020-05-12,103.78430348767978
-2020-05-13,105.3530758254175
-2020-05-14,105.01388158040552
-2020-05-15,105.0260001867829
-2020-05-18,105.7071205617382
-2020-05-19,103.25963989304938
-2020-05-20,101.90643310623688
-2020-05-21,103.46954867125302
-2020-05-22,102.96161143727613
-2020-05-25,101.46850739588461
-2020-05-26,101.04994902102919
-2020-05-27,102.74194775856755
-2020-05-28,99.89147195770411
-2020-05-29,100.9893987253444
-2020-06-01,101.3795859075032
-2020-06-02,102.14702644354846
-2020-06-03,102.71156826107968
-2020-06-04,103.58437087069481
-2020-06-05,101.21977225637923
-2020-06-08,101.37398295562932
-2020-06-09,101.29015605012826
-2020-06-10,103.68358677559586
-2020-06-11,103.13631275027151
-2020-06-12,104.07361804273192
-2020-06-15,104.02437699982782
-2020-06-16,103.4065621366709
-2020-06-17,105.76845753887855
-2020-06-18,105.92267488458322
-2020-06-19,104.43466740621909
-2020-06-22,104.30310730470629
-2020-06-23,103.62835188625574
-2020-06-24,103.56562184294589
-2020-06-25,103.67766495773942
-2020-06-26,102.32068945004345
-2020-06-29,103.32137825094034
-2020-06-30,102.42337982434053
-2020-07-01,102.37350561669012
-2020-07-02,103.59833817027398
-2020-07-03,102.3385854044558
-2020-07-06,102.78938026087339
-2020-07-07,103.20658465305175
-2020-07-08,104.21878731279031
-2020-07-09,104.25358431383167
-2020-07-10,105.0953146262444
-2020-07-13,105.76210442423779
-2020-07-14,104.60520067216936
-2020-07-15,105.7683838781101
-2020-07-16,106.8849311477785
-2020-07-17,106.53487468044005
-2020-07-20,105.3977879754994
-2020-07-21,105.45657948492169
-2020-07-22,106.68579441934457
-2020-07-23,105.99510509820189
-2020-07-24,107.34236020365306
-2020-07-27,107.13050207945136
-2020-07-28,108.11857624970536
-2020-07-29,107.83965854936139
-2020-07-30,106.58499038158176
-2020-07-31,105.61277387104562
-2020-08-03,107.43679748176065
-2020-08-04,107.94235716330675
-2020-08-05,107.04332087337134
-2020-08-06,108.45019245068582
-2020-08-07,107.16372729598422
-2020-08-10,104.61174710995351
-2020-08-11,106.35819918449378
-2020-08-12,105.67717821256406
-2020-08-13,106.05870936435657
-2020-08-14,106.43992076438961
-2020-08-17,105.5376467164703
-2020-08-18,106.30427432388892
-2020-08-19,107.6975113144766
-2020-08-20,108.19777800707801
-2020-08-21,108.53970752063998
-2020-08-24,107.44000592276662
-2020-08-25,109.80398063473828
-2020-08-26,110.2333958155836
-2020-08-27,107.40701150666104
-2020-08-28,105.68586523837595
-2020-08-31,105.06406154904948
-2020-09-01,106.80533092247666
-2020-09-02,107.32283743600604
-2020-09-03,106.97956635482649
-2020-09-04,108.34383883282686
-2020-09-07,108.00367227468995
-2020-09-08,110.311110815338
-2020-09-09,106.93050518087865
-2020-09-10,107.54832850231766
-2020-09-11,108.47280153792673
-2020-09-14,106.86070292214885
-2020-09-15,104.86794053222836
-2020-09-16,104.56136107410808
-2020-09-17,106.0149600672129
-2020-09-18,105.48904224207374
-2020-09-21,105.52069603943563
-2020-09-22,105.28627597386742
-2020-09-23,104.55564859224309
-2020-09-24,105.31391039258055
-2020-09-25,105.68518478564147
-2020-09-28,106.52804470526176
-2020-09-29,108.22818321960357
-2020-09-30,106.37928300394614
-2020-10-01,105.46804374679006
-2020-10-02,106.28876695415734
-2020-10-05,107.32286307722237
-2020-10-06,106.15766679527026
-2020-10-07,106.603497275037
-2020-10-08,106.38136244692278
-2020-10-09,107.97419418850178
-2020-10-12,107.82085379034069
-2020-10-13,109.512534733166
-2020-10-14,109.63042075305847
-2020-10-15,109.46304464558887
-2020-10-16,111.26647719722236
-2020-10-19,112.41989627160412
-2020-10-20,112.79383631889954
-2020-10-21,115.42860814639111
-2020-10-22,115.0716568518011
-2020-10-23,112.96284053566448
-2020-10-26,111.32433498244214
-2020-10-27,112.22300687110985
-2020-10-28,111.52757104566986
-2020-10-29,112.38381349822733
-2020-10-30,112.23063503997912
-2020-11-02,111.66588122899242
-2020-11-03,113.36100903977137
-2020-11-04,114.28659089473902
-2020-11-05,115.27976130705223
-2020-11-06,115.95330531761672
-2020-11-09,114.88454207477629
-2020-11-10,116.85178346252476
-2020-11-11,117.9390649527561
-2020-11-12,118.52299255630886
-2020-11-13,119.11715285906897
-2020-11-16,119.97739872039637
-2020-11-17,119.62551923674587
-2020-11-18,118.91702210399488
-2020-11-19,119.61359448645446
-2020-11-20,121.36518254351203
-2020-11-23,118.6315811660761
-2020-11-24,119.96146229993663
-2020-11-25,118.55890896929412
-2020-11-26,116.3602195728086
-2020-11-27,118.3628984372547
-2020-11-30,117.42891626070873
-2020-12-01,119.11307939178397
-2020-12-02,118.35420308765043
-2020-12-03,116.77041722875163
-2020-12-04,116.19259662319119
-2020-12-07,118.5374143066327
-2020-12-08,119.64052724916796
-2020-12-09,119.82027201742993
-2020-12-10,117.77691210135634
-2020-12-11,118.43724390236643
-2020-12-14,118.13809692753388
-2020-12-15,115.28367460127653
-2020-12-16,115.56307094121566
-2020-12-17,116.62976766283322
-2020-12-18,116.38694272560306
-2020-12-21,115.37810315491967
-2020-12-22,117.51370118430349
-2020-12-23,116.52949113362634
-2020-12-24,115.20910826093652
-2020-12-25,116.12471122424077
-2020-12-28,115.41796098382615
-2020-12-29,115.76143470125488
-2020-12-30,115.95746258236824
-2020-12-31,116.23113486744445
-2021-01-01,115.68348716044514
-2021-01-04,115.73663118604611
-2021-01-05,118.03526800962646
-2021-01-06,118.07941569781715
-2021-01-07,119.84912061400064
-2021-01-08,120.632783930529
-2021-01-11,121.09031568222457
-2021-01-12,122.28952602169119
-2021-01-13,123.28562101652525
-2021-01-14,124.3606087566715
-2021-01-15,126.2842667807322
-2021-01-18,126.53349720376548
-2021-01-19,125.1597772931791
-2021-01-20,124.99440915716275
-2021-01-21,124.12287891929685
-2021-01-22,125.59732553507584
-2021-01-25,125.73720372117721
-2021-01-26,123.95558182082347
-2021-01-27,124.10407366195788
-2021-01-28,125.46003740513567
-2021-01-29,125.55370011214899
-2021-02-01,126.42326182721091
-2021-02-02,126.91526694646807
-2021-02-03,129.532770668021
-2021-02-04,129.76457135525266
-2021-02-05,130.61062140361244
-2021-02-08,130.90157254007596
-2021-02-09,131.0620232610123
-2021-02-10,131.78043153430897
-2021-02-11,132.54765377499245
-2021-02-12,130.253964589323
-2021-02-15,130.1322814101103
-2021-02-16,129.46466513626706
-2021-02-17,129.47077585026938
-2021-02-18,125.65711266564283
-2021-02-19,125.86888120183102
-2021-02-22,124.91621544152618
-2021-02-23,122.18385546853392
-2021-02-24,123.62560648621665
-2021-02-25,124.69115344496262
-2021-02-26,125.96581609628421
-2021-03-01,125.60616067260308
-2021-03-02,125.25551698257603
-2021-03-03,124.29493807104225
-2021-03-04,127.52748578904722
-2021-03-05,125.92894505191398
-2021-03-08,127.59770078416966
-2021-03-09,125.32034055081782
-2021-03-10,125.26840564220065
-2021-03-11,125.8311780549494
-2021-03-12,126.30392724955706
-2021-03-15,124.95072821295314
-2021-03-16,128.35238869406547
-2021-03-17,130.26276833663402
-2021-03-18,129.18549177030602
-2021-03-19,129.6888327384172
-2021-03-22,129.2182917817037
-2021-03-23,131.1562648885446
-2021-03-24,130.81100090486663
-2021-03-25,130.48104239116577
-2021-03-26,130.19785389359453
-2021-03-29,130.462405887788
-2021-03-30,133.99827951778485
-2021-03-31,136.03497875543042
-2021-04-01,136.87864391929259
-2021-04-02,136.9831704278699
-2021-04-05,137.78199983047378
-2021-04-06,136.50410102630525
-2021-04-07,137.40791873361925
-2021-04-08,138.38495074705267
-2021-04-09,137.03944505079252
-2021-04-12,135.81230941279395
-2021-04-13,138.44529375606254
-2021-04-14,140.5076892771703
-2021-04-15,142.081489864982
-2021-04-16,146.02729643278985
-2021-04-19,145.88824257784273
-2021-04-20,145.43458502419946
-2021-04-21,148.8621362615833
-2021-04-22,149.38266318622345
-2021-04-23,149.7874041887111
-2021-04-26,148.7306605777684
-2021-04-27,148.21538842851382
-2021-04-28,149.6705590381976
-2021-04-29,148.05740322773363
-2021-04-30,149.2276364382074
-2021-05-03,149.545158353053
-2021-05-04,148.38353712675064
-2021-05-05,147.8947320562856
-2021-05-06,147.03021686525705
-2021-05-07,146.00120444747358
-2021-05-10,144.75040616451835
-2021-05-11,145.35830596687902
-2021-05-12,145.4986970510109
-2021-05-13,144.94369113802128
-2021-05-14,143.15803300592046
-2021-05-17,141.95818275300704
-2021-05-18,138.0904753465572
-2021-05-19,137.93020626426485
-2021-05-20,139.68408055468186
-2021-05-21,138.44255484853042
-2021-05-24,136.81444817270088
-2021-05-25,136.86151755471846
-2021-05-26,137.30838288703276
-2021-05-27,139.12501229013822
-2021-05-28,136.32464284707265
-2021-05-31,135.99210565954476
-2021-06-01,137.59584906484176
-2021-06-02,137.0552980893337
-2021-06-03,136.88230836718267
-2021-06-04,139.18022808320038
-2021-06-07,138.6822713152706
-2021-06-08,138.6144775475165
-2021-06-09,137.5465708123496
-2021-06-10,136.99161321831133
-2021-06-11,136.08246104967444
-2021-06-14,139.7471976071617
-2021-06-15,135.64666764914807
-2021-06-16,137.9872904404035
-2021-06-17,137.97867452103932
-2021-06-18,138.30537112283426
-2021-06-21,137.1261131876637
-2021-06-22,137.1639331864757
-2021-06-23,136.92917642071225
-2021-06-24,138.0055119359989
-2021-06-25,137.83899063171668
-2021-06-28,136.3825269268833
-2021-06-29,139.53092150296055
-2021-06-30,141.9769259595287
-2021-07-01,141.8336171136594
-2021-07-02,142.86901246115443
-2021-07-05,140.95669287012186
-2021-07-06,142.87525676039002
-2021-07-07,140.5495897098721
-2021-07-08,139.5215573537898
-2021-07-09,137.91378423862412
-2021-07-12,137.44326728102018
-2021-07-13,138.39308139497598
-2021-07-14,139.78533962257796
-2021-07-15,140.21232864047397
-2021-07-16,137.05684879796164
-2021-07-19,133.9399478026532
-2021-07-20,135.46878300733908
-2021-07-21,136.09130286157324
-2021-07-22,135.90737244795247
-2021-07-23,138.60996661951174
-2021-07-26,138.10440351257307
-2021-07-27,138.49151665335327
-2021-07-28,138.822172445874
-2021-07-29,140.5267310421297
-2021-07-30,140.8556795153327
-2021-08-02,142.310339849431
-2021-08-03,140.62152555680433
-2021-08-04,141.1654131515608
-2021-08-05,140.68691061806882
-2021-08-06,142.66156446542345
-2021-08-09,139.07639440185352
-2021-08-10,140.184094999209
-2021-08-11,142.51695286628004
-2021-08-12,146.05204590894826
-2021-08-13,145.9305395882594
-2021-08-16,145.58358009575707
-2021-08-17,143.83303402999067
-2021-08-18,142.74201885899046
-2021-08-19,142.12683762537816
-2021-08-20,141.86213072453234
-2021-08-23,144.60828808985517
-2021-08-24,145.85793107580446
-2021-08-25,146.21788939433833
-2021-08-26,146.08612514036474
-2021-08-27,144.74118190817532
-2021-08-30,144.59167789066524
-2021-08-31,142.13055459340285
-2021-09-01,139.7419537386364
-2021-09-02,140.9810620770975
-2021-09-03,140.9762239115945
-2021-09-06,141.74512704118328
-2021-09-07,140.99196516354243
-2021-09-08,142.13807013440018
-2021-09-09,141.33687188687605
-2021-09-10,138.3732793711246
-2021-09-13,140.1057321123215
-2021-09-14,137.78545128844473
-2021-09-15,137.4938293373593
-2021-09-16,139.02475970073885
-2021-09-17,138.11007166784702
-2021-09-20,136.4419893484931
-2021-09-21,134.22266821516516
-2021-09-22,133.44508552710354
-2021-09-23,135.23296361145287
-2021-09-24,138.48177752004875
-2021-09-27,137.78309214368866
-2021-09-28,135.35017967191183
-2021-09-29,133.96889792920172
-2021-09-30,135.2084186397563
-2021-10-01,135.01968866606487
-2021-10-04,139.20409777688002
-2021-10-05,137.81611429178855
-2021-10-06,139.75015480545204
-2021-10-07,139.30030684852363
-2021-10-08,139.1248963281783
-2021-10-11,139.28701091071025
-2021-10-12,142.56910568022383
-2021-10-13,143.57744531555727
-2021-10-14,144.73480191179507
-2021-10-15,145.04383544062875
-2021-10-18,147.88544723344899
-2021-10-19,148.73366168573284
-2021-10-20,149.4112566607525
-2021-10-21,148.44153109833147
-2021-10-22,147.81082129080082
-2021-10-25,145.95847338685755
-2021-10-26,143.39729415942602
-2021-10-27,142.54236544423011
-2021-10-28,138.98983788729714
-2021-10-29,138.5082921875457
-2021-11-01,138.97301134358236
-2021-11-02,138.3771994432178
-2021-11-03,138.73194882383515
-2021-11-04,139.02971834544823
-2021-11-05,141.84991868203505
-2021-11-08,141.85849147010086
-2021-11-09,140.7843275953645
-2021-11-10,140.19093422040885
-2021-11-11,141.04750209600024
-2021-11-12,140.51003934678025
-2021-11-15,141.79904115071852
-2021-11-16,143.83003955074844
-2021-11-17,146.21986394670856
-2021-11-18,149.02561749680075
-2021-11-19,149.62696257234472
-2021-11-22,147.82934382267385
-2021-11-23,148.44681192309343
-2021-11-24,151.60765178368746
-2021-11-25,151.47355191224224
-2021-11-26,151.7895042873425
-2021-11-29,153.58759041824183
-2021-11-30,152.00299234254993
-2021-12-01,151.73446142174313
-2021-12-02,153.28085595693815
-2021-12-03,153.7683349775816
-2021-12-06,153.22159994132437
-2021-12-07,153.76119412694067
-2021-12-08,152.58478599301276
-2021-12-09,153.1478941116409
-2021-12-10,151.7383379084021
-2021-12-13,152.26996387483763
-2021-12-14,151.82872302607626
-2021-12-15,156.1819237848615
-2021-12-16,154.62682615051384
-2021-12-17,156.95802165897362
-2021-12-20,155.93689903734642
-2021-12-21,158.2039119211116
-2021-12-22,161.45812012327528
-2021-12-23,161.1745793636623
-2021-12-24,161.05782993786272
-2021-12-27,155.2049983524158
-2021-12-28,157.83055679144167
-2021-12-29,159.84658069649674
-2021-12-30,157.33347990915115
-2021-12-31,158.21679109736624
-2022-01-03,159.48957472073067
-2022-01-04,158.07536717297356
-2022-01-05,156.27644066126237
-2022-01-06,157.98149172927666
-2022-01-07,159.38597286438008
-2022-01-10,157.79586118610106
-2022-01-11,160.17800322020886
-2022-01-12,160.78666501207607
-2022-01-13,158.99593578661876
-2022-01-14,161.22227246590472
-2022-01-17,166.48924904448577
-2022-01-18,162.28424265936252
-2022-01-19,163.82479128440758
-2022-01-20,164.72147788397174
-2022-01-21,166.20081313821157
-2022-01-24,167.80983286935168
-2022-01-25,165.17421754317155
-2022-01-26,161.87037411811318
-2022-01-27,164.10791450634792
-2022-01-28,165.2957473660669
-2022-01-31,162.09276297015037
-2022-02-01,164.6474192592848
-2022-02-02,159.88548497060145
-2022-02-03,157.8966746464551
-2022-02-04,159.5392744482951
-2022-02-07,158.71586100699594
-2022-02-08,157.1757358085854
-2022-02-09,155.70778675650075
-2022-02-10,153.8994515792374
-2022-02-11,154.1347146151082
-2022-02-14,153.88644336930108
-2022-02-15,157.54138997177827
-2022-02-16,157.2282215418383
-2022-02-17,156.5764993817669
-2022-02-18,155.45814147309463
-2022-02-21,155.6044052431052
-2022-02-22,155.57664498239083
-2022-02-23,153.94065605155149
-2022-02-24,152.65078154843889
-2022-02-25,152.67961474649076
-2022-02-28,153.86209716212318
-2022-03-01,154.46675032913964
-2022-03-02,153.63250696437197
-2022-03-03,155.84645925760574
-2022-03-04,155.29187799687088
-2022-03-07,156.07524763803906
-2022-03-08,155.4768385624453
-2022-03-09,157.4742596375646
-2022-03-10,157.0826639172136
-2022-03-11,153.41248623560674
-2022-03-14,157.58000037459038
-2022-03-15,157.13118956105885
-2022-03-16,158.56636829952262
-2022-03-17,161.38259424734377
-2022-03-18,162.21951503679708
-2022-03-21,160.74976329411183
-2022-03-22,157.5557824266427
-2022-03-23,155.29990097999553
-2022-03-24,155.9118704856974
-2022-03-25,154.92142301106077
-2022-03-28,152.61373706558226
-2022-03-29,153.1351792268738
-2022-03-30,153.22776778304114
-2022-03-31,150.9923306963147
-2022-04-01,152.33527510602005
-2022-04-04,154.1870960211724
-2022-04-05,153.85942213116078
-2022-04-06,151.94950090657764
-2022-04-07,154.75272512253483
-2022-04-08,152.0222626965824
-2022-04-11,152.1654919712044
-2022-04-12,149.8303731068464
-2022-04-13,149.954498048341
-2022-04-14,149.6029728277187
-2022-04-15,150.48848348854193
-2022-04-18,149.24178221119797
-2022-04-19,145.6395923882034
-2022-04-20,147.08057413286633
-2022-04-21,146.764703641565
-2022-04-22,147.09636995691022
-2022-04-25,146.56990168803554
-2022-04-26,147.9034797828061
-2022-04-27,146.06013959671273
-2022-04-28,144.83113216324176
-2022-04-29,144.08634979009034
-2022-05-02,145.39334163676924
-2022-05-03,147.58137812642116
-2022-05-04,149.35127825565198
-2022-05-05,151.6284654427399
-2022-05-06,152.89455894550562
-2022-05-09,155.66976279337962
-2022-05-10,154.66483839716565
-2022-05-11,159.221922743261
-2022-05-12,158.22633420152067
-2022-05-13,155.48829631817827
-2022-05-16,156.91503659973836
-2022-05-17,155.6238627839502
-2022-05-18,154.18440568116617
-2022-05-19,152.3546764537968
-2022-05-20,152.010940467939
-2022-05-23,153.0611983705364
-2022-05-24,155.40798323916485
-2022-05-25,157.53619671049773
-2022-05-26,157.0011877929036
-2022-05-27,156.71586359088593
-2022-05-30,155.64708719032328
-2022-05-31,154.83589680141463
-2022-06-01,151.7920923407624
-2022-06-02,152.12721895097079
-2022-06-03,152.76867965133366
-2022-06-06,152.4997398011023
-2022-06-07,151.80785856944536
-2022-06-08,151.0742152587646
-2022-06-09,153.8673269102192
-2022-06-10,154.87955946177388
-2022-06-13,154.50672279136833
-2022-06-14,153.50894785539785
-2022-06-15,152.7429490771083
-2022-06-16,153.9717775399979
-2022-06-17,153.45739911705942
-2022-06-20,152.95594643420594
-2022-06-21,151.88735080260415
-2022-06-22,150.58602222185647
-2022-06-23,151.25625880586855
-2022-06-24,148.96744563644165
-2022-06-27,150.12565741289842
-2022-06-28,149.76041867511702
-2022-06-29,150.37700117008015
-2022-06-30,151.41295344219907
-2022-07-01,150.70371237855758
-2022-07-04,152.4962577547739
-2022-07-05,150.3146557937062
-2022-07-06,150.73917703612395
-2022-07-07,148.77950029819274
-2022-07-08,144.74123273099346
-2022-07-11,142.39619459511806
-2022-07-12,141.85177759799518
-2022-07-13,143.71826310817698
-2022-07-14,147.3237767670324
-2022-07-15,146.36033327524316
-2022-07-18,146.2792598535708
-2022-07-19,147.62825114723375
-2022-07-20,146.2905611685952
-2022-07-21,146.27615655183058
-2022-07-22,143.3425948476813
-2022-07-25,139.96388019056826
-2022-07-26,139.3994061776239
-2022-07-27,137.87352827299165
-2022-07-28,137.87173052577845
-2022-07-29,135.6925276838354
-2022-08-01,133.4764601170562
-2022-08-02,134.08396165153323
-2022-08-03,137.6572060650333
-2022-08-04,141.52421844368902
-2022-08-05,142.96371043838627
-2022-08-08,143.89370885122997
-2022-08-09,146.060755515174
-2022-08-10,146.3002960401027
-2022-08-11,144.60360912918554
-2022-08-12,142.9932751822395
-2022-08-15,142.49193186705108
-2022-08-16,143.57595368183917
-2022-08-17,143.77895595366883
-2022-08-18,143.36534073430144
-2022-08-19,147.08248762056863
-2022-08-22,149.32012595151548
-2022-08-23,151.132626406228
-2022-08-24,152.36196421185326
-2022-08-25,155.32991442535942
-2022-08-26,159.56109842687644
-2022-08-29,163.61663025123133
-2022-08-30,167.46532770956998
-2022-08-31,169.5095749573437
-2022-09-01,168.08390636927888
-2022-09-02,170.33669770452659
-2022-09-05,166.27886393300406
-2022-09-06,164.0241256313164
-2022-09-07,161.00174196199723
-2022-09-08,159.66217514298236
-2022-09-09,161.69104938840775
-2022-09-12,163.11115040714137
-2022-09-13,162.8525747427424
-2022-09-14,161.4305203180373
-2022-09-15,163.38867766611222
-2022-09-16,165.32346692456093
-2022-09-19,165.5304986457962
-2022-09-20,160.68084147285916
-2022-09-21,162.90152913993137
-2022-09-22,163.2820203061998
-2022-09-23,164.722497336771
-2022-09-26,164.44897684512944
-2022-09-27,165.97064069821704
-2022-09-28,161.53040239186086
-2022-09-29,162.84009372963854
-2022-09-30,162.24687626733308
-2022-10-03,161.97562459024476
-2022-10-04,163.71048346732576
-2022-10-05,165.44845156712492
-2022-10-06,167.49960103561668
-2022-10-07,168.98199798401336
-2022-10-10,167.88923824543963
-2022-10-11,168.26794702785816
-2022-10-12,167.92839634717492
-2022-10-13,166.6134314142605
-2022-10-14,168.1199034828674
-2022-10-17,169.43935905881744
-2022-10-18,170.79189145729373
-2022-10-19,169.93887479946574
-2022-10-20,168.13724955226138
-2022-10-21,165.55024525524337
-2022-10-24,167.71046690774062
-2022-10-25,168.54766045101812
-2022-10-26,165.45970385373553
-2022-10-27,166.30671369550166
-2022-10-28,163.77929977204252
-2022-10-31,161.50058068487118
-2022-11-01,159.71432615526984
-2022-11-02,154.23906050606345
-2022-11-03,154.21300507448154
-2022-11-04,154.5639663230493
-2022-11-07,151.7080818165649
-2022-11-08,153.25726524383475
-2022-11-09,152.342371191868
-2022-11-10,153.89079939774643
-2022-11-11,154.2531086415062
-2022-11-14,154.42578809433982
-2022-11-15,154.99379764215627
-2022-11-16,156.17643027561672
-2022-11-17,155.41444643075258
-2022-11-18,153.64217899830922
-2022-11-21,153.74105793855026
-2022-11-22,153.41559257677798
-2022-11-23,152.87625867834248
-2022-11-24,155.10206459161876
-2022-11-25,157.07386488384975
-2022-11-28,156.2844108331991
-2022-11-29,153.99937439886816
-2022-11-30,154.56257935231866
-2022-12-01,154.02946878403344
-2022-12-02,152.59740690204592
-2022-12-05,150.72678271025458
-2022-12-06,148.8503900529083
-2022-12-07,146.29531256776087
-2022-12-08,145.12875471264374
-2022-12-09,143.7758149232168
-2022-12-12,144.46723063222814
-2022-12-13,148.4285057735582
-2022-12-14,147.87251162905198
-2022-12-15,146.00112916509102
-2022-12-16,147.12710251574828
-2022-12-19,147.64270242593804
-2022-12-20,147.86321433843244
-2022-12-21,148.99069595163644
-2022-12-22,151.5759275472779
-2022-12-23,151.3840442841964
-2022-12-26,150.1902725017095
-2022-12-27,148.1364472806788
-2022-12-28,146.12783083762605
-2022-12-29,146.79991000253943
-2022-12-30,149.73936089482547
-2023-01-02,151.04495648804297
-2023-01-03,147.83971577483857
-2023-01-04,148.1823086907268
-2023-01-05,150.7009339767803
-2023-01-06,150.1481187606042
-2023-01-09,152.19863089550697
-2023-01-10,152.96099068985288
-2023-01-11,151.20149662364574
-2023-01-12,151.78746280887412
-2023-01-13,152.8705367179022
-2023-01-16,157.48234726742592
-2023-01-17,159.29817071649245
-2023-01-18,161.4195555335567
-2023-01-19,159.4671038618748
-2023-01-20,157.07103925224786
-2023-01-23,160.84920821727923
-2023-01-24,160.05061414645024
-2023-01-25,158.8436008833294
-2023-01-26,160.08982175182095
-2023-01-27,162.27383554051374
-2023-01-30,161.68099438579517
-2023-01-31,164.90181704341873
-2023-02-01,162.94735675193945
-2023-02-02,161.63858413448247
-2023-02-03,160.88078617152175
-2023-02-06,162.06430324992218
-2023-02-07,160.51930673679234
-2023-02-08,155.7648902243846
-2023-02-09,152.87517235827409
-2023-02-10,150.021388470438
-2023-02-13,151.07461470485117
-2023-02-14,148.71366817459065
-2023-02-15,146.64327121519946
-2023-02-16,147.19495779327784
-2023-02-17,146.9850228230351
-2023-02-20,149.57093200653821
-2023-02-21,150.01083795350533
-2023-02-22,150.5699231735183
-2023-02-23,148.16352129341433
-2023-02-24,148.62297884345506
-2023-02-27,145.78940719521142
-2023-02-28,144.25740245778226
-2023-03-01,144.24491197033493
-2023-03-02,145.61567561209955
-2023-03-03,142.96807036956776
-2023-03-06,144.82930976980987
-2023-03-07,142.37121168916426
-2023-03-08,140.0675344718095
-2023-03-09,143.00822339811242
-2023-03-10,142.72222584573905
-2023-03-13,141.89373759344866
-2023-03-14,146.4399976514952
-2023-03-15,146.91725219339077
-2023-03-16,148.94085497673044
-2023-03-17,149.48034313233546
-2023-03-20,150.41077319306208
-2023-03-21,148.7551239131782
-2023-03-22,146.59886611040034
-2023-03-23,144.6568913668707
-2023-03-24,145.33661865233665
-2023-03-27,147.95009540059067
-2023-03-28,148.95101152159432
-2023-03-29,149.84617487496905
-2023-03-30,153.60183791004857
-2023-03-31,155.15164777624582
-2023-04-03,151.58878427255996
-2023-04-04,150.6339103429364
-2023-04-05,149.02065501859812
-2023-04-06,147.4479860645332
-2023-04-07,147.41001096932104
-2023-04-10,149.49778766768623
-2023-04-11,148.53704679945977
-2023-04-12,151.42790889190462
-2023-04-13,152.14682384253447
-2023-04-14,152.20603287449498
-2023-04-17,154.59468309548856
-2023-04-18,157.17881634364096
-2023-04-19,159.7020486171738
-2023-04-20,158.11045404909788
-2023-04-21,156.0970466013344
-2023-04-24,155.31687446006143
-2023-04-25,158.1969953340859
-2023-04-26,155.9899247859293
-2023-04-27,154.59025431581765
-2023-04-28,154.99091069831783
-2023-05-01,153.00441374989794
-2023-05-02,153.60063584155628
-2023-05-03,152.3883263320859
-2023-05-04,154.39807372162932
-2023-05-05,154.2303688399588
-2023-05-08,151.00196657895015
-2023-05-09,153.09172859625812
-2023-05-10,152.85482874835722
-2023-05-11,151.90765285229963
-2023-05-12,152.59161096214712
-2023-05-15,152.7248151598763
-2023-05-16,153.253224245044
-2023-05-17,153.12127345421044
-2023-05-18,153.2426386653409
-2023-05-19,150.84673271546146
-2023-05-22,152.37689046503
-2023-05-23,148.81306705408522
-2023-05-24,149.77183472875214
-2023-05-25,151.3142408918556
-2023-05-26,150.364513005112
-2023-05-29,149.39125115621297
-2023-05-30,148.7584596294977
-2023-05-31,149.27281167275947
-2023-06-01,151.38183092564012
-2023-06-02,149.3479800702181
-2023-06-05,151.98717150496853
-2023-06-06,154.3362639076767
-2023-06-07,154.8065650810542
-2023-06-08,154.5647640427515
-2023-06-09,151.0367586790359
-2023-06-12,150.97729471940463
-2023-06-13,149.55835584696027
-2023-06-14,150.72065536515484
-2023-06-15,152.68366819299922
-2023-06-16,153.2123824754658
-2023-06-19,152.0435211454033
-2023-06-20,152.0670528439284
-2023-06-21,150.04475281451298
-2023-06-22,147.74001153041218
-2023-06-23,147.4784156310284
-2023-06-26,148.25714026749048
-2023-06-27,148.0081346194863
-2023-06-28,146.46633923249232
-2023-06-29,146.25303044987177
-2023-06-30,145.68920452000592
-2023-07-03,146.5535665465175
-2023-07-04,145.68102917652277
-2023-07-05,145.26999869148412
-2023-07-06,148.5942159048766
-2023-07-07,151.8287289922331
-2023-07-10,150.4910023761106
-2023-07-11,151.76473848569444
-2023-07-12,153.54156754483017
-2023-07-13,150.36387299225274
-2023-07-14,149.7448284449084
-2023-07-17,150.82440003241987
-2023-07-18,150.72410941884596
-2023-07-19,149.48097391540486
-2023-07-20,146.79729070761357
-2023-07-21,148.95568341517637
-2023-07-24,147.5572496916775
-2023-07-25,149.42683111724332
-2023-07-26,149.21526565864298
-2023-07-27,148.94855765524815
-2023-07-28,152.02574279891215
-2023-07-31,151.36814617158035
-2023-08-01,148.70632588966996
-2023-08-02,152.99841019316221
-2023-08-03,154.95926333307406
-2023-08-04,153.9111502284755
-2023-08-07,150.74487546344866
-2023-08-08,150.91208918613518
-2023-08-09,152.5907657813715
-2023-08-10,153.2347330427395
-2023-08-11,149.58297968759885
-2023-08-14,145.46569817097847
-2023-08-15,146.23507299154429
-2023-08-16,149.41355069173085
-2023-08-17,147.97659947995476
-2023-08-18,146.8023016111197
-2023-08-21,145.79252686126702
-2023-08-22,144.07249183569078
-2023-08-23,145.3299558671373
-2023-08-24,145.98817567128745
-2023-08-25,146.05340403986676
-2023-08-28,145.53145159729024
-2023-08-29,146.8171532798474
-2023-08-30,143.089470258461
-2023-08-31,143.58709754990218
-2023-09-01,143.03821774464686
-2023-09-04,145.55322358116675
-2023-09-05,145.14087541857862
-2023-09-06,145.47346239845356
-2023-09-07,144.7964898725708
-2023-09-08,144.62940647096306
-2023-09-11,143.81266677602912
-2023-09-12,144.78809388682896
-2023-09-13,146.5614197820804
-2023-09-14,146.4305859817037
-2023-09-15,148.82635082007815
-2023-09-18,148.6055946637589
-2023-09-19,146.56220486635686
-2023-09-20,148.41333713495385
-2023-09-21,146.97882578500273
-2023-09-22,146.79530213577027
-2023-09-25,145.50415437064714
-2023-09-26,144.4925222607878
-2023-09-27,143.89167712510778
-2023-09-28,142.3660152377865
-2023-09-29,142.06681659073837
-2023-10-02,143.35790419478954
-2023-10-03,144.9071654870919
-2023-10-04,145.61339578628804
-2023-10-05,146.01154598608633
-2023-10-06,143.80057893558447
-2023-10-09,144.02145005028333
-2023-10-10,143.11149212150937
-2023-10-11,143.3154990610562
-2023-10-12,142.88759350916897
-2023-10-13,140.044571662969
-2023-10-16,140.63373474526378
-2023-10-17,141.79069397256947
-2023-10-18,141.01418789992692
-2023-10-19,139.23730534060937
-2023-10-20,140.10247222063367
-2023-10-23,140.66264851967142
-2023-10-24,141.42460286838636
-2023-10-25,141.99345523462114
-2023-10-26,143.1764539741685
-2023-10-27,143.49571237510713
-2023-10-30,142.27148272510618
-2023-10-31,143.1247230421164
+2020-01-01,99.94769834747017
+2020-01-02,99.03556855900923
+2020-01-03,98.87517573883984
+2020-01-06,98.66528076313948
+2020-01-07,99.19543944392255
+2020-01-08,99.66667137224047
+2020-01-09,102.12942047072208
+2020-01-10,102.04304477970894
+2020-01-13,102.33215013347001
+2020-01-14,104.15812875056976
+2020-01-15,103.1433404829754
+2020-01-16,105.02328193411574
+2020-01-17,105.92203725053619
+2020-01-20,106.96084260359207
+2020-01-21,106.53451108992886
+2020-01-22,105.81031294194574
+2020-01-23,105.19512212925957
+2020-01-24,103.48895702409766
+2020-01-27,103.08392058880071
+2020-01-28,103.54350073608587
+2020-01-29,102.11048687823944
+2020-01-30,102.21390797983263
+2020-01-31,103.16097164397307
+2020-02-03,104.2247918509163
+2020-02-04,104.41794573127387
+2020-02-05,106.16798017798983
+2020-02-06,108.24365784838295
+2020-02-07,105.11707058513235
+2020-02-10,106.52563499696876
+2020-02-11,103.2613067765017
+2020-02-12,105.59217202091166
+2020-02-13,107.69280468460414
+2020-02-14,107.16304531603083
+2020-02-17,108.82187033880196
+2020-02-18,108.02924406791558
+2020-02-19,109.62708196740336
+2020-02-20,106.62006613360144
+2020-02-21,107.03684898116741
+2020-02-24,108.0652247204088
+2020-02-25,109.48150842664243
+2020-02-26,111.54241957504097
+2020-02-27,112.26380300883135
+2020-02-28,112.57662343458661
+2020-03-02,111.91914234860958
+2020-03-03,111.51978549851466
+2020-03-04,109.212148373132
+2020-03-05,109.84402514924194
+2020-03-06,110.35583264509792
+2020-03-09,110.41510849681757
+2020-03-10,110.67093512387633
+2020-03-11,112.47117833248336
+2020-03-12,114.29954605252031
+2020-03-13,114.64380808863459
+2020-03-16,112.94228704982126
+2020-03-17,111.99515675055432
+2020-03-18,113.06848232286033
+2020-03-19,112.2122388401387
+2020-03-20,111.22953722968457
+2020-03-23,109.67139281719489
+2020-03-24,109.40280245380738
+2020-03-25,108.74126477973365
+2020-03-26,107.45874757247633
+2020-03-27,110.23443557503643
+2020-03-30,110.94602750808093
+2020-03-31,112.40689645831627
+2020-04-01,111.23393576581108
+2020-04-02,112.13916454550005
+2020-04-03,113.53278267083292
+2020-04-06,114.99288684884048
+2020-04-07,114.25720073270573
+2020-04-08,114.04350788801861
+2020-04-09,112.62357513881871
+2020-04-10,113.5261410402036
+2020-04-13,114.47855991406595
+2020-04-14,113.11982422245617
+2020-04-15,113.6896550783565
+2020-04-16,115.51809275119334
+2020-04-17,114.13277304545855
+2020-04-20,113.17427378492602
+2020-04-21,113.86479868677036
+2020-04-22,115.49509574791064
+2020-04-23,115.27015696643501
+2020-04-24,116.5625224083729
+2020-04-27,115.07097289365737
+2020-04-28,114.26469333188838
+2020-04-29,116.42344997689196
+2020-04-30,116.8053799342828
+2020-05-01,116.72492751499996
+2020-05-04,115.6060742018288
+2020-05-05,114.52256822535594
+2020-05-06,114.722733795364
+2020-05-07,114.28980507489584
+2020-05-08,113.91743730243303
+2020-05-11,113.81994920788065
+2020-05-12,114.23024259213412
+2020-05-13,112.24333139130256
+2020-05-14,111.76513393052694
+2020-05-15,111.02080435802466
+2020-05-18,110.66577528692285
+2020-05-19,112.61408029410545
+2020-05-20,112.57211346689893
+2020-05-21,111.01021718136224
+2020-05-22,112.35086591114664
+2020-05-25,112.65404304463618
+2020-05-26,114.30182603987103
+2020-05-27,114.13192864969548
+2020-05-28,114.75834666619649
+2020-05-29,113.50492114681249
+2020-06-01,110.9763404325866
+2020-06-02,110.90421395143018
+2020-06-03,108.89622556091638
+2020-06-04,107.01009387655648
+2020-06-05,108.07577819562768
+2020-06-08,108.09174420092324
+2020-06-09,110.27885181218939
+2020-06-10,109.66980042272428
+2020-06-11,110.33658212655779
+2020-06-12,109.97566449679009
+2020-06-15,108.99043085723234
+2020-06-16,110.72884384278261
+2020-06-17,112.26077423283778
+2020-06-18,112.06956539680091
+2020-06-19,111.59073881505496
+2020-06-22,111.21733173787672
+2020-06-23,113.47120257310839
+2020-06-24,113.92263854577713
+2020-06-25,114.62689561855053
+2020-06-26,115.363462825898
+2020-06-29,116.11026083748999
+2020-06-30,116.36784251584191
+2020-07-01,116.73243358605374
+2020-07-02,117.84698719508076
+2020-07-03,116.98647328845229
+2020-07-06,117.87281807578813
+2020-07-07,118.49117200225336
+2020-07-08,117.75840148828314
+2020-07-09,118.3584742982309
+2020-07-10,117.56291558775547
+2020-07-13,118.18857855075231
+2020-07-14,116.06220043443354
+2020-07-15,117.9368970406057
+2020-07-16,118.43240143467919
+2020-07-17,117.83375478592009
+2020-07-20,117.66405108250457
+2020-07-21,119.83795207082485
+2020-07-22,120.6106630136246
+2020-07-23,119.79477919135921
+2020-07-24,116.98364125264816
+2020-07-27,117.20897834743703
+2020-07-28,119.26117916704753
+2020-07-29,118.45446803109705
+2020-07-30,120.92374835877142
+2020-07-31,121.29999673197327
+2020-08-03,120.65289184208432
+2020-08-04,120.23270856216801
+2020-08-05,118.0617683069319
+2020-08-06,118.15761325870619
+2020-08-07,120.64538533303428
+2020-08-10,119.42719804055825
+2020-08-11,118.76713034102315
+2020-08-12,117.01376639342746
+2020-08-13,116.93593094118849
+2020-08-14,116.12935327730676
+2020-08-17,118.02306385830109
+2020-08-18,119.00729382467632
+2020-08-19,118.28241941567816
+2020-08-20,118.45916971171408
+2020-08-21,117.65702242120575
+2020-08-24,120.17824122523899
+2020-08-25,121.14207940374013
+2020-08-26,122.42474074676264
+2020-08-27,123.0412379173625
+2020-08-28,122.14334473808772
+2020-08-31,123.27400826963428
+2020-09-01,123.07555316083203
+2020-09-02,124.44222816126711
+2020-09-03,125.8427030029238
+2020-09-04,124.44212630838838
+2020-09-07,124.157830539015
+2020-09-08,123.81986516714412
+2020-09-09,122.7238537294455
+2020-09-10,122.80484391808073
+2020-09-11,123.8141115216949
+2020-09-14,124.87526822266545
+2020-09-15,123.45013952904826
+2020-09-16,123.4891422003357
+2020-09-17,123.45026547309222
+2020-09-18,122.55403644804382
+2020-09-21,121.84635986572093
+2020-09-22,121.4959736419531
+2020-09-23,121.824102924525
+2020-09-24,120.61920661659047
+2020-09-25,120.64560176687505
+2020-09-28,122.59122950527146
+2020-09-29,120.59393124374316
+2020-09-30,124.5905487832661
+2020-10-01,122.97319776027804
+2020-10-02,123.44880193544259
+2020-10-05,122.16310381720193
+2020-10-06,122.78523745722406
+2020-10-07,123.96898738735402
+2020-10-08,124.49728646697118
+2020-10-09,128.05639609170217
+2020-10-12,127.38294745138576
+2020-10-13,127.88534522388026
+2020-10-14,129.877164226663
+2020-10-15,129.0573764701256
+2020-10-16,125.05015371568126
+2020-10-19,128.20199246077848
+2020-10-20,127.09623595197547
+2020-10-21,126.08443095068932
+2020-10-22,127.21759302560262
+2020-10-23,128.0184365496236
+2020-10-26,129.20965521094476
+2020-10-27,129.0088066193885
+2020-10-28,128.14759729224687
+2020-10-29,127.70192070002302
+2020-10-30,127.52283888693484
+2020-11-02,126.7969432845037
+2020-11-03,127.30148107403699
+2020-11-04,128.38144613350545
+2020-11-05,130.10555918429577
+2020-11-06,128.263263347391
+2020-11-09,128.93269593956657
+2020-11-10,128.82240894419616
+2020-11-11,127.90204179355572
+2020-11-12,127.56756134422224
+2020-11-13,128.0007422232055
+2020-11-16,129.64200157069868
+2020-11-17,127.35008629202275
+2020-11-18,127.28197276517506
+2020-11-19,127.07859806790329
+2020-11-20,126.61960237584286
+2020-11-23,125.88568815520287
+2020-11-24,126.17026077260283
+2020-11-25,126.96317158587087
+2020-11-26,125.35997105572312
+2020-11-27,125.57238920234784
+2020-11-30,125.08873182352454
+2020-12-01,125.08513383841728
+2020-12-02,126.42059042672045
+2020-12-03,126.10519510277767
+2020-12-04,129.2754999327788
+2020-12-07,127.7402982591979
+2020-12-08,126.85714244744615
+2020-12-09,128.25566332379356
+2020-12-10,127.95229156319574
+2020-12-11,130.58416336294195
+2020-12-14,129.62897307560843
+2020-12-15,130.35538123964335
+2020-12-16,130.65716002662114
+2020-12-17,131.05266768956054
+2020-12-18,130.01909151778403
+2020-12-21,129.49591211510477
+2020-12-22,130.26973056407883
+2020-12-23,128.30887068354792
+2020-12-24,128.45763744232593
+2020-12-25,128.26686300842118
+2020-12-28,127.9134565538985
+2020-12-29,126.25005941248699
+2020-12-30,125.18073558620324
+2020-12-31,125.00414963279593
+2021-01-01,121.87541611029762
+2021-01-04,122.33229848042531
+2021-01-05,122.61255242642281
+2021-01-06,121.81050464744816
+2021-01-07,123.27672584149903
+2021-01-08,123.37304276382876
+2021-01-11,123.48598765914434
+2021-01-12,124.6236279999276
+2021-01-13,124.83262846834904
+2021-01-14,124.7436111251845
+2021-01-15,124.6161895065623
+2021-01-18,124.19192650690731
+2021-01-19,124.08957687501518
+2021-01-20,124.115445145353
+2021-01-21,123.81562137109015
+2021-01-22,122.6502181636327
+2021-01-25,120.55961896339707
+2021-01-26,121.6538446457086
+2021-01-27,120.80821420069118
+2021-01-28,122.78225608582814
+2021-01-29,123.20606771497673
+2021-02-01,124.49557905361893
+2021-02-02,126.92126640112487
+2021-02-03,127.2327809219064
+2021-02-04,127.546946974746
+2021-02-05,129.61244169975333
+2021-02-08,132.29458235315013
+2021-02-09,133.13371603241288
+2021-02-10,132.77203611215378
+2021-02-11,134.18771439085427
+2021-02-12,133.57064658706582
+2021-02-15,131.40708880202465
+2021-02-16,132.83471671999266
+2021-02-17,132.2708622570931
+2021-02-18,136.82087711741198
+2021-02-19,137.28836820437076
+2021-02-22,136.70691034766253
+2021-02-23,135.69547943254747
+2021-02-24,132.92297904955322
+2021-02-25,132.26576752468608
+2021-02-26,132.81575215733125
+2021-03-01,132.43072026016097
+2021-03-02,132.2662027432327
+2021-03-03,132.5596781374846
+2021-03-04,131.8834792083551
+2021-03-05,132.49962854755324
+2021-03-08,131.5096891721341
+2021-03-09,131.31975466084268
+2021-03-10,130.1274198377225
+2021-03-11,129.27582347738417
+2021-03-12,130.4614824887977
+2021-03-15,132.82233133463245
+2021-03-16,131.6840877035282
+2021-03-17,131.9661165750516
+2021-03-18,134.4339472848585
+2021-03-19,133.8924816003738
+2021-03-22,134.0713364099501
+2021-03-23,133.10410115019988
+2021-03-24,132.92672360056963
+2021-03-25,134.7145174747434
+2021-03-26,134.81624181497423
+2021-03-29,134.705960649773
+2021-03-30,134.63845718138174
+2021-03-31,133.77595369001122
+2021-04-01,133.1896872768306
+2021-04-02,133.72819774379835
+2021-04-05,137.831172242378
+2021-04-06,137.24224665414414
+2021-04-07,135.13295688989703
+2021-04-08,136.1537029853025
+2021-04-09,135.16815312753516
+2021-04-12,136.11296254434683
+2021-04-13,136.10687001903094
+2021-04-14,135.7038787168886
+2021-04-15,135.5907140641187
+2021-04-16,137.29032418301955
+2021-04-19,137.0034085199851
+2021-04-20,137.35269580993267
+2021-04-21,138.11012976542014
+2021-04-22,137.69321334806563
+2021-04-23,140.77661464013912
+2021-04-26,139.86601189282305
+2021-04-27,140.51754346183753
+2021-04-28,139.11541394435687
+2021-04-29,140.5517386460855
+2021-04-30,138.55774267424928
+2021-05-03,140.3205582346983
+2021-05-04,139.69917933593047
+2021-05-05,143.50242281160718
+2021-05-06,145.526602768246
+2021-05-07,147.2419484177623
+2021-05-10,148.79339583586048
+2021-05-11,149.29535274976206
+2021-05-12,150.3745904952542
+2021-05-13,149.76911982858635
+2021-05-14,152.33547620318384
+2021-05-17,151.8627758361731
+2021-05-18,152.1132638702194
+2021-05-19,151.69664370630923
+2021-05-20,153.09327534031922
+2021-05-21,152.65226399710664
+2021-05-24,153.88890413543643
+2021-05-25,155.21550542352819
+2021-05-26,157.04193066655878
+2021-05-27,156.0619405414243
+2021-05-28,154.31127816966642
+2021-05-31,156.20423928442486
+2021-06-01,159.47314560297804
+2021-06-02,160.2181451091409
+2021-06-03,158.62557970013918
+2021-06-04,161.86956830459152
+2021-06-07,162.68160231798237
+2021-06-08,162.40152628506291
+2021-06-09,163.88870676370138
+2021-06-10,162.66320161667596
+2021-06-11,159.79953726096778
+2021-06-14,159.5554935300801
+2021-06-15,159.71317273111038
+2021-06-16,161.49420833205522
+2021-06-17,165.63807674728722
+2021-06-18,167.096176688272
+2021-06-21,169.14100824557934
+2021-06-22,165.35635892014304
+2021-06-23,167.74058113513374
+2021-06-24,167.1956146644261
+2021-06-25,167.71049147376266
+2021-06-28,167.91574358139025
+2021-06-29,168.9825355923067
+2021-06-30,170.3161913582764
+2021-07-01,167.71466785598193
+2021-07-02,168.84758205998372
+2021-07-05,169.6822676179083
+2021-07-06,168.0149922415541
+2021-07-07,165.1180060009724
+2021-07-08,164.0779637118287
+2021-07-09,160.95438764201143
+2021-07-12,159.1791183770496
+2021-07-13,157.96837422984882
+2021-07-14,158.03500727759726
+2021-07-15,158.5948408228088
+2021-07-16,158.12302648998852
+2021-07-19,159.26178721791737
+2021-07-20,161.35633141892086
+2021-07-21,160.1906987543662
+2021-07-22,160.51079470387975
+2021-07-23,160.36120313378507
+2021-07-26,161.93382940526314
+2021-07-27,160.02404998054348
+2021-07-28,159.3568819150608
+2021-07-29,157.6517938301976
+2021-07-30,157.548144030237
+2021-08-02,157.58928135589932
+2021-08-03,157.1264903298043
+2021-08-04,157.5750608177031
+2021-08-05,157.67535478759746
+2021-08-06,159.11358012702266
+2021-08-09,158.55092235979657
+2021-08-10,156.35303198149165
+2021-08-11,156.0808475793678
+2021-08-12,157.62197177634803
+2021-08-13,158.18211819238277
+2021-08-16,158.01190296117943
+2021-08-17,157.21475515332887
+2021-08-18,160.0804347917257
+2021-08-19,159.47663434881946
+2021-08-20,159.63497490142183
+2021-08-23,158.63005858534876
+2021-08-24,159.763146387941
+2021-08-25,160.17761825578475
+2021-08-26,161.34151588850435
+2021-08-27,162.2256941129335
+2021-08-30,162.03185897214505
+2021-08-31,164.43428414384854
+2021-09-01,165.13140800354276
+2021-09-02,162.78670552872885
+2021-09-03,163.59453953251034
+2021-09-06,165.03819446472085
+2021-09-07,164.97150687288428
+2021-09-08,165.01484616345167
+2021-09-09,164.84860699517316
+2021-09-10,164.7380139692866
+2021-09-13,166.13652274087534
+2021-09-14,167.87886265478596
+2021-09-15,165.45642004772688
+2021-09-16,162.36138991079594
+2021-09-17,160.32777340340422
+2021-09-20,161.12061336379602
+2021-09-21,165.33095658702806
+2021-09-22,167.39585737482764
+2021-09-23,170.91242746464278
+2021-09-24,167.41932073447825
+2021-09-27,170.5571105384008
+2021-09-28,168.53125266242662
+2021-09-29,164.18047850319414
+2021-09-30,161.4461336097303
+2021-10-01,161.55567898789994
+2021-10-04,158.46033345346368
+2021-10-05,157.32506132601003
+2021-10-06,160.21209547399778
+2021-10-07,160.6878282885183
+2021-10-08,159.3818843255394
+2021-10-11,158.82306000863306
+2021-10-12,157.48418834608322
+2021-10-13,157.34140498872145
+2021-10-14,156.03283250675753
+2021-10-15,157.8936717258126
+2021-10-18,156.6427604711636
+2021-10-19,161.02488230716364
+2021-10-20,161.98224740973302
+2021-10-21,163.80359042931238
+2021-10-22,163.09977404230503
+2021-10-25,163.40440581176458
+2021-10-26,163.09647289009263
+2021-10-27,162.23663719571078
+2021-10-28,160.19806175538847
+2021-10-29,163.53248538320878
+2021-11-01,164.10946167500202
+2021-11-02,163.14551982976806
+2021-11-03,164.8095389585475
+2021-11-04,168.5056434170168
+2021-11-05,165.08431115678763
+2021-11-08,166.1564378960855
+2021-11-09,166.08307602855356
+2021-11-10,165.44012544586082
+2021-11-11,166.01919905987964
+2021-11-12,169.87716399433697
+2021-11-15,168.01598883593314
+2021-11-16,165.48094081569076
+2021-11-17,161.2617930795925
+2021-11-18,160.13651280395266
+2021-11-19,161.3559838526236
+2021-11-22,159.85707362071568
+2021-11-23,159.3627222835076
+2021-11-24,159.37218813271926
+2021-11-25,158.93438630917407
+2021-11-26,159.70445701767264
+2021-11-29,163.73779215404335
+2021-11-30,162.61518874139293
+2021-12-01,163.2402591515206
+2021-12-02,163.57260967152004
+2021-12-03,163.14918755778766
+2021-12-06,163.89583177417063
+2021-12-07,166.78875247810498
+2021-12-08,169.71277503564872
+2021-12-09,169.32975803544826
+2021-12-10,174.06462694879556
+2021-12-13,178.2782539038734
+2021-12-14,175.12611499712597
+2021-12-15,174.9707571411172
+2021-12-16,174.64638789499477
+2021-12-17,173.33509977019352
+2021-12-20,174.7621396821248
+2021-12-21,175.7594926935831
+2021-12-22,175.76207177921304
+2021-12-23,178.7806207862196
+2021-12-24,176.50233910208988
+2021-12-27,175.5539039058268
+2021-12-28,176.4756040869069
+2021-12-29,175.52486576739113
+2021-12-30,175.0366084854268
+2021-12-31,177.64913615088443
+2022-01-03,178.99725270128343
+2022-01-04,176.89172555065537
+2022-01-05,178.1027665492858
+2022-01-06,178.95373744805417
+2022-01-07,184.21111705709245
+2022-01-10,181.38355066588994
+2022-01-11,183.22238542597614
+2022-01-12,181.19699459262256
+2022-01-13,178.27078515293914
+2022-01-14,177.0356365353876
+2022-01-17,176.2379873335346
+2022-01-18,174.59982560287145
+2022-01-19,171.2976649408938
+2022-01-20,172.55435391153736
+2022-01-21,173.59126135765342
+2022-01-24,170.54244130066286
+2022-01-25,172.08618512365095
+2022-01-26,171.72006816009494
+2022-01-27,172.92710864259456
+2022-01-28,169.85688510329146
+2022-01-31,172.69415682369254
+2022-02-01,170.95409556906077
+2022-02-02,170.7680797796316
+2022-02-03,170.4506359038402
+2022-02-04,171.64914797027427
+2022-02-07,169.7943919006658
+2022-02-08,167.72158853864994
+2022-02-09,168.4770851870131
+2022-02-10,170.79190886850117
+2022-02-11,173.62475222920156
+2022-02-14,171.12717296647466
+2022-02-15,170.6845375622248
+2022-02-16,170.43687151452446
+2022-02-17,170.8678446022056
+2022-02-18,172.01770126968285
+2022-02-21,168.45427846011933
+2022-02-22,169.28526250108456
+2022-02-23,171.30046031080542
+2022-02-24,167.9598763727424
+2022-02-25,166.32553392118413
+2022-02-28,165.47625475749484
+2022-03-01,168.1292902729369
+2022-03-02,167.85777644157116
+2022-03-03,170.07685644375712
+2022-03-04,170.07195084394507
+2022-03-07,171.5518251188756
+2022-03-08,170.35206863744895
+2022-03-09,166.49516830490649
+2022-03-10,163.62994500879174
+2022-03-11,164.05488207463299
+2022-03-14,165.26664226627858
+2022-03-15,162.26640239056928
+2022-03-16,158.9625420584677
+2022-03-17,159.80969055098893
+2022-03-18,158.75852883646232
+2022-03-21,158.76852321802923
+2022-03-22,159.92069442675609
+2022-03-23,161.20343635731237
+2022-03-24,161.26990699705246
+2022-03-25,163.28013466265094
+2022-03-28,166.09788002155287
+2022-03-29,165.1390020307089
+2022-03-30,170.8082930266913
+2022-03-31,170.07929238677326
+2022-04-01,168.56829621421141
+2022-04-04,171.1991368365358
+2022-04-05,170.99865078488193
+2022-04-06,172.53884060145356
+2022-04-07,174.66679610578933
+2022-04-08,176.08623884132
+2022-04-11,177.8645024485953
+2022-04-12,175.75312236932575
+2022-04-13,176.97463515988215
+2022-04-14,175.52246672102973
+2022-04-15,174.56966745839844
+2022-04-18,173.48593519381365
+2022-04-19,171.007902118442
+2022-04-20,171.30311451533382
+2022-04-21,170.30594227010536
+2022-04-22,170.05312149069854
+2022-04-25,168.71506051793816
+2022-04-26,169.94310634359985
+2022-04-27,167.4792221150963
+2022-04-28,167.236970273388
+2022-04-29,168.90786326631212
+2022-05-02,168.9032740837256
+2022-05-03,167.9653091649564
+2022-05-04,166.6174888808405
+2022-05-05,167.85234067665084
+2022-05-06,168.2258992481476
+2022-05-09,169.22894413273016
+2022-05-10,172.41071047955353
+2022-05-11,173.53745813734685
+2022-05-12,169.6664264608398
+2022-05-13,169.33418929158378
+2022-05-16,170.8480764358001
+2022-05-17,173.18564593233629
+2022-05-18,172.28387464419274
+2022-05-19,176.04638970647068
+2022-05-20,180.0386906999192
+2022-05-23,182.88109718597303
+2022-05-24,187.6299121509075
+2022-05-25,189.0028517744035
+2022-05-26,188.82746197712066
+2022-05-27,188.8235867989427
+2022-05-30,190.14343513796794
+2022-05-31,186.9974473745598
+2022-06-01,185.09008977578392
+2022-06-02,189.13049491229236
+2022-06-03,189.51718243923094
+2022-06-06,190.94194079052085
+2022-06-07,191.71079739008704
+2022-06-08,191.2462403653079
+2022-06-09,188.96778878468155
+2022-06-10,186.5820067886935
+2022-06-13,183.7684167713122
+2022-06-14,184.07662760201742
+2022-06-15,185.41862169401625
+2022-06-16,188.30809055363363
+2022-06-17,189.2564397314539
+2022-06-20,190.49241918101393
+2022-06-21,193.6563211426339
+2022-06-22,196.066692526476
+2022-06-23,196.7279228471315
+2022-06-24,199.55169249168426
+2022-06-27,199.21584412799027
+2022-06-28,200.76885649121948
+2022-06-29,200.38970275766812
+2022-06-30,199.30237835428633
+2022-07-01,202.7822520972509
+2022-07-04,207.0788851519139
+2022-07-05,205.7426564934579
+2022-07-06,206.23320812621344
+2022-07-07,208.87003103524756
+2022-07-08,203.34373562790424
+2022-07-11,200.89918166305836
+2022-07-12,204.52668128314167
+2022-07-13,202.2247753117132
+2022-07-14,201.25617241852396
+2022-07-15,201.0424339647551
+2022-07-18,205.27718306353015
+2022-07-19,207.94096513197374
+2022-07-20,207.69562279692607
+2022-07-21,208.46992295141408
+2022-07-22,207.79903978749797
+2022-07-25,210.02046693191545
+2022-07-26,210.80889187174176
+2022-07-27,208.6829247000197
+2022-07-28,205.73461323083023
+2022-07-29,205.85809884579794
+2022-08-01,205.67814693266993
+2022-08-02,203.26388229000068
+2022-08-03,205.1609410240059
+2022-08-04,203.60953408488487
+2022-08-05,202.54219031774906
+2022-08-08,203.1869624654994
+2022-08-09,206.1053836967495
+2022-08-10,211.0823175896256
+2022-08-11,214.15154888620327
+2022-08-12,218.1279894501029
+2022-08-15,219.12617663816593
+2022-08-16,221.38445253919335
+2022-08-17,218.55734737906397
+2022-08-18,217.28889498600395
+2022-08-19,219.45864872012498
+2022-08-22,218.63455905417922
+2022-08-23,218.548382662865
+2022-08-24,218.20628298277418
+2022-08-25,216.85431521352893
+2022-08-26,223.4895006156762
+2022-08-29,222.96841523980623
+2022-08-30,220.06287827248374
+2022-08-31,216.15445480553146
+2022-09-01,213.53573300315497
+2022-09-02,214.8634265697483
+2022-09-05,215.18810187393353
+2022-09-06,213.85670334608741
+2022-09-07,213.29130503165737
+2022-09-08,218.2188670054503
+2022-09-09,218.17318002460132
+2022-09-12,220.87749740800908
+2022-09-13,221.08849760675895
+2022-09-14,219.61278447059144
+2022-09-15,225.88697973736834
+2022-09-16,227.6442927214098
+2022-09-19,225.10792004864103
+2022-09-20,227.404032155144
+2022-09-21,228.6548035838053
+2022-09-22,229.51912227129742
+2022-09-23,235.329126146231
+2022-09-26,232.55624813557517
+2022-09-27,236.1969463177874
+2022-09-28,235.42194400077383
+2022-09-29,233.86682593977673
+2022-09-30,227.7190348015873
+2022-10-03,229.37790546954017
+2022-10-04,231.64280743546973
+2022-10-05,226.00338708358746
+2022-10-06,227.81058175844447
+2022-10-07,231.42098680184296
+2022-10-10,232.10576201864455
+2022-10-11,233.57542730153494
+2022-10-12,232.07531624430305
+2022-10-13,236.41000607508138
+2022-10-14,230.96006356359035
+2022-10-17,229.95926853196113
+2022-10-18,227.06990003070976
+2022-10-19,230.87853890238785
+2022-10-20,228.59210259814992
+2022-10-21,225.2394555781821
+2022-10-24,223.8981977741329
+2022-10-25,225.2923773078133
+2022-10-26,223.38437899986556
+2022-10-27,226.8997159003284
+2022-10-28,224.93083349373833
+2022-10-31,228.04242472252386
+2022-11-01,228.15026415545572
+2022-11-02,229.1864909577801
+2022-11-03,225.6469634763197
+2022-11-04,227.90419085937214
+2022-11-07,228.65211028730346
+2022-11-08,231.6093188155082
+2022-11-09,229.07852877747055
+2022-11-10,227.0113097281247
+2022-11-11,227.28630843670143
+2022-11-14,229.7673289461211
+2022-11-15,231.584601835604
+2022-11-16,234.34443589637945
+2022-11-17,234.46785567470894
+2022-11-18,238.8764684041225
+2022-11-21,238.8139365414451
+2022-11-22,236.71805379544617
+2022-11-23,237.51875292693137
+2022-11-24,239.89615855586845
+2022-11-25,245.70927556712073
+2022-11-28,251.4826669989351
+2022-11-29,248.98343152679496
+2022-11-30,243.82135357151103
+2022-12-01,239.34039509534338
+2022-12-02,235.17026332667754
+2022-12-05,235.40853176599126
+2022-12-06,237.29132368973978
+2022-12-07,240.25109466545254
+2022-12-08,239.57933392894768
+2022-12-09,240.73723368762367
+2022-12-12,240.93234071300157
+2022-12-13,239.2240030853981
+2022-12-14,238.56263137947002
+2022-12-15,243.4185530901209
+2022-12-16,244.1178699270948
+2022-12-19,238.76313776044773
+2022-12-20,239.59698731575068
+2022-12-21,241.49330018311707
+2022-12-22,242.66255964668608
+2022-12-23,238.7645397704121
+2022-12-26,235.11973884318408
+2022-12-27,232.36070793726378
+2022-12-28,231.00594686207145
+2022-12-29,228.9108983579536
+2022-12-30,228.35121372461575
+2023-01-02,228.3907654931206
+2023-01-03,231.73917019466356
+2023-01-04,232.54251136577167
+2023-01-05,238.63715318123178
+2023-01-06,235.87975871363614
+2023-01-09,238.06312803979677
+2023-01-10,240.6997250283704
+2023-01-11,236.95371697603616
+2023-01-12,241.86035424100206
+2023-01-13,238.60363524511303
+2023-01-16,236.5753837173012
+2023-01-17,240.94043853059063
+2023-01-18,244.47662302070964
+2023-01-19,238.44161163600694
+2023-01-20,241.79403321122243
+2023-01-23,242.75673492298378
+2023-01-24,242.55230765900802
+2023-01-25,245.9159219540318
+2023-01-26,247.24351224848013
+2023-01-27,243.67664377271748
+2023-01-30,241.93499534850466
+2023-01-31,239.45685017431586
+2023-02-01,238.37818939365752
+2023-02-02,237.88561359996007
+2023-02-03,238.62663997010682
+2023-02-06,237.45012899544204
+2023-02-07,240.3285802100791
+2023-02-08,242.86905648371362
+2023-02-09,245.01384859292577
+2023-02-10,236.99648231793654
+2023-02-13,236.22947611930763
+2023-02-14,238.969889471259
+2023-02-15,240.33542430918877
+2023-02-16,239.57614875554123
+2023-02-17,237.9793899946201
+2023-02-20,238.0596800869245
+2023-02-21,236.50350424561012
+2023-02-22,235.71439461365568
+2023-02-23,237.76544169187025
+2023-02-24,238.6348251606646
+2023-02-27,233.3794394064458
+2023-02-28,234.3311300017482
+2023-03-01,228.62754243780472
+2023-03-02,227.8650049185046
+2023-03-03,225.5507074803429
+2023-03-06,222.21268971066402
+2023-03-07,219.41528246621087
+2023-03-08,214.71542381575924
+2023-03-09,210.8642175481342
+2023-03-10,214.83382352796218
+2023-03-13,215.76131264171093
+2023-03-14,214.93351600399802
+2023-03-15,217.32541573028095
+2023-03-16,219.75223952773257
+2023-03-17,219.75078078571744
+2023-03-20,219.3878645146235
+2023-03-21,214.40171286294506
+2023-03-22,212.2103490940709
+2023-03-23,215.3718677363067
+2023-03-24,215.51797490015673
+2023-03-27,212.32300692892272
+2023-03-28,212.3535291389369
+2023-03-29,212.08018399204866
+2023-03-30,213.35436270008765
+2023-03-31,211.60653391544807
+2023-04-03,215.04049305906722
+2023-04-04,216.3673938531907
+2023-04-05,220.4482810285123
+2023-04-06,223.62188472612297
+2023-04-07,218.32466046807434
+2023-04-10,219.7433952578556
+2023-04-11,218.40352371730128
+2023-04-12,221.2746916618944
+2023-04-13,218.48394045318855
+2023-04-14,216.5999802920682
+2023-04-17,218.62940404035055
+2023-04-18,220.1657008297305
+2023-04-19,223.3734899869198
+2023-04-20,224.19930003992823
+2023-04-21,225.41315710512825
+2023-04-24,227.68228835176672
+2023-04-25,226.85670009159617
+2023-04-26,231.9073799893589
+2023-04-27,230.32452263344268
+2023-04-28,233.03187292463582
+2023-05-01,231.45579906384106
+2023-05-02,224.97859542881628
+2023-05-03,225.09768892039236
+2023-05-04,221.0498383660219
+2023-05-05,219.17479601270023
+2023-05-08,219.05932352112606
+2023-05-09,217.50717046940574
+2023-05-10,216.41811382368257
+2023-05-11,212.57867281494768
+2023-05-12,215.61980902903275
+2023-05-15,215.21750121964774
+2023-05-16,216.04251380435738
+2023-05-17,215.78116287774068
+2023-05-18,214.46764871006133
+2023-05-19,212.64856550388558
+2023-05-22,214.84304709307045
+2023-05-23,212.43904156550886
+2023-05-24,210.40811135233355
+2023-05-25,215.18075303892797
+2023-05-26,217.27201307870098
+2023-05-29,217.36298826841264
+2023-05-30,218.08795875193044
+2023-05-31,223.6346362566262
+2023-06-01,224.30726552859858
+2023-06-02,225.20245130271937
+2023-06-05,220.47193830064745
+2023-06-06,220.945496239472
+2023-06-07,223.69336709637415
+2023-06-08,226.4314093310361
+2023-06-09,223.54422724562934
+2023-06-12,224.3043155882165
+2023-06-13,231.54120135110864
+2023-06-14,228.59534709363243
+2023-06-15,229.07702358860575
+2023-06-16,225.81173725968182
+2023-06-19,222.9343759659998
+2023-06-20,220.50179323819887
+2023-06-21,221.15222533708203
+2023-06-22,221.27337550808494
+2023-06-23,222.61921861329122
+2023-06-26,225.98064470037764
+2023-06-27,226.16876804927807
+2023-06-28,231.7195379060684
+2023-06-29,226.80766850553476
+2023-06-30,219.3221390278811
+2023-07-03,219.34863422434617
+2023-07-04,220.00315613429174
+2023-07-05,226.04204229359817
+2023-07-06,226.5637190535876
+2023-07-07,227.61656245954737
+2023-07-10,225.4340413738301
+2023-07-11,224.90691092509456
+2023-07-12,224.5567666220522
+2023-07-13,228.28806433292885
+2023-07-14,228.59967357849854
+2023-07-17,223.15975061898942
+2023-07-18,223.97684906766594
+2023-07-19,220.7105250911231
+2023-07-20,215.07303012331235
+2023-07-21,217.88379590331292
+2023-07-24,216.52787245548475
+2023-07-25,217.60468625656046
+2023-07-26,221.83278315121422
+2023-07-27,221.29752887841428
+2023-07-28,220.18944883647515
+2023-07-31,218.5335493642786
+2023-08-01,217.9693163517625
+2023-08-02,216.743387782244
+2023-08-03,217.98350038518547
+2023-08-04,219.3243667340492
+2023-08-07,223.79722881840732
+2023-08-08,222.27571981540044
+2023-08-09,224.28552251929932
+2023-08-10,224.08832836120826
+2023-08-11,226.75834174800022
+2023-08-14,225.59337138568293
+2023-08-15,225.56690187305603
+2023-08-16,227.20937125663693
+2023-08-17,229.82833131206223
+2023-08-18,229.326743944865
+2023-08-21,234.6064904267429
+2023-08-22,233.219339331691
+2023-08-23,234.13519186682436
+2023-08-24,233.4047037359126
+2023-08-25,235.9747103998739
+2023-08-28,230.71419786831336
+2023-08-29,230.64471960558035
+2023-08-30,235.85717925091322
+2023-08-31,240.45243826847278
+2023-09-01,244.9390419732088
+2023-09-04,245.57576112378143
+2023-09-05,242.37721248372682
+2023-09-06,241.10085404816806
+2023-09-07,239.96211221500542
+2023-09-08,240.81529243805014
+2023-09-11,243.41682530978707
+2023-09-12,246.5472234642668
+2023-09-13,245.54345344966154
+2023-09-14,248.36228540370783
+2023-09-15,244.12812280760537
+2023-09-18,242.96553445306213
+2023-09-19,240.04226002103
+2023-09-20,242.49375242333082
+2023-09-21,242.05820655206537
+2023-09-22,248.01438933694607
+2023-09-25,245.11777085266706
+2023-09-26,246.79832021531521
+2023-09-27,250.3143754496014
+2023-09-28,249.44430380131973
+2023-09-29,252.1679148033595
+2023-10-02,251.6813249862039
+2023-10-03,253.8073390555584
+2023-10-04,259.0378271297448
+2023-10-05,258.25835039335306
+2023-10-06,259.1704052706848
+2023-10-09,260.11281137346407
+2023-10-10,255.38703441339678
+2023-10-11,255.68643478848995
+2023-10-12,253.16879502000597
+2023-10-13,255.7129321912109
+2023-10-16,257.53989910592
+2023-10-17,253.51426753571636
+2023-10-18,253.05238894059775
+2023-10-19,247.07624646837175
+2023-10-20,244.07707261993664
+2023-10-23,239.68631821251623
+2023-10-24,236.9920969311691
+2023-10-25,234.3821909625004
+2023-10-26,233.40997364499404
+2023-10-27,230.055772726261
+2023-10-30,230.2721972380854
+2023-10-31,226.75486542374017
diff --git a/dashboard/css/dashboard.css b/dashboard/css/dashboard.css
new file mode 100644
index 0000000..4cf08da
--- /dev/null
+++ b/dashboard/css/dashboard.css
@@ -0,0 +1,223 @@
+/**
+ * Dashboard Styling
+ */
+
+/* Reset and base styles */
+* {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+body {
+ font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
+ background-color: #f5f7fa;
+ color: #333;
+ line-height: 1.6;
+}
+
+/* Container */
+.dashboard-container {
+ max-width: 1200px;
+ margin: 0 auto;
+ padding: 20px;
+}
+
+/* Header styles */
+.dashboard-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ padding: 20px;
+ background-color: #2c3e50;
+ color: white;
+ border-radius: 8px;
+ margin-bottom: 20px;
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
+}
+
+.header-info h1 {
+ font-size: 24px;
+ margin-bottom: 5px;
+}
+
+.date-range {
+ font-size: 14px;
+ opacity: 0.8;
+}
+
+.header-summary h2 {
+ font-size: 28px;
+ font-weight: bold;
+ margin-bottom: 5px;
+}
+
+.header-summary .label {
+ font-size: 14px;
+ color: rgba(255, 255, 255, 0.8);
+}
+
+/* Metrics section */
+.metrics-section {
+ margin-bottom: 20px;
+}
+
+.metrics-row {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
+ gap: 20px;
+ margin-bottom: 20px;
+}
+
+.metric-card {
+ background-color: white;
+ border-radius: 8px;
+ padding: 20px;
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
+ transition: transform 0.2s ease-in-out, box-shadow 0.2s ease-in-out;
+}
+
+.metric-card:hover {
+ transform: translateY(-3px);
+ box-shadow: 0 6px 8px rgba(0, 0, 0, 0.15);
+}
+
+.metric-title {
+ font-size: 14px;
+ color: #7f8c8d;
+ margin-bottom: 10px;
+}
+
+.metric-value {
+ font-size: 24px;
+ font-weight: bold;
+}
+
+/* Charts section */
+.charts-section {
+ margin-bottom: 20px;
+}
+
+.charts-row {
+ display: grid;
+ gap: 20px;
+ margin-bottom: 20px;
+}
+
+.chart-card {
+ background-color: white;
+ border-radius: 8px;
+ padding: 20px;
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
+ transition: transform 0.2s ease-in-out, box-shadow 0.2s ease-in-out;
+}
+
+.chart-card:hover {
+ transform: translateY(-3px);
+ box-shadow: 0 6px 8px rgba(0, 0, 0, 0.15);
+}
+
+.chart-header {
+ margin-bottom: 15px;
+}
+
+.chart-title {
+ font-size: 18px;
+ color: #333;
+}
+
+.chart-container {
+ height: 300px;
+ width: 100%;
+ position: relative;
+}
+
+/* Heatmap table */
+.heatmap-table {
+ width: 100%;
+ border-collapse: collapse;
+ font-size: 14px;
+}
+
+.heatmap-table th,
+.heatmap-table td {
+ padding: 8px;
+ text-align: center;
+ border: 1px solid #ddd;
+}
+
+.heatmap-table th {
+ background-color: #f2f2f2;
+ font-weight: bold;
+}
+
+/* Value formatting */
+.positive {
+ color: #2ecc71;
+}
+
+.negative {
+ color: #e74c3c;
+}
+
+.positive-return {
+ color: #2ecc71;
+}
+
+.negative-return {
+ color: #e74c3c;
+}
+
+/* Error messages */
+.error-message {
+ color: #e74c3c;
+ text-align: center;
+ padding: 20px;
+ font-weight: bold;
+}
+
+/* Responsive design */
+@media (max-width: 768px) {
+ .dashboard-header {
+ flex-direction: column;
+ align-items: flex-start;
+ }
+
+ .header-summary {
+ margin-top: 15px;
+ }
+
+ .charts-row {
+ grid-template-columns: 1fr !important;
+ }
+
+ .metrics-row {
+ grid-template-columns: 1fr;
+ }
+}
+
+@media (max-width: 480px) {
+ .dashboard-container {
+ padding: 10px;
+ }
+
+ .dashboard-header {
+ padding: 15px;
+ }
+
+ .header-info h1 {
+ font-size: 20px;
+ }
+
+ .header-summary h2 {
+ font-size: 24px;
+ }
+
+ .metric-value {
+ font-size: 20px;
+ }
+
+ .chart-container {
+ height: 250px;
+ }
+}
\ No newline at end of file
diff --git a/dashboard/dashboard.html b/dashboard/dashboard.html
index 4561a08..1e2f3f8 100644
--- a/dashboard/dashboard.html
+++ b/dashboard/dashboard.html
@@ -1,554 +1,104 @@
-
-
-
-
- AlgoSystem Trading Dashboard
-
-
-
-
-
-
-
-
-
-
-
-
-
Annualized Return
-
0.00%
-
-
-
-
-
Max Drawdown
-
-14.83%
-
-
+
+
+
+
+
AlgoSystem Trading Dashboard
+
+
+
+
+
+
+
+
+
+
-
-
-
-
Monthly Returns Heatmap
-
-
-
-
-
Rolling Sharpe Ratio
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
+
+
+
diff --git a/dashboard/dashboard_data.json b/dashboard/dashboard_data.json
index 692fe46..43805f5 100644
--- a/dashboard/dashboard_data.json
+++ b/dashboard/dashboard_data.json
@@ -1,16211 +1,6214 @@
{
- "metrics": {
- "total_return": 0.8897025257152138,
- "annualized_return": 0.17414266304309534,
- "annualized_volatility": 0.15920432118905606,
- "max_drawdown": -0.1483063614514647,
- "risk_metrics_error": "value_at_risk() got an unexpected keyword argument 'cutoff'",
- "sharpe_ratio": 1.0881549013955605,
- "sortino_ratio": 1.6280415685265508,
- "calmar_ratio": 0.8196456408920249,
- "positive_days": 537,
- "negative_days": 462,
- "pct_positive_days": 0.5375375375375375,
- "best_month": 0.12243839646812993,
- "worst_month": -0.07759771866113996,
- "avg_monthly_return": 0.014946989399733884,
- "monthly_volatility": 0.04623656501148044,
- "pct_positive_months": 0.5217391304347826,
- "alpha": 0.1725763946708265,
- "beta": 0.006009254653426389,
- "correlation": 0.007129779592087118,
- "benchmark_metrics_error": "'risk'"
- },
- "data": {
- "equity": [
- {
- "date": "2020-01-01",
- "value": 99.43580221643582
- },
- {
- "date": "2020-01-02",
- "value": 100.9651267250002
- },
- {
- "date": "2020-01-03",
- "value": 101.47618581438884
- },
- {
- "date": "2020-01-06",
- "value": 101.40970154137707
- },
- {
- "date": "2020-01-07",
- "value": 101.68043817071772
- },
- {
- "date": "2020-01-08",
- "value": 100.76913361541695
- },
- {
- "date": "2020-01-09",
- "value": 100.20637401722436
- },
- {
- "date": "2020-01-10",
- "value": 99.85261881167817
- },
- {
- "date": "2020-01-13",
- "value": 101.71377134584947
- },
- {
- "date": "2020-01-14",
- "value": 103.00351325730517
- },
- {
- "date": "2020-01-15",
- "value": 103.33757964669755
- },
- {
- "date": "2020-01-16",
- "value": 103.22895658836936
- },
- {
- "date": "2020-01-17",
- "value": 104.38877831800492
- },
- {
- "date": "2020-01-20",
- "value": 105.61930775679943
- },
- {
- "date": "2020-01-21",
- "value": 105.0070722569902
- },
- {
- "date": "2020-01-22",
- "value": 103.6517193120229
- },
- {
- "date": "2020-01-23",
- "value": 101.90359231184911
- },
- {
- "date": "2020-01-24",
- "value": 102.06947592549463
- },
- {
- "date": "2020-01-27",
- "value": 102.84836632845578
- },
- {
- "date": "2020-01-28",
- "value": 104.26252142014215
- },
- {
- "date": "2020-01-29",
- "value": 105.2408515472917
- },
- {
- "date": "2020-01-30",
- "value": 105.61895221757905
- },
- {
- "date": "2020-01-31",
- "value": 106.26208478900571
- },
- {
- "date": "2020-02-03",
- "value": 108.1074270811467
- },
- {
- "date": "2020-02-04",
- "value": 109.13189403904622
- },
- {
- "date": "2020-02-05",
- "value": 109.06959873071365
- },
- {
- "date": "2020-02-06",
- "value": 110.8481558387983
- },
- {
- "date": "2020-02-07",
- "value": 109.22556045218472
- },
- {
- "date": "2020-02-10",
- "value": 109.7368109956686
- },
- {
- "date": "2020-02-11",
- "value": 110.7903331615751
- },
- {
- "date": "2020-02-12",
- "value": 110.50595899966031
- },
- {
- "date": "2020-02-13",
- "value": 111.25900364915633
- },
- {
- "date": "2020-02-14",
- "value": 110.20260700058732
- },
- {
- "date": "2020-02-17",
- "value": 111.01462783557128
- },
- {
- "date": "2020-02-18",
- "value": 111.11533321566574
- },
- {
- "date": "2020-02-19",
- "value": 111.01682639595774
- },
- {
- "date": "2020-02-20",
- "value": 109.69837253168812
- },
- {
- "date": "2020-02-21",
- "value": 110.24692985358509
- },
- {
- "date": "2020-02-24",
- "value": 112.08222160559293
- },
- {
- "date": "2020-02-25",
- "value": 111.17319245651824
- },
- {
- "date": "2020-02-26",
- "value": 110.69013060522236
- },
- {
- "date": "2020-02-27",
- "value": 112.25507242161761
- },
- {
- "date": "2020-02-28",
- "value": 112.6830799751081
- },
- {
- "date": "2020-03-02",
- "value": 113.71581643219085
- },
- {
- "date": "2020-03-03",
- "value": 113.17854572744545
- },
- {
- "date": "2020-03-04",
- "value": 113.75921983444772
- },
- {
- "date": "2020-03-05",
- "value": 113.32026252181355
- },
- {
- "date": "2020-03-06",
- "value": 112.03211147356515
- },
- {
- "date": "2020-03-09",
- "value": 112.82006669016774
- },
- {
- "date": "2020-03-10",
- "value": 112.84437806321476
- },
- {
- "date": "2020-03-11",
- "value": 114.30747876982505
- },
- {
- "date": "2020-03-12",
- "value": 112.56251325106797
- },
- {
- "date": "2020-03-13",
- "value": 111.96513168754036
- },
- {
- "date": "2020-03-16",
- "value": 110.63111762876252
- },
- {
- "date": "2020-03-17",
- "value": 109.54403310457893
- },
- {
- "date": "2020-03-18",
- "value": 109.75025608523028
- },
- {
- "date": "2020-03-19",
- "value": 110.42078550355777
- },
- {
- "date": "2020-03-20",
- "value": 108.48747422991907
- },
- {
- "date": "2020-03-23",
- "value": 106.84231787763778
- },
- {
- "date": "2020-03-24",
- "value": 108.05769872428064
- },
- {
- "date": "2020-03-25",
- "value": 108.46490121066374
- },
- {
- "date": "2020-03-26",
- "value": 109.01358029275761
- },
- {
- "date": "2020-03-27",
- "value": 108.31182966919212
- },
- {
- "date": "2020-03-30",
- "value": 109.34711795756972
- },
- {
- "date": "2020-03-31",
- "value": 109.91873287828615
- },
- {
- "date": "2020-04-01",
- "value": 108.76841353136577
- },
- {
- "date": "2020-04-02",
- "value": 108.56142029421156
- },
- {
- "date": "2020-04-03",
- "value": 108.57503373916619
- },
- {
- "date": "2020-04-06",
- "value": 109.11968623888735
- },
- {
- "date": "2020-04-07",
- "value": 109.89103052547156
- },
- {
- "date": "2020-04-08",
- "value": 111.59658406702775
- },
- {
- "date": "2020-04-09",
- "value": 111.40140859701464
- },
- {
- "date": "2020-04-10",
- "value": 110.00520614997991
- },
- {
- "date": "2020-04-13",
- "value": 108.25535297673422
- },
- {
- "date": "2020-04-14",
- "value": 106.56435545963771
- },
- {
- "date": "2020-04-15",
- "value": 106.10140494625668
- },
- {
- "date": "2020-04-16",
- "value": 106.1382004292148
- },
- {
- "date": "2020-04-17",
- "value": 105.53688799930704
- },
- {
- "date": "2020-04-20",
- "value": 107.03010116809916
- },
- {
- "date": "2020-04-21",
- "value": 106.37434182181832
- },
- {
- "date": "2020-04-22",
- "value": 105.11696511574607
- },
- {
- "date": "2020-04-23",
- "value": 106.79048037738696
- },
- {
- "date": "2020-04-24",
- "value": 107.79455229295299
- },
- {
- "date": "2020-04-27",
- "value": 108.41826089371769
- },
- {
- "date": "2020-04-28",
- "value": 108.41840213894028
- },
- {
- "date": "2020-04-29",
- "value": 107.68236006496588
- },
- {
- "date": "2020-04-30",
- "value": 108.00999183706253
- },
- {
- "date": "2020-05-01",
- "value": 109.15652176507885
- },
- {
- "date": "2020-05-04",
- "value": 108.85838951632515
- },
- {
- "date": "2020-05-05",
- "value": 107.70801695379939
- },
- {
- "date": "2020-05-06",
- "value": 107.5502371683424
- },
- {
- "date": "2020-05-07",
- "value": 107.69816892268304
- },
- {
- "date": "2020-05-08",
- "value": 108.57083826155684
- },
- {
- "date": "2020-05-11",
- "value": 109.06191573293904
- },
- {
- "date": "2020-05-12",
- "value": 109.62083517308925
- },
- {
- "date": "2020-05-13",
- "value": 109.26100654215402
- },
- {
- "date": "2020-05-14",
- "value": 109.34413929791722
- },
- {
- "date": "2020-05-15",
- "value": 111.08865718202084
- },
- {
- "date": "2020-05-18",
- "value": 111.90238322093597
- },
- {
- "date": "2020-05-19",
- "value": 109.94784560683959
- },
- {
- "date": "2020-05-20",
- "value": 110.44254338306736
- },
- {
- "date": "2020-05-21",
- "value": 110.39880823549504
- },
- {
- "date": "2020-05-22",
- "value": 110.99789507737019
- },
- {
- "date": "2020-05-25",
- "value": 111.47255781126826
- },
- {
- "date": "2020-05-26",
- "value": 112.48426532617538
- },
- {
- "date": "2020-05-27",
- "value": 112.89891169119555
- },
- {
- "date": "2020-05-28",
- "value": 111.68972646654223
- },
- {
- "date": "2020-05-29",
- "value": 112.27706364375562
- },
- {
- "date": "2020-06-01",
- "value": 111.7866990229521
- },
- {
- "date": "2020-06-02",
- "value": 112.16856155708766
- },
- {
- "date": "2020-06-03",
- "value": 113.0388760604244
- },
- {
- "date": "2020-06-04",
- "value": 114.15970321786271
- },
- {
- "date": "2020-06-05",
- "value": 114.37176554199432
- },
- {
- "date": "2020-06-08",
- "value": 113.18850716893176
- },
- {
- "date": "2020-06-09",
- "value": 114.59879342622527
- },
- {
- "date": "2020-06-10",
- "value": 114.76767954947526
- },
- {
- "date": "2020-06-11",
- "value": 115.86569808386041
- },
- {
- "date": "2020-06-12",
- "value": 115.89729328497046
- },
- {
- "date": "2020-06-15",
- "value": 117.59517612992418
- },
- {
- "date": "2020-06-16",
- "value": 118.04217570022453
- },
- {
- "date": "2020-06-17",
- "value": 116.03202007034066
- },
- {
- "date": "2020-06-18",
- "value": 116.08806278730988
- },
- {
- "date": "2020-06-19",
- "value": 113.58402678744588
- },
- {
- "date": "2020-06-22",
- "value": 112.27825027079915
- },
- {
- "date": "2020-06-23",
- "value": 113.34110288672068
- },
- {
- "date": "2020-06-24",
- "value": 113.2858213194299
- },
- {
- "date": "2020-06-25",
- "value": 113.79491938324426
- },
- {
- "date": "2020-06-26",
- "value": 115.74635558178987
- },
- {
- "date": "2020-06-29",
- "value": 114.23567729250816
- },
- {
- "date": "2020-06-30",
- "value": 112.44821338065843
- },
- {
- "date": "2020-07-01",
- "value": 113.96065677583198
- },
- {
- "date": "2020-07-02",
- "value": 113.96292312659098
- },
- {
- "date": "2020-07-03",
- "value": 113.71070764449343
- },
- {
- "date": "2020-07-06",
- "value": 112.96103095682206
- },
- {
- "date": "2020-07-07",
- "value": 113.27644568205466
- },
- {
- "date": "2020-07-08",
- "value": 114.07374151560322
- },
- {
- "date": "2020-07-09",
- "value": 112.48671624045785
- },
- {
- "date": "2020-07-10",
- "value": 112.55428791936357
- },
- {
- "date": "2020-07-13",
- "value": 111.77529535945338
- },
- {
- "date": "2020-07-14",
- "value": 112.27870722155203
- },
- {
- "date": "2020-07-15",
- "value": 112.9984045711358
- },
- {
- "date": "2020-07-16",
- "value": 114.71358509938608
- },
- {
- "date": "2020-07-17",
- "value": 113.56059064372768
- },
- {
- "date": "2020-07-20",
- "value": 114.13232522188697
- },
- {
- "date": "2020-07-21",
- "value": 115.71009481869916
- },
- {
- "date": "2020-07-22",
- "value": 116.804352031123
- },
- {
- "date": "2020-07-23",
- "value": 116.51365896277713
- },
- {
- "date": "2020-07-24",
- "value": 115.02784440326543
- },
- {
- "date": "2020-07-27",
- "value": 113.89225350594961
- },
- {
- "date": "2020-07-28",
- "value": 112.37720825737492
- },
- {
- "date": "2020-07-29",
- "value": 112.02290401081866
- },
- {
- "date": "2020-07-30",
- "value": 110.80100341698481
- },
- {
- "date": "2020-07-31",
- "value": 112.37799166697957
- },
- {
- "date": "2020-08-03",
- "value": 110.79700612990432
- },
- {
- "date": "2020-08-04",
- "value": 110.32943351523271
- },
- {
- "date": "2020-08-05",
- "value": 108.47298813427295
- },
- {
- "date": "2020-08-06",
- "value": 106.87288257116631
- },
- {
- "date": "2020-08-07",
- "value": 105.80768676021788
- },
- {
- "date": "2020-08-10",
- "value": 107.26980473042657
- },
- {
- "date": "2020-08-11",
- "value": 108.6290147336622
- },
- {
- "date": "2020-08-12",
- "value": 109.22536254559019
- },
- {
- "date": "2020-08-13",
- "value": 107.15057429112711
- },
- {
- "date": "2020-08-14",
- "value": 107.90368395258356
- },
- {
- "date": "2020-08-17",
- "value": 108.0922801390854
- },
- {
- "date": "2020-08-18",
- "value": 107.68719787690982
- },
- {
- "date": "2020-08-19",
- "value": 106.25467057437086
- },
- {
- "date": "2020-08-20",
- "value": 106.14640769426633
- },
- {
- "date": "2020-08-21",
- "value": 107.68973168415422
- },
- {
- "date": "2020-08-24",
- "value": 107.83871573152605
- },
- {
- "date": "2020-08-25",
- "value": 108.1372426661455
- },
- {
- "date": "2020-08-26",
- "value": 107.85272848931056
- },
- {
- "date": "2020-08-27",
- "value": 107.08321556475632
- },
- {
- "date": "2020-08-28",
- "value": 108.96556522485842
- },
- {
- "date": "2020-08-31",
- "value": 108.61892256633577
- },
- {
- "date": "2020-09-01",
- "value": 107.76663594988969
- },
- {
- "date": "2020-09-02",
- "value": 107.33816413653514
- },
- {
- "date": "2020-09-03",
- "value": 107.2500978350738
- },
- {
- "date": "2020-09-04",
- "value": 105.63445779545569
- },
- {
- "date": "2020-09-07",
- "value": 105.99025801348601
- },
- {
- "date": "2020-09-08",
- "value": 105.02837195723261
- },
- {
- "date": "2020-09-09",
- "value": 106.25158607586384
- },
- {
- "date": "2020-09-10",
- "value": 106.69187760302962
- },
- {
- "date": "2020-09-11",
- "value": 106.92300119068555
- },
- {
- "date": "2020-09-14",
- "value": 107.89970569289889
- },
- {
- "date": "2020-09-15",
- "value": 106.4310418905338
- },
- {
- "date": "2020-09-16",
- "value": 107.55553431367784
- },
- {
- "date": "2020-09-17",
- "value": 107.40736421503628
- },
- {
- "date": "2020-09-18",
- "value": 109.13286377498119
- },
- {
- "date": "2020-09-21",
- "value": 109.58976121935923
- },
- {
- "date": "2020-09-22",
- "value": 109.48213490988276
- },
- {
- "date": "2020-09-23",
- "value": 108.69140077652644
- },
- {
- "date": "2020-09-24",
- "value": 108.64733048570723
- },
- {
- "date": "2020-09-25",
- "value": 107.76424625279112
- },
- {
- "date": "2020-09-28",
- "value": 108.15323775811498
- },
- {
- "date": "2020-09-29",
- "value": 108.79169095474222
- },
- {
- "date": "2020-09-30",
- "value": 108.5640232627655
- },
- {
- "date": "2020-10-01",
- "value": 106.65968049332571
- },
- {
- "date": "2020-10-02",
- "value": 106.78726418865061
- },
- {
- "date": "2020-10-05",
- "value": 106.55264508528558
- },
- {
- "date": "2020-10-06",
- "value": 107.45425766625118
- },
- {
- "date": "2020-10-07",
- "value": 108.54744656821792
- },
- {
- "date": "2020-10-08",
- "value": 108.42946475228617
- },
- {
- "date": "2020-10-09",
- "value": 109.40287009911592
- },
- {
- "date": "2020-10-12",
- "value": 110.60492422629999
- },
- {
- "date": "2020-10-13",
- "value": 109.9937902998957
- },
- {
- "date": "2020-10-14",
- "value": 108.10275983174138
- },
- {
- "date": "2020-10-15",
- "value": 106.94811431862108
- },
- {
- "date": "2020-10-16",
- "value": 106.48783317670407
- },
- {
- "date": "2020-10-19",
- "value": 105.04515595316427
- },
- {
- "date": "2020-10-20",
- "value": 104.27426996826011
- },
- {
- "date": "2020-10-21",
- "value": 103.16512654106967
- },
- {
- "date": "2020-10-22",
- "value": 105.48721153249204
- },
- {
- "date": "2020-10-23",
- "value": 106.23925374839332
- },
- {
- "date": "2020-10-26",
- "value": 104.65590699770867
- },
- {
- "date": "2020-10-27",
- "value": 103.8161021393682
- },
- {
- "date": "2020-10-28",
- "value": 103.28060517572901
- },
- {
- "date": "2020-10-29",
- "value": 101.88105037672126
- },
- {
- "date": "2020-10-30",
- "value": 102.62115862628733
- },
- {
- "date": "2020-11-02",
- "value": 102.34520240915302
- },
- {
- "date": "2020-11-03",
- "value": 102.72819927329266
- },
- {
- "date": "2020-11-04",
- "value": 101.54044992831739
- },
- {
- "date": "2020-11-05",
- "value": 103.9453993559438
- },
- {
- "date": "2020-11-06",
- "value": 104.02596423417285
- },
- {
- "date": "2020-11-09",
- "value": 102.57520262498666
- },
- {
- "date": "2020-11-10",
- "value": 101.53317677624645
- },
- {
- "date": "2020-11-11",
- "value": 101.49004441566407
- },
- {
- "date": "2020-11-12",
- "value": 102.6739927632276
- },
- {
- "date": "2020-11-13",
- "value": 102.26528249035867
- },
- {
- "date": "2020-11-16",
- "value": 103.37469608518064
- },
- {
- "date": "2020-11-17",
- "value": 104.42056733397412
- },
- {
- "date": "2020-11-18",
- "value": 105.65830189878898
- },
- {
- "date": "2020-11-19",
- "value": 106.4827912150845
- },
- {
- "date": "2020-11-20",
- "value": 106.89018392144578
- },
- {
- "date": "2020-11-23",
- "value": 106.63316107419844
- },
- {
- "date": "2020-11-24",
- "value": 105.6136217894413
- },
- {
- "date": "2020-11-25",
- "value": 105.78465797634861
- },
- {
- "date": "2020-11-26",
- "value": 105.5478724728399
- },
- {
- "date": "2020-11-27",
- "value": 105.86670997178011
- },
- {
- "date": "2020-11-30",
- "value": 107.0163959295204
- },
- {
- "date": "2020-12-01",
- "value": 109.8329592296616
- },
- {
- "date": "2020-12-02",
- "value": 109.83359683892893
- },
- {
- "date": "2020-12-03",
- "value": 107.1155579904278
- },
- {
- "date": "2020-12-04",
- "value": 108.48422988142562
- },
- {
- "date": "2020-12-07",
- "value": 108.82721158840572
- },
- {
- "date": "2020-12-08",
- "value": 109.33777754589042
- },
- {
- "date": "2020-12-09",
- "value": 108.80747594544889
- },
- {
- "date": "2020-12-10",
- "value": 108.89641628469397
- },
- {
- "date": "2020-12-11",
- "value": 109.77802113807068
- },
- {
- "date": "2020-12-14",
- "value": 111.6540093895013
- },
- {
- "date": "2020-12-15",
- "value": 113.88671894077221
- },
- {
- "date": "2020-12-16",
- "value": 113.0211355366511
- },
- {
- "date": "2020-12-17",
- "value": 113.27605567708315
- },
- {
- "date": "2020-12-18",
- "value": 112.62755385995702
- },
- {
- "date": "2020-12-21",
- "value": 113.25566180441369
- },
- {
- "date": "2020-12-22",
- "value": 112.01950453825579
- },
- {
- "date": "2020-12-23",
- "value": 111.11786292141512
- },
- {
- "date": "2020-12-24",
- "value": 110.87161307907016
- },
- {
- "date": "2020-12-25",
- "value": 111.92844289248936
- },
- {
- "date": "2020-12-28",
- "value": 112.65211015384175
- },
- {
- "date": "2020-12-29",
- "value": 112.02155153371172
- },
- {
- "date": "2020-12-30",
- "value": 110.4021173355066
- },
- {
- "date": "2020-12-31",
- "value": 110.24875534577065
- },
- {
- "date": "2021-01-01",
- "value": 111.55698291741388
- },
- {
- "date": "2021-01-04",
- "value": 112.11099827578752
- },
- {
- "date": "2021-01-05",
- "value": 112.21469304019647
- },
- {
- "date": "2021-01-06",
- "value": 111.7089899696558
- },
- {
- "date": "2021-01-07",
- "value": 111.05589152453298
- },
- {
- "date": "2021-01-08",
- "value": 112.99107782406708
- },
- {
- "date": "2021-01-11",
- "value": 113.14432628579534
- },
- {
- "date": "2021-01-12",
- "value": 113.09121999544746
- },
- {
- "date": "2021-01-13",
- "value": 112.18628530919763
- },
- {
- "date": "2021-01-14",
- "value": 112.65873434136309
- },
- {
- "date": "2021-01-15",
- "value": 111.32218645231897
- },
- {
- "date": "2021-01-18",
- "value": 111.95270189607022
- },
- {
- "date": "2021-01-19",
- "value": 109.83892472640349
- },
- {
- "date": "2021-01-20",
- "value": 109.92757000218975
- },
- {
- "date": "2021-01-21",
- "value": 109.90657221503866
- },
- {
- "date": "2021-01-22",
- "value": 112.7175076942548
- },
- {
- "date": "2021-01-25",
- "value": 112.47899829050142
- },
- {
- "date": "2021-01-26",
- "value": 111.1730463265318
- },
- {
- "date": "2021-01-27",
- "value": 110.69078482044053
- },
- {
- "date": "2021-01-28",
- "value": 111.740333662976
- },
- {
- "date": "2021-01-29",
- "value": 112.25686492310084
- },
- {
- "date": "2021-02-01",
- "value": 112.97290434996975
- },
- {
- "date": "2021-02-02",
- "value": 112.19891035467566
- },
- {
- "date": "2021-02-03",
- "value": 112.20408583357356
- },
- {
- "date": "2021-02-04",
- "value": 113.05418914805038
- },
- {
- "date": "2021-02-05",
- "value": 115.31147396065242
- },
- {
- "date": "2021-02-08",
- "value": 117.14261041505097
- },
- {
- "date": "2021-02-09",
- "value": 118.75073387494835
- },
- {
- "date": "2021-02-10",
- "value": 119.97059520929973
- },
- {
- "date": "2021-02-11",
- "value": 119.33598531518169
- },
- {
- "date": "2021-02-12",
- "value": 119.33842238791192
- },
- {
- "date": "2021-02-15",
- "value": 119.80899498362048
- },
- {
- "date": "2021-02-16",
- "value": 120.21291198772232
- },
- {
- "date": "2021-02-17",
- "value": 119.24137001820353
- },
- {
- "date": "2021-02-18",
- "value": 117.71221954914728
- },
- {
- "date": "2021-02-19",
- "value": 117.06056274928764
- },
- {
- "date": "2021-02-22",
- "value": 115.34310483477738
- },
- {
- "date": "2021-02-23",
- "value": 117.58465250237354
- },
- {
- "date": "2021-02-24",
- "value": 116.83625647253942
- },
- {
- "date": "2021-02-25",
- "value": 116.31422686898986
- },
- {
- "date": "2021-02-26",
- "value": 115.99985398705333
- },
- {
- "date": "2021-03-01",
- "value": 116.39283322440295
- },
- {
- "date": "2021-03-02",
- "value": 116.14198011825607
- },
- {
- "date": "2021-03-03",
- "value": 114.89445660946463
- },
- {
- "date": "2021-03-04",
- "value": 113.91032422291222
- },
- {
- "date": "2021-03-05",
- "value": 114.47291435059232
- },
- {
- "date": "2021-03-08",
- "value": 115.04257789701055
- },
- {
- "date": "2021-03-09",
- "value": 115.28665481083875
- },
- {
- "date": "2021-03-10",
- "value": 114.00941870659521
- },
- {
- "date": "2021-03-11",
- "value": 114.00049971766694
- },
- {
- "date": "2021-03-12",
- "value": 113.1633388548541
- },
- {
- "date": "2021-03-15",
- "value": 113.64283037975981
- },
- {
- "date": "2021-03-16",
- "value": 114.00045494178141
- },
- {
- "date": "2021-03-17",
- "value": 114.17709906044958
- },
- {
- "date": "2021-03-18",
- "value": 113.4310215155243
- },
- {
- "date": "2021-03-19",
- "value": 113.62486997778254
- },
- {
- "date": "2021-03-22",
- "value": 112.45477166883045
- },
- {
- "date": "2021-03-23",
- "value": 111.38387202093759
- },
- {
- "date": "2021-03-24",
- "value": 111.0132235184502
- },
- {
- "date": "2021-03-25",
- "value": 111.00939619097393
- },
- {
- "date": "2021-03-26",
- "value": 111.81202121475272
- },
- {
- "date": "2021-03-29",
- "value": 111.62440230213564
- },
- {
- "date": "2021-03-30",
- "value": 110.37373856994205
- },
- {
- "date": "2021-03-31",
- "value": 111.94477267944393
- },
- {
- "date": "2021-04-01",
- "value": 111.67210601527873
- },
- {
- "date": "2021-04-02",
- "value": 112.61305079961348
- },
- {
- "date": "2021-04-05",
- "value": 112.66894897310175
- },
- {
- "date": "2021-04-06",
- "value": 111.24071042608527
- },
- {
- "date": "2021-04-07",
- "value": 112.56370264476224
- },
- {
- "date": "2021-04-08",
- "value": 114.9102624872365
- },
- {
- "date": "2021-04-09",
- "value": 114.47530130216553
- },
- {
- "date": "2021-04-12",
- "value": 114.22313517763867
- },
- {
- "date": "2021-04-13",
- "value": 116.96905436533177
- },
- {
- "date": "2021-04-14",
- "value": 116.36930975670481
- },
- {
- "date": "2021-04-15",
- "value": 114.7788158849487
- },
- {
- "date": "2021-04-16",
- "value": 112.45210019758264
- },
- {
- "date": "2021-04-19",
- "value": 112.82910498254856
- },
- {
- "date": "2021-04-20",
- "value": 113.59976131561828
- },
- {
- "date": "2021-04-21",
- "value": 113.48246758229968
- },
- {
- "date": "2021-04-22",
- "value": 111.84582185307184
- },
- {
- "date": "2021-04-23",
- "value": 110.09964883420619
- },
- {
- "date": "2021-04-26",
- "value": 109.93033900994162
- },
- {
- "date": "2021-04-27",
- "value": 109.53716068636264
- },
- {
- "date": "2021-04-28",
- "value": 109.53275232320064
- },
- {
- "date": "2021-04-29",
- "value": 108.96941749564763
- },
- {
- "date": "2021-04-30",
- "value": 109.53937938382833
- },
- {
- "date": "2021-05-03",
- "value": 110.57486090892088
- },
- {
- "date": "2021-05-04",
- "value": 109.05775579404727
- },
- {
- "date": "2021-05-05",
- "value": 109.3735774681303
- },
- {
- "date": "2021-05-06",
- "value": 107.26457722946235
- },
- {
- "date": "2021-05-07",
- "value": 107.70564544645298
- },
- {
- "date": "2021-05-10",
- "value": 107.85848530733882
- },
- {
- "date": "2021-05-11",
- "value": 108.0004384143622
- },
- {
- "date": "2021-05-12",
- "value": 108.26859268200303
- },
- {
- "date": "2021-05-13",
- "value": 106.67686195523855
- },
- {
- "date": "2021-05-14",
- "value": 105.49751881500805
- },
- {
- "date": "2021-05-17",
- "value": 107.08166624731227
- },
- {
- "date": "2021-05-18",
- "value": 106.49094562639893
- },
- {
- "date": "2021-05-19",
- "value": 104.54290084618822
- },
- {
- "date": "2021-05-20",
- "value": 106.30079143497102
- },
- {
- "date": "2021-05-21",
- "value": 108.27595402944907
- },
- {
- "date": "2021-05-24",
- "value": 109.15372038326949
- },
- {
- "date": "2021-05-25",
- "value": 110.18772267492137
- },
- {
- "date": "2021-05-26",
- "value": 110.63871310810087
- },
- {
- "date": "2021-05-27",
- "value": 110.95652901010713
- },
- {
- "date": "2021-05-28",
- "value": 109.78417455749685
- },
- {
- "date": "2021-05-31",
- "value": 108.4782440028188
- },
- {
- "date": "2021-06-01",
- "value": 109.40624410672118
- },
- {
- "date": "2021-06-02",
- "value": 110.10782228572887
- },
- {
- "date": "2021-06-03",
- "value": 111.44800131707278
- },
- {
- "date": "2021-06-04",
- "value": 112.18940233327245
- },
- {
- "date": "2021-06-07",
- "value": 112.67018032544003
- },
- {
- "date": "2021-06-08",
- "value": 112.07624749951353
- },
- {
- "date": "2021-06-09",
- "value": 110.62490091235706
- },
- {
- "date": "2021-06-10",
- "value": 111.1326584689505
- },
- {
- "date": "2021-06-11",
- "value": 111.3929639453091
- },
- {
- "date": "2021-06-14",
- "value": 110.63813241414792
- },
- {
- "date": "2021-06-15",
- "value": 109.45504024178206
- },
- {
- "date": "2021-06-16",
- "value": 108.80580084222709
- },
- {
- "date": "2021-06-17",
- "value": 108.78548477915652
- },
- {
- "date": "2021-06-18",
- "value": 109.0082591146714
- },
- {
- "date": "2021-06-21",
- "value": 107.44451262611777
- },
- {
- "date": "2021-06-22",
- "value": 107.64858191727407
- },
- {
- "date": "2021-06-23",
- "value": 104.88021261302538
- },
- {
- "date": "2021-06-24",
- "value": 106.81318973244305
- },
- {
- "date": "2021-06-25",
- "value": 106.56121391325395
- },
- {
- "date": "2021-06-28",
- "value": 108.38484335568917
- },
- {
- "date": "2021-06-29",
- "value": 107.09253999454265
- },
- {
- "date": "2021-06-30",
- "value": 107.27632182135052
- },
- {
- "date": "2021-07-01",
- "value": 107.71610751775349
- },
- {
- "date": "2021-07-02",
- "value": 106.7648227126679
- },
- {
- "date": "2021-07-05",
- "value": 107.01187708537687
- },
- {
- "date": "2021-07-06",
- "value": 106.4457845493731
- },
- {
- "date": "2021-07-07",
- "value": 107.85844618640157
- },
- {
- "date": "2021-07-08",
- "value": 107.27530324149485
- },
- {
- "date": "2021-07-09",
- "value": 106.82912976329091
- },
- {
- "date": "2021-07-12",
- "value": 106.88263101324765
- },
- {
- "date": "2021-07-13",
- "value": 106.71591818796959
- },
- {
- "date": "2021-07-14",
- "value": 108.4115967590868
- },
- {
- "date": "2021-07-15",
- "value": 108.60615839870187
- },
- {
- "date": "2021-07-16",
- "value": 109.95575169695475
- },
- {
- "date": "2021-07-19",
- "value": 110.50671471613266
- },
- {
- "date": "2021-07-20",
- "value": 110.01640573244575
- },
- {
- "date": "2021-07-21",
- "value": 110.49557869952231
- },
- {
- "date": "2021-07-22",
- "value": 109.71950117970239
- },
- {
- "date": "2021-07-23",
- "value": 110.00205171450695
- },
- {
- "date": "2021-07-26",
- "value": 110.97913201018153
- },
- {
- "date": "2021-07-27",
- "value": 111.77530137649045
- },
- {
- "date": "2021-07-28",
- "value": 111.87950302732173
- },
- {
- "date": "2021-07-29",
- "value": 116.55162934947975
- },
- {
- "date": "2021-07-30",
- "value": 117.45334500784858
- },
- {
- "date": "2021-08-02",
- "value": 117.05227423597174
- },
- {
- "date": "2021-08-03",
- "value": 117.85539494177848
- },
- {
- "date": "2021-08-04",
- "value": 120.11996716942733
- },
- {
- "date": "2021-08-05",
- "value": 119.27084225050906
- },
- {
- "date": "2021-08-06",
- "value": 120.93990434254371
- },
- {
- "date": "2021-08-09",
- "value": 123.37713689565653
- },
- {
- "date": "2021-08-10",
- "value": 124.42964398526402
- },
- {
- "date": "2021-08-11",
- "value": 124.41172371189502
- },
- {
- "date": "2021-08-12",
- "value": 127.13257134687157
- },
- {
- "date": "2021-08-13",
- "value": 128.7958670441943
- },
- {
- "date": "2021-08-16",
- "value": 129.243561902145
- },
- {
- "date": "2021-08-17",
- "value": 130.314568048835
- },
- {
- "date": "2021-08-18",
- "value": 130.30692717835814
- },
- {
- "date": "2021-08-19",
- "value": 130.69018505906976
- },
- {
- "date": "2021-08-20",
- "value": 132.78453105863207
- },
- {
- "date": "2021-08-23",
- "value": 133.53440858527335
- },
- {
- "date": "2021-08-24",
- "value": 131.34975210977385
- },
- {
- "date": "2021-08-25",
- "value": 131.1176931888569
- },
- {
- "date": "2021-08-26",
- "value": 130.17493206600352
- },
- {
- "date": "2021-08-27",
- "value": 130.89519170439863
- },
- {
- "date": "2021-08-30",
- "value": 131.42630872248228
- },
- {
- "date": "2021-08-31",
- "value": 131.56771000848107
- },
- {
- "date": "2021-09-01",
- "value": 130.9179764122107
- },
- {
- "date": "2021-09-02",
- "value": 129.8517846795634
- },
- {
- "date": "2021-09-03",
- "value": 130.4460434881794
- },
- {
- "date": "2021-09-06",
- "value": 129.0320080994763
- },
- {
- "date": "2021-09-07",
- "value": 130.5589204649636
- },
- {
- "date": "2021-09-08",
- "value": 130.71681292042388
- },
- {
- "date": "2021-09-09",
- "value": 130.27376241393816
- },
- {
- "date": "2021-09-10",
- "value": 129.2423075454972
- },
- {
- "date": "2021-09-13",
- "value": 128.18654187246847
- },
- {
- "date": "2021-09-14",
- "value": 127.10758756715033
- },
- {
- "date": "2021-09-15",
- "value": 127.46654824869688
- },
- {
- "date": "2021-09-16",
- "value": 126.7916655857689
- },
- {
- "date": "2021-09-17",
- "value": 129.39058635411632
- },
- {
- "date": "2021-09-20",
- "value": 128.23769787400946
- },
- {
- "date": "2021-09-21",
- "value": 129.7395113249166
- },
- {
- "date": "2021-09-22",
- "value": 129.6042088263965
- },
- {
- "date": "2021-09-23",
- "value": 127.65433652783338
- },
- {
- "date": "2021-09-24",
- "value": 128.47536500112628
- },
- {
- "date": "2021-09-27",
- "value": 128.74445511020804
- },
- {
- "date": "2021-09-28",
- "value": 129.9904741028447
- },
- {
- "date": "2021-09-29",
- "value": 131.21267279154895
- },
- {
- "date": "2021-09-30",
- "value": 133.2122868513819
- },
- {
- "date": "2021-10-01",
- "value": 133.2518055229709
- },
- {
- "date": "2021-10-04",
- "value": 133.9212964012735
- },
- {
- "date": "2021-10-05",
- "value": 133.98650520346098
- },
- {
- "date": "2021-10-06",
- "value": 135.3928927365497
- },
- {
- "date": "2021-10-07",
- "value": 138.27886923527132
- },
- {
- "date": "2021-10-08",
- "value": 137.73371581342596
- },
- {
- "date": "2021-10-11",
- "value": 137.88175215634504
- },
- {
- "date": "2021-10-12",
- "value": 139.72305688531213
- },
- {
- "date": "2021-10-13",
- "value": 139.3376575539446
- },
- {
- "date": "2021-10-14",
- "value": 139.66745930332883
- },
- {
- "date": "2021-10-15",
- "value": 140.64236799369547
- },
- {
- "date": "2021-10-18",
- "value": 142.86308490060298
- },
- {
- "date": "2021-10-19",
- "value": 144.8225709650348
- },
- {
- "date": "2021-10-20",
- "value": 146.19698759289906
- },
- {
- "date": "2021-10-21",
- "value": 148.73051182297706
- },
- {
- "date": "2021-10-22",
- "value": 147.13370997805652
- },
- {
- "date": "2021-10-25",
- "value": 145.31995815652186
- },
- {
- "date": "2021-10-26",
- "value": 143.70572750971567
- },
- {
- "date": "2021-10-27",
- "value": 144.2904217850907
- },
- {
- "date": "2021-10-28",
- "value": 143.5624971194626
- },
- {
- "date": "2021-10-29",
- "value": 141.48939660309537
- },
- {
- "date": "2021-11-01",
- "value": 141.8292760761498
- },
- {
- "date": "2021-11-02",
- "value": 140.26657284870538
- },
- {
- "date": "2021-11-03",
- "value": 139.0405577830699
- },
- {
- "date": "2021-11-04",
- "value": 137.83263139000687
- },
- {
- "date": "2021-11-05",
- "value": 136.68074053796536
- },
- {
- "date": "2021-11-08",
- "value": 134.67820244424445
- },
- {
- "date": "2021-11-09",
- "value": 136.01997470082424
- },
- {
- "date": "2021-11-10",
- "value": 136.03168164983353
- },
- {
- "date": "2021-11-11",
- "value": 134.3072934602167
- },
- {
- "date": "2021-11-12",
- "value": 136.33708527853153
- },
- {
- "date": "2021-11-15",
- "value": 137.67165339614854
- },
- {
- "date": "2021-11-16",
- "value": 138.1011740610324
- },
- {
- "date": "2021-11-17",
- "value": 140.0821501246444
- },
- {
- "date": "2021-11-18",
- "value": 140.01946008570454
- },
- {
- "date": "2021-11-19",
- "value": 138.6686656126261
- },
- {
- "date": "2021-11-22",
- "value": 139.12977261948808
- },
- {
- "date": "2021-11-23",
- "value": 138.65862565170715
- },
- {
- "date": "2021-11-24",
- "value": 137.34777714352714
- },
- {
- "date": "2021-11-25",
- "value": 137.6827265476837
- },
- {
- "date": "2021-11-26",
- "value": 138.8374887884231
- },
- {
- "date": "2021-11-29",
- "value": 140.07625230856448
- },
- {
- "date": "2021-11-30",
- "value": 141.64885879424276
- },
- {
- "date": "2021-12-01",
- "value": 140.13392774336606
- },
- {
- "date": "2021-12-02",
- "value": 142.14247390644599
- },
- {
- "date": "2021-12-03",
- "value": 142.12049041900332
- },
- {
- "date": "2021-12-06",
- "value": 143.5022856757484
- },
- {
- "date": "2021-12-07",
- "value": 144.44429583647965
- },
- {
- "date": "2021-12-08",
- "value": 143.77029514207365
- },
- {
- "date": "2021-12-09",
- "value": 143.2690102167239
- },
- {
- "date": "2021-12-10",
- "value": 145.06866566838747
- },
- {
- "date": "2021-12-13",
- "value": 146.62988025591144
- },
- {
- "date": "2021-12-14",
- "value": 147.95991285009094
- },
- {
- "date": "2021-12-15",
- "value": 149.74143520031055
- },
- {
- "date": "2021-12-16",
- "value": 151.08858499668625
- },
- {
- "date": "2021-12-17",
- "value": 150.4270874570294
- },
- {
- "date": "2021-12-20",
- "value": 151.34835155582863
- },
- {
- "date": "2021-12-21",
- "value": 151.81428959866443
- },
- {
- "date": "2021-12-22",
- "value": 153.7786716261007
- },
- {
- "date": "2021-12-23",
- "value": 153.65163790076963
- },
- {
- "date": "2021-12-24",
- "value": 154.75245304237853
- },
- {
- "date": "2021-12-27",
- "value": 154.9515474491684
- },
- {
- "date": "2021-12-28",
- "value": 159.8549170922545
- },
- {
- "date": "2021-12-29",
- "value": 159.2007464469846
- },
- {
- "date": "2021-12-30",
- "value": 161.1200899155655
- },
- {
- "date": "2021-12-31",
- "value": 158.99211792655052
- },
- {
- "date": "2022-01-03",
- "value": 158.81592136987916
- },
- {
- "date": "2022-01-04",
- "value": 158.11621191829818
- },
- {
- "date": "2022-01-05",
- "value": 156.38229707337658
- },
- {
- "date": "2022-01-06",
- "value": 158.86551424755498
- },
- {
- "date": "2022-01-07",
- "value": 160.19950727978824
- },
- {
- "date": "2022-01-10",
- "value": 157.28432062701538
- },
- {
- "date": "2022-01-11",
- "value": 159.6083284257281
- },
- {
- "date": "2022-01-12",
- "value": 159.59819939777105
- },
- {
- "date": "2022-01-13",
- "value": 159.3746738378807
- },
- {
- "date": "2022-01-14",
- "value": 160.64615632074114
- },
- {
- "date": "2022-01-17",
- "value": 161.37935328011739
- },
- {
- "date": "2022-01-18",
- "value": 165.31151685621435
- },
- {
- "date": "2022-01-19",
- "value": 165.84965437995552
- },
- {
- "date": "2022-01-20",
- "value": 164.14786563562015
- },
- {
- "date": "2022-01-21",
- "value": 163.3103787261028
- },
- {
- "date": "2022-01-24",
- "value": 165.2672995312545
- },
- {
- "date": "2022-01-25",
- "value": 166.35742325062137
- },
- {
- "date": "2022-01-26",
- "value": 164.99943906937028
- },
- {
- "date": "2022-01-27",
- "value": 167.83231635309664
- },
- {
- "date": "2022-01-28",
- "value": 167.84043759747897
- },
- {
- "date": "2022-01-31",
- "value": 169.2909919904233
- },
- {
- "date": "2022-02-01",
- "value": 173.0362612303292
- },
- {
- "date": "2022-02-02",
- "value": 174.32071958423472
- },
- {
- "date": "2022-02-03",
- "value": 173.34117863355226
- },
- {
- "date": "2022-02-04",
- "value": 173.85056826633138
- },
- {
- "date": "2022-02-07",
- "value": 173.96180569473188
- },
- {
- "date": "2022-02-08",
- "value": 175.94626257551414
- },
- {
- "date": "2022-02-09",
- "value": 175.72751051112118
- },
- {
- "date": "2022-02-10",
- "value": 177.72156459252196
- },
- {
- "date": "2022-02-11",
- "value": 179.48912531096113
- },
- {
- "date": "2022-02-14",
- "value": 182.45011698381361
- },
- {
- "date": "2022-02-15",
- "value": 184.10263294573227
- },
- {
- "date": "2022-02-16",
- "value": 182.06835610781187
- },
- {
- "date": "2022-02-17",
- "value": 182.9754413201202
- },
- {
- "date": "2022-02-18",
- "value": 184.00837886978516
- },
- {
- "date": "2022-02-21",
- "value": 181.95737477122867
- },
- {
- "date": "2022-02-22",
- "value": 183.43003274749267
- },
- {
- "date": "2022-02-23",
- "value": 184.63504273348735
- },
- {
- "date": "2022-02-24",
- "value": 186.76242773214312
- },
- {
- "date": "2022-02-25",
- "value": 187.15916674670675
- },
- {
- "date": "2022-02-28",
- "value": 186.8080005755995
- },
- {
- "date": "2022-03-01",
- "value": 185.39214669477138
- },
- {
- "date": "2022-03-02",
- "value": 185.31917197236584
- },
- {
- "date": "2022-03-03",
- "value": 188.08622316729543
- },
- {
- "date": "2022-03-04",
- "value": 186.67033015661386
- },
- {
- "date": "2022-03-07",
- "value": 185.53705481486102
- },
- {
- "date": "2022-03-08",
- "value": 183.21144722096244
- },
- {
- "date": "2022-03-09",
- "value": 186.1417944296348
- },
- {
- "date": "2022-03-10",
- "value": 185.81301058385327
- },
- {
- "date": "2022-03-11",
- "value": 184.24074125656801
- },
- {
- "date": "2022-03-14",
- "value": 183.9229673664176
- },
- {
- "date": "2022-03-15",
- "value": 184.43616404142233
- },
- {
- "date": "2022-03-16",
- "value": 183.79739764900205
- },
- {
- "date": "2022-03-17",
- "value": 182.46987104539326
- },
- {
- "date": "2022-03-18",
- "value": 183.9489588511815
- },
- {
- "date": "2022-03-21",
- "value": 183.8845624902127
- },
- {
- "date": "2022-03-22",
- "value": 184.16310619887147
- },
- {
- "date": "2022-03-23",
- "value": 183.62958885901327
- },
- {
- "date": "2022-03-24",
- "value": 180.93198866075522
- },
- {
- "date": "2022-03-25",
- "value": 183.16221074653217
- },
- {
- "date": "2022-03-28",
- "value": 183.12814012060423
- },
- {
- "date": "2022-03-29",
- "value": 184.12756949048182
- },
- {
- "date": "2022-03-30",
- "value": 182.830284670905
- },
- {
- "date": "2022-03-31",
- "value": 181.0475648799499
- },
- {
- "date": "2022-04-01",
- "value": 179.0985721974346
- },
- {
- "date": "2022-04-04",
- "value": 179.4762445538653
- },
- {
- "date": "2022-04-05",
- "value": 182.05725458900338
- },
- {
- "date": "2022-04-06",
- "value": 183.69428514809778
- },
- {
- "date": "2022-04-07",
- "value": 185.43545976381952
- },
- {
- "date": "2022-04-08",
- "value": 186.31415821495116
- },
- {
- "date": "2022-04-11",
- "value": 186.349598977634
- },
- {
- "date": "2022-04-12",
- "value": 184.6951866057011
- },
- {
- "date": "2022-04-13",
- "value": 184.9112224580043
- },
- {
- "date": "2022-04-14",
- "value": 186.85720071514308
- },
- {
- "date": "2022-04-15",
- "value": 186.5150636274145
- },
- {
- "date": "2022-04-18",
- "value": 184.0013671688719
- },
- {
- "date": "2022-04-19",
- "value": 183.22119140891155
- },
- {
- "date": "2022-04-20",
- "value": 180.89168022941516
- },
- {
- "date": "2022-04-21",
- "value": 181.49778760000828
- },
- {
- "date": "2022-04-22",
- "value": 183.51413057252051
- },
- {
- "date": "2022-04-25",
- "value": 183.56084798874787
- },
- {
- "date": "2022-04-26",
- "value": 181.56200149904475
- },
- {
- "date": "2022-04-27",
- "value": 181.96541417158653
- },
- {
- "date": "2022-04-28",
- "value": 180.61106280843848
- },
- {
- "date": "2022-04-29",
- "value": 179.8050174260012
- },
- {
- "date": "2022-05-02",
- "value": 178.17842407204353
- },
- {
- "date": "2022-05-03",
- "value": 176.3530719056853
- },
- {
- "date": "2022-05-04",
- "value": 179.38379146454741
- },
- {
- "date": "2022-05-05",
- "value": 179.0038512692933
- },
- {
- "date": "2022-05-06",
- "value": 178.31455055897578
- },
- {
- "date": "2022-05-09",
- "value": 179.30810193029086
- },
- {
- "date": "2022-05-10",
- "value": 178.36921694847953
- },
- {
- "date": "2022-05-11",
- "value": 180.83385388040523
- },
- {
- "date": "2022-05-12",
- "value": 180.23708917299183
- },
- {
- "date": "2022-05-13",
- "value": 180.7340599928502
- },
- {
- "date": "2022-05-16",
- "value": 181.56786413326586
- },
- {
- "date": "2022-05-17",
- "value": 177.35540133164906
- },
- {
- "date": "2022-05-18",
- "value": 174.87105963479013
- },
- {
- "date": "2022-05-19",
- "value": 174.90906792094364
- },
- {
- "date": "2022-05-20",
- "value": 173.74643847462914
- },
- {
- "date": "2022-05-23",
- "value": 172.88714199626858
- },
- {
- "date": "2022-05-24",
- "value": 174.5664369991185
- },
- {
- "date": "2022-05-25",
- "value": 174.6928178065059
- },
- {
- "date": "2022-05-26",
- "value": 174.05066162384247
- },
- {
- "date": "2022-05-27",
- "value": 174.2116679325527
- },
- {
- "date": "2022-05-30",
- "value": 176.37889054283085
- },
- {
- "date": "2022-05-31",
- "value": 176.47856868570588
- },
- {
- "date": "2022-06-01",
- "value": 174.09229238082372
- },
- {
- "date": "2022-06-02",
- "value": 172.40012324155524
- },
- {
- "date": "2022-06-03",
- "value": 174.50565113850527
- },
- {
- "date": "2022-06-06",
- "value": 174.366094057243
- },
- {
- "date": "2022-06-07",
- "value": 174.49210217163363
- },
- {
- "date": "2022-06-08",
- "value": 174.90038874549148
- },
- {
- "date": "2022-06-09",
- "value": 173.9236029518884
- },
- {
- "date": "2022-06-10",
- "value": 173.05774071050277
- },
- {
- "date": "2022-06-13",
- "value": 173.09068689819102
- },
- {
- "date": "2022-06-14",
- "value": 172.07364223925927
- },
- {
- "date": "2022-06-15",
- "value": 173.784451218063
- },
- {
- "date": "2022-06-16",
- "value": 175.15653004360462
- },
- {
- "date": "2022-06-17",
- "value": 174.9698412771693
- },
- {
- "date": "2022-06-20",
- "value": 174.3686476460181
- },
- {
- "date": "2022-06-21",
- "value": 175.0226464692796
- },
- {
- "date": "2022-06-22",
- "value": 176.79215747894534
- },
- {
- "date": "2022-06-23",
- "value": 175.4311580647934
- },
- {
- "date": "2022-06-24",
- "value": 171.79995980405977
- },
- {
- "date": "2022-06-27",
- "value": 171.45915511728157
- },
- {
- "date": "2022-06-28",
- "value": 172.64690714409667
- },
- {
- "date": "2022-06-29",
- "value": 173.53854563500676
- },
- {
- "date": "2022-06-30",
- "value": 172.60981102336527
- },
- {
- "date": "2022-07-01",
- "value": 174.14763456896873
- },
- {
- "date": "2022-07-04",
- "value": 173.64910010627236
- },
- {
- "date": "2022-07-05",
- "value": 175.41015228773728
- },
- {
- "date": "2022-07-06",
- "value": 177.39399191817654
- },
- {
- "date": "2022-07-07",
- "value": 175.83519716160004
- },
- {
- "date": "2022-07-08",
- "value": 176.5996329036696
- },
- {
- "date": "2022-07-11",
- "value": 178.66313731575636
- },
- {
- "date": "2022-07-12",
- "value": 175.4721169640538
- },
- {
- "date": "2022-07-13",
- "value": 173.34529344223154
- },
- {
- "date": "2022-07-14",
- "value": 176.1434925362978
- },
- {
- "date": "2022-07-15",
- "value": 176.09295654485638
- },
- {
- "date": "2022-07-18",
- "value": 177.9578953976064
- },
- {
- "date": "2022-07-19",
- "value": 180.34166457631486
- },
- {
- "date": "2022-07-20",
- "value": 180.52263434757566
- },
- {
- "date": "2022-07-21",
- "value": 182.45894689934755
- },
- {
- "date": "2022-07-22",
- "value": 179.95826622515435
- },
- {
- "date": "2022-07-25",
- "value": 179.80881211698275
- },
- {
- "date": "2022-07-26",
- "value": 181.2910718479497
- },
- {
- "date": "2022-07-27",
- "value": 182.378695977059
- },
- {
- "date": "2022-07-28",
- "value": 180.84344329595197
- },
- {
- "date": "2022-07-29",
- "value": 179.0400365941173
- },
- {
- "date": "2022-08-01",
- "value": 182.5058884293554
- },
- {
- "date": "2022-08-02",
- "value": 184.03424724305236
- },
- {
- "date": "2022-08-03",
- "value": 183.38969089840745
- },
- {
- "date": "2022-08-04",
- "value": 182.61277134606993
- },
- {
- "date": "2022-08-05",
- "value": 179.40753996211657
- },
- {
- "date": "2022-08-08",
- "value": 180.52094189084272
- },
- {
- "date": "2022-08-09",
- "value": 179.42182098973754
- },
- {
- "date": "2022-08-10",
- "value": 177.66694936100592
- },
- {
- "date": "2022-08-11",
- "value": 175.6931955615347
- },
- {
- "date": "2022-08-12",
- "value": 177.8507455830907
- },
- {
- "date": "2022-08-15",
- "value": 184.1859121957383
- },
- {
- "date": "2022-08-16",
- "value": 183.86127363269907
- },
- {
- "date": "2022-08-17",
- "value": 185.02694195228707
- },
- {
- "date": "2022-08-18",
- "value": 185.97467354970206
- },
- {
- "date": "2022-08-19",
- "value": 183.97069473336333
- },
- {
- "date": "2022-08-22",
- "value": 183.24960740109978
- },
- {
- "date": "2022-08-23",
- "value": 184.70816477316203
- },
- {
- "date": "2022-08-24",
- "value": 183.69216485239534
- },
- {
- "date": "2022-08-25",
- "value": 183.7320791915035
- },
- {
- "date": "2022-08-26",
- "value": 183.60803023985468
- },
- {
- "date": "2022-08-29",
- "value": 183.7033854224083
- },
- {
- "date": "2022-08-30",
- "value": 184.7211364433535
- },
- {
- "date": "2022-08-31",
- "value": 184.50539162349799
- },
- {
- "date": "2022-09-01",
- "value": 184.99582132566803
- },
- {
- "date": "2022-09-02",
- "value": 184.97130992332012
- },
- {
- "date": "2022-09-05",
- "value": 187.10419154971632
- },
- {
- "date": "2022-09-06",
- "value": 189.03232079906977
- },
- {
- "date": "2022-09-07",
- "value": 190.6272160451858
- },
- {
- "date": "2022-09-08",
- "value": 188.61621773872483
- },
- {
- "date": "2022-09-09",
- "value": 189.20727342066888
- },
- {
- "date": "2022-09-12",
- "value": 188.9445968133091
- },
- {
- "date": "2022-09-13",
- "value": 190.81195875240917
- },
- {
- "date": "2022-09-14",
- "value": 193.17920295608212
- },
- {
- "date": "2022-09-15",
- "value": 192.78385659650397
- },
- {
- "date": "2022-09-16",
- "value": 194.60037529329378
- },
- {
- "date": "2022-09-19",
- "value": 192.65429456712272
- },
- {
- "date": "2022-09-20",
- "value": 192.22330222309907
- },
- {
- "date": "2022-09-21",
- "value": 192.20061513938995
- },
- {
- "date": "2022-09-22",
- "value": 193.13041030614298
- },
- {
- "date": "2022-09-23",
- "value": 188.5256509096753
- },
- {
- "date": "2022-09-26",
- "value": 188.8850606986893
- },
- {
- "date": "2022-09-27",
- "value": 187.3738802677684
- },
- {
- "date": "2022-09-28",
- "value": 186.1395354554199
- },
- {
- "date": "2022-09-29",
- "value": 186.85527763157418
- },
- {
- "date": "2022-09-30",
- "value": 189.10419957521412
- },
- {
- "date": "2022-10-03",
- "value": 191.0269793991275
- },
- {
- "date": "2022-10-04",
- "value": 189.1331492012651
- },
- {
- "date": "2022-10-05",
- "value": 191.04670158604046
- },
- {
- "date": "2022-10-06",
- "value": 190.56348417020038
- },
- {
- "date": "2022-10-07",
- "value": 189.6732851002448
- },
- {
- "date": "2022-10-10",
- "value": 191.55888078817955
- },
- {
- "date": "2022-10-11",
- "value": 190.99318748349734
- },
- {
- "date": "2022-10-12",
- "value": 193.98002901494834
- },
- {
- "date": "2022-10-13",
- "value": 194.72171657802693
- },
- {
- "date": "2022-10-14",
- "value": 195.178714086525
- },
- {
- "date": "2022-10-17",
- "value": 193.81816193113087
- },
- {
- "date": "2022-10-18",
- "value": 196.1790187955128
- },
- {
- "date": "2022-10-19",
- "value": 199.78893038035324
- },
- {
- "date": "2022-10-20",
- "value": 198.46918763798556
- },
- {
- "date": "2022-10-21",
- "value": 195.67856673311104
- },
- {
- "date": "2022-10-24",
- "value": 196.9528197515824
- },
- {
- "date": "2022-10-25",
- "value": 194.11150733864554
- },
- {
- "date": "2022-10-26",
- "value": 189.21022809575342
- },
- {
- "date": "2022-10-27",
- "value": 187.3841744467867
- },
- {
- "date": "2022-10-28",
- "value": 184.6848559238856
- },
- {
- "date": "2022-10-31",
- "value": 183.6859297254932
- },
- {
- "date": "2022-11-01",
- "value": 187.20185044905156
- },
- {
- "date": "2022-11-02",
- "value": 190.06719489595858
- },
- {
- "date": "2022-11-03",
- "value": 188.67288825335592
- },
- {
- "date": "2022-11-04",
- "value": 186.58428353745188
- },
- {
- "date": "2022-11-07",
- "value": 187.1708341682027
- },
- {
- "date": "2022-11-08",
- "value": 185.03707527418004
- },
- {
- "date": "2022-11-09",
- "value": 186.65641644148653
- },
- {
- "date": "2022-11-10",
- "value": 187.94059518931388
- },
- {
- "date": "2022-11-11",
- "value": 188.8657212111467
- },
- {
- "date": "2022-11-14",
- "value": 187.9141596525209
- },
- {
- "date": "2022-11-15",
- "value": 186.59760171883298
- },
- {
- "date": "2022-11-16",
- "value": 186.33184829862
- },
- {
- "date": "2022-11-17",
- "value": 185.20206017936923
- },
- {
- "date": "2022-11-18",
- "value": 187.10391675587033
- },
- {
- "date": "2022-11-21",
- "value": 191.38578062421303
- },
- {
- "date": "2022-11-22",
- "value": 191.98484721969515
- },
- {
- "date": "2022-11-23",
- "value": 192.8369047649446
- },
- {
- "date": "2022-11-24",
- "value": 192.7841076975567
- },
- {
- "date": "2022-11-25",
- "value": 191.82755410191814
- },
- {
- "date": "2022-11-28",
- "value": 191.3776806281394
- },
- {
- "date": "2022-11-29",
- "value": 191.90821058066808
- },
- {
- "date": "2022-11-30",
- "value": 189.43143267985812
- },
- {
- "date": "2022-12-01",
- "value": 187.67609302599112
- },
- {
- "date": "2022-12-02",
- "value": 185.08797754125206
- },
- {
- "date": "2022-12-05",
- "value": 183.61848411539103
- },
- {
- "date": "2022-12-06",
- "value": 181.91965480460536
- },
- {
- "date": "2022-12-07",
- "value": 181.15791758064142
- },
- {
- "date": "2022-12-08",
- "value": 180.9360107168567
- },
- {
- "date": "2022-12-09",
- "value": 183.44984063523944
- },
- {
- "date": "2022-12-12",
- "value": 184.22790807444798
- },
- {
- "date": "2022-12-13",
- "value": 184.68321353898867
- },
- {
- "date": "2022-12-14",
- "value": 182.6441778787343
- },
- {
- "date": "2022-12-15",
- "value": 181.41502029424456
- },
- {
- "date": "2022-12-16",
- "value": 179.35285583592298
- },
- {
- "date": "2022-12-19",
- "value": 181.49020026746882
- },
- {
- "date": "2022-12-20",
- "value": 181.01809304808353
- },
- {
- "date": "2022-12-21",
- "value": 180.90349572222635
- },
- {
- "date": "2022-12-22",
- "value": 181.0765910747008
- },
- {
- "date": "2022-12-23",
- "value": 181.28118957564126
- },
- {
- "date": "2022-12-26",
- "value": 184.07188249813314
- },
- {
- "date": "2022-12-27",
- "value": 184.73712745236998
- },
- {
- "date": "2022-12-28",
- "value": 185.64726367624743
- },
- {
- "date": "2022-12-29",
- "value": 187.4738980891586
- },
- {
- "date": "2022-12-30",
- "value": 185.60928614554504
- },
- {
- "date": "2023-01-02",
- "value": 186.09872819273735
- },
- {
- "date": "2023-01-03",
- "value": 186.59338769818044
- },
- {
- "date": "2023-01-04",
- "value": 185.20247736286356
- },
- {
- "date": "2023-01-05",
- "value": 185.99851113750842
- },
- {
- "date": "2023-01-06",
- "value": 187.36920933380065
- },
- {
- "date": "2023-01-09",
- "value": 186.38500391952104
- },
- {
- "date": "2023-01-10",
- "value": 188.24015064747533
- },
- {
- "date": "2023-01-11",
- "value": 189.49906153256492
- },
- {
- "date": "2023-01-12",
- "value": 193.51915839364443
- },
- {
- "date": "2023-01-13",
- "value": 192.51803619100002
- },
- {
- "date": "2023-01-16",
- "value": 193.37519920944985
- },
- {
- "date": "2023-01-17",
- "value": 190.62328201432342
- },
- {
- "date": "2023-01-18",
- "value": 187.0995208599165
- },
- {
- "date": "2023-01-19",
- "value": 190.65133235148573
- },
- {
- "date": "2023-01-20",
- "value": 189.78444462385363
- },
- {
- "date": "2023-01-23",
- "value": 191.4725053543529
- },
- {
- "date": "2023-01-24",
- "value": 190.90369910024796
- },
- {
- "date": "2023-01-25",
- "value": 191.1236545235688
- },
- {
- "date": "2023-01-26",
- "value": 186.2802727194917
- },
- {
- "date": "2023-01-27",
- "value": 186.63667832264045
- },
- {
- "date": "2023-01-30",
- "value": 186.10932823737494
- },
- {
- "date": "2023-01-31",
- "value": 185.51561122454322
- },
- {
- "date": "2023-02-01",
- "value": 183.685578927406
- },
- {
- "date": "2023-02-02",
- "value": 181.3722193638272
- },
- {
- "date": "2023-02-03",
- "value": 183.59299115728209
- },
- {
- "date": "2023-02-06",
- "value": 183.29349235298292
- },
- {
- "date": "2023-02-07",
- "value": 180.58374220576752
- },
- {
- "date": "2023-02-08",
- "value": 180.74373792259436
- },
- {
- "date": "2023-02-09",
- "value": 183.51997975371714
- },
- {
- "date": "2023-02-10",
- "value": 182.9198960423718
- },
- {
- "date": "2023-02-13",
- "value": 180.65871004965194
- },
- {
- "date": "2023-02-14",
- "value": 181.78026515743096
- },
- {
- "date": "2023-02-15",
- "value": 182.1023329014378
- },
- {
- "date": "2023-02-16",
- "value": 182.0191599162744
- },
- {
- "date": "2023-02-17",
- "value": 183.60361311627068
- },
- {
- "date": "2023-02-20",
- "value": 183.1867265918316
- },
- {
- "date": "2023-02-21",
- "value": 184.14910209288558
- },
- {
- "date": "2023-02-22",
- "value": 184.75306693537138
- },
- {
- "date": "2023-02-23",
- "value": 187.11550249796431
- },
- {
- "date": "2023-02-24",
- "value": 184.77654438770332
- },
- {
- "date": "2023-02-27",
- "value": 182.51478408673626
- },
- {
- "date": "2023-02-28",
- "value": 183.78438960636677
- },
- {
- "date": "2023-03-01",
- "value": 181.75561194065034
- },
- {
- "date": "2023-03-02",
- "value": 177.6806898937575
- },
- {
- "date": "2023-03-03",
- "value": 177.3419319160619
- },
- {
- "date": "2023-03-06",
- "value": 175.04303128348488
- },
- {
- "date": "2023-03-07",
- "value": 172.75063205544774
- },
- {
- "date": "2023-03-08",
- "value": 175.44086129908587
- },
- {
- "date": "2023-03-09",
- "value": 177.0679533676764
- },
- {
- "date": "2023-03-10",
- "value": 174.2087032138339
- },
- {
- "date": "2023-03-13",
- "value": 175.6308924954282
- },
- {
- "date": "2023-03-14",
- "value": 177.12986072644125
- },
- {
- "date": "2023-03-15",
- "value": 176.97368831631985
- },
- {
- "date": "2023-03-16",
- "value": 174.88543070517892
- },
- {
- "date": "2023-03-17",
- "value": 174.66399283237416
- },
- {
- "date": "2023-03-20",
- "value": 173.04506203907368
- },
- {
- "date": "2023-03-21",
- "value": 173.56979344167723
- },
- {
- "date": "2023-03-22",
- "value": 171.83650540886987
- },
- {
- "date": "2023-03-23",
- "value": 170.93622221433546
- },
- {
- "date": "2023-03-24",
- "value": 171.38490933760713
- },
- {
- "date": "2023-03-27",
- "value": 171.54599601503662
- },
- {
- "date": "2023-03-28",
- "value": 171.49217127609975
- },
- {
- "date": "2023-03-29",
- "value": 172.5256006647191
- },
- {
- "date": "2023-03-30",
- "value": 173.4793671129438
- },
- {
- "date": "2023-03-31",
- "value": 174.81869024884065
- },
- {
- "date": "2023-04-03",
- "value": 175.8735744574504
- },
- {
- "date": "2023-04-04",
- "value": 176.66952752652503
- },
- {
- "date": "2023-04-05",
- "value": 172.2934611229302
- },
- {
- "date": "2023-04-06",
- "value": 172.3394748941266
- },
- {
- "date": "2023-04-07",
- "value": 172.70275212508918
- },
- {
- "date": "2023-04-10",
- "value": 175.99892968716037
- },
- {
- "date": "2023-04-11",
- "value": 176.22469911241808
- },
- {
- "date": "2023-04-12",
- "value": 173.6605081265277
- },
- {
- "date": "2023-04-13",
- "value": 174.289768301988
- },
- {
- "date": "2023-04-14",
- "value": 178.02777084414623
- },
- {
- "date": "2023-04-17",
- "value": 177.48990340871725
- },
- {
- "date": "2023-04-18",
- "value": 176.3843740413107
- },
- {
- "date": "2023-04-19",
- "value": 175.7308283170942
- },
- {
- "date": "2023-04-20",
- "value": 176.35407950553414
- },
- {
- "date": "2023-04-21",
- "value": 175.24457570255464
- },
- {
- "date": "2023-04-24",
- "value": 171.91189844925566
- },
- {
- "date": "2023-04-25",
- "value": 170.7119665517016
- },
- {
- "date": "2023-04-26",
- "value": 170.15896105736294
- },
- {
- "date": "2023-04-27",
- "value": 170.81728367092293
- },
- {
- "date": "2023-04-28",
- "value": 174.6471191812896
- },
- {
- "date": "2023-05-01",
- "value": 172.0404090265938
- },
- {
- "date": "2023-05-02",
- "value": 173.2373382774029
- },
- {
- "date": "2023-05-03",
- "value": 173.17347604724432
- },
- {
- "date": "2023-05-04",
- "value": 173.54076607348253
- },
- {
- "date": "2023-05-05",
- "value": 172.94776771203163
- },
- {
- "date": "2023-05-08",
- "value": 172.03274633055622
- },
- {
- "date": "2023-05-09",
- "value": 172.28222135727924
- },
- {
- "date": "2023-05-10",
- "value": 170.8424219898911
- },
- {
- "date": "2023-05-11",
- "value": 172.55978778180017
- },
- {
- "date": "2023-05-12",
- "value": 174.48686090075483
- },
- {
- "date": "2023-05-15",
- "value": 175.23930199352804
- },
- {
- "date": "2023-05-16",
- "value": 173.84837044049394
- },
- {
- "date": "2023-05-17",
- "value": 175.39846525804884
- },
- {
- "date": "2023-05-18",
- "value": 176.4328057920585
- },
- {
- "date": "2023-05-19",
- "value": 175.63857022334636
- },
- {
- "date": "2023-05-22",
- "value": 175.54075505996798
- },
- {
- "date": "2023-05-23",
- "value": 178.74495261482184
- },
- {
- "date": "2023-05-24",
- "value": 175.929344242635
- },
- {
- "date": "2023-05-25",
- "value": 181.17154485143277
- },
- {
- "date": "2023-05-26",
- "value": 177.85657554690445
- },
- {
- "date": "2023-05-29",
- "value": 178.73008865810465
- },
- {
- "date": "2023-05-30",
- "value": 178.02036723993183
- },
- {
- "date": "2023-05-31",
- "value": 178.09622703227
- },
- {
- "date": "2023-06-01",
- "value": 176.69880166989947
- },
- {
- "date": "2023-06-02",
- "value": 179.4142601410467
- },
- {
- "date": "2023-06-05",
- "value": 184.95091577335958
- },
- {
- "date": "2023-06-06",
- "value": 184.3853459138249
- },
- {
- "date": "2023-06-07",
- "value": 186.68842120529558
- },
- {
- "date": "2023-06-08",
- "value": 188.41187344720126
- },
- {
- "date": "2023-06-09",
- "value": 188.71085034483028
- },
- {
- "date": "2023-06-12",
- "value": 191.76170495041674
- },
- {
- "date": "2023-06-13",
- "value": 188.08858340531293
- },
- {
- "date": "2023-06-14",
- "value": 188.02709423638
- },
- {
- "date": "2023-06-15",
- "value": 186.35054878487927
- },
- {
- "date": "2023-06-16",
- "value": 186.04348214524245
- },
- {
- "date": "2023-06-19",
- "value": 184.36222863855448
- },
- {
- "date": "2023-06-20",
- "value": 184.46918689583623
- },
- {
- "date": "2023-06-21",
- "value": 185.06567181273883
- },
- {
- "date": "2023-06-22",
- "value": 181.99420495375193
- },
- {
- "date": "2023-06-23",
- "value": 183.66798376800165
- },
- {
- "date": "2023-06-26",
- "value": 186.30226086350095
- },
- {
- "date": "2023-06-27",
- "value": 188.8078925538689
- },
- {
- "date": "2023-06-28",
- "value": 189.61097779265913
- },
- {
- "date": "2023-06-29",
- "value": 190.70761726530182
- },
- {
- "date": "2023-06-30",
- "value": 189.9505789987774
- },
- {
- "date": "2023-07-03",
- "value": 190.18680276788743
- },
- {
- "date": "2023-07-04",
- "value": 189.25160492480052
- },
- {
- "date": "2023-07-05",
- "value": 189.90480166860257
- },
- {
- "date": "2023-07-06",
- "value": 188.07957779523696
- },
- {
- "date": "2023-07-07",
- "value": 186.48046141913733
- },
- {
- "date": "2023-07-10",
- "value": 186.37435506682962
- },
- {
- "date": "2023-07-11",
- "value": 186.89855422732649
- },
- {
- "date": "2023-07-12",
- "value": 184.51980273198956
- },
- {
- "date": "2023-07-13",
- "value": 184.5390410967608
- },
- {
- "date": "2023-07-14",
- "value": 184.16137990339564
- },
- {
- "date": "2023-07-17",
- "value": 185.08088970767486
- },
- {
- "date": "2023-07-18",
- "value": 187.30122261092268
- },
- {
- "date": "2023-07-19",
- "value": 186.41035992506934
- },
- {
- "date": "2023-07-20",
- "value": 184.2043663642878
- },
- {
- "date": "2023-07-21",
- "value": 180.76985396530773
- },
- {
- "date": "2023-07-24",
- "value": 181.11643258658245
- },
- {
- "date": "2023-07-25",
- "value": 183.43402676331198
- },
- {
- "date": "2023-07-26",
- "value": 183.76535021363975
- },
- {
- "date": "2023-07-27",
- "value": 182.65142576574974
- },
- {
- "date": "2023-07-28",
- "value": 184.3735122284462
- },
- {
- "date": "2023-07-31",
- "value": 185.46080587893164
- },
- {
- "date": "2023-08-01",
- "value": 185.6612723684105
- },
- {
- "date": "2023-08-02",
- "value": 185.7287728519883
- },
- {
- "date": "2023-08-03",
- "value": 184.0683640292839
- },
- {
- "date": "2023-08-04",
- "value": 184.42982670735412
- },
- {
- "date": "2023-08-07",
- "value": 186.01565085510006
- },
- {
- "date": "2023-08-08",
- "value": 184.11037468747696
- },
- {
- "date": "2023-08-09",
- "value": 186.88298163317174
- },
- {
- "date": "2023-08-10",
- "value": 186.46436343191166
- },
- {
- "date": "2023-08-11",
- "value": 189.5963155253309
- },
- {
- "date": "2023-08-14",
- "value": 191.55852305836615
- },
- {
- "date": "2023-08-15",
- "value": 186.3016063745689
- },
- {
- "date": "2023-08-16",
- "value": 190.90796758094498
- },
- {
- "date": "2023-08-17",
- "value": 189.14663512008775
- },
- {
- "date": "2023-08-18",
- "value": 190.34758440345828
- },
- {
- "date": "2023-08-21",
- "value": 191.51095724875836
- },
- {
- "date": "2023-08-22",
- "value": 189.7519553350147
- },
- {
- "date": "2023-08-23",
- "value": 190.09222947282876
- },
- {
- "date": "2023-08-24",
- "value": 192.46349522272084
- },
- {
- "date": "2023-08-25",
- "value": 193.1642463655746
- },
- {
- "date": "2023-08-28",
- "value": 190.12987942133208
- },
- {
- "date": "2023-08-29",
- "value": 190.0994584388733
- },
- {
- "date": "2023-08-30",
- "value": 187.91993444992517
- },
- {
- "date": "2023-08-31",
- "value": 187.90223482783756
- },
- {
- "date": "2023-09-01",
- "value": 188.2623208518311
- },
- {
- "date": "2023-09-04",
- "value": 188.0983797608217
- },
- {
- "date": "2023-09-05",
- "value": 184.339278249868
- },
- {
- "date": "2023-09-06",
- "value": 187.74644524845627
- },
- {
- "date": "2023-09-07",
- "value": 185.218991153022
- },
- {
- "date": "2023-09-08",
- "value": 189.17515381417493
- },
- {
- "date": "2023-09-11",
- "value": 188.94134617757138
- },
- {
- "date": "2023-09-12",
- "value": 188.77895266612848
- },
- {
- "date": "2023-09-13",
- "value": 186.05452249244848
- },
- {
- "date": "2023-09-14",
- "value": 186.71908106569126
- },
- {
- "date": "2023-09-15",
- "value": 180.25524900550784
- },
- {
- "date": "2023-09-18",
- "value": 180.6349812493157
- },
- {
- "date": "2023-09-19",
- "value": 180.1298300795995
- },
- {
- "date": "2023-09-20",
- "value": 180.52779292472934
- },
- {
- "date": "2023-09-21",
- "value": 179.11256730446442
- },
- {
- "date": "2023-09-22",
- "value": 173.6585149140688
- },
- {
- "date": "2023-09-25",
- "value": 172.14267167272254
- },
- {
- "date": "2023-09-26",
- "value": 173.21180691946253
- },
- {
- "date": "2023-09-27",
- "value": 172.80526816693447
- },
- {
- "date": "2023-09-28",
- "value": 173.1333447679249
- },
- {
- "date": "2023-09-29",
- "value": 173.32145007386768
- },
- {
- "date": "2023-10-02",
- "value": 175.8738348116072
- },
- {
- "date": "2023-10-03",
- "value": 176.26424674293054
- },
- {
- "date": "2023-10-04",
- "value": 177.80887601666402
- },
- {
- "date": "2023-10-05",
- "value": 178.9524581096299
- },
- {
- "date": "2023-10-06",
- "value": 180.80089768811322
- },
- {
- "date": "2023-10-09",
- "value": 181.26206745455445
- },
- {
- "date": "2023-10-10",
- "value": 179.02339137141374
- },
- {
- "date": "2023-10-11",
- "value": 181.23078735971703
- },
- {
- "date": "2023-10-12",
- "value": 178.2730202636627
- },
- {
- "date": "2023-10-13",
- "value": 177.70873598843266
- },
- {
- "date": "2023-10-16",
- "value": 179.95324850796487
- },
- {
- "date": "2023-10-17",
- "value": 181.5908215617823
- },
- {
- "date": "2023-10-18",
- "value": 182.30521846449918
- },
- {
- "date": "2023-10-19",
- "value": 183.46018507602122
- },
- {
- "date": "2023-10-20",
- "value": 184.31559234082957
- },
- {
- "date": "2023-10-23",
- "value": 185.14459091336803
- },
- {
- "date": "2023-10-24",
- "value": 187.5086172270963
- },
- {
- "date": "2023-10-25",
- "value": 186.9369894183306
- },
- {
- "date": "2023-10-26",
- "value": 189.50764942400474
- },
- {
- "date": "2023-10-27",
- "value": 186.66447742061771
- },
- {
- "date": "2023-10-30",
- "value": 186.25129798947611
- },
- {
- "date": "2023-10-31",
- "value": 187.90408659491803
- }
- ],
- "benchmark": [
- {
- "date": "2020-01-02",
- "value": 0.9861620617939565
- },
- {
- "date": "2020-01-03",
- "value": 0.9944000920903785
- },
- {
- "date": "2020-01-06",
- "value": 1.0131163880791534
- },
- {
- "date": "2020-01-07",
- "value": 1.01035345853133
- },
- {
- "date": "2020-01-08",
- "value": 1.0091509732524249
- },
- {
- "date": "2020-01-09",
- "value": 1.010744858408942
- },
- {
- "date": "2020-01-10",
- "value": 1.0126177251102622
- },
- {
- "date": "2020-01-13",
- "value": 1.0318339033418935
- },
- {
- "date": "2020-01-14",
- "value": 1.029183566374136
- },
- {
- "date": "2020-01-15",
- "value": 1.0393206010050409
- },
- {
- "date": "2020-01-16",
- "value": 1.063183181562598
- },
- {
- "date": "2020-01-17",
- "value": 1.0453380919551454
- },
- {
- "date": "2020-01-20",
- "value": 1.0566365459561826
- },
- {
- "date": "2020-01-21",
- "value": 1.0704531423187966
- },
- {
- "date": "2020-01-22",
- "value": 1.0795429725363053
- },
- {
- "date": "2020-01-23",
- "value": 1.0875569802009908
- },
- {
- "date": "2020-01-24",
- "value": 1.0652856815795044
- },
- {
- "date": "2020-01-27",
- "value": 1.042540049347483
- },
- {
- "date": "2020-01-28",
- "value": 1.037642070046884
- },
- {
- "date": "2020-01-29",
- "value": 1.0350818201960452
- },
- {
- "date": "2020-01-30",
- "value": 1.0399044141981622
- },
- {
- "date": "2020-01-31",
- "value": 1.034508387754774
- },
- {
- "date": "2020-02-03",
- "value": 1.029916383352603
- },
- {
- "date": "2020-02-04",
- "value": 1.0335911824044943
- },
- {
- "date": "2020-02-05",
- "value": 1.034234946357112
- },
- {
- "date": "2020-02-06",
- "value": 1.022508854421878
- },
- {
- "date": "2020-02-07",
- "value": 1.0513665971329844
- },
- {
- "date": "2020-02-10",
- "value": 1.0539377393161864
- },
- {
- "date": "2020-02-11",
- "value": 1.0370758528185897
- },
- {
- "date": "2020-02-12",
- "value": 1.0439458889771733
- },
- {
- "date": "2020-02-13",
- "value": 1.0641727477232932
- },
- {
- "date": "2020-02-14",
- "value": 1.0568733722698822
- },
- {
- "date": "2020-02-17",
- "value": 1.070421433944782
- },
- {
- "date": "2020-02-18",
- "value": 1.063576796000302
- },
- {
- "date": "2020-02-19",
- "value": 1.0766466280893177
- },
- {
- "date": "2020-02-20",
- "value": 1.0837018847588955
- },
- {
- "date": "2020-02-21",
- "value": 1.1041423845008471
- },
- {
- "date": "2020-02-24",
- "value": 1.0866089438616693
- },
- {
- "date": "2020-02-25",
- "value": 1.0680430886604635
- },
- {
- "date": "2020-02-26",
- "value": 1.0615064006842454
- },
- {
- "date": "2020-02-27",
- "value": 1.0465803465267096
- },
- {
- "date": "2020-02-28",
- "value": 1.0339926351977031
- },
- {
- "date": "2020-03-02",
- "value": 1.0302959728013117
- },
- {
- "date": "2020-03-03",
- "value": 1.037405296952094
- },
- {
- "date": "2020-03-04",
- "value": 1.0569129958582397
- },
- {
- "date": "2020-03-05",
- "value": 1.0236619148111263
- },
- {
- "date": "2020-03-06",
- "value": 1.0300425972724458
- },
- {
- "date": "2020-03-09",
- "value": 1.0292638655293316
- },
- {
- "date": "2020-03-10",
- "value": 1.0404495187595986
- },
- {
- "date": "2020-03-11",
- "value": 1.0492616071216903
- },
- {
- "date": "2020-03-12",
- "value": 1.0554062528010477
- },
- {
- "date": "2020-03-13",
- "value": 1.0727899113196222
- },
- {
- "date": "2020-03-16",
- "value": 1.0611392879618795
- },
- {
- "date": "2020-03-17",
- "value": 1.052101973772013
- },
- {
- "date": "2020-03-18",
- "value": 1.037727251114427
- },
- {
- "date": "2020-03-19",
- "value": 1.0396242022200421
- },
- {
- "date": "2020-03-20",
- "value": 1.0420590410231827
- },
- {
- "date": "2020-03-23",
- "value": 1.0321456107006
- },
- {
- "date": "2020-03-24",
- "value": 1.0441397410577704
- },
- {
- "date": "2020-03-25",
- "value": 1.0388668398969534
- },
- {
- "date": "2020-03-26",
- "value": 1.0452628268981445
- },
- {
- "date": "2020-03-27",
- "value": 1.026880265842354
- },
- {
- "date": "2020-03-30",
- "value": 1.0229341329583137
- },
- {
- "date": "2020-03-31",
- "value": 1.0298133206846443
- },
- {
- "date": "2020-04-01",
- "value": 1.0454967727344606
- },
- {
- "date": "2020-04-02",
- "value": 1.057673062460695
- },
- {
- "date": "2020-04-03",
- "value": 1.0605459883141437
- },
- {
- "date": "2020-04-06",
- "value": 1.0662656084249282
- },
- {
- "date": "2020-04-07",
- "value": 1.0579218856658041
- },
- {
- "date": "2020-04-08",
- "value": 1.06012213532224
- },
- {
- "date": "2020-04-09",
- "value": 1.0612839081080183
- },
- {
- "date": "2020-04-10",
- "value": 1.068147940280642
- },
- {
- "date": "2020-04-13",
- "value": 1.0594269521235158
- },
- {
- "date": "2020-04-14",
- "value": 1.0608651761395185
- },
- {
- "date": "2020-04-15",
- "value": 1.0748641568588806
- },
- {
- "date": "2020-04-16",
- "value": 1.0576642604916167
- },
- {
- "date": "2020-04-17",
- "value": 1.0648917844182908
- },
- {
- "date": "2020-04-20",
- "value": 1.0597939741610005
- },
- {
- "date": "2020-04-21",
- "value": 1.055417135545593
- },
- {
- "date": "2020-04-22",
- "value": 1.0659215592248317
- },
- {
- "date": "2020-04-23",
- "value": 1.0658594051871233
- },
- {
- "date": "2020-04-24",
- "value": 1.0360010285286707
- },
- {
- "date": "2020-04-27",
- "value": 1.0489189615566736
- },
- {
- "date": "2020-04-28",
- "value": 1.0368052219108947
- },
- {
- "date": "2020-04-29",
- "value": 1.0377551261616667
- },
- {
- "date": "2020-04-30",
- "value": 1.030643576802251
- },
- {
- "date": "2020-05-01",
- "value": 1.0346561192888106
- },
- {
- "date": "2020-05-04",
- "value": 1.0407215593752952
- },
- {
- "date": "2020-05-05",
- "value": 1.0610766109244527
- },
- {
- "date": "2020-05-06",
- "value": 1.0456639432752943
- },
- {
- "date": "2020-05-07",
- "value": 1.045605092369194
- },
- {
- "date": "2020-05-08",
- "value": 1.037723930681496
- },
- {
- "date": "2020-05-11",
- "value": 1.0386648110118966
- },
- {
- "date": "2020-05-12",
- "value": 1.045987045555531
- },
- {
- "date": "2020-05-13",
- "value": 1.0617978713505347
- },
- {
- "date": "2020-05-14",
- "value": 1.058379312143731
- },
- {
- "date": "2020-05-15",
- "value": 1.058501449161131
- },
- {
- "date": "2020-05-18",
- "value": 1.0653661007965467
- },
- {
- "date": "2020-05-19",
- "value": 1.0406992389719165
- },
- {
- "date": "2020-05-20",
- "value": 1.0270609842320586
- },
- {
- "date": "2020-05-21",
- "value": 1.0428147984098182
- },
- {
- "date": "2020-05-22",
- "value": 1.0376955679593463
- },
- {
- "date": "2020-05-25",
- "value": 1.0226473628601278
- },
- {
- "date": "2020-05-26",
- "value": 1.0184289346085038
- },
- {
- "date": "2020-05-27",
- "value": 1.035481694044053
- },
- {
- "date": "2020-05-28",
- "value": 1.006753257650715
- },
- {
- "date": "2020-05-29",
- "value": 1.0178186802370575
- },
- {
- "date": "2020-06-01",
- "value": 1.0217511702588107
- },
- {
- "date": "2020-06-02",
- "value": 1.0294857970950626
- },
- {
- "date": "2020-06-03",
- "value": 1.0351755151735014
- },
- {
- "date": "2020-06-04",
- "value": 1.0439720305646065
- },
- {
- "date": "2020-06-05",
- "value": 1.0201404930835436
- },
- {
- "date": "2020-06-08",
- "value": 1.0216947010733943
- },
- {
- "date": "2020-06-09",
- "value": 1.0208498540755675
- },
- {
- "date": "2020-06-10",
- "value": 1.0449719751395765
- },
- {
- "date": "2020-06-11",
- "value": 1.0394562899962423
- },
- {
- "date": "2020-06-12",
- "value": 1.048902893776366
- },
- {
- "date": "2020-06-15",
- "value": 1.0484066193759367
- },
- {
- "date": "2020-06-16",
- "value": 1.0421799904764084
- },
- {
- "date": "2020-06-17",
- "value": 1.0659842837138693
- },
- {
- "date": "2020-06-18",
- "value": 1.067538558689817
- },
- {
- "date": "2020-06-19",
- "value": 1.052541719150942
- },
- {
- "date": "2020-06-22",
- "value": 1.0512157945431742
- },
- {
- "date": "2020-06-23",
- "value": 1.044415291934401
- },
- {
- "date": "2020-06-24",
- "value": 1.0437830690407237
- },
- {
- "date": "2020-06-25",
- "value": 1.0449122922727476
- },
- {
- "date": "2020-06-26",
- "value": 1.0312360545904797
- },
- {
- "date": "2020-06-29",
- "value": 1.0413214671933104
- },
- {
- "date": "2020-06-30",
- "value": 1.0322710165029114
- },
- {
- "date": "2020-07-01",
- "value": 1.0317683607702373
- },
- {
- "date": "2020-07-02",
- "value": 1.0441127995819839
- },
- {
- "date": "2020-07-03",
- "value": 1.0314164184398684
- },
- {
- "date": "2020-07-06",
- "value": 1.0359597411213357
- },
- {
- "date": "2020-07-07",
- "value": 1.040164523298433
- },
- {
- "date": "2020-07-08",
- "value": 1.050365977988439
- },
- {
- "date": "2020-07-09",
- "value": 1.0507166785384288
- },
- {
- "date": "2020-07-10",
- "value": 1.0592000326974673
- },
- {
- "date": "2020-07-13",
- "value": 1.065920254035104
- },
- {
- "date": "2020-07-14",
- "value": 1.0542604336484709
- },
- {
- "date": "2020-07-15",
- "value": 1.0659835413259842
- },
- {
- "date": "2020-07-16",
- "value": 1.077236630093518
- },
- {
- "date": "2020-07-17",
- "value": 1.0737085962989625
- },
- {
- "date": "2020-07-20",
- "value": 1.0622485014380616
- },
- {
- "date": "2020-07-21",
- "value": 1.0628410299339692
- },
- {
- "date": "2020-07-22",
- "value": 1.0752296364419116
- },
- {
- "date": "2020-07-23",
- "value": 1.0682685444642162
- },
- {
- "date": "2020-07-24",
- "value": 1.0818468153587908
- },
- {
- "date": "2020-07-27",
- "value": 1.0797116094946693
- },
- {
- "date": "2020-07-28",
- "value": 1.089669885914151
- },
- {
- "date": "2020-07-29",
- "value": 1.0868588220872346
- },
- {
- "date": "2020-07-30",
- "value": 1.074213685916675
- },
- {
- "date": "2020-07-31",
- "value": 1.064415230453545
- },
- {
- "date": "2020-08-03",
- "value": 1.0827985986843858
- },
- {
- "date": "2020-08-04",
- "value": 1.0878938670427187
- },
- {
- "date": "2020-08-05",
- "value": 1.078832956277264
- },
- {
- "date": "2020-08-06",
- "value": 1.0930120700274075
- },
- {
- "date": "2020-08-07",
- "value": 1.0800464688607898
- },
- {
- "date": "2020-08-10",
- "value": 1.0543264117288422
- },
- {
- "date": "2020-08-11",
- "value": 1.0719279775173487
- },
- {
- "date": "2020-08-12",
- "value": 1.0650643277123983
- },
- {
- "date": "2020-08-13",
- "value": 1.0689095781870834
- },
- {
- "date": "2020-08-14",
- "value": 1.0727516060530795
- },
- {
- "date": "2020-08-17",
- "value": 1.0636580636391577
- },
- {
- "date": "2020-08-18",
- "value": 1.0713844973981923
- },
- {
- "date": "2020-08-19",
- "value": 1.0854261953676398
- },
- {
- "date": "2020-08-20",
- "value": 1.090468118492808
- },
- {
- "date": "2020-08-21",
- "value": 1.0939142450231207
- },
- {
- "date": "2020-08-24",
- "value": 1.0828309348625549
- },
- {
- "date": "2020-08-25",
- "value": 1.106656184362223
- },
- {
- "date": "2020-08-26",
- "value": 1.1109840326132103
- },
- {
- "date": "2020-08-27",
- "value": 1.082498401611742
- },
- {
- "date": "2020-08-28",
- "value": 1.0651518796461525
- },
- {
- "date": "2020-08-31",
- "value": 1.0588850494795723
- },
- {
- "date": "2020-09-01",
- "value": 1.0764343815675756
- },
- {
- "date": "2020-09-02",
- "value": 1.0816500557201376
- },
- {
- "date": "2020-09-03",
- "value": 1.0781904082401093
- },
- {
- "date": "2020-09-04",
- "value": 1.0919401882226452
- },
- {
- "date": "2020-09-07",
- "value": 1.088511829586653
- },
- {
- "date": "2020-09-08",
- "value": 1.111767280949006
- },
- {
- "date": "2020-09-09",
- "value": 1.0776959466436573
- },
- {
- "date": "2020-09-10",
- "value": 1.0839226607897323
- },
- {
- "date": "2020-09-11",
- "value": 1.093239935047176
- },
- {
- "date": "2020-09-14",
- "value": 1.0769924466351943
- },
- {
- "date": "2020-09-15",
- "value": 1.056908449588622
- },
- {
- "date": "2020-09-16",
- "value": 1.0538185975507817
- },
- {
- "date": "2020-09-17",
- "value": 1.0684686521845317
- },
- {
- "date": "2020-09-18",
- "value": 1.06316820487568
- },
- {
- "date": "2020-09-21",
- "value": 1.063487226739975
- },
- {
- "date": "2020-09-22",
- "value": 1.0611246310143918
- },
- {
- "date": "2020-09-23",
- "value": 1.0537610244705764
- },
- {
- "date": "2020-09-24",
- "value": 1.061403143689373
- },
- {
- "date": "2020-09-25",
- "value": 1.065145021723312
- },
- {
- "date": "2020-09-28",
- "value": 1.0736397605953174
- },
- {
- "date": "2020-09-29",
- "value": 1.0907745565316092
- },
- {
- "date": "2020-09-30",
- "value": 1.0721404701706396
- },
- {
- "date": "2020-10-01",
- "value": 1.0629565721595107
- },
- {
- "date": "2020-10-02",
- "value": 1.071228206829149
- },
- {
- "date": "2020-10-05",
- "value": 1.0816503141443812
- },
- {
- "date": "2020-10-06",
- "value": 1.0699069177395861
- },
- {
- "date": "2020-10-07",
- "value": 1.0744002070972123
- },
- {
- "date": "2020-10-08",
- "value": 1.0721614277754263
- },
- {
- "date": "2020-10-09",
- "value": 1.0882147355633336
- },
- {
- "date": "2020-10-12",
- "value": 1.086669298877372
- },
- {
- "date": "2020-10-13",
- "value": 1.103718855428267
- },
- {
- "date": "2020-10-14",
- "value": 1.104906966207218
- },
- {
- "date": "2020-10-15",
- "value": 1.1032200710384366
- },
- {
- "date": "2020-10-16",
- "value": 1.1213959128868691
- },
- {
- "date": "2020-10-19",
- "value": 1.1330206130520843
- },
- {
- "date": "2020-10-20",
- "value": 1.1367893568037044
- },
- {
- "date": "2020-10-21",
- "value": 1.1633438270553451
- },
- {
- "date": "2020-10-22",
- "value": 1.1597463039474336
- },
- {
- "date": "2020-10-23",
- "value": 1.13849266082406
- },
- {
- "date": "2020-10-26",
- "value": 1.121979030870906
- },
- {
- "date": "2020-10-27",
- "value": 1.1310362690289184
- },
- {
- "date": "2020-10-28",
- "value": 1.1240273395474791
- },
- {
- "date": "2020-10-29",
- "value": 1.1326569538834863
- },
- {
- "date": "2020-10-30",
- "value": 1.1311131493041664
- },
- {
- "date": "2020-11-02",
- "value": 1.1254212946559312
- },
- {
- "date": "2020-11-03",
- "value": 1.1425055903639636
- },
- {
- "date": "2020-11-04",
- "value": 1.1518340398246505
- },
- {
- "date": "2020-11-05",
- "value": 1.1618436785696076
- },
- {
- "date": "2020-11-06",
- "value": 1.1686319720396852
- },
- {
- "date": "2020-11-09",
- "value": 1.1578604731789763
- },
- {
- "date": "2020-11-10",
- "value": 1.1776872575569228
- },
- {
- "date": "2020-11-11",
- "value": 1.188645392028474
- },
- {
- "date": "2020-11-12",
- "value": 1.1945304891802893
- },
- {
- "date": "2020-11-13",
- "value": 1.2005187162896438
- },
- {
- "date": "2020-11-16",
- "value": 1.2091886788630115
- },
- {
- "date": "2020-11-17",
- "value": 1.205642271852255
- },
- {
- "date": "2020-11-18",
- "value": 1.1985017043698252
- },
- {
- "date": "2020-11-19",
- "value": 1.2055220886077072
- },
- {
- "date": "2020-11-20",
- "value": 1.223175417244725
- },
- {
- "date": "2020-11-23",
- "value": 1.195624896285164
- },
- {
- "date": "2020-11-24",
- "value": 1.2090280641188427
- },
- {
- "date": "2020-11-25",
- "value": 1.1948924716905813
- },
- {
- "date": "2020-11-26",
- "value": 1.1727330453742775
- },
- {
- "date": "2020-11-27",
- "value": 1.1929169853172492
- },
- {
- "date": "2020-11-30",
- "value": 1.183503873462981
- },
- {
- "date": "2020-12-01",
- "value": 1.200477661969603
- },
- {
- "date": "2020-12-02",
- "value": 1.1928293494923992
- },
- {
- "date": "2020-12-03",
- "value": 1.1768672103666222
- },
- {
- "date": "2020-12-04",
- "value": 1.1710436624141805
- },
- {
- "date": "2020-12-07",
- "value": 1.1946758383661105
- },
- {
- "date": "2020-12-08",
- "value": 1.2057935296633644
- },
- {
- "date": "2020-12-09",
- "value": 1.2076050820156017
- },
- {
- "date": "2020-12-10",
- "value": 1.1870111392921325
- },
- {
- "date": "2020-12-11",
- "value": 1.1936662738974044
- },
- {
- "date": "2020-12-14",
- "value": 1.190651329923443
- },
- {
- "date": "2020-12-15",
- "value": 1.1618831185901741
- },
- {
- "date": "2020-12-16",
- "value": 1.1646990063721512
- },
- {
- "date": "2020-12-17",
- "value": 1.1754496778595882
- },
- {
- "date": "2020-12-18",
- "value": 1.17300237388254
- },
- {
- "date": "2020-12-21",
- "value": 1.162834813986511
- },
- {
- "date": "2020-12-22",
- "value": 1.184358375817945
- },
- {
- "date": "2020-12-23",
- "value": 1.1744390438137942
- },
- {
- "date": "2020-12-24",
- "value": 1.1611316039255368
- },
- {
- "date": "2020-12-25",
- "value": 1.1703594814205396
- },
- {
- "date": "2020-12-28",
- "value": 1.163236519941064
- },
- {
- "date": "2020-12-29",
- "value": 1.1666982096845606
- },
- {
- "date": "2020-12-30",
- "value": 1.1686738709100233
- },
- {
- "date": "2020-12-31",
- "value": 1.1714320689736764
- },
- {
- "date": "2021-01-01",
- "value": 1.1659126176905883
- },
- {
- "date": "2021-01-04",
- "value": 1.166448228187159
- },
- {
- "date": "2021-01-05",
- "value": 1.189614971703315
- },
- {
- "date": "2021-01-06",
- "value": 1.190059912878299
- },
- {
- "date": "2021-01-07",
- "value": 1.207895831746354
- },
- {
- "date": "2021-01-08",
- "value": 1.215793959397835
- },
- {
- "date": "2021-01-11",
- "value": 1.2204051796799147
- },
- {
- "date": "2021-01-12",
- "value": 1.232491385761427
- },
- {
- "date": "2021-01-13",
- "value": 1.242530499825172
- },
- {
- "date": "2021-01-14",
- "value": 1.253364732098624
- },
- {
- "date": "2021-01-15",
- "value": 1.2727522628294663
- },
- {
- "date": "2021-01-18",
- "value": 1.2752641243064968
- },
- {
- "date": "2021-01-19",
- "value": 1.2614191286529333
- },
- {
- "date": "2021-01-20",
- "value": 1.2597524707652952
- },
- {
- "date": "2021-01-21",
- "value": 1.250968778935385
- },
- {
- "date": "2021-01-22",
- "value": 1.265828945720154
- },
- {
- "date": "2021-01-25",
- "value": 1.267238703898424
- },
- {
- "date": "2021-01-26",
- "value": 1.2492826800564443
- },
- {
- "date": "2021-01-27",
- "value": 1.250779250703235
- },
- {
- "date": "2021-01-28",
- "value": 1.2644452913466095
- },
- {
- "date": "2021-01-29",
- "value": 1.2653892681802472
- },
- {
- "date": "2021-02-01",
- "value": 1.2741531203110639
- },
- {
- "date": "2021-02-02",
- "value": 1.2791117794126408
- },
- {
- "date": "2021-02-03",
- "value": 1.3054922135672407
- },
- {
- "date": "2021-02-04",
- "value": 1.3078284099654174
- },
- {
- "date": "2021-02-05",
- "value": 1.316355300455953
- },
- {
- "date": "2021-02-08",
- "value": 1.3192876429143345
- },
- {
- "date": "2021-02-09",
- "value": 1.3209047407789398
- },
- {
- "date": "2021-02-10",
- "value": 1.3281451973994098
- },
- {
- "date": "2021-02-11",
- "value": 1.3358776241522885
- },
- {
- "date": "2021-02-12",
- "value": 1.3127607452590766
- },
- {
- "date": "2021-02-15",
- "value": 1.3115343649217686
- },
- {
- "date": "2021-02-16",
- "value": 1.3048058139716243
- },
- {
- "date": "2021-02-17",
- "value": 1.304867400622695
- },
- {
- "date": "2021-02-18",
- "value": 1.2664315085544406
- },
- {
- "date": "2021-02-19",
- "value": 1.2685658115084069
- },
- {
- "date": "2021-02-22",
- "value": 1.258964397705582
- },
- {
- "date": "2021-02-23",
- "value": 1.231426388204139
- },
- {
- "date": "2021-02-24",
- "value": 1.2459570333666
- },
- {
- "date": "2021-02-25",
- "value": 1.256696117002804
- },
- {
- "date": "2021-02-26",
- "value": 1.2695427669867692
- },
- {
- "date": "2021-03-01",
- "value": 1.2659179903934676
- },
- {
- "date": "2021-03-02",
- "value": 1.2623840382923426
- },
- {
- "date": "2021-03-03",
- "value": 1.2527028720279525
- },
- {
- "date": "2021-03-04",
- "value": 1.2852820089836163
- },
- {
- "date": "2021-03-05",
- "value": 1.2691711632521843
- },
- {
- "date": "2021-03-08",
- "value": 1.2859896687436547
- },
- {
- "date": "2021-03-09",
- "value": 1.2630373607153784
- },
- {
- "date": "2021-03-10",
- "value": 1.2625139362687123
- },
- {
- "date": "2021-03-11",
- "value": 1.2681858214531718
- },
- {
- "date": "2021-03-12",
- "value": 1.272950410285385
- },
- {
- "date": "2021-03-15",
- "value": 1.259312233655776
- },
- {
- "date": "2021-03-16",
- "value": 1.2935957686129103
- },
- {
- "date": "2021-03-17",
- "value": 1.3128494735670215
- },
- {
- "date": "2021-03-18",
- "value": 1.3019921734263176
- },
- {
- "date": "2021-03-19",
- "value": 1.3070650805466526
- },
- {
- "date": "2021-03-22",
- "value": 1.3023227473750083
- },
- {
- "date": "2021-03-23",
- "value": 1.3218545522459755
- },
- {
- "date": "2021-03-24",
- "value": 1.3183748193568212
- },
- {
- "date": "2021-03-25",
- "value": 1.3150493421959821
- },
- {
- "date": "2021-03-26",
- "value": 1.3121952352650144
- },
- {
- "date": "2021-03-29",
- "value": 1.3148615147456597
- },
- {
- "date": "2021-03-30",
- "value": 1.3504977129703475
- },
- {
- "date": "2021-03-31",
- "value": 1.3710245262424814
- },
- {
- "date": "2021-04-01",
- "value": 1.379527380744859
- },
- {
- "date": "2021-04-02",
- "value": 1.3805808480825474
- },
- {
- "date": "2021-04-05",
- "value": 1.3886318266857973
- },
- {
- "date": "2021-04-06",
- "value": 1.3757525612306905
- },
- {
- "date": "2021-04-07",
- "value": 1.3848616613703506
- },
- {
- "date": "2021-04-08",
- "value": 1.3947086497375818
- },
- {
- "date": "2021-04-09",
- "value": 1.381148010212007
- },
- {
- "date": "2021-04-12",
- "value": 1.368780359831828
- },
- {
- "date": "2021-04-13",
- "value": 1.3953168149763808
- },
- {
- "date": "2021-04-14",
- "value": 1.4161026074844605
- },
- {
- "date": "2021-04-15",
- "value": 1.4319641103497192
- },
- {
- "date": "2021-04-16",
- "value": 1.471731805612856
- },
- {
- "date": "2021-04-19",
- "value": 1.4703303554318419
- },
- {
- "date": "2021-04-20",
- "value": 1.4657581811407112
- },
- {
- "date": "2021-04-21",
- "value": 1.5003026553222711
- },
- {
- "date": "2021-04-22",
- "value": 1.5055487705992419
- },
- {
- "date": "2021-04-23",
- "value": 1.5096279408704718
- },
- {
- "date": "2021-04-26",
- "value": 1.498977581515785
- },
- {
- "date": "2021-04-27",
- "value": 1.4937844263377498
- },
- {
- "date": "2021-04-28",
- "value": 1.5084503204628963
- },
- {
- "date": "2021-04-29",
- "value": 1.4921921771454123
- },
- {
- "date": "2021-04-30",
- "value": 1.5039863380859417
- },
- {
- "date": "2021-05-03",
- "value": 1.5071864733515592
- },
- {
- "date": "2021-05-04",
- "value": 1.4954791080398206
- },
- {
- "date": "2021-05-05",
- "value": 1.4905527005357322
- },
- {
- "date": "2021-05-06",
- "value": 1.481839709648732
- },
- {
- "date": "2021-05-07",
- "value": 1.4714688383074308
- },
- {
- "date": "2021-05-10",
- "value": 1.45886270465708
- },
- {
- "date": "2021-05-11",
- "value": 1.4649894049084384
- },
- {
- "date": "2021-05-12",
- "value": 1.466404332314401
- },
- {
- "date": "2021-05-13",
- "value": 1.460810721568988
- },
- {
- "date": "2021-05-14",
- "value": 1.4428140186842395
- },
- {
- "date": "2021-05-17",
- "value": 1.4307213632539033
- },
- {
- "date": "2021-05-18",
- "value": 1.3917407880879684
- },
- {
- "date": "2021-05-19",
- "value": 1.390125520863086
- },
- {
- "date": "2021-05-20",
- "value": 1.407801891235672
- },
- {
- "date": "2021-05-21",
- "value": 1.3952892109774984
- },
- {
- "date": "2021-05-24",
- "value": 1.378880385803831
- },
- {
- "date": "2021-05-25",
- "value": 1.3793547731839857
- },
- {
- "date": "2021-05-26",
- "value": 1.383858492272529
- },
- {
- "date": "2021-05-27",
- "value": 1.4021673381997857
- },
- {
- "date": "2021-05-28",
- "value": 1.3739438972575448
- },
- {
- "date": "2021-05-31",
- "value": 1.3705924310084996
- },
- {
- "date": "2021-06-01",
- "value": 1.386755711677767
- },
- {
- "date": "2021-06-02",
- "value": 1.381307784593967
- },
- {
- "date": "2021-06-03",
- "value": 1.3795643127749777
- },
- {
- "date": "2021-06-04",
- "value": 1.402723828943687
- },
- {
- "date": "2021-06-07",
- "value": 1.3977051863262795
- },
- {
- "date": "2021-06-08",
- "value": 1.3970219288349515
- },
- {
- "date": "2021-06-09",
- "value": 1.3862590622616004
- },
- {
- "date": "2021-06-10",
- "value": 1.3806659384973157
- },
- {
- "date": "2021-06-11",
- "value": 1.3715030751463484
- },
- {
- "date": "2021-06-14",
- "value": 1.4084380145898694
- },
- {
- "date": "2021-06-15",
- "value": 1.367110944196187
- },
- {
- "date": "2021-06-16",
- "value": 1.3907008420507876
- },
- {
- "date": "2021-06-17",
- "value": 1.3906140067612722
- },
- {
- "date": "2021-06-18",
- "value": 1.3939066088390526
- },
- {
- "date": "2021-06-21",
- "value": 1.3820214924765055
- },
- {
- "date": "2021-06-22",
- "value": 1.3824026602204793
- },
- {
- "date": "2021-06-23",
- "value": 1.3800366710718965
- },
- {
- "date": "2021-06-24",
- "value": 1.3908844868574002
- },
- {
- "date": "2021-06-25",
- "value": 1.3892062067973632
- },
- {
- "date": "2021-06-28",
- "value": 1.3745272802508417
- },
- {
- "date": "2021-06-29",
- "value": 1.4062582822444627
- },
- {
- "date": "2021-06-30",
- "value": 1.4309102661087192
- },
- {
- "date": "2021-07-01",
- "value": 1.4294659321270338
- },
- {
- "date": "2021-07-02",
- "value": 1.439901133637413
- },
- {
- "date": "2021-07-05",
- "value": 1.4206278769698517
- },
- {
- "date": "2021-07-06",
- "value": 1.4399640666233222
- },
- {
- "date": "2021-07-07",
- "value": 1.4165248997611979
- },
- {
- "date": "2021-07-08",
- "value": 1.4061639059428825
- },
- {
- "date": "2021-07-09",
- "value": 1.3899600119614057
- },
- {
- "date": "2021-07-12",
- "value": 1.3852179206640802
- },
- {
- "date": "2021-07-13",
- "value": 1.3947905942331764
- },
- {
- "date": "2021-07-14",
- "value": 1.4088224277687038
- },
- {
- "date": "2021-07-15",
- "value": 1.4131258240078732
- },
- {
- "date": "2021-07-16",
- "value": 1.3813234133651953
- },
- {
- "date": "2021-07-19",
- "value": 1.3499098184976555
- },
- {
- "date": "2021-07-20",
- "value": 1.3653181390736133
- },
- {
- "date": "2021-07-21",
- "value": 1.37159218708712
- },
- {
- "date": "2021-07-22",
- "value": 1.3697384498314296
- },
- {
- "date": "2021-07-23",
- "value": 1.3969764655799328
- },
- {
- "date": "2021-07-26",
- "value": 1.3918811626988818
- },
- {
- "date": "2021-07-27",
- "value": 1.395782671085152
- },
- {
- "date": "2021-07-28",
- "value": 1.3991151757500373
- },
- {
- "date": "2021-07-29",
- "value": 1.4162945193516971
- },
- {
- "date": "2021-07-30",
- "value": 1.419609816849131
- },
- {
- "date": "2021-08-02",
- "value": 1.43427056817682
- },
- {
- "date": "2021-08-03",
- "value": 1.41724990307551
- },
- {
- "date": "2021-08-04",
- "value": 1.4227314581781192
- },
- {
- "date": "2021-08-05",
- "value": 1.4179088844894348
- },
- {
- "date": "2021-08-06",
- "value": 1.4378103751231752
- },
- {
- "date": "2021-08-09",
- "value": 1.4016773442448323
- },
- {
- "date": "2021-08-10",
- "value": 1.4128412720860546
- },
- {
- "date": "2021-08-11",
- "value": 1.4363529113809916
- },
- {
- "date": "2021-08-12",
- "value": 1.4719812424792813
- },
- {
- "date": "2021-08-13",
- "value": 1.4707566446053961
- },
- {
- "date": "2021-08-16",
- "value": 1.4672598235804997
- },
- {
- "date": "2021-08-17",
- "value": 1.4496169966220163
- },
- {
- "date": "2021-08-18",
- "value": 1.438621232358818
- },
- {
- "date": "2021-08-19",
- "value": 1.4324211464170769
- },
- {
- "date": "2021-08-20",
- "value": 1.429753305714299
- },
- {
- "date": "2021-08-23",
- "value": 1.45743037182792
- },
- {
- "date": "2021-08-24",
- "value": 1.470024861851428
- },
- {
- "date": "2021-08-25",
- "value": 1.4736526911615806
- },
- {
- "date": "2021-08-26",
- "value": 1.4723247090092504
- },
- {
- "date": "2021-08-27",
- "value": 1.4587697382612441
- },
- {
- "date": "2021-08-30",
- "value": 1.4572629664246666
- },
- {
- "date": "2021-08-31",
- "value": 1.4324586077698245
- },
- {
- "date": "2021-09-01",
- "value": 1.4083851644154046
- },
- {
- "date": "2021-09-02",
- "value": 1.4208734813045187
- },
- {
- "date": "2021-09-03",
- "value": 1.4208247199960131
- },
- {
- "date": "2021-09-06",
- "value": 1.4285740875382102
- },
- {
- "date": "2021-09-07",
- "value": 1.4209833677400845
- },
- {
- "date": "2021-09-08",
- "value": 1.4325343529283825
- },
- {
- "date": "2021-09-09",
- "value": 1.424459499991382
- },
- {
- "date": "2021-09-10",
- "value": 1.3945910201190925
- },
- {
- "date": "2021-09-13",
- "value": 1.4120514940388722
- },
- {
- "date": "2021-09-14",
- "value": 1.38866661210329
- },
- {
- "date": "2021-09-15",
- "value": 1.3857275088595011
- },
- {
- "date": "2021-09-16",
- "value": 1.4011569454306367
- },
- {
- "date": "2021-09-17",
- "value": 1.3919382890348446
- },
- {
- "date": "2021-09-20",
- "value": 1.375126570515468
- },
- {
- "date": "2021-09-21",
- "value": 1.352759207847141
- },
- {
- "date": "2021-09-22",
- "value": 1.3449223636305467
- },
- {
- "date": "2021-09-23",
- "value": 1.3629414402386393
- },
- {
- "date": "2021-09-24",
- "value": 1.395684515517025
- },
- {
- "date": "2021-09-27",
- "value": 1.3886428355323586
- },
- {
- "date": "2021-09-28",
- "value": 1.3641227988511744
- },
- {
- "date": "2021-09-29",
- "value": 1.3502015914952985
- },
- {
- "date": "2021-09-30",
- "value": 1.3626940644644099
- },
- {
- "date": "2021-10-01",
- "value": 1.3607919549839265
- },
- {
- "date": "2021-10-04",
- "value": 1.402964398948314
- },
- {
- "date": "2021-10-05",
- "value": 1.388975648279259
- },
- {
- "date": "2021-10-06",
- "value": 1.408467818625729
- },
- {
- "date": "2021-10-07",
- "value": 1.4039340392428707
- },
- {
- "date": "2021-10-08",
- "value": 1.4021661694805887
- },
- {
- "date": "2021-10-11",
- "value": 1.4038000365252732
- },
- {
- "date": "2021-10-12",
- "value": 1.436878531980073
- },
- {
- "date": "2021-10-13",
- "value": 1.4470410532924038
- },
- {
- "date": "2021-10-14",
- "value": 1.4587054376556585
- },
- {
- "date": "2021-10-15",
- "value": 1.461820022972895
- },
- {
- "date": "2021-10-18",
- "value": 1.4904591237222742
- },
- {
- "date": "2021-10-19",
- "value": 1.4990078280940025
- },
- {
- "date": "2021-10-20",
- "value": 1.5058369490900136
- },
- {
- "date": "2021-10-21",
- "value": 1.4960635985740864
- },
- {
- "date": "2021-10-22",
- "value": 1.4897070083575303
- },
- {
- "date": "2021-10-25",
- "value": 1.4710381745717296
- },
- {
- "date": "2021-10-26",
- "value": 1.4452254051719973
- },
- {
- "date": "2021-10-27",
- "value": 1.43660903129929
- },
- {
- "date": "2021-10-28",
- "value": 1.4008049869625465
- },
- {
- "date": "2021-10-29",
- "value": 1.3959517428123578
- },
- {
- "date": "2021-11-01",
- "value": 1.4006354011373718
- },
- {
- "date": "2021-11-02",
- "value": 1.3946305284502112
- },
- {
- "date": "2021-11-03",
- "value": 1.3982058596330105
- },
- {
- "date": "2021-11-04",
- "value": 1.4012069209852749
- },
- {
- "date": "2021-11-05",
- "value": 1.429630227003717
- },
- {
- "date": "2021-11-08",
- "value": 1.429716627595712
- },
- {
- "date": "2021-11-09",
- "value": 1.4188906986255247
- },
- {
- "date": "2021-11-10",
- "value": 1.4129102009754562
- },
- {
- "date": "2021-11-11",
- "value": 1.421543095077925
- },
- {
- "date": "2021-11-12",
- "value": 1.4161262925918003
- },
- {
- "date": "2021-11-15",
- "value": 1.4291174593030285
- },
- {
- "date": "2021-11-16",
- "value": 1.4495868168511812
- },
- {
- "date": "2021-11-17",
- "value": 1.47367259162948
- },
- {
- "date": "2021-11-18",
- "value": 1.5019502961357905
- },
- {
- "date": "2021-11-19",
- "value": 1.5080109347660076
- },
- {
- "date": "2021-11-22",
- "value": 1.4898936871493997
- },
- {
- "date": "2021-11-23",
- "value": 1.4961168212108944
- },
- {
- "date": "2021-11-24",
- "value": 1.5279732526379202
- },
- {
- "date": "2021-11-25",
- "value": 1.5266217310337018
- },
- {
- "date": "2021-11-26",
- "value": 1.5298060477392295
- },
- {
- "date": "2021-11-29",
- "value": 1.5479280058437808
- },
- {
- "date": "2021-11-30",
- "value": 1.53195768081498
- },
- {
- "date": "2021-12-01",
- "value": 1.5292512998396683
- },
- {
- "date": "2021-12-02",
- "value": 1.5448365916109223
- },
- {
- "date": "2021-12-03",
- "value": 1.549749634560945
- },
- {
- "date": "2021-12-06",
- "value": 1.5442393816030469
- },
- {
- "date": "2021-12-07",
- "value": 1.5496776657081066
- },
- {
- "date": "2021-12-08",
- "value": 1.5378212709834378
- },
- {
- "date": "2021-12-09",
- "value": 1.5434965395697142
- },
- {
- "date": "2021-12-10",
- "value": 1.5292903688962725
- },
- {
- "date": "2021-12-13",
- "value": 1.5346483455390365
- },
- {
- "date": "2021-12-14",
- "value": 1.5302013126423026
- },
- {
- "date": "2021-12-15",
- "value": 1.574074918258709
- },
- {
- "date": "2021-12-16",
- "value": 1.5584019125590098
- },
- {
- "date": "2021-12-17",
- "value": 1.5818967978216512
- },
- {
- "date": "2021-12-20",
- "value": 1.5716054435585034
- },
- {
- "date": "2021-12-21",
- "value": 1.5944534661287695
- },
- {
- "date": "2021-12-22",
- "value": 1.6272509076359802
- },
- {
- "date": "2021-12-23",
- "value": 1.6243932504424012
- },
- {
- "date": "2021-12-24",
- "value": 1.623216594793535
- },
- {
- "date": "2021-12-27",
- "value": 1.5642290040648228
- },
- {
- "date": "2021-12-28",
- "value": 1.5906906174522082
- },
- {
- "date": "2021-12-29",
- "value": 1.6110090549938567
- },
- {
- "date": "2021-12-30",
- "value": 1.5856808427362976
- },
- {
- "date": "2021-12-31",
- "value": 1.5945832685272743
- },
- {
- "date": "2022-01-03",
- "value": 1.6074109807833232
- },
- {
- "date": "2022-01-04",
- "value": 1.5931579316711673
- },
- {
- "date": "2022-01-05",
- "value": 1.5750275038133585
- },
- {
- "date": "2022-01-06",
- "value": 1.5922118107771306
- },
- {
- "date": "2022-01-07",
- "value": 1.6063668325258647
- },
- {
- "date": "2022-01-10",
- "value": 1.5903409388158023
- },
- {
- "date": "2022-01-11",
- "value": 1.6143492871364697
- },
- {
- "date": "2022-01-12",
- "value": 1.620483667076624
- },
- {
- "date": "2022-01-13",
- "value": 1.6024358553268598
- },
- {
- "date": "2022-01-14",
- "value": 1.6248739239684697
- },
- {
- "date": "2022-01-17",
- "value": 1.6779569922678506
- },
- {
- "date": "2022-01-18",
- "value": 1.6355769592810765
- },
- {
- "date": "2022-01-19",
- "value": 1.6511033332190856
- },
- {
- "date": "2022-01-20",
- "value": 1.660140562699348
- },
- {
- "date": "2022-01-21",
- "value": 1.6750499994828416
- },
- {
- "date": "2022-01-24",
- "value": 1.6912664574466951
- },
- {
- "date": "2022-01-25",
- "value": 1.6647034860183685
- },
- {
- "date": "2022-01-26",
- "value": 1.6314057973793046
- },
- {
- "date": "2022-01-27",
- "value": 1.6539567822715302
- },
- {
- "date": "2022-01-28",
- "value": 1.6659283207585491
- },
- {
- "date": "2022-01-31",
- "value": 1.633647136873715
- },
- {
- "date": "2022-02-01",
- "value": 1.6593941650319641
- },
- {
- "date": "2022-02-02",
- "value": 1.6114011505744288
- },
- {
- "date": "2022-02-03",
- "value": 1.5913569843063464
- },
- {
- "date": "2022-02-04",
- "value": 1.6079118780235904
- },
- {
- "date": "2022-02-07",
- "value": 1.599613129910515
- },
- {
- "date": "2022-02-08",
- "value": 1.5840910234653691
- },
- {
- "date": "2022-02-09",
- "value": 1.5692963421848967
- },
- {
- "date": "2022-02-10",
- "value": 1.5510710893684687
- },
- {
- "date": "2022-02-11",
- "value": 1.5534421809454158
- },
- {
- "date": "2022-02-14",
- "value": 1.5509399865078048
- },
- {
- "date": "2022-02-15",
- "value": 1.587776258178137
- },
- {
- "date": "2022-02-16",
- "value": 1.5846199993819015
- },
- {
- "date": "2022-02-17",
- "value": 1.5780516367892181
- },
- {
- "date": "2022-02-18",
- "value": 1.5667802995498192
- },
- {
- "date": "2022-02-21",
- "value": 1.56825441464742
- },
- {
- "date": "2022-02-22",
- "value": 1.5679746336775364
- },
- {
- "date": "2022-02-23",
- "value": 1.5514863674289379
- },
- {
- "date": "2022-02-24",
- "value": 1.538486405244788
- },
- {
- "date": "2022-02-25",
- "value": 1.5387769997820222
- },
- {
- "date": "2022-02-28",
- "value": 1.5506946139759215
- },
- {
- "date": "2022-03-01",
- "value": 1.5567885931085987
- },
- {
- "date": "2022-03-02",
- "value": 1.54838069593086
- },
- {
- "date": "2022-03-03",
- "value": 1.5706939489024465
- },
- {
- "date": "2022-03-04",
- "value": 1.5651046180022745
- },
- {
- "date": "2022-03-07",
- "value": 1.5729997858552889
- },
- {
- "date": "2022-03-08",
- "value": 1.566968737614085
- },
- {
- "date": "2022-03-09",
- "value": 1.5870996870822038
- },
- {
- "date": "2022-03-10",
- "value": 1.5831530011497716
- },
- {
- "date": "2022-03-11",
- "value": 1.5461632234970888
- },
- {
- "date": "2022-03-14",
- "value": 1.5881653919855434
- },
- {
- "date": "2022-03-15",
- "value": 1.5836420654218597
- },
- {
- "date": "2022-03-16",
- "value": 1.5981064720618103
- },
- {
- "date": "2022-03-17",
- "value": 1.62648972232015
- },
- {
- "date": "2022-03-18",
- "value": 1.6349246038437146
- },
- {
- "date": "2022-03-21",
- "value": 1.6201117541991252
- },
- {
- "date": "2022-03-22",
- "value": 1.587921312110534
- },
- {
- "date": "2022-03-23",
- "value": 1.5651854774013658
- },
- {
- "date": "2022-03-24",
- "value": 1.5713531940379684
- },
- {
- "date": "2022-03-25",
- "value": 1.561370998340176
- },
- {
- "date": "2022-03-28",
- "value": 1.538113053515527
- },
- {
- "date": "2022-03-29",
- "value": 1.5433683929781286
- },
- {
- "date": "2022-03-30",
- "value": 1.5443015440141064
- },
- {
- "date": "2022-03-31",
- "value": 1.5217717571841756
- },
- {
- "date": "2022-04-01",
- "value": 1.535306582858655
- },
- {
- "date": "2022-04-04",
- "value": 1.55397010540345
- },
- {
- "date": "2022-04-05",
- "value": 1.5506676537551656
- },
- {
- "date": "2022-04-06",
- "value": 1.5314185689532167
- },
- {
- "date": "2022-04-07",
- "value": 1.5596707816399535
- },
- {
- "date": "2022-04-08",
- "value": 1.532151896510456
- },
- {
- "date": "2022-04-11",
- "value": 1.5335954285356692
- },
- {
- "date": "2022-04-12",
- "value": 1.5100610018461769
- },
- {
- "date": "2022-04-13",
- "value": 1.5113119914127169
- },
- {
- "date": "2022-04-14",
- "value": 1.5077691548314545
- },
- {
- "date": "2022-04-15",
- "value": 1.5166937479423228
- },
- {
- "date": "2022-04-18",
- "value": 1.5041289058423408
- },
- {
- "date": "2022-04-19",
- "value": 1.467824341819983
- },
- {
- "date": "2022-04-20",
- "value": 1.4823472338869743
- },
- {
- "date": "2022-04-21",
- "value": 1.4791637424449022
- },
- {
- "date": "2022-04-22",
- "value": 1.4825064316343075
- },
- {
- "date": "2022-04-25",
- "value": 1.4772004366944818
- },
- {
- "date": "2022-04-26",
- "value": 1.490640864239792
- },
- {
- "date": "2022-04-27",
- "value": 1.4720628144730035
- },
- {
- "date": "2022-04-28",
- "value": 1.4596762992572927
- },
- {
- "date": "2022-04-29",
- "value": 1.452170032048331
- },
- {
- "date": "2022-05-02",
- "value": 1.465342510875393
- },
- {
- "date": "2022-05-03",
- "value": 1.4873945721839743
- },
- {
- "date": "2022-05-04",
- "value": 1.5052324585009766
- },
- {
- "date": "2022-05-05",
- "value": 1.5281830224875794
- },
- {
- "date": "2022-05-06",
- "value": 1.5409433085602433
- },
- {
- "date": "2022-05-09",
- "value": 1.568913118792642
- },
- {
- "date": "2022-05-10",
- "value": 1.558785017867175
- },
- {
- "date": "2022-05-11",
- "value": 1.6047134582125446
- },
- {
- "date": "2022-05-12",
- "value": 1.5946794484213864
- },
- {
- "date": "2022-05-13",
- "value": 1.5670842142677321
- },
- {
- "date": "2022-05-16",
- "value": 1.581463574168348
- },
- {
- "date": "2022-05-17",
- "value": 1.5684505168996712
- },
- {
- "date": "2022-05-18",
- "value": 1.5539429908909457
- },
- {
- "date": "2022-05-19",
- "value": 1.535502118770723
- },
- {
- "date": "2022-05-20",
- "value": 1.5320377857625895
- },
- {
- "date": "2022-05-23",
- "value": 1.5426227790967655
- },
- {
- "date": "2022-05-24",
- "value": 1.5662747812666553
- },
- {
- "date": "2022-05-25",
- "value": 1.5877239180472982
- },
- {
- "date": "2022-05-26",
- "value": 1.582331846430933
- },
- {
- "date": "2022-05-27",
- "value": 1.5794562148656126
- },
- {
- "date": "2022-05-30",
- "value": 1.5686845833951877
- },
- {
- "date": "2022-05-31",
- "value": 1.560509024955579
- },
- {
- "date": "2022-06-01",
- "value": 1.5298321313593877
- },
- {
- "date": "2022-06-02",
- "value": 1.5332096950286427
- },
- {
- "date": "2022-06-03",
- "value": 1.5396746378019222
- },
- {
- "date": "2022-06-06",
- "value": 1.536964135443451
- },
- {
- "date": "2022-06-07",
- "value": 1.5299910308307474
- },
- {
- "date": "2022-06-08",
- "value": 1.5225970283347763
- },
- {
- "date": "2022-06-09",
- "value": 1.5507473218380567
- },
- {
- "date": "2022-06-10",
- "value": 1.560949077791851
- },
- {
- "date": "2022-06-13",
- "value": 1.5571914543917138
- },
- {
- "date": "2022-06-14",
- "value": 1.547135409090711
- },
- {
- "date": "2022-06-15",
- "value": 1.5394153129675305
- },
- {
- "date": "2022-06-16",
- "value": 1.5518000244335088
- },
- {
- "date": "2022-06-17",
- "value": 1.546615876649824
- },
- {
- "date": "2022-06-20",
- "value": 1.5415620005568358
- },
- {
- "date": "2022-06-21",
- "value": 1.530792190961058
- },
- {
- "date": "2022-06-22",
- "value": 1.5176767891928626
- },
- {
- "date": "2022-06-23",
- "value": 1.5244317488618577
- },
- {
- "date": "2022-06-24",
- "value": 1.5013640127547148
- },
- {
- "date": "2022-06-27",
- "value": 1.5130370160266156
- },
- {
- "date": "2022-06-28",
- "value": 1.5093559681666207
- },
- {
- "date": "2022-06-29",
- "value": 1.5155701766796095
- },
- {
- "date": "2022-06-30",
- "value": 1.5260109911384052
- },
- {
- "date": "2022-07-01",
- "value": 1.518862925970409
- },
- {
- "date": "2022-07-04",
- "value": 1.5369290417421
- },
- {
- "date": "2022-07-05",
- "value": 1.514941830640315
- },
- {
- "date": "2022-07-06",
- "value": 1.5192203554770194
- },
- {
- "date": "2022-07-07",
- "value": 1.4994698111994265
- },
- {
- "date": "2022-07-08",
- "value": 1.4587702504775208
- },
- {
- "date": "2022-07-11",
- "value": 1.4351358527022298
- },
- {
- "date": "2022-07-12",
- "value": 1.4296489620334651
- },
- {
- "date": "2022-07-13",
- "value": 1.4484602812672935
- },
- {
- "date": "2022-07-14",
- "value": 1.4847983444714659
- },
- {
- "date": "2022-07-15",
- "value": 1.4750883076193522
- },
- {
- "date": "2022-07-18",
- "value": 1.4742712115271843
- },
- {
- "date": "2022-07-19",
- "value": 1.487866980543509
- },
- {
- "date": "2022-07-20",
- "value": 1.4743851114977577
- },
- {
- "date": "2022-07-21",
- "value": 1.4742399349920083
- },
- {
- "date": "2022-07-22",
- "value": 1.4446741197698423
- },
- {
- "date": "2022-07-25",
- "value": 1.4106218436239761
- },
- {
- "date": "2022-07-26",
- "value": 1.4049328089120685
- },
- {
- "date": "2022-07-27",
- "value": 1.3895542933975888
- },
- {
- "date": "2022-07-28",
- "value": 1.3895361748552562
- },
- {
- "date": "2022-07-29",
- "value": 1.3675731432048988
- },
- {
- "date": "2022-08-01",
- "value": 1.3452385715111939
- },
- {
- "date": "2022-08-02",
- "value": 1.3513612578314185
- },
- {
- "date": "2022-08-03",
- "value": 1.387374096396823
- },
- {
- "date": "2022-08-04",
- "value": 1.4263476667456083
- },
- {
- "date": "2022-08-05",
- "value": 1.4408555444114535
- },
- {
- "date": "2022-08-08",
- "value": 1.450228506020597
- },
- {
- "date": "2022-08-09",
- "value": 1.4720690219890726
- },
- {
- "date": "2022-08-10",
- "value": 1.4744832241134884
- },
- {
- "date": "2022-08-11",
- "value": 1.4573832150606392
- },
- {
- "date": "2022-08-12",
- "value": 1.4411535118114978
- },
- {
- "date": "2022-08-15",
- "value": 1.4361007379773003
- },
- {
- "date": "2022-08-16",
- "value": 1.4470260199059162
- },
- {
- "date": "2022-08-17",
- "value": 1.4490719723227705
- },
- {
- "date": "2022-08-18",
- "value": 1.4449033635181234
- },
- {
- "date": "2022-08-19",
- "value": 1.4823665189164166
- },
- {
- "date": "2022-08-22",
- "value": 1.5049184909213813
- },
- {
- "date": "2022-08-23",
- "value": 1.5231857233638852
- },
- {
- "date": "2022-08-24",
- "value": 1.5355755682256211
- },
- {
- "date": "2022-08-25",
- "value": 1.565487967026368
- },
- {
- "date": "2022-08-26",
- "value": 1.6081318303488599
- },
- {
- "date": "2022-08-29",
- "value": 1.6490053883779598
- },
- {
- "date": "2022-08-30",
- "value": 1.687794372341827
- },
- {
- "date": "2022-08-31",
- "value": 1.708397258011698
- },
- {
- "date": "2022-09-01",
- "value": 1.6940286991424056
- },
- {
- "date": "2022-09-02",
- "value": 1.7167333902548585
- },
- {
- "date": "2022-09-05",
- "value": 1.6758366321190372
- },
- {
- "date": "2022-09-06",
- "value": 1.6531123185626704
- },
- {
- "date": "2022-09-07",
- "value": 1.622651313780943
- },
- {
- "date": "2022-09-08",
- "value": 1.609150529054745
- },
- {
- "date": "2022-09-09",
- "value": 1.6295984783732864
- },
- {
- "date": "2022-09-12",
- "value": 1.6439109246590768
- },
- {
- "date": "2022-09-13",
- "value": 1.6413048774422225
- },
- {
- "date": "2022-09-14",
- "value": 1.6269727438118897
- },
- {
- "date": "2022-09-15",
- "value": 1.646707974963572
- },
- {
- "date": "2022-09-16",
- "value": 1.6662076915123043
- },
- {
- "date": "2022-09-19",
- "value": 1.6682942546162989
- },
- {
- "date": "2022-09-20",
- "value": 1.6194171276538407
- },
- {
- "date": "2022-09-21",
- "value": 1.6417982628922556
- },
- {
- "date": "2022-09-22",
- "value": 1.6456330319034709
- },
- {
- "date": "2022-09-23",
- "value": 1.6601508372243556
- },
- {
- "date": "2022-09-26",
- "value": 1.6573941690063623
- },
- {
- "date": "2022-09-27",
- "value": 1.6727302133264812
- },
- {
- "date": "2022-09-28",
- "value": 1.6279794023507217
- },
- {
- "date": "2022-09-29",
- "value": 1.6411790879193044
- },
- {
- "date": "2022-09-30",
- "value": 1.635200363199699
- },
- {
- "date": "2022-10-03",
- "value": 1.6324665611623488
- },
- {
- "date": "2022-10-04",
- "value": 1.6499512852517595
- },
- {
- "date": "2022-10-05",
- "value": 1.6674673455507478
- },
- {
- "date": "2022-10-06",
- "value": 1.6881397950488088
- },
- {
- "date": "2022-10-07",
- "value": 1.7030800890266748
- },
- {
- "date": "2022-10-10",
- "value": 1.692066742190576
- },
- {
- "date": "2022-10-11",
- "value": 1.695883547498663
- },
- {
- "date": "2022-10-12",
- "value": 1.692461395965446
- },
- {
- "date": "2022-10-13",
- "value": 1.6792085606236202
- },
- {
- "date": "2022-10-14",
- "value": 1.6943914949913503
- },
- {
- "date": "2022-10-17",
- "value": 1.707689589146731
- },
- {
- "date": "2022-10-18",
- "value": 1.7213210470836076
- },
- {
- "date": "2022-10-19",
- "value": 1.7127239438247601
- },
- {
- "date": "2022-10-20",
- "value": 1.6945663168407794
- },
- {
- "date": "2022-10-21",
- "value": 1.6684932702379416
- },
- {
- "date": "2022-10-24",
- "value": 1.6902650005295932
- },
- {
- "date": "2022-10-25",
- "value": 1.6987026309945406
- },
- {
- "date": "2022-10-26",
- "value": 1.6675807513898973
- },
- {
- "date": "2022-10-27",
- "value": 1.6761173151300062
- },
- {
- "date": "2022-10-28",
- "value": 1.6506448483517446
- },
- {
- "date": "2022-10-31",
- "value": 1.627678845155276
- },
- {
- "date": "2022-11-01",
- "value": 1.6096761314958863
- },
- {
- "date": "2022-11-02",
- "value": 1.5544938279337206
- },
- {
- "date": "2022-11-03",
- "value": 1.5542312290340299
- },
- {
- "date": "2022-11-04",
- "value": 1.5577683816395531
- },
- {
- "date": "2022-11-07",
- "value": 1.5289854337659372
- },
- {
- "date": "2022-11-08",
- "value": 1.5445988333038156
- },
- {
- "date": "2022-11-09",
- "value": 1.5353781005508458
- },
- {
- "date": "2022-11-10",
- "value": 1.5509838886121772
- },
- {
- "date": "2022-11-11",
- "value": 1.5546354116529684
- },
- {
- "date": "2022-11-14",
- "value": 1.556375756431782
- },
- {
- "date": "2022-11-15",
- "value": 1.5621004239277525
- },
- {
- "date": "2022-11-16",
- "value": 1.5740195520876066
- },
- {
- "date": "2022-11-17",
- "value": 1.566339920352687
- },
- {
- "date": "2022-11-18",
- "value": 1.54847817523999
- },
- {
- "date": "2022-11-21",
- "value": 1.54947472372656
- },
- {
- "date": "2022-11-22",
- "value": 1.5461945306650797
- },
- {
- "date": "2022-11-23",
- "value": 1.5407588698567045
- },
- {
- "date": "2022-11-24",
- "value": 1.5631915891887207
- },
- {
- "date": "2022-11-25",
- "value": 1.583064320351204
- },
- {
- "date": "2022-11-28",
- "value": 1.5751078309564475
- },
- {
- "date": "2022-11-29",
- "value": 1.5520781585627188
- },
- {
- "date": "2022-11-30",
- "value": 1.5577544030958999
- },
- {
- "date": "2022-12-01",
- "value": 1.5523814639371254
- },
- {
- "date": "2022-12-02",
- "value": 1.5379484704433584
- },
- {
- "date": "2022-12-05",
- "value": 1.5190954396288403
- },
- {
- "date": "2022-12-06",
- "value": 1.5001842715041467
- },
- {
- "date": "2022-12-07",
- "value": 1.4744329983342876
- },
- {
- "date": "2022-12-08",
- "value": 1.4626758793544563
- },
- {
- "date": "2022-12-09",
- "value": 1.4490403155398839
- },
- {
- "date": "2022-12-12",
- "value": 1.4560087283963163
- },
- {
- "date": "2022-12-13",
- "value": 1.4959323232220432
- },
- {
- "date": "2022-12-14",
- "value": 1.4903287526144005
- },
- {
- "date": "2022-12-15",
- "value": 1.471468079576157
- },
- {
- "date": "2022-12-16",
- "value": 1.482816168823276
- },
- {
- "date": "2022-12-19",
- "value": 1.4880126273302419
- },
- {
- "date": "2022-12-20",
- "value": 1.4902350501447592
- },
- {
- "date": "2022-12-21",
- "value": 1.501598340371527
- },
- {
- "date": "2022-12-22",
- "value": 1.5276535208557593
- },
- {
- "date": "2022-12-23",
- "value": 1.5257196310410437
- },
- {
- "date": "2022-12-26",
- "value": 1.5136882372958493
- },
- {
- "date": "2022-12-27",
- "value": 1.4929888203046435
- },
- {
- "date": "2022-12-28",
- "value": 1.4727450386505863
- },
- {
- "date": "2022-12-29",
- "value": 1.4795185687169188
- },
- {
- "date": "2022-12-30",
- "value": 1.5091437379482449
- },
- {
- "date": "2023-01-02",
- "value": 1.522302144675925
- },
- {
- "date": "2023-01-03",
- "value": 1.489998220563769
- },
- {
- "date": "2023-01-04",
- "value": 1.4934510331748854
- },
- {
- "date": "2023-01-05",
- "value": 1.5188349239299384
- },
- {
- "date": "2023-01-06",
- "value": 1.5132633920578298
- },
- {
- "date": "2023-01-09",
- "value": 1.533929418208088
- },
- {
- "date": "2023-01-10",
- "value": 1.5416128389387853
- },
- {
- "date": "2023-01-11",
- "value": 1.5238798298214387
- },
- {
- "date": "2023-01-12",
- "value": 1.529785472758622
- },
- {
- "date": "2023-01-13",
- "value": 1.5407012012469579
- },
- {
- "date": "2023-01-16",
- "value": 1.587181198021526
- },
- {
- "date": "2023-01-17",
- "value": 1.6054819211647422
- },
- {
- "date": "2023-01-18",
- "value": 1.626862235554488
- },
- {
- "date": "2023-01-19",
- "value": 1.6071845088942618
- },
- {
- "date": "2023-01-20",
- "value": 1.5830358423063384
- },
- {
- "date": "2023-01-23",
- "value": 1.621114006927946
- },
- {
- "date": "2023-01-24",
- "value": 1.6130654001090572
- },
- {
- "date": "2023-01-25",
- "value": 1.6009005524913442
- },
- {
- "date": "2023-01-26",
- "value": 1.6134605528048587
- },
- {
- "date": "2023-01-27",
- "value": 1.6354720714403188
- },
- {
- "date": "2023-01-30",
- "value": 1.6294971393256428
- },
- {
- "date": "2023-01-31",
- "value": 1.6619581056056343
- },
- {
- "date": "2023-02-01",
- "value": 1.6422601351299477
- },
- {
- "date": "2023-02-02",
- "value": 1.6290697088570545
- },
- {
- "date": "2023-02-03",
- "value": 1.6214322644095964
- },
- {
- "date": "2023-02-06",
- "value": 1.6333603064217255
- },
- {
- "date": "2023-02-07",
- "value": 1.6177891045746744
- },
- {
- "date": "2023-02-08",
- "value": 1.5698718578038835
- },
- {
- "date": "2023-02-09",
- "value": 1.5407479214118955
- },
- {
- "date": "2023-02-10",
- "value": 1.5119861445614493
- },
- {
- "date": "2023-02-13",
- "value": 1.5226010541403932
- },
- {
- "date": "2023-02-14",
- "value": 1.4988063240809006
- },
- {
- "date": "2023-02-15",
- "value": 1.4779398893127778
- },
- {
- "date": "2023-02-16",
- "value": 1.4835000462390642
- },
- {
- "date": "2023-02-17",
- "value": 1.4813842228254681
- },
- {
- "date": "2023-02-20",
- "value": 1.5074462323590043
- },
- {
- "date": "2023-02-21",
- "value": 1.5118798114873266
- },
- {
- "date": "2023-02-22",
- "value": 1.5175145354084114
- },
- {
- "date": "2023-02-23",
- "value": 1.493261684944487
- },
- {
- "date": "2023-02-24",
- "value": 1.4978923143284606
- },
- {
- "date": "2023-02-27",
- "value": 1.4693342459393604
- },
- {
- "date": "2023-02-28",
- "value": 1.4538939813210132
- },
- {
- "date": "2023-03-01",
- "value": 1.453768096311204
- },
- {
- "date": "2023-03-02",
- "value": 1.4675832972965297
- },
- {
- "date": "2023-03-03",
- "value": 1.4408994858494362
- },
- {
- "date": "2023-03-06",
- "value": 1.4596579323187706
- },
- {
- "date": "2023-03-07",
- "value": 1.4348840632204878
- },
- {
- "date": "2023-03-08",
- "value": 1.4116665202441498
- },
- {
- "date": "2023-03-09",
- "value": 1.4413041669648468
- },
- {
- "date": "2023-03-10",
- "value": 1.438421749057801
- },
- {
- "date": "2023-03-13",
- "value": 1.430071854611638
- },
- {
- "date": "2023-03-14",
- "value": 1.4758912026887554
- },
- {
- "date": "2023-03-15",
- "value": 1.4807011985308973
- },
- {
- "date": "2023-03-16",
- "value": 1.5010960195740877
- },
- {
- "date": "2023-03-17",
- "value": 1.506533235058802
- },
- {
- "date": "2023-03-20",
- "value": 1.5159105470184187
- },
- {
- "date": "2023-03-21",
- "value": 1.4992241345211044
- },
- {
- "date": "2023-03-22",
- "value": 1.4774923537720874
- },
- {
- "date": "2023-03-23",
- "value": 1.457920218523628
- },
- {
- "date": "2023-03-24",
- "value": 1.464770829947661
- },
- {
- "date": "2023-03-27",
- "value": 1.4911106783704893
- },
- {
- "date": "2023-03-28",
- "value": 1.5011983820123198
- },
- {
- "date": "2023-03-29",
- "value": 1.510220259500732
- },
- {
- "date": "2023-03-30",
- "value": 1.548071598770271
- },
- {
- "date": "2023-03-31",
- "value": 1.5636913118544262
- },
- {
- "date": "2023-04-03",
- "value": 1.5277830969827968
- },
- {
- "date": "2023-04-04",
- "value": 1.5181594282105384
- },
- {
- "date": "2023-04-05",
- "value": 1.5019002819454037
- },
- {
- "date": "2023-04-06",
- "value": 1.4860501842175278
- },
- {
- "date": "2023-04-07",
- "value": 1.4856674533390535
- },
- {
- "date": "2023-04-10",
- "value": 1.506709049294476
- },
- {
- "date": "2023-04-11",
- "value": 1.4970262507543293
- },
- {
- "date": "2023-04-12",
- "value": 1.5261617191977226
- },
- {
- "date": "2023-04-13",
- "value": 1.5334072823507698
- },
- {
- "date": "2023-04-14",
- "value": 1.53400401883528
- },
- {
- "date": "2023-04-17",
- "value": 1.5580779597257657
- },
- {
- "date": "2023-04-18",
- "value": 1.584122070547183
- },
- {
- "date": "2023-04-19",
- "value": 1.60955239268984
- },
- {
- "date": "2023-04-20",
- "value": 1.5935115537186406
- },
- {
- "date": "2023-04-21",
- "value": 1.5732194860647335
- },
- {
- "date": "2023-04-24",
- "value": 1.5653565441202253
- },
- {
- "date": "2023-04-25",
- "value": 1.59438375751017
- },
- {
- "date": "2023-04-26",
- "value": 1.5721398620036304
- },
- {
- "date": "2023-04-27",
- "value": 1.5580333244003095
- },
- {
- "date": "2023-04-28",
- "value": 1.5620713279493155
- },
- {
- "date": "2023-05-01",
- "value": 1.5420504769703478
- },
- {
- "date": "2023-05-02",
- "value": 1.5480594837583799
- },
- {
- "date": "2023-05-03",
- "value": 1.535841258077843
- },
- {
- "date": "2023-05-04",
- "value": 1.5560964379427926
- },
- {
- "date": "2023-05-05",
- "value": 1.554406229232912
- },
- {
- "date": "2023-05-08",
- "value": 1.5218688721434739
- },
- {
- "date": "2023-05-09",
- "value": 1.54293047707738
- },
- {
- "date": "2023-05-10",
- "value": 1.5405428889386028
- },
- {
- "date": "2023-05-11",
- "value": 1.5309968045708806
- },
- {
- "date": "2023-05-12",
- "value": 1.5378900562338167
- },
- {
- "date": "2023-05-15",
- "value": 1.5392325508168718
- },
- {
- "date": "2023-05-16",
- "value": 1.5445581062165366
- },
- {
- "date": "2023-05-17",
- "value": 1.5432282440579577
- },
- {
- "date": "2023-05-18",
- "value": 1.544451419763315
- },
- {
- "date": "2023-05-19",
- "value": 1.5203043522229829
- },
- {
- "date": "2023-05-22",
- "value": 1.5357260020285826
- },
- {
- "date": "2023-05-23",
- "value": 1.49980811275992
- },
- {
- "date": "2023-05-24",
- "value": 1.509471024526901
- },
- {
- "date": "2023-05-25",
- "value": 1.5250161196075147
- },
- {
- "date": "2023-05-26",
- "value": 1.5154443150768366
- },
- {
- "date": "2023-05-29",
- "value": 1.5056353242018086
- },
- {
- "date": "2023-05-30",
- "value": 1.4992577534397709
- },
- {
- "date": "2023-05-31",
- "value": 1.504441635356661
- },
- {
- "date": "2023-06-01",
- "value": 1.5256973237720315
- },
- {
- "date": "2023-06-02",
- "value": 1.5051992178362337
- },
- {
- "date": "2023-06-05",
- "value": 1.5317982309694458
- },
- {
- "date": "2023-06-06",
- "value": 1.5554734895535856
- },
- {
- "date": "2023-06-07",
- "value": 1.5602134060759412
- },
- {
- "date": "2023-06-08",
- "value": 1.5577764214340728
- },
- {
- "date": "2023-06-09",
- "value": 1.522219523299327
- },
- {
- "date": "2023-06-12",
- "value": 1.5216202175337963
- },
- {
- "date": "2023-06-13",
- "value": 1.5073194839051491
- },
- {
- "date": "2023-06-14",
- "value": 1.519033685361743
- },
- {
- "date": "2023-06-15",
- "value": 1.5388178523232559
- },
- {
- "date": "2023-06-16",
- "value": 1.5441464836449075
- },
- {
- "date": "2023-06-19",
- "value": 1.5323661491606921
- },
- {
- "date": "2023-06-20",
- "value": 1.5326033126911107
- },
- {
- "date": "2023-06-21",
- "value": 1.5122216214149709
- },
- {
- "date": "2023-06-22",
- "value": 1.488993354273277
- },
- {
- "date": "2023-06-23",
- "value": 1.4863568677070944
- },
- {
- "date": "2023-06-26",
- "value": 1.4942052210170047
- },
- {
- "date": "2023-06-27",
- "value": 1.4916956249284838
- },
- {
- "date": "2023-06-28",
- "value": 1.4761566855368982
- },
- {
- "date": "2023-06-29",
- "value": 1.4740068592546338
- },
- {
- "date": "2023-06-30",
- "value": 1.4683243562289428
- },
- {
- "date": "2023-07-03",
- "value": 1.4770358034518702
- },
- {
- "date": "2023-07-04",
- "value": 1.4682419612704665
- },
- {
- "date": "2023-07-05",
- "value": 1.464099402634614
- },
- {
- "date": "2023-07-06",
- "value": 1.4976024278992581
- },
- {
- "date": "2023-07-07",
- "value": 1.530201372772038
- },
- {
- "date": "2023-07-10",
- "value": 1.5167191344764843
- },
- {
- "date": "2023-07-11",
- "value": 1.5295564463368387
- },
- {
- "date": "2023-07-12",
- "value": 1.547464165669784
- },
- {
- "date": "2023-07-13",
- "value": 1.5154378647260873
- },
- {
- "date": "2023-07-14",
- "value": 1.5091988424906986
- },
- {
- "date": "2023-07-17",
- "value": 1.5200792729347965
- },
- {
- "date": "2023-07-18",
- "value": 1.5190684969401242
- },
- {
- "date": "2023-07-19",
- "value": 1.506539592387386
- },
- {
- "date": "2023-07-20",
- "value": 1.4794921702301633
- },
- {
- "date": "2023-07-21",
- "value": 1.5012454675541678
- },
- {
- "date": "2023-07-24",
- "value": 1.4871513944651533
- },
- {
- "date": "2023-07-25",
- "value": 1.5059939157909843
- },
- {
- "date": "2023-07-26",
- "value": 1.503861659548505
- },
- {
- "date": "2023-07-27",
- "value": 1.501173650792633
- },
- {
- "date": "2023-07-28",
- "value": 1.532186970619273
- },
- {
- "date": "2023-07-31",
- "value": 1.5255594023813484
- },
- {
- "date": "2023-08-01",
- "value": 1.498732325078606
- },
- {
- "date": "2023-08-02",
- "value": 1.5419899703006321
- },
- {
- "date": "2023-08-03",
- "value": 1.561752370910934
- },
- {
- "date": "2023-08-04",
- "value": 1.5511889938602104
- },
- {
- "date": "2023-08-07",
- "value": 1.519277786908953
- },
- {
- "date": "2023-08-08",
- "value": 1.5209630454874814
- },
- {
- "date": "2023-08-09",
- "value": 1.537881538104266
- },
- {
- "date": "2023-08-10",
- "value": 1.544371743178801
- },
- {
- "date": "2023-08-11",
- "value": 1.5075676545576882
- },
- {
- "date": "2023-08-14",
- "value": 1.4660717540740338
- },
- {
- "date": "2023-08-15",
- "value": 1.4738258755398483
- },
- {
- "date": "2023-08-16",
- "value": 1.5058600694136546
- },
- {
- "date": "2023-08-17",
- "value": 1.4913777989536372
- },
- {
- "date": "2023-08-18",
- "value": 1.4795426724735454
- },
- {
- "date": "2023-08-21",
- "value": 1.469365687401806
- },
- {
- "date": "2023-08-22",
- "value": 1.452030365063124
- },
- {
- "date": "2023-08-23",
- "value": 1.4647036792632933
- },
- {
- "date": "2023-08-24",
- "value": 1.4713375281704248
- },
- {
- "date": "2023-08-25",
- "value": 1.471994930361738
- },
- {
- "date": "2023-08-28",
- "value": 1.4667344480442368
- },
- {
- "date": "2023-08-29",
- "value": 1.4796923545793361
- },
- {
- "date": "2023-08-30",
- "value": 1.442123011053604
- },
- {
- "date": "2023-08-31",
- "value": 1.4471383330519267
- },
- {
- "date": "2023-09-01",
- "value": 1.441606464102859
- },
- {
- "date": "2023-09-04",
- "value": 1.4669538763424048
- },
- {
- "date": "2023-09-05",
- "value": 1.462798037532184
- },
- {
- "date": "2023-09-06",
- "value": 1.4661500056119325
- },
- {
- "date": "2023-09-07",
- "value": 1.4593271579512124
- },
- {
- "date": "2023-09-08",
- "value": 1.4576432128098378
- },
- {
- "date": "2023-09-11",
- "value": 1.4494117258529176
- },
- {
- "date": "2023-09-12",
- "value": 1.4592425392562316
- },
- {
- "date": "2023-09-13",
- "value": 1.477114952055161
- },
- {
- "date": "2023-09-14",
- "value": 1.4757963474519988
- },
- {
- "date": "2023-09-15",
- "value": 1.4999419928041844
- },
- {
- "date": "2023-09-18",
- "value": 1.4977171083854728
- },
- {
- "date": "2023-09-19",
- "value": 1.4771228645039152
- },
- {
- "date": "2023-09-20",
- "value": 1.495779446544687
- },
- {
- "date": "2023-09-21",
- "value": 1.481321766160202
- },
- {
- "date": "2023-09-22",
- "value": 1.4794721284674173
- },
- {
- "date": "2023-09-25",
- "value": 1.4664593337496006
- },
- {
- "date": "2023-09-26",
- "value": 1.456263629329746
- },
- {
- "date": "2023-09-27",
- "value": 1.450208029328721
- },
- {
- "date": "2023-09-28",
- "value": 1.434831690938347
- },
- {
- "date": "2023-09-29",
- "value": 1.4318162261874827
- },
- {
- "date": "2023-10-02",
- "value": 1.444828414573708
- },
- {
- "date": "2023-10-03",
- "value": 1.460442598872023
- },
- {
- "date": "2023-10-04",
- "value": 1.4675603201392442
- },
- {
- "date": "2023-10-05",
- "value": 1.471573065199713
- },
- {
- "date": "2023-10-06",
- "value": 1.4492898989090648
- },
- {
- "date": "2023-10-09",
- "value": 1.451515941932419
- },
- {
- "date": "2023-10-10",
- "value": 1.4423449577516456
- },
- {
- "date": "2023-10-11",
- "value": 1.444401035682493
- },
- {
- "date": "2023-10-12",
- "value": 1.4400884021824911
- },
- {
- "date": "2023-10-13",
- "value": 1.41143509025166
- },
- {
- "date": "2023-10-16",
- "value": 1.417372953021757
- },
- {
- "date": "2023-10-17",
- "value": 1.4290333325139346
- },
- {
- "date": "2023-10-18",
- "value": 1.4212073389341278
- },
- {
- "date": "2023-10-19",
- "value": 1.4032990804011756
- },
- {
- "date": "2023-10-20",
- "value": 1.412018639316523
- },
- {
- "date": "2023-10-23",
- "value": 1.4176643596454193
- },
- {
- "date": "2023-10-24",
- "value": 1.4253436941042676
- },
- {
- "date": "2023-10-25",
- "value": 1.4310768559208407
- },
- {
- "date": "2023-10-26",
- "value": 1.4429996738701076
- },
- {
- "date": "2023-10-27",
- "value": 1.4462173102596625
- },
- {
- "date": "2023-10-30",
- "value": 1.4338789477939164
- },
- {
- "date": "2023-10-31",
- "value": 1.4424783051952437
- }
- ],
- "drawdown": [
- {
- "date": "2020-01-02",
- "value": 0.0
- },
- {
- "date": "2020-01-03",
- "value": 0.0
- },
- {
- "date": "2020-01-06",
- "value": -0.0006551711860099951
- },
- {
- "date": "2020-01-07",
- "value": 0.0
- },
- {
- "date": "2020-01-08",
- "value": -0.008962437335003681
- },
- {
- "date": "2020-01-09",
- "value": -0.014497027943747187
- },
- {
- "date": "2020-01-10",
- "value": -0.017976116074270854
- },
- {
- "date": "2020-01-13",
- "value": 0.0
- },
- {
- "date": "2020-01-14",
- "value": 0.0
- },
- {
- "date": "2020-01-15",
- "value": 0.0
- },
- {
- "date": "2020-01-16",
- "value": -0.0010511476918617646
- },
- {
- "date": "2020-01-17",
- "value": 0.0
- },
- {
- "date": "2020-01-20",
- "value": 0.0
- },
- {
- "date": "2020-01-21",
- "value": -0.005796624810484263
- },
- {
- "date": "2020-01-22",
- "value": -0.01862906022170796
- },
- {
- "date": "2020-01-23",
- "value": -0.035180266978327324
- },
- {
- "date": "2020-01-24",
- "value": -0.03360968658759522
- },
- {
- "date": "2020-01-27",
- "value": -0.02623517884366411
- },
- {
- "date": "2020-01-28",
- "value": -0.012846006714808511
- },
- {
- "date": "2020-01-29",
- "value": -0.003583210471130416
- },
- {
- "date": "2020-01-30",
- "value": -3.3662332001860307e-06
- },
- {
- "date": "2020-01-31",
- "value": 0.0
- },
- {
- "date": "2020-02-03",
- "value": 0.0
- },
- {
- "date": "2020-02-04",
- "value": 0.0
- },
- {
- "date": "2020-02-05",
- "value": -0.0005708258697525448
- },
- {
- "date": "2020-02-06",
- "value": 0.0
- },
- {
- "date": "2020-02-07",
- "value": -0.014638000734746082
- },
- {
- "date": "2020-02-10",
- "value": -0.010025830693528803
- },
- {
- "date": "2020-02-11",
- "value": -0.0005216386035982179
- },
- {
- "date": "2020-02-12",
- "value": -0.0030870774217988117
- },
- {
- "date": "2020-02-13",
- "value": 0.0
- },
- {
- "date": "2020-02-14",
- "value": -0.00949493177109717
- },
- {
- "date": "2020-02-17",
- "value": -0.002196458763514153
- },
- {
- "date": "2020-02-18",
- "value": -0.0012913151185824923
- },
- {
- "date": "2020-02-19",
- "value": -0.002176698022231749
- },
- {
- "date": "2020-02-20",
- "value": -0.014027009646693345
- },
- {
- "date": "2020-02-21",
- "value": -0.00909655634489337
- },
- {
- "date": "2020-02-24",
- "value": 0.0
- },
- {
- "date": "2020-02-25",
- "value": -0.008110377685709103
- },
- {
- "date": "2020-02-26",
- "value": -0.01242026594787915
- },
- {
- "date": "2020-02-27",
- "value": 0.0
- },
- {
- "date": "2020-02-28",
- "value": 0.0
- },
- {
- "date": "2020-03-02",
- "value": 0.0
- },
- {
- "date": "2020-03-03",
- "value": -0.004724678779101654
- },
- {
- "date": "2020-03-04",
- "value": 0.0
- },
- {
- "date": "2020-03-05",
- "value": -0.0038586526285340206
- },
- {
- "date": "2020-03-06",
- "value": -0.015182139640162795
- },
- {
- "date": "2020-03-09",
- "value": -0.008255622231294502
- },
- {
- "date": "2020-03-10",
- "value": -0.008041913196700112
- },
- {
- "date": "2020-03-11",
- "value": 0.0
- },
- {
- "date": "2020-03-12",
- "value": -0.015265541131134763
- },
- {
- "date": "2020-03-13",
- "value": -0.020491634558761795
- },
- {
- "date": "2020-03-16",
- "value": -0.03216203507091098
- },
- {
- "date": "2020-03-17",
- "value": -0.04167221354639461
- },
- {
- "date": "2020-03-18",
- "value": -0.03986810603855073
- },
- {
- "date": "2020-03-19",
- "value": -0.03400209074765559
- },
- {
- "date": "2020-03-20",
- "value": -0.05091534344507276
- },
- {
- "date": "2020-03-23",
- "value": -0.06530772065421453
- },
- {
- "date": "2020-03-24",
- "value": -0.05467516310222609
- },
- {
- "date": "2020-03-25",
- "value": -0.05111281975631898
- },
- {
- "date": "2020-03-26",
- "value": -0.04631279190163495
- },
- {
- "date": "2020-03-27",
- "value": -0.05245194072302195
- },
- {
- "date": "2020-03-30",
- "value": -0.0433948930169632
- },
- {
- "date": "2020-03-31",
- "value": -0.038394214786035996
- },
- {
- "date": "2020-04-01",
- "value": -0.04845759260960547
- },
- {
- "date": "2020-04-02",
- "value": -0.050268438578581986
- },
- {
- "date": "2020-04-03",
- "value": -0.050149343615582764
- },
- {
- "date": "2020-04-06",
- "value": -0.04538454164826877
- },
- {
- "date": "2020-04-07",
- "value": -0.0386365642203228
- },
- {
- "date": "2020-04-08",
- "value": -0.023715812228315647
- },
- {
- "date": "2020-04-09",
- "value": -0.025423272423515275
- },
- {
- "date": "2020-04-10",
- "value": -0.03763771772543789
- },
- {
- "date": "2020-04-13",
- "value": -0.052946017690388536
- },
- {
- "date": "2020-04-14",
- "value": -0.06773942871908933
- },
- {
- "date": "2020-04-15",
- "value": -0.07178947442356387
- },
- {
- "date": "2020-04-16",
- "value": -0.07146757524991287
- },
- {
- "date": "2020-04-17",
- "value": -0.07672805720944065
- },
- {
- "date": "2020-04-20",
- "value": -0.06366492971452908
- },
- {
- "date": "2020-04-21",
- "value": -0.06940173148234074
- },
- {
- "date": "2020-04-22",
- "value": -0.08040168283814109
- },
- {
- "date": "2020-04-23",
- "value": -0.0657612124187843
- },
- {
- "date": "2020-04-24",
- "value": -0.056977255967537
- },
- {
- "date": "2020-04-27",
- "value": -0.05152084482561492
- },
- {
- "date": "2020-04-28",
- "value": -0.05151960916523546
- },
- {
- "date": "2020-04-29",
- "value": -0.05795875104725112
- },
- {
- "date": "2020-04-30",
- "value": -0.055092518884468644
- },
- {
- "date": "2020-05-01",
- "value": -0.045062292163039364
- },
- {
- "date": "2020-05-04",
- "value": -0.04767045264354519
- },
- {
- "date": "2020-05-05",
- "value": -0.05773429601500302
- },
- {
- "date": "2020-05-06",
- "value": -0.05911460627252074
- },
- {
- "date": "2020-05-07",
- "value": -0.057820449880194746
- },
- {
- "date": "2020-05-08",
- "value": -0.05018604705489016
- },
- {
- "date": "2020-05-11",
- "value": -0.04588993732814983
- },
- {
- "date": "2020-05-12",
- "value": -0.041000323401175987
- },
- {
- "date": "2020-05-13",
- "value": -0.044148224437990824
- },
- {
- "date": "2020-05-14",
- "value": -0.04342095132639856
- },
- {
- "date": "2020-05-15",
- "value": -0.02815932625271056
- },
- {
- "date": "2020-05-18",
- "value": -0.02104057910097179
- },
- {
- "date": "2020-05-19",
- "value": -0.03813952691375777
- },
- {
- "date": "2020-05-20",
- "value": -0.03381174555114097
- },
- {
- "date": "2020-05-21",
- "value": -0.034194355228504
- },
- {
- "date": "2020-05-22",
- "value": -0.028953343456374014
- },
- {
- "date": "2020-05-25",
- "value": -0.024800835335239912
- },
- {
- "date": "2020-05-26",
- "value": -0.015950080110865295
- },
- {
- "date": "2020-05-27",
- "value": -0.012322615228579581
- },
- {
- "date": "2020-05-28",
- "value": -0.022900971410227178
- },
- {
- "date": "2020-05-29",
- "value": -0.01776274962864033
- },
- {
- "date": "2020-06-01",
- "value": -0.022052623100444646
- },
- {
- "date": "2020-06-02",
- "value": -0.0187119621196834
- },
- {
- "date": "2020-06-03",
- "value": -0.011098160182110628
- },
- {
- "date": "2020-06-04",
- "value": -0.001292789881753853
- },
- {
- "date": "2020-06-05",
- "value": 0.0
- },
- {
- "date": "2020-06-08",
- "value": -0.010345720969290206
- },
- {
- "date": "2020-06-09",
- "value": 0.0
- },
- {
- "date": "2020-06-10",
- "value": 0.0
- },
- {
- "date": "2020-06-11",
- "value": 0.0
- },
- {
- "date": "2020-06-12",
- "value": 0.0
- },
- {
- "date": "2020-06-15",
- "value": 0.0
- },
- {
- "date": "2020-06-16",
- "value": 0.0
- },
- {
- "date": "2020-06-17",
- "value": -0.017029130630299316
- },
- {
- "date": "2020-06-18",
- "value": -0.01655436204325167
- },
- {
- "date": "2020-06-19",
- "value": -0.03776742411204259
- },
- {
- "date": "2020-06-22",
- "value": -0.048829373020565225
- },
- {
- "date": "2020-06-23",
- "value": -0.03982536568490991
- },
- {
- "date": "2020-06-24",
- "value": -0.0402936861556471
- },
- {
- "date": "2020-06-25",
- "value": -0.03598083728790635
- },
- {
- "date": "2020-06-26",
- "value": -0.019449151159878775
- },
- {
- "date": "2020-06-29",
- "value": -0.032246935344390826
- },
- {
- "date": "2020-06-30",
- "value": -0.04738952231592464
- },
- {
- "date": "2020-07-01",
- "value": -0.03457678495148897
- },
- {
- "date": "2020-07-02",
- "value": -0.034557585451432504
- },
- {
- "date": "2020-07-03",
- "value": -0.036694241105239334
- },
- {
- "date": "2020-07-06",
- "value": -0.04304516341944009
- },
- {
- "date": "2020-07-07",
- "value": -0.040373112321079985
- },
- {
- "date": "2020-07-08",
- "value": -0.03361878210970404
- },
- {
- "date": "2020-07-09",
- "value": -0.047063343477123376
- },
- {
- "date": "2020-07-10",
- "value": -0.0464909067314867
- },
- {
- "date": "2020-07-13",
- "value": -0.05309017987508324
- },
- {
- "date": "2020-07-14",
- "value": -0.04882550194016366
- },
- {
- "date": "2020-07-15",
- "value": -0.04272855103838169
- },
- {
- "date": "2020-07-16",
- "value": -0.028198316246656918
- },
- {
- "date": "2020-07-17",
- "value": -0.0379659645369298
- },
- {
- "date": "2020-07-20",
- "value": -0.03312248740879509
- },
- {
- "date": "2020-07-21",
- "value": -0.01975633596798254
- },
- {
- "date": "2020-07-22",
- "value": -0.01048628307432209
- },
- {
- "date": "2020-07-23",
- "value": -0.012948903460819339
- },
- {
- "date": "2020-07-24",
- "value": -0.025536053356167043
- },
- {
- "date": "2020-07-27",
- "value": -0.035156266560299465
- },
- {
- "date": "2020-07-28",
- "value": -0.047991045651649356
- },
- {
- "date": "2020-07-29",
- "value": -0.05099255121061186
- },
- {
- "date": "2020-07-30",
- "value": -0.0613439411827601
- },
- {
- "date": "2020-07-31",
- "value": -0.047984408959297675
- },
- {
- "date": "2020-08-03",
- "value": -0.061377804393572544
- },
- {
- "date": "2020-08-04",
- "value": -0.06533886841071712
- },
- {
- "date": "2020-08-05",
- "value": -0.08106583523378141
- },
- {
- "date": "2020-08-06",
- "value": -0.0946212068932315
- },
- {
- "date": "2020-08-07",
- "value": -0.1036450647188748
- },
- {
- "date": "2020-08-10",
- "value": -0.09125866162578167
- },
- {
- "date": "2020-08-11",
- "value": -0.07974404835156157
- },
- {
- "date": "2020-08-12",
- "value": -0.07469205902325193
- },
- {
- "date": "2020-08-13",
- "value": -0.09226872805832742
- },
- {
- "date": "2020-08-14",
- "value": -0.08588872314068674
- },
- {
- "date": "2020-08-17",
- "value": -0.08429102142616751
- },
- {
- "date": "2020-08-18",
- "value": -0.08772269540008948
- },
- {
- "date": "2020-08-19",
- "value": -0.09985841972100473
- },
- {
- "date": "2020-08-20",
- "value": -0.10077557394543601
- },
- {
- "date": "2020-08-21",
- "value": -0.08770123012948283
- },
- {
- "date": "2020-08-24",
- "value": -0.08643910456725845
- },
- {
- "date": "2020-08-25",
- "value": -0.08391011920377633
- },
- {
- "date": "2020-08-26",
- "value": -0.08632039481202569
- },
- {
- "date": "2020-08-27",
- "value": -0.0928393607662662
- },
- {
- "date": "2020-08-28",
- "value": -0.07689294458970863
- },
- {
- "date": "2020-08-31",
- "value": -0.07982954463512781
- },
- {
- "date": "2020-09-01",
- "value": -0.08704973192319099
- },
- {
- "date": "2020-09-02",
- "value": -0.09067955161105135
- },
- {
- "date": "2020-09-03",
- "value": -0.0914256095427941
- },
- {
- "date": "2020-09-04",
- "value": -0.10511258227126308
- },
- {
- "date": "2020-09-07",
- "value": -0.10209840351761224
- },
- {
- "date": "2020-09-08",
- "value": -0.1102470677602655
- },
- {
- "date": "2020-09-09",
- "value": -0.099884550199274
- },
- {
- "date": "2020-09-10",
- "value": -0.09615459923425673
- },
- {
- "date": "2020-09-11",
- "value": -0.09419662458422251
- },
- {
- "date": "2020-09-14",
- "value": -0.08592242515999515
- },
- {
- "date": "2020-09-15",
- "value": -0.09836428158675958
- },
- {
- "date": "2020-09-16",
- "value": -0.08883808964329898
- },
- {
- "date": "2020-09-17",
- "value": -0.09009331979949198
- },
- {
- "date": "2020-09-18",
- "value": -0.07547566683173479
- },
- {
- "date": "2020-09-21",
- "value": -0.07160503803598672
- },
- {
- "date": "2020-09-22",
- "value": -0.07251679952155776
- },
- {
- "date": "2020-09-23",
- "value": -0.0792155419724292
- },
- {
- "date": "2020-09-24",
- "value": -0.07958888557235677
- },
- {
- "date": "2020-09-25",
- "value": -0.08706997635772795
- },
- {
- "date": "2020-09-28",
- "value": -0.08377461600862923
- },
- {
- "date": "2020-09-29",
- "value": -0.07836592887761074
- },
- {
- "date": "2020-09-30",
- "value": -0.08029462674027055
- },
- {
- "date": "2020-10-01",
- "value": -0.0964273586061758
- },
- {
- "date": "2020-10-02",
- "value": -0.09534652716124459
- },
- {
- "date": "2020-10-05",
- "value": -0.09733411424165284
- },
- {
- "date": "2020-10-06",
- "value": -0.08969605965974381
- },
- {
- "date": "2020-10-07",
- "value": -0.08043505700978448
- },
- {
- "date": "2020-10-08",
- "value": -0.08143454566908692
- },
- {
- "date": "2020-10-09",
- "value": -0.07318829519923986
- },
- {
- "date": "2020-10-12",
- "value": -0.06300503552909664
- },
- {
- "date": "2020-10-13",
- "value": -0.06818228614125321
- },
- {
- "date": "2020-10-14",
- "value": -0.08420224220303152
- },
- {
- "date": "2020-10-15",
- "value": -0.09398387750643855
- },
- {
- "date": "2020-10-16",
- "value": -0.09788317145952463
- },
- {
- "date": "2020-10-19",
- "value": -0.11010488132705176
- },
- {
- "date": "2020-10-20",
- "value": -0.11663547922844819
- },
- {
- "date": "2020-10-21",
- "value": -0.12603164141040601
- },
- {
- "date": "2020-10-22",
- "value": -0.10635998610883435
- },
- {
- "date": "2020-10-23",
- "value": -0.09998902410783606
- },
- {
- "date": "2020-10-26",
- "value": -0.11340242267739209
- },
- {
- "date": "2020-10-27",
- "value": -0.12051687014804202
- },
- {
- "date": "2020-10-28",
- "value": -0.1250533585723076
- },
- {
- "date": "2020-10-29",
- "value": -0.1369097547349979
- },
- {
- "date": "2020-10-30",
- "value": -0.1306398919069387
- },
- {
- "date": "2020-11-02",
- "value": -0.13297766834571856
- },
- {
- "date": "2020-11-03",
- "value": -0.1297330918893146
- },
- {
- "date": "2020-11-04",
- "value": -0.13979516790519242
- },
- {
- "date": "2020-11-05",
- "value": -0.11942152252496885
- },
- {
- "date": "2020-11-06",
- "value": -0.11873901326290948
- },
- {
- "date": "2020-11-09",
- "value": -0.1310292103944033
- },
- {
- "date": "2020-11-10",
- "value": -0.13985678276469327
- },
- {
- "date": "2020-11-11",
- "value": -0.14022218064326097
- },
- {
- "date": "2020-11-12",
- "value": -0.13019230496077405
- },
- {
- "date": "2020-11-13",
- "value": -0.1336547138027364
- },
- {
- "date": "2020-11-16",
- "value": -0.12425626288262293
- },
- {
- "date": "2020-11-17",
- "value": -0.11539611401981709
- },
- {
- "date": "2020-11-18",
- "value": -0.1049105857967676
- },
- {
- "date": "2020-11-19",
- "value": -0.09792588468121577
- },
- {
- "date": "2020-11-20",
- "value": -0.09447463766764086
- },
- {
- "date": "2020-11-23",
- "value": -0.09665201914779997
- },
- {
- "date": "2020-11-24",
- "value": -0.10528909550385024
- },
- {
- "date": "2020-11-25",
- "value": -0.10384015417510284
- },
- {
- "date": "2020-11-26",
- "value": -0.10584609401909595
- },
- {
- "date": "2020-11-27",
- "value": -0.10314504672774538
- },
- {
- "date": "2020-11-30",
- "value": -0.09340542653758577
- },
- {
- "date": "2020-12-01",
- "value": -0.06954477433058093
- },
- {
- "date": "2020-12-02",
- "value": -0.06953937279283784
- },
- {
- "date": "2020-12-03",
- "value": -0.09256537034310108
- },
- {
- "date": "2020-12-04",
- "value": -0.08097060022912406
- },
- {
- "date": "2020-12-07",
- "value": -0.07806501411174227
- },
- {
- "date": "2020-12-08",
- "value": -0.07373972991178546
- },
- {
- "date": "2020-12-09",
- "value": -0.07823220556547283
- },
- {
- "date": "2020-12-10",
- "value": -0.07747874318037629
- },
- {
- "date": "2020-12-11",
- "value": -0.07001018503031631
- },
- {
- "date": "2020-12-14",
- "value": -0.054117659834959086
- },
- {
- "date": "2020-12-15",
- "value": -0.03520315289685405
- },
- {
- "date": "2020-12-16",
- "value": -0.042535984564742835
- },
- {
- "date": "2020-12-17",
- "value": -0.040376416267057125
- },
- {
- "date": "2020-12-18",
- "value": -0.04587023077258656
- },
- {
- "date": "2020-12-21",
- "value": -0.04054918394563056
- },
- {
- "date": "2020-12-22",
- "value": -0.051021350006828836
- },
- {
- "date": "2020-12-23",
- "value": -0.05865965056755762
- },
- {
- "date": "2020-12-24",
- "value": -0.06074576801570042
- },
- {
- "date": "2020-12-25",
- "value": -0.05179278314270819
- },
- {
- "date": "2020-12-28",
- "value": -0.045662200941392284
- },
- {
- "date": "2020-12-29",
- "value": -0.05100400878583067
- },
- {
- "date": "2020-12-30",
- "value": -0.06472312391225621
- },
- {
- "date": "2020-12-31",
- "value": -0.0660223374249369
- },
- {
- "date": "2021-01-01",
- "value": -0.05493962428547772
- },
- {
- "date": "2021-01-04",
- "value": -0.05024625638466407
- },
- {
- "date": "2021-01-05",
- "value": -0.04936780117326334
- },
- {
- "date": "2021-01-06",
- "value": -0.05365188919130304
- },
- {
- "date": "2021-01-07",
- "value": -0.05918464425320058
- },
- {
- "date": "2021-01-08",
- "value": -0.04279061993049893
- },
- {
- "date": "2021-01-11",
- "value": -0.04149236817582569
- },
- {
- "date": "2021-01-12",
- "value": -0.04194226068274409
- },
- {
- "date": "2021-01-13",
- "value": -0.04960845864022645
- },
- {
- "date": "2021-01-14",
- "value": -0.04560608381645781
- },
- {
- "date": "2021-01-15",
- "value": -0.05692871389435783
- },
- {
- "date": "2021-01-18",
- "value": -0.05158727182070044
- },
- {
- "date": "2021-01-19",
- "value": -0.06949423733643945
- },
- {
- "date": "2021-01-20",
- "value": -0.06874327459570373
- },
- {
- "date": "2021-01-21",
- "value": -0.06892115836501356
- },
- {
- "date": "2021-01-22",
- "value": -0.045108182515138595
- },
- {
- "date": "2021-01-25",
- "value": -0.0471287264634227
- },
- {
- "date": "2021-01-26",
- "value": -0.0581921616824258
- },
- {
- "date": "2021-01-27",
- "value": -0.062277663353591306
- },
- {
- "date": "2021-01-28",
- "value": -0.05338635957755056
- },
- {
- "date": "2021-01-29",
- "value": -0.04901054002779415
- },
- {
- "date": "2021-02-01",
- "value": -0.04294457739518964
- },
- {
- "date": "2021-02-02",
- "value": -0.04950150495690864
- },
- {
- "date": "2021-02-03",
- "value": -0.0494576606371373
- },
- {
- "date": "2021-02-04",
- "value": -0.042255969297291696
- },
- {
- "date": "2021-02-05",
- "value": -0.023133271844352987
- },
- {
- "date": "2021-02-08",
- "value": -0.00762071081659943
- },
- {
- "date": "2021-02-09",
- "value": 0.0
- },
- {
- "date": "2021-02-10",
- "value": 0.0
- },
- {
- "date": "2021-02-11",
- "value": -0.005289711974929445
- },
- {
- "date": "2021-02-12",
- "value": -0.005269398057790142
- },
- {
- "date": "2021-02-15",
- "value": -0.001346998615763484
- },
- {
- "date": "2021-02-16",
- "value": 0.0
- },
- {
- "date": "2021-02-17",
- "value": -0.008081843734207395
- },
- {
- "date": "2021-02-18",
- "value": -0.020802195015710567
- },
- {
- "date": "2021-02-19",
- "value": -0.02622305030558325
- },
- {
- "date": "2021-02-22",
- "value": -0.0405098510003844
- },
- {
- "date": "2021-02-23",
- "value": -0.021863370929881665
- },
- {
- "date": "2021-02-24",
- "value": -0.028088958659680197
- },
- {
- "date": "2021-02-25",
- "value": -0.0324315005290835
- },
- {
- "date": "2021-02-26",
- "value": -0.03504663460027746
- },
- {
- "date": "2021-03-01",
- "value": -0.03177760774740701
- },
- {
- "date": "2021-03-02",
- "value": -0.03386434786541104
- },
- {
- "date": "2021-03-03",
- "value": -0.04424196444722106
- },
- {
- "date": "2021-03-04",
- "value": -0.05242854249678108
- },
- {
- "date": "2021-03-05",
- "value": -0.047748594907311426
- },
- {
- "date": "2021-03-08",
- "value": -0.04300980656087816
- },
- {
- "date": "2021-03-09",
- "value": -0.04097943469988263
- },
- {
- "date": "2021-03-10",
- "value": -0.05160421770467327
- },
- {
- "date": "2021-03-11",
- "value": -0.051678410973772126
- },
- {
- "date": "2021-03-12",
- "value": -0.05864239553225559
- },
- {
- "date": "2021-03-15",
- "value": -0.05465370981640949
- },
- {
- "date": "2021-03-16",
- "value": -0.05167878344528798
- },
- {
- "date": "2021-03-17",
- "value": -0.05020935627854395
- },
- {
- "date": "2021-03-18",
- "value": -0.056415657520139995
- },
- {
- "date": "2021-03-19",
- "value": -0.05480311474871091
- },
- {
- "date": "2021-03-22",
- "value": -0.06453666407884928
- },
- {
- "date": "2021-03-23",
- "value": -0.07344502200966996
- },
- {
- "date": "2021-03-24",
- "value": -0.07652828899288089
- },
- {
- "date": "2021-03-25",
- "value": -0.07656012689958325
- },
- {
- "date": "2021-03-26",
- "value": -0.06988343127257135
- },
- {
- "date": "2021-03-29",
- "value": -0.07144415307453755
- },
- {
- "date": "2021-03-30",
- "value": -0.08184789183698693
- },
- {
- "date": "2021-03-31",
- "value": -0.06877912839448475
- },
- {
- "date": "2021-04-01",
- "value": -0.071047326208319
- },
- {
- "date": "2021-04-02",
- "value": -0.0632200074222069
- },
- {
- "date": "2021-04-05",
- "value": -0.0627550143314981
- },
- {
- "date": "2021-04-06",
- "value": -0.0746359223254941
- },
- {
- "date": "2021-04-07",
- "value": -0.06363051369840667
- },
- {
- "date": "2021-04-08",
- "value": -0.04411048208388335
- },
- {
- "date": "2021-04-09",
- "value": -0.04772873887409723
- },
- {
- "date": "2021-04-12",
- "value": -0.04982640143261374
- },
- {
- "date": "2021-04-13",
- "value": -0.02698426956600064
- },
- {
- "date": "2021-04-14",
- "value": -0.03197328945338351
- },
- {
- "date": "2021-04-15",
- "value": -0.0452039303675521
- },
- {
- "date": "2021-04-16",
- "value": -0.06455888691002143
- },
- {
- "date": "2021-04-19",
- "value": -0.061422744720866174
- },
- {
- "date": "2021-04-20",
- "value": -0.05501198301210375
- },
- {
- "date": "2021-04-21",
- "value": -0.055987699608425645
- },
- {
- "date": "2021-04-22",
- "value": -0.06960225816262655
- },
- {
- "date": "2021-04-23",
- "value": -0.08412792757694032
- },
- {
- "date": "2021-04-26",
- "value": -0.08553634387320197
- },
- {
- "date": "2021-04-27",
- "value": -0.08880702683959696
- },
- {
- "date": "2021-04-28",
- "value": -0.08884369813462745
- },
- {
- "date": "2021-04-29",
- "value": -0.09352984056507241
- },
- {
- "date": "2021-04-30",
- "value": -0.08878857044062094
- },
- {
- "date": "2021-05-03",
- "value": -0.08017484078404047
- },
- {
- "date": "2021-05-04",
- "value": -0.09279499189583251
- },
- {
- "date": "2021-05-05",
- "value": -0.09016780594000684
- },
- {
- "date": "2021-05-06",
- "value": -0.10771168041900914
- },
- {
- "date": "2021-05-07",
- "value": -0.1040426218320607
- },
- {
- "date": "2021-05-10",
- "value": -0.10277121214437701
- },
- {
- "date": "2021-05-11",
- "value": -0.10159036472394456
- },
- {
- "date": "2021-05-12",
- "value": -0.09935970361436053
- },
- {
- "date": "2021-05-13",
- "value": -0.1126006333984011
- },
- {
- "date": "2021-05-14",
- "value": -0.12241108654132926
- },
- {
- "date": "2021-05-17",
- "value": -0.10923323895316006
- },
- {
- "date": "2021-05-18",
- "value": -0.11414719213128177
- },
- {
- "date": "2021-05-19",
- "value": -0.13035214672392714
- },
- {
- "date": "2021-05-20",
- "value": -0.11572900383755957
- },
- {
- "date": "2021-05-21",
- "value": -0.0992984677011437
- },
- {
- "date": "2021-05-24",
- "value": -0.0919967033623007
- },
- {
- "date": "2021-05-25",
- "value": -0.08339527881850883
- },
- {
- "date": "2021-05-26",
- "value": -0.07964368154228973
- },
- {
- "date": "2021-05-27",
- "value": -0.07699990645398058
- },
- {
- "date": "2021-05-28",
- "value": -0.08675222368201696
- },
- {
- "date": "2021-05-31",
- "value": -0.0976157035951517
- },
- {
- "date": "2021-06-01",
- "value": -0.08989606609067846
- },
- {
- "date": "2021-06-02",
- "value": -0.0840599361158938
- },
- {
- "date": "2021-06-03",
- "value": -0.07291155771640223
- },
- {
- "date": "2021-06-04",
- "value": -0.06674415852491278
- },
- {
- "date": "2021-06-07",
- "value": -0.0627447712359942
- },
- {
- "date": "2021-06-08",
- "value": -0.06768544537911092
- },
- {
- "date": "2021-06-09",
- "value": -0.07975857931421348
- },
- {
- "date": "2021-06-10",
- "value": -0.07553476052305663
- },
- {
- "date": "2021-06-11",
- "value": -0.07336939016429533
- },
- {
- "date": "2021-06-14",
- "value": -0.07964851208788926
- },
- {
- "date": "2021-06-15",
- "value": -0.0894901518319351
- },
- {
- "date": "2021-06-16",
- "value": -0.09489089779856874
- },
- {
- "date": "2021-06-17",
- "value": -0.09505989847191276
- },
- {
- "date": "2021-06-18",
- "value": -0.09320673368427645
- },
- {
- "date": "2021-06-21",
- "value": -0.1062148745128868
- },
- {
- "date": "2021-06-22",
- "value": -0.10451730902027867
- },
- {
- "date": "2021-06-23",
- "value": -0.1275461938419976
- },
- {
- "date": "2021-06-24",
- "value": -0.11146658070014903
- },
- {
- "date": "2021-06-25",
- "value": -0.11356266018963712
- },
- {
- "date": "2021-06-28",
- "value": -0.09839266378674272
- },
- {
- "date": "2021-06-29",
- "value": -0.1091427848825407
- },
- {
- "date": "2021-06-30",
- "value": -0.10761398216269114
- },
- {
- "date": "2021-07-01",
- "value": -0.10395559231811369
- },
- {
- "date": "2021-07-02",
- "value": -0.11186892533164827
- },
- {
- "date": "2021-07-05",
- "value": -0.10981378525872332
- },
- {
- "date": "2021-07-06",
- "value": -0.11452286789089172
- },
- {
- "date": "2021-07-07",
- "value": -0.10277153757478763
- },
- {
- "date": "2021-07-08",
- "value": -0.10762245529456038
- },
- {
- "date": "2021-07-09",
- "value": -0.11133398237452585
- },
- {
- "date": "2021-07-12",
- "value": -0.11088892826950414
- },
- {
- "date": "2021-07-13",
- "value": -0.11227574123760775
- },
- {
- "date": "2021-07-14",
- "value": -0.09817011362174555
- },
- {
- "date": "2021-07-15",
- "value": -0.09655163823172319
- },
- {
- "date": "2021-07-16",
- "value": -0.08532494655661671
- },
- {
- "date": "2021-07-19",
- "value": -0.08074171992922918
- },
- {
- "date": "2021-07-20",
- "value": -0.08482039147606768
- },
- {
- "date": "2021-07-21",
- "value": -0.08083435570708553
- },
- {
- "date": "2021-07-22",
- "value": -0.08729021395881131
- },
- {
- "date": "2021-07-23",
- "value": -0.08493979643599636
- },
- {
- "date": "2021-07-26",
- "value": -0.07681188172601605
- },
- {
- "date": "2021-07-27",
- "value": -0.07018888796316458
- },
- {
- "date": "2021-07-28",
- "value": -0.06932207882337837
- },
- {
- "date": "2021-07-29",
- "value": -0.030456650435492838
- },
- {
- "date": "2021-07-30",
- "value": -0.022955662035337276
- },
- {
- "date": "2021-08-02",
- "value": -0.026291998916668335
- },
- {
- "date": "2021-08-03",
- "value": -0.01961117992204353
- },
- {
- "date": "2021-08-04",
- "value": -0.0007731683457152805
- },
- {
- "date": "2021-08-05",
- "value": -0.007836676789841457
- },
- {
- "date": "2021-08-06",
- "value": 0.0
- },
- {
- "date": "2021-08-09",
- "value": 0.0
- },
- {
- "date": "2021-08-10",
- "value": 0.0
- },
- {
- "date": "2021-08-11",
- "value": -0.0001440193252592037
- },
- {
- "date": "2021-08-12",
- "value": 0.0
- },
- {
- "date": "2021-08-13",
- "value": 0.0
- },
- {
- "date": "2021-08-16",
- "value": 0.0
- },
- {
- "date": "2021-08-17",
- "value": 0.0
- },
- {
- "date": "2021-08-18",
- "value": -5.8634046762873204e-05
- },
- {
- "date": "2021-08-19",
- "value": 0.0
- },
- {
- "date": "2021-08-20",
- "value": 0.0
- },
- {
- "date": "2021-08-23",
- "value": 0.0
- },
- {
- "date": "2021-08-24",
- "value": -0.01636025125392615
- },
- {
- "date": "2021-08-25",
- "value": -0.0180980724145956
- },
- {
- "date": "2021-08-26",
- "value": -0.02515813380881926
- },
- {
- "date": "2021-08-27",
- "value": -0.0197643207382715
- },
- {
- "date": "2021-08-30",
- "value": -0.015786941247018627
- },
- {
- "date": "2021-08-31",
- "value": -0.014728028510616942
- },
- {
- "date": "2021-09-01",
- "value": -0.019593692747677527
- },
- {
- "date": "2021-09-02",
- "value": -0.02757808975772924
- },
- {
- "date": "2021-09-03",
- "value": -0.023127859926243333
- },
- {
- "date": "2021-09-06",
- "value": -0.033717156001195625
- },
- {
- "date": "2021-09-07",
- "value": -0.022282557371043787
- },
- {
- "date": "2021-09-08",
- "value": -0.021100147105906353
- },
- {
- "date": "2021-09-09",
- "value": -0.02441802233506718
- },
- {
- "date": "2021-09-10",
- "value": -0.03214228516266848
- },
- {
- "date": "2021-09-13",
- "value": -0.04004860447178149
- },
- {
- "date": "2021-09-14",
- "value": -0.048128576643367005
- },
- {
- "date": "2021-09-15",
- "value": -0.04544042543687621
- },
- {
- "date": "2021-09-16",
- "value": -0.05049442365409984
- },
- {
- "date": "2021-09-17",
- "value": -0.031031868677584007
- },
- {
- "date": "2021-09-20",
- "value": -0.03966551218805525
- },
- {
- "date": "2021-09-21",
- "value": -0.028418871963875825
- },
- {
- "date": "2021-09-22",
- "value": -0.029432112670548682
- },
- {
- "date": "2021-09-23",
- "value": -0.04403413412120705
- },
- {
- "date": "2021-09-24",
- "value": -0.03788569281689258
- },
- {
- "date": "2021-09-27",
- "value": -0.03587055595492106
- },
- {
- "date": "2021-09-28",
- "value": -0.026539485365418503
- },
- {
- "date": "2021-09-29",
- "value": -0.01738679804195775
- },
- {
- "date": "2021-09-30",
- "value": -0.002412275137952835
- },
- {
- "date": "2021-10-01",
- "value": -0.002116331403242744
- },
- {
- "date": "2021-10-04",
- "value": 0.0
- },
- {
- "date": "2021-10-05",
- "value": 0.0
- },
- {
- "date": "2021-10-06",
- "value": 0.0
- },
- {
- "date": "2021-10-07",
- "value": 0.0
- },
- {
- "date": "2021-10-08",
- "value": -0.003942420305143024
- },
- {
- "date": "2021-10-11",
- "value": -0.0028718565687038122
- },
- {
- "date": "2021-10-12",
- "value": 0.0
- },
- {
- "date": "2021-10-13",
- "value": -0.002758308757042638
- },
- {
- "date": "2021-10-14",
- "value": -0.00039791272265787825
- },
- {
- "date": "2021-10-15",
- "value": 0.0
- },
- {
- "date": "2021-10-18",
- "value": 0.0
- },
- {
- "date": "2021-10-19",
- "value": 0.0
- },
- {
- "date": "2021-10-20",
- "value": 0.0
- },
- {
- "date": "2021-10-21",
- "value": 0.0
- },
- {
- "date": "2021-10-22",
- "value": -0.010736208901244826
- },
- {
- "date": "2021-10-25",
- "value": -0.022931096145991536
- },
- {
- "date": "2021-10-26",
- "value": -0.03378448881586604
- },
- {
- "date": "2021-10-27",
- "value": -0.029853255955785807
- },
- {
- "date": "2021-10-28",
- "value": -0.034747508363755175
- },
- {
- "date": "2021-10-29",
- "value": -0.04868614469975241
- },
- {
- "date": "2021-11-01",
- "value": -0.046400941287967123
- },
- {
- "date": "2021-11-02",
- "value": -0.05690788574939942
- },
- {
- "date": "2021-11-03",
- "value": -0.06515108380343926
- },
- {
- "date": "2021-11-04",
- "value": -0.07327266140212796
- },
- {
- "date": "2021-11-05",
- "value": -0.08101748012105048
- },
- {
- "date": "2021-11-08",
- "value": -0.09448168507251586
- },
- {
- "date": "2021-11-09",
- "value": -0.0854601854479009
- },
- {
- "date": "2021-11-10",
- "value": -0.08538147295733112
- },
- {
- "date": "2021-11-11",
- "value": -0.09697551757185685
- },
- {
- "date": "2021-11-12",
- "value": -0.08332807029667533
- },
- {
- "date": "2021-11-15",
- "value": -0.07435500820430896
- },
- {
- "date": "2021-11-16",
- "value": -0.07146709596882161
- },
- {
- "date": "2021-11-17",
- "value": -0.058147864835066065
- },
- {
- "date": "2021-11-18",
- "value": -0.05856936569707116
- },
- {
- "date": "2021-11-19",
- "value": -0.06765152682542241
- },
- {
- "date": "2021-11-22",
- "value": -0.06455124161016823
- },
- {
- "date": "2021-11-23",
- "value": -0.06771903120496037
- },
- {
- "date": "2021-11-24",
- "value": -0.07653261284408108
- },
- {
- "date": "2021-11-25",
- "value": -0.07428055709539105
- },
- {
- "date": "2021-11-26",
- "value": -0.06651643239370364
- },
- {
- "date": "2021-11-29",
- "value": -0.0581875192140342
- },
- {
- "date": "2021-11-30",
- "value": -0.04761398950312978
- },
- {
- "date": "2021-12-01",
- "value": -0.05779973439372621
- },
- {
- "date": "2021-12-02",
- "value": -0.04429513376765859
- },
- {
- "date": "2021-12-03",
- "value": -0.04444294128323312
- },
- {
- "date": "2021-12-06",
- "value": -0.035152344217382114
- },
- {
- "date": "2021-12-07",
- "value": -0.028818673007721674
- },
- {
- "date": "2021-12-08",
- "value": -0.03335036382317602
- },
- {
- "date": "2021-12-09",
- "value": -0.03672078808384427
- },
- {
- "date": "2021-12-10",
- "value": -0.02462067876797236
- },
- {
- "date": "2021-12-13",
- "value": -0.014123743281176049
- },
- {
- "date": "2021-12-14",
- "value": -0.005181176097903473
- },
- {
- "date": "2021-12-15",
- "value": 0.0
- },
- {
- "date": "2021-12-16",
- "value": 0.0
- },
- {
- "date": "2021-12-17",
- "value": -0.004378209906932273
- },
- {
- "date": "2021-12-20",
- "value": 0.0
- },
- {
- "date": "2021-12-21",
- "value": 0.0
- },
- {
- "date": "2021-12-22",
- "value": 0.0
- },
- {
- "date": "2021-12-23",
- "value": -0.000826081562467551
- },
- {
- "date": "2021-12-24",
- "value": 0.0
- },
- {
- "date": "2021-12-27",
- "value": 0.0
- },
- {
- "date": "2021-12-28",
- "value": 0.0
- },
- {
- "date": "2021-12-29",
- "value": -0.004092277279730938
- },
- {
- "date": "2021-12-30",
- "value": 0.0
- },
- {
- "date": "2021-12-31",
- "value": -0.013207365947537353
- },
- {
- "date": "2022-01-03",
- "value": -0.014300938802193075
- },
- {
- "date": "2022-01-04",
- "value": -0.018643720958953724
- },
- {
- "date": "2022-01-05",
- "value": -0.02940535127973043
- },
- {
- "date": "2022-01-06",
- "value": -0.01399313809464764
- },
- {
- "date": "2022-01-07",
- "value": -0.00571364276335562
- },
- {
- "date": "2022-01-10",
- "value": -0.023806896399823585
- },
- {
- "date": "2022-01-11",
- "value": -0.009382824268715728
- },
- {
- "date": "2022-01-12",
- "value": -0.00944569059384226
- },
- {
- "date": "2022-01-13",
- "value": -0.010833013304545225
- },
- {
- "date": "2022-01-14",
- "value": -0.0029414928645632443
- },
- {
- "date": "2022-01-17",
- "value": 0.0
- },
- {
- "date": "2022-01-18",
- "value": 0.0
- },
- {
- "date": "2022-01-19",
- "value": 0.0
- },
- {
- "date": "2022-01-20",
- "value": -0.010261032805269799
- },
- {
- "date": "2022-01-21",
- "value": -0.015310708143143392
- },
- {
- "date": "2022-01-24",
- "value": -0.0035113419492986964
- },
- {
- "date": "2022-01-25",
- "value": 0.0
- },
- {
- "date": "2022-01-26",
- "value": -0.008163051306735225
- },
- {
- "date": "2022-01-27",
- "value": 0.0
- },
- {
- "date": "2022-01-28",
- "value": 0.0
- },
- {
- "date": "2022-01-31",
- "value": 0.0
- },
- {
- "date": "2022-02-01",
- "value": 0.0
- },
- {
- "date": "2022-02-02",
- "value": 0.0
- },
- {
- "date": "2022-02-03",
- "value": -0.005619188315759138
- },
- {
- "date": "2022-02-04",
- "value": -0.00269704782669955
- },
- {
- "date": "2022-02-07",
- "value": -0.0020589284530198038
- },
- {
- "date": "2022-02-08",
- "value": 0.0
- },
- {
- "date": "2022-02-09",
- "value": -0.0012432890655978968
- },
- {
- "date": "2022-02-10",
- "value": 0.0
- },
- {
- "date": "2022-02-11",
- "value": 0.0
- },
- {
- "date": "2022-02-14",
- "value": 0.0
- },
- {
- "date": "2022-02-15",
- "value": 0.0
- },
- {
- "date": "2022-02-16",
- "value": -0.01104968899885339
- },
- {
- "date": "2022-02-17",
- "value": -0.00612262631759497
- },
- {
- "date": "2022-02-18",
- "value": -0.0005119648450376824
- },
- {
- "date": "2022-02-21",
- "value": -0.01165251218941521
- },
- {
- "date": "2022-02-22",
- "value": -0.0036533980393307353
- },
- {
- "date": "2022-02-23",
- "value": 0.0
- },
- {
- "date": "2022-02-24",
- "value": 0.0
- },
- {
- "date": "2022-02-25",
- "value": 0.0
- },
- {
- "date": "2022-02-28",
- "value": -0.001876296935979127
- },
- {
- "date": "2022-03-01",
- "value": -0.009441269068732105
- },
- {
- "date": "2022-03-02",
- "value": -0.009831176352858462
- },
- {
- "date": "2022-03-03",
- "value": 0.0
- },
- {
- "date": "2022-03-04",
- "value": -0.007527893254691942
- },
- {
- "date": "2022-03-07",
- "value": -0.013553190177927221
- },
- {
- "date": "2022-03-08",
- "value": -0.025917772520728688
- },
- {
- "date": "2022-03-09",
- "value": -0.010337964710637526
- },
- {
- "date": "2022-03-10",
- "value": -0.012086013239896887
- },
- {
- "date": "2022-03-11",
- "value": -0.020445314101006695
- },
- {
- "date": "2022-03-14",
- "value": -0.022134825883418197
- },
- {
- "date": "2022-03-15",
- "value": -0.01940630772635843
- },
- {
- "date": "2022-03-16",
- "value": -0.022802443720073007
- },
- {
- "date": "2022-03-17",
- "value": -0.029860518369315026
- },
- {
- "date": "2022-03-18",
- "value": -0.02199663668313412
- },
- {
- "date": "2022-03-21",
- "value": -0.022339013492473803
- },
- {
- "date": "2022-03-22",
- "value": -0.020858077228412486
- },
- {
- "date": "2022-03-23",
- "value": -0.02369463447792275
- },
- {
- "date": "2022-03-24",
- "value": -0.038036993810953934
- },
- {
- "date": "2022-03-25",
- "value": -0.026179548601938052
- },
- {
- "date": "2022-03-28",
- "value": -0.02636069225698201
- },
- {
- "date": "2022-03-29",
- "value": -0.02104701561949307
- },
- {
- "date": "2022-03-30",
- "value": -0.027944303457650976
- },
- {
- "date": "2022-03-31",
- "value": -0.03742250851134821
- },
- {
- "date": "2022-04-01",
- "value": -0.047784738395573956
- },
- {
- "date": "2022-04-04",
- "value": -0.04577676380779794
- },
- {
- "date": "2022-04-05",
- "value": -0.03205428062069948
- },
- {
- "date": "2022-04-06",
- "value": -0.023350663037617236
- },
- {
- "date": "2022-04-07",
- "value": -0.014093341653833358
- },
- {
- "date": "2022-04-08",
- "value": -0.009421556361243977
- },
- {
- "date": "2022-04-11",
- "value": -0.00923312808571164
- },
- {
- "date": "2022-04-12",
- "value": -0.018029159735841294
- },
- {
- "date": "2022-04-13",
- "value": -0.01688055964878954
- },
- {
- "date": "2022-04-14",
- "value": -0.00653435659165269
- },
- {
- "date": "2022-04-15",
- "value": -0.008353400442749903
- },
- {
- "date": "2022-04-18",
- "value": -0.021717996829518582
- },
- {
- "date": "2022-04-19",
- "value": -0.025865965494221932
- },
- {
- "date": "2022-04-20",
- "value": -0.03825130207160854
- },
- {
- "date": "2022-04-21",
- "value": -0.03502880464257552
- },
- {
- "date": "2022-04-22",
- "value": -0.02430849276349245
- },
- {
- "date": "2022-04-25",
- "value": -0.024060109785512096
- },
- {
- "date": "2022-04-26",
- "value": -0.034687397930509456
- },
- {
- "date": "2022-04-27",
- "value": -0.03254256953346646
- },
- {
- "date": "2022-04-28",
- "value": -0.03974326366375058
- },
- {
- "date": "2022-04-29",
- "value": -0.04402877362223556
- },
- {
- "date": "2022-05-02",
- "value": -0.05267689960704458
- },
- {
- "date": "2022-05-03",
- "value": -0.06238176865922729
- },
- {
- "date": "2022-05-04",
- "value": -0.046268310119702005
- },
- {
- "date": "2022-05-05",
- "value": -0.04828834214999145
- },
- {
- "date": "2022-05-06",
- "value": -0.05195315448292037
- },
- {
- "date": "2022-05-09",
- "value": -0.0466707294621822
- },
- {
- "date": "2022-05-10",
- "value": -0.051662509115156685
- },
- {
- "date": "2022-05-11",
- "value": -0.03855874802929826
- },
- {
- "date": "2022-05-12",
- "value": -0.04173157322278731
- },
- {
- "date": "2022-05-13",
- "value": -0.039089323240361296
- },
- {
- "date": "2022-05-16",
- "value": -0.034656228001514244
- },
- {
- "date": "2022-05-17",
- "value": -0.05705267326305785
- },
- {
- "date": "2022-05-18",
- "value": -0.07026119887978632
- },
- {
- "date": "2022-05-19",
- "value": -0.07005911982522584
- },
- {
- "date": "2022-05-20",
- "value": -0.07624048402477368
- },
- {
- "date": "2022-05-23",
- "value": -0.08080911464476459
- },
- {
- "date": "2022-05-24",
- "value": -0.07188078924925567
- },
- {
- "date": "2022-05-25",
- "value": -0.07120885908202068
- },
- {
- "date": "2022-05-26",
- "value": -0.07462301760915668
- },
- {
- "date": "2022-05-27",
- "value": -0.07376699367503259
- },
- {
- "date": "2022-05-30",
- "value": -0.06224449843969315
- },
- {
- "date": "2022-05-31",
- "value": -0.06171453860958698
- },
- {
- "date": "2022-06-01",
- "value": -0.07440167892586458
- },
- {
- "date": "2022-06-02",
- "value": -0.08339845237781163
- },
- {
- "date": "2022-06-03",
- "value": -0.07220397007339918
- },
- {
- "date": "2022-06-06",
- "value": -0.0729459546744623
- },
- {
- "date": "2022-06-07",
- "value": -0.07227600600800121
- },
- {
- "date": "2022-06-08",
- "value": -0.07010526448859344
- },
- {
- "date": "2022-06-09",
- "value": -0.07529855178605949
- },
- {
- "date": "2022-06-10",
- "value": -0.07990209066734955
- },
- {
- "date": "2022-06-13",
- "value": -0.07972692532491521
- },
- {
- "date": "2022-06-14",
- "value": -0.0851342573549021
- },
- {
- "date": "2022-06-15",
- "value": -0.07603838127214368
- },
- {
- "date": "2022-06-16",
- "value": -0.06874343535618888
- },
- {
- "date": "2022-06-17",
- "value": -0.06973600548329095
- },
- {
- "date": "2022-06-20",
- "value": -0.07293237798217655
- },
- {
- "date": "2022-06-21",
- "value": -0.06945525556327514
- },
- {
- "date": "2022-06-22",
- "value": -0.06004727777591834
- },
- {
- "date": "2022-06-23",
- "value": -0.06728331766886364
- },
- {
- "date": "2022-06-24",
- "value": -0.08658934763525739
- },
- {
- "date": "2022-06-27",
- "value": -0.08840130749621466
- },
- {
- "date": "2022-06-28",
- "value": -0.0820863738088139
- },
- {
- "date": "2022-06-29",
- "value": -0.0773457900707002
- },
- {
- "date": "2022-06-30",
- "value": -0.08228360314388539
- },
- {
- "date": "2022-07-01",
- "value": -0.07410744053235985
- },
- {
- "date": "2022-07-04",
- "value": -0.07675800395110077
- },
- {
- "date": "2022-07-05",
- "value": -0.06739499930456405
- },
- {
- "date": "2022-07-06",
- "value": -0.056847498285976794
- },
- {
- "date": "2022-07-07",
- "value": -0.06513515875534581
- },
- {
- "date": "2022-07-08",
- "value": -0.06107087520923182
- },
- {
- "date": "2022-07-11",
- "value": -0.05009981960857057
- },
- {
- "date": "2022-07-12",
- "value": -0.06706555105857825
- },
- {
- "date": "2022-07-13",
- "value": -0.0783732560356224
- },
- {
- "date": "2022-07-14",
- "value": -0.06349604149568566
- },
- {
- "date": "2022-07-15",
- "value": -0.06376472673264999
- },
- {
- "date": "2022-07-18",
- "value": -0.05384938672876649
- },
- {
- "date": "2022-07-19",
- "value": -0.041175576076573184
- },
- {
- "date": "2022-07-20",
- "value": -0.04021341219123731
- },
- {
- "date": "2022-07-21",
- "value": -0.029918598891436887
- },
- {
- "date": "2022-07-22",
- "value": -0.043213994120724575
- },
- {
- "date": "2022-07-25",
- "value": -0.044008598348800665
- },
- {
- "date": "2022-07-26",
- "value": -0.036127852454676646
- },
- {
- "date": "2022-07-27",
- "value": -0.03034526981361907
- },
- {
- "date": "2022-07-28",
- "value": -0.03850776388284971
- },
- {
- "date": "2022-07-29",
- "value": -0.048095955253094846
- },
- {
- "date": "2022-08-01",
- "value": -0.029669024365363894
- },
- {
- "date": "2022-08-02",
- "value": -0.02154318299346536
- },
- {
- "date": "2022-08-03",
- "value": -0.024970102487040347
- },
- {
- "date": "2022-08-04",
- "value": -0.029100758838443985
- },
- {
- "date": "2022-08-05",
- "value": -0.04614204623301532
- },
- {
- "date": "2022-08-08",
- "value": -0.040222410493741534
- },
- {
- "date": "2022-08-09",
- "value": -0.04606611814333139
- },
- {
- "date": "2022-08-10",
- "value": -0.055396262580176825
- },
- {
- "date": "2022-08-11",
- "value": -0.06589014015522732
- },
- {
- "date": "2022-08-12",
- "value": -0.05441907127403156
- },
- {
- "date": "2022-08-15",
- "value": -0.020736824345118032
- },
- {
- "date": "2022-08-16",
- "value": -0.022462833606043286
- },
- {
- "date": "2022-08-17",
- "value": -0.01626531259701558
- },
- {
- "date": "2022-08-18",
- "value": -0.011226498049859535
- },
- {
- "date": "2022-08-19",
- "value": -0.021881073289834796
- },
- {
- "date": "2022-08-22",
- "value": -0.025714885889826067
- },
- {
- "date": "2022-08-23",
- "value": -0.017960158576465712
- },
- {
- "date": "2022-08-24",
- "value": -0.023361936036067288
- },
- {
- "date": "2022-08-25",
- "value": -0.02314972304972507
- },
- {
- "date": "2022-08-26",
- "value": -0.023809255415040642
- },
- {
- "date": "2022-08-29",
- "value": -0.023302279513521262
- },
- {
- "date": "2022-08-30",
- "value": -0.017891191961191932
- },
- {
- "date": "2022-08-31",
- "value": -0.019038244712969554
- },
- {
- "date": "2022-09-01",
- "value": -0.016430771959721535
- },
- {
- "date": "2022-09-02",
- "value": -0.016561091990264676
- },
- {
- "date": "2022-09-05",
- "value": -0.0052211778249454666
- },
- {
- "date": "2022-09-06",
- "value": 0.0
- },
- {
- "date": "2022-09-07",
- "value": 0.0
- },
- {
- "date": "2022-09-08",
- "value": -0.010549376674442446
- },
- {
- "date": "2022-09-09",
- "value": -0.0074487927483574135
- },
- {
- "date": "2022-09-12",
- "value": -0.008826752374529234
- },
- {
- "date": "2022-09-13",
- "value": 0.0
- },
- {
- "date": "2022-09-14",
- "value": 0.0
- },
- {
- "date": "2022-09-15",
- "value": -0.002046526507659463
- },
- {
- "date": "2022-09-16",
- "value": 0.0
- },
- {
- "date": "2022-09-19",
- "value": -0.010000395545167962
- },
- {
- "date": "2022-09-20",
- "value": -0.01221515152071051
- },
- {
- "date": "2022-09-21",
- "value": -0.012331734459848809
- },
- {
- "date": "2022-09-22",
- "value": -0.007553762344678638
- },
- {
- "date": "2022-09-23",
- "value": -0.031216406311976086
- },
- {
- "date": "2022-09-26",
- "value": -0.02936949420570545
- },
- {
- "date": "2022-09-27",
- "value": -0.03713505184475574
- },
- {
- "date": "2022-09-28",
- "value": -0.04347802425931646
- },
- {
- "date": "2022-09-29",
- "value": -0.03980001400329536
- },
- {
- "date": "2022-09-30",
- "value": -0.02824339732025738
- },
- {
- "date": "2022-10-03",
- "value": -0.018362738965845504
- },
- {
- "date": "2022-10-04",
- "value": -0.0280946328278594
- },
- {
- "date": "2022-10-05",
- "value": -0.01826139184930875
- },
- {
- "date": "2022-10-06",
- "value": -0.020744518693806335
- },
- {
- "date": "2022-10-07",
- "value": -0.025319016911571235
- },
- {
- "date": "2022-10-10",
- "value": -0.01562943802410588
- },
- {
- "date": "2022-10-11",
- "value": -0.01853638670716795
- },
- {
- "date": "2022-10-12",
- "value": -0.003187795899214141
- },
- {
- "date": "2022-10-13",
- "value": 0.0
- },
- {
- "date": "2022-10-14",
- "value": 0.0
- },
- {
- "date": "2022-10-17",
- "value": -0.006970801922544512
- },
- {
- "date": "2022-10-18",
- "value": 0.0
- },
- {
- "date": "2022-10-19",
- "value": 0.0
- },
- {
- "date": "2022-10-20",
- "value": -0.006605685008950091
- },
- {
- "date": "2022-10-21",
- "value": -0.020573530472469015
- },
- {
- "date": "2022-10-24",
- "value": -0.014195534374059182
- },
- {
- "date": "2022-10-25",
- "value": -0.028417105146412047
- },
- {
- "date": "2022-10-26",
- "value": -0.05294939146258171
- },
- {
- "date": "2022-10-27",
- "value": -0.06208930549831104
- },
- {
- "date": "2022-10-28",
- "value": -0.07560015676400522
- },
- {
- "date": "2022-10-31",
- "value": -0.08060006439898137
- },
- {
- "date": "2022-11-01",
- "value": -0.06300188857980626
- },
- {
- "date": "2022-11-02",
- "value": -0.048660030692824985
- },
- {
- "date": "2022-11-03",
- "value": -0.05563892907297152
- },
- {
- "date": "2022-11-04",
- "value": -0.06609298532087171
- },
- {
- "date": "2022-11-07",
- "value": -0.06315713382182153
- },
- {
- "date": "2022-11-08",
- "value": -0.0738371994789151
- },
- {
- "date": "2022-11-09",
- "value": -0.06573193977196512
- },
- {
- "date": "2022-11-10",
- "value": -0.05930426259594457
- },
- {
- "date": "2022-11-11",
- "value": -0.05467374567955885
- },
- {
- "date": "2022-11-14",
- "value": -0.05943657992074647
- },
- {
- "date": "2022-11-15",
- "value": -0.06602632406313458
- },
- {
- "date": "2022-11-16",
- "value": -0.06735649495752316
- },
- {
- "date": "2022-11-17",
- "value": -0.073011403450701
- },
- {
- "date": "2022-11-18",
- "value": -0.06349207436234561
- },
- {
- "date": "2022-11-21",
- "value": -0.04206013686615395
- },
- {
- "date": "2022-11-22",
- "value": -0.0390616394301766
- },
- {
- "date": "2022-11-23",
- "value": -0.03479685086743045
- },
- {
- "date": "2022-11-24",
- "value": -0.03506111509512011
- },
- {
- "date": "2022-11-25",
- "value": -0.03984893589088434
- },
- {
- "date": "2022-11-28",
- "value": -0.04210067963325437
- },
- {
- "date": "2022-11-29",
- "value": -0.0394452274441931
- },
- {
- "date": "2022-11-30",
- "value": -0.05184220006972717
- },
- {
- "date": "2022-12-01",
- "value": -0.06062817059634862
- },
- {
- "date": "2022-12-02",
- "value": -0.07358241926173692
- },
- {
- "date": "2022-12-05",
- "value": -0.08093764871846132
- },
- {
- "date": "2022-12-06",
- "value": -0.08944076902423337
- },
- {
- "date": "2022-12-07",
- "value": -0.09325347888014857
- },
- {
- "date": "2022-12-08",
- "value": -0.09436418538106561
- },
- {
- "date": "2022-12-09",
- "value": -0.08178175694723322
- },
- {
- "date": "2022-12-12",
- "value": -0.07788730975375124
- },
- {
- "date": "2022-12-13",
- "value": -0.07560837736408443
- },
- {
- "date": "2022-12-14",
- "value": -0.0858143264943616
- },
- {
- "date": "2022-12-15",
- "value": -0.09196660721456817
- },
- {
- "date": "2022-12-16",
- "value": -0.10228832250878239
- },
- {
- "date": "2022-12-19",
- "value": -0.09159031022413355
- },
- {
- "date": "2022-12-20",
- "value": -0.09395334014018808
- },
- {
- "date": "2022-12-21",
- "value": -0.09452693210866692
- },
- {
- "date": "2022-12-22",
- "value": -0.0936605410020882
- },
- {
- "date": "2022-12-23",
- "value": -0.09263646774361989
- },
- {
- "date": "2022-12-26",
- "value": -0.07866826181159459
- },
- {
- "date": "2022-12-27",
- "value": -0.07533852300689525
- },
- {
- "date": "2022-12-28",
- "value": -0.07078303426112365
- },
- {
- "date": "2022-12-29",
- "value": -0.061640213337893934
- },
- {
- "date": "2022-12-30",
- "value": -0.07097312252392218
- },
- {
- "date": "2023-01-02",
- "value": -0.06852332690080876
- },
- {
- "date": "2023-01-03",
- "value": -0.0660474164261825
- },
- {
- "date": "2023-01-04",
- "value": -0.0730093153295347
- },
- {
- "date": "2023-01-05",
- "value": -0.0690249415550247
- },
- {
- "date": "2023-01-06",
- "value": -0.06216421011368434
- },
- {
- "date": "2023-01-09",
- "value": -0.06709043606827503
- },
- {
- "date": "2023-01-10",
- "value": -0.05780490295879537
- },
- {
- "date": "2023-01-11",
- "value": -0.0515036985692785
- },
- {
- "date": "2023-01-12",
- "value": -0.03138197884523708
- },
- {
- "date": "2023-01-13",
- "value": -0.036392878101459525
- },
- {
- "date": "2023-01-16",
- "value": -0.032102535203992866
- },
- {
- "date": "2023-01-17",
- "value": -0.04587665767357807
- },
- {
- "date": "2023-01-18",
- "value": -0.06351407706262258
- },
- {
- "date": "2023-01-19",
- "value": -0.04573625781704471
- },
- {
- "date": "2023-01-20",
- "value": -0.05007527562940173
- },
- {
- "date": "2023-01-23",
- "value": -0.04162605510809669
- },
- {
- "date": "2023-01-24",
- "value": -0.04447309099252761
- },
- {
- "date": "2023-01-25",
- "value": -0.04337215200205358
- },
- {
- "date": "2023-01-26",
- "value": -0.06761464529162864
- },
- {
- "date": "2023-01-27",
- "value": -0.06583073462915989
- },
- {
- "date": "2023-01-30",
- "value": -0.06847027068484401
- },
- {
- "date": "2023-01-31",
- "value": -0.0714419919493876
- },
- {
- "date": "2023-02-01",
- "value": -0.080601820242443
- },
- {
- "date": "2023-02-02",
- "value": -0.09218083795465892
- },
- {
- "date": "2023-02-03",
- "value": -0.08106524817084537
- },
- {
- "date": "2023-02-06",
- "value": -0.08256432423941928
- },
- {
- "date": "2023-02-07",
- "value": -0.09612738872981252
- },
- {
- "date": "2023-02-08",
- "value": -0.09532656499787573
- },
- {
- "date": "2023-02-09",
- "value": -0.08143069085791488
- },
- {
- "date": "2023-02-10",
- "value": -0.08443427924593483
- },
- {
- "date": "2023-02-13",
- "value": -0.09575215350661104
- },
- {
- "date": "2023-02-14",
- "value": -0.09013845356015349
- },
- {
- "date": "2023-02-15",
- "value": -0.0885264135767887
- },
- {
- "date": "2023-02-16",
- "value": -0.08894271784852714
- },
- {
- "date": "2023-02-17",
- "value": -0.08101208226736734
- },
- {
- "date": "2023-02-20",
- "value": -0.08309871701557592
- },
- {
- "date": "2023-02-21",
- "value": -0.07828175593959519
- },
- {
- "date": "2023-02-22",
- "value": -0.07525874139451527
- },
- {
- "date": "2023-02-23",
- "value": -0.06343408445233423
- },
- {
- "date": "2023-02-24",
- "value": -0.0751412301175528
- },
- {
- "date": "2023-02-27",
- "value": -0.08646197895314245
- },
- {
- "date": "2023-02-28",
- "value": -0.08010724489849042
- },
- {
- "date": "2023-03-01",
- "value": -0.09026184987011765
- },
- {
- "date": "2023-03-02",
- "value": -0.11065798512713676
- },
- {
- "date": "2023-03-03",
- "value": -0.11235356444201994
- },
- {
- "date": "2023-03-06",
- "value": -0.12386021112259649
- },
- {
- "date": "2023-03-07",
- "value": -0.13533431643800564
- },
- {
- "date": "2023-03-08",
- "value": -0.12186895958106403
- },
- {
- "date": "2023-03-09",
- "value": -0.1137249044249905
- },
- {
- "date": "2023-03-10",
- "value": -0.12803625865467239
- },
- {
- "date": "2023-03-13",
- "value": -0.12091779979468054
- },
- {
- "date": "2023-03-14",
- "value": -0.11341504061698571
- },
- {
- "date": "2023-03-15",
- "value": -0.11419672761948418
- },
- {
- "date": "2023-03-16",
- "value": -0.12464904651005204
- },
- {
- "date": "2023-03-17",
- "value": -0.12575740557871118
- },
- {
- "date": "2023-03-20",
- "value": -0.13386061124790616
- },
- {
- "date": "2023-03-21",
- "value": -0.13123418243823903
- },
- {
- "date": "2023-03-22",
- "value": -0.13990977837594964
- },
- {
- "date": "2023-03-23",
- "value": -0.14441594992819973
- },
- {
- "date": "2023-03-24",
- "value": -0.14217014420504237
- },
- {
- "date": "2023-03-27",
- "value": -0.14136385990729472
- },
- {
- "date": "2023-03-28",
- "value": -0.1416332679212141
- },
- {
- "date": "2023-03-29",
- "value": -0.13646066207837826
- },
- {
- "date": "2023-03-30",
- "value": -0.13168679174227416
- },
- {
- "date": "2023-03-31",
- "value": -0.12498310133586843
- },
- {
- "date": "2023-04-03",
- "value": -0.1197031080619595
- },
- {
- "date": "2023-04-04",
- "value": -0.11571913824161306
- },
- {
- "date": "2023-04-05",
- "value": -0.13762258602154653
- },
- {
- "date": "2023-04-06",
- "value": -0.13739227410632282
- },
- {
- "date": "2023-04-07",
- "value": -0.13557396900668095
- },
- {
- "date": "2023-04-10",
- "value": -0.11907566974757777
- },
- {
- "date": "2023-04-11",
- "value": -0.11794563003602876
- },
- {
- "date": "2023-04-12",
- "value": -0.1307801298304304
- },
- {
- "date": "2023-04-13",
- "value": -0.12763050500255668
- },
- {
- "date": "2023-04-14",
- "value": -0.1089207469842225
- },
- {
- "date": "2023-04-17",
- "value": -0.11161292534668232
- },
- {
- "date": "2023-04-18",
- "value": -0.11714641193826614
- },
- {
- "date": "2023-04-19",
- "value": -0.12041759279384356
- },
- {
- "date": "2023-04-20",
- "value": -0.11729804464243487
- },
- {
- "date": "2023-04-21",
- "value": -0.12285142440610475
- },
- {
- "date": "2023-04-24",
- "value": -0.13953241492421953
- },
- {
- "date": "2023-04-25",
- "value": -0.1455384128304581
- },
- {
- "date": "2023-04-26",
- "value": -0.1483063614514647
- },
- {
- "date": "2023-04-27",
- "value": -0.14501127091613475
- },
- {
- "date": "2023-04-28",
- "value": -0.12584186296607702
- },
- {
- "date": "2023-05-01",
- "value": -0.13888918320415622
- },
- {
- "date": "2023-05-02",
- "value": -0.132898214392569
- },
- {
- "date": "2023-05-03",
- "value": -0.13321786288378912
- },
- {
- "date": "2023-05-04",
- "value": -0.13137947261091976
- },
- {
- "date": "2023-05-05",
- "value": -0.13434759682241626
- },
- {
- "date": "2023-05-08",
- "value": -0.13892753716111972
- },
- {
- "date": "2023-05-09",
- "value": -0.13767884422178578
- },
- {
- "date": "2023-05-10",
- "value": -0.14488544653277013
- },
- {
- "date": "2023-05-11",
- "value": -0.13628954590584552
- },
- {
- "date": "2023-05-12",
- "value": -0.1266440009034976
- },
- {
- "date": "2023-05-15",
- "value": -0.12287782080863097
- },
- {
- "date": "2023-05-16",
- "value": -0.12983982591264787
- },
- {
- "date": "2023-05-17",
- "value": -0.12208116373549993
- },
- {
- "date": "2023-05-18",
- "value": -0.11690399735275525
- },
- {
- "date": "2023-05-19",
- "value": -0.12087937059891096
- },
- {
- "date": "2023-05-22",
- "value": -0.12136896310632461
- },
- {
- "date": "2023-05-23",
- "value": -0.10533104975069574
- },
- {
- "date": "2023-05-24",
- "value": -0.11942396454245385
- },
- {
- "date": "2023-05-25",
- "value": -0.09318527054265224
- },
- {
- "date": "2023-05-26",
- "value": -0.10977762777794742
- },
- {
- "date": "2023-05-29",
- "value": -0.10540544805038587
- },
- {
- "date": "2023-05-30",
- "value": -0.10895780411346534
- },
- {
- "date": "2023-05-31",
- "value": -0.10857810443644245
- },
- {
- "date": "2023-06-01",
- "value": -0.11557261288948917
- },
- {
- "date": "2023-06-02",
- "value": -0.10198097662627081
- },
- {
- "date": "2023-06-05",
- "value": -0.07426845210465516
- },
- {
- "date": "2023-06-06",
- "value": -0.0770992889205786
- },
- {
- "date": "2023-06-07",
- "value": -0.06557174689366974
- },
- {
- "date": "2023-06-08",
- "value": -0.056945381866214895
- },
- {
- "date": "2023-06-09",
- "value": -0.05544891808786723
- },
- {
- "date": "2023-06-12",
- "value": -0.04017852948436307
- },
- {
- "date": "2023-06-13",
- "value": -0.05856353979555007
- },
- {
- "date": "2023-06-14",
- "value": -0.05887131044538474
- },
- {
- "date": "2023-06-15",
- "value": -0.06726289374436423
- },
- {
- "date": "2023-06-16",
- "value": -0.06879984896531788
- },
- {
- "date": "2023-06-19",
- "value": -0.07721499740966475
- },
- {
- "date": "2023-06-20",
- "value": -0.07667964113603076
- },
- {
- "date": "2023-06-21",
- "value": -0.0736940657301911
- },
- {
- "date": "2023-06-22",
- "value": -0.08906762448111649
- },
- {
- "date": "2023-06-23",
- "value": -0.08068988898264218
- },
- {
- "date": "2023-06-26",
- "value": -0.06750458842327567
- },
- {
- "date": "2023-06-27",
- "value": -0.054963194435141305
- },
- {
- "date": "2023-06-28",
- "value": -0.0509435260918486
- },
- {
- "date": "2023-06-29",
- "value": -0.04545453593330995
- },
- {
- "date": "2023-06-30",
- "value": -0.049243726180653646
- },
- {
- "date": "2023-07-03",
- "value": -0.04806135952670376
- },
- {
- "date": "2023-07-04",
- "value": -0.05274228875189424
- },
- {
- "date": "2023-07-05",
- "value": -0.04947285464181361
- },
- {
- "date": "2023-07-06",
- "value": -0.058608615416401055
- },
- {
- "date": "2023-07-07",
- "value": -0.06661264433359526
- },
- {
- "date": "2023-07-10",
- "value": -0.06714373658232853
- },
- {
- "date": "2023-07-11",
- "value": -0.06451997179466529
- },
- {
- "date": "2023-07-12",
- "value": -0.07642629458646522
- },
- {
- "date": "2023-07-13",
- "value": -0.07633000113950295
- },
- {
- "date": "2023-07-14",
- "value": -0.07822030203178043
- },
- {
- "date": "2023-07-17",
- "value": -0.07361789586979384
- },
- {
- "date": "2023-07-18",
- "value": -0.06250450285537212
- },
- {
- "date": "2023-07-19",
- "value": -0.06696352210212086
- },
- {
- "date": "2023-07-20",
- "value": -0.07800514265928504
- },
- {
- "date": "2023-07-21",
- "value": -0.09519584683114046
- },
- {
- "date": "2023-07-24",
- "value": -0.09346112298725728
- },
- {
- "date": "2023-07-25",
- "value": -0.08186090984072647
- },
- {
- "date": "2023-07-26",
- "value": -0.08020254243419878
- },
- {
- "date": "2023-07-27",
- "value": -0.08577804877366091
- },
- {
- "date": "2023-07-28",
- "value": -0.07715851985672839
- },
- {
- "date": "2023-07-31",
- "value": -0.07171630817655439
- },
- {
- "date": "2023-08-01",
- "value": -0.07071291680198111
- },
- {
- "date": "2023-08-02",
- "value": -0.07037505782526354
- },
- {
- "date": "2023-08-03",
- "value": -0.07868587274150207
- },
- {
- "date": "2023-08-04",
- "value": -0.07687664999136223
- },
- {
- "date": "2023-08-07",
- "value": -0.06893915242967619
- },
- {
- "date": "2023-08-08",
- "value": -0.07847559753699962
- },
- {
- "date": "2023-08-09",
- "value": -0.06459791702478934
- },
- {
- "date": "2023-08-10",
- "value": -0.06669321930436567
- },
- {
- "date": "2023-08-11",
- "value": -0.05101691487920712
- },
- {
- "date": "2023-08-14",
- "value": -0.041195512215407515
- },
- {
- "date": "2023-08-15",
- "value": -0.06750786432515277
- },
- {
- "date": "2023-08-16",
- "value": -0.04445172604158221
- },
- {
- "date": "2023-08-17",
- "value": -0.05326769225905004
- },
- {
- "date": "2023-08-18",
- "value": -0.04725660204957649
- },
- {
- "date": "2023-08-21",
- "value": -0.04143359252104417
- },
- {
- "date": "2023-08-22",
- "value": -0.05023789369225984
- },
- {
- "date": "2023-08-23",
- "value": -0.04853472556794869
- },
- {
- "date": "2023-08-24",
- "value": -0.036665871045439724
- },
- {
- "date": "2023-08-25",
- "value": -0.03315841374277695
- },
- {
- "date": "2023-08-28",
- "value": -0.048346276946537925
- },
- {
- "date": "2023-08-29",
- "value": -0.048498542552048995
- },
- {
- "date": "2023-08-30",
- "value": -0.059407675429425266
- },
- {
- "date": "2023-08-31",
- "value": -0.05949626703484556
- },
- {
- "date": "2023-09-01",
- "value": -0.05769393482701002
- },
- {
- "date": "2023-09-04",
- "value": -0.05851450627056942
- },
- {
- "date": "2023-09-05",
- "value": -0.07732987058428409
- },
- {
- "date": "2023-09-06",
- "value": -0.060276037861411114
- },
- {
- "date": "2023-09-07",
- "value": -0.07292665914769847
- },
- {
- "date": "2023-09-08",
- "value": -0.05312494814388413
- },
- {
- "date": "2023-09-11",
- "value": -0.05429522137252807
- },
- {
- "date": "2023-09-12",
- "value": -0.055108046743452044
- },
- {
- "date": "2023-09-13",
- "value": -0.06874458891069468
- },
- {
- "date": "2023-09-14",
- "value": -0.06541828563664653
- },
- {
- "date": "2023-09-15",
- "value": -0.09777158993572721
- },
- {
- "date": "2023-09-18",
- "value": -0.09587092285129506
- },
- {
- "date": "2023-09-19",
- "value": -0.09839934706756415
- },
- {
- "date": "2023-09-20",
- "value": -0.09640743067674007
- },
- {
- "date": "2023-09-21",
- "value": -0.10349103444583108
- },
- {
- "date": "2023-09-22",
- "value": -0.13079010642150213
- },
- {
- "date": "2023-09-25",
- "value": -0.1383773297899863
- },
- {
- "date": "2023-09-26",
- "value": -0.13302600604695114
- },
- {
- "date": "2023-09-27",
- "value": -0.13506084727541212
- },
- {
- "date": "2023-09-28",
- "value": -0.13341873126645276
- },
- {
- "date": "2023-09-29",
- "value": -0.13247721110522725
- },
- {
- "date": "2023-10-02",
- "value": -0.11970180491590365
- },
- {
- "date": "2023-10-03",
- "value": -0.11774768298041871
- },
- {
- "date": "2023-10-04",
- "value": -0.11001637739310288
- },
- {
- "date": "2023-10-05",
- "value": -0.10429242616723289
- },
- {
- "date": "2023-10-06",
- "value": -0.0950404642343855
- },
- {
- "date": "2023-10-09",
- "value": -0.09273217935812494
- },
- {
- "date": "2023-10-10",
- "value": -0.10393738516646867
- },
- {
- "date": "2023-10-11",
- "value": -0.09288874506363165
- },
- {
- "date": "2023-10-12",
- "value": -0.10769320440191132
- },
- {
- "date": "2023-10-13",
- "value": -0.11051760650544995
- },
- {
- "date": "2023-10-16",
- "value": -0.09928318768525224
- },
- {
- "date": "2023-10-17",
- "value": -0.0910866722391771
- },
- {
- "date": "2023-10-18",
- "value": -0.08751091405599432
- },
- {
- "date": "2023-10-19",
- "value": -0.08172998010072852
- },
- {
- "date": "2023-10-20",
- "value": -0.07744842524591322
- },
- {
- "date": "2023-10-23",
- "value": -0.07329905335148323
- },
- {
- "date": "2023-10-24",
- "value": -0.061466434250777024
- },
- {
- "date": "2023-10-25",
- "value": -0.06432759281285272
- },
- {
- "date": "2023-10-26",
- "value": -0.05146071374813077
- },
- {
- "date": "2023-10-27",
- "value": -0.06569159229567734
- },
- {
- "date": "2023-10-30",
- "value": -0.06775967199536337
- },
- {
- "date": "2023-10-31",
- "value": -0.05948699841782645
- }
- ],
- "rolling_sharpe": [
- {
- "date": "2020-01-02",
- "value": null
- },
- {
- "date": "2020-01-03",
- "value": null
- },
- {
- "date": "2020-01-06",
- "value": null
- },
- {
- "date": "2020-01-07",
- "value": null
- },
- {
- "date": "2020-01-08",
- "value": null
- },
- {
- "date": "2020-01-09",
- "value": null
- },
- {
- "date": "2020-01-10",
- "value": null
- },
- {
- "date": "2020-01-13",
- "value": null
- },
- {
- "date": "2020-01-14",
- "value": null
- },
- {
- "date": "2020-01-15",
- "value": null
- },
- {
- "date": "2020-01-16",
- "value": null
- },
- {
- "date": "2020-01-17",
- "value": null
- },
- {
- "date": "2020-01-20",
- "value": null
- },
- {
- "date": "2020-01-21",
- "value": null
- },
- {
- "date": "2020-01-22",
- "value": null
- },
- {
- "date": "2020-01-23",
- "value": null
- },
- {
- "date": "2020-01-24",
- "value": null
- },
- {
- "date": "2020-01-27",
- "value": null
- },
- {
- "date": "2020-01-28",
- "value": null
- },
- {
- "date": "2020-01-29",
- "value": null
- },
- {
- "date": "2020-01-30",
- "value": null
- },
- {
- "date": "2020-01-31",
- "value": null
- },
- {
- "date": "2020-02-03",
- "value": null
- },
- {
- "date": "2020-02-04",
- "value": null
- },
- {
- "date": "2020-02-05",
- "value": null
- },
- {
- "date": "2020-02-06",
- "value": null
- },
- {
- "date": "2020-02-07",
- "value": null
- },
- {
- "date": "2020-02-10",
- "value": null
- },
- {
- "date": "2020-02-11",
- "value": null
- },
- {
- "date": "2020-02-12",
- "value": null
- },
- {
- "date": "2020-02-13",
- "value": null
- },
- {
- "date": "2020-02-14",
- "value": null
- },
- {
- "date": "2020-02-17",
- "value": null
- },
- {
- "date": "2020-02-18",
- "value": null
- },
- {
- "date": "2020-02-19",
- "value": null
- },
- {
- "date": "2020-02-20",
- "value": null
- },
- {
- "date": "2020-02-21",
- "value": null
- },
- {
- "date": "2020-02-24",
- "value": null
- },
- {
- "date": "2020-02-25",
- "value": null
- },
- {
- "date": "2020-02-26",
- "value": null
- },
- {
- "date": "2020-02-27",
- "value": null
- },
- {
- "date": "2020-02-28",
- "value": null
- },
- {
- "date": "2020-03-02",
- "value": null
- },
- {
- "date": "2020-03-03",
- "value": null
- },
- {
- "date": "2020-03-04",
- "value": null
- },
- {
- "date": "2020-03-05",
- "value": null
- },
- {
- "date": "2020-03-06",
- "value": null
- },
- {
- "date": "2020-03-09",
- "value": null
- },
- {
- "date": "2020-03-10",
- "value": null
- },
- {
- "date": "2020-03-11",
- "value": null
- },
- {
- "date": "2020-03-12",
- "value": null
- },
- {
- "date": "2020-03-13",
- "value": null
- },
- {
- "date": "2020-03-16",
- "value": null
- },
- {
- "date": "2020-03-17",
- "value": null
- },
- {
- "date": "2020-03-18",
- "value": null
- },
- {
- "date": "2020-03-19",
- "value": null
- },
- {
- "date": "2020-03-20",
- "value": null
- },
- {
- "date": "2020-03-23",
- "value": null
- },
- {
- "date": "2020-03-24",
- "value": null
- },
- {
- "date": "2020-03-25",
- "value": null
- },
- {
- "date": "2020-03-26",
- "value": null
- },
- {
- "date": "2020-03-27",
- "value": null
- },
- {
- "date": "2020-03-30",
- "value": null
- },
- {
- "date": "2020-03-31",
- "value": null
- },
- {
- "date": "2020-04-01",
- "value": null
- },
- {
- "date": "2020-04-02",
- "value": null
- },
- {
- "date": "2020-04-03",
- "value": null
- },
- {
- "date": "2020-04-06",
- "value": null
- },
- {
- "date": "2020-04-07",
- "value": null
- },
- {
- "date": "2020-04-08",
- "value": null
- },
- {
- "date": "2020-04-09",
- "value": null
- },
- {
- "date": "2020-04-10",
- "value": null
- },
- {
- "date": "2020-04-13",
- "value": null
- },
- {
- "date": "2020-04-14",
- "value": null
- },
- {
- "date": "2020-04-15",
- "value": null
- },
- {
- "date": "2020-04-16",
- "value": null
- },
- {
- "date": "2020-04-17",
- "value": null
- },
- {
- "date": "2020-04-20",
- "value": null
- },
- {
- "date": "2020-04-21",
- "value": null
- },
- {
- "date": "2020-04-22",
- "value": null
- },
- {
- "date": "2020-04-23",
- "value": null
- },
- {
- "date": "2020-04-24",
- "value": null
- },
- {
- "date": "2020-04-27",
- "value": null
- },
- {
- "date": "2020-04-28",
- "value": null
- },
- {
- "date": "2020-04-29",
- "value": null
- },
- {
- "date": "2020-04-30",
- "value": null
- },
- {
- "date": "2020-05-01",
- "value": null
- },
- {
- "date": "2020-05-04",
- "value": null
- },
- {
- "date": "2020-05-05",
- "value": null
- },
- {
- "date": "2020-05-06",
- "value": null
- },
- {
- "date": "2020-05-07",
- "value": null
- },
- {
- "date": "2020-05-08",
- "value": null
- },
- {
- "date": "2020-05-11",
- "value": null
- },
- {
- "date": "2020-05-12",
- "value": null
- },
- {
- "date": "2020-05-13",
- "value": null
- },
- {
- "date": "2020-05-14",
- "value": null
- },
- {
- "date": "2020-05-15",
- "value": null
- },
- {
- "date": "2020-05-18",
- "value": null
- },
- {
- "date": "2020-05-19",
- "value": null
- },
- {
- "date": "2020-05-20",
- "value": null
- },
- {
- "date": "2020-05-21",
- "value": null
- },
- {
- "date": "2020-05-22",
- "value": null
- },
- {
- "date": "2020-05-25",
- "value": null
- },
- {
- "date": "2020-05-26",
- "value": null
- },
- {
- "date": "2020-05-27",
- "value": null
- },
- {
- "date": "2020-05-28",
- "value": null
- },
- {
- "date": "2020-05-29",
- "value": null
- },
- {
- "date": "2020-06-01",
- "value": null
- },
- {
- "date": "2020-06-02",
- "value": null
- },
- {
- "date": "2020-06-03",
- "value": null
- },
- {
- "date": "2020-06-04",
- "value": null
- },
- {
- "date": "2020-06-05",
- "value": null
- },
- {
- "date": "2020-06-08",
- "value": null
- },
- {
- "date": "2020-06-09",
- "value": null
- },
- {
- "date": "2020-06-10",
- "value": null
- },
- {
- "date": "2020-06-11",
- "value": null
- },
- {
- "date": "2020-06-12",
- "value": null
- },
- {
- "date": "2020-06-15",
- "value": null
- },
- {
- "date": "2020-06-16",
- "value": null
- },
- {
- "date": "2020-06-17",
- "value": null
- },
- {
- "date": "2020-06-18",
- "value": null
- },
- {
- "date": "2020-06-19",
- "value": null
- },
- {
- "date": "2020-06-22",
- "value": null
- },
- {
- "date": "2020-06-23",
- "value": null
- },
- {
- "date": "2020-06-24",
- "value": null
- },
- {
- "date": "2020-06-25",
- "value": -45.444050378740286
- },
- {
- "date": "2020-06-26",
- "value": -45.30696855874398
- },
- {
- "date": "2020-06-29",
- "value": -45.17089914309896
- },
- {
- "date": "2020-06-30",
- "value": -44.819620369857944
- },
- {
- "date": "2020-07-01",
- "value": -44.37278246178799
- },
- {
- "date": "2020-07-02",
- "value": -44.44597316755636
- },
- {
- "date": "2020-07-03",
- "value": -44.46685253137314
- },
- {
- "date": "2020-07-06",
- "value": -44.43384742063737
- },
- {
- "date": "2020-07-07",
- "value": -45.26783331545697
- },
- {
- "date": "2020-07-08",
- "value": -45.554345623104325
- },
- {
- "date": "2020-07-09",
- "value": -45.35052223066262
- },
- {
- "date": "2020-07-10",
- "value": -45.3348393327659
- },
- {
- "date": "2020-07-13",
- "value": -45.689955441211
- },
- {
- "date": "2020-07-14",
- "value": -46.01872931675876
- },
- {
- "date": "2020-07-15",
- "value": -45.86809069255321
- },
- {
- "date": "2020-07-16",
- "value": -45.44287485936189
- },
- {
- "date": "2020-07-17",
- "value": -45.7615299175832
- },
- {
- "date": "2020-07-20",
- "value": -45.68026748742035
- },
- {
- "date": "2020-07-21",
- "value": -45.341850312461496
- },
- {
- "date": "2020-07-22",
- "value": -45.59162826238078
- },
- {
- "date": "2020-07-23",
- "value": -45.881504558273434
- },
- {
- "date": "2020-07-24",
- "value": -45.73150793930833
- },
- {
- "date": "2020-07-27",
- "value": -45.776335539024025
- },
- {
- "date": "2020-07-28",
- "value": -46.39084028775021
- },
- {
- "date": "2020-07-29",
- "value": -46.716555333299915
- },
- {
- "date": "2020-07-30",
- "value": -46.59247119164196
- },
- {
- "date": "2020-07-31",
- "value": -46.754496689422275
- },
- {
- "date": "2020-08-03",
- "value": -46.78234963906571
- },
- {
- "date": "2020-08-04",
- "value": -46.906837403457864
- },
- {
- "date": "2020-08-05",
- "value": -46.85604148709348
- },
- {
- "date": "2020-08-06",
- "value": -46.58540111148493
- },
- {
- "date": "2020-08-07",
- "value": -46.718501333985344
- },
- {
- "date": "2020-08-10",
- "value": -46.179313407473714
- },
- {
- "date": "2020-08-11",
- "value": -45.893132716082036
- },
- {
- "date": "2020-08-12",
- "value": -45.772829221210834
- },
- {
- "date": "2020-08-13",
- "value": -45.32064936212113
- },
- {
- "date": "2020-08-14",
- "value": -45.239589474894125
- },
- {
- "date": "2020-08-17",
- "value": -45.325046990489
- },
- {
- "date": "2020-08-18",
- "value": -46.12205843962057
- },
- {
- "date": "2020-08-19",
- "value": -45.97500824959783
- },
- {
- "date": "2020-08-20",
- "value": -45.962887058473775
- },
- {
- "date": "2020-08-21",
- "value": -45.93443211192661
- },
- {
- "date": "2020-08-24",
- "value": -45.993943884203986
- },
- {
- "date": "2020-08-25",
- "value": -46.23808261809548
- },
- {
- "date": "2020-08-26",
- "value": -46.23860204344242
- },
- {
- "date": "2020-08-27",
- "value": -46.36912030829003
- },
- {
- "date": "2020-08-28",
- "value": -45.48281781733673
- },
- {
- "date": "2020-08-31",
- "value": -45.599338818209525
- },
- {
- "date": "2020-09-01",
- "value": -45.784218931272605
- },
- {
- "date": "2020-09-02",
- "value": -45.81341950025582
- },
- {
- "date": "2020-09-03",
- "value": -46.34619945881993
- },
- {
- "date": "2020-09-04",
- "value": -46.3554259868679
- },
- {
- "date": "2020-09-07",
- "value": -46.26073553459674
- },
- {
- "date": "2020-09-08",
- "value": -46.33887234392338
- },
- {
- "date": "2020-09-09",
- "value": -45.954628549679484
- },
- {
- "date": "2020-09-10",
- "value": -45.8962342058434
- },
- {
- "date": "2020-09-11",
- "value": -46.015920494415894
- },
- {
- "date": "2020-09-14",
- "value": -46.10350352261767
- },
- {
- "date": "2020-09-15",
- "value": -46.17429554153766
- },
- {
- "date": "2020-09-16",
- "value": -46.22147926898513
- },
- {
- "date": "2020-09-17",
- "value": -46.315428061328184
- },
- {
- "date": "2020-09-18",
- "value": -45.69926219926204
- },
- {
- "date": "2020-09-21",
- "value": -45.61117366901314
- },
- {
- "date": "2020-09-22",
- "value": -45.9276437917552
- },
- {
- "date": "2020-09-23",
- "value": -46.04161600806433
- },
- {
- "date": "2020-09-24",
- "value": -46.130814813648136
- },
- {
- "date": "2020-09-25",
- "value": -46.08562949108101
- },
- {
- "date": "2020-09-28",
- "value": -46.01311841669221
- },
- {
- "date": "2020-09-29",
- "value": -45.981833662032116
- },
- {
- "date": "2020-09-30",
- "value": -46.19633019392806
- },
- {
- "date": "2020-10-01",
- "value": -46.52181368724153
- },
- {
- "date": "2020-10-02",
- "value": -46.48258718351056
- },
- {
- "date": "2020-10-05",
- "value": -46.64890023962169
- },
- {
- "date": "2020-10-06",
- "value": -46.69253182526522
- },
- {
- "date": "2020-10-07",
- "value": -46.654116700076834
- },
- {
- "date": "2020-10-08",
- "value": -46.65087630115671
- },
- {
- "date": "2020-10-09",
- "value": -46.372244653116454
- },
- {
- "date": "2020-10-12",
- "value": -45.98682251386646
- },
- {
- "date": "2020-10-13",
- "value": -46.58202491494976
- },
- {
- "date": "2020-10-14",
- "value": -46.1767922302853
- },
- {
- "date": "2020-10-15",
- "value": -46.21564498729761
- },
- {
- "date": "2020-10-16",
- "value": -46.976512571952235
- },
- {
- "date": "2020-10-19",
- "value": -47.08795966723353
- },
- {
- "date": "2020-10-20",
- "value": -47.23267142760718
- },
- {
- "date": "2020-10-21",
- "value": -47.14746802606913
- },
- {
- "date": "2020-10-22",
- "value": -45.78716171942512
- },
- {
- "date": "2020-10-23",
- "value": -45.65005667407574
- },
- {
- "date": "2020-10-26",
- "value": -45.787031465946995
- },
- {
- "date": "2020-10-27",
- "value": -45.75121431935232
- },
- {
- "date": "2020-10-28",
- "value": -45.84049365308786
- },
- {
- "date": "2020-10-29",
- "value": -45.66037571272713
- },
- {
- "date": "2020-10-30",
- "value": -45.47860137819171
- },
- {
- "date": "2020-11-02",
- "value": -45.74597822896944
- },
- {
- "date": "2020-11-03",
- "value": -45.76984097013385
- },
- {
- "date": "2020-11-04",
- "value": -45.81025475238431
- },
- {
- "date": "2020-11-05",
- "value": -44.40534243514406
- },
- {
- "date": "2020-11-06",
- "value": -44.40510726910293
- },
- {
- "date": "2020-11-09",
- "value": -44.939936060736144
- },
- {
- "date": "2020-11-10",
- "value": -45.1124478589726
- },
- {
- "date": "2020-11-11",
- "value": -45.41600711271898
- },
- {
- "date": "2020-11-12",
- "value": -45.0953650609707
- },
- {
- "date": "2020-11-13",
- "value": -45.11928039803274
- },
- {
- "date": "2020-11-16",
- "value": -44.879040220929774
- },
- {
- "date": "2020-11-17",
- "value": -44.643559356911275
- },
- {
- "date": "2020-11-18",
- "value": -44.50046926289967
- },
- {
- "date": "2020-11-19",
- "value": -44.35881969060029
- },
- {
- "date": "2020-11-20",
- "value": -44.334569414998
- },
- {
- "date": "2020-11-23",
- "value": -44.47903969147849
- },
- {
- "date": "2020-11-24",
- "value": -44.422920966996095
- },
- {
- "date": "2020-11-25",
- "value": -44.46415861029073
- },
- {
- "date": "2020-11-26",
- "value": -44.70478607238437
- },
- {
- "date": "2020-11-27",
- "value": -44.96594174435969
- },
- {
- "date": "2020-11-30",
- "value": -44.62928075026923
- },
- {
- "date": "2020-12-01",
- "value": -43.12688826346321
- },
- {
- "date": "2020-12-02",
- "value": -43.54871161671933
- },
- {
- "date": "2020-12-03",
- "value": -42.90660727876288
- },
- {
- "date": "2020-12-04",
- "value": -42.74971569221733
- },
- {
- "date": "2020-12-07",
- "value": -42.695129377901814
- },
- {
- "date": "2020-12-08",
- "value": -43.13683995764358
- },
- {
- "date": "2020-12-09",
- "value": -43.24299972521676
- },
- {
- "date": "2020-12-10",
- "value": -43.46667611429035
- },
- {
- "date": "2020-12-11",
- "value": -43.25531398027673
- },
- {
- "date": "2020-12-14",
- "value": -43.03451820804466
- },
- {
- "date": "2020-12-15",
- "value": -42.220069396243915
- },
- {
- "date": "2020-12-16",
- "value": -42.473735446168575
- },
- {
- "date": "2020-12-17",
- "value": -42.432853568728525
- },
- {
- "date": "2020-12-18",
- "value": -42.53716589719479
- },
- {
- "date": "2020-12-21",
- "value": -43.10902133809853
- },
- {
- "date": "2020-12-22",
- "value": -43.1666489228486
- },
- {
- "date": "2020-12-23",
- "value": -43.37226343228798
- },
- {
- "date": "2020-12-24",
- "value": -43.874991855441195
- },
- {
- "date": "2020-12-25",
- "value": -43.59521175011429
- },
- {
- "date": "2020-12-28",
- "value": -43.42231623524896
- },
- {
- "date": "2020-12-29",
- "value": -43.430476362381924
- },
- {
- "date": "2020-12-30",
- "value": -43.31038304743983
- },
- {
- "date": "2020-12-31",
- "value": -43.49989953070001
- },
- {
- "date": "2021-01-01",
- "value": -43.25864161911789
- },
- {
- "date": "2021-01-04",
- "value": -43.16370457325581
- },
- {
- "date": "2021-01-05",
- "value": -43.14651615063281
- },
- {
- "date": "2021-01-06",
- "value": -43.25707661037058
- },
- {
- "date": "2021-01-07",
- "value": -43.42268911168145
- },
- {
- "date": "2021-01-08",
- "value": -43.27085257423354
- },
- {
- "date": "2021-01-11",
- "value": -43.29518742452271
- },
- {
- "date": "2021-01-12",
- "value": -43.40629697079982
- },
- {
- "date": "2021-01-13",
- "value": -43.90519066459895
- },
- {
- "date": "2021-01-14",
- "value": -44.09999232766349
- },
- {
- "date": "2021-01-15",
- "value": -43.99198716393086
- },
- {
- "date": "2021-01-18",
- "value": -43.97306529809917
- },
- {
- "date": "2021-01-19",
- "value": -43.64549954882212
- },
- {
- "date": "2021-01-20",
- "value": -43.762850086155574
- },
- {
- "date": "2021-01-21",
- "value": -43.74172994491016
- },
- {
- "date": "2021-01-22",
- "value": -42.40324468348284
- },
- {
- "date": "2021-01-25",
- "value": -42.92060959344512
- },
- {
- "date": "2021-01-26",
- "value": -42.99531922859971
- },
- {
- "date": "2021-01-27",
- "value": -42.9950721356086
- },
- {
- "date": "2021-01-28",
- "value": -43.007683696499974
- },
- {
- "date": "2021-01-29",
- "value": -43.12343960155912
- },
- {
- "date": "2021-02-01",
- "value": -43.047054112915525
- },
- {
- "date": "2021-02-02",
- "value": -43.52514168149138
- },
- {
- "date": "2021-02-03",
- "value": -43.9565228697821
- },
- {
- "date": "2021-02-04",
- "value": -43.88311405442021
- },
- {
- "date": "2021-02-05",
- "value": -43.384931406870216
- },
- {
- "date": "2021-02-08",
- "value": -42.93721842867742
- },
- {
- "date": "2021-02-09",
- "value": -42.49934203747057
- },
- {
- "date": "2021-02-10",
- "value": -42.20965050862811
- },
- {
- "date": "2021-02-11",
- "value": -42.38547278947219
- },
- {
- "date": "2021-02-12",
- "value": -42.37757028074409
- },
- {
- "date": "2021-02-15",
- "value": -42.81481399222149
- },
- {
- "date": "2021-02-16",
- "value": -42.779339804787995
- },
- {
- "date": "2021-02-17",
- "value": -42.784249822676216
- },
- {
- "date": "2021-02-18",
- "value": -42.61534913240323
- },
- {
- "date": "2021-02-19",
- "value": -42.63378011993492
- },
- {
- "date": "2021-02-22",
- "value": -43.13161519748388
- },
- {
- "date": "2021-02-23",
- "value": -42.27202169258755
- },
- {
- "date": "2021-02-24",
- "value": -42.29173532797211
- },
- {
- "date": "2021-02-25",
- "value": -42.28986812478389
- },
- {
- "date": "2021-02-26",
- "value": -42.29810979767552
- },
- {
- "date": "2021-03-01",
- "value": -42.47365058400459
- },
- {
- "date": "2021-03-02",
- "value": -42.539520106622604
- },
- {
- "date": "2021-03-03",
- "value": -42.500272677387606
- },
- {
- "date": "2021-03-04",
- "value": -42.81306362958054
- },
- {
- "date": "2021-03-05",
- "value": -42.7924019829309
- },
- {
- "date": "2021-03-08",
- "value": -42.72886991697957
- },
- {
- "date": "2021-03-09",
- "value": -42.93745633021214
- },
- {
- "date": "2021-03-10",
- "value": -43.01835676351323
- },
- {
- "date": "2021-03-11",
- "value": -43.327019514072354
- },
- {
- "date": "2021-03-12",
- "value": -43.30130130682836
- },
- {
- "date": "2021-03-15",
- "value": -43.86018282284898
- },
- {
- "date": "2021-03-16",
- "value": -43.88584157937001
- },
- {
- "date": "2021-03-17",
- "value": -43.85430484848826
- },
- {
- "date": "2021-03-18",
- "value": -43.863545804351126
- },
- {
- "date": "2021-03-19",
- "value": -43.83456936371816
- },
- {
- "date": "2021-03-22",
- "value": -43.78723188187978
- },
- {
- "date": "2021-03-23",
- "value": -43.799776409654406
- },
- {
- "date": "2021-03-24",
- "value": -43.95156360291959
- },
- {
- "date": "2021-03-25",
- "value": -43.93482736993474
- },
- {
- "date": "2021-03-26",
- "value": -44.110910465627875
- },
- {
- "date": "2021-03-29",
- "value": -44.14099798589298
- },
- {
- "date": "2021-03-30",
- "value": -44.02381891907831
- },
- {
- "date": "2021-03-31",
- "value": -43.72144944219191
- },
- {
- "date": "2021-04-01",
- "value": -44.043128461267656
- },
- {
- "date": "2021-04-02",
- "value": -43.80655063608521
- },
- {
- "date": "2021-04-05",
- "value": -44.0500711095046
- },
- {
- "date": "2021-04-06",
- "value": -44.26362741917654
- },
- {
- "date": "2021-04-07",
- "value": -43.85249738407104
- },
- {
- "date": "2021-04-08",
- "value": -43.1767698011518
- },
- {
- "date": "2021-04-09",
- "value": -43.277484002887526
- },
- {
- "date": "2021-04-12",
- "value": -43.27927598617057
- },
- {
- "date": "2021-04-13",
- "value": -42.22496031721777
- },
- {
- "date": "2021-04-14",
- "value": -42.25016851543557
- },
- {
- "date": "2021-04-15",
- "value": -42.15584585866615
- },
- {
- "date": "2021-04-16",
- "value": -42.747797946941226
- },
- {
- "date": "2021-04-19",
- "value": -42.85536600566994
- },
- {
- "date": "2021-04-20",
- "value": -42.92843173307424
- },
- {
- "date": "2021-04-21",
- "value": -42.96755948609587
- },
- {
- "date": "2021-04-22",
- "value": -42.74867928105655
- },
- {
- "date": "2021-04-23",
- "value": -42.66756590898509
- },
- {
- "date": "2021-04-26",
- "value": -42.84510055088623
- },
- {
- "date": "2021-04-27",
- "value": -42.844969784867985
- },
- {
- "date": "2021-04-28",
- "value": -42.90906108510861
- },
- {
- "date": "2021-04-29",
- "value": -43.02563583080954
- },
- {
- "date": "2021-04-30",
- "value": -44.18225449840421
- },
- {
- "date": "2021-05-03",
- "value": -43.9227245314391
- },
- {
- "date": "2021-05-04",
- "value": -43.93171599071321
- },
- {
- "date": "2021-05-05",
- "value": -43.96620064090336
- },
- {
- "date": "2021-05-06",
- "value": -43.4961638783508
- },
- {
- "date": "2021-05-07",
- "value": -43.793127467799955
- },
- {
- "date": "2021-05-10",
- "value": -43.757783630214334
- },
- {
- "date": "2021-05-11",
- "value": -44.07572856276569
- },
- {
- "date": "2021-05-12",
- "value": -44.341177579361975
- },
- {
- "date": "2021-05-13",
- "value": -44.5200966604299
- },
- {
- "date": "2021-05-14",
- "value": -44.645223994692216
- },
- {
- "date": "2021-05-17",
- "value": -44.11943845422451
- },
- {
- "date": "2021-05-18",
- "value": -44.114210534037205
- },
- {
- "date": "2021-05-19",
- "value": -43.79478223499915
- },
- {
- "date": "2021-05-20",
- "value": -43.12725191670329
- },
- {
- "date": "2021-05-21",
- "value": -42.32324886247591
- },
- {
- "date": "2021-05-24",
- "value": -42.17483610523046
- },
- {
- "date": "2021-05-25",
- "value": -42.23556632902509
- },
- {
- "date": "2021-05-26",
- "value": -43.6245636703111
- },
- {
- "date": "2021-05-27",
- "value": -43.57534640846003
- },
- {
- "date": "2021-05-28",
- "value": -44.2997927568182
- },
- {
- "date": "2021-05-31",
- "value": -44.64364021286032
- },
- {
- "date": "2021-06-01",
- "value": -44.45905188841153
- },
- {
- "date": "2021-06-02",
- "value": -44.40251937160737
- },
- {
- "date": "2021-06-03",
- "value": -43.96936214468736
- },
- {
- "date": "2021-06-04",
- "value": -43.82242717476135
- },
- {
- "date": "2021-06-07",
- "value": -43.9518198869541
- },
- {
- "date": "2021-06-08",
- "value": -44.70910326741394
- },
- {
- "date": "2021-06-09",
- "value": -45.584742852006855
- },
- {
- "date": "2021-06-10",
- "value": -45.490984274258
- },
- {
- "date": "2021-06-11",
- "value": -45.48904821013233
- },
- {
- "date": "2021-06-14",
- "value": -45.47756378846994
- },
- {
- "date": "2021-06-15",
- "value": -45.5378226305547
- },
- {
- "date": "2021-06-16",
- "value": -45.63202979793997
- },
- {
- "date": "2021-06-17",
- "value": -45.65140945632659
- },
- {
- "date": "2021-06-18",
- "value": -45.59538639062651
- },
- {
- "date": "2021-06-21",
- "value": -45.69916562323388
- },
- {
- "date": "2021-06-22",
- "value": -45.8383781632795
- },
- {
- "date": "2021-06-23",
- "value": -44.936522037252224
- },
- {
- "date": "2021-06-24",
- "value": -44.24479517920197
- },
- {
- "date": "2021-06-25",
- "value": -44.25132522148609
- },
- {
- "date": "2021-06-28",
- "value": -43.91467274708348
- },
- {
- "date": "2021-06-29",
- "value": -43.93683897279878
- },
- {
- "date": "2021-06-30",
- "value": -43.922518541416494
- },
- {
- "date": "2021-07-01",
- "value": -43.81308619206828
- },
- {
- "date": "2021-07-02",
- "value": -43.77770150235526
- },
- {
- "date": "2021-07-05",
- "value": -44.50530452968731
- },
- {
- "date": "2021-07-06",
- "value": -44.55214425133335
- },
- {
- "date": "2021-07-07",
- "value": -44.05182488304984
- },
- {
- "date": "2021-07-08",
- "value": -44.07701944272394
- },
- {
- "date": "2021-07-09",
- "value": -44.192496945067425
- },
- {
- "date": "2021-07-12",
- "value": -44.27020382798072
- },
- {
- "date": "2021-07-13",
- "value": -44.42157570983605
- },
- {
- "date": "2021-07-14",
- "value": -44.14369605902224
- },
- {
- "date": "2021-07-15",
- "value": -44.12644281834956
- },
- {
- "date": "2021-07-16",
- "value": -43.69555768559424
- },
- {
- "date": "2021-07-19",
- "value": -45.101549624702514
- },
- {
- "date": "2021-07-20",
- "value": -45.10376897193469
- },
- {
- "date": "2021-07-21",
- "value": -45.1134781419313
- },
- {
- "date": "2021-07-22",
- "value": -45.09022328732693
- },
- {
- "date": "2021-07-23",
- "value": -45.340581882827706
- },
- {
- "date": "2021-07-26",
- "value": -45.173928710420476
- },
- {
- "date": "2021-07-27",
- "value": -45.142917663109316
- },
- {
- "date": "2021-07-28",
- "value": -45.129871640310355
- },
- {
- "date": "2021-07-29",
- "value": -41.64014062741049
- },
- {
- "date": "2021-07-30",
- "value": -41.63459559644814
- },
- {
- "date": "2021-08-02",
- "value": -42.51124426083416
- },
- {
- "date": "2021-08-03",
- "value": -42.954565550903
- },
- {
- "date": "2021-08-04",
- "value": -42.59230870835695
- },
- {
- "date": "2021-08-05",
- "value": -42.89229335965955
- },
- {
- "date": "2021-08-06",
- "value": -42.38831960978
- },
- {
- "date": "2021-08-09",
- "value": -41.524068996700144
- },
- {
- "date": "2021-08-10",
- "value": -41.386570980330575
- },
- {
- "date": "2021-08-11",
- "value": -41.442466993016836
- },
- {
- "date": "2021-08-12",
- "value": -40.513272996856095
- },
- {
- "date": "2021-08-13",
- "value": -40.245373037689696
- },
- {
- "date": "2021-08-16",
- "value": -40.18561320862313
- },
- {
- "date": "2021-08-17",
- "value": -40.18508499970501
- },
- {
- "date": "2021-08-18",
- "value": -40.926964033921834
- },
- {
- "date": "2021-08-19",
- "value": -40.88803496303501
- },
- {
- "date": "2021-08-20",
- "value": -40.346899634194344
- },
- {
- "date": "2021-08-23",
- "value": -40.23785328808613
- },
- {
- "date": "2021-08-24",
- "value": -40.03853936678274
- },
- {
- "date": "2021-08-25",
- "value": -40.03722849153913
- },
- {
- "date": "2021-08-26",
- "value": -40.097261730531415
- },
- {
- "date": "2021-08-27",
- "value": -40.03537881398886
- },
- {
- "date": "2021-08-30",
- "value": -40.05452995126846
- },
- {
- "date": "2021-08-31",
- "value": -40.122860297563015
- },
- {
- "date": "2021-09-01",
- "value": -40.1561444390508
- },
- {
- "date": "2021-09-02",
- "value": -40.21253367796436
- },
- {
- "date": "2021-09-03",
- "value": -40.1410004844888
- },
- {
- "date": "2021-09-06",
- "value": -40.07905551372793
- },
- {
- "date": "2021-09-07",
- "value": -39.836820345426794
- },
- {
- "date": "2021-09-08",
- "value": -39.86567581283363
- },
- {
- "date": "2021-09-09",
- "value": -39.895748653878854
- },
- {
- "date": "2021-09-10",
- "value": -39.879304802652655
- },
- {
- "date": "2021-09-13",
- "value": -39.876374667039094
- },
- {
- "date": "2021-09-14",
- "value": -39.90956055628241
- },
- {
- "date": "2021-09-15",
- "value": -39.918743676953426
- },
- {
- "date": "2021-09-16",
- "value": -39.911572070723636
- },
- {
- "date": "2021-09-17",
- "value": -39.14726167628288
- },
- {
- "date": "2021-09-20",
- "value": -39.24672305738531
- },
- {
- "date": "2021-09-21",
- "value": -38.950664076520496
- },
- {
- "date": "2021-09-22",
- "value": -39.03572070137046
- },
- {
- "date": "2021-09-23",
- "value": -39.25053001130871
- },
- {
- "date": "2021-09-24",
- "value": -39.12560237369096
- },
- {
- "date": "2021-09-27",
- "value": -39.271005866312215
- },
- {
- "date": "2021-09-28",
- "value": -39.06493624755818
- },
- {
- "date": "2021-09-29",
- "value": -38.98044434247391
- },
- {
- "date": "2021-09-30",
- "value": -38.830426705673545
- },
- {
- "date": "2021-10-01",
- "value": -39.59935849279014
- },
- {
- "date": "2021-10-04",
- "value": -39.51056151983005
- },
- {
- "date": "2021-10-05",
- "value": -39.49500983489172
- },
- {
- "date": "2021-10-06",
- "value": -40.285976276819504
- },
- {
- "date": "2021-10-07",
- "value": -39.44747630357924
- },
- {
- "date": "2021-10-08",
- "value": -39.61695220960149
- },
- {
- "date": "2021-10-11",
- "value": -40.06450278270476
- },
- {
- "date": "2021-10-12",
- "value": -39.74280213296102
- },
- {
- "date": "2021-10-13",
- "value": -39.868925141459336
- },
- {
- "date": "2021-10-14",
- "value": -39.837841478372546
- },
- {
- "date": "2021-10-15",
- "value": -39.93121315046893
- },
- {
- "date": "2021-10-18",
- "value": -39.72683002051892
- },
- {
- "date": "2021-10-19",
- "value": -39.35805285448671
- },
- {
- "date": "2021-10-20",
- "value": -39.171386445266734
- },
- {
- "date": "2021-10-21",
- "value": -38.64046983802422
- },
- {
- "date": "2021-10-22",
- "value": -38.54096688289618
- },
- {
- "date": "2021-10-25",
- "value": -38.458336053512525
- },
- {
- "date": "2021-10-26",
- "value": -38.529914754243656
- },
- {
- "date": "2021-10-27",
- "value": -38.66898642931481
- },
- {
- "date": "2021-10-28",
- "value": -38.68983232821047
- },
- {
- "date": "2021-10-29",
- "value": -38.896854548138386
- },
- {
- "date": "2021-11-01",
- "value": -38.922672430927754
- },
- {
- "date": "2021-11-02",
- "value": -38.82299102502026
- },
- {
- "date": "2021-11-03",
- "value": -38.77794211243254
- },
- {
- "date": "2021-11-04",
- "value": -38.75091949451742
- },
- {
- "date": "2021-11-05",
- "value": -38.917512340917305
- },
- {
- "date": "2021-11-08",
- "value": -38.809088867052594
- },
- {
- "date": "2021-11-09",
- "value": -39.020962711553075
- },
- {
- "date": "2021-11-10",
- "value": -39.028684299688805
- },
- {
- "date": "2021-11-11",
- "value": -39.24590116160988
- },
- {
- "date": "2021-11-12",
- "value": -39.33633160905607
- },
- {
- "date": "2021-11-15",
- "value": -39.76431655380805
- },
- {
- "date": "2021-11-16",
- "value": -39.8813227815565
- },
- {
- "date": "2021-11-17",
- "value": -39.674419069409055
- },
- {
- "date": "2021-11-18",
- "value": -39.728496130636714
- },
- {
- "date": "2021-11-19",
- "value": -39.684362504133546
- },
- {
- "date": "2021-11-22",
- "value": -39.7434116947756
- },
- {
- "date": "2021-11-23",
- "value": -39.88741825767299
- },
- {
- "date": "2021-11-24",
- "value": -39.97834153659613
- },
- {
- "date": "2021-11-25",
- "value": -40.05869607679096
- },
- {
- "date": "2021-11-26",
- "value": -40.204030999890094
- },
- {
- "date": "2021-11-29",
- "value": -40.13410901319857
- },
- {
- "date": "2021-11-30",
- "value": -39.92289596739257
- },
- {
- "date": "2021-12-01",
- "value": -39.827984504581096
- },
- {
- "date": "2021-12-02",
- "value": -39.59549187466823
- },
- {
- "date": "2021-12-03",
- "value": -39.65652740761864
- },
- {
- "date": "2021-12-06",
- "value": -39.477404022136525
- },
- {
- "date": "2021-12-07",
- "value": -39.4024760920551
- },
- {
- "date": "2021-12-08",
- "value": -39.50764589656295
- },
- {
- "date": "2021-12-09",
- "value": -39.52895853350066
- },
- {
- "date": "2021-12-10",
- "value": -39.22172973659695
- },
- {
- "date": "2021-12-13",
- "value": -39.00996675898016
- },
- {
- "date": "2021-12-14",
- "value": -39.08127691742645
- },
- {
- "date": "2021-12-15",
- "value": -38.82378379865047
- },
- {
- "date": "2021-12-16",
- "value": -39.593166205233054
- },
- {
- "date": "2021-12-17",
- "value": -40.19696380632909
- },
- {
- "date": "2021-12-20",
- "value": -40.1140836400687
- },
- {
- "date": "2021-12-21",
- "value": -40.642602848523694
- },
- {
- "date": "2021-12-22",
- "value": -40.518260731553084
- },
- {
- "date": "2021-12-23",
- "value": -40.5296535095648
- },
- {
- "date": "2021-12-24",
- "value": -40.46104799075404
- },
- {
- "date": "2021-12-27",
- "value": -40.56577106192743
- },
- {
- "date": "2021-12-28",
- "value": -38.84489859385069
- },
- {
- "date": "2021-12-29",
- "value": -38.85951132486532
- },
- {
- "date": "2021-12-30",
- "value": -38.91081793132373
- },
- {
- "date": "2021-12-31",
- "value": -38.70545841741951
- },
- {
- "date": "2022-01-03",
- "value": -38.721888725975695
- },
- {
- "date": "2022-01-04",
- "value": -38.70591106598131
- },
- {
- "date": "2022-01-05",
- "value": -38.55445043730906
- },
- {
- "date": "2022-01-06",
- "value": -38.55498750969691
- },
- {
- "date": "2022-01-07",
- "value": -38.433279248501286
- },
- {
- "date": "2022-01-10",
- "value": -38.27734752991743
- },
- {
- "date": "2022-01-11",
- "value": -37.961772992471225
- },
- {
- "date": "2022-01-12",
- "value": -37.97391035721423
- },
- {
- "date": "2022-01-13",
- "value": -38.01944097295472
- },
- {
- "date": "2022-01-14",
- "value": -37.94538990567497
- },
- {
- "date": "2022-01-17",
- "value": -37.91824779187916
- },
- {
- "date": "2022-01-18",
- "value": -37.14545365578252
- },
- {
- "date": "2022-01-19",
- "value": -37.21433459731629
- },
- {
- "date": "2022-01-20",
- "value": -37.11154565903753
- },
- {
- "date": "2022-01-21",
- "value": -39.82286594620729
- },
- {
- "date": "2022-01-24",
- "value": -39.67177877964661
- },
- {
- "date": "2022-01-25",
- "value": -39.58385217213214
- },
- {
- "date": "2022-01-26",
- "value": -39.609169485830115
- },
- {
- "date": "2022-01-27",
- "value": -39.73614612767917
- },
- {
- "date": "2022-01-28",
- "value": -39.78908526608617
- },
- {
- "date": "2022-01-31",
- "value": -40.006577836992435
- },
- {
- "date": "2022-02-01",
- "value": -39.863178079558246
- },
- {
- "date": "2022-02-02",
- "value": -39.8961333025676
- },
- {
- "date": "2022-02-03",
- "value": -39.8664810834327
- },
- {
- "date": "2022-02-04",
- "value": -40.723612046707345
- },
- {
- "date": "2022-02-07",
- "value": -41.07130379552535
- },
- {
- "date": "2022-02-08",
- "value": -40.83297223860522
- },
- {
- "date": "2022-02-09",
- "value": -40.990624711408536
- },
- {
- "date": "2022-02-10",
- "value": -40.71974163439366
- },
- {
- "date": "2022-02-11",
- "value": -40.537252181096726
- },
- {
- "date": "2022-02-14",
- "value": -40.509482951739116
- },
- {
- "date": "2022-02-15",
- "value": -40.411262685809966
- },
- {
- "date": "2022-02-16",
- "value": -40.6358296638352
- },
- {
- "date": "2022-02-17",
- "value": -40.573121599464336
- },
- {
- "date": "2022-02-18",
- "value": -40.561653314889405
- },
- {
- "date": "2022-02-21",
- "value": -40.462535392054484
- },
- {
- "date": "2022-02-22",
- "value": -40.36452438929495
- },
- {
- "date": "2022-02-23",
- "value": -40.27362167416249
- },
- {
- "date": "2022-02-24",
- "value": -40.03560951461395
- },
- {
- "date": "2022-02-25",
- "value": -40.106797286897944
- },
- {
- "date": "2022-02-28",
- "value": -40.15577969742903
- },
- {
- "date": "2022-03-01",
- "value": -40.2471862110642
- },
- {
- "date": "2022-03-02",
- "value": -40.524122072774055
- },
- {
- "date": "2022-03-03",
- "value": -40.10495814304551
- },
- {
- "date": "2022-03-04",
- "value": -40.04213605665816
- },
- {
- "date": "2022-03-07",
- "value": -40.07951540125021
- },
- {
- "date": "2022-03-08",
- "value": -39.94309820456025
- },
- {
- "date": "2022-03-09",
- "value": -39.56602151500856
- },
- {
- "date": "2022-03-10",
- "value": -39.58679844669844
- },
- {
- "date": "2022-03-11",
- "value": -39.525305521905814
- },
- {
- "date": "2022-03-14",
- "value": -40.28464471449788
- },
- {
- "date": "2022-03-15",
- "value": -40.37003301634379
- },
- {
- "date": "2022-03-16",
- "value": -40.63231865005461
- },
- {
- "date": "2022-03-17",
- "value": -40.56517171360174
- },
- {
- "date": "2022-03-18",
- "value": -40.77324231651806
- },
- {
- "date": "2022-03-21",
- "value": -40.86500787642102
- },
- {
- "date": "2022-03-22",
- "value": -40.87037455461885
- },
- {
- "date": "2022-03-23",
- "value": -41.05986360464427
- },
- {
- "date": "2022-03-24",
- "value": -40.92175915143384
- },
- {
- "date": "2022-03-25",
- "value": -41.07339129003927
- },
- {
- "date": "2022-03-28",
- "value": -41.07540946333865
- },
- {
- "date": "2022-03-29",
- "value": -41.06572465090644
- },
- {
- "date": "2022-03-30",
- "value": -41.0104928714047
- },
- {
- "date": "2022-03-31",
- "value": -41.127701951329094
- },
- {
- "date": "2022-04-01",
- "value": -41.88766152883277
- },
- {
- "date": "2022-04-04",
- "value": -41.87479939424966
- },
- {
- "date": "2022-04-05",
- "value": -41.440796964929206
- },
- {
- "date": "2022-04-06",
- "value": -41.63499790145938
- },
- {
- "date": "2022-04-07",
- "value": -41.428721621792974
- },
- {
- "date": "2022-04-08",
- "value": -41.387680510518635
- },
- {
- "date": "2022-04-11",
- "value": -41.50644145091534
- },
- {
- "date": "2022-04-12",
- "value": -41.93916998151852
- },
- {
- "date": "2022-04-13",
- "value": -42.34921890884305
- },
- {
- "date": "2022-04-14",
- "value": -42.30533325276214
- },
- {
- "date": "2022-04-15",
- "value": -42.973425717145396
- },
- {
- "date": "2022-04-18",
- "value": -42.86551827711438
- },
- {
- "date": "2022-04-19",
- "value": -43.06927084133469
- },
- {
- "date": "2022-04-20",
- "value": -43.00603959221462
- },
- {
- "date": "2022-04-21",
- "value": -43.02058518611044
- },
- {
- "date": "2022-04-22",
- "value": -42.73923186207612
- },
- {
- "date": "2022-04-25",
- "value": -43.058604505779755
- },
- {
- "date": "2022-04-26",
- "value": -42.91285704776622
- },
- {
- "date": "2022-04-27",
- "value": -43.065990379119654
- },
- {
- "date": "2022-04-28",
- "value": -43.10026994554567
- },
- {
- "date": "2022-04-29",
- "value": -43.18796841616006
- },
- {
- "date": "2022-05-02",
- "value": -43.16778201009611
- },
- {
- "date": "2022-05-03",
- "value": -43.363784690043424
- },
- {
- "date": "2022-05-04",
- "value": -42.94239374915016
- },
- {
- "date": "2022-05-05",
- "value": -42.94405459762269
- },
- {
- "date": "2022-05-06",
- "value": -43.19109523456168
- },
- {
- "date": "2022-05-09",
- "value": -43.63189886358276
- },
- {
- "date": "2022-05-10",
- "value": -43.84386814069978
- },
- {
- "date": "2022-05-11",
- "value": -43.423734257182886
- },
- {
- "date": "2022-05-12",
- "value": -43.907500104946806
- },
- {
- "date": "2022-05-13",
- "value": -43.875715129890345
- },
- {
- "date": "2022-05-16",
- "value": -43.95457758517259
- },
- {
- "date": "2022-05-17",
- "value": -43.03787705012179
- },
- {
- "date": "2022-05-18",
- "value": -42.750343405237686
- },
- {
- "date": "2022-05-19",
- "value": -42.861100727686
- },
- {
- "date": "2022-05-20",
- "value": -42.842733743476444
- },
- {
- "date": "2022-05-23",
- "value": -43.01286179929275
- },
- {
- "date": "2022-05-24",
- "value": -42.97991653393708
- },
- {
- "date": "2022-05-25",
- "value": -43.28763022326731
- },
- {
- "date": "2022-05-26",
- "value": -43.436178546336976
- },
- {
- "date": "2022-05-27",
- "value": -43.92804852724305
- },
- {
- "date": "2022-05-30",
- "value": -43.53869403612223
- },
- {
- "date": "2022-05-31",
- "value": -43.784529604270666
- },
- {
- "date": "2022-06-01",
- "value": -43.652180761503594
- },
- {
- "date": "2022-06-02",
- "value": -43.54956504909564
- },
- {
- "date": "2022-06-03",
- "value": -43.17428685427011
- },
- {
- "date": "2022-06-06",
- "value": -43.57078190005514
- },
- {
- "date": "2022-06-07",
- "value": -43.870326171539936
- },
- {
- "date": "2022-06-08",
- "value": -44.07358299745931
- },
- {
- "date": "2022-06-09",
- "value": -44.44349420359648
- },
- {
- "date": "2022-06-10",
- "value": -44.67699803749705
- },
- {
- "date": "2022-06-13",
- "value": -44.67545316258204
- },
- {
- "date": "2022-06-14",
- "value": -44.78828275198723
- },
- {
- "date": "2022-06-15",
- "value": -44.547146304312676
- },
- {
- "date": "2022-06-16",
- "value": -44.803602020599
- },
- {
- "date": "2022-06-17",
- "value": -44.80484915036008
- },
- {
- "date": "2022-06-20",
- "value": -44.98262689973105
- },
- {
- "date": "2022-06-21",
- "value": -44.93439281956884
- },
- {
- "date": "2022-06-22",
- "value": -47.09036573999023
- },
- {
- "date": "2022-06-23",
- "value": -47.02899731185216
- },
- {
- "date": "2022-06-24",
- "value": -46.74296969423462
- },
- {
- "date": "2022-06-27",
- "value": -46.9997873481102
- },
- {
- "date": "2022-06-28",
- "value": -46.8077796428029
- },
- {
- "date": "2022-06-29",
- "value": -46.69129337715973
- },
- {
- "date": "2022-06-30",
- "value": -46.840619226730716
- },
- {
- "date": "2022-07-01",
- "value": -47.3094852168626
- },
- {
- "date": "2022-07-04",
- "value": -47.57476506455891
- },
- {
- "date": "2022-07-05",
- "value": -47.82857513252915
- },
- {
- "date": "2022-07-06",
- "value": -48.0841962961632
- },
- {
- "date": "2022-07-07",
- "value": -47.98299228440482
- },
- {
- "date": "2022-07-08",
- "value": -47.88341571324466
- },
- {
- "date": "2022-07-11",
- "value": -47.67027625135996
- },
- {
- "date": "2022-07-12",
- "value": -47.19960486851681
- },
- {
- "date": "2022-07-13",
- "value": -48.68092622331927
- },
- {
- "date": "2022-07-14",
- "value": -47.922204856600054
- },
- {
- "date": "2022-07-15",
- "value": -48.060370915248285
- },
- {
- "date": "2022-07-18",
- "value": -47.6826417117101
- },
- {
- "date": "2022-07-19",
- "value": -47.5827058766692
- },
- {
- "date": "2022-07-20",
- "value": -47.74325739562489
- },
- {
- "date": "2022-07-21",
- "value": -47.43132583189915
- },
- {
- "date": "2022-07-22",
- "value": -48.01524363709631
- },
- {
- "date": "2022-07-25",
- "value": -48.0234859454322
- },
- {
- "date": "2022-07-26",
- "value": -48.044189735394305
- },
- {
- "date": "2022-07-27",
- "value": -49.36339347370638
- },
- {
- "date": "2022-07-28",
- "value": -49.51870374649426
- },
- {
- "date": "2022-07-29",
- "value": -49.399584186481306
- },
- {
- "date": "2022-08-01",
- "value": -48.28520817910183
- },
- {
- "date": "2022-08-02",
- "value": -48.02598428464526
- },
- {
- "date": "2022-08-03",
- "value": -48.489328332482856
- },
- {
- "date": "2022-08-04",
- "value": -48.486467291474526
- },
- {
- "date": "2022-08-05",
- "value": -48.428724524004814
- },
- {
- "date": "2022-08-08",
- "value": -48.623817405136826
- },
- {
- "date": "2022-08-09",
- "value": -49.51995437891165
- },
- {
- "date": "2022-08-10",
- "value": -49.76866589149966
- },
- {
- "date": "2022-08-11",
- "value": -49.76625723675744
- },
- {
- "date": "2022-08-12",
- "value": -49.34149911413414
- },
- {
- "date": "2022-08-15",
- "value": -46.1427325393518
- },
- {
- "date": "2022-08-16",
- "value": -46.27135658971943
- },
- {
- "date": "2022-08-17",
- "value": -46.34662968051379
- },
- {
- "date": "2022-08-18",
- "value": -46.40069597661825
- },
- {
- "date": "2022-08-19",
- "value": -46.7328870535123
- },
- {
- "date": "2022-08-22",
- "value": -46.793418901336636
- },
- {
- "date": "2022-08-23",
- "value": -46.532844632196635
- },
- {
- "date": "2022-08-24",
- "value": -46.56162653929384
- },
- {
- "date": "2022-08-25",
- "value": -46.55362147158954
- },
- {
- "date": "2022-08-26",
- "value": -47.2431620453146
- },
- {
- "date": "2022-08-29",
- "value": -47.252999036196165
- },
- {
- "date": "2022-08-30",
- "value": -47.10734470147535
- },
- {
- "date": "2022-08-31",
- "value": -47.29749081881628
- },
- {
- "date": "2022-09-01",
- "value": -48.03974181979452
- },
- {
- "date": "2022-09-02",
- "value": -48.024338892767865
- },
- {
- "date": "2022-09-05",
- "value": -47.61621370678322
- },
- {
- "date": "2022-09-06",
- "value": -47.23008029518652
- },
- {
- "date": "2022-09-07",
- "value": -47.0190981262044
- },
- {
- "date": "2022-09-08",
- "value": -46.88896977270363
- },
- {
- "date": "2022-09-09",
- "value": -46.85375475506762
- },
- {
- "date": "2022-09-12",
- "value": -47.11152285696
- },
- {
- "date": "2022-09-13",
- "value": -46.77095665376406
- },
- {
- "date": "2022-09-14",
- "value": -46.31435658958847
- },
- {
- "date": "2022-09-15",
- "value": -46.31336737440164
- },
- {
- "date": "2022-09-16",
- "value": -46.3133463813651
- },
- {
- "date": "2022-09-19",
- "value": -46.67862611156745
- },
- {
- "date": "2022-09-20",
- "value": -46.691818094493705
- },
- {
- "date": "2022-09-21",
- "value": -46.82311140437831
- },
- {
- "date": "2022-09-22",
- "value": -46.740987397048286
- },
- {
- "date": "2022-09-23",
- "value": -45.89749704100952
- },
- {
- "date": "2022-09-26",
- "value": -45.98289280368821
- },
- {
- "date": "2022-09-27",
- "value": -45.97636303595162
- },
- {
- "date": "2022-09-28",
- "value": -46.57567280308698
- },
- {
- "date": "2022-09-29",
- "value": -46.78255678967493
- },
- {
- "date": "2022-09-30",
- "value": -46.6319192179128
- },
- {
- "date": "2022-10-03",
- "value": -46.39181659812328
- },
- {
- "date": "2022-10-04",
- "value": -46.31231329557254
- },
- {
- "date": "2022-10-05",
- "value": -46.027926282816274
- },
- {
- "date": "2022-10-06",
- "value": -46.062383644507946
- },
- {
- "date": "2022-10-07",
- "value": -46.43767862194547
- },
- {
- "date": "2022-10-10",
- "value": -46.090728103017376
- },
- {
- "date": "2022-10-11",
- "value": -46.32515623565491
- },
- {
- "date": "2022-10-12",
- "value": -45.621292292249265
- },
- {
- "date": "2022-10-13",
- "value": -45.741914562019254
- },
- {
- "date": "2022-10-14",
- "value": -45.764721149776605
- },
- {
- "date": "2022-10-17",
- "value": -46.12360312592148
- },
- {
- "date": "2022-10-18",
- "value": -45.67954748301278
- },
- {
- "date": "2022-10-19",
- "value": -44.92327005268669
- },
- {
- "date": "2022-10-20",
- "value": -44.9361468132304
- },
- {
- "date": "2022-10-21",
- "value": -44.72431592261863
- },
- {
- "date": "2022-10-24",
- "value": -44.56694245094029
- },
- {
- "date": "2022-10-25",
- "value": -44.378061454365465
- },
- {
- "date": "2022-10-26",
- "value": -43.547248975039075
- },
- {
- "date": "2022-10-27",
- "value": -44.211241289002174
- },
- {
- "date": "2022-10-28",
- "value": -43.98214333293305
- },
- {
- "date": "2022-10-31",
- "value": -43.974341014153026
- },
- {
- "date": "2022-11-01",
- "value": -43.226229319806
- },
- {
- "date": "2022-11-02",
- "value": -42.649103559534566
- },
- {
- "date": "2022-11-03",
- "value": -43.11305362402486
- },
- {
- "date": "2022-11-04",
- "value": -43.01073301945384
- },
- {
- "date": "2022-11-07",
- "value": -43.00246972070236
- },
- {
- "date": "2022-11-08",
- "value": -43.004700715318684
- },
- {
- "date": "2022-11-09",
- "value": -43.43292805526232
- },
- {
- "date": "2022-11-10",
- "value": -43.471047738168785
- },
- {
- "date": "2022-11-11",
- "value": -43.378546058264405
- },
- {
- "date": "2022-11-14",
- "value": -43.395330385194654
- },
- {
- "date": "2022-11-15",
- "value": -43.37287983438121
- },
- {
- "date": "2022-11-16",
- "value": -43.656290979697594
- },
- {
- "date": "2022-11-17",
- "value": -43.6647037882319
- },
- {
- "date": "2022-11-18",
- "value": -43.35088635532934
- },
- {
- "date": "2022-11-21",
- "value": -42.23021131593194
- },
- {
- "date": "2022-11-22",
- "value": -42.56600332209104
- },
- {
- "date": "2022-11-23",
- "value": -42.49432173016935
- },
- {
- "date": "2022-11-24",
- "value": -42.67517919852687
- },
- {
- "date": "2022-11-25",
- "value": -42.750065164184434
- },
- {
- "date": "2022-11-28",
- "value": -43.14417687761632
- },
- {
- "date": "2022-11-29",
- "value": -43.096211045462915
- },
- {
- "date": "2022-11-30",
- "value": -42.94277818929717
- },
- {
- "date": "2022-12-01",
- "value": -42.92433761048164
- },
- {
- "date": "2022-12-02",
- "value": -42.74035217998319
- },
- {
- "date": "2022-12-05",
- "value": -42.707602700791966
- },
- {
- "date": "2022-12-06",
- "value": -42.66679908240009
- },
- {
- "date": "2022-12-07",
- "value": -42.676682877547606
- },
- {
- "date": "2022-12-08",
- "value": -42.964369019070624
- },
- {
- "date": "2022-12-09",
- "value": -42.677861676811155
- },
- {
- "date": "2022-12-12",
- "value": -42.59152683511461
- },
- {
- "date": "2022-12-13",
- "value": -42.53696635908492
- },
- {
- "date": "2022-12-14",
- "value": -42.52051972547619
- },
- {
- "date": "2022-12-15",
- "value": -42.80547014317991
- },
- {
- "date": "2022-12-16",
- "value": -42.73220739539409
- },
- {
- "date": "2022-12-19",
- "value": -42.84376396945771
- },
- {
- "date": "2022-12-20",
- "value": -42.84569160530289
- },
- {
- "date": "2022-12-21",
- "value": -43.00977645063594
- },
- {
- "date": "2022-12-22",
- "value": -43.10080263794774
- },
- {
- "date": "2022-12-23",
- "value": -43.07545175428431
- },
- {
- "date": "2022-12-26",
- "value": -42.73660475706003
- },
- {
- "date": "2022-12-27",
- "value": -42.6587092092242
- },
- {
- "date": "2022-12-28",
- "value": -42.84744959221684
- },
- {
- "date": "2022-12-29",
- "value": -42.916287717802
- },
- {
- "date": "2022-12-30",
- "value": -42.89198317071697
- },
- {
- "date": "2023-01-02",
- "value": -42.931003920357526
- },
- {
- "date": "2023-01-03",
- "value": -43.253460958189045
- },
- {
- "date": "2023-01-04",
- "value": -43.60060069085764
- },
- {
- "date": "2023-01-05",
- "value": -43.653415665776734
- },
- {
- "date": "2023-01-06",
- "value": -44.12606357476967
- },
- {
- "date": "2023-01-09",
- "value": -44.12962117840251
- },
- {
- "date": "2023-01-10",
- "value": -44.160966234768495
- },
- {
- "date": "2023-01-11",
- "value": -44.48847968254713
- },
- {
- "date": "2023-01-12",
- "value": -43.442838149550255
- },
- {
- "date": "2023-01-13",
- "value": -43.773664136056865
- },
- {
- "date": "2023-01-16",
- "value": -43.88269433864633
- },
- {
- "date": "2023-01-17",
- "value": -43.66037926480316
- },
- {
- "date": "2023-01-18",
- "value": -43.47655983167016
- },
- {
- "date": "2023-01-19",
- "value": -42.77428581529256
- },
- {
- "date": "2023-01-20",
- "value": -42.81572991453831
- },
- {
- "date": "2023-01-23",
- "value": -42.646329844673645
- },
- {
- "date": "2023-01-24",
- "value": -43.520377788239244
- },
- {
- "date": "2023-01-25",
- "value": -43.72453082242308
- },
- {
- "date": "2023-01-26",
- "value": -42.89479227638277
- },
- {
- "date": "2023-01-27",
- "value": -42.84633995671555
- },
- {
- "date": "2023-01-30",
- "value": -43.18349636731249
- },
- {
- "date": "2023-01-31",
- "value": -43.34051703887034
- },
- {
- "date": "2023-02-01",
- "value": -43.281016371842
- },
- {
- "date": "2023-02-02",
- "value": -43.20648513499742
- },
- {
- "date": "2023-02-03",
- "value": -42.89378171052384
- },
- {
- "date": "2023-02-06",
- "value": -43.30471192838252
- },
- {
- "date": "2023-02-07",
- "value": -45.88220910916782
- },
- {
- "date": "2023-02-08",
- "value": -45.85100371923284
- },
- {
- "date": "2023-02-09",
- "value": -45.34679108035061
- },
- {
- "date": "2023-02-10",
- "value": -45.487924582379485
- },
- {
- "date": "2023-02-13",
- "value": -45.43789928521629
- },
- {
- "date": "2023-02-14",
- "value": -45.25923559284493
- },
- {
- "date": "2023-02-15",
- "value": -45.45722432523736
- },
- {
- "date": "2023-02-16",
- "value": -45.44904678558626
- },
- {
- "date": "2023-02-17",
- "value": -45.19210489695797
- },
- {
- "date": "2023-02-20",
- "value": -45.2035855836128
- },
- {
- "date": "2023-02-21",
- "value": -45.09046748251004
- },
- {
- "date": "2023-02-22",
- "value": -45.157582102663454
- },
- {
- "date": "2023-02-23",
- "value": -44.67452423934894
- },
- {
- "date": "2023-02-24",
- "value": -44.58622850045172
- },
- {
- "date": "2023-02-27",
- "value": -44.4666530144336
- },
- {
- "date": "2023-02-28",
- "value": -44.68123010618957
- },
- {
- "date": "2023-03-01",
- "value": -44.939361372775764
- },
- {
- "date": "2023-03-02",
- "value": -44.59110107489021
- },
- {
- "date": "2023-03-03",
- "value": -44.65983121559474
- },
- {
- "date": "2023-03-06",
- "value": -44.60924665513301
- },
- {
- "date": "2023-03-07",
- "value": -44.482784764244066
- },
- {
- "date": "2023-03-08",
- "value": -44.14901796802155
- },
- {
- "date": "2023-03-09",
- "value": -44.31149187178775
- },
- {
- "date": "2023-03-10",
- "value": -44.081435747246125
- },
- {
- "date": "2023-03-13",
- "value": -44.13761224214945
- },
- {
- "date": "2023-03-14",
- "value": -43.91169257437105
- },
- {
- "date": "2023-03-15",
- "value": -43.899305350315515
- },
- {
- "date": "2023-03-16",
- "value": -43.83531406283612
- },
- {
- "date": "2023-03-17",
- "value": -43.96145220092596
- },
- {
- "date": "2023-03-20",
- "value": -44.57488433779829
- },
- {
- "date": "2023-03-21",
- "value": -44.54853015251555
- },
- {
- "date": "2023-03-22",
- "value": -44.51504844425376
- },
- {
- "date": "2023-03-23",
- "value": -44.52317276652188
- },
- {
- "date": "2023-03-24",
- "value": -44.55500542314319
- },
- {
- "date": "2023-03-27",
- "value": -44.97688191700164
- },
- {
- "date": "2023-03-28",
- "value": -45.325405521151986
- },
- {
- "date": "2023-03-29",
- "value": -45.193569474962004
- },
- {
- "date": "2023-03-30",
- "value": -45.395577053157815
- },
- {
- "date": "2023-03-31",
- "value": -45.14221840570411
- },
- {
- "date": "2023-04-03",
- "value": -44.956884867529716
- },
- {
- "date": "2023-04-04",
- "value": -45.18003661349423
- },
- {
- "date": "2023-04-05",
- "value": -44.42956295644702
- },
- {
- "date": "2023-04-06",
- "value": -45.095999499805345
- },
- {
- "date": "2023-04-07",
- "value": -45.14127500433212
- },
- {
- "date": "2023-04-10",
- "value": -44.25613276208458
- },
- {
- "date": "2023-04-11",
- "value": -44.213389947089205
- },
- {
- "date": "2023-04-12",
- "value": -44.50995479163519
- },
- {
- "date": "2023-04-13",
- "value": -45.316749450577454
- },
- {
- "date": "2023-04-14",
- "value": -44.152195827948
- },
- {
- "date": "2023-04-17",
- "value": -44.308115237029845
- },
- {
- "date": "2023-04-18",
- "value": -44.506386918857984
- },
- {
- "date": "2023-04-19",
- "value": -44.6826339632907
- },
- {
- "date": "2023-04-20",
- "value": -45.38798095969449
- },
- {
- "date": "2023-04-21",
- "value": -45.439312230116705
- },
- {
- "date": "2023-04-24",
- "value": -45.21896317595053
- },
- {
- "date": "2023-04-25",
- "value": -45.20602671975826
- },
- {
- "date": "2023-04-26",
- "value": -46.22235738570344
- },
- {
- "date": "2023-04-27",
- "value": -46.84075495083485
- },
- {
- "date": "2023-04-28",
- "value": -45.50181626534017
- },
- {
- "date": "2023-05-01",
- "value": -45.37193144433643
- },
- {
- "date": "2023-05-02",
- "value": -45.24364021172596
- },
- {
- "date": "2023-05-03",
- "value": -45.32287958780878
- },
- {
- "date": "2023-05-04",
- "value": -45.55609656560482
- },
- {
- "date": "2023-05-05",
- "value": -45.77858179343577
- },
- {
- "date": "2023-05-08",
- "value": -45.92830763895354
- },
- {
- "date": "2023-05-09",
- "value": -45.87280627533537
- },
- {
- "date": "2023-05-10",
- "value": -45.853791624450736
- },
- {
- "date": "2023-05-11",
- "value": -45.49220834922897
- },
- {
- "date": "2023-05-12",
- "value": -45.076410642832805
- },
- {
- "date": "2023-05-15",
- "value": -45.32395289805268
- },
- {
- "date": "2023-05-16",
- "value": -46.687395993719804
- },
- {
- "date": "2023-05-17",
- "value": -46.45651676895497
- },
- {
- "date": "2023-05-18",
- "value": -46.40374042013702
- },
- {
- "date": "2023-05-19",
- "value": -46.43008163676558
- },
- {
- "date": "2023-05-22",
- "value": -46.40914043524608
- },
- {
- "date": "2023-05-23",
- "value": -45.463339592578535
- },
- {
- "date": "2023-05-24",
- "value": -45.29062478288522
- },
- {
- "date": "2023-05-25",
- "value": -43.42068308266848
- },
- {
- "date": "2023-05-26",
- "value": -43.132183868822814
- },
- {
- "date": "2023-05-29",
- "value": -43.15596502326843
- },
- {
- "date": "2023-05-30",
- "value": -43.182266830392045
- },
- {
- "date": "2023-05-31",
- "value": -43.19939044145629
- },
- {
- "date": "2023-06-01",
- "value": -43.173113572765324
- },
- {
- "date": "2023-06-02",
- "value": -42.58257915276001
- },
- {
- "date": "2023-06-05",
- "value": -41.21551451977261
- },
- {
- "date": "2023-06-06",
- "value": -41.31306562816233
- },
- {
- "date": "2023-06-07",
- "value": -40.978447001499404
- },
- {
- "date": "2023-06-08",
- "value": -40.804404826709956
- },
- {
- "date": "2023-06-09",
- "value": -40.77569177056704
- },
- {
- "date": "2023-06-12",
- "value": -40.297643098684254
- },
- {
- "date": "2023-06-13",
- "value": -40.30624413257228
- },
- {
- "date": "2023-06-14",
- "value": -40.29109604324112
- },
- {
- "date": "2023-06-15",
- "value": -40.270486876685986
- },
- {
- "date": "2023-06-16",
- "value": -40.2963979758846
- },
- {
- "date": "2023-06-19",
- "value": -40.297309736106705
- },
- {
- "date": "2023-06-20",
- "value": -40.79636577433415
- },
- {
- "date": "2023-06-21",
- "value": -40.804458475863065
- },
- {
- "date": "2023-06-22",
- "value": -40.70399854748913
- },
- {
- "date": "2023-06-23",
- "value": -40.72870539650954
- },
- {
- "date": "2023-06-26",
- "value": -40.297997799161436
- },
- {
- "date": "2023-06-27",
- "value": -39.94086336610613
- },
- {
- "date": "2023-06-28",
- "value": -39.908432784149326
- },
- {
- "date": "2023-06-29",
- "value": -39.793654763993885
- },
- {
- "date": "2023-06-30",
- "value": -39.88707839006434
- },
- {
- "date": "2023-07-03",
- "value": -40.0256004241589
- },
- {
- "date": "2023-07-04",
- "value": -40.02648874467419
- },
- {
- "date": "2023-07-05",
- "value": -40.217492050968175
- },
- {
- "date": "2023-07-06",
- "value": -40.33863566545978
- },
- {
- "date": "2023-07-07",
- "value": -41.22324206066041
- },
- {
- "date": "2023-07-10",
- "value": -41.20415973642279
- },
- {
- "date": "2023-07-11",
- "value": -41.24150225679602
- },
- {
- "date": "2023-07-12",
- "value": -41.28124367436584
- },
- {
- "date": "2023-07-13",
- "value": -41.554322382274634
- },
- {
- "date": "2023-07-14",
- "value": -42.356823849332095
- },
- {
- "date": "2023-07-17",
- "value": -42.22966045479802
- },
- {
- "date": "2023-07-18",
- "value": -42.09098313638343
- },
- {
- "date": "2023-07-19",
- "value": -42.09197477175278
- },
- {
- "date": "2023-07-20",
- "value": -42.04336376556133
- },
- {
- "date": "2023-07-21",
- "value": -42.41262112384793
- },
- {
- "date": "2023-07-24",
- "value": -42.41254715089136
- },
- {
- "date": "2023-07-25",
- "value": -41.976949454976236
- },
- {
- "date": "2023-07-26",
- "value": -41.92678832898597
- },
- {
- "date": "2023-07-27",
- "value": -41.97384031027158
- },
- {
- "date": "2023-07-28",
- "value": -41.821794256309445
- },
- {
- "date": "2023-07-31",
- "value": -42.07436833916447
- },
- {
- "date": "2023-08-01",
- "value": -42.04498604250201
- },
- {
- "date": "2023-08-02",
- "value": -42.215528570171074
- },
- {
- "date": "2023-08-03",
- "value": -42.202410394149254
- },
- {
- "date": "2023-08-04",
- "value": -42.73396500238902
- },
- {
- "date": "2023-08-07",
- "value": -42.49051015638709
- },
- {
- "date": "2023-08-08",
- "value": -42.543414405073875
- },
- {
- "date": "2023-08-09",
- "value": -42.139270828396896
- },
- {
- "date": "2023-08-10",
- "value": -42.182062784959
- },
- {
- "date": "2023-08-11",
- "value": -41.54896309561613
- },
- {
- "date": "2023-08-14",
- "value": -41.483058397450534
- },
- {
- "date": "2023-08-15",
- "value": -40.66130458412212
- },
- {
- "date": "2023-08-16",
- "value": -39.64769292017008
- },
- {
- "date": "2023-08-17",
- "value": -39.6833218811221
- },
- {
- "date": "2023-08-18",
- "value": -39.91784950004277
- },
- {
- "date": "2023-08-21",
- "value": -39.87603332381206
- },
- {
- "date": "2023-08-22",
- "value": -39.932258005852
- },
- {
- "date": "2023-08-23",
- "value": -40.04905187824905
- },
- {
- "date": "2023-08-24",
- "value": -39.75626423568918
- },
- {
- "date": "2023-08-25",
- "value": -40.1743402878126
- },
- {
- "date": "2023-08-28",
- "value": -39.969820106629534
- },
- {
- "date": "2023-08-29",
- "value": -40.077792431947216
- },
- {
- "date": "2023-08-30",
- "value": -40.11842351267732
- },
- {
- "date": "2023-08-31",
- "value": -40.62303747999593
- },
- {
- "date": "2023-09-01",
- "value": -40.81916746455671
- },
- {
- "date": "2023-09-04",
- "value": -41.05048926326658
- },
- {
- "date": "2023-09-05",
- "value": -40.847587738535715
- },
- {
- "date": "2023-09-06",
- "value": -40.355865478728695
- },
- {
- "date": "2023-09-07",
- "value": -40.233366913262266
- },
- {
- "date": "2023-09-08",
- "value": -39.46195515345874
- },
- {
- "date": "2023-09-11",
- "value": -39.46176062261705
- },
- {
- "date": "2023-09-12",
- "value": -39.494925006108566
- },
- {
- "date": "2023-09-13",
- "value": -39.398893480731324
- },
- {
- "date": "2023-09-14",
- "value": -39.38175836821938
- },
- {
- "date": "2023-09-15",
- "value": -38.187924497873624
- },
- {
- "date": "2023-09-18",
- "value": -38.196053409149314
- },
- {
- "date": "2023-09-19",
- "value": -38.225266429630686
- },
- {
- "date": "2023-09-20",
- "value": -38.194155446639584
- },
- {
- "date": "2023-09-21",
- "value": -38.30484184974148
- },
- {
- "date": "2023-09-22",
- "value": -37.64510269212615
- },
- {
- "date": "2023-09-25",
- "value": -37.8045229052574
- },
- {
- "date": "2023-09-26",
- "value": -37.80016816258572
- },
- {
- "date": "2023-09-27",
- "value": -37.892697920552514
- },
- {
- "date": "2023-09-28",
- "value": -38.30183048187201
- },
- {
- "date": "2023-09-29",
- "value": -38.29168117788573
- },
- {
- "date": "2023-10-02",
- "value": -37.91031107768021
- },
- {
- "date": "2023-10-03",
- "value": -38.5119393373163
- },
- {
- "date": "2023-10-04",
- "value": -38.34158431341362
- },
- {
- "date": "2023-10-05",
- "value": -38.3223356490599
- },
- {
- "date": "2023-10-06",
- "value": -38.141692664418755
- },
- {
- "date": "2023-10-09",
- "value": -38.88984223919421
- },
- {
- "date": "2023-10-10",
- "value": -38.81369823729917
- },
- {
- "date": "2023-10-11",
- "value": -38.47745441157
- },
- {
- "date": "2023-10-12",
- "value": -38.30859056617639
- },
- {
- "date": "2023-10-13",
- "value": -38.383552711261494
- },
- {
- "date": "2023-10-16",
- "value": -38.04204787904703
- },
- {
- "date": "2023-10-17",
- "value": -38.08480895047849
- },
- {
- "date": "2023-10-18",
- "value": -38.01684064330877
- },
- {
- "date": "2023-10-19",
- "value": -37.888970066035135
- },
- {
- "date": "2023-10-20",
- "value": -37.87333464326343
- },
- {
- "date": "2023-10-23",
- "value": -38.6352054376864
- },
- {
- "date": "2023-10-24",
- "value": -38.43973607543679
- },
- {
- "date": "2023-10-25",
- "value": -38.584598071306544
- },
- {
- "date": "2023-10-26",
- "value": -38.21538088866472
- },
- {
- "date": "2023-10-27",
- "value": -38.10991224010419
- },
- {
- "date": "2023-10-30",
- "value": -38.106475145286524
- },
- {
- "date": "2023-10-31",
- "value": -37.91081724240727
+ "metadata": {
+ "title": "AlgoSystem Trading Dashboard",
+ "start_date": "2020-01-01",
+ "end_date": "2023-10-31",
+ "total_return": 16.89738612587541,
+ "initial_capital": 100.04928216116915,
+ "final_capital": 116.95499568410848,
+ "run_date": "2025-05-05 17:30:16"
+ },
+ "metrics": {
+ "annual_return": {
+ "id": "annual_return",
+ "title": "Annualized Return",
+ "type": "Percentage",
+ "value": 0,
+ "position": {
+ "row": 0,
+ "col": 0
}
- ],
- "monthly_returns": [
- {
- "date": "2020-01-31",
- "value": 0.06865014834105287
- },
- {
- "date": "2020-02-29",
- "value": 0.06042602306224176
- },
- {
- "date": "2020-03-31",
- "value": -0.02453205128429814
- },
- {
- "date": "2020-04-30",
- "value": -0.0173650204222896
- },
- {
- "date": "2020-05-31",
- "value": 0.03950626913415678
- },
- {
- "date": "2020-06-30",
- "value": 0.0015243517362180103
- },
- {
- "date": "2020-07-31",
- "value": -0.0006244804747685961
- },
- {
- "date": "2020-08-31",
- "value": -0.03345022494959138
- },
- {
- "date": "2020-09-30",
- "value": -0.0005054303824160167
- },
- {
- "date": "2020-10-31",
- "value": -0.054740644809139094
- },
- {
- "date": "2020-11-30",
- "value": 0.04282973766880871
- },
- {
- "date": "2020-12-31",
- "value": 0.0302043382060726
- },
- {
- "date": "2021-01-31",
- "value": 0.01821435145487227
- },
- {
- "date": "2021-02-28",
- "value": 0.03334307497823441
- },
- {
- "date": "2021-03-31",
- "value": -0.03495764148170355
- },
- {
- "date": "2021-04-30",
- "value": -0.021487321274960447
- },
- {
- "date": "2021-05-31",
- "value": -0.009687250256286917
- },
- {
- "date": "2021-06-30",
- "value": -0.011079845479772699
- },
- {
- "date": "2021-07-31",
- "value": 0.09486737626450359
- },
- {
- "date": "2021-08-31",
- "value": 0.1201699704652035
- },
- {
- "date": "2021-09-30",
- "value": 0.012499851542561391
- },
- {
- "date": "2021-10-31",
- "value": 0.06213473206827991
- },
- {
- "date": "2021-11-30",
- "value": 0.0011270257346189805
- },
- {
- "date": "2021-12-31",
- "value": 0.12243839646812993
- },
- {
- "date": "2022-01-31",
- "value": 0.06477600398172245
- },
- {
- "date": "2022-02-28",
- "value": 0.10347277418143497
- },
- {
- "date": "2022-03-31",
- "value": -0.030836129490708464
- },
- {
- "date": "2022-04-30",
- "value": -0.006863099510742154
- },
- {
- "date": "2022-05-31",
- "value": -0.018500310991956925
- },
- {
- "date": "2022-06-30",
- "value": -0.021921968719219143
- },
- {
- "date": "2022-07-31",
- "value": 0.03725295527889538
- },
- {
- "date": "2022-08-31",
- "value": 0.030525881994598825
- },
- {
- "date": "2022-09-30",
- "value": 0.024925059973859298
- },
- {
- "date": "2022-10-31",
- "value": -0.028652297843686503
- },
- {
- "date": "2022-11-30",
- "value": 0.03127894968847755
- },
- {
- "date": "2022-12-31",
- "value": -0.02017693938245524
- },
- {
- "date": "2023-01-31",
- "value": -0.0005046887628690211
- },
- {
- "date": "2023-02-28",
- "value": -0.009331945741649972
- },
- {
- "date": "2023-03-31",
- "value": -0.04878379157625412
- },
- {
- "date": "2023-04-30",
- "value": -0.0009814229091111848
- },
- {
- "date": "2023-05-31",
- "value": 0.019749010846265902
- },
- {
- "date": "2023-06-30",
- "value": 0.06656149972430003
- },
- {
- "date": "2023-07-31",
- "value": -0.023636532952472145
- },
- {
- "date": "2023-08-31",
- "value": 0.013164123477925838
- },
- {
- "date": "2023-09-30",
- "value": -0.07759771866113996
- },
- {
- "date": "2023-10-31",
- "value": 0.08413636347281495
+ },
+ "volatility": {
+ "id": "volatility",
+ "title": "Volatility",
+ "type": "Percentage",
+ "value": 0,
+ "position": {
+ "row": 0,
+ "col": 1
+ }
+ },
+ "sharpe_ratio": {
+ "id": "sharpe_ratio",
+ "title": "Sharpe Ratio",
+ "type": "Value",
+ "value": 0.32619165105959474,
+ "position": {
+ "row": 0,
+ "col": 2
+ }
+ },
+ "max_drawdown": {
+ "id": "max_drawdown",
+ "title": "Max Drawdown",
+ "type": "Percentage",
+ "value": -38.622794888060916,
+ "position": {
+ "row": 0,
+ "col": 3
}
- ]
+ }
},
- "start_date": "2020-01-01",
- "end_date": "2023-10-31",
- "total_return": 88.9702525715222
+ "charts": {
+ "equity_curve": {
+ "id": "equity_curve",
+ "title": "Equity Curve",
+ "type": "LineChart",
+ "data": {
+ "labels": [
+ "2020-01-01",
+ "2020-01-02",
+ "2020-01-03",
+ "2020-01-06",
+ "2020-01-07",
+ "2020-01-08",
+ "2020-01-09",
+ "2020-01-10",
+ "2020-01-13",
+ "2020-01-14",
+ "2020-01-15",
+ "2020-01-16",
+ "2020-01-17",
+ "2020-01-20",
+ "2020-01-21",
+ "2020-01-22",
+ "2020-01-23",
+ "2020-01-24",
+ "2020-01-27",
+ "2020-01-28",
+ "2020-01-29",
+ "2020-01-30",
+ "2020-01-31",
+ "2020-02-03",
+ "2020-02-04",
+ "2020-02-05",
+ "2020-02-06",
+ "2020-02-07",
+ "2020-02-10",
+ "2020-02-11",
+ "2020-02-12",
+ "2020-02-13",
+ "2020-02-14",
+ "2020-02-17",
+ "2020-02-18",
+ "2020-02-19",
+ "2020-02-20",
+ "2020-02-21",
+ "2020-02-24",
+ "2020-02-25",
+ "2020-02-26",
+ "2020-02-27",
+ "2020-02-28",
+ "2020-03-02",
+ "2020-03-03",
+ "2020-03-04",
+ "2020-03-05",
+ "2020-03-06",
+ "2020-03-09",
+ "2020-03-10",
+ "2020-03-11",
+ "2020-03-12",
+ "2020-03-13",
+ "2020-03-16",
+ "2020-03-17",
+ "2020-03-18",
+ "2020-03-19",
+ "2020-03-20",
+ "2020-03-23",
+ "2020-03-24",
+ "2020-03-25",
+ "2020-03-26",
+ "2020-03-27",
+ "2020-03-30",
+ "2020-03-31",
+ "2020-04-01",
+ "2020-04-02",
+ "2020-04-03",
+ "2020-04-06",
+ "2020-04-07",
+ "2020-04-08",
+ "2020-04-09",
+ "2020-04-10",
+ "2020-04-13",
+ "2020-04-14",
+ "2020-04-15",
+ "2020-04-16",
+ "2020-04-17",
+ "2020-04-20",
+ "2020-04-21",
+ "2020-04-22",
+ "2020-04-23",
+ "2020-04-24",
+ "2020-04-27",
+ "2020-04-28",
+ "2020-04-29",
+ "2020-04-30",
+ "2020-05-01",
+ "2020-05-04",
+ "2020-05-05",
+ "2020-05-06",
+ "2020-05-07",
+ "2020-05-08",
+ "2020-05-11",
+ "2020-05-12",
+ "2020-05-13",
+ "2020-05-14",
+ "2020-05-15",
+ "2020-05-18",
+ "2020-05-19",
+ "2020-05-20",
+ "2020-05-21",
+ "2020-05-22",
+ "2020-05-25",
+ "2020-05-26",
+ "2020-05-27",
+ "2020-05-28",
+ "2020-05-29",
+ "2020-06-01",
+ "2020-06-02",
+ "2020-06-03",
+ "2020-06-04",
+ "2020-06-05",
+ "2020-06-08",
+ "2020-06-09",
+ "2020-06-10",
+ "2020-06-11",
+ "2020-06-12",
+ "2020-06-15",
+ "2020-06-16",
+ "2020-06-17",
+ "2020-06-18",
+ "2020-06-19",
+ "2020-06-22",
+ "2020-06-23",
+ "2020-06-24",
+ "2020-06-25",
+ "2020-06-26",
+ "2020-06-29",
+ "2020-06-30",
+ "2020-07-01",
+ "2020-07-02",
+ "2020-07-03",
+ "2020-07-06",
+ "2020-07-07",
+ "2020-07-08",
+ "2020-07-09",
+ "2020-07-10",
+ "2020-07-13",
+ "2020-07-14",
+ "2020-07-15",
+ "2020-07-16",
+ "2020-07-17",
+ "2020-07-20",
+ "2020-07-21",
+ "2020-07-22",
+ "2020-07-23",
+ "2020-07-24",
+ "2020-07-27",
+ "2020-07-28",
+ "2020-07-29",
+ "2020-07-30",
+ "2020-07-31",
+ "2020-08-03",
+ "2020-08-04",
+ "2020-08-05",
+ "2020-08-06",
+ "2020-08-07",
+ "2020-08-10",
+ "2020-08-11",
+ "2020-08-12",
+ "2020-08-13",
+ "2020-08-14",
+ "2020-08-17",
+ "2020-08-18",
+ "2020-08-19",
+ "2020-08-20",
+ "2020-08-21",
+ "2020-08-24",
+ "2020-08-25",
+ "2020-08-26",
+ "2020-08-27",
+ "2020-08-28",
+ "2020-08-31",
+ "2020-09-01",
+ "2020-09-02",
+ "2020-09-03",
+ "2020-09-04",
+ "2020-09-07",
+ "2020-09-08",
+ "2020-09-09",
+ "2020-09-10",
+ "2020-09-11",
+ "2020-09-14",
+ "2020-09-15",
+ "2020-09-16",
+ "2020-09-17",
+ "2020-09-18",
+ "2020-09-21",
+ "2020-09-22",
+ "2020-09-23",
+ "2020-09-24",
+ "2020-09-25",
+ "2020-09-28",
+ "2020-09-29",
+ "2020-09-30",
+ "2020-10-01",
+ "2020-10-02",
+ "2020-10-05",
+ "2020-10-06",
+ "2020-10-07",
+ "2020-10-08",
+ "2020-10-09",
+ "2020-10-12",
+ "2020-10-13",
+ "2020-10-14",
+ "2020-10-15",
+ "2020-10-16",
+ "2020-10-19",
+ "2020-10-20",
+ "2020-10-21",
+ "2020-10-22",
+ "2020-10-23",
+ "2020-10-26",
+ "2020-10-27",
+ "2020-10-28",
+ "2020-10-29",
+ "2020-10-30",
+ "2020-11-02",
+ "2020-11-03",
+ "2020-11-04",
+ "2020-11-05",
+ "2020-11-06",
+ "2020-11-09",
+ "2020-11-10",
+ "2020-11-11",
+ "2020-11-12",
+ "2020-11-13",
+ "2020-11-16",
+ "2020-11-17",
+ "2020-11-18",
+ "2020-11-19",
+ "2020-11-20",
+ "2020-11-23",
+ "2020-11-24",
+ "2020-11-25",
+ "2020-11-26",
+ "2020-11-27",
+ "2020-11-30",
+ "2020-12-01",
+ "2020-12-02",
+ "2020-12-03",
+ "2020-12-04",
+ "2020-12-07",
+ "2020-12-08",
+ "2020-12-09",
+ "2020-12-10",
+ "2020-12-11",
+ "2020-12-14",
+ "2020-12-15",
+ "2020-12-16",
+ "2020-12-17",
+ "2020-12-18",
+ "2020-12-21",
+ "2020-12-22",
+ "2020-12-23",
+ "2020-12-24",
+ "2020-12-25",
+ "2020-12-28",
+ "2020-12-29",
+ "2020-12-30",
+ "2020-12-31",
+ "2021-01-01",
+ "2021-01-04",
+ "2021-01-05",
+ "2021-01-06",
+ "2021-01-07",
+ "2021-01-08",
+ "2021-01-11",
+ "2021-01-12",
+ "2021-01-13",
+ "2021-01-14",
+ "2021-01-15",
+ "2021-01-18",
+ "2021-01-19",
+ "2021-01-20",
+ "2021-01-21",
+ "2021-01-22",
+ "2021-01-25",
+ "2021-01-26",
+ "2021-01-27",
+ "2021-01-28",
+ "2021-01-29",
+ "2021-02-01",
+ "2021-02-02",
+ "2021-02-03",
+ "2021-02-04",
+ "2021-02-05",
+ "2021-02-08",
+ "2021-02-09",
+ "2021-02-10",
+ "2021-02-11",
+ "2021-02-12",
+ "2021-02-15",
+ "2021-02-16",
+ "2021-02-17",
+ "2021-02-18",
+ "2021-02-19",
+ "2021-02-22",
+ "2021-02-23",
+ "2021-02-24",
+ "2021-02-25",
+ "2021-02-26",
+ "2021-03-01",
+ "2021-03-02",
+ "2021-03-03",
+ "2021-03-04",
+ "2021-03-05",
+ "2021-03-08",
+ "2021-03-09",
+ "2021-03-10",
+ "2021-03-11",
+ "2021-03-12",
+ "2021-03-15",
+ "2021-03-16",
+ "2021-03-17",
+ "2021-03-18",
+ "2021-03-19",
+ "2021-03-22",
+ "2021-03-23",
+ "2021-03-24",
+ "2021-03-25",
+ "2021-03-26",
+ "2021-03-29",
+ "2021-03-30",
+ "2021-03-31",
+ "2021-04-01",
+ "2021-04-02",
+ "2021-04-05",
+ "2021-04-06",
+ "2021-04-07",
+ "2021-04-08",
+ "2021-04-09",
+ "2021-04-12",
+ "2021-04-13",
+ "2021-04-14",
+ "2021-04-15",
+ "2021-04-16",
+ "2021-04-19",
+ "2021-04-20",
+ "2021-04-21",
+ "2021-04-22",
+ "2021-04-23",
+ "2021-04-26",
+ "2021-04-27",
+ "2021-04-28",
+ "2021-04-29",
+ "2021-04-30",
+ "2021-05-03",
+ "2021-05-04",
+ "2021-05-05",
+ "2021-05-06",
+ "2021-05-07",
+ "2021-05-10",
+ "2021-05-11",
+ "2021-05-12",
+ "2021-05-13",
+ "2021-05-14",
+ "2021-05-17",
+ "2021-05-18",
+ "2021-05-19",
+ "2021-05-20",
+ "2021-05-21",
+ "2021-05-24",
+ "2021-05-25",
+ "2021-05-26",
+ "2021-05-27",
+ "2021-05-28",
+ "2021-05-31",
+ "2021-06-01",
+ "2021-06-02",
+ "2021-06-03",
+ "2021-06-04",
+ "2021-06-07",
+ "2021-06-08",
+ "2021-06-09",
+ "2021-06-10",
+ "2021-06-11",
+ "2021-06-14",
+ "2021-06-15",
+ "2021-06-16",
+ "2021-06-17",
+ "2021-06-18",
+ "2021-06-21",
+ "2021-06-22",
+ "2021-06-23",
+ "2021-06-24",
+ "2021-06-25",
+ "2021-06-28",
+ "2021-06-29",
+ "2021-06-30",
+ "2021-07-01",
+ "2021-07-02",
+ "2021-07-05",
+ "2021-07-06",
+ "2021-07-07",
+ "2021-07-08",
+ "2021-07-09",
+ "2021-07-12",
+ "2021-07-13",
+ "2021-07-14",
+ "2021-07-15",
+ "2021-07-16",
+ "2021-07-19",
+ "2021-07-20",
+ "2021-07-21",
+ "2021-07-22",
+ "2021-07-23",
+ "2021-07-26",
+ "2021-07-27",
+ "2021-07-28",
+ "2021-07-29",
+ "2021-07-30",
+ "2021-08-02",
+ "2021-08-03",
+ "2021-08-04",
+ "2021-08-05",
+ "2021-08-06",
+ "2021-08-09",
+ "2021-08-10",
+ "2021-08-11",
+ "2021-08-12",
+ "2021-08-13",
+ "2021-08-16",
+ "2021-08-17",
+ "2021-08-18",
+ "2021-08-19",
+ "2021-08-20",
+ "2021-08-23",
+ "2021-08-24",
+ "2021-08-25",
+ "2021-08-26",
+ "2021-08-27",
+ "2021-08-30",
+ "2021-08-31",
+ "2021-09-01",
+ "2021-09-02",
+ "2021-09-03",
+ "2021-09-06",
+ "2021-09-07",
+ "2021-09-08",
+ "2021-09-09",
+ "2021-09-10",
+ "2021-09-13",
+ "2021-09-14",
+ "2021-09-15",
+ "2021-09-16",
+ "2021-09-17",
+ "2021-09-20",
+ "2021-09-21",
+ "2021-09-22",
+ "2021-09-23",
+ "2021-09-24",
+ "2021-09-27",
+ "2021-09-28",
+ "2021-09-29",
+ "2021-09-30",
+ "2021-10-01",
+ "2021-10-04",
+ "2021-10-05",
+ "2021-10-06",
+ "2021-10-07",
+ "2021-10-08",
+ "2021-10-11",
+ "2021-10-12",
+ "2021-10-13",
+ "2021-10-14",
+ "2021-10-15",
+ "2021-10-18",
+ "2021-10-19",
+ "2021-10-20",
+ "2021-10-21",
+ "2021-10-22",
+ "2021-10-25",
+ "2021-10-26",
+ "2021-10-27",
+ "2021-10-28",
+ "2021-10-29",
+ "2021-11-01",
+ "2021-11-02",
+ "2021-11-03",
+ "2021-11-04",
+ "2021-11-05",
+ "2021-11-08",
+ "2021-11-09",
+ "2021-11-10",
+ "2021-11-11",
+ "2021-11-12",
+ "2021-11-15",
+ "2021-11-16",
+ "2021-11-17",
+ "2021-11-18",
+ "2021-11-19",
+ "2021-11-22",
+ "2021-11-23",
+ "2021-11-24",
+ "2021-11-25",
+ "2021-11-26",
+ "2021-11-29",
+ "2021-11-30",
+ "2021-12-01",
+ "2021-12-02",
+ "2021-12-03",
+ "2021-12-06",
+ "2021-12-07",
+ "2021-12-08",
+ "2021-12-09",
+ "2021-12-10",
+ "2021-12-13",
+ "2021-12-14",
+ "2021-12-15",
+ "2021-12-16",
+ "2021-12-17",
+ "2021-12-20",
+ "2021-12-21",
+ "2021-12-22",
+ "2021-12-23",
+ "2021-12-24",
+ "2021-12-27",
+ "2021-12-28",
+ "2021-12-29",
+ "2021-12-30",
+ "2021-12-31",
+ "2022-01-03",
+ "2022-01-04",
+ "2022-01-05",
+ "2022-01-06",
+ "2022-01-07",
+ "2022-01-10",
+ "2022-01-11",
+ "2022-01-12",
+ "2022-01-13",
+ "2022-01-14",
+ "2022-01-17",
+ "2022-01-18",
+ "2022-01-19",
+ "2022-01-20",
+ "2022-01-21",
+ "2022-01-24",
+ "2022-01-25",
+ "2022-01-26",
+ "2022-01-27",
+ "2022-01-28",
+ "2022-01-31",
+ "2022-02-01",
+ "2022-02-02",
+ "2022-02-03",
+ "2022-02-04",
+ "2022-02-07",
+ "2022-02-08",
+ "2022-02-09",
+ "2022-02-10",
+ "2022-02-11",
+ "2022-02-14",
+ "2022-02-15",
+ "2022-02-16",
+ "2022-02-17",
+ "2022-02-18",
+ "2022-02-21",
+ "2022-02-22",
+ "2022-02-23",
+ "2022-02-24",
+ "2022-02-25",
+ "2022-02-28",
+ "2022-03-01",
+ "2022-03-02",
+ "2022-03-03",
+ "2022-03-04",
+ "2022-03-07",
+ "2022-03-08",
+ "2022-03-09",
+ "2022-03-10",
+ "2022-03-11",
+ "2022-03-14",
+ "2022-03-15",
+ "2022-03-16",
+ "2022-03-17",
+ "2022-03-18",
+ "2022-03-21",
+ "2022-03-22",
+ "2022-03-23",
+ "2022-03-24",
+ "2022-03-25",
+ "2022-03-28",
+ "2022-03-29",
+ "2022-03-30",
+ "2022-03-31",
+ "2022-04-01",
+ "2022-04-04",
+ "2022-04-05",
+ "2022-04-06",
+ "2022-04-07",
+ "2022-04-08",
+ "2022-04-11",
+ "2022-04-12",
+ "2022-04-13",
+ "2022-04-14",
+ "2022-04-15",
+ "2022-04-18",
+ "2022-04-19",
+ "2022-04-20",
+ "2022-04-21",
+ "2022-04-22",
+ "2022-04-25",
+ "2022-04-26",
+ "2022-04-27",
+ "2022-04-28",
+ "2022-04-29",
+ "2022-05-02",
+ "2022-05-03",
+ "2022-05-04",
+ "2022-05-05",
+ "2022-05-06",
+ "2022-05-09",
+ "2022-05-10",
+ "2022-05-11",
+ "2022-05-12",
+ "2022-05-13",
+ "2022-05-16",
+ "2022-05-17",
+ "2022-05-18",
+ "2022-05-19",
+ "2022-05-20",
+ "2022-05-23",
+ "2022-05-24",
+ "2022-05-25",
+ "2022-05-26",
+ "2022-05-27",
+ "2022-05-30",
+ "2022-05-31",
+ "2022-06-01",
+ "2022-06-02",
+ "2022-06-03",
+ "2022-06-06",
+ "2022-06-07",
+ "2022-06-08",
+ "2022-06-09",
+ "2022-06-10",
+ "2022-06-13",
+ "2022-06-14",
+ "2022-06-15",
+ "2022-06-16",
+ "2022-06-17",
+ "2022-06-20",
+ "2022-06-21",
+ "2022-06-22",
+ "2022-06-23",
+ "2022-06-24",
+ "2022-06-27",
+ "2022-06-28",
+ "2022-06-29",
+ "2022-06-30",
+ "2022-07-01",
+ "2022-07-04",
+ "2022-07-05",
+ "2022-07-06",
+ "2022-07-07",
+ "2022-07-08",
+ "2022-07-11",
+ "2022-07-12",
+ "2022-07-13",
+ "2022-07-14",
+ "2022-07-15",
+ "2022-07-18",
+ "2022-07-19",
+ "2022-07-20",
+ "2022-07-21",
+ "2022-07-22",
+ "2022-07-25",
+ "2022-07-26",
+ "2022-07-27",
+ "2022-07-28",
+ "2022-07-29",
+ "2022-08-01",
+ "2022-08-02",
+ "2022-08-03",
+ "2022-08-04",
+ "2022-08-05",
+ "2022-08-08",
+ "2022-08-09",
+ "2022-08-10",
+ "2022-08-11",
+ "2022-08-12",
+ "2022-08-15",
+ "2022-08-16",
+ "2022-08-17",
+ "2022-08-18",
+ "2022-08-19",
+ "2022-08-22",
+ "2022-08-23",
+ "2022-08-24",
+ "2022-08-25",
+ "2022-08-26",
+ "2022-08-29",
+ "2022-08-30",
+ "2022-08-31",
+ "2022-09-01",
+ "2022-09-02",
+ "2022-09-05",
+ "2022-09-06",
+ "2022-09-07",
+ "2022-09-08",
+ "2022-09-09",
+ "2022-09-12",
+ "2022-09-13",
+ "2022-09-14",
+ "2022-09-15",
+ "2022-09-16",
+ "2022-09-19",
+ "2022-09-20",
+ "2022-09-21",
+ "2022-09-22",
+ "2022-09-23",
+ "2022-09-26",
+ "2022-09-27",
+ "2022-09-28",
+ "2022-09-29",
+ "2022-09-30",
+ "2022-10-03",
+ "2022-10-04",
+ "2022-10-05",
+ "2022-10-06",
+ "2022-10-07",
+ "2022-10-10",
+ "2022-10-11",
+ "2022-10-12",
+ "2022-10-13",
+ "2022-10-14",
+ "2022-10-17",
+ "2022-10-18",
+ "2022-10-19",
+ "2022-10-20",
+ "2022-10-21",
+ "2022-10-24",
+ "2022-10-25",
+ "2022-10-26",
+ "2022-10-27",
+ "2022-10-28",
+ "2022-10-31",
+ "2022-11-01",
+ "2022-11-02",
+ "2022-11-03",
+ "2022-11-04",
+ "2022-11-07",
+ "2022-11-08",
+ "2022-11-09",
+ "2022-11-10",
+ "2022-11-11",
+ "2022-11-14",
+ "2022-11-15",
+ "2022-11-16",
+ "2022-11-17",
+ "2022-11-18",
+ "2022-11-21",
+ "2022-11-22",
+ "2022-11-23",
+ "2022-11-24",
+ "2022-11-25",
+ "2022-11-28",
+ "2022-11-29",
+ "2022-11-30",
+ "2022-12-01",
+ "2022-12-02",
+ "2022-12-05",
+ "2022-12-06",
+ "2022-12-07",
+ "2022-12-08",
+ "2022-12-09",
+ "2022-12-12",
+ "2022-12-13",
+ "2022-12-14",
+ "2022-12-15",
+ "2022-12-16",
+ "2022-12-19",
+ "2022-12-20",
+ "2022-12-21",
+ "2022-12-22",
+ "2022-12-23",
+ "2022-12-26",
+ "2022-12-27",
+ "2022-12-28",
+ "2022-12-29",
+ "2022-12-30",
+ "2023-01-02",
+ "2023-01-03",
+ "2023-01-04",
+ "2023-01-05",
+ "2023-01-06",
+ "2023-01-09",
+ "2023-01-10",
+ "2023-01-11",
+ "2023-01-12",
+ "2023-01-13",
+ "2023-01-16",
+ "2023-01-17",
+ "2023-01-18",
+ "2023-01-19",
+ "2023-01-20",
+ "2023-01-23",
+ "2023-01-24",
+ "2023-01-25",
+ "2023-01-26",
+ "2023-01-27",
+ "2023-01-30",
+ "2023-01-31",
+ "2023-02-01",
+ "2023-02-02",
+ "2023-02-03",
+ "2023-02-06",
+ "2023-02-07",
+ "2023-02-08",
+ "2023-02-09",
+ "2023-02-10",
+ "2023-02-13",
+ "2023-02-14",
+ "2023-02-15",
+ "2023-02-16",
+ "2023-02-17",
+ "2023-02-20",
+ "2023-02-21",
+ "2023-02-22",
+ "2023-02-23",
+ "2023-02-24",
+ "2023-02-27",
+ "2023-02-28",
+ "2023-03-01",
+ "2023-03-02",
+ "2023-03-03",
+ "2023-03-06",
+ "2023-03-07",
+ "2023-03-08",
+ "2023-03-09",
+ "2023-03-10",
+ "2023-03-13",
+ "2023-03-14",
+ "2023-03-15",
+ "2023-03-16",
+ "2023-03-17",
+ "2023-03-20",
+ "2023-03-21",
+ "2023-03-22",
+ "2023-03-23",
+ "2023-03-24",
+ "2023-03-27",
+ "2023-03-28",
+ "2023-03-29",
+ "2023-03-30",
+ "2023-03-31",
+ "2023-04-03",
+ "2023-04-04",
+ "2023-04-05",
+ "2023-04-06",
+ "2023-04-07",
+ "2023-04-10",
+ "2023-04-11",
+ "2023-04-12",
+ "2023-04-13",
+ "2023-04-14",
+ "2023-04-17",
+ "2023-04-18",
+ "2023-04-19",
+ "2023-04-20",
+ "2023-04-21",
+ "2023-04-24",
+ "2023-04-25",
+ "2023-04-26",
+ "2023-04-27",
+ "2023-04-28",
+ "2023-05-01",
+ "2023-05-02",
+ "2023-05-03",
+ "2023-05-04",
+ "2023-05-05",
+ "2023-05-08",
+ "2023-05-09",
+ "2023-05-10",
+ "2023-05-11",
+ "2023-05-12",
+ "2023-05-15",
+ "2023-05-16",
+ "2023-05-17",
+ "2023-05-18",
+ "2023-05-19",
+ "2023-05-22",
+ "2023-05-23",
+ "2023-05-24",
+ "2023-05-25",
+ "2023-05-26",
+ "2023-05-29",
+ "2023-05-30",
+ "2023-05-31",
+ "2023-06-01",
+ "2023-06-02",
+ "2023-06-05",
+ "2023-06-06",
+ "2023-06-07",
+ "2023-06-08",
+ "2023-06-09",
+ "2023-06-12",
+ "2023-06-13",
+ "2023-06-14",
+ "2023-06-15",
+ "2023-06-16",
+ "2023-06-19",
+ "2023-06-20",
+ "2023-06-21",
+ "2023-06-22",
+ "2023-06-23",
+ "2023-06-26",
+ "2023-06-27",
+ "2023-06-28",
+ "2023-06-29",
+ "2023-06-30",
+ "2023-07-03",
+ "2023-07-04",
+ "2023-07-05",
+ "2023-07-06",
+ "2023-07-07",
+ "2023-07-10",
+ "2023-07-11",
+ "2023-07-12",
+ "2023-07-13",
+ "2023-07-14",
+ "2023-07-17",
+ "2023-07-18",
+ "2023-07-19",
+ "2023-07-20",
+ "2023-07-21",
+ "2023-07-24",
+ "2023-07-25",
+ "2023-07-26",
+ "2023-07-27",
+ "2023-07-28",
+ "2023-07-31",
+ "2023-08-01",
+ "2023-08-02",
+ "2023-08-03",
+ "2023-08-04",
+ "2023-08-07",
+ "2023-08-08",
+ "2023-08-09",
+ "2023-08-10",
+ "2023-08-11",
+ "2023-08-14",
+ "2023-08-15",
+ "2023-08-16",
+ "2023-08-17",
+ "2023-08-18",
+ "2023-08-21",
+ "2023-08-22",
+ "2023-08-23",
+ "2023-08-24",
+ "2023-08-25",
+ "2023-08-28",
+ "2023-08-29",
+ "2023-08-30",
+ "2023-08-31",
+ "2023-09-01",
+ "2023-09-04",
+ "2023-09-05",
+ "2023-09-06",
+ "2023-09-07",
+ "2023-09-08",
+ "2023-09-11",
+ "2023-09-12",
+ "2023-09-13",
+ "2023-09-14",
+ "2023-09-15",
+ "2023-09-18",
+ "2023-09-19",
+ "2023-09-20",
+ "2023-09-21",
+ "2023-09-22",
+ "2023-09-25",
+ "2023-09-26",
+ "2023-09-27",
+ "2023-09-28",
+ "2023-09-29",
+ "2023-10-02",
+ "2023-10-03",
+ "2023-10-04",
+ "2023-10-05",
+ "2023-10-06",
+ "2023-10-09",
+ "2023-10-10",
+ "2023-10-11",
+ "2023-10-12",
+ "2023-10-13",
+ "2023-10-16",
+ "2023-10-17",
+ "2023-10-18",
+ "2023-10-19",
+ "2023-10-20",
+ "2023-10-23",
+ "2023-10-24",
+ "2023-10-25",
+ "2023-10-26",
+ "2023-10-27",
+ "2023-10-30",
+ "2023-10-31"
+ ],
+ "datasets": [
+ {
+ "label": "Equity Curve",
+ "data": [
+ 100.04928216116915,
+ 99.43338274457996,
+ 99.00769674949291,
+ 98.01319211411241,
+ 96.22152829230674,
+ 95.40738467576404,
+ 95.63741192273196,
+ 95.92631047180063,
+ 95.40216502822742,
+ 94.98687343123018,
+ 95.09342478016177,
+ 93.67238701717456,
+ 92.16228879276849,
+ 92.49727762198562,
+ 93.16927495129373,
+ 93.54486146800703,
+ 93.82142759557004,
+ 93.3265377392572,
+ 93.88048326991742,
+ 93.25463516949857,
+ 92.36209774625237,
+ 93.77366399275992,
+ 93.72715636240217,
+ 94.15381303829798,
+ 93.69384356101287,
+ 92.7474071262368,
+ 91.65209582965464,
+ 92.08437481908142,
+ 91.90817101317052,
+ 92.39914463319289,
+ 91.98099363174083,
+ 92.4790824051198,
+ 94.1023691977374,
+ 92.17898703578314,
+ 92.83603090789757,
+ 93.96190375901357,
+ 92.88724863409603,
+ 92.06074128174583,
+ 91.18697031061507,
+ 91.29727998862644,
+ 90.9922585124584,
+ 90.45173890147557,
+ 90.46821972408614,
+ 89.58453686722915,
+ 91.57546851286608,
+ 92.43012460391631,
+ 94.53021008349334,
+ 93.9980711245277,
+ 91.52176846136864,
+ 91.55569130903416,
+ 91.38449689435086,
+ 90.89987190527133,
+ 89.25483763155623,
+ 88.80995565914202,
+ 88.42159566407034,
+ 90.47451487678364,
+ 92.3079872475235,
+ 91.03990658356264,
+ 90.85796969103743,
+ 90.53958275899183,
+ 88.77613444026758,
+ 86.82210744880805,
+ 86.56213392726751,
+ 85.06833176630558,
+ 84.48947738809399,
+ 85.934261791323,
+ 85.73517245174034,
+ 86.48114701119457,
+ 86.18570334871785,
+ 85.77190024519919,
+ 85.78160745837569,
+ 85.4250205913837,
+ 85.9184470658677,
+ 85.22083147283293,
+ 84.3692835677096,
+ 84.15800569150306,
+ 84.74209800885205,
+ 84.90644019284514,
+ 84.18424968696928,
+ 84.24514166436421,
+ 85.35066243293848,
+ 85.66818274465103,
+ 85.76594683223946,
+ 85.6058102857214,
+ 85.96447957438404,
+ 85.8618452183039,
+ 85.81752325312448,
+ 85.88435464353876,
+ 86.01915490178409,
+ 86.25081967790817,
+ 86.05641521815409,
+ 86.02326903811515,
+ 84.62772936306843,
+ 85.44434281550886,
+ 83.94813340974254,
+ 83.76677293317441,
+ 83.28842230187294,
+ 83.99047151846109,
+ 82.37684357461336,
+ 82.49033717957559,
+ 82.95849135502937,
+ 82.18089419024632,
+ 82.6549448041514,
+ 82.18623866484451,
+ 81.40185528811146,
+ 80.24512121878884,
+ 79.70432868012003,
+ 80.59252020595447,
+ 80.10848764948996,
+ 80.40514341314253,
+ 80.89962176049858,
+ 81.63829973116128,
+ 82.3156660479044,
+ 81.22786337304471,
+ 79.96254708554,
+ 78.76721526554248,
+ 78.25436486810733,
+ 79.65802812095029,
+ 79.94971134603115,
+ 80.30168282861794,
+ 80.31266556762596,
+ 79.59415544187306,
+ 79.6566409061816,
+ 79.29777389003692,
+ 80.25565304082217,
+ 80.56564198666429,
+ 79.31673309903566,
+ 79.54583833647793,
+ 80.07780271838809,
+ 81.10748598939387,
+ 79.94340468065384,
+ 79.26261006452339,
+ 80.34336467035241,
+ 78.65087174843042,
+ 77.5096441222243,
+ 77.25762269269481,
+ 78.28423316677686,
+ 78.99374243451514,
+ 79.84270850242716,
+ 78.70336779933888,
+ 80.036671707023,
+ 78.86764667001155,
+ 78.94888978810994,
+ 79.61532790716332,
+ 79.39323118098704,
+ 80.02123451031787,
+ 79.37713704109676,
+ 79.20364607490261,
+ 78.44149262229041,
+ 78.03716749273335,
+ 78.29980946468865,
+ 79.58918416763788,
+ 79.83997597531372,
+ 79.3385939026042,
+ 78.22110988367756,
+ 78.34537968221682,
+ 79.21467665117142,
+ 78.16963308088259,
+ 78.19749870185568,
+ 78.1777110068549,
+ 78.0663892401962,
+ 76.60497777159213,
+ 75.74366942414773,
+ 76.16163064878384,
+ 75.71707966188723,
+ 75.35186610254966,
+ 75.5389196552171,
+ 75.36554563603325,
+ 74.64476578053082,
+ 72.97586380449162,
+ 73.5279956313633,
+ 72.46066541803695,
+ 72.51340437058207,
+ 72.18561438423414,
+ 72.35604418371464,
+ 72.17651755849964,
+ 72.02424368459634,
+ 70.69649727108728,
+ 70.68835707723163,
+ 70.85430013091467,
+ 71.37878015210538,
+ 71.21451226854872,
+ 70.95853483315877,
+ 71.15104474946043,
+ 70.76761988938439,
+ 70.52795068013656,
+ 69.42192597678772,
+ 68.9447319706892,
+ 67.80514190930977,
+ 67.9792919493329,
+ 69.60732534594362,
+ 68.99860136609497,
+ 67.91022875350542,
+ 67.97329097617887,
+ 68.30633083145246,
+ 68.7322572463676,
+ 68.19681109620926,
+ 67.12462362451367,
+ 67.13993491284275,
+ 66.3355720443312,
+ 65.42140570418493,
+ 65.43443888919235,
+ 64.54102413062827,
+ 64.20828856014458,
+ 63.55618271643595,
+ 63.98970608309972,
+ 64.61362717269662,
+ 64.59837942849937,
+ 64.20067835842607,
+ 64.63320960161528,
+ 65.00164204090237,
+ 64.48840258688116,
+ 64.87191177348406,
+ 65.22941990407325,
+ 64.51816430932631,
+ 64.6110632845057,
+ 65.11926701612542,
+ 65.78455214486378,
+ 67.29802588652717,
+ 67.8837201187054,
+ 67.59780241512424,
+ 67.77492746488912,
+ 67.25536819454385,
+ 67.17197418925758,
+ 66.80086878001383,
+ 66.081655025531,
+ 65.46329400016783,
+ 65.3732816298415,
+ 65.2777101262571,
+ 65.68521010385159,
+ 65.69326540186687,
+ 65.48253475396649,
+ 64.5626148597085,
+ 64.78164330690078,
+ 64.60746642396965,
+ 64.91615600899834,
+ 65.19455292417753,
+ 66.33589660933949,
+ 66.55517451911452,
+ 66.85592806036964,
+ 67.60977556018729,
+ 66.70334255299984,
+ 66.62869642593202,
+ 65.93490539259707,
+ 65.23262709179207,
+ 65.31431973547654,
+ 65.27732086241099,
+ 65.53106183970797,
+ 67.74273101854104,
+ 66.85806078837031,
+ 66.11427651400966,
+ 67.12913720348013,
+ 67.84498567690763,
+ 67.90757228167946,
+ 68.42085914792808,
+ 69.34509793252181,
+ 69.79688336007797,
+ 70.60519264262751,
+ 71.15560947919779,
+ 71.6358564312904,
+ 72.73140140697136,
+ 74.00344068636312,
+ 73.98134413608247,
+ 73.62527541768249,
+ 72.77551009501038,
+ 72.12283844791189,
+ 72.40954804216632,
+ 71.08862018977243,
+ 71.76273337103373,
+ 71.270471290369,
+ 71.76248426823179,
+ 71.00141557993447,
+ 70.41589625025614,
+ 71.00464808185343,
+ 70.14672700814886,
+ 68.70841935056382,
+ 68.48045612769722,
+ 68.45433406734097,
+ 69.388520981402,
+ 69.04290950957542,
+ 70.67278963886952,
+ 71.45937120285659,
+ 71.05349667750221,
+ 70.88058982285546,
+ 70.05842983804392,
+ 70.3890241190702,
+ 70.22937646580232,
+ 71.50415294905008,
+ 72.12594269544262,
+ 71.8476807776531,
+ 71.60086304239847,
+ 71.00330530359955,
+ 71.58147949571475,
+ 69.53320473151385,
+ 71.06306788380198,
+ 71.08724269617402,
+ 70.94783240519858,
+ 70.7976458312815,
+ 70.45764818994262,
+ 70.05972735148293,
+ 70.28382279351968,
+ 70.11545642255433,
+ 70.01336851807314,
+ 70.43764664100208,
+ 70.66986859212756,
+ 70.91805513039427,
+ 71.88088636737669,
+ 73.49087056738472,
+ 73.91159488727114,
+ 72.95943332624888,
+ 73.07908371159351,
+ 73.36268422501819,
+ 72.77733657102053,
+ 73.10531407369538,
+ 73.81727718261791,
+ 72.9002774886555,
+ 72.6297944724674,
+ 72.66054586069185,
+ 71.84424103965395,
+ 73.08211478397708,
+ 73.80072839404868,
+ 73.17753938340284,
+ 74.11793896312079,
+ 74.64552949040382,
+ 74.5564991047351,
+ 75.2575134570725,
+ 74.427015787811,
+ 73.84613377725756,
+ 74.3198687152097,
+ 74.37437924285852,
+ 73.74864849758032,
+ 74.14144844903115,
+ 74.59164460139169,
+ 73.78589160026877,
+ 73.27727522044464,
+ 74.08168759849629,
+ 74.3337263174966,
+ 74.38165880824488,
+ 74.0423722062148,
+ 73.3764567204095,
+ 73.47120062874123,
+ 73.561156384192,
+ 72.89393320233403,
+ 73.98636716628585,
+ 74.59859920744336,
+ 73.34713069816921,
+ 73.34110914692693,
+ 72.81299809981192,
+ 72.29741761492996,
+ 71.4642763663346,
+ 71.7488551430486,
+ 71.75509674117916,
+ 72.36894172768625,
+ 72.53262810623895,
+ 71.49540108815783,
+ 71.8163997191772,
+ 72.17763099264886,
+ 73.83547019952834,
+ 73.06137138935553,
+ 71.83384273310315,
+ 70.79377995597184,
+ 70.96079895019797,
+ 70.66873259462041,
+ 70.30685899058268,
+ 70.57174626615772,
+ 71.14287929967782,
+ 71.50719564726742,
+ 70.67165653078513,
+ 69.3019087028247,
+ 69.84013601373724,
+ 68.33812492279579,
+ 68.61483891484397,
+ 67.96976485048873,
+ 68.97698057436637,
+ 68.60548300264796,
+ 68.4071936258462,
+ 69.93528675701506,
+ 69.95972419480401,
+ 70.1705326418995,
+ 70.58265995751901,
+ 68.8887579524584,
+ 69.45498393320237,
+ 69.76441292978735,
+ 69.26958997108939,
+ 68.09315621071151,
+ 67.8288641808786,
+ 66.95861552452945,
+ 67.15236148063323,
+ 66.33516841345234,
+ 66.0364373341105,
+ 65.98891217724943,
+ 67.07989640859402,
+ 66.67262479230634,
+ 67.75444063308656,
+ 67.17007003914105,
+ 67.33841551516284,
+ 68.4625016917733,
+ 68.35104987063646,
+ 67.71635386694443,
+ 67.54940425799948,
+ 67.02078229586887,
+ 67.72974912910901,
+ 66.48259356246473,
+ 65.93368556585516,
+ 66.68451951553284,
+ 67.01866229378051,
+ 67.55567736466548,
+ 67.24532710252277,
+ 67.49803766786563,
+ 67.67515768556713,
+ 67.15101619084055,
+ 67.26015683766978,
+ 66.48676960050042,
+ 66.75653932265351,
+ 67.05439279134947,
+ 66.5746546945011,
+ 65.60910400649838,
+ 66.88497990329381,
+ 66.1917888751566,
+ 66.3939392200005,
+ 66.49039846441451,
+ 67.29500018744629,
+ 67.73112003554431,
+ 67.2542949817345,
+ 67.283806321551,
+ 67.28293231201148,
+ 66.4183833370921,
+ 65.88063191896651,
+ 65.68237712108679,
+ 65.7322762974855,
+ 66.53864497813245,
+ 67.05147289959427,
+ 67.39817292734742,
+ 66.980908603457,
+ 67.3801055665454,
+ 67.07132004927044,
+ 66.64467348301372,
+ 66.21619967136306,
+ 66.3314541702711,
+ 66.97736988391644,
+ 68.21956101548005,
+ 69.01492842090511,
+ 68.92671783267332,
+ 68.952321583528,
+ 68.96770395420413,
+ 69.24140836699965,
+ 68.18644801944107,
+ 68.83835031983708,
+ 69.60930285590896,
+ 69.78381252102082,
+ 70.23165899294386,
+ 71.30235419292276,
+ 70.60575180109791,
+ 70.91085376525605,
+ 70.49326699493015,
+ 70.74223747964061,
+ 71.22642256634978,
+ 70.84970460239845,
+ 70.82904933095902,
+ 70.55810237554596,
+ 70.14478295019401,
+ 69.852916879547,
+ 69.0487392258085,
+ 69.73168354404389,
+ 69.05145338970907,
+ 69.65688310235194,
+ 68.17802273497637,
+ 67.2765380078034,
+ 68.18049318937143,
+ 68.55978322133839,
+ 68.63326358328041,
+ 66.96177564617761,
+ 66.98012867675851,
+ 67.50662643442631,
+ 68.09710855898024,
+ 67.76243507187978,
+ 66.62987096821075,
+ 66.09319432491728,
+ 65.91266764737374,
+ 65.07205736654706,
+ 64.39510335545584,
+ 65.3532208928511,
+ 66.51453797913663,
+ 66.19271941795495,
+ 66.60031163639685,
+ 67.39150924185911,
+ 66.53526714699225,
+ 67.08211496463034,
+ 67.45646024342426,
+ 67.29249413845376,
+ 66.8755672820086,
+ 66.80459180443289,
+ 66.88278694645074,
+ 66.93051615180488,
+ 66.46403982887519,
+ 65.1699413905634,
+ 65.23203800514355,
+ 64.58932148804814,
+ 64.59566293804507,
+ 64.40181857446547,
+ 63.80555878437538,
+ 63.06520102155356,
+ 63.18145924288727,
+ 62.493668130387334,
+ 62.7787823759108,
+ 61.380113156075964,
+ 61.02943127688013,
+ 61.923997198521576,
+ 62.167530639542,
+ 62.40059952076171,
+ 63.76616453561887,
+ 64.93728906945917,
+ 65.25820357903218,
+ 65.27869983902409,
+ 65.40313389710603,
+ 66.33060971602089,
+ 66.68358664715817,
+ 66.83311470957356,
+ 66.64269993595244,
+ 66.63676953424414,
+ 67.01305584983415,
+ 66.18847482349489,
+ 66.93312687800194,
+ 66.72635228766549,
+ 66.49880636438482,
+ 66.75091172213428,
+ 67.1064533279654,
+ 67.47675143237394,
+ 67.68128348108729,
+ 68.89588500859757,
+ 70.4549677014407,
+ 71.54855255213272,
+ 71.50158938303656,
+ 71.76950348064052,
+ 71.23247987456172,
+ 72.13606464710793,
+ 72.5213990283868,
+ 72.55455935593965,
+ 73.58507197622664,
+ 73.85096718739258,
+ 73.2956888947229,
+ 72.95175511872348,
+ 72.32207417887857,
+ 71.4301805599513,
+ 71.44388511721856,
+ 71.93225974352532,
+ 72.67112369128301,
+ 73.732830031706,
+ 74.25775747046337,
+ 75.9821676221506,
+ 76.06643795735756,
+ 76.23099953395977,
+ 76.31167798690902,
+ 76.83834409125997,
+ 77.38533303205922,
+ 77.99427757477893,
+ 77.01992655698716,
+ 76.60499601857322,
+ 77.61918555353702,
+ 77.69130686764058,
+ 77.87716417012652,
+ 78.75010101721035,
+ 78.88780496203907,
+ 79.59719076119544,
+ 78.18202872873478,
+ 80.28977049817689,
+ 79.78885062150701,
+ 79.25837755448234,
+ 79.19463416380219,
+ 80.04624773954438,
+ 80.53879669254643,
+ 80.62901299920419,
+ 81.39843007803691,
+ 82.03159332529172,
+ 82.34341721602088,
+ 84.22384494224428,
+ 83.75755650764573,
+ 84.86877943586533,
+ 84.55554861521762,
+ 85.1066067202394,
+ 85.09884710709173,
+ 86.16716681645286,
+ 85.77200696318786,
+ 86.89801780455696,
+ 86.9614801540723,
+ 86.17813508879682,
+ 86.2408629530255,
+ 85.33286912141462,
+ 84.29009585164745,
+ 83.56438595060148,
+ 82.6712808030926,
+ 82.98943743267124,
+ 82.24930072255316,
+ 82.03034642334886,
+ 80.31313539718819,
+ 80.55605586185098,
+ 80.61636963739119,
+ 79.9574162802246,
+ 79.11824933523035,
+ 80.38040278217717,
+ 80.16483898874573,
+ 81.07490689196078,
+ 80.27897539658846,
+ 81.47337335727845,
+ 80.87520861196688,
+ 79.42071677928423,
+ 80.89747452807211,
+ 80.81734954910006,
+ 81.14398207333844,
+ 82.29233042980572,
+ 83.30419879725481,
+ 81.37837858911577,
+ 81.11847373406323,
+ 81.12238283498408,
+ 81.07237857847711,
+ 81.79823401644826,
+ 81.399432133783,
+ 82.52709661289538,
+ 82.75375656529204,
+ 83.24829493880853,
+ 83.77174282413911,
+ 83.59453630664137,
+ 84.17074800120609,
+ 84.44393624827204,
+ 84.76345690498574,
+ 83.56785811028638,
+ 84.04923093514678,
+ 85.43032968672998,
+ 84.50123687831272,
+ 84.03547753069638,
+ 83.11500377251342,
+ 81.91836772385389,
+ 82.69094242812749,
+ 83.44932221021999,
+ 84.47080725426387,
+ 83.74385780324211,
+ 83.37487505290858,
+ 85.0589832509042,
+ 85.2466174222267,
+ 85.7285595114587,
+ 85.7595589746538,
+ 86.60950129532553,
+ 87.21585501594079,
+ 88.25286928727508,
+ 89.14406149537409,
+ 91.33932936855308,
+ 92.14662105940293,
+ 91.05130560953648,
+ 91.4602953847768,
+ 91.48668507140661,
+ 92.228468581953,
+ 91.54047559635757,
+ 91.39189450559554,
+ 91.10208733008925,
+ 90.10472462758624,
+ 89.29797475434759,
+ 90.33094502221877,
+ 90.99286441307737,
+ 91.44676597240078,
+ 90.05239276278901,
+ 90.44834002562278,
+ 90.02682975707117,
+ 89.17955252405551,
+ 87.7567104919506,
+ 88.22135407600025,
+ 87.90224721201156,
+ 87.80031214773138,
+ 88.1218837239754,
+ 86.06517822586585,
+ 86.5329436476371,
+ 84.9698653581681,
+ 84.69840315335905,
+ 87.3614408638991,
+ 85.70650916602837,
+ 85.93040444433187,
+ 85.82635936045348,
+ 85.77678529813979,
+ 85.7270690418913,
+ 84.96556382375408,
+ 84.32410448315397,
+ 84.4874864283229,
+ 84.70940193848982,
+ 85.1684887909759,
+ 86.16395295387403,
+ 87.32931900385668,
+ 88.38496220869936,
+ 87.35143243646742,
+ 87.8414132220328,
+ 88.18869438452587,
+ 87.97325753253922,
+ 88.36745720434435,
+ 89.00183862232211,
+ 88.91640326733268,
+ 89.68162027403055,
+ 88.77324002840135,
+ 88.88452423910158,
+ 87.90126117417776,
+ 86.77902637949481,
+ 86.37915047363387,
+ 86.10595015652531,
+ 85.55225473782147,
+ 86.16592102550797,
+ 86.42540005851703,
+ 87.2559514735844,
+ 87.91269406723666,
+ 87.57565910378334,
+ 87.11518676242967,
+ 86.07935192293775,
+ 86.62900982931939,
+ 86.79406515907144,
+ 86.87370110113373,
+ 85.51367778466891,
+ 84.06463465337566,
+ 83.26464947811971,
+ 84.59143628934414,
+ 85.62514047081609,
+ 84.33948303909126,
+ 84.69444572559992,
+ 84.27367871139117,
+ 84.02810905392487,
+ 84.41403440324152,
+ 83.20381831938704,
+ 83.38154168007732,
+ 84.09558916190431,
+ 85.095110427787,
+ 84.42844805455546,
+ 84.18870654237287,
+ 83.18450955202628,
+ 81.92428473281146,
+ 81.85440762514146,
+ 82.50743694807512,
+ 84.30179096462813,
+ 84.7517481712978,
+ 84.83704597902175,
+ 84.86823883363839,
+ 86.18787503865371,
+ 86.54546354989586,
+ 86.10992234482417,
+ 84.65724233958922,
+ 84.57283305601102,
+ 85.17280818765438,
+ 84.21275715789298,
+ 84.14824698398392,
+ 83.9542942864383,
+ 83.25773536004634,
+ 83.40976034767468,
+ 85.10253314479657,
+ 86.17404596479369,
+ 84.97075048656318,
+ 83.39754636630194,
+ 82.68888957648912,
+ 83.58865478774973,
+ 82.72928584479024,
+ 84.84402022147596,
+ 85.83004700170947,
+ 86.2527426929411,
+ 86.13681914139248,
+ 86.21348248197549,
+ 86.44043420432442,
+ 87.30035777065159,
+ 87.46978630945935,
+ 86.85021859831136,
+ 86.98003262583384,
+ 87.31657316100913,
+ 87.90369144672947,
+ 88.62720684861934,
+ 88.76080796228784,
+ 88.92759898717574,
+ 89.69088615022592,
+ 90.86133091324217,
+ 91.55872762927673,
+ 91.60663420663843,
+ 90.6626759178906,
+ 90.75437276111207,
+ 92.11413147459831,
+ 91.52344338117835,
+ 91.1575576085469,
+ 91.67859013863297,
+ 91.94316263617904,
+ 90.7845061008017,
+ 90.97632696975698,
+ 92.12797605397436,
+ 91.92103682804213,
+ 93.05298354362964,
+ 95.90647878529339,
+ 96.33553196789563,
+ 96.16111877231407,
+ 97.21923421087631,
+ 95.7728159411279,
+ 94.39465706402768,
+ 94.1134908985829,
+ 95.6399253902326,
+ 96.43093908380125,
+ 97.72439038872889,
+ 98.98358731197624,
+ 99.43282685504067,
+ 100.37234821422354,
+ 99.92714959531224,
+ 101.5950191767626,
+ 100.38464568259585,
+ 99.90801323319488,
+ 98.9225266935796,
+ 100.05429771428841,
+ 98.72380970547232,
+ 97.36479124205492,
+ 95.92306210840623,
+ 95.68393209719697,
+ 94.47180119912643,
+ 94.84579616089573,
+ 95.05307431700199,
+ 96.47937046459054,
+ 94.42969985226924,
+ 95.16583271831749,
+ 95.28073391099926,
+ 95.2232425814606,
+ 97.06090737693395,
+ 96.2980242794829,
+ 95.21404345221072,
+ 96.23566507594931,
+ 97.33918675404169,
+ 96.50807389454167,
+ 96.54974121197057,
+ 97.52470253790894,
+ 98.85425967385349,
+ 98.4337388030057,
+ 98.89546801847318,
+ 96.17036777813757,
+ 94.84746221322114,
+ 95.69923293542055,
+ 95.30228515776452,
+ 96.10112302645472,
+ 96.57791250820131,
+ 95.37783770634279,
+ 96.25345915658356,
+ 96.58198741685467,
+ 94.84167883755129,
+ 93.90240133422837,
+ 94.47787384349282,
+ 93.63596645897508,
+ 93.17148959353835,
+ 93.84320149393449,
+ 93.98246865464391,
+ 94.36447955005957,
+ 93.22977516327333,
+ 93.72493673112801,
+ 94.22663498535941,
+ 94.46716538692698,
+ 93.33272247090554,
+ 92.20975603962283,
+ 93.04376562953648,
+ 92.44577492745705,
+ 93.14560458560837,
+ 93.36563684880976,
+ 92.48627226750371,
+ 93.77427148588036,
+ 95.68670586603108,
+ 97.19804404692589,
+ 97.5381643609706,
+ 98.44250881217312,
+ 98.18992991812155,
+ 99.08237423282053,
+ 98.33154921263043,
+ 99.19558892743007,
+ 100.38108317190837,
+ 100.56907993729719,
+ 101.65733998534672,
+ 102.58329707983917,
+ 103.93710688926947,
+ 105.72444498272114,
+ 107.00847812585044,
+ 107.90630485727456,
+ 105.55104427647015,
+ 104.68315339791525,
+ 103.0660647187833,
+ 102.50736704208467,
+ 103.43857411848796,
+ 103.8908008882891,
+ 102.7506516091747,
+ 103.20923140777322,
+ 104.40916463128411,
+ 106.91280448999623,
+ 106.5462514886828,
+ 106.84509394920607,
+ 105.89831715609526,
+ 106.23947228277801,
+ 107.6925185543695,
+ 107.81445993660893,
+ 108.52896777040712,
+ 107.47348766588688,
+ 107.31506001903593,
+ 108.04756304574964,
+ 109.31965200934664,
+ 108.31075677089639,
+ 107.9526537769693,
+ 106.06422517932283,
+ 108.37077076414538,
+ 110.42297660710743,
+ 112.76069368001019,
+ 112.55729172190992,
+ 113.76607854416316,
+ 114.56739637242822,
+ 116.04581163619783,
+ 114.78770244767466,
+ 112.38119917309865,
+ 113.74182979860858,
+ 113.23573867493832,
+ 112.93443741064952,
+ 113.7874100232255,
+ 111.42047489161632,
+ 110.6246380974324,
+ 111.30805799905129,
+ 111.5226302763902,
+ 110.50939112518678,
+ 112.8511587112086,
+ 113.65791088279661,
+ 112.8045638392464,
+ 113.96116794253962,
+ 113.12493452251718,
+ 112.8255953453562,
+ 113.07085337449338,
+ 112.84923654044408,
+ 113.29860471070805,
+ 112.69476694032022,
+ 112.40514636236014,
+ 110.7498236726629,
+ 110.10004021788733,
+ 109.94224045074816,
+ 110.77352673072475,
+ 110.48973431521003,
+ 110.47046389769572,
+ 109.59319698678844,
+ 108.09408844721864,
+ 108.84798365607526,
+ 109.58336562886909,
+ 110.11126595334156,
+ 109.47634242514546,
+ 110.53646530875147,
+ 112.61029404449488,
+ 111.74138351222085,
+ 111.37928968991189,
+ 110.77668466394509,
+ 110.14833351356964,
+ 110.43461013048908,
+ 109.84343861029281,
+ 108.28269238411853,
+ 108.34248909231734,
+ 107.96780535297073,
+ 108.49463545680462,
+ 108.07648478171427,
+ 109.3366366413195,
+ 110.8167046673262,
+ 110.90256403343605,
+ 112.18820677818451,
+ 112.18297842065601,
+ 113.58127693704994,
+ 112.60070566364739,
+ 112.91121967450378,
+ 112.64209971942086,
+ 111.80333835118667,
+ 111.77419548399345,
+ 112.35522013469372,
+ 111.9615603133205,
+ 113.77550083229293,
+ 114.14088102291694,
+ 113.49439123237917,
+ 113.48303932892227,
+ 113.19329240964584,
+ 112.0055027178427,
+ 112.92069462289751,
+ 112.58623807833347,
+ 113.5582905663451,
+ 113.41776262412525,
+ 113.29912455156594,
+ 114.68468731610214,
+ 116.59781304429475,
+ 117.69953098710413,
+ 118.6996230170952,
+ 117.7290495361903,
+ 116.95244596195936,
+ 119.00180175479125,
+ 118.38944000194745,
+ 117.74690920953807,
+ 117.70457445623967,
+ 116.59738869712922,
+ 119.39960642342658,
+ 119.34606617457193,
+ 118.07274019733025,
+ 117.45147372914295,
+ 116.74335446382979,
+ 117.48058459074697,
+ 117.0561268383702,
+ 115.07334728709905,
+ 114.71838020549323,
+ 116.10381959537652,
+ 118.4340570748463,
+ 118.24885716659018,
+ 117.57168531960758,
+ 117.18046884722312,
+ 118.57883225385108,
+ 116.95499568410848
+ ],
+ "borderColor": "#2ecc71",
+ "backgroundColor": "rgba(46, 204, 113, 0.1)",
+ "fill": true,
+ "tension": 0.1
+ }
+ ]
+ },
+ "config": {
+ "y_axis_label": "Value ($)"
+ },
+ "position": {
+ "row": 1,
+ "col": 0
+ }
+ },
+ "drawdown": {
+ "id": "drawdown",
+ "title": "Drawdown Chart",
+ "type": "LineChart",
+ "data": {
+ "labels": [
+ "2020-01-02",
+ "2020-01-03",
+ "2020-01-06",
+ "2020-01-07",
+ "2020-01-08",
+ "2020-01-09",
+ "2020-01-10",
+ "2020-01-13",
+ "2020-01-14",
+ "2020-01-15",
+ "2020-01-16",
+ "2020-01-17",
+ "2020-01-20",
+ "2020-01-21",
+ "2020-01-22",
+ "2020-01-23",
+ "2020-01-24",
+ "2020-01-27",
+ "2020-01-28",
+ "2020-01-29",
+ "2020-01-30",
+ "2020-01-31",
+ "2020-02-03",
+ "2020-02-04",
+ "2020-02-05",
+ "2020-02-06",
+ "2020-02-07",
+ "2020-02-10",
+ "2020-02-11",
+ "2020-02-12",
+ "2020-02-13",
+ "2020-02-14",
+ "2020-02-17",
+ "2020-02-18",
+ "2020-02-19",
+ "2020-02-20",
+ "2020-02-21",
+ "2020-02-24",
+ "2020-02-25",
+ "2020-02-26",
+ "2020-02-27",
+ "2020-02-28",
+ "2020-03-02",
+ "2020-03-03",
+ "2020-03-04",
+ "2020-03-05",
+ "2020-03-06",
+ "2020-03-09",
+ "2020-03-10",
+ "2020-03-11",
+ "2020-03-12",
+ "2020-03-13",
+ "2020-03-16",
+ "2020-03-17",
+ "2020-03-18",
+ "2020-03-19",
+ "2020-03-20",
+ "2020-03-23",
+ "2020-03-24",
+ "2020-03-25",
+ "2020-03-26",
+ "2020-03-27",
+ "2020-03-30",
+ "2020-03-31",
+ "2020-04-01",
+ "2020-04-02",
+ "2020-04-03",
+ "2020-04-06",
+ "2020-04-07",
+ "2020-04-08",
+ "2020-04-09",
+ "2020-04-10",
+ "2020-04-13",
+ "2020-04-14",
+ "2020-04-15",
+ "2020-04-16",
+ "2020-04-17",
+ "2020-04-20",
+ "2020-04-21",
+ "2020-04-22",
+ "2020-04-23",
+ "2020-04-24",
+ "2020-04-27",
+ "2020-04-28",
+ "2020-04-29",
+ "2020-04-30",
+ "2020-05-01",
+ "2020-05-04",
+ "2020-05-05",
+ "2020-05-06",
+ "2020-05-07",
+ "2020-05-08",
+ "2020-05-11",
+ "2020-05-12",
+ "2020-05-13",
+ "2020-05-14",
+ "2020-05-15",
+ "2020-05-18",
+ "2020-05-19",
+ "2020-05-20",
+ "2020-05-21",
+ "2020-05-22",
+ "2020-05-25",
+ "2020-05-26",
+ "2020-05-27",
+ "2020-05-28",
+ "2020-05-29",
+ "2020-06-01",
+ "2020-06-02",
+ "2020-06-03",
+ "2020-06-04",
+ "2020-06-05",
+ "2020-06-08",
+ "2020-06-09",
+ "2020-06-10",
+ "2020-06-11",
+ "2020-06-12",
+ "2020-06-15",
+ "2020-06-16",
+ "2020-06-17",
+ "2020-06-18",
+ "2020-06-19",
+ "2020-06-22",
+ "2020-06-23",
+ "2020-06-24",
+ "2020-06-25",
+ "2020-06-26",
+ "2020-06-29",
+ "2020-06-30",
+ "2020-07-01",
+ "2020-07-02",
+ "2020-07-03",
+ "2020-07-06",
+ "2020-07-07",
+ "2020-07-08",
+ "2020-07-09",
+ "2020-07-10",
+ "2020-07-13",
+ "2020-07-14",
+ "2020-07-15",
+ "2020-07-16",
+ "2020-07-17",
+ "2020-07-20",
+ "2020-07-21",
+ "2020-07-22",
+ "2020-07-23",
+ "2020-07-24",
+ "2020-07-27",
+ "2020-07-28",
+ "2020-07-29",
+ "2020-07-30",
+ "2020-07-31",
+ "2020-08-03",
+ "2020-08-04",
+ "2020-08-05",
+ "2020-08-06",
+ "2020-08-07",
+ "2020-08-10",
+ "2020-08-11",
+ "2020-08-12",
+ "2020-08-13",
+ "2020-08-14",
+ "2020-08-17",
+ "2020-08-18",
+ "2020-08-19",
+ "2020-08-20",
+ "2020-08-21",
+ "2020-08-24",
+ "2020-08-25",
+ "2020-08-26",
+ "2020-08-27",
+ "2020-08-28",
+ "2020-08-31",
+ "2020-09-01",
+ "2020-09-02",
+ "2020-09-03",
+ "2020-09-04",
+ "2020-09-07",
+ "2020-09-08",
+ "2020-09-09",
+ "2020-09-10",
+ "2020-09-11",
+ "2020-09-14",
+ "2020-09-15",
+ "2020-09-16",
+ "2020-09-17",
+ "2020-09-18",
+ "2020-09-21",
+ "2020-09-22",
+ "2020-09-23",
+ "2020-09-24",
+ "2020-09-25",
+ "2020-09-28",
+ "2020-09-29",
+ "2020-09-30",
+ "2020-10-01",
+ "2020-10-02",
+ "2020-10-05",
+ "2020-10-06",
+ "2020-10-07",
+ "2020-10-08",
+ "2020-10-09",
+ "2020-10-12",
+ "2020-10-13",
+ "2020-10-14",
+ "2020-10-15",
+ "2020-10-16",
+ "2020-10-19",
+ "2020-10-20",
+ "2020-10-21",
+ "2020-10-22",
+ "2020-10-23",
+ "2020-10-26",
+ "2020-10-27",
+ "2020-10-28",
+ "2020-10-29",
+ "2020-10-30",
+ "2020-11-02",
+ "2020-11-03",
+ "2020-11-04",
+ "2020-11-05",
+ "2020-11-06",
+ "2020-11-09",
+ "2020-11-10",
+ "2020-11-11",
+ "2020-11-12",
+ "2020-11-13",
+ "2020-11-16",
+ "2020-11-17",
+ "2020-11-18",
+ "2020-11-19",
+ "2020-11-20",
+ "2020-11-23",
+ "2020-11-24",
+ "2020-11-25",
+ "2020-11-26",
+ "2020-11-27",
+ "2020-11-30",
+ "2020-12-01",
+ "2020-12-02",
+ "2020-12-03",
+ "2020-12-04",
+ "2020-12-07",
+ "2020-12-08",
+ "2020-12-09",
+ "2020-12-10",
+ "2020-12-11",
+ "2020-12-14",
+ "2020-12-15",
+ "2020-12-16",
+ "2020-12-17",
+ "2020-12-18",
+ "2020-12-21",
+ "2020-12-22",
+ "2020-12-23",
+ "2020-12-24",
+ "2020-12-25",
+ "2020-12-28",
+ "2020-12-29",
+ "2020-12-30",
+ "2020-12-31",
+ "2021-01-01",
+ "2021-01-04",
+ "2021-01-05",
+ "2021-01-06",
+ "2021-01-07",
+ "2021-01-08",
+ "2021-01-11",
+ "2021-01-12",
+ "2021-01-13",
+ "2021-01-14",
+ "2021-01-15",
+ "2021-01-18",
+ "2021-01-19",
+ "2021-01-20",
+ "2021-01-21",
+ "2021-01-22",
+ "2021-01-25",
+ "2021-01-26",
+ "2021-01-27",
+ "2021-01-28",
+ "2021-01-29",
+ "2021-02-01",
+ "2021-02-02",
+ "2021-02-03",
+ "2021-02-04",
+ "2021-02-05",
+ "2021-02-08",
+ "2021-02-09",
+ "2021-02-10",
+ "2021-02-11",
+ "2021-02-12",
+ "2021-02-15",
+ "2021-02-16",
+ "2021-02-17",
+ "2021-02-18",
+ "2021-02-19",
+ "2021-02-22",
+ "2021-02-23",
+ "2021-02-24",
+ "2021-02-25",
+ "2021-02-26",
+ "2021-03-01",
+ "2021-03-02",
+ "2021-03-03",
+ "2021-03-04",
+ "2021-03-05",
+ "2021-03-08",
+ "2021-03-09",
+ "2021-03-10",
+ "2021-03-11",
+ "2021-03-12",
+ "2021-03-15",
+ "2021-03-16",
+ "2021-03-17",
+ "2021-03-18",
+ "2021-03-19",
+ "2021-03-22",
+ "2021-03-23",
+ "2021-03-24",
+ "2021-03-25",
+ "2021-03-26",
+ "2021-03-29",
+ "2021-03-30",
+ "2021-03-31",
+ "2021-04-01",
+ "2021-04-02",
+ "2021-04-05",
+ "2021-04-06",
+ "2021-04-07",
+ "2021-04-08",
+ "2021-04-09",
+ "2021-04-12",
+ "2021-04-13",
+ "2021-04-14",
+ "2021-04-15",
+ "2021-04-16",
+ "2021-04-19",
+ "2021-04-20",
+ "2021-04-21",
+ "2021-04-22",
+ "2021-04-23",
+ "2021-04-26",
+ "2021-04-27",
+ "2021-04-28",
+ "2021-04-29",
+ "2021-04-30",
+ "2021-05-03",
+ "2021-05-04",
+ "2021-05-05",
+ "2021-05-06",
+ "2021-05-07",
+ "2021-05-10",
+ "2021-05-11",
+ "2021-05-12",
+ "2021-05-13",
+ "2021-05-14",
+ "2021-05-17",
+ "2021-05-18",
+ "2021-05-19",
+ "2021-05-20",
+ "2021-05-21",
+ "2021-05-24",
+ "2021-05-25",
+ "2021-05-26",
+ "2021-05-27",
+ "2021-05-28",
+ "2021-05-31",
+ "2021-06-01",
+ "2021-06-02",
+ "2021-06-03",
+ "2021-06-04",
+ "2021-06-07",
+ "2021-06-08",
+ "2021-06-09",
+ "2021-06-10",
+ "2021-06-11",
+ "2021-06-14",
+ "2021-06-15",
+ "2021-06-16",
+ "2021-06-17",
+ "2021-06-18",
+ "2021-06-21",
+ "2021-06-22",
+ "2021-06-23",
+ "2021-06-24",
+ "2021-06-25",
+ "2021-06-28",
+ "2021-06-29",
+ "2021-06-30",
+ "2021-07-01",
+ "2021-07-02",
+ "2021-07-05",
+ "2021-07-06",
+ "2021-07-07",
+ "2021-07-08",
+ "2021-07-09",
+ "2021-07-12",
+ "2021-07-13",
+ "2021-07-14",
+ "2021-07-15",
+ "2021-07-16",
+ "2021-07-19",
+ "2021-07-20",
+ "2021-07-21",
+ "2021-07-22",
+ "2021-07-23",
+ "2021-07-26",
+ "2021-07-27",
+ "2021-07-28",
+ "2021-07-29",
+ "2021-07-30",
+ "2021-08-02",
+ "2021-08-03",
+ "2021-08-04",
+ "2021-08-05",
+ "2021-08-06",
+ "2021-08-09",
+ "2021-08-10",
+ "2021-08-11",
+ "2021-08-12",
+ "2021-08-13",
+ "2021-08-16",
+ "2021-08-17",
+ "2021-08-18",
+ "2021-08-19",
+ "2021-08-20",
+ "2021-08-23",
+ "2021-08-24",
+ "2021-08-25",
+ "2021-08-26",
+ "2021-08-27",
+ "2021-08-30",
+ "2021-08-31",
+ "2021-09-01",
+ "2021-09-02",
+ "2021-09-03",
+ "2021-09-06",
+ "2021-09-07",
+ "2021-09-08",
+ "2021-09-09",
+ "2021-09-10",
+ "2021-09-13",
+ "2021-09-14",
+ "2021-09-15",
+ "2021-09-16",
+ "2021-09-17",
+ "2021-09-20",
+ "2021-09-21",
+ "2021-09-22",
+ "2021-09-23",
+ "2021-09-24",
+ "2021-09-27",
+ "2021-09-28",
+ "2021-09-29",
+ "2021-09-30",
+ "2021-10-01",
+ "2021-10-04",
+ "2021-10-05",
+ "2021-10-06",
+ "2021-10-07",
+ "2021-10-08",
+ "2021-10-11",
+ "2021-10-12",
+ "2021-10-13",
+ "2021-10-14",
+ "2021-10-15",
+ "2021-10-18",
+ "2021-10-19",
+ "2021-10-20",
+ "2021-10-21",
+ "2021-10-22",
+ "2021-10-25",
+ "2021-10-26",
+ "2021-10-27",
+ "2021-10-28",
+ "2021-10-29",
+ "2021-11-01",
+ "2021-11-02",
+ "2021-11-03",
+ "2021-11-04",
+ "2021-11-05",
+ "2021-11-08",
+ "2021-11-09",
+ "2021-11-10",
+ "2021-11-11",
+ "2021-11-12",
+ "2021-11-15",
+ "2021-11-16",
+ "2021-11-17",
+ "2021-11-18",
+ "2021-11-19",
+ "2021-11-22",
+ "2021-11-23",
+ "2021-11-24",
+ "2021-11-25",
+ "2021-11-26",
+ "2021-11-29",
+ "2021-11-30",
+ "2021-12-01",
+ "2021-12-02",
+ "2021-12-03",
+ "2021-12-06",
+ "2021-12-07",
+ "2021-12-08",
+ "2021-12-09",
+ "2021-12-10",
+ "2021-12-13",
+ "2021-12-14",
+ "2021-12-15",
+ "2021-12-16",
+ "2021-12-17",
+ "2021-12-20",
+ "2021-12-21",
+ "2021-12-22",
+ "2021-12-23",
+ "2021-12-24",
+ "2021-12-27",
+ "2021-12-28",
+ "2021-12-29",
+ "2021-12-30",
+ "2021-12-31",
+ "2022-01-03",
+ "2022-01-04",
+ "2022-01-05",
+ "2022-01-06",
+ "2022-01-07",
+ "2022-01-10",
+ "2022-01-11",
+ "2022-01-12",
+ "2022-01-13",
+ "2022-01-14",
+ "2022-01-17",
+ "2022-01-18",
+ "2022-01-19",
+ "2022-01-20",
+ "2022-01-21",
+ "2022-01-24",
+ "2022-01-25",
+ "2022-01-26",
+ "2022-01-27",
+ "2022-01-28",
+ "2022-01-31",
+ "2022-02-01",
+ "2022-02-02",
+ "2022-02-03",
+ "2022-02-04",
+ "2022-02-07",
+ "2022-02-08",
+ "2022-02-09",
+ "2022-02-10",
+ "2022-02-11",
+ "2022-02-14",
+ "2022-02-15",
+ "2022-02-16",
+ "2022-02-17",
+ "2022-02-18",
+ "2022-02-21",
+ "2022-02-22",
+ "2022-02-23",
+ "2022-02-24",
+ "2022-02-25",
+ "2022-02-28",
+ "2022-03-01",
+ "2022-03-02",
+ "2022-03-03",
+ "2022-03-04",
+ "2022-03-07",
+ "2022-03-08",
+ "2022-03-09",
+ "2022-03-10",
+ "2022-03-11",
+ "2022-03-14",
+ "2022-03-15",
+ "2022-03-16",
+ "2022-03-17",
+ "2022-03-18",
+ "2022-03-21",
+ "2022-03-22",
+ "2022-03-23",
+ "2022-03-24",
+ "2022-03-25",
+ "2022-03-28",
+ "2022-03-29",
+ "2022-03-30",
+ "2022-03-31",
+ "2022-04-01",
+ "2022-04-04",
+ "2022-04-05",
+ "2022-04-06",
+ "2022-04-07",
+ "2022-04-08",
+ "2022-04-11",
+ "2022-04-12",
+ "2022-04-13",
+ "2022-04-14",
+ "2022-04-15",
+ "2022-04-18",
+ "2022-04-19",
+ "2022-04-20",
+ "2022-04-21",
+ "2022-04-22",
+ "2022-04-25",
+ "2022-04-26",
+ "2022-04-27",
+ "2022-04-28",
+ "2022-04-29",
+ "2022-05-02",
+ "2022-05-03",
+ "2022-05-04",
+ "2022-05-05",
+ "2022-05-06",
+ "2022-05-09",
+ "2022-05-10",
+ "2022-05-11",
+ "2022-05-12",
+ "2022-05-13",
+ "2022-05-16",
+ "2022-05-17",
+ "2022-05-18",
+ "2022-05-19",
+ "2022-05-20",
+ "2022-05-23",
+ "2022-05-24",
+ "2022-05-25",
+ "2022-05-26",
+ "2022-05-27",
+ "2022-05-30",
+ "2022-05-31",
+ "2022-06-01",
+ "2022-06-02",
+ "2022-06-03",
+ "2022-06-06",
+ "2022-06-07",
+ "2022-06-08",
+ "2022-06-09",
+ "2022-06-10",
+ "2022-06-13",
+ "2022-06-14",
+ "2022-06-15",
+ "2022-06-16",
+ "2022-06-17",
+ "2022-06-20",
+ "2022-06-21",
+ "2022-06-22",
+ "2022-06-23",
+ "2022-06-24",
+ "2022-06-27",
+ "2022-06-28",
+ "2022-06-29",
+ "2022-06-30",
+ "2022-07-01",
+ "2022-07-04",
+ "2022-07-05",
+ "2022-07-06",
+ "2022-07-07",
+ "2022-07-08",
+ "2022-07-11",
+ "2022-07-12",
+ "2022-07-13",
+ "2022-07-14",
+ "2022-07-15",
+ "2022-07-18",
+ "2022-07-19",
+ "2022-07-20",
+ "2022-07-21",
+ "2022-07-22",
+ "2022-07-25",
+ "2022-07-26",
+ "2022-07-27",
+ "2022-07-28",
+ "2022-07-29",
+ "2022-08-01",
+ "2022-08-02",
+ "2022-08-03",
+ "2022-08-04",
+ "2022-08-05",
+ "2022-08-08",
+ "2022-08-09",
+ "2022-08-10",
+ "2022-08-11",
+ "2022-08-12",
+ "2022-08-15",
+ "2022-08-16",
+ "2022-08-17",
+ "2022-08-18",
+ "2022-08-19",
+ "2022-08-22",
+ "2022-08-23",
+ "2022-08-24",
+ "2022-08-25",
+ "2022-08-26",
+ "2022-08-29",
+ "2022-08-30",
+ "2022-08-31",
+ "2022-09-01",
+ "2022-09-02",
+ "2022-09-05",
+ "2022-09-06",
+ "2022-09-07",
+ "2022-09-08",
+ "2022-09-09",
+ "2022-09-12",
+ "2022-09-13",
+ "2022-09-14",
+ "2022-09-15",
+ "2022-09-16",
+ "2022-09-19",
+ "2022-09-20",
+ "2022-09-21",
+ "2022-09-22",
+ "2022-09-23",
+ "2022-09-26",
+ "2022-09-27",
+ "2022-09-28",
+ "2022-09-29",
+ "2022-09-30",
+ "2022-10-03",
+ "2022-10-04",
+ "2022-10-05",
+ "2022-10-06",
+ "2022-10-07",
+ "2022-10-10",
+ "2022-10-11",
+ "2022-10-12",
+ "2022-10-13",
+ "2022-10-14",
+ "2022-10-17",
+ "2022-10-18",
+ "2022-10-19",
+ "2022-10-20",
+ "2022-10-21",
+ "2022-10-24",
+ "2022-10-25",
+ "2022-10-26",
+ "2022-10-27",
+ "2022-10-28",
+ "2022-10-31",
+ "2022-11-01",
+ "2022-11-02",
+ "2022-11-03",
+ "2022-11-04",
+ "2022-11-07",
+ "2022-11-08",
+ "2022-11-09",
+ "2022-11-10",
+ "2022-11-11",
+ "2022-11-14",
+ "2022-11-15",
+ "2022-11-16",
+ "2022-11-17",
+ "2022-11-18",
+ "2022-11-21",
+ "2022-11-22",
+ "2022-11-23",
+ "2022-11-24",
+ "2022-11-25",
+ "2022-11-28",
+ "2022-11-29",
+ "2022-11-30",
+ "2022-12-01",
+ "2022-12-02",
+ "2022-12-05",
+ "2022-12-06",
+ "2022-12-07",
+ "2022-12-08",
+ "2022-12-09",
+ "2022-12-12",
+ "2022-12-13",
+ "2022-12-14",
+ "2022-12-15",
+ "2022-12-16",
+ "2022-12-19",
+ "2022-12-20",
+ "2022-12-21",
+ "2022-12-22",
+ "2022-12-23",
+ "2022-12-26",
+ "2022-12-27",
+ "2022-12-28",
+ "2022-12-29",
+ "2022-12-30",
+ "2023-01-02",
+ "2023-01-03",
+ "2023-01-04",
+ "2023-01-05",
+ "2023-01-06",
+ "2023-01-09",
+ "2023-01-10",
+ "2023-01-11",
+ "2023-01-12",
+ "2023-01-13",
+ "2023-01-16",
+ "2023-01-17",
+ "2023-01-18",
+ "2023-01-19",
+ "2023-01-20",
+ "2023-01-23",
+ "2023-01-24",
+ "2023-01-25",
+ "2023-01-26",
+ "2023-01-27",
+ "2023-01-30",
+ "2023-01-31",
+ "2023-02-01",
+ "2023-02-02",
+ "2023-02-03",
+ "2023-02-06",
+ "2023-02-07",
+ "2023-02-08",
+ "2023-02-09",
+ "2023-02-10",
+ "2023-02-13",
+ "2023-02-14",
+ "2023-02-15",
+ "2023-02-16",
+ "2023-02-17",
+ "2023-02-20",
+ "2023-02-21",
+ "2023-02-22",
+ "2023-02-23",
+ "2023-02-24",
+ "2023-02-27",
+ "2023-02-28",
+ "2023-03-01",
+ "2023-03-02",
+ "2023-03-03",
+ "2023-03-06",
+ "2023-03-07",
+ "2023-03-08",
+ "2023-03-09",
+ "2023-03-10",
+ "2023-03-13",
+ "2023-03-14",
+ "2023-03-15",
+ "2023-03-16",
+ "2023-03-17",
+ "2023-03-20",
+ "2023-03-21",
+ "2023-03-22",
+ "2023-03-23",
+ "2023-03-24",
+ "2023-03-27",
+ "2023-03-28",
+ "2023-03-29",
+ "2023-03-30",
+ "2023-03-31",
+ "2023-04-03",
+ "2023-04-04",
+ "2023-04-05",
+ "2023-04-06",
+ "2023-04-07",
+ "2023-04-10",
+ "2023-04-11",
+ "2023-04-12",
+ "2023-04-13",
+ "2023-04-14",
+ "2023-04-17",
+ "2023-04-18",
+ "2023-04-19",
+ "2023-04-20",
+ "2023-04-21",
+ "2023-04-24",
+ "2023-04-25",
+ "2023-04-26",
+ "2023-04-27",
+ "2023-04-28",
+ "2023-05-01",
+ "2023-05-02",
+ "2023-05-03",
+ "2023-05-04",
+ "2023-05-05",
+ "2023-05-08",
+ "2023-05-09",
+ "2023-05-10",
+ "2023-05-11",
+ "2023-05-12",
+ "2023-05-15",
+ "2023-05-16",
+ "2023-05-17",
+ "2023-05-18",
+ "2023-05-19",
+ "2023-05-22",
+ "2023-05-23",
+ "2023-05-24",
+ "2023-05-25",
+ "2023-05-26",
+ "2023-05-29",
+ "2023-05-30",
+ "2023-05-31",
+ "2023-06-01",
+ "2023-06-02",
+ "2023-06-05",
+ "2023-06-06",
+ "2023-06-07",
+ "2023-06-08",
+ "2023-06-09",
+ "2023-06-12",
+ "2023-06-13",
+ "2023-06-14",
+ "2023-06-15",
+ "2023-06-16",
+ "2023-06-19",
+ "2023-06-20",
+ "2023-06-21",
+ "2023-06-22",
+ "2023-06-23",
+ "2023-06-26",
+ "2023-06-27",
+ "2023-06-28",
+ "2023-06-29",
+ "2023-06-30",
+ "2023-07-03",
+ "2023-07-04",
+ "2023-07-05",
+ "2023-07-06",
+ "2023-07-07",
+ "2023-07-10",
+ "2023-07-11",
+ "2023-07-12",
+ "2023-07-13",
+ "2023-07-14",
+ "2023-07-17",
+ "2023-07-18",
+ "2023-07-19",
+ "2023-07-20",
+ "2023-07-21",
+ "2023-07-24",
+ "2023-07-25",
+ "2023-07-26",
+ "2023-07-27",
+ "2023-07-28",
+ "2023-07-31",
+ "2023-08-01",
+ "2023-08-02",
+ "2023-08-03",
+ "2023-08-04",
+ "2023-08-07",
+ "2023-08-08",
+ "2023-08-09",
+ "2023-08-10",
+ "2023-08-11",
+ "2023-08-14",
+ "2023-08-15",
+ "2023-08-16",
+ "2023-08-17",
+ "2023-08-18",
+ "2023-08-21",
+ "2023-08-22",
+ "2023-08-23",
+ "2023-08-24",
+ "2023-08-25",
+ "2023-08-28",
+ "2023-08-29",
+ "2023-08-30",
+ "2023-08-31",
+ "2023-09-01",
+ "2023-09-04",
+ "2023-09-05",
+ "2023-09-06",
+ "2023-09-07",
+ "2023-09-08",
+ "2023-09-11",
+ "2023-09-12",
+ "2023-09-13",
+ "2023-09-14",
+ "2023-09-15",
+ "2023-09-18",
+ "2023-09-19",
+ "2023-09-20",
+ "2023-09-21",
+ "2023-09-22",
+ "2023-09-25",
+ "2023-09-26",
+ "2023-09-27",
+ "2023-09-28",
+ "2023-09-29",
+ "2023-10-02",
+ "2023-10-03",
+ "2023-10-04",
+ "2023-10-05",
+ "2023-10-06",
+ "2023-10-09",
+ "2023-10-10",
+ "2023-10-11",
+ "2023-10-12",
+ "2023-10-13",
+ "2023-10-16",
+ "2023-10-17",
+ "2023-10-18",
+ "2023-10-19",
+ "2023-10-20",
+ "2023-10-23",
+ "2023-10-24",
+ "2023-10-25",
+ "2023-10-26",
+ "2023-10-27",
+ "2023-10-30",
+ "2023-10-31"
+ ],
+ "datasets": [
+ {
+ "label": "Drawdown Chart",
+ "data": [
+ 0.0,
+ -0.004281117501357956,
+ -0.01428283531412855,
+ -0.032301570796637646,
+ -0.04048940061868089,
+ -0.0381760201360033,
+ -0.03527057187411731,
+ -0.04054189453362722,
+ -0.04471847573336385,
+ -0.04364689045696535,
+ -0.05793824536980696,
+ -0.07312527997251306,
+ -0.06975630247249553,
+ -0.06299803567356443,
+ -0.05922076785518915,
+ -0.056439346566591886,
+ -0.06141644623526232,
+ -0.055845424558536805,
+ -0.06213956927275721,
+ -0.07111580440235055,
+ -0.05691970438497984,
+ -0.057387430907743564,
+ -0.05309655128443047,
+ -0.05772245723863767,
+ -0.06724075389769057,
+ -0.07825628275076935,
+ -0.07390885960680182,
+ -0.07568093857110236,
+ -0.07074322443053482,
+ -0.07494856261686789,
+ -0.06993929148849398,
+ -0.0536139211972364,
+ -0.07295734599949777,
+ -0.06634946588943236,
+ -0.055026579952743515,
+ -0.06583437000528625,
+ -0.07414654172806956,
+ -0.08293404293755036,
+ -0.08182466020343637,
+ -0.08489225649503163,
+ -0.09032825390418442,
+ -0.09016250652482682,
+ -0.0990496914165141,
+ -0.07902692249643062,
+ -0.070431659341745,
+ -0.04931113199358417,
+ -0.05466284531437693,
+ -0.07956698308790588,
+ -0.07922582153100044,
+ -0.08094752112481851,
+ -0.08582138718169818,
+ -0.10236547155566333,
+ -0.10683964270557789,
+ -0.11074537319922195,
+ -0.09009919627102914,
+ -0.07165999285531521,
+ -0.08441306057723164,
+ -0.08624279710538096,
+ -0.08944480958104484,
+ -0.1071797821832956,
+ -0.12683140156427297,
+ -0.12944595126945957,
+ -0.14446909661290175,
+ -0.15029062618610878,
+ -0.13576045167781214,
+ -0.137762690102045,
+ -0.1302604354380309,
+ -0.13323170780473326,
+ -0.13739331924846354,
+ -0.13729569395493968,
+ -0.14088188258846912,
+ -0.1359195001283301,
+ -0.14293540941129967,
+ -0.1514994135879527,
+ -0.1536242319374327,
+ -0.14775002449093166,
+ -0.14609723767571048,
+ -0.15336029647891936,
+ -0.15274790679937533,
+ -0.14162970144359388,
+ -0.1384364045552824,
+ -0.13745319263097766,
+ -0.13906368341483655,
+ -0.1354565518986136,
+ -0.13648874403818712,
+ -0.13693448935988928,
+ -0.13626236709501627,
+ -0.13490668297239516,
+ -0.1325768338841954,
+ -0.1345319565440919,
+ -0.1348653071666297,
+ -0.14890022820146487,
+ -0.14068755927780852,
+ -0.15573491424520125,
+ -0.157558853766941,
+ -0.16236961870420796,
+ -0.15530912053739465,
+ -0.17153735193522157,
+ -0.17039594849676298,
+ -0.1656877291590345,
+ -0.17350801187817422,
+ -0.16874049214968634,
+ -0.17345426257939078,
+ -0.18134279412767318,
+ -0.1929760508609173,
+ -0.19841479309960763,
+ -0.18948226459340167,
+ -0.19435017256458953,
+ -0.1913667101150155,
+ -0.18639374898559036,
+ -0.17896487600275934,
+ -0.1721526133798219,
+ -0.18309262813979443,
+ -0.19581789457023469,
+ -0.20783932828800356,
+ -0.2129970568423315,
+ -0.19888043711061998,
+ -0.19594698340493533,
+ -0.192407211621339,
+ -0.19229675838415772,
+ -0.19952280366111041,
+ -0.19889438830819983,
+ -0.20250350836666664,
+ -0.19287013248881069,
+ -0.18975257843115167,
+ -0.2023128358935452,
+ -0.2000087280464774,
+ -0.19465877044444513,
+ -0.1843032616345841,
+ -0.19601040944157633,
+ -0.20285715041869112,
+ -0.1919880179804917,
+ -0.2090093932490934,
+ -0.22048670192255626,
+ -0.22302127756076895,
+ -0.21269667182228003,
+ -0.20556114803585868,
+ -0.19702310935630574,
+ -0.20848144127301194,
+ -0.19507242439274486,
+ -0.20682929119887983,
+ -0.20601223041048167,
+ -0.19930987250352705,
+ -0.20154349586065234,
+ -0.19522767604243274,
+ -0.20170535437784287,
+ -0.20345015035486202,
+ -0.2111151158983755,
+ -0.2151814075038384,
+ -0.2125400212338976,
+ -0.19957279968958674,
+ -0.1970505903394325,
+ -0.20209298212849036,
+ -0.21333150170895343,
+ -0.2120817222575344,
+ -0.2033392160190851,
+ -0.2138492031224435,
+ -0.21356895900116402,
+ -0.21376796354525773,
+ -0.21488752483932194,
+ -0.22958491748820808,
+ -0.23824708228307268,
+ -0.23404365267925697,
+ -0.2385144951129149,
+ -0.24218744225860045,
+ -0.24030624755814511,
+ -0.24204986740088152,
+ -0.24929873931499447,
+ -0.2660828608039133,
+ -0.26053007951827645,
+ -0.2712642030476755,
+ -0.2707338082135724,
+ -0.2740303870616434,
+ -0.27231637719115254,
+ -0.27412187369805663,
+ -0.27565328970443403,
+ -0.2890064149513113,
+ -0.2890882807556414,
+ -0.2874193940185854,
+ -0.28214470651712553,
+ -0.2837967460940011,
+ -0.2863711072222702,
+ -0.2844350379567181,
+ -0.2882911358736616,
+ -0.2907014854226003,
+ -0.30182475884265425,
+ -0.30662389161805537,
+ -0.318084731327258,
+ -0.3163333070548837,
+ -0.2999602002403169,
+ -0.3060821279374999,
+ -0.3170278745524503,
+ -0.31639365874953984,
+ -0.3130442820504781,
+ -0.30876074665060893,
+ -0.31414572034232946,
+ -0.32492869324439566,
+ -0.3247747078533083,
+ -0.332864172842926,
+ -0.34205792965691817,
+ -0.34192685511587706,
+ -0.35091191359326024,
+ -0.3542582301048729,
+ -0.36081644853925654,
+ -0.35645651071256734,
+ -0.35018174591652695,
+ -0.3503350922452586,
+ -0.3543347657864363,
+ -0.34998480573026214,
+ -0.3462794863584622,
+ -0.3514411276488886,
+ -0.3475841816613622,
+ -0.3439887278940138,
+ -0.3511418144642855,
+ -0.3502075309006051,
+ -0.34509653379287153,
+ -0.33840577149177076,
+ -0.3231847893639562,
+ -0.3172944714846708,
+ -0.3201699414293635,
+ -0.3183885975298014,
+ -0.32361379711573823,
+ -0.32445248934348314,
+ -0.3281846907330007,
+ -0.3354178123932615,
+ -0.3416366597088718,
+ -0.3425419127319692,
+ -0.34350307387268886,
+ -0.33940485286937394,
+ -0.33932384086120404,
+ -0.3414431557440306,
+ -0.3506947759631781,
+ -0.34849201024057463,
+ -0.3502437044716614,
+ -0.34713921806570636,
+ -0.34433938457422875,
+ -0.3328609086976332,
+ -0.33065563413367405,
+ -0.32763096039781536,
+ -0.3200495276937294,
+ -0.32916551049716936,
+ -0.3299162254482998,
+ -0.33689367119322755,
+ -0.34395647325648415,
+ -0.3431348915961848,
+ -0.34350698869319884,
+ -0.34095511958955205,
+ -0.3187123966952269,
+ -0.32760951158513496,
+ -0.33508973858567104,
+ -0.32488330025019363,
+ -0.3176840231697151,
+ -0.31705459064872155,
+ -0.31189247253425356,
+ -0.3025974173014666,
+ -0.29805381820943244,
+ -0.2899246641945691,
+ -0.2843891305399999,
+ -0.2795592943337204,
+ -0.26854141537354115,
+ -0.2557485359171586,
+ -0.25597076058326906,
+ -0.25955173820438293,
+ -0.26809781497675766,
+ -0.2746617236871255,
+ -0.27177828971011886,
+ -0.2850628407927973,
+ -0.2782832949033356,
+ -0.28323396707275406,
+ -0.27828580012638104,
+ -0.2859398562118741,
+ -0.2918284150994098,
+ -0.2859073469898229,
+ -0.29453544602481563,
+ -0.309000484001847,
+ -0.31129310662590237,
+ -0.31155581578489133,
+ -0.3021607123671516,
+ -0.30563652162041177,
+ -0.2892448422436691,
+ -0.2813342035600028,
+ -0.2854160774151543,
+ -0.2871549989913307,
+ -0.2954234493056829,
+ -0.29209866770918935,
+ -0.2937042417011553,
+ -0.280883834227718,
+ -0.2746305043174829,
+ -0.27742898014229034,
+ -0.2799112223072646,
+ -0.28592085129005707,
+ -0.2801061623379534,
+ -0.30070563011893414,
+ -0.28531981994069666,
+ -0.28507669422471715,
+ -0.2864787413755572,
+ -0.2879891654380965,
+ -0.2914085164845378,
+ -0.29541040023299525,
+ -0.29315667582122107,
+ -0.2948499338228907,
+ -0.2958766303071432,
+ -0.2916096717544123,
+ -0.2892742191657982,
+ -0.286778210969997,
+ -0.2770950320374679,
+ -0.2609034457153603,
+ -0.25667222770513587,
+ -0.266248101870738,
+ -0.26504477978672536,
+ -0.26219261378777536,
+ -0.2680794461356325,
+ -0.2647809814387474,
+ -0.2576207794093003,
+ -0.26684303121901654,
+ -0.2695632747501344,
+ -0.2692540085120194,
+ -0.2774635735344102,
+ -0.26501429633841134,
+ -0.25778721032125806,
+ -0.2640546126105542,
+ -0.2545970285099147,
+ -0.24929105869655455,
+ -0.25018643591506307,
+ -0.24313634536209305,
+ -0.25148864764064316,
+ -0.2573305690811073,
+ -0.25256622410081997,
+ -0.25201801256316303,
+ -0.25831097703854,
+ -0.2543605939719211,
+ -0.24983297819607053,
+ -0.2579364237279671,
+ -0.263051570832342,
+ -0.25496160792604117,
+ -0.2524268584078866,
+ -0.2519448020861036,
+ -0.2553570022211591,
+ -0.262054104013581,
+ -0.2611012659855808,
+ -0.2601965823374155,
+ -0.26690683560891393,
+ -0.2559202440458167,
+ -0.2497630358300389,
+ -0.2623490353679291,
+ -0.2624095940161022,
+ -0.2677207986894019,
+ -0.2729059836911669,
+ -0.2812848724063933,
+ -0.27842286802859795,
+ -0.278360096372256,
+ -0.27218666678992043,
+ -0.27054047539992043,
+ -0.28097185155802107,
+ -0.27774357326597177,
+ -0.2741106759079528,
+ -0.25743781251821907,
+ -0.26522291233888284,
+ -0.27756814914336325,
+ -0.28802804448659003,
+ -0.28634833703205065,
+ -0.28928564387524447,
+ -0.2929250011418808,
+ -0.2902610338879912,
+ -0.28451715775951625,
+ -0.28085323385857186,
+ -0.2892562378942346,
+ -0.3030317707198549,
+ -0.29761882693723096,
+ -0.3127245293631431,
+ -0.30994162100369405,
+ -0.3164291209413387,
+ -0.3062995679071737,
+ -0.31003571326866364,
+ -0.31202990647952034,
+ -0.2966618973764391,
+ -0.2964161304406835,
+ -0.29429603313254904,
+ -0.2901512750619305,
+ -0.3071868214579716,
+ -0.3014922954837477,
+ -0.29838037282715024,
+ -0.3033567997075376,
+ -0.3151881759305496,
+ -0.31784615680717143,
+ -0.32659823415110134,
+ -0.3246497340522817,
+ -0.33286823215246264,
+ -0.33587256601998483,
+ -0.3363505257911328,
+ -0.32537851416655517,
+ -0.32947443854372205,
+ -0.3185946332819505,
+ -0.32447163935189993,
+ -0.32277859149035615,
+ -0.31147367411167304,
+ -0.3125945433616224,
+ -0.31897767130289345,
+ -0.32065668095072775,
+ -0.3259730238884765,
+ -0.318842955357455,
+ -0.3313855796976921,
+ -0.33690593897199717,
+ -0.32935481349529083,
+ -0.3259943447168526,
+ -0.3205935924135297,
+ -0.3237147802236632,
+ -0.3211732739571811,
+ -0.31939198066500296,
+ -0.3246632636110228,
+ -0.3235656378055166,
+ -0.3313435813474356,
+ -0.32863051140345045,
+ -0.3256350036526876,
+ -0.33045972230960674,
+ -0.34017025071919527,
+ -0.32733878646062897,
+ -0.33431019796251704,
+ -0.33227717505548005,
+ -0.3313070859188991,
+ -0.32321521877304726,
+ -0.31882916817253304,
+ -0.32362459040044467,
+ -0.3233277953100845,
+ -0.3233365852105725,
+ -0.33203134094608044,
+ -0.33743949868226986,
+ -0.33943334413343984,
+ -0.33893150888433765,
+ -0.33082187147294306,
+ -0.325664368959133,
+ -0.322177612115672,
+ -0.3263740329994135,
+ -0.32235931528520445,
+ -0.325464766480284,
+ -0.3297555444311123,
+ -0.33406469896074664,
+ -0.3329055862389749,
+ -0.32640962184737277,
+ -0.3139169247543401,
+ -0.3059179269985445,
+ -0.3068050595268462,
+ -0.3065475629985378,
+ -0.30639286273338007,
+ -0.3036402216661581,
+ -0.3142499416459009,
+ -0.3076937702434799,
+ -0.29994031245302866,
+ -0.2981852714366716,
+ -0.2936812863608199,
+ -0.2829133212124426,
+ -0.28991904074643715,
+ -0.28685063498836416,
+ -0.2910502987109449,
+ -0.2885464063778237,
+ -0.2836769644123128,
+ -0.2874656111781483,
+ -0.28767334092513364,
+ -0.29039825028589694,
+ -0.2945549973857482,
+ -0.29749028996647797,
+ -0.30557789225397347,
+ -0.2987095317558729,
+ -0.30555059594939593,
+ -0.2994617986468031,
+ -0.31433467460209874,
+ -0.32340089262958616,
+ -0.3143098292802674,
+ -0.3104953152659824,
+ -0.30975632439678136,
+ -0.32656645285631936,
+ -0.32638187671021723,
+ -0.3210868968640598,
+ -0.3151484272248366,
+ -0.31851423333403994,
+ -0.32990441309467733,
+ -0.33530176183692084,
+ -0.3371173158547025,
+ -0.34557132051213235,
+ -0.3523794365834738,
+ -0.3427436632551497,
+ -0.33106431519084145,
+ -0.3343008395079148,
+ -0.3302016908398169,
+ -0.3222446286980747,
+ -0.33085584226873554,
+ -0.32535620218264094,
+ -0.32159141747491826,
+ -0.3232404220691971,
+ -0.3274334490480352,
+ -0.328147248333714,
+ -0.32736084099385,
+ -0.3268808291101475,
+ -0.33157217431086294,
+ -0.3445869023890177,
+ -0.343962397691841,
+ -0.35042618781297563,
+ -0.35036241194795026,
+ -0.35231190172923965,
+ -0.35830847726184256,
+ -0.36575424388856614,
+ -0.36458503674580645,
+ -0.3715021413792343,
+ -0.3686347517998628,
+ -0.3827011466184691,
+ -0.3862279488806092,
+ -0.37723131317387315,
+ -0.3747821011054675,
+ -0.37243813095392986,
+ -0.35870466461531625,
+ -0.3469266832018847,
+ -0.34369925091792664,
+ -0.34349312034662194,
+ -0.34224168893951,
+ -0.3329140789023728,
+ -0.32936419533817796,
+ -0.3278603939156768,
+ -0.3297753923635347,
+ -0.32983503432224726,
+ -0.3260507286373385,
+ -0.3343435273290759,
+ -0.3268545730769623,
+ -0.3289341019497515,
+ -0.33122252779829353,
+ -0.32868710809526436,
+ -0.3251114316371434,
+ -0.3213873492999293,
+ -0.3193303736337313,
+ -0.3071151447640639,
+ -0.29143547411614856,
+ -0.280437308102817,
+ -0.2809096159716622,
+ -0.27821520801520994,
+ -0.2836160461568459,
+ -0.2745287080053591,
+ -0.27065340606306576,
+ -0.27031991315919834,
+ -0.25995606359637957,
+ -0.2572819595497643,
+ -0.2628663847935082,
+ -0.26632532148565413,
+ -0.27265801300699577,
+ -0.2816277734064617,
+ -0.28148994688493567,
+ -0.276578370784168,
+ -0.2691476274325548,
+ -0.2584700631063944,
+ -0.2531908759333522,
+ -0.2358485095762023,
+ -0.23500100411193148,
+ -0.23334601086861662,
+ -0.23253462890893317,
+ -0.2272379560027743,
+ -0.2217368966432195,
+ -0.21561275074863662,
+ -0.22541178393947792,
+ -0.22958473397859902,
+ -0.21938504543366621,
+ -0.21865972248766108,
+ -0.216790558456871,
+ -0.20801144602009325,
+ -0.20662655956619025,
+ -0.1994922775013971,
+ -0.21372454028275967,
+ -0.1925270137452546,
+ -0.1975647572358551,
+ -0.20289971670703522,
+ -0.20354078300610579,
+ -0.19497611838104945,
+ -0.1900225611409495,
+ -0.18911525713330546,
+ -0.1813772414126782,
+ -0.17500952837930728,
+ -0.17187352030915903,
+ -0.15296208760598162,
+ -0.15765154321664243,
+ -0.14647599132906297,
+ -0.14962614887174985,
+ -0.144084165990233,
+ -0.14416220430024007,
+ -0.1334181294244473,
+ -0.13739224598729283,
+ -0.1260679722847522,
+ -0.12542973241235067,
+ -0.1333078216782836,
+ -0.13267696851310673,
+ -0.1418086485037523,
+ -0.15229580322970382,
+ -0.1595942565359756,
+ -0.1685762012597415,
+ -0.1653765049324436,
+ -0.17282004843552756,
+ -0.1750220684529571,
+ -0.19229203331547984,
+ -0.1898489859408694,
+ -0.18924241122847985,
+ -0.19586949500032813,
+ -0.204308984051504,
+ -0.19161552625987888,
+ -0.19378344801293013,
+ -0.18463090911608104,
+ -0.19263557991579494,
+ -0.18062353800670994,
+ -0.18663927164465832,
+ -0.2012670736215748,
+ -0.18641534366905654,
+ -0.18722115934946904,
+ -0.18393622108002072,
+ -0.1723872993319081,
+ -0.16221095473294833,
+ -0.18157889892816903,
+ -0.18419275805554258,
+ -0.18415344428774183,
+ -0.18465633632587586,
+ -0.17735641935698743,
+ -0.1813671637534613,
+ -0.17002625944158567,
+ -0.16774674378858923,
+ -0.1627731789769924,
+ -0.1575088716499935,
+ -0.15929103486929108,
+ -0.15349608272485016,
+ -0.15074863272842687,
+ -0.14753521840122363,
+ -0.15955933707946035,
+ -0.15471817798808218,
+ -0.1408284890982764,
+ -0.15017236117395416,
+ -0.1548564957649774,
+ -0.16411368618509448,
+ -0.1761482365104453,
+ -0.16837846459935435,
+ -0.16075145080218134,
+ -0.15047839143470687,
+ -0.15778931087600878,
+ -0.1615001647175336,
+ -0.14456311448841985,
+ -0.1426760805150863,
+ -0.1378291963406839,
+ -0.13751743521640702,
+ -0.12896957837787404,
+ -0.12287148834132333,
+ -0.11244225177398137,
+ -0.10347954545242077,
+ -0.08140177023664541,
+ -0.07328285012584546,
+ -0.0842984207484404,
+ -0.08018521687312918,
+ -0.07991981620082578,
+ -0.0724597108511782,
+ -0.0793788457192206,
+ -0.0808731234623774,
+ -0.08378770976636296,
+ -0.09381817111619939,
+ -0.10193164217562212,
+ -0.09154307608887202,
+ -0.08488616296182983,
+ -0.08032128196517929,
+ -0.09434447187508688,
+ -0.09036243634632624,
+ -0.09460155863018105,
+ -0.10312261272317225,
+ -0.11743211314276314,
+ -0.1127591997687587,
+ -0.11596845258889454,
+ -0.11699361196159774,
+ -0.11375957156824135,
+ -0.13444382711039393,
+ -0.12973951746246792,
+ -0.14545937176415835,
+ -0.14818946298016733,
+ -0.12140733370894707,
+ -0.13805095632532594,
+ -0.13579924495713658,
+ -0.13684562476446605,
+ -0.1373441903462188,
+ -0.13784418597018544,
+ -0.14550263222956028,
+ -0.15195377894602935,
+ -0.15031064923788484,
+ -0.14807884836737661,
+ -0.1434618189571899,
+ -0.13345045119094157,
+ -0.1217303827610442,
+ -0.11111379529610421,
+ -0.12150798830959975,
+ -0.11658025908988656,
+ -0.11308765778328966,
+ -0.11525430288818417,
+ -0.1112898428555037,
+ -0.10490987869791957,
+ -0.10576910074821333,
+ -0.0980733250884076,
+ -0.10720889123888866,
+ -0.10608970764452075,
+ -0.11597836915621429,
+ -0.12726466721534502,
+ -0.13128621304656873,
+ -0.13403378443122482,
+ -0.1396022907358544,
+ -0.13343065832480727,
+ -0.13082108168317175,
+ -0.12246823888387903,
+ -0.11586338872667123,
+ -0.11925294416721255,
+ -0.12388390741761823,
+ -0.13430128245707285,
+ -0.1287733813517309,
+ -0.127113422440587,
+ -0.12631252499684953,
+ -0.13999025856001712,
+ -0.15456326303091494,
+ -0.16260870162683316,
+ -0.14926522708536416,
+ -0.138869280040826,
+ -0.1517991170456413,
+ -0.14822926277023696,
+ -0.15246091015660412,
+ -0.15493060042246898,
+ -0.15104935512371465,
+ -0.16322047965402686,
+ -0.16143311855069586,
+ -0.15425195401502678,
+ -0.1441997840265007,
+ -0.15090439725427385,
+ -0.1533154739527145,
+ -0.1634146676302154,
+ -0.17608872924242103,
+ -0.17679148223886176,
+ -0.17022397638812414,
+ -0.15217818565844277,
+ -0.14765297295572777,
+ -0.1467951342161662,
+ -0.14648142815733922,
+ -0.13320986715246874,
+ -0.12961360499813068,
+ -0.13399383619463423,
+ -0.1486034166507929,
+ -0.1494523195166948,
+ -0.14341837885126918,
+ -0.15307359728256342,
+ -0.15372237510876663,
+ -0.15567295440308515,
+ -0.1626782368058899,
+ -0.1611493238449494,
+ -0.14412513387576975,
+ -0.1333489459354521,
+ -0.14545047004151113,
+ -0.16127215966764408,
+ -0.16839911009668862,
+ -0.1593501852142687,
+ -0.16799284544807558,
+ -0.14672499436713682,
+ -0.13680853821310668,
+ -0.13255749415160245,
+ -0.13372333552548388,
+ -0.13295233348907576,
+ -0.1306698835101595,
+ -0.12202164543767935,
+ -0.120317705230365,
+ -0.12654868816634246,
+ -0.12524315048936385,
+ -0.12185856750640556,
+ -0.1159539279425632,
+ -0.10867754468053126,
+ -0.10733392033646483,
+ -0.10565650556605155,
+ -0.09798013831411068,
+ -0.086208993345395,
+ -0.07919528530504805,
+ -0.07871348959379532,
+ -0.08820686357638052,
+ -0.08728466983530059,
+ -0.07360959738021633,
+ -0.07955013844515513,
+ -0.08322984602959216,
+ -0.07798982989311531,
+ -0.07532902835701871,
+ -0.0869816193017885,
+ -0.0850524797747948,
+ -0.07347036265849705,
+ -0.0755515472689392,
+ -0.06416757657073613,
+ -0.035470018840112694,
+ -0.0311550375857349,
+ -0.032909108409510335,
+ -0.02226765772810002,
+ -0.036814264006837405,
+ -0.05067438662421209,
+ -0.0535020704229926,
+ -0.0381507422320293,
+ -0.03019552968937078,
+ -0.017187309821701247,
+ -0.004523585743421377,
+ -5.590572539682093e-06,
+ 0.0,
+ -0.0044354707928234705,
+ 0.0,
+ -0.011913708998478212,
+ -0.01660520325935022,
+ -0.026305349463374816,
+ -0.015165324786184153,
+ -0.02826132121984004,
+ -0.041638142981671455,
+ -0.055829086054778876,
+ -0.0581828432876329,
+ -0.07011385041664964,
+ -0.06643261717510074,
+ -0.06439237782295681,
+ -0.050353341666007134,
+ -0.07052825406752106,
+ -0.06328249662770535,
+ -0.06215152393226375,
+ -0.06271741121694097,
+ -0.0446292725427796,
+ -0.052138332569863555,
+ -0.0628079582666331,
+ -0.05275213434911297,
+ -0.04189016801420442,
+ -0.05007081374107791,
+ -0.04966068224283571,
+ -0.04006413574047163,
+ -0.026977301890563132,
+ -0.031116489758780785,
+ -0.02657168806270427,
+ -0.053394855796884966,
+ -0.0664162182183512,
+ -0.05803223710292427,
+ -0.06193939496236023,
+ -0.05407643204190138,
+ -0.049383392111301494,
+ -0.06119573105845533,
+ -0.05257698717380377,
+ -0.049343282776351804,
+ -0.06647314399794846,
+ -0.07571845455484394,
+ -0.07005407736462754,
+ -0.07834097362528902,
+ -0.08291282044613157,
+ -0.07630115871468934,
+ -0.07493035174169083,
+ -0.07117021764740994,
+ -0.08233911545343331,
+ -0.07746523903835845,
+ -0.07252702200472116,
+ -0.07015948072645184,
+ -0.08132580487515484,
+ -0.09237916595901763,
+ -0.08417000770823202,
+ -0.09005603152047226,
+ -0.0831676066368301,
+ -0.08100182858014648,
+ -0.08965741611220912,
+ -0.07697963693746745,
+ -0.05815554107482179,
+ -0.04327943599465767,
+ -0.039931630986097644,
+ -0.031030166539016135,
+ -0.03351630115563653,
+ -0.024731969778659768,
+ -0.032122342124411785,
+ -0.023617597287498904,
+ -0.011948774799108164,
+ -0.010098322218733746,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ -0.02182690421954192,
+ -0.02986990856208549,
+ -0.04485595299452927,
+ -0.05003357146119436,
+ -0.04140379697642271,
+ -0.037212876247561866,
+ -0.04777898061581398,
+ -0.04352918446900789,
+ -0.03240904440770154,
+ -0.009207065042143303,
+ -0.01260402133490357,
+ -0.009834558874683652,
+ -0.01860862258081364,
+ -0.01544703598831565,
+ -0.0019812216087630174,
+ -0.000851154349016503,
+ 0.0,
+ -0.009725330722329284,
+ -0.011185103630020787,
+ -0.004435725636641741,
+ 0.0,
+ -0.00922885519580674,
+ -0.01250459736425491,
+ -0.029778971760223594,
+ -0.008679878025225851,
+ 0.0,
+ 0.0,
+ -0.001803837414103504,
+ 0.0,
+ 0.0,
+ 0.0,
+ -0.010841487260801141,
+ -0.031579015316706815,
+ -0.019854071466294476,
+ -0.024215203647926842,
+ -0.026811602949552316,
+ -0.019461293614390418,
+ -0.039857851648122056,
+ -0.04671580526973873,
+ -0.040826580212987906,
+ -0.03897754943528431,
+ -0.04770892144188388,
+ -0.02752923935768059,
+ -0.02057722480228097,
+ -0.02793076071640299,
+ -0.0179639718509923,
+ -0.025170034769006255,
+ -0.027749526203814656,
+ -0.025636067512982752,
+ -0.027545803253761103,
+ -0.023673469009827253,
+ -0.028876912045590064,
+ -0.031372655527207804,
+ -0.04563704530877655,
+ -0.051236415467974195,
+ -0.05259622126289487,
+ -0.04543278926775607,
+ -0.04787830980411478,
+ -0.048044368511814595,
+ -0.055604028774758896,
+ -0.0685222764773945,
+ -0.06202574551064077,
+ -0.05568874840212623,
+ -0.05113968008997183,
+ -0.056610998005232505,
+ -0.04747561544675227,
+ -0.029604839186038623,
+ -0.03709249014062921,
+ -0.040212756328642185,
+ -0.04540557645261156,
+ -0.05082025830554493,
+ -0.04835333069408654,
+ -0.053447625023722356,
+ -0.06689702232784211,
+ -0.0663817369646248,
+ -0.06961049407411213,
+ -0.06507064815976327,
+ -0.06867397230558625,
+ -0.057814882762951325,
+ -0.04506071261981248,
+ -0.044320837867770524,
+ -0.033242086066034404,
+ -0.03328714032051183,
+ -0.021237601464447198,
+ -0.029687465010377112,
+ -0.027011676832602416,
+ -0.029330760574518222,
+ -0.0365586075463995,
+ -0.03680973998092951,
+ -0.031802884132294484,
+ -0.035195163576272503,
+ -0.01956391852402417,
+ -0.016415332758865753,
+ -0.021986320469861487,
+ -0.02208414307368356,
+ -0.02458097527461467,
+ -0.03481649928927566,
+ -0.026930028488210023,
+ -0.029812136337242667,
+ -0.02143568160521836,
+ -0.02264665113732356,
+ -0.02366898939224682,
+ -0.011729198158075271,
+ 0.0,
+ 0.0,
+ 0.0,
+ -0.008176719152386158,
+ -0.014719314271825601,
+ 0.0,
+ -0.005145819170919719,
+ -0.01054515584426996,
+ -0.010900904687347501,
+ -0.02020484582759885,
+ 0.0,
+ -0.0004484122725225692,
+ -0.011112819094150628,
+ -0.016316072997552222,
+ -0.022246739659902537,
+ -0.016072262632710888,
+ -0.019627196900010913,
+ -0.036233445535702735,
+ -0.03920637896688184,
+ -0.02760299574491276,
+ -0.00808670461740213,
+ -0.009637797739094123,
+ -0.015309272438777444,
+ -0.018585803108376875,
+ -0.006874178183342128,
+ -0.020474194283763736
+ ],
+ "borderColor": "#2ecc71",
+ "backgroundColor": "rgba(46, 204, 113, 0.1)",
+ "fill": true,
+ "tension": 0.1
+ }
+ ]
+ },
+ "config": {
+ "y_axis_label": "Drawdown (%)",
+ "percentage_format": true
+ },
+ "position": {
+ "row": 1,
+ "col": 1
+ }
+ },
+ "monthly_returns": {
+ "id": "monthly_returns",
+ "title": "Monthly Returns Heatmap",
+ "type": "HeatmapTable",
+ "data": {
+ "years": [
+ 2020,
+ 2021,
+ 2022,
+ 2023
+ ],
+ "months": [
+ "Jan",
+ "Feb",
+ "Mar",
+ "Apr",
+ "May",
+ "Jun",
+ "Jul",
+ "Aug",
+ "Sep",
+ "Oct",
+ "Nov",
+ "Dec"
+ ],
+ "data": {
+ "2020-1": -0.06319011653259732,
+ "2020-2": -0.034770463169874644,
+ "2020-3": -0.06608665843349593,
+ "2020-4": 0.015718476502466716,
+ "2020-5": -0.06088503663475009,
+ "2020-6": 0.0063897466182143425,
+ "2020-7": -0.015627534235814866,
+ "2020-8": -0.09587129126199001,
+ "2020-9": -0.04783996322985917,
+ "2020-10": -0.042886778633472455,
+ "2020-11": 0.011714336407637305,
+ "2020-12": 0.1119111507266719,
+ "2021-1": -0.039862254801951935,
+ "2021-2": -0.014638662529868118,
+ "2021-3": 0.0749020515652763,
+ "2021-4": -0.03248201069857204,
+ "2021-5": -0.048220640388605074,
+ "2021-6": -0.047805270988737436,
+ "2021-7": 0.007544561757795165,
+ "2021-8": 0.013436296746146548,
+ "2021-9": 0.0570838672255527,
+ "2021-10": -0.07206915715373297,
+ "2021-11": -0.02559077024083445,
+ "2021-12": 0.03930491963685201,
+ "2022-1": 0.06718726423981458,
+ "2022-2": 0.11433556708413439,
+ "2022-3": 0.08346616417358366,
+ "2022-4": -0.06288797697768356,
+ "2022-5": 0.039819766418363045,
+ "2022-6": 0.08930749590754394,
+ "2022-7": -0.0456523161501331,
+ "2022-8": 0.017434274894518875,
+ "2022-9": -0.04714069799406495,
+ "2022-10": -0.0004392659482208572,
+ "2022-11": 0.03322272131884563,
+ "2022-12": 0.05088900643743055,
+ "2023-1": 0.05922207366085819,
+ "2023-2": 0.010978789635499364,
+ "2023-3": -0.05182182851256667,
+ "2023-4": 0.11361914811463492,
+ "2023-5": 0.03954753292160995,
+ "2023-6": 0.022784670103060733,
+ "2023-7": -0.008379609071131,
+ "2023-8": 0.030368240896207377,
+ "2023-9": 0.04266918624716998,
+ "2023-10": -0.006574875573456707
+ }
+ },
+ "config": {},
+ "position": {
+ "row": 2,
+ "col": 0
+ }
+ },
+ "rolling_sharpe": {
+ "id": "rolling_sharpe",
+ "title": "Rolling Sharpe Ratio",
+ "type": "LineChart",
+ "data": {
+ "labels": [
+ "2020-01-02",
+ "2020-01-03",
+ "2020-01-06",
+ "2020-01-07",
+ "2020-01-08",
+ "2020-01-09",
+ "2020-01-10",
+ "2020-01-13",
+ "2020-01-14",
+ "2020-01-15",
+ "2020-01-16",
+ "2020-01-17",
+ "2020-01-20",
+ "2020-01-21",
+ "2020-01-22",
+ "2020-01-23",
+ "2020-01-24",
+ "2020-01-27",
+ "2020-01-28",
+ "2020-01-29",
+ "2020-01-30",
+ "2020-01-31",
+ "2020-02-03",
+ "2020-02-04",
+ "2020-02-05",
+ "2020-02-06",
+ "2020-02-07",
+ "2020-02-10",
+ "2020-02-11",
+ "2020-02-12",
+ "2020-02-13",
+ "2020-02-14",
+ "2020-02-17",
+ "2020-02-18",
+ "2020-02-19",
+ "2020-02-20",
+ "2020-02-21",
+ "2020-02-24",
+ "2020-02-25",
+ "2020-02-26",
+ "2020-02-27",
+ "2020-02-28",
+ "2020-03-02",
+ "2020-03-03",
+ "2020-03-04",
+ "2020-03-05",
+ "2020-03-06",
+ "2020-03-09",
+ "2020-03-10",
+ "2020-03-11",
+ "2020-03-12",
+ "2020-03-13",
+ "2020-03-16",
+ "2020-03-17",
+ "2020-03-18",
+ "2020-03-19",
+ "2020-03-20",
+ "2020-03-23",
+ "2020-03-24",
+ "2020-03-25",
+ "2020-03-26",
+ "2020-03-27",
+ "2020-03-30",
+ "2020-03-31",
+ "2020-04-01",
+ "2020-04-02",
+ "2020-04-03",
+ "2020-04-06",
+ "2020-04-07",
+ "2020-04-08",
+ "2020-04-09",
+ "2020-04-10",
+ "2020-04-13",
+ "2020-04-14",
+ "2020-04-15",
+ "2020-04-16",
+ "2020-04-17",
+ "2020-04-20",
+ "2020-04-21",
+ "2020-04-22",
+ "2020-04-23",
+ "2020-04-24",
+ "2020-04-27",
+ "2020-04-28",
+ "2020-04-29",
+ "2020-04-30",
+ "2020-05-01",
+ "2020-05-04",
+ "2020-05-05",
+ "2020-05-06",
+ "2020-05-07",
+ "2020-05-08",
+ "2020-05-11",
+ "2020-05-12",
+ "2020-05-13",
+ "2020-05-14",
+ "2020-05-15",
+ "2020-05-18",
+ "2020-05-19",
+ "2020-05-20",
+ "2020-05-21",
+ "2020-05-22",
+ "2020-05-25",
+ "2020-05-26",
+ "2020-05-27",
+ "2020-05-28",
+ "2020-05-29",
+ "2020-06-01",
+ "2020-06-02",
+ "2020-06-03",
+ "2020-06-04",
+ "2020-06-05",
+ "2020-06-08",
+ "2020-06-09",
+ "2020-06-10",
+ "2020-06-11",
+ "2020-06-12",
+ "2020-06-15",
+ "2020-06-16",
+ "2020-06-17",
+ "2020-06-18",
+ "2020-06-19",
+ "2020-06-22",
+ "2020-06-23",
+ "2020-06-24",
+ "2020-06-25",
+ "2020-06-26",
+ "2020-06-29",
+ "2020-06-30",
+ "2020-07-01",
+ "2020-07-02",
+ "2020-07-03",
+ "2020-07-06",
+ "2020-07-07",
+ "2020-07-08",
+ "2020-07-09",
+ "2020-07-10",
+ "2020-07-13",
+ "2020-07-14",
+ "2020-07-15",
+ "2020-07-16",
+ "2020-07-17",
+ "2020-07-20",
+ "2020-07-21",
+ "2020-07-22",
+ "2020-07-23",
+ "2020-07-24",
+ "2020-07-27",
+ "2020-07-28",
+ "2020-07-29",
+ "2020-07-30",
+ "2020-07-31",
+ "2020-08-03",
+ "2020-08-04",
+ "2020-08-05",
+ "2020-08-06",
+ "2020-08-07",
+ "2020-08-10",
+ "2020-08-11",
+ "2020-08-12",
+ "2020-08-13",
+ "2020-08-14",
+ "2020-08-17",
+ "2020-08-18",
+ "2020-08-19",
+ "2020-08-20",
+ "2020-08-21",
+ "2020-08-24",
+ "2020-08-25",
+ "2020-08-26",
+ "2020-08-27",
+ "2020-08-28",
+ "2020-08-31",
+ "2020-09-01",
+ "2020-09-02",
+ "2020-09-03",
+ "2020-09-04",
+ "2020-09-07",
+ "2020-09-08",
+ "2020-09-09",
+ "2020-09-10",
+ "2020-09-11",
+ "2020-09-14",
+ "2020-09-15",
+ "2020-09-16",
+ "2020-09-17",
+ "2020-09-18",
+ "2020-09-21",
+ "2020-09-22",
+ "2020-09-23",
+ "2020-09-24",
+ "2020-09-25",
+ "2020-09-28",
+ "2020-09-29",
+ "2020-09-30",
+ "2020-10-01",
+ "2020-10-02",
+ "2020-10-05",
+ "2020-10-06",
+ "2020-10-07",
+ "2020-10-08",
+ "2020-10-09",
+ "2020-10-12",
+ "2020-10-13",
+ "2020-10-14",
+ "2020-10-15",
+ "2020-10-16",
+ "2020-10-19",
+ "2020-10-20",
+ "2020-10-21",
+ "2020-10-22",
+ "2020-10-23",
+ "2020-10-26",
+ "2020-10-27",
+ "2020-10-28",
+ "2020-10-29",
+ "2020-10-30",
+ "2020-11-02",
+ "2020-11-03",
+ "2020-11-04",
+ "2020-11-05",
+ "2020-11-06",
+ "2020-11-09",
+ "2020-11-10",
+ "2020-11-11",
+ "2020-11-12",
+ "2020-11-13",
+ "2020-11-16",
+ "2020-11-17",
+ "2020-11-18",
+ "2020-11-19",
+ "2020-11-20",
+ "2020-11-23",
+ "2020-11-24",
+ "2020-11-25",
+ "2020-11-26",
+ "2020-11-27",
+ "2020-11-30",
+ "2020-12-01",
+ "2020-12-02",
+ "2020-12-03",
+ "2020-12-04",
+ "2020-12-07",
+ "2020-12-08",
+ "2020-12-09",
+ "2020-12-10",
+ "2020-12-11",
+ "2020-12-14",
+ "2020-12-15",
+ "2020-12-16",
+ "2020-12-17",
+ "2020-12-18",
+ "2020-12-21",
+ "2020-12-22",
+ "2020-12-23",
+ "2020-12-24",
+ "2020-12-25",
+ "2020-12-28",
+ "2020-12-29",
+ "2020-12-30",
+ "2020-12-31",
+ "2021-01-01",
+ "2021-01-04",
+ "2021-01-05",
+ "2021-01-06",
+ "2021-01-07",
+ "2021-01-08",
+ "2021-01-11",
+ "2021-01-12",
+ "2021-01-13",
+ "2021-01-14",
+ "2021-01-15",
+ "2021-01-18",
+ "2021-01-19",
+ "2021-01-20",
+ "2021-01-21",
+ "2021-01-22",
+ "2021-01-25",
+ "2021-01-26",
+ "2021-01-27",
+ "2021-01-28",
+ "2021-01-29",
+ "2021-02-01",
+ "2021-02-02",
+ "2021-02-03",
+ "2021-02-04",
+ "2021-02-05",
+ "2021-02-08",
+ "2021-02-09",
+ "2021-02-10",
+ "2021-02-11",
+ "2021-02-12",
+ "2021-02-15",
+ "2021-02-16",
+ "2021-02-17",
+ "2021-02-18",
+ "2021-02-19",
+ "2021-02-22",
+ "2021-02-23",
+ "2021-02-24",
+ "2021-02-25",
+ "2021-02-26",
+ "2021-03-01",
+ "2021-03-02",
+ "2021-03-03",
+ "2021-03-04",
+ "2021-03-05",
+ "2021-03-08",
+ "2021-03-09",
+ "2021-03-10",
+ "2021-03-11",
+ "2021-03-12",
+ "2021-03-15",
+ "2021-03-16",
+ "2021-03-17",
+ "2021-03-18",
+ "2021-03-19",
+ "2021-03-22",
+ "2021-03-23",
+ "2021-03-24",
+ "2021-03-25",
+ "2021-03-26",
+ "2021-03-29",
+ "2021-03-30",
+ "2021-03-31",
+ "2021-04-01",
+ "2021-04-02",
+ "2021-04-05",
+ "2021-04-06",
+ "2021-04-07",
+ "2021-04-08",
+ "2021-04-09",
+ "2021-04-12",
+ "2021-04-13",
+ "2021-04-14",
+ "2021-04-15",
+ "2021-04-16",
+ "2021-04-19",
+ "2021-04-20",
+ "2021-04-21",
+ "2021-04-22",
+ "2021-04-23",
+ "2021-04-26",
+ "2021-04-27",
+ "2021-04-28",
+ "2021-04-29",
+ "2021-04-30",
+ "2021-05-03",
+ "2021-05-04",
+ "2021-05-05",
+ "2021-05-06",
+ "2021-05-07",
+ "2021-05-10",
+ "2021-05-11",
+ "2021-05-12",
+ "2021-05-13",
+ "2021-05-14",
+ "2021-05-17",
+ "2021-05-18",
+ "2021-05-19",
+ "2021-05-20",
+ "2021-05-21",
+ "2021-05-24",
+ "2021-05-25",
+ "2021-05-26",
+ "2021-05-27",
+ "2021-05-28",
+ "2021-05-31",
+ "2021-06-01",
+ "2021-06-02",
+ "2021-06-03",
+ "2021-06-04",
+ "2021-06-07",
+ "2021-06-08",
+ "2021-06-09",
+ "2021-06-10",
+ "2021-06-11",
+ "2021-06-14",
+ "2021-06-15",
+ "2021-06-16",
+ "2021-06-17",
+ "2021-06-18",
+ "2021-06-21",
+ "2021-06-22",
+ "2021-06-23",
+ "2021-06-24",
+ "2021-06-25",
+ "2021-06-28",
+ "2021-06-29",
+ "2021-06-30",
+ "2021-07-01",
+ "2021-07-02",
+ "2021-07-05",
+ "2021-07-06",
+ "2021-07-07",
+ "2021-07-08",
+ "2021-07-09",
+ "2021-07-12",
+ "2021-07-13",
+ "2021-07-14",
+ "2021-07-15",
+ "2021-07-16",
+ "2021-07-19",
+ "2021-07-20",
+ "2021-07-21",
+ "2021-07-22",
+ "2021-07-23",
+ "2021-07-26",
+ "2021-07-27",
+ "2021-07-28",
+ "2021-07-29",
+ "2021-07-30",
+ "2021-08-02",
+ "2021-08-03",
+ "2021-08-04",
+ "2021-08-05",
+ "2021-08-06",
+ "2021-08-09",
+ "2021-08-10",
+ "2021-08-11",
+ "2021-08-12",
+ "2021-08-13",
+ "2021-08-16",
+ "2021-08-17",
+ "2021-08-18",
+ "2021-08-19",
+ "2021-08-20",
+ "2021-08-23",
+ "2021-08-24",
+ "2021-08-25",
+ "2021-08-26",
+ "2021-08-27",
+ "2021-08-30",
+ "2021-08-31",
+ "2021-09-01",
+ "2021-09-02",
+ "2021-09-03",
+ "2021-09-06",
+ "2021-09-07",
+ "2021-09-08",
+ "2021-09-09",
+ "2021-09-10",
+ "2021-09-13",
+ "2021-09-14",
+ "2021-09-15",
+ "2021-09-16",
+ "2021-09-17",
+ "2021-09-20",
+ "2021-09-21",
+ "2021-09-22",
+ "2021-09-23",
+ "2021-09-24",
+ "2021-09-27",
+ "2021-09-28",
+ "2021-09-29",
+ "2021-09-30",
+ "2021-10-01",
+ "2021-10-04",
+ "2021-10-05",
+ "2021-10-06",
+ "2021-10-07",
+ "2021-10-08",
+ "2021-10-11",
+ "2021-10-12",
+ "2021-10-13",
+ "2021-10-14",
+ "2021-10-15",
+ "2021-10-18",
+ "2021-10-19",
+ "2021-10-20",
+ "2021-10-21",
+ "2021-10-22",
+ "2021-10-25",
+ "2021-10-26",
+ "2021-10-27",
+ "2021-10-28",
+ "2021-10-29",
+ "2021-11-01",
+ "2021-11-02",
+ "2021-11-03",
+ "2021-11-04",
+ "2021-11-05",
+ "2021-11-08",
+ "2021-11-09",
+ "2021-11-10",
+ "2021-11-11",
+ "2021-11-12",
+ "2021-11-15",
+ "2021-11-16",
+ "2021-11-17",
+ "2021-11-18",
+ "2021-11-19",
+ "2021-11-22",
+ "2021-11-23",
+ "2021-11-24",
+ "2021-11-25",
+ "2021-11-26",
+ "2021-11-29",
+ "2021-11-30",
+ "2021-12-01",
+ "2021-12-02",
+ "2021-12-03",
+ "2021-12-06",
+ "2021-12-07",
+ "2021-12-08",
+ "2021-12-09",
+ "2021-12-10",
+ "2021-12-13",
+ "2021-12-14",
+ "2021-12-15",
+ "2021-12-16",
+ "2021-12-17",
+ "2021-12-20",
+ "2021-12-21",
+ "2021-12-22",
+ "2021-12-23",
+ "2021-12-24",
+ "2021-12-27",
+ "2021-12-28",
+ "2021-12-29",
+ "2021-12-30",
+ "2021-12-31",
+ "2022-01-03",
+ "2022-01-04",
+ "2022-01-05",
+ "2022-01-06",
+ "2022-01-07",
+ "2022-01-10",
+ "2022-01-11",
+ "2022-01-12",
+ "2022-01-13",
+ "2022-01-14",
+ "2022-01-17",
+ "2022-01-18",
+ "2022-01-19",
+ "2022-01-20",
+ "2022-01-21",
+ "2022-01-24",
+ "2022-01-25",
+ "2022-01-26",
+ "2022-01-27",
+ "2022-01-28",
+ "2022-01-31",
+ "2022-02-01",
+ "2022-02-02",
+ "2022-02-03",
+ "2022-02-04",
+ "2022-02-07",
+ "2022-02-08",
+ "2022-02-09",
+ "2022-02-10",
+ "2022-02-11",
+ "2022-02-14",
+ "2022-02-15",
+ "2022-02-16",
+ "2022-02-17",
+ "2022-02-18",
+ "2022-02-21",
+ "2022-02-22",
+ "2022-02-23",
+ "2022-02-24",
+ "2022-02-25",
+ "2022-02-28",
+ "2022-03-01",
+ "2022-03-02",
+ "2022-03-03",
+ "2022-03-04",
+ "2022-03-07",
+ "2022-03-08",
+ "2022-03-09",
+ "2022-03-10",
+ "2022-03-11",
+ "2022-03-14",
+ "2022-03-15",
+ "2022-03-16",
+ "2022-03-17",
+ "2022-03-18",
+ "2022-03-21",
+ "2022-03-22",
+ "2022-03-23",
+ "2022-03-24",
+ "2022-03-25",
+ "2022-03-28",
+ "2022-03-29",
+ "2022-03-30",
+ "2022-03-31",
+ "2022-04-01",
+ "2022-04-04",
+ "2022-04-05",
+ "2022-04-06",
+ "2022-04-07",
+ "2022-04-08",
+ "2022-04-11",
+ "2022-04-12",
+ "2022-04-13",
+ "2022-04-14",
+ "2022-04-15",
+ "2022-04-18",
+ "2022-04-19",
+ "2022-04-20",
+ "2022-04-21",
+ "2022-04-22",
+ "2022-04-25",
+ "2022-04-26",
+ "2022-04-27",
+ "2022-04-28",
+ "2022-04-29",
+ "2022-05-02",
+ "2022-05-03",
+ "2022-05-04",
+ "2022-05-05",
+ "2022-05-06",
+ "2022-05-09",
+ "2022-05-10",
+ "2022-05-11",
+ "2022-05-12",
+ "2022-05-13",
+ "2022-05-16",
+ "2022-05-17",
+ "2022-05-18",
+ "2022-05-19",
+ "2022-05-20",
+ "2022-05-23",
+ "2022-05-24",
+ "2022-05-25",
+ "2022-05-26",
+ "2022-05-27",
+ "2022-05-30",
+ "2022-05-31",
+ "2022-06-01",
+ "2022-06-02",
+ "2022-06-03",
+ "2022-06-06",
+ "2022-06-07",
+ "2022-06-08",
+ "2022-06-09",
+ "2022-06-10",
+ "2022-06-13",
+ "2022-06-14",
+ "2022-06-15",
+ "2022-06-16",
+ "2022-06-17",
+ "2022-06-20",
+ "2022-06-21",
+ "2022-06-22",
+ "2022-06-23",
+ "2022-06-24",
+ "2022-06-27",
+ "2022-06-28",
+ "2022-06-29",
+ "2022-06-30",
+ "2022-07-01",
+ "2022-07-04",
+ "2022-07-05",
+ "2022-07-06",
+ "2022-07-07",
+ "2022-07-08",
+ "2022-07-11",
+ "2022-07-12",
+ "2022-07-13",
+ "2022-07-14",
+ "2022-07-15",
+ "2022-07-18",
+ "2022-07-19",
+ "2022-07-20",
+ "2022-07-21",
+ "2022-07-22",
+ "2022-07-25",
+ "2022-07-26",
+ "2022-07-27",
+ "2022-07-28",
+ "2022-07-29",
+ "2022-08-01",
+ "2022-08-02",
+ "2022-08-03",
+ "2022-08-04",
+ "2022-08-05",
+ "2022-08-08",
+ "2022-08-09",
+ "2022-08-10",
+ "2022-08-11",
+ "2022-08-12",
+ "2022-08-15",
+ "2022-08-16",
+ "2022-08-17",
+ "2022-08-18",
+ "2022-08-19",
+ "2022-08-22",
+ "2022-08-23",
+ "2022-08-24",
+ "2022-08-25",
+ "2022-08-26",
+ "2022-08-29",
+ "2022-08-30",
+ "2022-08-31",
+ "2022-09-01",
+ "2022-09-02",
+ "2022-09-05",
+ "2022-09-06",
+ "2022-09-07",
+ "2022-09-08",
+ "2022-09-09",
+ "2022-09-12",
+ "2022-09-13",
+ "2022-09-14",
+ "2022-09-15",
+ "2022-09-16",
+ "2022-09-19",
+ "2022-09-20",
+ "2022-09-21",
+ "2022-09-22",
+ "2022-09-23",
+ "2022-09-26",
+ "2022-09-27",
+ "2022-09-28",
+ "2022-09-29",
+ "2022-09-30",
+ "2022-10-03",
+ "2022-10-04",
+ "2022-10-05",
+ "2022-10-06",
+ "2022-10-07",
+ "2022-10-10",
+ "2022-10-11",
+ "2022-10-12",
+ "2022-10-13",
+ "2022-10-14",
+ "2022-10-17",
+ "2022-10-18",
+ "2022-10-19",
+ "2022-10-20",
+ "2022-10-21",
+ "2022-10-24",
+ "2022-10-25",
+ "2022-10-26",
+ "2022-10-27",
+ "2022-10-28",
+ "2022-10-31",
+ "2022-11-01",
+ "2022-11-02",
+ "2022-11-03",
+ "2022-11-04",
+ "2022-11-07",
+ "2022-11-08",
+ "2022-11-09",
+ "2022-11-10",
+ "2022-11-11",
+ "2022-11-14",
+ "2022-11-15",
+ "2022-11-16",
+ "2022-11-17",
+ "2022-11-18",
+ "2022-11-21",
+ "2022-11-22",
+ "2022-11-23",
+ "2022-11-24",
+ "2022-11-25",
+ "2022-11-28",
+ "2022-11-29",
+ "2022-11-30",
+ "2022-12-01",
+ "2022-12-02",
+ "2022-12-05",
+ "2022-12-06",
+ "2022-12-07",
+ "2022-12-08",
+ "2022-12-09",
+ "2022-12-12",
+ "2022-12-13",
+ "2022-12-14",
+ "2022-12-15",
+ "2022-12-16",
+ "2022-12-19",
+ "2022-12-20",
+ "2022-12-21",
+ "2022-12-22",
+ "2022-12-23",
+ "2022-12-26",
+ "2022-12-27",
+ "2022-12-28",
+ "2022-12-29",
+ "2022-12-30",
+ "2023-01-02",
+ "2023-01-03",
+ "2023-01-04",
+ "2023-01-05",
+ "2023-01-06",
+ "2023-01-09",
+ "2023-01-10",
+ "2023-01-11",
+ "2023-01-12",
+ "2023-01-13",
+ "2023-01-16",
+ "2023-01-17",
+ "2023-01-18",
+ "2023-01-19",
+ "2023-01-20",
+ "2023-01-23",
+ "2023-01-24",
+ "2023-01-25",
+ "2023-01-26",
+ "2023-01-27",
+ "2023-01-30",
+ "2023-01-31",
+ "2023-02-01",
+ "2023-02-02",
+ "2023-02-03",
+ "2023-02-06",
+ "2023-02-07",
+ "2023-02-08",
+ "2023-02-09",
+ "2023-02-10",
+ "2023-02-13",
+ "2023-02-14",
+ "2023-02-15",
+ "2023-02-16",
+ "2023-02-17",
+ "2023-02-20",
+ "2023-02-21",
+ "2023-02-22",
+ "2023-02-23",
+ "2023-02-24",
+ "2023-02-27",
+ "2023-02-28",
+ "2023-03-01",
+ "2023-03-02",
+ "2023-03-03",
+ "2023-03-06",
+ "2023-03-07",
+ "2023-03-08",
+ "2023-03-09",
+ "2023-03-10",
+ "2023-03-13",
+ "2023-03-14",
+ "2023-03-15",
+ "2023-03-16",
+ "2023-03-17",
+ "2023-03-20",
+ "2023-03-21",
+ "2023-03-22",
+ "2023-03-23",
+ "2023-03-24",
+ "2023-03-27",
+ "2023-03-28",
+ "2023-03-29",
+ "2023-03-30",
+ "2023-03-31",
+ "2023-04-03",
+ "2023-04-04",
+ "2023-04-05",
+ "2023-04-06",
+ "2023-04-07",
+ "2023-04-10",
+ "2023-04-11",
+ "2023-04-12",
+ "2023-04-13",
+ "2023-04-14",
+ "2023-04-17",
+ "2023-04-18",
+ "2023-04-19",
+ "2023-04-20",
+ "2023-04-21",
+ "2023-04-24",
+ "2023-04-25",
+ "2023-04-26",
+ "2023-04-27",
+ "2023-04-28",
+ "2023-05-01",
+ "2023-05-02",
+ "2023-05-03",
+ "2023-05-04",
+ "2023-05-05",
+ "2023-05-08",
+ "2023-05-09",
+ "2023-05-10",
+ "2023-05-11",
+ "2023-05-12",
+ "2023-05-15",
+ "2023-05-16",
+ "2023-05-17",
+ "2023-05-18",
+ "2023-05-19",
+ "2023-05-22",
+ "2023-05-23",
+ "2023-05-24",
+ "2023-05-25",
+ "2023-05-26",
+ "2023-05-29",
+ "2023-05-30",
+ "2023-05-31",
+ "2023-06-01",
+ "2023-06-02",
+ "2023-06-05",
+ "2023-06-06",
+ "2023-06-07",
+ "2023-06-08",
+ "2023-06-09",
+ "2023-06-12",
+ "2023-06-13",
+ "2023-06-14",
+ "2023-06-15",
+ "2023-06-16",
+ "2023-06-19",
+ "2023-06-20",
+ "2023-06-21",
+ "2023-06-22",
+ "2023-06-23",
+ "2023-06-26",
+ "2023-06-27",
+ "2023-06-28",
+ "2023-06-29",
+ "2023-06-30",
+ "2023-07-03",
+ "2023-07-04",
+ "2023-07-05",
+ "2023-07-06",
+ "2023-07-07",
+ "2023-07-10",
+ "2023-07-11",
+ "2023-07-12",
+ "2023-07-13",
+ "2023-07-14",
+ "2023-07-17",
+ "2023-07-18",
+ "2023-07-19",
+ "2023-07-20",
+ "2023-07-21",
+ "2023-07-24",
+ "2023-07-25",
+ "2023-07-26",
+ "2023-07-27",
+ "2023-07-28",
+ "2023-07-31",
+ "2023-08-01",
+ "2023-08-02",
+ "2023-08-03",
+ "2023-08-04",
+ "2023-08-07",
+ "2023-08-08",
+ "2023-08-09",
+ "2023-08-10",
+ "2023-08-11",
+ "2023-08-14",
+ "2023-08-15",
+ "2023-08-16",
+ "2023-08-17",
+ "2023-08-18",
+ "2023-08-21",
+ "2023-08-22",
+ "2023-08-23",
+ "2023-08-24",
+ "2023-08-25",
+ "2023-08-28",
+ "2023-08-29",
+ "2023-08-30",
+ "2023-08-31",
+ "2023-09-01",
+ "2023-09-04",
+ "2023-09-05",
+ "2023-09-06",
+ "2023-09-07",
+ "2023-09-08",
+ "2023-09-11",
+ "2023-09-12",
+ "2023-09-13",
+ "2023-09-14",
+ "2023-09-15",
+ "2023-09-18",
+ "2023-09-19",
+ "2023-09-20",
+ "2023-09-21",
+ "2023-09-22",
+ "2023-09-25",
+ "2023-09-26",
+ "2023-09-27",
+ "2023-09-28",
+ "2023-09-29",
+ "2023-10-02",
+ "2023-10-03",
+ "2023-10-04",
+ "2023-10-05",
+ "2023-10-06",
+ "2023-10-09",
+ "2023-10-10",
+ "2023-10-11",
+ "2023-10-12",
+ "2023-10-13",
+ "2023-10-16",
+ "2023-10-17",
+ "2023-10-18",
+ "2023-10-19",
+ "2023-10-20",
+ "2023-10-23",
+ "2023-10-24",
+ "2023-10-25",
+ "2023-10-26",
+ "2023-10-27",
+ "2023-10-30",
+ "2023-10-31"
+ ],
+ "datasets": [
+ {
+ "label": "Rolling Sharpe Ratio",
+ "data": [
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ -47.39984325241671,
+ -47.27985073197235,
+ -47.01737779185457,
+ -46.46869947427751,
+ -46.64034281658469,
+ -46.639562771160435,
+ -46.10024472543196,
+ -45.73646649940165,
+ -45.57840525216609,
+ -45.57334212108233,
+ -45.054003237045755,
+ -44.88592230653748,
+ -44.692356361409836,
+ -44.658456946865904,
+ -44.11034090235202,
+ -44.08886236012681,
+ -44.13286084505862,
+ -43.840834594575064,
+ -44.02551070925105,
+ -43.76296744505657,
+ -43.78204766358,
+ -44.43821290528709,
+ -44.43604524007909,
+ -44.589542145106435,
+ -44.471449457860125,
+ -43.76366200106879,
+ -43.738460502681804,
+ -43.88239857406071,
+ -43.76196414816617,
+ -43.863746734410135,
+ -43.45350255809025,
+ -43.519371031103695,
+ -44.29305539569671,
+ -44.6525730879257,
+ -44.87822947926211,
+ -45.06181758048483,
+ -45.06589630723667,
+ -44.898175681940074,
+ -44.93084383464244,
+ -44.99746148401625,
+ -44.905796251712026,
+ -44.89470982472417,
+ -44.906201145159976,
+ -44.44945151842589,
+ -45.44359818615088,
+ -45.66986785351638,
+ -47.029494604783665,
+ -47.02813313312257,
+ -47.78057568859948,
+ -47.82610344370386,
+ -47.82904921774291,
+ -47.48082226050117,
+ -47.76280578353858,
+ -47.65510297422347,
+ -47.354070966459226,
+ -48.96535680376554,
+ -50.37404625317337,
+ -50.42145936513741,
+ -50.43941854171039,
+ -50.4386530806616,
+ -50.666190137327796,
+ -51.38355491647,
+ -51.04383323794095,
+ -51.30825964940644,
+ -49.4038976653099,
+ -50.444308103459825,
+ -50.16763458678886,
+ -50.51415797333046,
+ -50.30092193537733,
+ -50.02468512647869,
+ -50.055238728680884,
+ -49.78336693417707,
+ -49.980501208315964,
+ -49.89035373669542,
+ -49.772176465292425,
+ -49.72633839183533,
+ -49.879238214869176,
+ -49.990592327314324,
+ -49.9598957084176,
+ -49.718722616387794,
+ -49.96662347937753,
+ -50.088705049077205,
+ -50.17663200188364,
+ -49.88351722849617,
+ -49.81584143373547,
+ -49.83526106515239,
+ -49.61043266278192,
+ -49.43896460076584,
+ -49.469427042964654,
+ -49.509185303773606,
+ -49.159232129718795,
+ -48.70730260308604,
+ -47.36138247678202,
+ -47.413987782176164,
+ -47.724945218803136,
+ -47.6270710351593,
+ -47.61282151495316,
+ -47.943621418930405,
+ -48.36977390599741,
+ -48.37485106866167,
+ -48.56721778260087,
+ -48.5825350583198,
+ -48.79836776289503,
+ -48.53781227791402,
+ -48.533974991011064,
+ -48.72220139352249,
+ -48.54382119308119,
+ -48.9427411766193,
+ -48.9372078147306,
+ -48.89550093714436,
+ -48.97570794727586,
+ -48.330476754903806,
+ -48.55234854803985,
+ -48.52821978255037,
+ -48.259820515652756,
+ -48.32445669433152,
+ -48.312187827539,
+ -49.3282075790968,
+ -49.39308281193249,
+ -49.49787436779095,
+ -49.51171223040554,
+ -49.39582675935796,
+ -46.41789063134425,
+ -46.283562295756084,
+ -46.7435754122952,
+ -46.12072075674354,
+ -45.8992038004055,
+ -45.94663381227005,
+ -45.908788437308466,
+ -45.86609572000514,
+ -45.81889902621962,
+ -45.38064523517615,
+ -45.70452116664303,
+ -46.0178617866094,
+ -45.5236997322161,
+ -44.681351535711606,
+ -45.1967461617885,
+ -45.509051332782434,
+ -45.812264542510626,
+ -45.96651611125888,
+ -46.704064526115786,
+ -46.52427401725146,
+ -46.215226615255524,
+ -46.507196327611815,
+ -46.27324372214485,
+ -46.47510931057414,
+ -46.472060993903646,
+ -46.17404263842438,
+ -46.11074375754026,
+ -45.61756165491733,
+ -45.72718391662124,
+ -46.522953461004995,
+ -46.00898777055701,
+ -46.0147645815571,
+ -44.76062542578035,
+ -44.40513968901,
+ -44.817286410653146,
+ -44.95207068800079,
+ -44.895402176942994,
+ -44.77975028129813,
+ -44.78714813702242,
+ -44.27982367345334,
+ -44.08997157820155,
+ -44.24675980465832,
+ -44.252257693293345,
+ -44.220298776603656,
+ -44.03728713251562,
+ -43.05382467628511,
+ -42.021631277412844,
+ -42.50199184715477,
+ -42.70828788867695,
+ -42.88136378254569,
+ -42.9153164519858,
+ -42.91118967141819,
+ -42.89289404922297,
+ -42.892472873739834,
+ -42.88787515888202,
+ -43.07803474957162,
+ -43.01813812045069,
+ -42.99260579579649,
+ -42.704888207105945,
+ -41.634086541285726,
+ -41.50074010053919,
+ -41.43311049557726,
+ -41.39432340047387,
+ -41.30892599533365,
+ -41.50223053738808,
+ -41.4221902358505,
+ -41.42899065472672,
+ -41.35191525575822,
+ -42.53800487892743,
+ -42.56313969348721,
+ -42.718516227150545,
+ -42.057728815671894,
+ -41.889921480141176,
+ -41.99014392407985,
+ -41.611798324516876,
+ -41.70220084915616,
+ -41.71351380770531,
+ -41.6041759088787,
+ -41.69020980448355,
+ -41.66368519735983,
+ -41.72225800194041,
+ -41.7146359351536,
+ -41.7533929343784,
+ -41.796226469616414,
+ -41.924742569373144,
+ -41.82318535514171,
+ -41.813861546403444,
+ -41.6531270675784,
+ -41.70757992888221,
+ -41.7348767677185,
+ -41.85088610869978,
+ -41.899035800291834,
+ -41.982210619402615,
+ -41.98509615524852,
+ -42.1063131867781,
+ -41.86326612636135,
+ -42.779998124529925,
+ -42.68170994358738,
+ -42.66948152532122,
+ -42.694570999683755,
+ -42.70307851183704,
+ -42.590663908323364,
+ -42.514912301861564,
+ -42.598082831623785,
+ -42.44428950234348,
+ -42.40367404821713,
+ -42.19080883842563,
+ -42.23935702497268,
+ -42.14896985128071,
+ -41.07315946899167,
+ -41.177118915310125,
+ -40.94615064437384,
+ -40.75451478813362,
+ -40.803857482858916,
+ -40.88902548992294,
+ -41.54783460255334,
+ -41.53789563026269,
+ -41.43077018976059,
+ -41.651960794486406,
+ -41.70116245640977,
+ -41.32279583798213,
+ -41.20046684119725,
+ -40.79785276835147,
+ -40.74654427726535,
+ -40.713434453023226,
+ -40.30590933110546,
+ -42.40774178396848,
+ -42.55131423178996,
+ -41.584011804198326,
+ -42.117138730837546,
+ -42.370817805666775,
+ -42.26097855116571,
+ -41.807245586699075,
+ -42.046946299391166,
+ -42.10667723828914,
+ -42.4662677225834,
+ -42.42461476987612,
+ -42.61162898328736,
+ -43.10492071767682,
+ -43.79827444748512,
+ -43.72923403566365,
+ -43.729364833075074,
+ -43.788496349892284,
+ -43.11074976479541,
+ -43.217139392322665,
+ -42.858139303875966,
+ -43.12676508252799,
+ -43.06525985022017,
+ -42.56780964471048,
+ -42.623973991107135,
+ -42.60861517028539,
+ -42.851721773092315,
+ -42.93127157907674,
+ -43.033951098711725,
+ -42.69251073400137,
+ -42.68532876420359,
+ -42.80483076822098,
+ -42.6755521094904,
+ -43.690852706976074,
+ -44.082234250977066,
+ -43.98299751163038,
+ -43.912391352053554,
+ -43.989041840709575,
+ -44.06504102556426,
+ -43.97158792209462,
+ -44.72000724462305,
+ -44.88173423292154,
+ -44.864263559827336,
+ -44.67242226276134,
+ -43.74159520027263,
+ -43.93208835253276,
+ -44.91358839880239,
+ -46.12804686286844,
+ -45.67030585323435,
+ -45.47650486123637,
+ -45.46043425049031,
+ -45.429629420481895,
+ -45.41136487025191,
+ -45.34485476835407,
+ -45.3146676894006,
+ -45.324201619250886,
+ -45.46963816769901,
+ -45.07875639091737,
+ -44.93233127638324,
+ -45.34526537830319,
+ -46.67972511812615,
+ -46.67047182321855,
+ -46.83345600072112,
+ -46.882903717060756,
+ -46.99529740706174,
+ -46.96259793984441,
+ -46.727763813380754,
+ -46.09579781943459,
+ -45.77398646685272,
+ -45.76241243363631,
+ -45.76324060654808,
+ -45.846079027363864,
+ -46.60136245513039,
+ -46.70465475829781,
+ -46.390465364311254,
+ -46.49524650371475,
+ -46.654871910890435,
+ -46.45983794536644,
+ -46.08565325415802,
+ -46.11944432874841,
+ -46.02913373655384,
+ -46.21909705415507,
+ -46.15457666312793,
+ -45.98475729397393,
+ -46.13614602921802,
+ -46.301970960414245,
+ -46.40697773127846,
+ -46.418887036263435,
+ -46.85362789817574,
+ -46.830735990423726,
+ -46.491576465207665,
+ -46.42018454833822,
+ -46.164643835579525,
+ -45.62320700962588,
+ -45.51445564852195,
+ -44.99844012513177,
+ -45.49619659142145,
+ -45.731984137116235,
+ -45.26410859499609,
+ -45.25858205034436,
+ -45.015644686665844,
+ -44.73922933320055,
+ -44.84308324724903,
+ -44.663518687519655,
+ -44.66698491972809,
+ -44.95241643680251,
+ -44.899862915940055,
+ -45.01172165590987,
+ -44.49870593346014,
+ -43.816151841950784,
+ -45.10641536756893,
+ -44.98144366607723,
+ -44.81484429756479,
+ -44.87699599985571,
+ -44.681541992187576,
+ -44.52087864999982,
+ -44.52032606333994,
+ -44.614975907753,
+ -44.86091797661469,
+ -44.963022137327755,
+ -45.03538385327832,
+ -45.47575113454374,
+ -45.26429816885558,
+ -45.819715598171626,
+ -45.86349712788218,
+ -45.89792236797918,
+ -46.581188704430836,
+ -46.52541566616815,
+ -46.40608252528024,
+ -47.758345934181555,
+ -47.69401940639976,
+ -47.643003666356016,
+ -47.168159301371624,
+ -47.98519693212338,
+ -47.56178065114382,
+ -47.57982734493735,
+ -47.47467920873558,
+ -46.46883965368615,
+ -45.51132565314017,
+ -45.53571150659429,
+ -45.587024790571036,
+ -45.679529296587745,
+ -45.08484992060888,
+ -44.95571449352894,
+ -45.65974287699725,
+ -45.674848965258086,
+ -46.425657369761225,
+ -46.321876239016774,
+ -46.222246300542736,
+ -46.61073565145115,
+ -46.61668972682826,
+ -46.69138898316569,
+ -46.588419564877675,
+ -46.481596120312744,
+ -46.72051894062572,
+ -47.15394160931306,
+ -46.2816596213053,
+ -45.3619059561934,
+ -44.81751626038014,
+ -45.03858420464847,
+ -44.959959024138435,
+ -45.00281651568625,
+ -44.592014535482605,
+ -44.51165654311959,
+ -44.528705471713494,
+ -44.13296108897732,
+ -44.143817114055636,
+ -44.19431575882676,
+ -44.22472086324186,
+ -44.426483446712005,
+ -45.204566038371325,
+ -45.306514600826056,
+ -45.190676624276605,
+ -44.89177004150835,
+ -44.73351887674124,
+ -44.70992560868683,
+ -43.484589568970975,
+ -43.476501052389104,
+ -43.44791214384768,
+ -43.628484557149264,
+ -43.53408375790696,
+ -43.37294225517441,
+ -43.201865544871346,
+ -43.39445422760965,
+ -43.56533780732282,
+ -43.21985828465908,
+ -43.22744230656427,
+ -43.31280690349751,
+ -42.98872138104202,
+ -42.991857272647906,
+ -42.80066172703802,
+ -42.393109170026555,
+ -41.19194126518373,
+ -41.89360478043088,
+ -42.204545472215415,
+ -42.20208514003651,
+ -41.91766688261628,
+ -41.804621000922694,
+ -41.85263371083348,
+ -41.89091692593308,
+ -41.95748449451604,
+ -42.20677612276606,
+ -41.183975818707005,
+ -41.292545191776334,
+ -41.400272890174094,
+ -41.48808918304961,
+ -41.43187606177071,
+ -41.44554217631824,
+ -41.139973567426544,
+ -41.266894878650724,
+ -40.89736826531138,
+ -40.88938740129759,
+ -40.81974068761446,
+ -40.82681613063418,
+ -40.722991729073954,
+ -40.701484854000064,
+ -40.87720663430996,
+ -40.85417091421293,
+ -40.9909849694776,
+ -41.50175337007495,
+ -41.70677757374956,
+ -41.53831309978723,
+ -41.59489981801598,
+ -41.5985079472006,
+ -42.36776552651507,
+ -42.259834265197014,
+ -41.864877044059874,
+ -42.073964033166554,
+ -41.76738935833998,
+ -42.027912108941536,
+ -41.59433411113219,
+ -41.54781061866711,
+ -41.31608215658822,
+ -40.728544907917986,
+ -41.19527684600463,
+ -41.7961233185855,
+ -41.36393690068169,
+ -41.13389217787931,
+ -40.74451836114012,
+ -40.9151730182358,
+ -41.08430825255962,
+ -41.18087472960117,
+ -40.97568011145429,
+ -40.989604632493965,
+ -40.57837547809401,
+ -40.55766961249439,
+ -40.46599411256055,
+ -40.39209970547978,
+ -40.88958854115181,
+ -40.777582530640075,
+ -40.8472027309967,
+ -40.803350513810855,
+ -40.55204537060705,
+ -40.554944962260095,
+ -40.19363949678382,
+ -40.070045430769504,
+ -40.18522583472992,
+ -40.10480263388929,
+ -40.53347203836316,
+ -40.3679035496128,
+ -40.61054742942594,
+ -40.34901205557951,
+ -40.30882477906183,
+ -41.212284388819405,
+ -41.08167320311966,
+ -41.129720583232455,
+ -41.04687808953681,
+ -41.061041565760135,
+ -41.259854148953146,
+ -41.21524950845933,
+ -40.932136751297996,
+ -40.70907474830598,
+ -39.60948237296406,
+ -39.52278175039994,
+ -39.53672962028875,
+ -39.734469341320924,
+ -39.73417454936947,
+ -39.598542892621325,
+ -39.582714643781195,
+ -39.654963457350874,
+ -39.728429506881405,
+ -39.62716030885311,
+ -40.15354499997205,
+ -40.82887411790412,
+ -41.19038783369999,
+ -41.11498850619212,
+ -40.872577276272295,
+ -40.85665629818903,
+ -41.19839559079489,
+ -41.199684356840564,
+ -40.90548175542956,
+ -41.25335247670095,
+ -41.30935725079218,
+ -41.35030932290129,
+ -41.30115583852202,
+ -40.662096192318316,
+ -40.71821810984539,
+ -40.352790751065996,
+ -40.48857920306174,
+ -39.038241347010896,
+ -39.10703747770835,
+ -39.20487925640765,
+ -40.17734064168914,
+ -40.193875922583175,
+ -40.22510194053463,
+ -40.20390481597059,
+ -40.327297810881106,
+ -40.44554973798669,
+ -40.57729059670748,
+ -40.59011574516365,
+ -40.27296396716396,
+ -40.259192568675836,
+ -39.94879466658464,
+ -39.8885259233847,
+ -40.0742214941032,
+ -40.03585263763779,
+ -40.25032418889346,
+ -40.47808522010875,
+ -41.7062190033879,
+ -41.717237034140645,
+ -41.527855127938324,
+ -41.45054943877827,
+ -41.722501796781025,
+ -41.75449775369638,
+ -41.638176880490214,
+ -41.89603425430358,
+ -42.09414726389755,
+ -42.16374052078004,
+ -43.11647589178894,
+ -43.0539429588223,
+ -43.23885174809314,
+ -43.03681913526729,
+ -43.202675046942325,
+ -43.21563899806898,
+ -43.537908832104584,
+ -43.36986281866425,
+ -43.799752923268805,
+ -43.796880168979754,
+ -43.59528470559877,
+ -43.33368788374619,
+ -43.354645557555955,
+ -42.82995911105415,
+ -42.46161967408114,
+ -42.33237686022589,
+ -42.32355844876622,
+ -42.366083727545096,
+ -42.36671775411652,
+ -42.76550069673355,
+ -42.632843075966534,
+ -42.61050407387431,
+ -42.41369945731343,
+ -42.12522591456009,
+ -42.697288276258334,
+ -42.69756658806329,
+ -42.93806871349705,
+ -42.778459662771304,
+ -43.336383227749025,
+ -43.136250568110555,
+ -42.43993320175078,
+ -43.119116700727076,
+ -43.096877501608056,
+ -43.165654473880025,
+ -43.0787549291745,
+ -43.4021830988713,
+ -44.11360187602157,
+ -43.76711426203899,
+ -43.777226775482234,
+ -43.60105164733228,
+ -43.74885061749858,
+ -43.74221458699811,
+ -44.27054005540678,
+ -44.294271948843836,
+ -44.40515818390703,
+ -43.56880747231182,
+ -43.13052276828717,
+ -43.12638501511285,
+ -42.842337331811116,
+ -42.90268123496529,
+ -42.7232356491056,
+ -42.80288268272473,
+ -42.08279829607403,
+ -41.791142714051546,
+ -41.681453389737136,
+ -41.7562340020613,
+ -41.91249689755856,
+ -42.11704534444846,
+ -42.08477638959313,
+ -42.43472267889249,
+ -42.456515337102154,
+ -42.41867029009528,
+ -43.262126158029325,
+ -43.14073892141879,
+ -43.050257453162466,
+ -43.03352992455931,
+ -43.287880392606425,
+ -43.227158536111126,
+ -43.164269163094005,
+ -43.26609895367135,
+ -44.64079131808283,
+ -44.83488675637461,
+ -44.930471304902476,
+ -44.41749949422998,
+ -44.426110965342026,
+ -44.67240576407425,
+ -44.54632895009039,
+ -44.479302815025754,
+ -44.325912287484435,
+ -44.37294472163574,
+ -43.96744679198958,
+ -44.36687347528282,
+ -44.127675747630505,
+ -42.26407218661231,
+ -42.4004111124968,
+ -42.49271778000831,
+ -42.16524012238819,
+ -42.005858927585344,
+ -42.066459944763565,
+ -42.1838486259667,
+ -41.580114774966894,
+ -41.38181200231138,
+ -41.03042956058327,
+ -41.29299259650865,
+ -41.31505253944656,
+ -41.46866392504106,
+ -41.46310576809921,
+ -42.8002597175207,
+ -43.135004100844604,
+ -43.167386253564715,
+ -43.06663521727571,
+ -42.7298561140452,
+ -42.526938690737296,
+ -42.378064310034915,
+ -42.16612880952958,
+ -42.20201744358183,
+ -42.087071262745305,
+ -42.12366444797121,
+ -42.4360473679011,
+ -42.350480079466024,
+ -42.18291052786511,
+ -42.106918812199865,
+ -42.20057092786136,
+ -42.272209447626494,
+ -41.465088403403556,
+ -41.52042879176279,
+ -41.589946758429164,
+ -41.29346369133216,
+ -41.17670049067488,
+ -41.2063018350919,
+ -41.21661494880464,
+ -41.04203709198502,
+ -40.764803596295785,
+ -40.766454516019415,
+ -40.67926247395842,
+ -39.8142267659288,
+ -39.81550120507677,
+ -39.659819280922285,
+ -39.8951487572643,
+ -39.86790191744298,
+ -39.77005876939145,
+ -39.663145282037405,
+ -39.544185685460455,
+ -39.61172052484428,
+ -39.36192144332903,
+ -39.3368457980986,
+ -39.40662305509801,
+ -39.61608976514001,
+ -39.66566342775528,
+ -40.03068097849681,
+ -40.34384745872581,
+ -40.46931529832114,
+ -40.43577227625151,
+ -40.33329115716194,
+ -40.22737310233085,
+ -40.267334370762654,
+ -40.33550501480789,
+ -40.263525377603386,
+ -40.24673718774802,
+ -40.56898856573796,
+ -40.425425089234444,
+ -40.37975142235301,
+ -40.434611393873986,
+ -40.22369465473932,
+ -39.4465751916708,
+ -39.12426398103099,
+ -39.92589786202198,
+ -39.80974839070683,
+ -39.83186546412003,
+ -39.640768729403035,
+ -40.10357442361006,
+ -39.97604295467204,
+ -39.663031217039105,
+ -39.91788211995389,
+ -39.65633441976001,
+ -39.593662401134296,
+ -39.345907458579084,
+ -38.803070509983705,
+ -38.51048070102561,
+ -38.40358098741713,
+ -37.91836819377449,
+ -38.57453051761722,
+ -38.67627457771305,
+ -38.83500921349971,
+ -38.99448187955538,
+ -38.981187570221074,
+ -39.130210951283644,
+ -39.14860801223101,
+ -40.00757750809748,
+ -39.27182883189915,
+ -39.34809008835406,
+ -39.310236173447485,
+ -39.26777553393683,
+ -39.25861779719772,
+ -39.10678309572493,
+ -39.1160509938544,
+ -39.02922491002538,
+ -38.97710967355735,
+ -39.033190581517935,
+ -39.03052537843221,
+ -38.90610289010333,
+ -38.86888171187693,
+ -38.89707511075645,
+ -38.78234962329847,
+ -38.31295966630159,
+ -37.84141362373395,
+ -37.134316832011834,
+ -37.198723283767954,
+ -36.99174653551943,
+ -37.26038462268863,
+ -36.97442732306246,
+ -36.89778472639669,
+ -36.6064837478887,
+ -36.38093383402621,
+ -36.48293734351494,
+ -36.51357935607297,
+ -36.66994658776598,
+ -36.31679290418942,
+ -36.57928824429222,
+ -37.84394745045535,
+ -37.88532274580825,
+ -37.84882625852266,
+ -37.36687580327678,
+ -37.39294940825172,
+ -37.52248859495469,
+ -37.303856987289876,
+ -37.74296257100266,
+ -37.90737850094596,
+ -38.22102348762433,
+ -38.55564638634221,
+ -38.566616880856486,
+ -38.77641998754972,
+ -38.776706363827735,
+ -39.149110376645424,
+ -39.23377466427786,
+ -39.22970194364533,
+ -39.12192942117353,
+ -39.41856534281063,
+ -39.53858864426104,
+ -39.66102875101976,
+ -39.69579925796855,
+ -39.55211308477443,
+ -39.545685020169216,
+ -39.527857675662965,
+ -39.55523868795577,
+ -39.786926134732624,
+ -39.59878268060566,
+ -39.72455198626129,
+ -39.748062430133764,
+ -39.74651350713148,
+ -40.459354206114796,
+ -40.44928665097635,
+ -40.54589452059427,
+ -40.63596535142331,
+ -40.93555099844014,
+ -40.9812713068479,
+ -40.90398965474542,
+ -41.16848554578267,
+ -41.26474395638993,
+ -40.84394827941438,
+ -40.91259527853427,
+ -41.557353817690206,
+ -41.75932781918302,
+ -41.60682956467718,
+ -41.54752929193785,
+ -41.696885906818906,
+ -41.78901936222538,
+ -41.913786413993215,
+ -42.13530999407161,
+ -42.09407765855666,
+ -42.516716896180995,
+ -42.02825880594662,
+ -42.0971436944227,
+ -42.15587496674248,
+ -42.16377654379765,
+ -42.31530168009572,
+ -42.217168742903354,
+ -42.098217529936434,
+ -42.26705183330567,
+ -42.16114582302581,
+ -42.25762175176314,
+ -42.29432667596999,
+ -42.10857705703778,
+ -41.68598764614212,
+ -41.67048696665244,
+ -41.52709174058122,
+ -41.60553880247966,
+ -41.59722206469951,
+ -41.06023780116072,
+ -41.45974723928298,
+ -42.3051313943407,
+ -42.87188266148616,
+ -42.8286996915544,
+ -41.84930275841945,
+ -41.844794191627216,
+ -41.94014485341284,
+ -41.97305023465549,
+ -42.16053597410947,
+ -42.384980956023924,
+ -42.414018005008955,
+ -42.36449417497322,
+ -42.603547628691516,
+ -42.663008130838136,
+ -42.45195879639187,
+ -42.833019365713696,
+ -43.03910871297196,
+ -43.692193511347625,
+ -43.364450412332566,
+ -43.44227783774658
+ ],
+ "borderColor": "#2ecc71",
+ "backgroundColor": "rgba(46, 204, 113, 0.1)",
+ "fill": true,
+ "tension": 0.1
+ }
+ ]
+ },
+ "config": {
+ "y_axis_label": "Sharpe Ratio",
+ "window_size": 252
+ },
+ "position": {
+ "row": 2,
+ "col": 1
+ }
+ }
+ }
}
\ No newline at end of file
diff --git a/dashboard/js/chart_factory.js b/dashboard/js/chart_factory.js
new file mode 100644
index 0000000..b4436ac
--- /dev/null
+++ b/dashboard/js/chart_factory.js
@@ -0,0 +1,157 @@
+/**
+ * Chart Factory - Functions for creating various chart types
+ */
+
+// Store chart instances for later reference
+const chartInstances = {};
+
+/**
+ * Create a line chart
+ * @param {string} containerId - ID of the container element
+ * @param {object} data - Chart data
+ * @param {object} options - Chart options
+ */
+function createLineChart(containerId, data, options) {
+ const container = document.getElementById(containerId);
+ if (!container) return;
+
+ // Clear existing content
+ container.innerHTML = '';
+
+ // Create canvas element
+ const canvas = document.createElement('canvas');
+ container.appendChild(canvas);
+
+ // Check if data is available
+ if (!data || !data.labels || !data.datasets || data.labels.length === 0) {
+ container.innerHTML = '
No data available
';
+ return;
+ }
+
+ // Create chart instance
+ chartInstances[containerId] = new Chart(canvas, {
+ type: 'line',
+ data: data,
+ options: options || {}
+ });
+}
+
+/**
+ * Create a heatmap table
+ * @param {string} containerId - ID of the container element
+ * @param {object} data - Heatmap data
+ */
+function createHeatmapTable(containerId, data) {
+ const container = document.getElementById(containerId);
+ if (!container) return;
+
+ // Clear existing content
+ container.innerHTML = '';
+
+ // Check if data is available
+ if (!data || !data.years || !data.months || data.years.length === 0) {
+ container.innerHTML = '
No data available
';
+ return;
+ }
+
+ // Create table element
+ const table = document.createElement('table');
+ table.className = 'heatmap-table';
+ container.appendChild(table);
+
+ // Create header row
+ const headerRow = document.createElement('tr');
+
+ // Add empty corner cell
+ const cornerCell = document.createElement('th');
+ headerRow.appendChild(cornerCell);
+
+ // Add month headers
+ for (const month of data.months) {
+ const cell = document.createElement('th');
+ cell.textContent = month;
+ headerRow.appendChild(cell);
+ }
+
+ table.appendChild(headerRow);
+
+ // Create data rows
+ for (const year of data.years) {
+ const row = document.createElement('tr');
+
+ // Add year header
+ const yearCell = document.createElement('th');
+ yearCell.textContent = year;
+ row.appendChild(yearCell);
+
+ // Add data cells
+ for (let month = 1; month <= 12; month++) {
+ const cell = document.createElement('td');
+ const key = `${year}-${month}`;
+
+ if (key in data.data) {
+ const value = data.data[key];
+
+ // Format value
+ cell.textContent = formatAsPercentage(value);
+
+ // Apply color scale
+ applyHeatmapColor(cell, value);
+ }
+
+ row.appendChild(cell);
+ }
+
+ table.appendChild(row);
+ }
+}
+
+/**
+ * Apply color to heatmap cell based on value
+ * @param {HTMLElement} cell - Table cell element
+ * @param {number} value - Cell value
+ */
+function applyHeatmapColor(cell, value) {
+ if (value > 0.03) {
+ cell.style.backgroundColor = 'rgba(46, 204, 113, 0.8)';
+ cell.style.color = 'white';
+ } else if (value > 0.01) {
+ cell.style.backgroundColor = 'rgba(46, 204, 113, 0.5)';
+ } else if (value > 0) {
+ cell.style.backgroundColor = 'rgba(46, 204, 113, 0.2)';
+ } else if (value > -0.01) {
+ cell.style.backgroundColor = 'rgba(231, 76, 60, 0.2)';
+ } else if (value > -0.03) {
+ cell.style.backgroundColor = 'rgba(231, 76, 60, 0.5)';
+ } else {
+ cell.style.backgroundColor = 'rgba(231, 76, 60, 0.8)';
+ cell.style.color = 'white';
+ }
+}
+
+/**
+ * Format value as percentage
+ * @param {number} value - Value to format
+ * @returns {string} - Formatted percentage
+ */
+function formatAsPercentage(value) {
+ return `${(value * 100).toFixed(1)}%`;
+}
+
+/**
+ * Format value
+ * @param {number} value - Value to format
+ * @returns {string} - Formatted value
+ */
+function formatValue(value) {
+ return value.toFixed(2);
+}
+
+/**
+ * Format value as currency
+ * @param {number} value - Value to format
+ * @returns {string} - Formatted currency
+ */
+function formatAsCurrency(value) {
+ return `$${value.toFixed(2)}`;
+}
\ No newline at end of file
diff --git a/dashboard/js/dashboard.js b/dashboard/js/dashboard.js
new file mode 100644
index 0000000..89cb68a
--- /dev/null
+++ b/dashboard/js/dashboard.js
@@ -0,0 +1,211 @@
+/**
+ * Dashboard - Main dashboard functionality
+ */
+
+// Global data object
+let chartData;
+
+/**
+ * Initialize the dashboard
+ */
+function initDashboard() {
+ // Load data
+ fetch('dashboard_data.json')
+ .then(response => response.json())
+ .then(data => {
+ // Store data globally
+ chartData = data;
+
+ // Initialize dashboard components
+ createDashboard();
+ })
+ .catch(error => {
+ console.error('Error loading dashboard data:', error);
+ document.body.innerHTML = `
Error loading dashboard data: ${error.message}
`;
+ });
+}
+
+/**
+ * Create the dashboard
+ */
+function createDashboard() {
+ // Update metadata in the header
+ updateHeader();
+
+ // Create metrics
+ createMetrics();
+
+ // Create charts
+ createCharts();
+
+ // Add window resize handler
+ window.addEventListener('resize', handleResize);
+}
+
+/**
+ * Update the dashboard header with metadata
+ */
+function updateHeader() {
+ // Update title if needed
+ const titleElement = document.querySelector('.dashboard-header h1');
+ if (titleElement && chartData.metadata.title) {
+ titleElement.textContent = chartData.metadata.title;
+ }
+
+ // Update date range
+ const dateRangeElement = document.querySelector('.date-range');
+ if (dateRangeElement) {
+ dateRangeElement.textContent = `Backtest Period: ${chartData.metadata.start_date} to ${chartData.metadata.end_date}`;
+ }
+
+ // Update total return
+ const totalReturnElement = document.querySelector('.header-summary h2');
+ if (totalReturnElement) {
+ const totalReturn = chartData.metadata.total_return;
+ const sign = totalReturn >= 0 ? '+' : '';
+ totalReturnElement.textContent = `${sign}${totalReturn.toFixed(2)}%`;
+ totalReturnElement.className = totalReturn >= 0 ? 'positive-return' : 'negative-return';
+ }
+}
+
+/**
+ * Create metrics based on data
+ */
+function createMetrics() {
+ // Check if metrics data is available
+ if (!chartData.metrics) return;
+
+ // Update each metric
+ for (const metricId in chartData.metrics) {
+ const metric = chartData.metrics[metricId];
+
+ // Update based on metric type
+ switch (metric.type) {
+ case 'Percentage':
+ updatePercentageMetric(metricId, metric.value);
+ break;
+ case 'Value':
+ updateValueMetric(metricId, metric.value);
+ break;
+ case 'Currency':
+ updateCurrencyMetric(metricId, metric.value);
+ break;
+ default:
+ // Unsupported metric type
+ console.warn(`Unsupported metric type: ${metric.type}`);
+ }
+ }
+}
+
+/**
+ * Create charts based on data
+ */
+function createCharts() {
+ // Check if charts data is available
+ if (!chartData.charts) return;
+
+ // Create each chart
+ for (const chartId in chartData.charts) {
+ const chart = chartData.charts[chartId];
+
+ // Create based on chart type
+ switch (chart.type) {
+ case 'LineChart':
+ createLineChart(
+ chartId,
+ chart.data,
+ getChartOptions(chart)
+ );
+ break;
+ case 'HeatmapTable':
+ createHeatmapTable(
+ chartId,
+ chart.data
+ );
+ break;
+ default:
+ // Unsupported chart type
+ console.warn(`Unsupported chart type: ${chart.type}`);
+ }
+ }
+}
+
+/**
+ * Get chart options based on chart configuration
+ * @param {object} chart - Chart configuration
+ * @returns {object} - Chart options
+ */
+function getChartOptions(chart) {
+ // Base options
+ const options = {
+ responsive: true,
+ maintainAspectRatio: false,
+ plugins: {
+ legend: {
+ display: true,
+ position: 'top',
+ },
+ tooltip: {
+ mode: 'index',
+ intersect: false
+ }
+ },
+ scales: {
+ x: {
+ type: 'time',
+ time: {
+ unit: 'month',
+ displayFormats: {
+ month: 'MMM YYYY'
+ }
+ },
+ title: {
+ display: true,
+ text: 'Date'
+ }
+ },
+ y: {
+ title: {
+ display: true,
+ text: chart.config.y_axis_label || 'Value'
+ }
+ }
+ }
+ };
+
+ // Add percentage formatting if needed
+ if (chart.config.percentage_format) {
+ options.plugins.tooltip.callbacks = {
+ label: function(context) {
+ let label = context.dataset.label || '';
+ if (label) {
+ label += ': ';
+ }
+ if (context.parsed.y !== null) {
+ label += formatAsPercentage(context.parsed.y);
+ }
+ return label;
+ }
+ };
+
+ options.scales.y.ticks = {
+ callback: function(value) {
+ return formatAsPercentage(value);
+ }
+ };
+ }
+
+ return options;
+}
+
+/**
+ * Handle window resize event
+ */
+function handleResize() {
+ // Redraw charts if needed
+ for (const chartId in chartInstances) {
+ if (chartInstances[chartId]) {
+ chartInstances[chartId].resize();
+ }
+ }
+}
\ No newline at end of file
diff --git a/dashboard/js/metric_factory.js b/dashboard/js/metric_factory.js
new file mode 100644
index 0000000..80d9a0d
--- /dev/null
+++ b/dashboard/js/metric_factory.js
@@ -0,0 +1,60 @@
+/**
+ * Metric Factory - Functions for updating various metric types
+ */
+
+/**
+ * Update a percentage metric
+ * @param {string} metricId - ID of the metric element
+ * @param {number} value - Metric value
+ */
+function updatePercentageMetric(metricId, value) {
+ const element = document.getElementById(metricId);
+ if (!element) return;
+
+ // Format value
+ const formattedValue = formatAsPercentage(value);
+
+ // Determine class based on value
+ const className = value >= 0 ? 'positive' : 'negative';
+
+ // Update element
+ element.innerHTML = `
${formattedValue} `;
+}
+
+/**
+ * Update a value metric
+ * @param {string} metricId - ID of the metric element
+ * @param {number} value - Metric value
+ */
+function updateValueMetric(metricId, value) {
+ const element = document.getElementById(metricId);
+ if (!element) return;
+
+ // Format value
+ const formattedValue = formatValue(value);
+
+ // Determine class based on value
+ const className = value >= 0 ? 'positive' : 'negative';
+
+ // Update element
+ element.innerHTML = `
${formattedValue} `;
+}
+
+/**
+ * Update a currency metric
+ * @param {string} metricId - ID of the metric element
+ * @param {number} value - Metric value
+ */
+function updateCurrencyMetric(metricId, value) {
+ const element = document.getElementById(metricId);
+ if (!element) return;
+
+ // Format value
+ const formattedValue = formatAsCurrency(value);
+
+ // Determine class based on value
+ const className = value >= 0 ? 'positive' : 'negative';
+
+ // Update element
+ element.innerHTML = `
${formattedValue} `;
+}
\ No newline at end of file
diff --git a/strategy.csv b/strategy.csv
index 0daed08..79cbdb5 100644
--- a/strategy.csv
+++ b/strategy.csv
@@ -1,1001 +1,1001 @@
,Strategy
-2020-01-01,99.43580221643582
-2020-01-02,100.9651267250002
-2020-01-03,101.47618581438884
-2020-01-06,101.40970154137709
-2020-01-07,101.68043817071772
-2020-01-08,100.76913361541695
-2020-01-09,100.20637401722436
-2020-01-10,99.85261881167818
-2020-01-13,101.71377134584947
-2020-01-14,103.00351325730519
-2020-01-15,103.33757964669755
-2020-01-16,103.22895658836937
-2020-01-17,104.38877831800492
-2020-01-20,105.61930775679942
-2020-01-21,105.0070722569902
-2020-01-22,103.6517193120229
-2020-01-23,101.9035923118491
-2020-01-24,102.06947592549463
-2020-01-27,102.8483663284558
-2020-01-28,104.26252142014216
-2020-01-29,105.24085154729168
-2020-01-30,105.61895221757905
-2020-01-31,106.2620847890057
-2020-02-03,108.1074270811467
-2020-02-04,109.1318940390462
-2020-02-05,109.06959873071365
-2020-02-06,110.8481558387983
-2020-02-07,109.22556045218474
-2020-02-10,109.7368109956686
-2020-02-11,110.79033316157512
-2020-02-12,110.50595899966031
-2020-02-13,111.25900364915633
-2020-02-14,110.20260700058732
-2020-02-17,111.01462783557128
-2020-02-18,111.11533321566576
-2020-02-19,111.01682639595774
-2020-02-20,109.69837253168812
-2020-02-21,110.24692985358509
-2020-02-24,112.08222160559293
-2020-02-25,111.17319245651822
-2020-02-26,110.69013060522236
-2020-02-27,112.25507242161763
-2020-02-28,112.68307997510811
-2020-03-02,113.71581643219085
-2020-03-03,113.17854572744545
-2020-03-04,113.75921983444772
-2020-03-05,113.32026252181355
-2020-03-06,112.03211147356515
-2020-03-09,112.82006669016774
-2020-03-10,112.84437806321475
-2020-03-11,114.30747876982505
-2020-03-12,112.56251325106797
-2020-03-13,111.96513168754036
-2020-03-16,110.63111762876252
-2020-03-17,109.54403310457894
-2020-03-18,109.75025608523026
-2020-03-19,110.42078550355777
-2020-03-20,108.48747422991907
-2020-03-23,106.84231787763778
-2020-03-24,108.05769872428064
-2020-03-25,108.46490121066374
-2020-03-26,109.01358029275761
-2020-03-27,108.31182966919212
-2020-03-30,109.34711795756972
-2020-03-31,109.91873287828615
-2020-04-01,108.76841353136577
-2020-04-02,108.56142029421154
-2020-04-03,108.57503373916617
-2020-04-06,109.11968623888735
-2020-04-07,109.89103052547158
-2020-04-08,111.59658406702775
-2020-04-09,111.40140859701464
-2020-04-10,110.00520614997991
-2020-04-13,108.25535297673423
-2020-04-14,106.56435545963771
-2020-04-15,106.10140494625668
-2020-04-16,106.1382004292148
-2020-04-17,105.53688799930703
-2020-04-20,107.03010116809915
-2020-04-21,106.37434182181833
-2020-04-22,105.11696511574607
-2020-04-23,106.79048037738694
-2020-04-24,107.79455229295299
-2020-04-27,108.41826089371769
-2020-04-28,108.41840213894028
-2020-04-29,107.68236006496588
-2020-04-30,108.00999183706253
-2020-05-01,109.15652176507886
-2020-05-04,108.85838951632513
-2020-05-05,107.70801695379939
-2020-05-06,107.5502371683424
-2020-05-07,107.69816892268305
-2020-05-08,108.57083826155684
-2020-05-11,109.06191573293904
-2020-05-12,109.62083517308925
-2020-05-13,109.26100654215402
-2020-05-14,109.34413929791722
-2020-05-15,111.08865718202084
-2020-05-18,111.90238322093597
-2020-05-19,109.94784560683959
-2020-05-20,110.44254338306736
-2020-05-21,110.39880823549504
-2020-05-22,110.99789507737017
-2020-05-25,111.47255781126826
-2020-05-26,112.48426532617538
-2020-05-27,112.89891169119555
-2020-05-28,111.68972646654223
-2020-05-29,112.27706364375561
-2020-06-01,111.7866990229521
-2020-06-02,112.16856155708766
-2020-06-03,113.0388760604244
-2020-06-04,114.15970321786271
-2020-06-05,114.37176554199431
-2020-06-08,113.18850716893176
-2020-06-09,114.59879342622526
-2020-06-10,114.76767954947526
-2020-06-11,115.86569808386041
-2020-06-12,115.89729328497047
-2020-06-15,117.59517612992418
-2020-06-16,118.04217570022453
-2020-06-17,116.03202007034068
-2020-06-18,116.08806278730988
-2020-06-19,113.58402678744588
-2020-06-22,112.27825027079916
-2020-06-23,113.34110288672066
-2020-06-24,113.28582131942989
-2020-06-25,113.79491938324426
-2020-06-26,115.74635558178987
-2020-06-29,114.23567729250817
-2020-06-30,112.44821338065843
-2020-07-01,113.96065677583198
-2020-07-02,113.962923126591
-2020-07-03,113.71070764449343
-2020-07-06,112.96103095682204
-2020-07-07,113.27644568205466
-2020-07-08,114.07374151560322
-2020-07-09,112.48671624045785
-2020-07-10,112.55428791936357
-2020-07-13,111.77529535945338
-2020-07-14,112.27870722155203
-2020-07-15,112.9984045711358
-2020-07-16,114.7135850993861
-2020-07-17,113.56059064372768
-2020-07-20,114.13232522188696
-2020-07-21,115.71009481869916
-2020-07-22,116.804352031123
-2020-07-23,116.51365896277713
-2020-07-24,115.02784440326543
-2020-07-27,113.8922535059496
-2020-07-28,112.37720825737492
-2020-07-29,112.02290401081866
-2020-07-30,110.8010034169848
-2020-07-31,112.37799166697957
-2020-08-03,110.7970061299043
-2020-08-04,110.32943351523272
-2020-08-05,108.47298813427295
-2020-08-06,106.87288257116631
-2020-08-07,105.80768676021788
-2020-08-10,107.26980473042657
-2020-08-11,108.6290147336622
-2020-08-12,109.22536254559019
-2020-08-13,107.15057429112711
-2020-08-14,107.90368395258356
-2020-08-17,108.0922801390854
-2020-08-18,107.68719787690983
-2020-08-19,106.25467057437086
-2020-08-20,106.14640769426633
-2020-08-21,107.68973168415421
-2020-08-24,107.83871573152607
-2020-08-25,108.13724266614551
-2020-08-26,107.85272848931058
-2020-08-27,107.0832155647563
-2020-08-28,108.96556522485842
-2020-08-31,108.61892256633577
-2020-09-01,107.76663594988969
-2020-09-02,107.33816413653514
-2020-09-03,107.25009783507382
-2020-09-04,105.63445779545569
-2020-09-07,105.99025801348603
-2020-09-08,105.02837195723261
-2020-09-09,106.25158607586384
-2020-09-10,106.69187760302962
-2020-09-11,106.92300119068557
-2020-09-14,107.8997056928989
-2020-09-15,106.4310418905338
-2020-09-16,107.55553431367784
-2020-09-17,107.4073642150363
-2020-09-18,109.13286377498117
-2020-09-21,109.58976121935923
-2020-09-22,109.48213490988275
-2020-09-23,108.69140077652644
-2020-09-24,108.64733048570723
-2020-09-25,107.76424625279111
-2020-09-28,108.15323775811498
-2020-09-29,108.79169095474224
-2020-09-30,108.5640232627655
-2020-10-01,106.65968049332571
-2020-10-02,106.78726418865061
-2020-10-05,106.55264508528558
-2020-10-06,107.45425766625118
-2020-10-07,108.54744656821794
-2020-10-08,108.42946475228617
-2020-10-09,109.40287009911592
-2020-10-12,110.6049242263
-2020-10-13,109.9937902998957
-2020-10-14,108.10275983174138
-2020-10-15,106.94811431862108
-2020-10-16,106.48783317670407
-2020-10-19,105.04515595316428
-2020-10-20,104.2742699682601
-2020-10-21,103.16512654106968
-2020-10-22,105.48721153249205
-2020-10-23,106.23925374839334
-2020-10-26,104.65590699770866
-2020-10-27,103.81610213936821
-2020-10-28,103.28060517572901
-2020-10-29,101.88105037672128
-2020-10-30,102.62115862628734
-2020-11-02,102.34520240915302
-2020-11-03,102.72819927329266
-2020-11-04,101.54044992831739
-2020-11-05,103.9453993559438
-2020-11-06,104.02596423417285
-2020-11-09,102.57520262498667
-2020-11-10,101.53317677624645
-2020-11-11,101.49004441566407
-2020-11-12,102.6739927632276
-2020-11-13,102.26528249035867
-2020-11-16,103.37469608518064
-2020-11-17,104.4205673339741
-2020-11-18,105.65830189878898
-2020-11-19,106.4827912150845
-2020-11-20,106.89018392144578
-2020-11-23,106.63316107419844
-2020-11-24,105.61362178944131
-2020-11-25,105.78465797634861
-2020-11-26,105.5478724728399
-2020-11-27,105.86670997178011
-2020-11-30,107.01639592952039
-2020-12-01,109.83295922966161
-2020-12-02,109.83359683892893
-2020-12-03,107.1155579904278
-2020-12-04,108.48422988142563
-2020-12-07,108.82721158840572
-2020-12-08,109.3377775458904
-2020-12-09,108.80747594544889
-2020-12-10,108.89641628469397
-2020-12-11,109.7780211380707
-2020-12-14,111.6540093895013
-2020-12-15,113.8867189407722
-2020-12-16,113.02113553665112
-2020-12-17,113.27605567708315
-2020-12-18,112.62755385995702
-2020-12-21,113.25566180441369
-2020-12-22,112.0195045382558
-2020-12-23,111.11786292141512
-2020-12-24,110.87161307907016
-2020-12-25,111.92844289248937
-2020-12-28,112.65211015384176
-2020-12-29,112.02155153371172
-2020-12-30,110.4021173355066
-2020-12-31,110.24875534577066
-2021-01-01,111.55698291741388
-2021-01-04,112.11099827578752
-2021-01-05,112.21469304019647
-2021-01-06,111.70898996965579
-2021-01-07,111.05589152453297
-2021-01-08,112.99107782406708
-2021-01-11,113.14432628579534
-2021-01-12,113.09121999544746
-2021-01-13,112.18628530919763
-2021-01-14,112.65873434136307
-2021-01-15,111.32218645231897
-2021-01-18,111.95270189607022
-2021-01-19,109.8389247264035
-2021-01-20,109.92757000218975
-2021-01-21,109.90657221503865
-2021-01-22,112.71750769425479
-2021-01-25,112.47899829050141
-2021-01-26,111.1730463265318
-2021-01-27,110.69078482044054
-2021-01-28,111.740333662976
-2021-01-29,112.25686492310084
-2021-02-01,112.97290434996974
-2021-02-02,112.19891035467566
-2021-02-03,112.20408583357357
-2021-02-04,113.05418914805038
-2021-02-05,115.31147396065242
-2021-02-08,117.14261041505097
-2021-02-09,118.75073387494837
-2021-02-10,119.97059520929973
-2021-02-11,119.33598531518169
-2021-02-12,119.33842238791192
-2021-02-15,119.80899498362048
-2021-02-16,120.21291198772232
-2021-02-17,119.24137001820353
-2021-02-18,117.71221954914728
-2021-02-19,117.06056274928764
-2021-02-22,115.34310483477736
-2021-02-23,117.58465250237356
-2021-02-24,116.83625647253942
-2021-02-25,116.31422686898986
-2021-02-26,115.99985398705333
-2021-03-01,116.39283322440295
-2021-03-02,116.14198011825607
-2021-03-03,114.89445660946463
-2021-03-04,113.91032422291222
-2021-03-05,114.47291435059232
-2021-03-08,115.04257789701053
-2021-03-09,115.28665481083875
-2021-03-10,114.0094187065952
-2021-03-11,114.00049971766694
-2021-03-12,113.16333885485412
-2021-03-15,113.64283037975981
-2021-03-16,114.00045494178141
-2021-03-17,114.17709906044959
-2021-03-18,113.4310215155243
-2021-03-19,113.62486997778254
-2021-03-22,112.45477166883045
-2021-03-23,111.3838720209376
-2021-03-24,111.01322351845022
-2021-03-25,111.00939619097392
-2021-03-26,111.8120212147527
-2021-03-29,111.62440230213564
-2021-03-30,110.37373856994206
-2021-03-31,111.94477267944394
-2021-04-01,111.67210601527873
-2021-04-02,112.61305079961346
-2021-04-05,112.66894897310173
-2021-04-06,111.24071042608527
-2021-04-07,112.56370264476223
-2021-04-08,114.91026248723651
-2021-04-09,114.47530130216555
-2021-04-12,114.22313517763867
-2021-04-13,116.96905436533176
-2021-04-14,116.36930975670481
-2021-04-15,114.7788158849487
-2021-04-16,112.45210019758262
-2021-04-19,112.82910498254854
-2021-04-20,113.59976131561828
-2021-04-21,113.48246758229968
-2021-04-22,111.84582185307185
-2021-04-23,110.09964883420619
-2021-04-26,109.93033900994162
-2021-04-27,109.53716068636264
-2021-04-28,109.53275232320064
-2021-04-29,108.96941749564763
-2021-04-30,109.53937938382832
-2021-05-03,110.57486090892088
-2021-05-04,109.05775579404727
-2021-05-05,109.3735774681303
-2021-05-06,107.26457722946235
-2021-05-07,107.70564544645298
-2021-05-10,107.85848530733884
-2021-05-11,108.0004384143622
-2021-05-12,108.26859268200305
-2021-05-13,106.67686195523854
-2021-05-14,105.49751881500804
-2021-05-17,107.08166624731228
-2021-05-18,106.49094562639894
-2021-05-19,104.54290084618822
-2021-05-20,106.300791434971
-2021-05-21,108.27595402944907
-2021-05-24,109.15372038326949
-2021-05-25,110.18772267492136
-2021-05-26,110.63871310810087
-2021-05-27,110.95652901010713
-2021-05-28,109.78417455749685
-2021-05-31,108.4782440028188
-2021-06-01,109.40624410672118
-2021-06-02,110.10782228572889
-2021-06-03,111.44800131707278
-2021-06-04,112.18940233327245
-2021-06-07,112.67018032544004
-2021-06-08,112.07624749951353
-2021-06-09,110.62490091235706
-2021-06-10,111.13265846895048
-2021-06-11,111.3929639453091
-2021-06-14,110.6381324141479
-2021-06-15,109.45504024178206
-2021-06-16,108.80580084222709
-2021-06-17,108.7854847791565
-2021-06-18,109.00825911467142
-2021-06-21,107.44451262611778
-2021-06-22,107.64858191727407
-2021-06-23,104.88021261302538
-2021-06-24,106.81318973244305
-2021-06-25,106.56121391325395
-2021-06-28,108.38484335568917
-2021-06-29,107.09253999454265
-2021-06-30,107.27632182135052
-2021-07-01,107.71610751775349
-2021-07-02,106.76482271266788
-2021-07-05,107.01187708537687
-2021-07-06,106.4457845493731
-2021-07-07,107.85844618640157
-2021-07-08,107.27530324149485
-2021-07-09,106.82912976329091
-2021-07-12,106.88263101324765
-2021-07-13,106.71591818796958
-2021-07-14,108.4115967590868
-2021-07-15,108.60615839870185
-2021-07-16,109.95575169695475
-2021-07-19,110.50671471613268
-2021-07-20,110.01640573244575
-2021-07-21,110.49557869952231
-2021-07-22,109.71950117970239
-2021-07-23,110.00205171450695
-2021-07-26,110.97913201018154
-2021-07-27,111.77530137649043
-2021-07-28,111.87950302732173
-2021-07-29,116.55162934947975
-2021-07-30,117.45334500784858
-2021-08-02,117.05227423597174
-2021-08-03,117.85539494177848
-2021-08-04,120.11996716942733
-2021-08-05,119.27084225050906
-2021-08-06,120.93990434254371
-2021-08-09,123.37713689565655
-2021-08-10,124.42964398526404
-2021-08-11,124.41172371189504
-2021-08-12,127.13257134687157
-2021-08-13,128.7958670441943
-2021-08-16,129.243561902145
-2021-08-17,130.314568048835
-2021-08-18,130.30692717835814
-2021-08-19,130.69018505906976
-2021-08-20,132.78453105863207
-2021-08-23,133.53440858527335
-2021-08-24,131.34975210977385
-2021-08-25,131.1176931888569
-2021-08-26,130.17493206600352
-2021-08-27,130.89519170439863
-2021-08-30,131.42630872248228
-2021-08-31,131.56771000848107
-2021-09-01,130.9179764122107
-2021-09-02,129.8517846795634
-2021-09-03,130.4460434881794
-2021-09-06,129.0320080994763
-2021-09-07,130.5589204649636
-2021-09-08,130.71681292042388
-2021-09-09,130.27376241393816
-2021-09-10,129.2423075454972
-2021-09-13,128.18654187246847
-2021-09-14,127.10758756715033
-2021-09-15,127.4665482486969
-2021-09-16,126.79166558576891
-2021-09-17,129.39058635411632
-2021-09-20,128.23769787400946
-2021-09-21,129.7395113249166
-2021-09-22,129.6042088263965
-2021-09-23,127.65433652783338
-2021-09-24,128.47536500112628
-2021-09-27,128.74445511020804
-2021-09-28,129.9904741028447
-2021-09-29,131.21267279154895
-2021-09-30,133.2122868513819
-2021-10-01,133.2518055229709
-2021-10-04,133.9212964012735
-2021-10-05,133.98650520346098
-2021-10-06,135.3928927365497
-2021-10-07,138.27886923527132
-2021-10-08,137.73371581342596
-2021-10-11,137.88175215634504
-2021-10-12,139.72305688531213
-2021-10-13,139.3376575539446
-2021-10-14,139.66745930332883
-2021-10-15,140.64236799369547
-2021-10-18,142.86308490060298
-2021-10-19,144.8225709650348
-2021-10-20,146.19698759289906
-2021-10-21,148.73051182297706
-2021-10-22,147.13370997805652
-2021-10-25,145.31995815652186
-2021-10-26,143.70572750971567
-2021-10-27,144.2904217850907
-2021-10-28,143.5624971194626
-2021-10-29,141.48939660309537
-2021-11-01,141.8292760761498
-2021-11-02,140.26657284870538
-2021-11-03,139.0405577830699
-2021-11-04,137.83263139000687
-2021-11-05,136.68074053796536
-2021-11-08,134.67820244424445
-2021-11-09,136.01997470082424
-2021-11-10,136.03168164983353
-2021-11-11,134.3072934602167
-2021-11-12,136.33708527853153
-2021-11-15,137.67165339614854
-2021-11-16,138.1011740610324
-2021-11-17,140.0821501246444
-2021-11-18,140.01946008570454
-2021-11-19,138.6686656126261
-2021-11-22,139.12977261948808
-2021-11-23,138.65862565170715
-2021-11-24,137.34777714352714
-2021-11-25,137.6827265476837
-2021-11-26,138.8374887884231
-2021-11-29,140.07625230856448
-2021-11-30,141.64885879424276
-2021-12-01,140.13392774336606
-2021-12-02,142.14247390644599
-2021-12-03,142.12049041900332
-2021-12-06,143.5022856757484
-2021-12-07,144.44429583647965
-2021-12-08,143.77029514207365
-2021-12-09,143.2690102167239
-2021-12-10,145.06866566838747
-2021-12-13,146.62988025591144
-2021-12-14,147.95991285009094
-2021-12-15,149.74143520031055
-2021-12-16,151.08858499668625
-2021-12-17,150.4270874570294
-2021-12-20,151.34835155582863
-2021-12-21,151.81428959866443
-2021-12-22,153.7786716261007
-2021-12-23,153.65163790076963
-2021-12-24,154.75245304237853
-2021-12-27,154.9515474491684
-2021-12-28,159.8549170922545
-2021-12-29,159.2007464469846
-2021-12-30,161.1200899155655
-2021-12-31,158.99211792655052
-2022-01-03,158.81592136987916
-2022-01-04,158.11621191829818
-2022-01-05,156.38229707337658
-2022-01-06,158.86551424755498
-2022-01-07,160.19950727978824
-2022-01-10,157.28432062701538
-2022-01-11,159.6083284257281
-2022-01-12,159.59819939777105
-2022-01-13,159.3746738378807
-2022-01-14,160.64615632074114
-2022-01-17,161.37935328011739
-2022-01-18,165.31151685621435
-2022-01-19,165.84965437995552
-2022-01-20,164.14786563562015
-2022-01-21,163.3103787261028
-2022-01-24,165.2672995312545
-2022-01-25,166.35742325062137
-2022-01-26,164.99943906937028
-2022-01-27,167.83231635309664
-2022-01-28,167.84043759747897
-2022-01-31,169.2909919904233
-2022-02-01,173.0362612303292
-2022-02-02,174.32071958423472
-2022-02-03,173.34117863355226
-2022-02-04,173.85056826633138
-2022-02-07,173.96180569473188
-2022-02-08,175.94626257551414
-2022-02-09,175.72751051112118
-2022-02-10,177.72156459252196
-2022-02-11,179.48912531096113
-2022-02-14,182.45011698381361
-2022-02-15,184.10263294573227
-2022-02-16,182.06835610781187
-2022-02-17,182.9754413201202
-2022-02-18,184.00837886978516
-2022-02-21,181.95737477122867
-2022-02-22,183.43003274749267
-2022-02-23,184.63504273348735
-2022-02-24,186.76242773214312
-2022-02-25,187.15916674670675
-2022-02-28,186.8080005755995
-2022-03-01,185.39214669477138
-2022-03-02,185.31917197236584
-2022-03-03,188.08622316729543
-2022-03-04,186.67033015661386
-2022-03-07,185.53705481486102
-2022-03-08,183.21144722096244
-2022-03-09,186.1417944296348
-2022-03-10,185.81301058385327
-2022-03-11,184.24074125656801
-2022-03-14,183.9229673664176
-2022-03-15,184.43616404142233
-2022-03-16,183.79739764900205
-2022-03-17,182.46987104539326
-2022-03-18,183.9489588511815
-2022-03-21,183.8845624902127
-2022-03-22,184.16310619887147
-2022-03-23,183.62958885901327
-2022-03-24,180.93198866075522
-2022-03-25,183.16221074653217
-2022-03-28,183.12814012060423
-2022-03-29,184.12756949048182
-2022-03-30,182.830284670905
-2022-03-31,181.0475648799499
-2022-04-01,179.0985721974346
-2022-04-04,179.4762445538653
-2022-04-05,182.05725458900338
-2022-04-06,183.69428514809778
-2022-04-07,185.43545976381952
-2022-04-08,186.31415821495116
-2022-04-11,186.349598977634
-2022-04-12,184.6951866057011
-2022-04-13,184.9112224580043
-2022-04-14,186.85720071514308
-2022-04-15,186.5150636274145
-2022-04-18,184.0013671688719
-2022-04-19,183.22119140891155
-2022-04-20,180.89168022941516
-2022-04-21,181.49778760000828
-2022-04-22,183.51413057252051
-2022-04-25,183.56084798874787
-2022-04-26,181.56200149904475
-2022-04-27,181.96541417158653
-2022-04-28,180.61106280843848
-2022-04-29,179.8050174260012
-2022-05-02,178.17842407204353
-2022-05-03,176.3530719056853
-2022-05-04,179.38379146454741
-2022-05-05,179.0038512692933
-2022-05-06,178.31455055897578
-2022-05-09,179.30810193029086
-2022-05-10,178.36921694847953
-2022-05-11,180.83385388040523
-2022-05-12,180.23708917299183
-2022-05-13,180.7340599928502
-2022-05-16,181.56786413326586
-2022-05-17,177.35540133164906
-2022-05-18,174.87105963479013
-2022-05-19,174.90906792094364
-2022-05-20,173.74643847462914
-2022-05-23,172.88714199626858
-2022-05-24,174.5664369991185
-2022-05-25,174.6928178065059
-2022-05-26,174.05066162384247
-2022-05-27,174.2116679325527
-2022-05-30,176.37889054283085
-2022-05-31,176.47856868570588
-2022-06-01,174.09229238082372
-2022-06-02,172.40012324155524
-2022-06-03,174.50565113850527
-2022-06-06,174.366094057243
-2022-06-07,174.49210217163363
-2022-06-08,174.90038874549148
-2022-06-09,173.9236029518884
-2022-06-10,173.05774071050277
-2022-06-13,173.09068689819102
-2022-06-14,172.07364223925927
-2022-06-15,173.784451218063
-2022-06-16,175.15653004360462
-2022-06-17,174.9698412771693
-2022-06-20,174.3686476460181
-2022-06-21,175.0226464692796
-2022-06-22,176.79215747894534
-2022-06-23,175.4311580647934
-2022-06-24,171.79995980405977
-2022-06-27,171.45915511728157
-2022-06-28,172.64690714409667
-2022-06-29,173.53854563500676
-2022-06-30,172.60981102336527
-2022-07-01,174.14763456896873
-2022-07-04,173.64910010627236
-2022-07-05,175.41015228773728
-2022-07-06,177.39399191817654
-2022-07-07,175.83519716160004
-2022-07-08,176.5996329036696
-2022-07-11,178.66313731575636
-2022-07-12,175.4721169640538
-2022-07-13,173.34529344223154
-2022-07-14,176.1434925362978
-2022-07-15,176.09295654485638
-2022-07-18,177.9578953976064
-2022-07-19,180.34166457631486
-2022-07-20,180.52263434757566
-2022-07-21,182.45894689934755
-2022-07-22,179.95826622515435
-2022-07-25,179.80881211698275
-2022-07-26,181.2910718479497
-2022-07-27,182.378695977059
-2022-07-28,180.84344329595197
-2022-07-29,179.0400365941173
-2022-08-01,182.5058884293554
-2022-08-02,184.03424724305236
-2022-08-03,183.38969089840745
-2022-08-04,182.61277134606993
-2022-08-05,179.40753996211657
-2022-08-08,180.52094189084272
-2022-08-09,179.42182098973754
-2022-08-10,177.66694936100592
-2022-08-11,175.6931955615347
-2022-08-12,177.8507455830907
-2022-08-15,184.1859121957383
-2022-08-16,183.86127363269907
-2022-08-17,185.02694195228707
-2022-08-18,185.97467354970206
-2022-08-19,183.97069473336333
-2022-08-22,183.24960740109978
-2022-08-23,184.70816477316203
-2022-08-24,183.69216485239534
-2022-08-25,183.7320791915035
-2022-08-26,183.60803023985468
-2022-08-29,183.7033854224083
-2022-08-30,184.7211364433535
-2022-08-31,184.50539162349799
-2022-09-01,184.99582132566803
-2022-09-02,184.97130992332012
-2022-09-05,187.10419154971632
-2022-09-06,189.03232079906977
-2022-09-07,190.6272160451858
-2022-09-08,188.61621773872483
-2022-09-09,189.20727342066888
-2022-09-12,188.9445968133091
-2022-09-13,190.81195875240917
-2022-09-14,193.17920295608212
-2022-09-15,192.78385659650397
-2022-09-16,194.60037529329378
-2022-09-19,192.65429456712272
-2022-09-20,192.22330222309907
-2022-09-21,192.20061513938995
-2022-09-22,193.13041030614298
-2022-09-23,188.5256509096753
-2022-09-26,188.8850606986893
-2022-09-27,187.3738802677684
-2022-09-28,186.1395354554199
-2022-09-29,186.85527763157418
-2022-09-30,189.10419957521412
-2022-10-03,191.0269793991275
-2022-10-04,189.1331492012651
-2022-10-05,191.04670158604046
-2022-10-06,190.56348417020038
-2022-10-07,189.6732851002448
-2022-10-10,191.55888078817955
-2022-10-11,190.99318748349734
-2022-10-12,193.98002901494834
-2022-10-13,194.72171657802693
-2022-10-14,195.178714086525
-2022-10-17,193.81816193113087
-2022-10-18,196.1790187955128
-2022-10-19,199.78893038035324
-2022-10-20,198.46918763798556
-2022-10-21,195.67856673311104
-2022-10-24,196.9528197515824
-2022-10-25,194.11150733864554
-2022-10-26,189.21022809575342
-2022-10-27,187.3841744467867
-2022-10-28,184.6848559238856
-2022-10-31,183.6859297254932
-2022-11-01,187.20185044905156
-2022-11-02,190.06719489595858
-2022-11-03,188.67288825335592
-2022-11-04,186.58428353745188
-2022-11-07,187.1708341682027
-2022-11-08,185.03707527418004
-2022-11-09,186.65641644148653
-2022-11-10,187.94059518931388
-2022-11-11,188.8657212111467
-2022-11-14,187.9141596525209
-2022-11-15,186.59760171883298
-2022-11-16,186.33184829862
-2022-11-17,185.20206017936923
-2022-11-18,187.10391675587033
-2022-11-21,191.38578062421303
-2022-11-22,191.98484721969515
-2022-11-23,192.8369047649446
-2022-11-24,192.7841076975567
-2022-11-25,191.82755410191814
-2022-11-28,191.3776806281394
-2022-11-29,191.90821058066808
-2022-11-30,189.43143267985812
-2022-12-01,187.67609302599112
-2022-12-02,185.08797754125206
-2022-12-05,183.61848411539103
-2022-12-06,181.91965480460536
-2022-12-07,181.15791758064142
-2022-12-08,180.9360107168567
-2022-12-09,183.44984063523944
-2022-12-12,184.22790807444798
-2022-12-13,184.68321353898867
-2022-12-14,182.6441778787343
-2022-12-15,181.41502029424456
-2022-12-16,179.35285583592298
-2022-12-19,181.49020026746882
-2022-12-20,181.01809304808353
-2022-12-21,180.90349572222635
-2022-12-22,181.0765910747008
-2022-12-23,181.28118957564126
-2022-12-26,184.07188249813314
-2022-12-27,184.73712745236998
-2022-12-28,185.64726367624743
-2022-12-29,187.4738980891586
-2022-12-30,185.60928614554504
-2023-01-02,186.09872819273735
-2023-01-03,186.59338769818044
-2023-01-04,185.20247736286356
-2023-01-05,185.99851113750842
-2023-01-06,187.36920933380065
-2023-01-09,186.38500391952104
-2023-01-10,188.24015064747533
-2023-01-11,189.49906153256492
-2023-01-12,193.51915839364443
-2023-01-13,192.51803619100002
-2023-01-16,193.37519920944985
-2023-01-17,190.62328201432342
-2023-01-18,187.0995208599165
-2023-01-19,190.65133235148573
-2023-01-20,189.78444462385363
-2023-01-23,191.4725053543529
-2023-01-24,190.90369910024796
-2023-01-25,191.1236545235688
-2023-01-26,186.2802727194917
-2023-01-27,186.63667832264045
-2023-01-30,186.10932823737494
-2023-01-31,185.51561122454322
-2023-02-01,183.685578927406
-2023-02-02,181.3722193638272
-2023-02-03,183.59299115728209
-2023-02-06,183.29349235298292
-2023-02-07,180.58374220576752
-2023-02-08,180.74373792259436
-2023-02-09,183.51997975371714
-2023-02-10,182.9198960423718
-2023-02-13,180.65871004965194
-2023-02-14,181.78026515743096
-2023-02-15,182.1023329014378
-2023-02-16,182.0191599162744
-2023-02-17,183.60361311627068
-2023-02-20,183.1867265918316
-2023-02-21,184.14910209288558
-2023-02-22,184.75306693537138
-2023-02-23,187.11550249796431
-2023-02-24,184.77654438770332
-2023-02-27,182.51478408673626
-2023-02-28,183.78438960636677
-2023-03-01,181.75561194065034
-2023-03-02,177.6806898937575
-2023-03-03,177.3419319160619
-2023-03-06,175.04303128348488
-2023-03-07,172.75063205544774
-2023-03-08,175.44086129908587
-2023-03-09,177.0679533676764
-2023-03-10,174.2087032138339
-2023-03-13,175.6308924954282
-2023-03-14,177.12986072644125
-2023-03-15,176.97368831631985
-2023-03-16,174.88543070517892
-2023-03-17,174.66399283237416
-2023-03-20,173.04506203907368
-2023-03-21,173.56979344167723
-2023-03-22,171.83650540886987
-2023-03-23,170.93622221433546
-2023-03-24,171.38490933760713
-2023-03-27,171.54599601503662
-2023-03-28,171.49217127609975
-2023-03-29,172.5256006647191
-2023-03-30,173.4793671129438
-2023-03-31,174.81869024884065
-2023-04-03,175.8735744574504
-2023-04-04,176.66952752652503
-2023-04-05,172.2934611229302
-2023-04-06,172.3394748941266
-2023-04-07,172.70275212508918
-2023-04-10,175.99892968716037
-2023-04-11,176.22469911241808
-2023-04-12,173.6605081265277
-2023-04-13,174.289768301988
-2023-04-14,178.02777084414623
-2023-04-17,177.48990340871725
-2023-04-18,176.3843740413107
-2023-04-19,175.7308283170942
-2023-04-20,176.35407950553414
-2023-04-21,175.24457570255464
-2023-04-24,171.91189844925566
-2023-04-25,170.7119665517016
-2023-04-26,170.15896105736294
-2023-04-27,170.81728367092293
-2023-04-28,174.6471191812896
-2023-05-01,172.0404090265938
-2023-05-02,173.2373382774029
-2023-05-03,173.17347604724432
-2023-05-04,173.54076607348253
-2023-05-05,172.94776771203163
-2023-05-08,172.03274633055622
-2023-05-09,172.28222135727924
-2023-05-10,170.8424219898911
-2023-05-11,172.55978778180017
-2023-05-12,174.48686090075483
-2023-05-15,175.23930199352804
-2023-05-16,173.84837044049394
-2023-05-17,175.39846525804884
-2023-05-18,176.4328057920585
-2023-05-19,175.63857022334636
-2023-05-22,175.54075505996798
-2023-05-23,178.74495261482184
-2023-05-24,175.929344242635
-2023-05-25,181.17154485143277
-2023-05-26,177.85657554690445
-2023-05-29,178.73008865810465
-2023-05-30,178.02036723993183
-2023-05-31,178.09622703227
-2023-06-01,176.69880166989947
-2023-06-02,179.4142601410467
-2023-06-05,184.95091577335958
-2023-06-06,184.3853459138249
-2023-06-07,186.68842120529558
-2023-06-08,188.41187344720126
-2023-06-09,188.71085034483028
-2023-06-12,191.76170495041674
-2023-06-13,188.08858340531293
-2023-06-14,188.02709423638
-2023-06-15,186.35054878487927
-2023-06-16,186.04348214524245
-2023-06-19,184.36222863855448
-2023-06-20,184.46918689583623
-2023-06-21,185.06567181273883
-2023-06-22,181.99420495375193
-2023-06-23,183.66798376800165
-2023-06-26,186.30226086350095
-2023-06-27,188.8078925538689
-2023-06-28,189.61097779265913
-2023-06-29,190.70761726530182
-2023-06-30,189.9505789987774
-2023-07-03,190.18680276788743
-2023-07-04,189.25160492480052
-2023-07-05,189.90480166860257
-2023-07-06,188.07957779523696
-2023-07-07,186.48046141913733
-2023-07-10,186.37435506682962
-2023-07-11,186.89855422732649
-2023-07-12,184.51980273198956
-2023-07-13,184.5390410967608
-2023-07-14,184.16137990339564
-2023-07-17,185.08088970767486
-2023-07-18,187.30122261092268
-2023-07-19,186.41035992506934
-2023-07-20,184.2043663642878
-2023-07-21,180.76985396530773
-2023-07-24,181.11643258658245
-2023-07-25,183.43402676331198
-2023-07-26,183.76535021363975
-2023-07-27,182.65142576574974
-2023-07-28,184.3735122284462
-2023-07-31,185.46080587893164
-2023-08-01,185.6612723684105
-2023-08-02,185.7287728519883
-2023-08-03,184.0683640292839
-2023-08-04,184.42982670735412
-2023-08-07,186.01565085510006
-2023-08-08,184.11037468747696
-2023-08-09,186.88298163317174
-2023-08-10,186.46436343191166
-2023-08-11,189.5963155253309
-2023-08-14,191.55852305836615
-2023-08-15,186.3016063745689
-2023-08-16,190.90796758094498
-2023-08-17,189.14663512008775
-2023-08-18,190.34758440345828
-2023-08-21,191.51095724875836
-2023-08-22,189.7519553350147
-2023-08-23,190.09222947282876
-2023-08-24,192.46349522272084
-2023-08-25,193.1642463655746
-2023-08-28,190.12987942133208
-2023-08-29,190.0994584388733
-2023-08-30,187.91993444992517
-2023-08-31,187.90223482783756
-2023-09-01,188.2623208518311
-2023-09-04,188.0983797608217
-2023-09-05,184.339278249868
-2023-09-06,187.74644524845627
-2023-09-07,185.218991153022
-2023-09-08,189.17515381417493
-2023-09-11,188.94134617757138
-2023-09-12,188.77895266612848
-2023-09-13,186.05452249244848
-2023-09-14,186.71908106569126
-2023-09-15,180.25524900550784
-2023-09-18,180.6349812493157
-2023-09-19,180.1298300795995
-2023-09-20,180.52779292472934
-2023-09-21,179.11256730446442
-2023-09-22,173.6585149140688
-2023-09-25,172.14267167272254
-2023-09-26,173.21180691946253
-2023-09-27,172.80526816693447
-2023-09-28,173.1333447679249
-2023-09-29,173.32145007386768
-2023-10-02,175.8738348116072
-2023-10-03,176.26424674293054
-2023-10-04,177.80887601666402
-2023-10-05,178.9524581096299
-2023-10-06,180.80089768811322
-2023-10-09,181.26206745455445
-2023-10-10,179.02339137141374
-2023-10-11,181.23078735971703
-2023-10-12,178.2730202636627
-2023-10-13,177.70873598843266
-2023-10-16,179.95324850796487
-2023-10-17,181.5908215617823
-2023-10-18,182.30521846449918
-2023-10-19,183.46018507602122
-2023-10-20,184.31559234082957
-2023-10-23,185.14459091336803
-2023-10-24,187.5086172270963
-2023-10-25,186.9369894183306
-2023-10-26,189.50764942400474
-2023-10-27,186.66447742061771
-2023-10-30,186.25129798947611
-2023-10-31,187.90408659491803
+2020-01-01,100.04928216116915
+2020-01-02,99.43338274457996
+2020-01-03,99.00769674949291
+2020-01-06,98.01319211411241
+2020-01-07,96.22152829230674
+2020-01-08,95.40738467576404
+2020-01-09,95.63741192273196
+2020-01-10,95.92631047180063
+2020-01-13,95.40216502822742
+2020-01-14,94.98687343123018
+2020-01-15,95.09342478016177
+2020-01-16,93.67238701717456
+2020-01-17,92.16228879276849
+2020-01-20,92.49727762198562
+2020-01-21,93.16927495129373
+2020-01-22,93.54486146800703
+2020-01-23,93.82142759557004
+2020-01-24,93.3265377392572
+2020-01-27,93.88048326991742
+2020-01-28,93.25463516949857
+2020-01-29,92.36209774625237
+2020-01-30,93.77366399275992
+2020-01-31,93.72715636240217
+2020-02-03,94.15381303829798
+2020-02-04,93.69384356101287
+2020-02-05,92.7474071262368
+2020-02-06,91.65209582965464
+2020-02-07,92.08437481908142
+2020-02-10,91.90817101317052
+2020-02-11,92.39914463319289
+2020-02-12,91.98099363174083
+2020-02-13,92.4790824051198
+2020-02-14,94.1023691977374
+2020-02-17,92.17898703578314
+2020-02-18,92.83603090789757
+2020-02-19,93.96190375901357
+2020-02-20,92.88724863409603
+2020-02-21,92.06074128174583
+2020-02-24,91.18697031061507
+2020-02-25,91.29727998862644
+2020-02-26,90.9922585124584
+2020-02-27,90.45173890147557
+2020-02-28,90.46821972408614
+2020-03-02,89.58453686722915
+2020-03-03,91.57546851286608
+2020-03-04,92.43012460391631
+2020-03-05,94.53021008349334
+2020-03-06,93.9980711245277
+2020-03-09,91.52176846136864
+2020-03-10,91.55569130903416
+2020-03-11,91.38449689435086
+2020-03-12,90.89987190527133
+2020-03-13,89.25483763155623
+2020-03-16,88.80995565914202
+2020-03-17,88.42159566407034
+2020-03-18,90.47451487678364
+2020-03-19,92.3079872475235
+2020-03-20,91.03990658356264
+2020-03-23,90.85796969103743
+2020-03-24,90.53958275899183
+2020-03-25,88.77613444026758
+2020-03-26,86.82210744880805
+2020-03-27,86.56213392726751
+2020-03-30,85.06833176630558
+2020-03-31,84.48947738809399
+2020-04-01,85.934261791323
+2020-04-02,85.73517245174034
+2020-04-03,86.48114701119457
+2020-04-06,86.18570334871785
+2020-04-07,85.77190024519919
+2020-04-08,85.78160745837569
+2020-04-09,85.4250205913837
+2020-04-10,85.9184470658677
+2020-04-13,85.22083147283293
+2020-04-14,84.3692835677096
+2020-04-15,84.15800569150306
+2020-04-16,84.74209800885205
+2020-04-17,84.90644019284514
+2020-04-20,84.18424968696928
+2020-04-21,84.24514166436421
+2020-04-22,85.35066243293848
+2020-04-23,85.66818274465103
+2020-04-24,85.76594683223946
+2020-04-27,85.6058102857214
+2020-04-28,85.96447957438404
+2020-04-29,85.8618452183039
+2020-04-30,85.81752325312448
+2020-05-01,85.88435464353876
+2020-05-04,86.01915490178409
+2020-05-05,86.25081967790817
+2020-05-06,86.05641521815409
+2020-05-07,86.02326903811515
+2020-05-08,84.62772936306843
+2020-05-11,85.44434281550886
+2020-05-12,83.94813340974254
+2020-05-13,83.76677293317441
+2020-05-14,83.28842230187294
+2020-05-15,83.99047151846109
+2020-05-18,82.37684357461336
+2020-05-19,82.49033717957559
+2020-05-20,82.95849135502937
+2020-05-21,82.18089419024632
+2020-05-22,82.6549448041514
+2020-05-25,82.18623866484451
+2020-05-26,81.40185528811146
+2020-05-27,80.24512121878884
+2020-05-28,79.70432868012003
+2020-05-29,80.59252020595447
+2020-06-01,80.10848764948996
+2020-06-02,80.40514341314253
+2020-06-03,80.89962176049858
+2020-06-04,81.63829973116128
+2020-06-05,82.3156660479044
+2020-06-08,81.22786337304471
+2020-06-09,79.96254708554
+2020-06-10,78.76721526554248
+2020-06-11,78.25436486810733
+2020-06-12,79.65802812095029
+2020-06-15,79.94971134603115
+2020-06-16,80.30168282861794
+2020-06-17,80.31266556762596
+2020-06-18,79.59415544187306
+2020-06-19,79.6566409061816
+2020-06-22,79.29777389003692
+2020-06-23,80.25565304082217
+2020-06-24,80.56564198666429
+2020-06-25,79.31673309903566
+2020-06-26,79.54583833647793
+2020-06-29,80.07780271838809
+2020-06-30,81.10748598939387
+2020-07-01,79.94340468065384
+2020-07-02,79.26261006452339
+2020-07-03,80.34336467035241
+2020-07-06,78.65087174843042
+2020-07-07,77.5096441222243
+2020-07-08,77.25762269269481
+2020-07-09,78.28423316677686
+2020-07-10,78.99374243451514
+2020-07-13,79.84270850242716
+2020-07-14,78.70336779933888
+2020-07-15,80.036671707023
+2020-07-16,78.86764667001155
+2020-07-17,78.94888978810994
+2020-07-20,79.61532790716332
+2020-07-21,79.39323118098704
+2020-07-22,80.02123451031787
+2020-07-23,79.37713704109676
+2020-07-24,79.20364607490261
+2020-07-27,78.44149262229041
+2020-07-28,78.03716749273335
+2020-07-29,78.29980946468865
+2020-07-30,79.58918416763788
+2020-07-31,79.83997597531372
+2020-08-03,79.3385939026042
+2020-08-04,78.22110988367756
+2020-08-05,78.34537968221682
+2020-08-06,79.21467665117142
+2020-08-07,78.16963308088259
+2020-08-10,78.19749870185568
+2020-08-11,78.1777110068549
+2020-08-12,78.0663892401962
+2020-08-13,76.60497777159213
+2020-08-14,75.74366942414773
+2020-08-17,76.16163064878384
+2020-08-18,75.71707966188723
+2020-08-19,75.35186610254966
+2020-08-20,75.5389196552171
+2020-08-21,75.36554563603325
+2020-08-24,74.64476578053082
+2020-08-25,72.97586380449162
+2020-08-26,73.5279956313633
+2020-08-27,72.46066541803695
+2020-08-28,72.51340437058207
+2020-08-31,72.18561438423414
+2020-09-01,72.35604418371464
+2020-09-02,72.17651755849964
+2020-09-03,72.02424368459634
+2020-09-04,70.69649727108728
+2020-09-07,70.68835707723163
+2020-09-08,70.85430013091467
+2020-09-09,71.37878015210538
+2020-09-10,71.21451226854872
+2020-09-11,70.95853483315877
+2020-09-14,71.15104474946043
+2020-09-15,70.76761988938439
+2020-09-16,70.52795068013656
+2020-09-17,69.42192597678772
+2020-09-18,68.9447319706892
+2020-09-21,67.80514190930977
+2020-09-22,67.9792919493329
+2020-09-23,69.60732534594362
+2020-09-24,68.99860136609497
+2020-09-25,67.91022875350542
+2020-09-28,67.97329097617887
+2020-09-29,68.30633083145246
+2020-09-30,68.7322572463676
+2020-10-01,68.19681109620926
+2020-10-02,67.12462362451367
+2020-10-05,67.13993491284275
+2020-10-06,66.3355720443312
+2020-10-07,65.42140570418493
+2020-10-08,65.43443888919235
+2020-10-09,64.54102413062827
+2020-10-12,64.20828856014458
+2020-10-13,63.55618271643595
+2020-10-14,63.98970608309972
+2020-10-15,64.61362717269662
+2020-10-16,64.59837942849937
+2020-10-19,64.20067835842607
+2020-10-20,64.63320960161528
+2020-10-21,65.00164204090237
+2020-10-22,64.48840258688116
+2020-10-23,64.87191177348406
+2020-10-26,65.22941990407325
+2020-10-27,64.51816430932631
+2020-10-28,64.6110632845057
+2020-10-29,65.11926701612542
+2020-10-30,65.78455214486378
+2020-11-02,67.29802588652717
+2020-11-03,67.8837201187054
+2020-11-04,67.59780241512424
+2020-11-05,67.77492746488912
+2020-11-06,67.25536819454385
+2020-11-09,67.17197418925758
+2020-11-10,66.80086878001383
+2020-11-11,66.081655025531
+2020-11-12,65.46329400016783
+2020-11-13,65.3732816298415
+2020-11-16,65.2777101262571
+2020-11-17,65.68521010385159
+2020-11-18,65.69326540186687
+2020-11-19,65.48253475396649
+2020-11-20,64.5626148597085
+2020-11-23,64.78164330690078
+2020-11-24,64.60746642396965
+2020-11-25,64.91615600899834
+2020-11-26,65.19455292417753
+2020-11-27,66.33589660933949
+2020-11-30,66.55517451911452
+2020-12-01,66.85592806036964
+2020-12-02,67.60977556018729
+2020-12-03,66.70334255299984
+2020-12-04,66.62869642593202
+2020-12-07,65.93490539259707
+2020-12-08,65.23262709179207
+2020-12-09,65.31431973547654
+2020-12-10,65.27732086241099
+2020-12-11,65.53106183970797
+2020-12-14,67.74273101854104
+2020-12-15,66.85806078837031
+2020-12-16,66.11427651400966
+2020-12-17,67.12913720348013
+2020-12-18,67.84498567690763
+2020-12-21,67.90757228167946
+2020-12-22,68.42085914792808
+2020-12-23,69.34509793252181
+2020-12-24,69.79688336007797
+2020-12-25,70.60519264262751
+2020-12-28,71.15560947919779
+2020-12-29,71.6358564312904
+2020-12-30,72.73140140697136
+2020-12-31,74.00344068636312
+2021-01-01,73.98134413608247
+2021-01-04,73.62527541768249
+2021-01-05,72.77551009501038
+2021-01-06,72.12283844791189
+2021-01-07,72.40954804216632
+2021-01-08,71.08862018977243
+2021-01-11,71.76273337103373
+2021-01-12,71.270471290369
+2021-01-13,71.76248426823179
+2021-01-14,71.00141557993447
+2021-01-15,70.41589625025614
+2021-01-18,71.00464808185343
+2021-01-19,70.14672700814886
+2021-01-20,68.70841935056382
+2021-01-21,68.48045612769722
+2021-01-22,68.45433406734097
+2021-01-25,69.388520981402
+2021-01-26,69.04290950957542
+2021-01-27,70.67278963886952
+2021-01-28,71.45937120285659
+2021-01-29,71.05349667750221
+2021-02-01,70.88058982285546
+2021-02-02,70.05842983804392
+2021-02-03,70.3890241190702
+2021-02-04,70.22937646580232
+2021-02-05,71.50415294905008
+2021-02-08,72.12594269544262
+2021-02-09,71.8476807776531
+2021-02-10,71.60086304239847
+2021-02-11,71.00330530359955
+2021-02-12,71.58147949571475
+2021-02-15,69.53320473151385
+2021-02-16,71.06306788380198
+2021-02-17,71.08724269617402
+2021-02-18,70.94783240519858
+2021-02-19,70.7976458312815
+2021-02-22,70.45764818994262
+2021-02-23,70.05972735148293
+2021-02-24,70.28382279351968
+2021-02-25,70.11545642255433
+2021-02-26,70.01336851807314
+2021-03-01,70.43764664100208
+2021-03-02,70.66986859212756
+2021-03-03,70.91805513039427
+2021-03-04,71.88088636737669
+2021-03-05,73.49087056738472
+2021-03-08,73.91159488727114
+2021-03-09,72.95943332624888
+2021-03-10,73.07908371159351
+2021-03-11,73.36268422501819
+2021-03-12,72.77733657102053
+2021-03-15,73.10531407369538
+2021-03-16,73.81727718261791
+2021-03-17,72.9002774886555
+2021-03-18,72.6297944724674
+2021-03-19,72.66054586069185
+2021-03-22,71.84424103965395
+2021-03-23,73.08211478397708
+2021-03-24,73.80072839404868
+2021-03-25,73.17753938340284
+2021-03-26,74.11793896312079
+2021-03-29,74.64552949040382
+2021-03-30,74.5564991047351
+2021-03-31,75.2575134570725
+2021-04-01,74.427015787811
+2021-04-02,73.84613377725756
+2021-04-05,74.3198687152097
+2021-04-06,74.37437924285852
+2021-04-07,73.74864849758032
+2021-04-08,74.14144844903115
+2021-04-09,74.59164460139169
+2021-04-12,73.78589160026877
+2021-04-13,73.27727522044464
+2021-04-14,74.08168759849629
+2021-04-15,74.3337263174966
+2021-04-16,74.38165880824488
+2021-04-19,74.0423722062148
+2021-04-20,73.3764567204095
+2021-04-21,73.47120062874123
+2021-04-22,73.561156384192
+2021-04-23,72.89393320233403
+2021-04-26,73.98636716628585
+2021-04-27,74.59859920744336
+2021-04-28,73.34713069816921
+2021-04-29,73.34110914692693
+2021-04-30,72.81299809981192
+2021-05-03,72.29741761492996
+2021-05-04,71.4642763663346
+2021-05-05,71.7488551430486
+2021-05-06,71.75509674117916
+2021-05-07,72.36894172768625
+2021-05-10,72.53262810623895
+2021-05-11,71.49540108815783
+2021-05-12,71.8163997191772
+2021-05-13,72.17763099264886
+2021-05-14,73.83547019952834
+2021-05-17,73.06137138935553
+2021-05-18,71.83384273310315
+2021-05-19,70.79377995597184
+2021-05-20,70.96079895019797
+2021-05-21,70.66873259462041
+2021-05-24,70.30685899058268
+2021-05-25,70.57174626615772
+2021-05-26,71.14287929967782
+2021-05-27,71.50719564726742
+2021-05-28,70.67165653078513
+2021-05-31,69.3019087028247
+2021-06-01,69.84013601373724
+2021-06-02,68.33812492279579
+2021-06-03,68.61483891484397
+2021-06-04,67.96976485048873
+2021-06-07,68.97698057436637
+2021-06-08,68.60548300264796
+2021-06-09,68.4071936258462
+2021-06-10,69.93528675701506
+2021-06-11,69.95972419480401
+2021-06-14,70.1705326418995
+2021-06-15,70.58265995751901
+2021-06-16,68.8887579524584
+2021-06-17,69.45498393320237
+2021-06-18,69.76441292978735
+2021-06-21,69.26958997108939
+2021-06-22,68.09315621071151
+2021-06-23,67.8288641808786
+2021-06-24,66.95861552452945
+2021-06-25,67.15236148063323
+2021-06-28,66.33516841345234
+2021-06-29,66.0364373341105
+2021-06-30,65.98891217724943
+2021-07-01,67.07989640859402
+2021-07-02,66.67262479230634
+2021-07-05,67.75444063308656
+2021-07-06,67.17007003914105
+2021-07-07,67.33841551516284
+2021-07-08,68.4625016917733
+2021-07-09,68.35104987063646
+2021-07-12,67.71635386694443
+2021-07-13,67.54940425799948
+2021-07-14,67.02078229586887
+2021-07-15,67.72974912910901
+2021-07-16,66.48259356246473
+2021-07-19,65.93368556585516
+2021-07-20,66.68451951553284
+2021-07-21,67.01866229378051
+2021-07-22,67.55567736466548
+2021-07-23,67.24532710252277
+2021-07-26,67.49803766786563
+2021-07-27,67.67515768556713
+2021-07-28,67.15101619084055
+2021-07-29,67.26015683766978
+2021-07-30,66.48676960050042
+2021-08-02,66.75653932265351
+2021-08-03,67.05439279134947
+2021-08-04,66.5746546945011
+2021-08-05,65.60910400649838
+2021-08-06,66.88497990329381
+2021-08-09,66.1917888751566
+2021-08-10,66.3939392200005
+2021-08-11,66.49039846441451
+2021-08-12,67.29500018744629
+2021-08-13,67.73112003554431
+2021-08-16,67.2542949817345
+2021-08-17,67.283806321551
+2021-08-18,67.28293231201148
+2021-08-19,66.4183833370921
+2021-08-20,65.88063191896651
+2021-08-23,65.68237712108679
+2021-08-24,65.7322762974855
+2021-08-25,66.53864497813245
+2021-08-26,67.05147289959427
+2021-08-27,67.39817292734742
+2021-08-30,66.980908603457
+2021-08-31,67.3801055665454
+2021-09-01,67.07132004927044
+2021-09-02,66.64467348301372
+2021-09-03,66.21619967136306
+2021-09-06,66.3314541702711
+2021-09-07,66.97736988391644
+2021-09-08,68.21956101548005
+2021-09-09,69.01492842090511
+2021-09-10,68.92671783267332
+2021-09-13,68.952321583528
+2021-09-14,68.96770395420413
+2021-09-15,69.24140836699965
+2021-09-16,68.18644801944107
+2021-09-17,68.83835031983708
+2021-09-20,69.60930285590896
+2021-09-21,69.78381252102082
+2021-09-22,70.23165899294386
+2021-09-23,71.30235419292276
+2021-09-24,70.60575180109791
+2021-09-27,70.91085376525605
+2021-09-28,70.49326699493015
+2021-09-29,70.74223747964061
+2021-09-30,71.22642256634978
+2021-10-01,70.84970460239845
+2021-10-04,70.82904933095902
+2021-10-05,70.55810237554596
+2021-10-06,70.14478295019401
+2021-10-07,69.852916879547
+2021-10-08,69.0487392258085
+2021-10-11,69.73168354404389
+2021-10-12,69.05145338970907
+2021-10-13,69.65688310235194
+2021-10-14,68.17802273497637
+2021-10-15,67.2765380078034
+2021-10-18,68.18049318937143
+2021-10-19,68.55978322133839
+2021-10-20,68.63326358328041
+2021-10-21,66.96177564617761
+2021-10-22,66.98012867675851
+2021-10-25,67.50662643442631
+2021-10-26,68.09710855898024
+2021-10-27,67.76243507187978
+2021-10-28,66.62987096821075
+2021-10-29,66.09319432491728
+2021-11-01,65.91266764737374
+2021-11-02,65.07205736654706
+2021-11-03,64.39510335545584
+2021-11-04,65.3532208928511
+2021-11-05,66.51453797913663
+2021-11-08,66.19271941795495
+2021-11-09,66.60031163639685
+2021-11-10,67.39150924185911
+2021-11-11,66.53526714699225
+2021-11-12,67.08211496463034
+2021-11-15,67.45646024342426
+2021-11-16,67.29249413845376
+2021-11-17,66.8755672820086
+2021-11-18,66.80459180443289
+2021-11-19,66.88278694645074
+2021-11-22,66.93051615180488
+2021-11-23,66.46403982887519
+2021-11-24,65.1699413905634
+2021-11-25,65.23203800514355
+2021-11-26,64.58932148804814
+2021-11-29,64.59566293804507
+2021-11-30,64.40181857446547
+2021-12-01,63.80555878437537
+2021-12-02,63.06520102155356
+2021-12-03,63.18145924288727
+2021-12-06,62.493668130387334
+2021-12-07,62.7787823759108
+2021-12-08,61.380113156075964
+2021-12-09,61.02943127688014
+2021-12-10,61.923997198521576
+2021-12-13,62.167530639542
+2021-12-14,62.4005995207617
+2021-12-15,63.76616453561888
+2021-12-16,64.93728906945917
+2021-12-17,65.25820357903218
+2021-12-20,65.27869983902409
+2021-12-21,65.40313389710603
+2021-12-22,66.33060971602089
+2021-12-23,66.68358664715817
+2021-12-24,66.83311470957356
+2021-12-27,66.64269993595244
+2021-12-28,66.63676953424414
+2021-12-29,67.01305584983415
+2021-12-30,66.18847482349489
+2021-12-31,66.93312687800194
+2022-01-03,66.72635228766549
+2022-01-04,66.49880636438482
+2022-01-05,66.75091172213428
+2022-01-06,67.1064533279654
+2022-01-07,67.47675143237394
+2022-01-10,67.68128348108729
+2022-01-11,68.89588500859757
+2022-01-12,70.4549677014407
+2022-01-13,71.54855255213272
+2022-01-14,71.50158938303656
+2022-01-17,71.76950348064052
+2022-01-18,71.23247987456172
+2022-01-19,72.13606464710793
+2022-01-20,72.5213990283868
+2022-01-21,72.55455935593965
+2022-01-24,73.58507197622664
+2022-01-25,73.85096718739258
+2022-01-26,73.2956888947229
+2022-01-27,72.95175511872348
+2022-01-28,72.32207417887857
+2022-01-31,71.4301805599513
+2022-02-01,71.44388511721856
+2022-02-02,71.93225974352532
+2022-02-03,72.67112369128301
+2022-02-04,73.732830031706
+2022-02-07,74.25775747046337
+2022-02-08,75.9821676221506
+2022-02-09,76.06643795735756
+2022-02-10,76.23099953395977
+2022-02-11,76.31167798690902
+2022-02-14,76.83834409125997
+2022-02-15,77.38533303205922
+2022-02-16,77.99427757477893
+2022-02-17,77.01992655698716
+2022-02-18,76.60499601857322
+2022-02-21,77.61918555353702
+2022-02-22,77.69130686764058
+2022-02-23,77.87716417012652
+2022-02-24,78.75010101721035
+2022-02-25,78.88780496203907
+2022-02-28,79.59719076119544
+2022-03-01,78.18202872873478
+2022-03-02,80.28977049817689
+2022-03-03,79.78885062150701
+2022-03-04,79.25837755448234
+2022-03-07,79.19463416380219
+2022-03-08,80.04624773954438
+2022-03-09,80.53879669254643
+2022-03-10,80.62901299920419
+2022-03-11,81.39843007803691
+2022-03-14,82.03159332529172
+2022-03-15,82.34341721602088
+2022-03-16,84.22384494224428
+2022-03-17,83.75755650764573
+2022-03-18,84.86877943586533
+2022-03-21,84.55554861521762
+2022-03-22,85.1066067202394
+2022-03-23,85.09884710709173
+2022-03-24,86.16716681645286
+2022-03-25,85.77200696318786
+2022-03-28,86.89801780455696
+2022-03-29,86.9614801540723
+2022-03-30,86.17813508879682
+2022-03-31,86.2408629530255
+2022-04-01,85.33286912141462
+2022-04-04,84.29009585164745
+2022-04-05,83.56438595060148
+2022-04-06,82.6712808030926
+2022-04-07,82.98943743267124
+2022-04-08,82.24930072255316
+2022-04-11,82.03034642334886
+2022-04-12,80.31313539718819
+2022-04-13,80.55605586185098
+2022-04-14,80.61636963739119
+2022-04-15,79.9574162802246
+2022-04-18,79.11824933523035
+2022-04-19,80.38040278217717
+2022-04-20,80.16483898874573
+2022-04-21,81.07490689196078
+2022-04-22,80.27897539658846
+2022-04-25,81.47337335727845
+2022-04-26,80.87520861196688
+2022-04-27,79.42071677928423
+2022-04-28,80.89747452807211
+2022-04-29,80.81734954910006
+2022-05-02,81.14398207333844
+2022-05-03,82.29233042980572
+2022-05-04,83.30419879725481
+2022-05-05,81.37837858911577
+2022-05-06,81.11847373406323
+2022-05-09,81.12238283498408
+2022-05-10,81.07237857847711
+2022-05-11,81.79823401644826
+2022-05-12,81.399432133783
+2022-05-13,82.52709661289538
+2022-05-16,82.75375656529204
+2022-05-17,83.24829493880853
+2022-05-18,83.77174282413911
+2022-05-19,83.59453630664137
+2022-05-20,84.17074800120609
+2022-05-23,84.44393624827204
+2022-05-24,84.76345690498574
+2022-05-25,83.56785811028638
+2022-05-26,84.04923093514678
+2022-05-27,85.43032968672998
+2022-05-30,84.50123687831272
+2022-05-31,84.03547753069638
+2022-06-01,83.11500377251342
+2022-06-02,81.91836772385389
+2022-06-03,82.69094242812749
+2022-06-06,83.44932221021999
+2022-06-07,84.47080725426387
+2022-06-08,83.74385780324211
+2022-06-09,83.37487505290858
+2022-06-10,85.0589832509042
+2022-06-13,85.2466174222267
+2022-06-14,85.7285595114587
+2022-06-15,85.7595589746538
+2022-06-16,86.60950129532553
+2022-06-17,87.21585501594079
+2022-06-20,88.25286928727508
+2022-06-21,89.14406149537409
+2022-06-22,91.33932936855308
+2022-06-23,92.14662105940293
+2022-06-24,91.05130560953648
+2022-06-27,91.4602953847768
+2022-06-28,91.48668507140661
+2022-06-29,92.228468581953
+2022-06-30,91.54047559635757
+2022-07-01,91.39189450559554
+2022-07-04,91.10208733008925
+2022-07-05,90.10472462758624
+2022-07-06,89.29797475434759
+2022-07-07,90.33094502221877
+2022-07-08,90.99286441307737
+2022-07-11,91.44676597240078
+2022-07-12,90.05239276278901
+2022-07-13,90.44834002562278
+2022-07-14,90.02682975707117
+2022-07-15,89.17955252405551
+2022-07-18,87.7567104919506
+2022-07-19,88.22135407600025
+2022-07-20,87.90224721201156
+2022-07-21,87.80031214773138
+2022-07-22,88.1218837239754
+2022-07-25,86.06517822586585
+2022-07-26,86.5329436476371
+2022-07-27,84.9698653581681
+2022-07-28,84.69840315335905
+2022-07-29,87.3614408638991
+2022-08-01,85.70650916602837
+2022-08-02,85.93040444433187
+2022-08-03,85.82635936045348
+2022-08-04,85.77678529813979
+2022-08-05,85.7270690418913
+2022-08-08,84.96556382375408
+2022-08-09,84.32410448315397
+2022-08-10,84.4874864283229
+2022-08-11,84.70940193848982
+2022-08-12,85.1684887909759
+2022-08-15,86.16395295387403
+2022-08-16,87.32931900385668
+2022-08-17,88.38496220869936
+2022-08-18,87.35143243646742
+2022-08-19,87.8414132220328
+2022-08-22,88.18869438452587
+2022-08-23,87.97325753253922
+2022-08-24,88.36745720434435
+2022-08-25,89.00183862232211
+2022-08-26,88.91640326733268
+2022-08-29,89.68162027403055
+2022-08-30,88.77324002840135
+2022-08-31,88.88452423910158
+2022-09-01,87.90126117417776
+2022-09-02,86.77902637949481
+2022-09-05,86.37915047363387
+2022-09-06,86.10595015652531
+2022-09-07,85.55225473782147
+2022-09-08,86.16592102550797
+2022-09-09,86.42540005851703
+2022-09-12,87.2559514735844
+2022-09-13,87.91269406723666
+2022-09-14,87.57565910378334
+2022-09-15,87.11518676242967
+2022-09-16,86.07935192293775
+2022-09-19,86.62900982931939
+2022-09-20,86.79406515907144
+2022-09-21,86.87370110113373
+2022-09-22,85.51367778466891
+2022-09-23,84.06463465337566
+2022-09-26,83.26464947811971
+2022-09-27,84.59143628934414
+2022-09-28,85.62514047081609
+2022-09-29,84.33948303909126
+2022-09-30,84.69444572559992
+2022-10-03,84.27367871139117
+2022-10-04,84.02810905392487
+2022-10-05,84.41403440324152
+2022-10-06,83.20381831938704
+2022-10-07,83.38154168007732
+2022-10-10,84.09558916190431
+2022-10-11,85.095110427787
+2022-10-12,84.42844805455546
+2022-10-13,84.18870654237287
+2022-10-14,83.18450955202628
+2022-10-17,81.92428473281146
+2022-10-18,81.85440762514146
+2022-10-19,82.50743694807512
+2022-10-20,84.30179096462813
+2022-10-21,84.7517481712978
+2022-10-24,84.83704597902175
+2022-10-25,84.86823883363839
+2022-10-26,86.18787503865371
+2022-10-27,86.54546354989586
+2022-10-28,86.10992234482417
+2022-10-31,84.65724233958922
+2022-11-01,84.57283305601102
+2022-11-02,85.17280818765438
+2022-11-03,84.21275715789298
+2022-11-04,84.14824698398392
+2022-11-07,83.9542942864383
+2022-11-08,83.25773536004634
+2022-11-09,83.40976034767468
+2022-11-10,85.10253314479657
+2022-11-11,86.17404596479369
+2022-11-14,84.97075048656318
+2022-11-15,83.39754636630194
+2022-11-16,82.68888957648912
+2022-11-17,83.58865478774973
+2022-11-18,82.72928584479024
+2022-11-21,84.84402022147596
+2022-11-22,85.83004700170947
+2022-11-23,86.2527426929411
+2022-11-24,86.13681914139248
+2022-11-25,86.21348248197549
+2022-11-28,86.44043420432442
+2022-11-29,87.30035777065159
+2022-11-30,87.46978630945935
+2022-12-01,86.85021859831136
+2022-12-02,86.98003262583384
+2022-12-05,87.31657316100913
+2022-12-06,87.90369144672947
+2022-12-07,88.62720684861934
+2022-12-08,88.76080796228784
+2022-12-09,88.92759898717574
+2022-12-12,89.69088615022592
+2022-12-13,90.86133091324217
+2022-12-14,91.55872762927673
+2022-12-15,91.60663420663843
+2022-12-16,90.6626759178906
+2022-12-19,90.75437276111207
+2022-12-20,92.11413147459831
+2022-12-21,91.52344338117835
+2022-12-22,91.1575576085469
+2022-12-23,91.67859013863297
+2022-12-26,91.94316263617904
+2022-12-27,90.7845061008017
+2022-12-28,90.97632696975698
+2022-12-29,92.12797605397436
+2022-12-30,91.92103682804213
+2023-01-02,93.05298354362964
+2023-01-03,95.90647878529339
+2023-01-04,96.33553196789563
+2023-01-05,96.16111877231407
+2023-01-06,97.21923421087631
+2023-01-09,95.7728159411279
+2023-01-10,94.39465706402768
+2023-01-11,94.1134908985829
+2023-01-12,95.6399253902326
+2023-01-13,96.43093908380125
+2023-01-16,97.72439038872889
+2023-01-17,98.98358731197624
+2023-01-18,99.43282685504067
+2023-01-19,100.37234821422354
+2023-01-20,99.92714959531224
+2023-01-23,101.59501917676262
+2023-01-24,100.38464568259585
+2023-01-25,99.90801323319488
+2023-01-26,98.9225266935796
+2023-01-27,100.05429771428842
+2023-01-30,98.72380970547232
+2023-01-31,97.36479124205492
+2023-02-01,95.92306210840623
+2023-02-02,95.68393209719697
+2023-02-03,94.47180119912643
+2023-02-06,94.84579616089573
+2023-02-07,95.05307431700199
+2023-02-08,96.47937046459054
+2023-02-09,94.42969985226924
+2023-02-10,95.16583271831749
+2023-02-13,95.28073391099926
+2023-02-14,95.2232425814606
+2023-02-15,97.06090737693395
+2023-02-16,96.2980242794829
+2023-02-17,95.21404345221072
+2023-02-20,96.23566507594931
+2023-02-21,97.33918675404169
+2023-02-22,96.50807389454167
+2023-02-23,96.54974121197057
+2023-02-24,97.52470253790894
+2023-02-27,98.85425967385349
+2023-02-28,98.4337388030057
+2023-03-01,98.89546801847318
+2023-03-02,96.17036777813757
+2023-03-03,94.84746221322114
+2023-03-06,95.69923293542055
+2023-03-07,95.30228515776452
+2023-03-08,96.10112302645472
+2023-03-09,96.57791250820131
+2023-03-10,95.37783770634279
+2023-03-13,96.25345915658356
+2023-03-14,96.58198741685467
+2023-03-15,94.84167883755129
+2023-03-16,93.90240133422837
+2023-03-17,94.47787384349282
+2023-03-20,93.63596645897508
+2023-03-21,93.17148959353835
+2023-03-22,93.84320149393449
+2023-03-23,93.98246865464391
+2023-03-24,94.36447955005957
+2023-03-27,93.22977516327333
+2023-03-28,93.72493673112801
+2023-03-29,94.22663498535941
+2023-03-30,94.46716538692698
+2023-03-31,93.33272247090554
+2023-04-03,92.20975603962283
+2023-04-04,93.04376562953648
+2023-04-05,92.44577492745705
+2023-04-06,93.14560458560837
+2023-04-07,93.36563684880976
+2023-04-10,92.48627226750371
+2023-04-11,93.77427148588036
+2023-04-12,95.68670586603108
+2023-04-13,97.19804404692589
+2023-04-14,97.5381643609706
+2023-04-17,98.44250881217312
+2023-04-18,98.18992991812155
+2023-04-19,99.08237423282053
+2023-04-20,98.33154921263043
+2023-04-21,99.19558892743007
+2023-04-24,100.38108317190839
+2023-04-25,100.56907993729718
+2023-04-26,101.65733998534672
+2023-04-27,102.58329707983917
+2023-04-28,103.93710688926947
+2023-05-01,105.72444498272115
+2023-05-02,107.00847812585046
+2023-05-03,107.90630485727458
+2023-05-04,105.55104427647015
+2023-05-05,104.68315339791525
+2023-05-08,103.0660647187833
+2023-05-09,102.50736704208465
+2023-05-10,103.43857411848798
+2023-05-11,103.8908008882891
+2023-05-12,102.7506516091747
+2023-05-15,103.2092314077732
+2023-05-16,104.40916463128411
+2023-05-17,106.91280448999623
+2023-05-18,106.54625148868281
+2023-05-19,106.84509394920607
+2023-05-22,105.89831715609526
+2023-05-23,106.23947228277801
+2023-05-24,107.6925185543695
+2023-05-25,107.81445993660894
+2023-05-26,108.5289677704071
+2023-05-29,107.47348766588689
+2023-05-30,107.31506001903593
+2023-05-31,108.04756304574965
+2023-06-01,109.31965200934664
+2023-06-02,108.31075677089639
+2023-06-05,107.9526537769693
+2023-06-06,106.06422517932282
+2023-06-07,108.37077076414539
+2023-06-08,110.42297660710743
+2023-06-09,112.7606936800102
+2023-06-12,112.55729172190993
+2023-06-13,113.76607854416316
+2023-06-14,114.5673963724282
+2023-06-15,116.04581163619783
+2023-06-16,114.78770244767466
+2023-06-19,112.38119917309865
+2023-06-20,113.74182979860856
+2023-06-21,113.23573867493832
+2023-06-22,112.93443741064951
+2023-06-23,113.7874100232255
+2023-06-26,111.42047489161632
+2023-06-27,110.6246380974324
+2023-06-28,111.30805799905129
+2023-06-29,111.5226302763902
+2023-06-30,110.50939112518677
+2023-07-03,112.85115871120858
+2023-07-04,113.65791088279661
+2023-07-05,112.8045638392464
+2023-07-06,113.9611679425396
+2023-07-07,113.12493452251718
+2023-07-10,112.8255953453562
+2023-07-11,113.07085337449338
+2023-07-12,112.84923654044408
+2023-07-13,113.29860471070803
+2023-07-14,112.6947669403202
+2023-07-17,112.40514636236014
+2023-07-18,110.7498236726629
+2023-07-19,110.10004021788733
+2023-07-20,109.94224045074814
+2023-07-21,110.77352673072475
+2023-07-24,110.48973431521003
+2023-07-25,110.47046389769571
+2023-07-26,109.59319698678843
+2023-07-27,108.09408844721864
+2023-07-28,108.84798365607526
+2023-07-31,109.58336562886907
+2023-08-01,110.11126595334156
+2023-08-02,109.47634242514546
+2023-08-03,110.53646530875147
+2023-08-04,112.61029404449488
+2023-08-07,111.74138351222085
+2023-08-08,111.37928968991189
+2023-08-09,110.7766846639451
+2023-08-10,110.14833351356965
+2023-08-11,110.43461013048909
+2023-08-14,109.84343861029282
+2023-08-15,108.28269238411853
+2023-08-16,108.34248909231732
+2023-08-17,107.96780535297073
+2023-08-18,108.49463545680462
+2023-08-21,108.07648478171427
+2023-08-22,109.3366366413195
+2023-08-23,110.8167046673262
+2023-08-24,110.90256403343604
+2023-08-25,112.18820677818451
+2023-08-28,112.18297842065601
+2023-08-29,113.58127693704994
+2023-08-30,112.60070566364737
+2023-08-31,112.9112196745038
+2023-09-01,112.64209971942087
+2023-09-04,111.80333835118665
+2023-09-05,111.77419548399345
+2023-09-06,112.35522013469372
+2023-09-07,111.96156031332052
+2023-09-08,113.77550083229295
+2023-09-11,114.14088102291693
+2023-09-12,113.49439123237917
+2023-09-13,113.48303932892227
+2023-09-14,113.19329240964584
+2023-09-15,112.0055027178427
+2023-09-18,112.92069462289751
+2023-09-19,112.58623807833345
+2023-09-20,113.5582905663451
+2023-09-21,113.41776262412525
+2023-09-22,113.29912455156594
+2023-09-25,114.68468731610213
+2023-09-26,116.59781304429475
+2023-09-27,117.69953098710413
+2023-09-28,118.6996230170952
+2023-09-29,117.72904953619032
+2023-10-02,116.95244596195936
+2023-10-03,119.00180175479125
+2023-10-04,118.38944000194745
+2023-10-05,117.74690920953807
+2023-10-06,117.70457445623965
+2023-10-09,116.59738869712922
+2023-10-10,119.39960642342659
+2023-10-11,119.34606617457193
+2023-10-12,118.07274019733025
+2023-10-13,117.45147372914293
+2023-10-16,116.7433544638298
+2023-10-17,117.48058459074697
+2023-10-18,117.0561268383702
+2023-10-19,115.07334728709905
+2023-10-20,114.71838020549325
+2023-10-23,116.1038195953765
+2023-10-24,118.4340570748463
+2023-10-25,118.2488571665902
+2023-10-26,117.57168531960758
+2023-10-27,117.18046884722311
+2023-10-30,118.57883225385106
+2023-10-31,116.95499568410848
diff --git a/system-architecture.mermaid b/system-architecture.mermaid
new file mode 100644
index 0000000..703a09c
--- /dev/null
+++ b/system-architecture.mermaid
@@ -0,0 +1,44 @@
+graph TD
+ A[AlgoSystem] --> B[Backtesting]
+ A --> C[Analysis]
+ A --> D[Dashboard]
+ A --> E[Utils]
+ A --> F[CLI]
+
+ %% Backtesting Module
+ B --> B1[Engine - Core backtesting logic]
+ B --> B2[Metrics - Performance calculations]
+ B --> B3[Visualization - Plot generation]
+ B --> B4[Dashboard Generator - HTML output]
+
+ %% Analysis Module
+ C --> C1[Risk - VaR, CVaR, stress testing]
+ C --> C2[Performance - Returns analysis]
+ C --> C3[Portfolio - Optimization, efficient frontier]
+
+ %% Dashboard Module
+ D --> D1[Dashboard Module - Interactive UI]
+ D --> D2[Plot Registry - Chart catalog]
+ D --> D3[Chart Handlers - Visualization logic]
+
+ %% Utils Module
+ E --> E1[Config - System configuration]
+ E --> E2[Logging - Debug output]
+ E --> E3[Decorators - Function wrappers]
+
+ %% CLI Module
+ F --> F1[Commands - Command-line tools]
+
+ %% Data Flow
+ B1 -->|Results| B2
+ B2 -->|Metrics| B3
+ B3 -->|Figures| B4
+ B4 -->|Dashboard| G[HTML/CSS/JS Output]
+
+ C1 -->|Risk Metrics| B2
+ C2 -->|Performance Data| B2
+ C3 -->|Portfolio Analysis| B2
+
+ D1 -->|UI Events| D2
+ D2 -->|Chart Specs| D3
+ F1 -->|CLI Args| B1
From 959179a0d0ff42107fb0f023094e234dd1e8f4df Mon Sep 17 00:00:00 2001
From: BonelessWater
Date: Tue, 6 May 2025 23:13:56 -0400
Subject: [PATCH 07/54] dashboard updates successfully
need to add more charts and metrics
need to theme the webapp and dashboard
---
poetry.lock | 3088 ---------------------------------------------------
1 file changed, 3088 deletions(-)
delete mode 100644 poetry.lock
diff --git a/poetry.lock b/poetry.lock
deleted file mode 100644
index d82efa0..0000000
--- a/poetry.lock
+++ /dev/null
@@ -1,3088 +0,0 @@
-# This file is automatically @generated by Poetry 2.1.2 and should not be changed by hand.
-
-[[package]]
-name = "alabaster"
-version = "0.7.16"
-description = "A light, configurable Sphinx theme"
-optional = false
-python-versions = ">=3.9"
-groups = ["docs"]
-files = [
- {file = "alabaster-0.7.16-py3-none-any.whl", hash = "sha256:b46733c07dce03ae4e150330b975c75737fa60f0a7c591b6c8bf4928a28e2c92"},
- {file = "alabaster-0.7.16.tar.gz", hash = "sha256:75a8b99c28a5dad50dd7f8ccdd447a121ddb3892da9e53d1ca5cca3106d58d65"},
-]
-
-[[package]]
-name = "astroid"
-version = "3.3.9"
-description = "An abstract syntax tree for Python with inference support."
-optional = false
-python-versions = ">=3.9.0"
-groups = ["dev"]
-files = [
- {file = "astroid-3.3.9-py3-none-any.whl", hash = "sha256:d05bfd0acba96a7bd43e222828b7d9bc1e138aaeb0649707908d3702a9831248"},
- {file = "astroid-3.3.9.tar.gz", hash = "sha256:622cc8e3048684aa42c820d9d218978021c3c3d174fb03a9f0d615921744f550"},
-]
-
-[[package]]
-name = "asttokens"
-version = "3.0.0"
-description = "Annotate AST trees with source code positions"
-optional = false
-python-versions = ">=3.8"
-groups = ["main"]
-files = [
- {file = "asttokens-3.0.0-py3-none-any.whl", hash = "sha256:e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2"},
- {file = "asttokens-3.0.0.tar.gz", hash = "sha256:0dcd8baa8d62b0c1d118b399b2ddba3c4aff271d0d7a9e0d4c1681c79035bbc7"},
-]
-
-[package.extras]
-astroid = ["astroid (>=2,<4)"]
-test = ["astroid (>=2,<4)", "pytest", "pytest-cov", "pytest-xdist"]
-
-[[package]]
-name = "babel"
-version = "2.17.0"
-description = "Internationalization utilities"
-optional = false
-python-versions = ">=3.8"
-groups = ["docs"]
-files = [
- {file = "babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2"},
- {file = "babel-2.17.0.tar.gz", hash = "sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d"},
-]
-
-[package.extras]
-dev = ["backports.zoneinfo ; python_version < \"3.9\"", "freezegun (>=1.0,<2.0)", "jinja2 (>=3.0)", "pytest (>=6.0)", "pytest-cov", "pytz", "setuptools", "tzdata ; sys_platform == \"win32\""]
-
-[[package]]
-name = "beautifulsoup4"
-version = "4.13.4"
-description = "Screen-scraping library"
-optional = false
-python-versions = ">=3.7.0"
-groups = ["main"]
-files = [
- {file = "beautifulsoup4-4.13.4-py3-none-any.whl", hash = "sha256:9bbbb14bfde9d79f38b8cd5f8c7c85f4b8f2523190ebed90e950a8dea4cb1c4b"},
- {file = "beautifulsoup4-4.13.4.tar.gz", hash = "sha256:dbb3c4e1ceae6aefebdaf2423247260cd062430a410e38c66f2baa50a8437195"},
-]
-
-[package.dependencies]
-soupsieve = ">1.2"
-typing-extensions = ">=4.0.0"
-
-[package.extras]
-cchardet = ["cchardet"]
-chardet = ["chardet"]
-charset-normalizer = ["charset-normalizer"]
-html5lib = ["html5lib"]
-lxml = ["lxml"]
-
-[[package]]
-name = "black"
-version = "24.10.0"
-description = "The uncompromising code formatter."
-optional = false
-python-versions = ">=3.9"
-groups = ["dev"]
-files = [
- {file = "black-24.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e6668650ea4b685440857138e5fe40cde4d652633b1bdffc62933d0db4ed9812"},
- {file = "black-24.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1c536fcf674217e87b8cc3657b81809d3c085d7bf3ef262ead700da345bfa6ea"},
- {file = "black-24.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:649fff99a20bd06c6f727d2a27f401331dc0cc861fb69cde910fe95b01b5928f"},
- {file = "black-24.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:fe4d6476887de70546212c99ac9bd803d90b42fc4767f058a0baa895013fbb3e"},
- {file = "black-24.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5a2221696a8224e335c28816a9d331a6c2ae15a2ee34ec857dcf3e45dbfa99ad"},
- {file = "black-24.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f9da3333530dbcecc1be13e69c250ed8dfa67f43c4005fb537bb426e19200d50"},
- {file = "black-24.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4007b1393d902b48b36958a216c20c4482f601569d19ed1df294a496eb366392"},
- {file = "black-24.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:394d4ddc64782e51153eadcaaca95144ac4c35e27ef9b0a42e121ae7e57a9175"},
- {file = "black-24.10.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b5e39e0fae001df40f95bd8cc36b9165c5e2ea88900167bddf258bacef9bbdc3"},
- {file = "black-24.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d37d422772111794b26757c5b55a3eade028aa3fde43121ab7b673d050949d65"},
- {file = "black-24.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:14b3502784f09ce2443830e3133dacf2c0110d45191ed470ecb04d0f5f6fcb0f"},
- {file = "black-24.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:30d2c30dc5139211dda799758559d1b049f7f14c580c409d6ad925b74a4208a8"},
- {file = "black-24.10.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1cbacacb19e922a1d75ef2b6ccaefcd6e93a2c05ede32f06a21386a04cedb981"},
- {file = "black-24.10.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1f93102e0c5bb3907451063e08b9876dbeac810e7da5a8bfb7aeb5a9ef89066b"},
- {file = "black-24.10.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ddacb691cdcdf77b96f549cf9591701d8db36b2f19519373d60d31746068dbf2"},
- {file = "black-24.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:680359d932801c76d2e9c9068d05c6b107f2584b2a5b88831c83962eb9984c1b"},
- {file = "black-24.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:17374989640fbca88b6a448129cd1745c5eb8d9547b464f281b251dd00155ccd"},
- {file = "black-24.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:63f626344343083322233f175aaf372d326de8436f5928c042639a4afbbf1d3f"},
- {file = "black-24.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfa1d0cb6200857f1923b602f978386a3a2758a65b52e0950299ea014be6800"},
- {file = "black-24.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:2cd9c95431d94adc56600710f8813ee27eea544dd118d45896bb734e9d7a0dc7"},
- {file = "black-24.10.0-py3-none-any.whl", hash = "sha256:3bb2b7a1f7b685f85b11fed1ef10f8a9148bceb49853e47a294a3dd963c1dd7d"},
- {file = "black-24.10.0.tar.gz", hash = "sha256:846ea64c97afe3bc677b761787993be4991810ecc7a4a937816dd6bddedc4875"},
-]
-
-[package.dependencies]
-click = ">=8.0.0"
-mypy-extensions = ">=0.4.3"
-packaging = ">=22.0"
-pathspec = ">=0.9.0"
-platformdirs = ">=2"
-
-[package.extras]
-colorama = ["colorama (>=0.4.3)"]
-d = ["aiohttp (>=3.10)"]
-jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"]
-uvloop = ["uvloop (>=0.15.2)"]
-
-[[package]]
-name = "brotli"
-version = "1.1.0"
-description = "Python bindings for the Brotli compression library"
-optional = false
-python-versions = "*"
-groups = ["main"]
-markers = "platform_python_implementation == \"CPython\""
-files = [
- {file = "Brotli-1.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e1140c64812cb9b06c922e77f1c26a75ec5e3f0fb2bf92cc8c58720dec276752"},
- {file = "Brotli-1.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c8fd5270e906eef71d4a8d19b7c6a43760c6abcfcc10c9101d14eb2357418de9"},
- {file = "Brotli-1.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1ae56aca0402a0f9a3431cddda62ad71666ca9d4dc3a10a142b9dce2e3c0cda3"},
- {file = "Brotli-1.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:43ce1b9935bfa1ede40028054d7f48b5469cd02733a365eec8a329ffd342915d"},
- {file = "Brotli-1.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:7c4855522edb2e6ae7fdb58e07c3ba9111e7621a8956f481c68d5d979c93032e"},
- {file = "Brotli-1.1.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:38025d9f30cf4634f8309c6874ef871b841eb3c347e90b0851f63d1ded5212da"},
- {file = "Brotli-1.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e6a904cb26bfefc2f0a6f240bdf5233be78cd2488900a2f846f3c3ac8489ab80"},
- {file = "Brotli-1.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a37b8f0391212d29b3a91a799c8e4a2855e0576911cdfb2515487e30e322253d"},
- {file = "Brotli-1.1.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e84799f09591700a4154154cab9787452925578841a94321d5ee8fb9a9a328f0"},
- {file = "Brotli-1.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f66b5337fa213f1da0d9000bc8dc0cb5b896b726eefd9c6046f699b169c41b9e"},
- {file = "Brotli-1.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:5dab0844f2cf82be357a0eb11a9087f70c5430b2c241493fc122bb6f2bb0917c"},
- {file = "Brotli-1.1.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e4fe605b917c70283db7dfe5ada75e04561479075761a0b3866c081d035b01c1"},
- {file = "Brotli-1.1.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:1e9a65b5736232e7a7f91ff3d02277f11d339bf34099a56cdab6a8b3410a02b2"},
- {file = "Brotli-1.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:58d4b711689366d4a03ac7957ab8c28890415e267f9b6589969e74b6e42225ec"},
- {file = "Brotli-1.1.0-cp310-cp310-win32.whl", hash = "sha256:be36e3d172dc816333f33520154d708a2657ea63762ec16b62ece02ab5e4daf2"},
- {file = "Brotli-1.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:0c6244521dda65ea562d5a69b9a26120769b7a9fb3db2fe9545935ed6735b128"},
- {file = "Brotli-1.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a3daabb76a78f829cafc365531c972016e4aa8d5b4bf60660ad8ecee19df7ccc"},
- {file = "Brotli-1.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c8146669223164fc87a7e3de9f81e9423c67a79d6b3447994dfb9c95da16e2d6"},
- {file = "Brotli-1.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:30924eb4c57903d5a7526b08ef4a584acc22ab1ffa085faceb521521d2de32dd"},
- {file = "Brotli-1.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ceb64bbc6eac5a140ca649003756940f8d6a7c444a68af170b3187623b43bebf"},
- {file = "Brotli-1.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a469274ad18dc0e4d316eefa616d1d0c2ff9da369af19fa6f3daa4f09671fd61"},
- {file = "Brotli-1.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:524f35912131cc2cabb00edfd8d573b07f2d9f21fa824bd3fb19725a9cf06327"},
- {file = "Brotli-1.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:5b3cc074004d968722f51e550b41a27be656ec48f8afaeeb45ebf65b561481dd"},
- {file = "Brotli-1.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:19c116e796420b0cee3da1ccec3b764ed2952ccfcc298b55a10e5610ad7885f9"},
- {file = "Brotli-1.1.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:510b5b1bfbe20e1a7b3baf5fed9e9451873559a976c1a78eebaa3b86c57b4265"},
- {file = "Brotli-1.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a1fd8a29719ccce974d523580987b7f8229aeace506952fa9ce1d53a033873c8"},
- {file = "Brotli-1.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c247dd99d39e0338a604f8c2b3bc7061d5c2e9e2ac7ba9cc1be5a69cb6cd832f"},
- {file = "Brotli-1.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1b2c248cd517c222d89e74669a4adfa5577e06ab68771a529060cf5a156e9757"},
- {file = "Brotli-1.1.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:2a24c50840d89ded6c9a8fdc7b6ed3692ed4e86f1c4a4a938e1e92def92933e0"},
- {file = "Brotli-1.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f31859074d57b4639318523d6ffdca586ace54271a73ad23ad021acd807eb14b"},
- {file = "Brotli-1.1.0-cp311-cp311-win32.whl", hash = "sha256:39da8adedf6942d76dc3e46653e52df937a3c4d6d18fdc94a7c29d263b1f5b50"},
- {file = "Brotli-1.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:aac0411d20e345dc0920bdec5548e438e999ff68d77564d5e9463a7ca9d3e7b1"},
- {file = "Brotli-1.1.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:32d95b80260d79926f5fab3c41701dbb818fde1c9da590e77e571eefd14abe28"},
- {file = "Brotli-1.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b760c65308ff1e462f65d69c12e4ae085cff3b332d894637f6273a12a482d09f"},
- {file = "Brotli-1.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:316cc9b17edf613ac76b1f1f305d2a748f1b976b033b049a6ecdfd5612c70409"},
- {file = "Brotli-1.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:caf9ee9a5775f3111642d33b86237b05808dafcd6268faa492250e9b78046eb2"},
- {file = "Brotli-1.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70051525001750221daa10907c77830bc889cb6d865cc0b813d9db7fefc21451"},
- {file = "Brotli-1.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7f4bf76817c14aa98cc6697ac02f3972cb8c3da93e9ef16b9c66573a68014f91"},
- {file = "Brotli-1.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0c5516f0aed654134a2fc936325cc2e642f8a0e096d075209672eb321cff408"},
- {file = "Brotli-1.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6c3020404e0b5eefd7c9485ccf8393cfb75ec38ce75586e046573c9dc29967a0"},
- {file = "Brotli-1.1.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:4ed11165dd45ce798d99a136808a794a748d5dc38511303239d4e2363c0695dc"},
- {file = "Brotli-1.1.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:4093c631e96fdd49e0377a9c167bfd75b6d0bad2ace734c6eb20b348bc3ea180"},
- {file = "Brotli-1.1.0-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:7e4c4629ddad63006efa0ef968c8e4751c5868ff0b1c5c40f76524e894c50248"},
- {file = "Brotli-1.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:861bf317735688269936f755fa136a99d1ed526883859f86e41a5d43c61d8966"},
- {file = "Brotli-1.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:87a3044c3a35055527ac75e419dfa9f4f3667a1e887ee80360589eb8c90aabb9"},
- {file = "Brotli-1.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:c5529b34c1c9d937168297f2c1fde7ebe9ebdd5e121297ff9c043bdb2ae3d6fb"},
- {file = "Brotli-1.1.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:ca63e1890ede90b2e4454f9a65135a4d387a4585ff8282bb72964fab893f2111"},
- {file = "Brotli-1.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e79e6520141d792237c70bcd7a3b122d00f2613769ae0cb61c52e89fd3443839"},
- {file = "Brotli-1.1.0-cp312-cp312-win32.whl", hash = "sha256:5f4d5ea15c9382135076d2fb28dde923352fe02951e66935a9efaac8f10e81b0"},
- {file = "Brotli-1.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:906bc3a79de8c4ae5b86d3d75a8b77e44404b0f4261714306e3ad248d8ab0951"},
- {file = "Brotli-1.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8bf32b98b75c13ec7cf774164172683d6e7891088f6316e54425fde1efc276d5"},
- {file = "Brotli-1.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7bc37c4d6b87fb1017ea28c9508b36bbcb0c3d18b4260fcdf08b200c74a6aee8"},
- {file = "Brotli-1.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c0ef38c7a7014ffac184db9e04debe495d317cc9c6fb10071f7fefd93100a4f"},
- {file = "Brotli-1.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91d7cc2a76b5567591d12c01f019dd7afce6ba8cba6571187e21e2fc418ae648"},
- {file = "Brotli-1.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a93dde851926f4f2678e704fadeb39e16c35d8baebd5252c9fd94ce8ce68c4a0"},
- {file = "Brotli-1.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f0db75f47be8b8abc8d9e31bc7aad0547ca26f24a54e6fd10231d623f183d089"},
- {file = "Brotli-1.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6967ced6730aed543b8673008b5a391c3b1076d834ca438bbd70635c73775368"},
- {file = "Brotli-1.1.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:7eedaa5d036d9336c95915035fb57422054014ebdeb6f3b42eac809928e40d0c"},
- {file = "Brotli-1.1.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:d487f5432bf35b60ed625d7e1b448e2dc855422e87469e3f450aa5552b0eb284"},
- {file = "Brotli-1.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:832436e59afb93e1836081a20f324cb185836c617659b07b129141a8426973c7"},
- {file = "Brotli-1.1.0-cp313-cp313-win32.whl", hash = "sha256:43395e90523f9c23a3d5bdf004733246fba087f2948f87ab28015f12359ca6a0"},
- {file = "Brotli-1.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:9011560a466d2eb3f5a6e4929cf4a09be405c64154e12df0dd72713f6500e32b"},
- {file = "Brotli-1.1.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:a090ca607cbb6a34b0391776f0cb48062081f5f60ddcce5d11838e67a01928d1"},
- {file = "Brotli-1.1.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2de9d02f5bda03d27ede52e8cfe7b865b066fa49258cbab568720aa5be80a47d"},
- {file = "Brotli-1.1.0-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2333e30a5e00fe0fe55903c8832e08ee9c3b1382aacf4db26664a16528d51b4b"},
- {file = "Brotli-1.1.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4d4a848d1837973bf0f4b5e54e3bec977d99be36a7895c61abb659301b02c112"},
- {file = "Brotli-1.1.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:fdc3ff3bfccdc6b9cc7c342c03aa2400683f0cb891d46e94b64a197910dc4064"},
- {file = "Brotli-1.1.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:5eeb539606f18a0b232d4ba45adccde4125592f3f636a6182b4a8a436548b914"},
- {file = "Brotli-1.1.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:fd5f17ff8f14003595ab414e45fce13d073e0762394f957182e69035c9f3d7c2"},
- {file = "Brotli-1.1.0-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:069a121ac97412d1fe506da790b3e69f52254b9df4eb665cd42460c837193354"},
- {file = "Brotli-1.1.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:e93dfc1a1165e385cc8239fab7c036fb2cd8093728cbd85097b284d7b99249a2"},
- {file = "Brotli-1.1.0-cp36-cp36m-musllinux_1_2_aarch64.whl", hash = "sha256:aea440a510e14e818e67bfc4027880e2fb500c2ccb20ab21c7a7c8b5b4703d75"},
- {file = "Brotli-1.1.0-cp36-cp36m-musllinux_1_2_i686.whl", hash = "sha256:6974f52a02321b36847cd19d1b8e381bf39939c21efd6ee2fc13a28b0d99348c"},
- {file = "Brotli-1.1.0-cp36-cp36m-musllinux_1_2_ppc64le.whl", hash = "sha256:a7e53012d2853a07a4a79c00643832161a910674a893d296c9f1259859a289d2"},
- {file = "Brotli-1.1.0-cp36-cp36m-musllinux_1_2_x86_64.whl", hash = "sha256:d7702622a8b40c49bffb46e1e3ba2e81268d5c04a34f460978c6b5517a34dd52"},
- {file = "Brotli-1.1.0-cp36-cp36m-win32.whl", hash = "sha256:a599669fd7c47233438a56936988a2478685e74854088ef5293802123b5b2460"},
- {file = "Brotli-1.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:d143fd47fad1db3d7c27a1b1d66162e855b5d50a89666af46e1679c496e8e579"},
- {file = "Brotli-1.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:11d00ed0a83fa22d29bc6b64ef636c4552ebafcef57154b4ddd132f5638fbd1c"},
- {file = "Brotli-1.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f733d788519c7e3e71f0855c96618720f5d3d60c3cb829d8bbb722dddce37985"},
- {file = "Brotli-1.1.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:929811df5462e182b13920da56c6e0284af407d1de637d8e536c5cd00a7daf60"},
- {file = "Brotli-1.1.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0b63b949ff929fbc2d6d3ce0e924c9b93c9785d877a21a1b678877ffbbc4423a"},
- {file = "Brotli-1.1.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:d192f0f30804e55db0d0e0a35d83a9fead0e9a359a9ed0285dbacea60cc10a84"},
- {file = "Brotli-1.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:f296c40e23065d0d6650c4aefe7470d2a25fffda489bcc3eb66083f3ac9f6643"},
- {file = "Brotli-1.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:919e32f147ae93a09fe064d77d5ebf4e35502a8df75c29fb05788528e330fe74"},
- {file = "Brotli-1.1.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:23032ae55523cc7bccb4f6a0bf368cd25ad9bcdcc1990b64a647e7bbcce9cb5b"},
- {file = "Brotli-1.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:224e57f6eac61cc449f498cc5f0e1725ba2071a3d4f48d5d9dffba42db196438"},
- {file = "Brotli-1.1.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:cb1dac1770878ade83f2ccdf7d25e494f05c9165f5246b46a621cc849341dc01"},
- {file = "Brotli-1.1.0-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:3ee8a80d67a4334482d9712b8e83ca6b1d9bc7e351931252ebef5d8f7335a547"},
- {file = "Brotli-1.1.0-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:5e55da2c8724191e5b557f8e18943b1b4839b8efc3ef60d65985bcf6f587dd38"},
- {file = "Brotli-1.1.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:d342778ef319e1026af243ed0a07c97acf3bad33b9f29e7ae6a1f68fd083e90c"},
- {file = "Brotli-1.1.0-cp37-cp37m-win32.whl", hash = "sha256:587ca6d3cef6e4e868102672d3bd9dc9698c309ba56d41c2b9c85bbb903cdb95"},
- {file = "Brotli-1.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:2954c1c23f81c2eaf0b0717d9380bd348578a94161a65b3a2afc62c86467dd68"},
- {file = "Brotli-1.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:efa8b278894b14d6da122a72fefcebc28445f2d3f880ac59d46c90f4c13be9a3"},
- {file = "Brotli-1.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:03d20af184290887bdea3f0f78c4f737d126c74dc2f3ccadf07e54ceca3bf208"},
- {file = "Brotli-1.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6172447e1b368dcbc458925e5ddaf9113477b0ed542df258d84fa28fc45ceea7"},
- {file = "Brotli-1.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a743e5a28af5f70f9c080380a5f908d4d21d40e8f0e0c8901604d15cfa9ba751"},
- {file = "Brotli-1.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0541e747cce78e24ea12d69176f6a7ddb690e62c425e01d31cc065e69ce55b48"},
- {file = "Brotli-1.1.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:cdbc1fc1bc0bff1cef838eafe581b55bfbffaed4ed0318b724d0b71d4d377619"},
- {file = "Brotli-1.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:890b5a14ce214389b2cc36ce82f3093f96f4cc730c1cffdbefff77a7c71f2a97"},
- {file = "Brotli-1.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1ab4fbee0b2d9098c74f3057b2bc055a8bd92ccf02f65944a241b4349229185a"},
- {file = "Brotli-1.1.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:141bd4d93984070e097521ed07e2575b46f817d08f9fa42b16b9b5f27b5ac088"},
- {file = "Brotli-1.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fce1473f3ccc4187f75b4690cfc922628aed4d3dd013d047f95a9b3919a86596"},
- {file = "Brotli-1.1.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d2b35ca2c7f81d173d2fadc2f4f31e88cc5f7a39ae5b6db5513cf3383b0e0ec7"},
- {file = "Brotli-1.1.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:af6fa6817889314555aede9a919612b23739395ce767fe7fcbea9a80bf140fe5"},
- {file = "Brotli-1.1.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:2feb1d960f760a575dbc5ab3b1c00504b24caaf6986e2dc2b01c09c87866a943"},
- {file = "Brotli-1.1.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:4410f84b33374409552ac9b6903507cdb31cd30d2501fc5ca13d18f73548444a"},
- {file = "Brotli-1.1.0-cp38-cp38-win32.whl", hash = "sha256:db85ecf4e609a48f4b29055f1e144231b90edc90af7481aa731ba2d059226b1b"},
- {file = "Brotli-1.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:3d7954194c36e304e1523f55d7042c59dc53ec20dd4e9ea9d151f1b62b4415c0"},
- {file = "Brotli-1.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5fb2ce4b8045c78ebbc7b8f3c15062e435d47e7393cc57c25115cfd49883747a"},
- {file = "Brotli-1.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7905193081db9bfa73b1219140b3d315831cbff0d8941f22da695832f0dd188f"},
- {file = "Brotli-1.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a77def80806c421b4b0af06f45d65a136e7ac0bdca3c09d9e2ea4e515367c7e9"},
- {file = "Brotli-1.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8dadd1314583ec0bf2d1379f7008ad627cd6336625d6679cf2f8e67081b83acf"},
- {file = "Brotli-1.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:901032ff242d479a0efa956d853d16875d42157f98951c0230f69e69f9c09bac"},
- {file = "Brotli-1.1.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:22fc2a8549ffe699bfba2256ab2ed0421a7b8fadff114a3d201794e45a9ff578"},
- {file = "Brotli-1.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ae15b066e5ad21366600ebec29a7ccbc86812ed267e4b28e860b8ca16a2bc474"},
- {file = "Brotli-1.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:949f3b7c29912693cee0afcf09acd6ebc04c57af949d9bf77d6101ebb61e388c"},
- {file = "Brotli-1.1.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:89f4988c7203739d48c6f806f1e87a1d96e0806d44f0fba61dba81392c9e474d"},
- {file = "Brotli-1.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:de6551e370ef19f8de1807d0a9aa2cdfdce2e85ce88b122fe9f6b2b076837e59"},
- {file = "Brotli-1.1.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0737ddb3068957cf1b054899b0883830bb1fec522ec76b1098f9b6e0f02d9419"},
- {file = "Brotli-1.1.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:4f3607b129417e111e30637af1b56f24f7a49e64763253bbc275c75fa887d4b2"},
- {file = "Brotli-1.1.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:6c6e0c425f22c1c719c42670d561ad682f7bfeeef918edea971a79ac5252437f"},
- {file = "Brotli-1.1.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:494994f807ba0b92092a163a0a283961369a65f6cbe01e8891132b7a320e61eb"},
- {file = "Brotli-1.1.0-cp39-cp39-win32.whl", hash = "sha256:f0d8a7a6b5983c2496e364b969f0e526647a06b075d034f3297dc66f3b360c64"},
- {file = "Brotli-1.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:cdad5b9014d83ca68c25d2e9444e28e967ef16e80f6b436918c700c117a85467"},
- {file = "Brotli-1.1.0.tar.gz", hash = "sha256:81de08ac11bcb85841e440c13611c00b67d3bf82698314928d0b676362546724"},
-]
-
-[[package]]
-name = "brotlicffi"
-version = "1.1.0.0"
-description = "Python CFFI bindings to the Brotli library"
-optional = false
-python-versions = ">=3.7"
-groups = ["main"]
-markers = "platform_python_implementation != \"CPython\""
-files = [
- {file = "brotlicffi-1.1.0.0-cp37-abi3-macosx_10_9_x86_64.whl", hash = "sha256:9b7ae6bd1a3f0df532b6d67ff674099a96d22bc0948955cb338488c31bfb8851"},
- {file = "brotlicffi-1.1.0.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19ffc919fa4fc6ace69286e0a23b3789b4219058313cf9b45625016bf7ff996b"},
- {file = "brotlicffi-1.1.0.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9feb210d932ffe7798ee62e6145d3a757eb6233aa9a4e7db78dd3690d7755814"},
- {file = "brotlicffi-1.1.0.0-cp37-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:84763dbdef5dd5c24b75597a77e1b30c66604725707565188ba54bab4f114820"},
- {file = "brotlicffi-1.1.0.0-cp37-abi3-win32.whl", hash = "sha256:1b12b50e07c3911e1efa3a8971543e7648100713d4e0971b13631cce22c587eb"},
- {file = "brotlicffi-1.1.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:994a4f0681bb6c6c3b0925530a1926b7a189d878e6e5e38fae8efa47c5d9c613"},
- {file = "brotlicffi-1.1.0.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2e4aeb0bd2540cb91b069dbdd54d458da8c4334ceaf2d25df2f4af576d6766ca"},
- {file = "brotlicffi-1.1.0.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b7b0033b0d37bb33009fb2fef73310e432e76f688af76c156b3594389d81391"},
- {file = "brotlicffi-1.1.0.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54a07bb2374a1eba8ebb52b6fafffa2afd3c4df85ddd38fcc0511f2bb387c2a8"},
- {file = "brotlicffi-1.1.0.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7901a7dc4b88f1c1475de59ae9be59799db1007b7d059817948d8e4f12e24e35"},
- {file = "brotlicffi-1.1.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ce01c7316aebc7fce59da734286148b1d1b9455f89cf2c8a4dfce7d41db55c2d"},
- {file = "brotlicffi-1.1.0.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:246f1d1a90279bb6069de3de8d75a8856e073b8ff0b09dcca18ccc14cec85979"},
- {file = "brotlicffi-1.1.0.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc4bc5d82bc56ebd8b514fb8350cfac4627d6b0743382e46d033976a5f80fab6"},
- {file = "brotlicffi-1.1.0.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37c26ecb14386a44b118ce36e546ce307f4810bc9598a6e6cb4f7fca725ae7e6"},
- {file = "brotlicffi-1.1.0.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca72968ae4eaf6470498d5c2887073f7efe3b1e7d7ec8be11a06a79cc810e990"},
- {file = "brotlicffi-1.1.0.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:add0de5b9ad9e9aa293c3aa4e9deb2b61e99ad6c1634e01d01d98c03e6a354cc"},
- {file = "brotlicffi-1.1.0.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9b6068e0f3769992d6b622a1cd2e7835eae3cf8d9da123d7f51ca9c1e9c333e5"},
- {file = "brotlicffi-1.1.0.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8557a8559509b61e65083f8782329188a250102372576093c88930c875a69838"},
- {file = "brotlicffi-1.1.0.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2a7ae37e5d79c5bdfb5b4b99f2715a6035e6c5bf538c3746abc8e26694f92f33"},
- {file = "brotlicffi-1.1.0.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:391151ec86bb1c683835980f4816272a87eaddc46bb91cbf44f62228b84d8cca"},
- {file = "brotlicffi-1.1.0.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:2f3711be9290f0453de8eed5275d93d286abe26b08ab4a35d7452caa1fef532f"},
- {file = "brotlicffi-1.1.0.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:1a807d760763e398bbf2c6394ae9da5815901aa93ee0a37bca5efe78d4ee3171"},
- {file = "brotlicffi-1.1.0.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fa8ca0623b26c94fccc3a1fdd895be1743b838f3917300506d04aa3346fd2a14"},
- {file = "brotlicffi-1.1.0.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3de0cf28a53a3238b252aca9fed1593e9d36c1d116748013339f0949bfc84112"},
- {file = "brotlicffi-1.1.0.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6be5ec0e88a4925c91f3dea2bb0013b3a2accda6f77238f76a34a1ea532a1cb0"},
- {file = "brotlicffi-1.1.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:d9eb71bb1085d996244439154387266fd23d6ad37161f6f52f1cd41dd95a3808"},
- {file = "brotlicffi-1.1.0.0.tar.gz", hash = "sha256:b77827a689905143f87915310b93b273ab17888fd43ef350d4832c4a71083c13"},
-]
-
-[package.dependencies]
-cffi = ">=1.0.0"
-
-[[package]]
-name = "certifi"
-version = "2025.1.31"
-description = "Python package for providing Mozilla's CA Bundle."
-optional = false
-python-versions = ">=3.6"
-groups = ["main", "docs"]
-files = [
- {file = "certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe"},
- {file = "certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651"},
-]
-
-[[package]]
-name = "cffi"
-version = "1.17.1"
-description = "Foreign Function Interface for Python calling C code."
-optional = false
-python-versions = ">=3.8"
-groups = ["main"]
-files = [
- {file = "cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14"},
- {file = "cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67"},
- {file = "cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382"},
- {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702"},
- {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3"},
- {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6"},
- {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17"},
- {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8"},
- {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e"},
- {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be"},
- {file = "cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c"},
- {file = "cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15"},
- {file = "cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401"},
- {file = "cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf"},
- {file = "cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4"},
- {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41"},
- {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1"},
- {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6"},
- {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d"},
- {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6"},
- {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f"},
- {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b"},
- {file = "cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655"},
- {file = "cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0"},
- {file = "cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4"},
- {file = "cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c"},
- {file = "cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36"},
- {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5"},
- {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff"},
- {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99"},
- {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93"},
- {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3"},
- {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8"},
- {file = "cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65"},
- {file = "cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903"},
- {file = "cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e"},
- {file = "cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2"},
- {file = "cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3"},
- {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683"},
- {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5"},
- {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4"},
- {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd"},
- {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed"},
- {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9"},
- {file = "cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d"},
- {file = "cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a"},
- {file = "cffi-1.17.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:636062ea65bd0195bc012fea9321aca499c0504409f413dc88af450b57ffd03b"},
- {file = "cffi-1.17.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7eac2ef9b63c79431bc4b25f1cd649d7f061a28808cbc6c47b534bd789ef964"},
- {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9"},
- {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:31000ec67d4221a71bd3f67df918b1f88f676f1c3b535a7eb473255fdc0b83fc"},
- {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6f17be4345073b0a7b8ea599688f692ac3ef23ce28e5df79c04de519dbc4912c"},
- {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2b1fac190ae3ebfe37b979cc1ce69c81f4e4fe5746bb401dca63a9062cdaf1"},
- {file = "cffi-1.17.1-cp38-cp38-win32.whl", hash = "sha256:7596d6620d3fa590f677e9ee430df2958d2d6d6de2feeae5b20e82c00b76fbf8"},
- {file = "cffi-1.17.1-cp38-cp38-win_amd64.whl", hash = "sha256:78122be759c3f8a014ce010908ae03364d00a1f81ab5c7f4a7a5120607ea56e1"},
- {file = "cffi-1.17.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16"},
- {file = "cffi-1.17.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36"},
- {file = "cffi-1.17.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8"},
- {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576"},
- {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87"},
- {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0"},
- {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3"},
- {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595"},
- {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a"},
- {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e"},
- {file = "cffi-1.17.1-cp39-cp39-win32.whl", hash = "sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7"},
- {file = "cffi-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662"},
- {file = "cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824"},
-]
-
-[package.dependencies]
-pycparser = "*"
-
-[[package]]
-name = "charset-normalizer"
-version = "3.4.1"
-description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet."
-optional = false
-python-versions = ">=3.7"
-groups = ["main", "docs"]
-files = [
- {file = "charset_normalizer-3.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de"},
- {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176"},
- {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037"},
- {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f"},
- {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a"},
- {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a"},
- {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247"},
- {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408"},
- {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb"},
- {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d"},
- {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807"},
- {file = "charset_normalizer-3.4.1-cp310-cp310-win32.whl", hash = "sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f"},
- {file = "charset_normalizer-3.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f"},
- {file = "charset_normalizer-3.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125"},
- {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1"},
- {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3"},
- {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd"},
- {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00"},
- {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12"},
- {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77"},
- {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146"},
- {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd"},
- {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6"},
- {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8"},
- {file = "charset_normalizer-3.4.1-cp311-cp311-win32.whl", hash = "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b"},
- {file = "charset_normalizer-3.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76"},
- {file = "charset_normalizer-3.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545"},
- {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7"},
- {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757"},
- {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa"},
- {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d"},
- {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616"},
- {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b"},
- {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d"},
- {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a"},
- {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9"},
- {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1"},
- {file = "charset_normalizer-3.4.1-cp312-cp312-win32.whl", hash = "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35"},
- {file = "charset_normalizer-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f"},
- {file = "charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda"},
- {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313"},
- {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9"},
- {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b"},
- {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11"},
- {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f"},
- {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd"},
- {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2"},
- {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886"},
- {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601"},
- {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd"},
- {file = "charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407"},
- {file = "charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971"},
- {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f30bf9fd9be89ecb2360c7d94a711f00c09b976258846efe40db3d05828e8089"},
- {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:97f68b8d6831127e4787ad15e6757232e14e12060bec17091b85eb1486b91d8d"},
- {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7974a0b5ecd505609e3b19742b60cee7aa2aa2fb3151bc917e6e2646d7667dcf"},
- {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc54db6c8593ef7d4b2a331b58653356cf04f67c960f584edb7c3d8c97e8f39e"},
- {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:311f30128d7d333eebd7896965bfcfbd0065f1716ec92bd5638d7748eb6f936a"},
- {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:7d053096f67cd1241601111b698f5cad775f97ab25d81567d3f59219b5f1adbd"},
- {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:807f52c1f798eef6cf26beb819eeb8819b1622ddfeef9d0977a8502d4db6d534"},
- {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:dccbe65bd2f7f7ec22c4ff99ed56faa1e9f785482b9bbd7c717e26fd723a1d1e"},
- {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:2fb9bd477fdea8684f78791a6de97a953c51831ee2981f8e4f583ff3b9d9687e"},
- {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:01732659ba9b5b873fc117534143e4feefecf3b2078b0a6a2e925271bb6f4cfa"},
- {file = "charset_normalizer-3.4.1-cp37-cp37m-win32.whl", hash = "sha256:7a4f97a081603d2050bfaffdefa5b02a9ec823f8348a572e39032caa8404a487"},
- {file = "charset_normalizer-3.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:7b1bef6280950ee6c177b326508f86cad7ad4dff12454483b51d8b7d673a2c5d"},
- {file = "charset_normalizer-3.4.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ecddf25bee22fe4fe3737a399d0d177d72bc22be6913acfab364b40bce1ba83c"},
- {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c60ca7339acd497a55b0ea5d506b2a2612afb2826560416f6894e8b5770d4a9"},
- {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b7b2d86dd06bfc2ade3312a83a5c364c7ec2e3498f8734282c6c3d4b07b346b8"},
- {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dd78cfcda14a1ef52584dbb008f7ac81c1328c0f58184bf9a84c49c605002da6"},
- {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e27f48bcd0957c6d4cb9d6fa6b61d192d0b13d5ef563e5f2ae35feafc0d179c"},
- {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01ad647cdd609225c5350561d084b42ddf732f4eeefe6e678765636791e78b9a"},
- {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:619a609aa74ae43d90ed2e89bdd784765de0a25ca761b93e196d938b8fd1dbbd"},
- {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:89149166622f4db9b4b6a449256291dc87a99ee53151c74cbd82a53c8c2f6ccd"},
- {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:7709f51f5f7c853f0fb938bcd3bc59cdfdc5203635ffd18bf354f6967ea0f824"},
- {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:345b0426edd4e18138d6528aed636de7a9ed169b4aaf9d61a8c19e39d26838ca"},
- {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0907f11d019260cdc3f94fbdb23ff9125f6b5d1039b76003b5b0ac9d6a6c9d5b"},
- {file = "charset_normalizer-3.4.1-cp38-cp38-win32.whl", hash = "sha256:ea0d8d539afa5eb2728aa1932a988a9a7af94f18582ffae4bc10b3fbdad0626e"},
- {file = "charset_normalizer-3.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:329ce159e82018d646c7ac45b01a430369d526569ec08516081727a20e9e4af4"},
- {file = "charset_normalizer-3.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b97e690a2118911e39b4042088092771b4ae3fc3aa86518f84b8cf6888dbdb41"},
- {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78baa6d91634dfb69ec52a463534bc0df05dbd546209b79a3880a34487f4b84f"},
- {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1a2bc9f351a75ef49d664206d51f8e5ede9da246602dc2d2726837620ea034b2"},
- {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75832c08354f595c760a804588b9357d34ec00ba1c940c15e31e96d902093770"},
- {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0af291f4fe114be0280cdd29d533696a77b5b49cfde5467176ecab32353395c4"},
- {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0167ddc8ab6508fe81860a57dd472b2ef4060e8d378f0cc555707126830f2537"},
- {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2a75d49014d118e4198bcee5ee0a6f25856b29b12dbf7cd012791f8a6cc5c496"},
- {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:363e2f92b0f0174b2f8238240a1a30142e3db7b957a5dd5689b0e75fb717cc78"},
- {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ab36c8eb7e454e34e60eb55ca5d241a5d18b2c6244f6827a30e451c42410b5f7"},
- {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:4c0907b1928a36d5a998d72d64d8eaa7244989f7aaaf947500d3a800c83a3fd6"},
- {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:04432ad9479fa40ec0f387795ddad4437a2b50417c69fa275e212933519ff294"},
- {file = "charset_normalizer-3.4.1-cp39-cp39-win32.whl", hash = "sha256:3bed14e9c89dcb10e8f3a29f9ccac4955aebe93c71ae803af79265c9ca5644c5"},
- {file = "charset_normalizer-3.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:49402233c892a461407c512a19435d1ce275543138294f7ef013f0b63d5d3765"},
- {file = "charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85"},
- {file = "charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3"},
-]
-
-[[package]]
-name = "click"
-version = "8.1.8"
-description = "Composable command line interface toolkit"
-optional = false
-python-versions = ">=3.7"
-groups = ["main", "dev"]
-files = [
- {file = "click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2"},
- {file = "click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a"},
-]
-
-[package.dependencies]
-colorama = {version = "*", markers = "platform_system == \"Windows\""}
-
-[[package]]
-name = "colorama"
-version = "0.4.6"
-description = "Cross-platform colored terminal text."
-optional = false
-python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7"
-groups = ["main", "dev", "docs"]
-files = [
- {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"},
- {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"},
-]
-markers = {main = "platform_system == \"Windows\" or sys_platform == \"win32\"", dev = "platform_system == \"Windows\" or sys_platform == \"win32\"", docs = "sys_platform == \"win32\""}
-
-[[package]]
-name = "contourpy"
-version = "1.3.1"
-description = "Python library for calculating contours of 2D quadrilateral grids"
-optional = false
-python-versions = ">=3.10"
-groups = ["main"]
-files = [
- {file = "contourpy-1.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a045f341a77b77e1c5de31e74e966537bba9f3c4099b35bf4c2e3939dd54cdab"},
- {file = "contourpy-1.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:500360b77259914f7805af7462e41f9cb7ca92ad38e9f94d6c8641b089338124"},
- {file = "contourpy-1.3.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2f926efda994cdf3c8d3fdb40b9962f86edbc4457e739277b961eced3d0b4c1"},
- {file = "contourpy-1.3.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:adce39d67c0edf383647a3a007de0a45fd1b08dedaa5318404f1a73059c2512b"},
- {file = "contourpy-1.3.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:abbb49fb7dac584e5abc6636b7b2a7227111c4f771005853e7d25176daaf8453"},
- {file = "contourpy-1.3.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0cffcbede75c059f535725c1680dfb17b6ba8753f0c74b14e6a9c68c29d7ea3"},
- {file = "contourpy-1.3.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ab29962927945d89d9b293eabd0d59aea28d887d4f3be6c22deaefbb938a7277"},
- {file = "contourpy-1.3.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:974d8145f8ca354498005b5b981165b74a195abfae9a8129df3e56771961d595"},
- {file = "contourpy-1.3.1-cp310-cp310-win32.whl", hash = "sha256:ac4578ac281983f63b400f7fe6c101bedc10651650eef012be1ccffcbacf3697"},
- {file = "contourpy-1.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:174e758c66bbc1c8576992cec9599ce8b6672b741b5d336b5c74e35ac382b18e"},
- {file = "contourpy-1.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3e8b974d8db2c5610fb4e76307e265de0edb655ae8169e8b21f41807ccbeec4b"},
- {file = "contourpy-1.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:20914c8c973f41456337652a6eeca26d2148aa96dd7ac323b74516988bea89fc"},
- {file = "contourpy-1.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19d40d37c1c3a4961b4619dd9d77b12124a453cc3d02bb31a07d58ef684d3d86"},
- {file = "contourpy-1.3.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:113231fe3825ebf6f15eaa8bc1f5b0ddc19d42b733345eae0934cb291beb88b6"},
- {file = "contourpy-1.3.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4dbbc03a40f916a8420e420d63e96a1258d3d1b58cbdfd8d1f07b49fcbd38e85"},
- {file = "contourpy-1.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a04ecd68acbd77fa2d39723ceca4c3197cb2969633836ced1bea14e219d077c"},
- {file = "contourpy-1.3.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c414fc1ed8ee1dbd5da626cf3710c6013d3d27456651d156711fa24f24bd1291"},
- {file = "contourpy-1.3.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:31c1b55c1f34f80557d3830d3dd93ba722ce7e33a0b472cba0ec3b6535684d8f"},
- {file = "contourpy-1.3.1-cp311-cp311-win32.whl", hash = "sha256:f611e628ef06670df83fce17805c344710ca5cde01edfdc72751311da8585375"},
- {file = "contourpy-1.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:b2bdca22a27e35f16794cf585832e542123296b4687f9fd96822db6bae17bfc9"},
- {file = "contourpy-1.3.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:0ffa84be8e0bd33410b17189f7164c3589c229ce5db85798076a3fa136d0e509"},
- {file = "contourpy-1.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:805617228ba7e2cbbfb6c503858e626ab528ac2a32a04a2fe88ffaf6b02c32bc"},
- {file = "contourpy-1.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ade08d343436a94e633db932e7e8407fe7de8083967962b46bdfc1b0ced39454"},
- {file = "contourpy-1.3.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:47734d7073fb4590b4a40122b35917cd77be5722d80683b249dac1de266aac80"},
- {file = "contourpy-1.3.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2ba94a401342fc0f8b948e57d977557fbf4d515f03c67682dd5c6191cb2d16ec"},
- {file = "contourpy-1.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efa874e87e4a647fd2e4f514d5e91c7d493697127beb95e77d2f7561f6905bd9"},
- {file = "contourpy-1.3.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1bf98051f1045b15c87868dbaea84f92408337d4f81d0e449ee41920ea121d3b"},
- {file = "contourpy-1.3.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:61332c87493b00091423e747ea78200659dc09bdf7fd69edd5e98cef5d3e9a8d"},
- {file = "contourpy-1.3.1-cp312-cp312-win32.whl", hash = "sha256:e914a8cb05ce5c809dd0fe350cfbb4e881bde5e2a38dc04e3afe1b3e58bd158e"},
- {file = "contourpy-1.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:08d9d449a61cf53033612cb368f3a1b26cd7835d9b8cd326647efe43bca7568d"},
- {file = "contourpy-1.3.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a761d9ccfc5e2ecd1bf05534eda382aa14c3e4f9205ba5b1684ecfe400716ef2"},
- {file = "contourpy-1.3.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:523a8ee12edfa36f6d2a49407f705a6ef4c5098de4f498619787e272de93f2d5"},
- {file = "contourpy-1.3.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece6df05e2c41bd46776fbc712e0996f7c94e0d0543af1656956d150c4ca7c81"},
- {file = "contourpy-1.3.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:573abb30e0e05bf31ed067d2f82500ecfdaec15627a59d63ea2d95714790f5c2"},
- {file = "contourpy-1.3.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9fa36448e6a3a1a9a2ba23c02012c43ed88905ec80163f2ffe2421c7192a5d7"},
- {file = "contourpy-1.3.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ea9924d28fc5586bf0b42d15f590b10c224117e74409dd7a0be3b62b74a501c"},
- {file = "contourpy-1.3.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5b75aa69cb4d6f137b36f7eb2ace9280cfb60c55dc5f61c731fdf6f037f958a3"},
- {file = "contourpy-1.3.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:041b640d4ec01922083645a94bb3b2e777e6b626788f4095cf21abbe266413c1"},
- {file = "contourpy-1.3.1-cp313-cp313-win32.whl", hash = "sha256:36987a15e8ace5f58d4d5da9dca82d498c2bbb28dff6e5d04fbfcc35a9cb3a82"},
- {file = "contourpy-1.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:a7895f46d47671fa7ceec40f31fae721da51ad34bdca0bee83e38870b1f47ffd"},
- {file = "contourpy-1.3.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:9ddeb796389dadcd884c7eb07bd14ef12408aaae358f0e2ae24114d797eede30"},
- {file = "contourpy-1.3.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:19c1555a6801c2f084c7ddc1c6e11f02eb6a6016ca1318dd5452ba3f613a1751"},
- {file = "contourpy-1.3.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:841ad858cff65c2c04bf93875e384ccb82b654574a6d7f30453a04f04af71342"},
- {file = "contourpy-1.3.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4318af1c925fb9a4fb190559ef3eec206845f63e80fb603d47f2d6d67683901c"},
- {file = "contourpy-1.3.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:14c102b0eab282427b662cb590f2e9340a9d91a1c297f48729431f2dcd16e14f"},
- {file = "contourpy-1.3.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05e806338bfeaa006acbdeba0ad681a10be63b26e1b17317bfac3c5d98f36cda"},
- {file = "contourpy-1.3.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4d76d5993a34ef3df5181ba3c92fabb93f1eaa5729504fb03423fcd9f3177242"},
- {file = "contourpy-1.3.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:89785bb2a1980c1bd87f0cb1517a71cde374776a5f150936b82580ae6ead44a1"},
- {file = "contourpy-1.3.1-cp313-cp313t-win32.whl", hash = "sha256:8eb96e79b9f3dcadbad2a3891672f81cdcab7f95b27f28f1c67d75f045b6b4f1"},
- {file = "contourpy-1.3.1-cp313-cp313t-win_amd64.whl", hash = "sha256:287ccc248c9e0d0566934e7d606201abd74761b5703d804ff3df8935f523d546"},
- {file = "contourpy-1.3.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b457d6430833cee8e4b8e9b6f07aa1c161e5e0d52e118dc102c8f9bd7dd060d6"},
- {file = "contourpy-1.3.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb76c1a154b83991a3cbbf0dfeb26ec2833ad56f95540b442c73950af2013750"},
- {file = "contourpy-1.3.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:44a29502ca9c7b5ba389e620d44f2fbe792b1fb5734e8b931ad307071ec58c53"},
- {file = "contourpy-1.3.1.tar.gz", hash = "sha256:dfd97abd83335045a913e3bcc4a09c0ceadbe66580cf573fe961f4a825efa699"},
-]
-
-[package.dependencies]
-numpy = ">=1.23"
-
-[package.extras]
-bokeh = ["bokeh", "selenium"]
-docs = ["furo", "sphinx (>=7.2)", "sphinx-copybutton"]
-mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.11.1)", "types-Pillow"]
-test = ["Pillow", "contourpy[test-no-images]", "matplotlib"]
-test-no-images = ["pytest", "pytest-cov", "pytest-rerunfailures", "pytest-xdist", "wurlitzer"]
-
-[[package]]
-name = "coverage"
-version = "7.8.0"
-description = "Code coverage measurement for Python"
-optional = false
-python-versions = ">=3.9"
-groups = ["dev"]
-files = [
- {file = "coverage-7.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2931f66991175369859b5fd58529cd4b73582461877ecfd859b6549869287ffe"},
- {file = "coverage-7.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:52a523153c568d2c0ef8826f6cc23031dc86cffb8c6aeab92c4ff776e7951b28"},
- {file = "coverage-7.8.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c8a5c139aae4c35cbd7cadca1df02ea8cf28a911534fc1b0456acb0b14234f3"},
- {file = "coverage-7.8.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5a26c0c795c3e0b63ec7da6efded5f0bc856d7c0b24b2ac84b4d1d7bc578d676"},
- {file = "coverage-7.8.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:821f7bcbaa84318287115d54becb1915eece6918136c6f91045bb84e2f88739d"},
- {file = "coverage-7.8.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a321c61477ff8ee705b8a5fed370b5710c56b3a52d17b983d9215861e37b642a"},
- {file = "coverage-7.8.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:ed2144b8a78f9d94d9515963ed273d620e07846acd5d4b0a642d4849e8d91a0c"},
- {file = "coverage-7.8.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:042e7841a26498fff7a37d6fda770d17519982f5b7d8bf5278d140b67b61095f"},
- {file = "coverage-7.8.0-cp310-cp310-win32.whl", hash = "sha256:f9983d01d7705b2d1f7a95e10bbe4091fabc03a46881a256c2787637b087003f"},
- {file = "coverage-7.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:5a570cd9bd20b85d1a0d7b009aaf6c110b52b5755c17be6962f8ccd65d1dbd23"},
- {file = "coverage-7.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e7ac22a0bb2c7c49f441f7a6d46c9c80d96e56f5a8bc6972529ed43c8b694e27"},
- {file = "coverage-7.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bf13d564d310c156d1c8e53877baf2993fb3073b2fc9f69790ca6a732eb4bfea"},
- {file = "coverage-7.8.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5761c70c017c1b0d21b0815a920ffb94a670c8d5d409d9b38857874c21f70d7"},
- {file = "coverage-7.8.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5ff52d790c7e1628241ffbcaeb33e07d14b007b6eb00a19320c7b8a7024c040"},
- {file = "coverage-7.8.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d39fc4817fd67b3915256af5dda75fd4ee10621a3d484524487e33416c6f3543"},
- {file = "coverage-7.8.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b44674870709017e4b4036e3d0d6c17f06a0e6d4436422e0ad29b882c40697d2"},
- {file = "coverage-7.8.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8f99eb72bf27cbb167b636eb1726f590c00e1ad375002230607a844d9e9a2318"},
- {file = "coverage-7.8.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b571bf5341ba8c6bc02e0baeaf3b061ab993bf372d982ae509807e7f112554e9"},
- {file = "coverage-7.8.0-cp311-cp311-win32.whl", hash = "sha256:e75a2ad7b647fd8046d58c3132d7eaf31b12d8a53c0e4b21fa9c4d23d6ee6d3c"},
- {file = "coverage-7.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:3043ba1c88b2139126fc72cb48574b90e2e0546d4c78b5299317f61b7f718b78"},
- {file = "coverage-7.8.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:bbb5cc845a0292e0c520656d19d7ce40e18d0e19b22cb3e0409135a575bf79fc"},
- {file = "coverage-7.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4dfd9a93db9e78666d178d4f08a5408aa3f2474ad4d0e0378ed5f2ef71640cb6"},
- {file = "coverage-7.8.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f017a61399f13aa6d1039f75cd467be388d157cd81f1a119b9d9a68ba6f2830d"},
- {file = "coverage-7.8.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0915742f4c82208ebf47a2b154a5334155ed9ef9fe6190674b8a46c2fb89cb05"},
- {file = "coverage-7.8.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a40fcf208e021eb14b0fac6bdb045c0e0cab53105f93ba0d03fd934c956143a"},
- {file = "coverage-7.8.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a1f406a8e0995d654b2ad87c62caf6befa767885301f3b8f6f73e6f3c31ec3a6"},
- {file = "coverage-7.8.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:77af0f6447a582fdc7de5e06fa3757a3ef87769fbb0fdbdeba78c23049140a47"},
- {file = "coverage-7.8.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f2d32f95922927186c6dbc8bc60df0d186b6edb828d299ab10898ef3f40052fe"},
- {file = "coverage-7.8.0-cp312-cp312-win32.whl", hash = "sha256:769773614e676f9d8e8a0980dd7740f09a6ea386d0f383db6821df07d0f08545"},
- {file = "coverage-7.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:e5d2b9be5b0693cf21eb4ce0ec8d211efb43966f6657807f6859aab3814f946b"},
- {file = "coverage-7.8.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5ac46d0c2dd5820ce93943a501ac5f6548ea81594777ca585bf002aa8854cacd"},
- {file = "coverage-7.8.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:771eb7587a0563ca5bb6f622b9ed7f9d07bd08900f7589b4febff05f469bea00"},
- {file = "coverage-7.8.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42421e04069fb2cbcbca5a696c4050b84a43b05392679d4068acbe65449b5c64"},
- {file = "coverage-7.8.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:554fec1199d93ab30adaa751db68acec2b41c5602ac944bb19187cb9a41a8067"},
- {file = "coverage-7.8.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5aaeb00761f985007b38cf463b1d160a14a22c34eb3f6a39d9ad6fc27cb73008"},
- {file = "coverage-7.8.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:581a40c7b94921fffd6457ffe532259813fc68eb2bdda60fa8cc343414ce3733"},
- {file = "coverage-7.8.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:f319bae0321bc838e205bf9e5bc28f0a3165f30c203b610f17ab5552cff90323"},
- {file = "coverage-7.8.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:04bfec25a8ef1c5f41f5e7e5c842f6b615599ca8ba8391ec33a9290d9d2db3a3"},
- {file = "coverage-7.8.0-cp313-cp313-win32.whl", hash = "sha256:dd19608788b50eed889e13a5d71d832edc34fc9dfce606f66e8f9f917eef910d"},
- {file = "coverage-7.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:a9abbccd778d98e9c7e85038e35e91e67f5b520776781d9a1e2ee9d400869487"},
- {file = "coverage-7.8.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:18c5ae6d061ad5b3e7eef4363fb27a0576012a7447af48be6c75b88494c6cf25"},
- {file = "coverage-7.8.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:95aa6ae391a22bbbce1b77ddac846c98c5473de0372ba5c463480043a07bff42"},
- {file = "coverage-7.8.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e013b07ba1c748dacc2a80e69a46286ff145935f260eb8c72df7185bf048f502"},
- {file = "coverage-7.8.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d766a4f0e5aa1ba056ec3496243150698dc0481902e2b8559314368717be82b1"},
- {file = "coverage-7.8.0-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad80e6b4a0c3cb6f10f29ae4c60e991f424e6b14219d46f1e7d442b938ee68a4"},
- {file = "coverage-7.8.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b87eb6fc9e1bb8f98892a2458781348fa37e6925f35bb6ceb9d4afd54ba36c73"},
- {file = "coverage-7.8.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:d1ba00ae33be84066cfbe7361d4e04dec78445b2b88bdb734d0d1cbab916025a"},
- {file = "coverage-7.8.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f3c38e4e5ccbdc9198aecc766cedbb134b2d89bf64533973678dfcf07effd883"},
- {file = "coverage-7.8.0-cp313-cp313t-win32.whl", hash = "sha256:379fe315e206b14e21db5240f89dc0774bdd3e25c3c58c2c733c99eca96f1ada"},
- {file = "coverage-7.8.0-cp313-cp313t-win_amd64.whl", hash = "sha256:2e4b6b87bb0c846a9315e3ab4be2d52fac905100565f4b92f02c445c8799e257"},
- {file = "coverage-7.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fa260de59dfb143af06dcf30c2be0b200bed2a73737a8a59248fcb9fa601ef0f"},
- {file = "coverage-7.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:96121edfa4c2dfdda409877ea8608dd01de816a4dc4a0523356067b305e4e17a"},
- {file = "coverage-7.8.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b8af63b9afa1031c0ef05b217faa598f3069148eeee6bb24b79da9012423b82"},
- {file = "coverage-7.8.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:89b1f4af0d4afe495cd4787a68e00f30f1d15939f550e869de90a86efa7e0814"},
- {file = "coverage-7.8.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94ec0be97723ae72d63d3aa41961a0b9a6f5a53ff599813c324548d18e3b9e8c"},
- {file = "coverage-7.8.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8a1d96e780bdb2d0cbb297325711701f7c0b6f89199a57f2049e90064c29f6bd"},
- {file = "coverage-7.8.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:f1d8a2a57b47142b10374902777e798784abf400a004b14f1b0b9eaf1e528ba4"},
- {file = "coverage-7.8.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:cf60dd2696b457b710dd40bf17ad269d5f5457b96442f7f85722bdb16fa6c899"},
- {file = "coverage-7.8.0-cp39-cp39-win32.whl", hash = "sha256:be945402e03de47ba1872cd5236395e0f4ad635526185a930735f66710e1bd3f"},
- {file = "coverage-7.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:90e7fbc6216ecaffa5a880cdc9c77b7418c1dcb166166b78dbc630d07f278cc3"},
- {file = "coverage-7.8.0-pp39.pp310.pp311-none-any.whl", hash = "sha256:b8194fb8e50d556d5849753de991d390c5a1edeeba50f68e3a9253fbd8bf8ccd"},
- {file = "coverage-7.8.0-py3-none-any.whl", hash = "sha256:dbf364b4c5e7bae9250528167dfe40219b62e2d573c854d74be213e1e52069f7"},
- {file = "coverage-7.8.0.tar.gz", hash = "sha256:7a3d62b3b03b4b6fd41a085f3574874cf946cb4604d2b4d3e8dca8cd570ca501"},
-]
-
-[package.extras]
-toml = ["tomli ; python_full_version <= \"3.11.0a6\""]
-
-[[package]]
-name = "cssselect2"
-version = "0.8.0"
-description = "CSS selectors for Python ElementTree"
-optional = false
-python-versions = ">=3.9"
-groups = ["main"]
-files = [
- {file = "cssselect2-0.8.0-py3-none-any.whl", hash = "sha256:46fc70ebc41ced7a32cd42d58b1884d72ade23d21e5a4eaaf022401c13f0e76e"},
- {file = "cssselect2-0.8.0.tar.gz", hash = "sha256:7674ffb954a3b46162392aee2a3a0aedb2e14ecf99fcc28644900f4e6e3e9d3a"},
-]
-
-[package.dependencies]
-tinycss2 = "*"
-webencodings = "*"
-
-[package.extras]
-doc = ["furo", "sphinx"]
-test = ["pytest", "ruff"]
-
-[[package]]
-name = "cycler"
-version = "0.12.1"
-description = "Composable style cycles"
-optional = false
-python-versions = ">=3.8"
-groups = ["main"]
-files = [
- {file = "cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30"},
- {file = "cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c"},
-]
-
-[package.extras]
-docs = ["ipython", "matplotlib", "numpydoc", "sphinx"]
-tests = ["pytest", "pytest-cov", "pytest-xdist"]
-
-[[package]]
-name = "decorator"
-version = "5.2.1"
-description = "Decorators for Humans"
-optional = false
-python-versions = ">=3.8"
-groups = ["main"]
-files = [
- {file = "decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a"},
- {file = "decorator-5.2.1.tar.gz", hash = "sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360"},
-]
-
-[[package]]
-name = "dill"
-version = "0.4.0"
-description = "serialize all of Python"
-optional = false
-python-versions = ">=3.8"
-groups = ["dev"]
-files = [
- {file = "dill-0.4.0-py3-none-any.whl", hash = "sha256:44f54bf6412c2c8464c14e8243eb163690a9800dbe2c367330883b19c7561049"},
- {file = "dill-0.4.0.tar.gz", hash = "sha256:0633f1d2df477324f53a895b02c901fb961bdbf65a17122586ea7019292cbcf0"},
-]
-
-[package.extras]
-graph = ["objgraph (>=1.7.2)"]
-profile = ["gprof2dot (>=2022.7.29)"]
-
-[[package]]
-name = "docutils"
-version = "0.20.1"
-description = "Docutils -- Python Documentation Utilities"
-optional = false
-python-versions = ">=3.7"
-groups = ["docs"]
-files = [
- {file = "docutils-0.20.1-py3-none-any.whl", hash = "sha256:96f387a2c5562db4476f09f13bbab2192e764cac08ebbf3a34a95d9b1e4a59d6"},
- {file = "docutils-0.20.1.tar.gz", hash = "sha256:f08a4e276c3a1583a86dce3e34aba3fe04d02bba2dd51ed16106244e8a923e3b"},
-]
-
-[[package]]
-name = "executing"
-version = "2.2.0"
-description = "Get the currently executing AST node of a frame, and other information"
-optional = false
-python-versions = ">=3.8"
-groups = ["main"]
-files = [
- {file = "executing-2.2.0-py2.py3-none-any.whl", hash = "sha256:11387150cad388d62750327a53d3339fad4888b39a6fe233c3afbb54ecffd3aa"},
- {file = "executing-2.2.0.tar.gz", hash = "sha256:5d108c028108fe2551d1a7b2e8b713341e2cb4fc0aa7dcf966fa4327a5226755"},
-]
-
-[package.extras]
-tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich ; python_version >= \"3.11\""]
-
-[[package]]
-name = "fonttools"
-version = "4.57.0"
-description = "Tools to manipulate font files"
-optional = false
-python-versions = ">=3.8"
-groups = ["main"]
-files = [
- {file = "fonttools-4.57.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:babe8d1eb059a53e560e7bf29f8e8f4accc8b6cfb9b5fd10e485bde77e71ef41"},
- {file = "fonttools-4.57.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:81aa97669cd726349eb7bd43ca540cf418b279ee3caba5e2e295fb4e8f841c02"},
- {file = "fonttools-4.57.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0e9618630edd1910ad4f07f60d77c184b2f572c8ee43305ea3265675cbbfe7e"},
- {file = "fonttools-4.57.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:34687a5d21f1d688d7d8d416cb4c5b9c87fca8a1797ec0d74b9fdebfa55c09ab"},
- {file = "fonttools-4.57.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:69ab81b66ebaa8d430ba56c7a5f9abe0183afefd3a2d6e483060343398b13fb1"},
- {file = "fonttools-4.57.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d639397de852f2ccfb3134b152c741406752640a266d9c1365b0f23d7b88077f"},
- {file = "fonttools-4.57.0-cp310-cp310-win32.whl", hash = "sha256:cc066cb98b912f525ae901a24cd381a656f024f76203bc85f78fcc9e66ae5aec"},
- {file = "fonttools-4.57.0-cp310-cp310-win_amd64.whl", hash = "sha256:7a64edd3ff6a7f711a15bd70b4458611fb240176ec11ad8845ccbab4fe6745db"},
- {file = "fonttools-4.57.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3871349303bdec958360eedb619169a779956503ffb4543bb3e6211e09b647c4"},
- {file = "fonttools-4.57.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c59375e85126b15a90fcba3443eaac58f3073ba091f02410eaa286da9ad80ed8"},
- {file = "fonttools-4.57.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:967b65232e104f4b0f6370a62eb33089e00024f2ce143aecbf9755649421c683"},
- {file = "fonttools-4.57.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39acf68abdfc74e19de7485f8f7396fa4d2418efea239b7061d6ed6a2510c746"},
- {file = "fonttools-4.57.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9d077f909f2343daf4495ba22bb0e23b62886e8ec7c109ee8234bdbd678cf344"},
- {file = "fonttools-4.57.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:46370ac47a1e91895d40e9ad48effbe8e9d9db1a4b80888095bc00e7beaa042f"},
- {file = "fonttools-4.57.0-cp311-cp311-win32.whl", hash = "sha256:ca2aed95855506b7ae94e8f1f6217b7673c929e4f4f1217bcaa236253055cb36"},
- {file = "fonttools-4.57.0-cp311-cp311-win_amd64.whl", hash = "sha256:17168a4670bbe3775f3f3f72d23ee786bd965395381dfbb70111e25e81505b9d"},
- {file = "fonttools-4.57.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:889e45e976c74abc7256d3064aa7c1295aa283c6bb19810b9f8b604dfe5c7f31"},
- {file = "fonttools-4.57.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:0425c2e052a5f1516c94e5855dbda706ae5a768631e9fcc34e57d074d1b65b92"},
- {file = "fonttools-4.57.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:44c26a311be2ac130f40a96769264809d3b0cb297518669db437d1cc82974888"},
- {file = "fonttools-4.57.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84c41ba992df5b8d680b89fd84c6a1f2aca2b9f1ae8a67400c8930cd4ea115f6"},
- {file = "fonttools-4.57.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ea1e9e43ca56b0c12440a7c689b1350066595bebcaa83baad05b8b2675129d98"},
- {file = "fonttools-4.57.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:84fd56c78d431606332a0627c16e2a63d243d0d8b05521257d77c6529abe14d8"},
- {file = "fonttools-4.57.0-cp312-cp312-win32.whl", hash = "sha256:f4376819c1c778d59e0a31db5dc6ede854e9edf28bbfa5b756604727f7f800ac"},
- {file = "fonttools-4.57.0-cp312-cp312-win_amd64.whl", hash = "sha256:57e30241524879ea10cdf79c737037221f77cc126a8cdc8ff2c94d4a522504b9"},
- {file = "fonttools-4.57.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:408ce299696012d503b714778d89aa476f032414ae57e57b42e4b92363e0b8ef"},
- {file = "fonttools-4.57.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:bbceffc80aa02d9e8b99f2a7491ed8c4a783b2fc4020119dc405ca14fb5c758c"},
- {file = "fonttools-4.57.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f022601f3ee9e1f6658ed6d184ce27fa5216cee5b82d279e0f0bde5deebece72"},
- {file = "fonttools-4.57.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4dea5893b58d4637ffa925536462ba626f8a1b9ffbe2f5c272cdf2c6ebadb817"},
- {file = "fonttools-4.57.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:dff02c5c8423a657c550b48231d0a48d7e2b2e131088e55983cfe74ccc2c7cc9"},
- {file = "fonttools-4.57.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:767604f244dc17c68d3e2dbf98e038d11a18abc078f2d0f84b6c24571d9c0b13"},
- {file = "fonttools-4.57.0-cp313-cp313-win32.whl", hash = "sha256:8e2e12d0d862f43d51e5afb8b9751c77e6bec7d2dc00aad80641364e9df5b199"},
- {file = "fonttools-4.57.0-cp313-cp313-win_amd64.whl", hash = "sha256:f1d6bc9c23356908db712d282acb3eebd4ae5ec6d8b696aa40342b1d84f8e9e3"},
- {file = "fonttools-4.57.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:9d57b4e23ebbe985125d3f0cabbf286efa191ab60bbadb9326091050d88e8213"},
- {file = "fonttools-4.57.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:579ba873d7f2a96f78b2e11028f7472146ae181cae0e4d814a37a09e93d5c5cc"},
- {file = "fonttools-4.57.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e3e1ec10c29bae0ea826b61f265ec5c858c5ba2ce2e69a71a62f285cf8e4595"},
- {file = "fonttools-4.57.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1968f2a2003c97c4ce6308dc2498d5fd4364ad309900930aa5a503c9851aec8"},
- {file = "fonttools-4.57.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:aff40f8ac6763d05c2c8f6d240c6dac4bb92640a86d9b0c3f3fff4404f34095c"},
- {file = "fonttools-4.57.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:d07f1b64008e39fceae7aa99e38df8385d7d24a474a8c9872645c4397b674481"},
- {file = "fonttools-4.57.0-cp38-cp38-win32.whl", hash = "sha256:51d8482e96b28fb28aa8e50b5706f3cee06de85cbe2dce80dbd1917ae22ec5a6"},
- {file = "fonttools-4.57.0-cp38-cp38-win_amd64.whl", hash = "sha256:03290e818782e7edb159474144fca11e36a8ed6663d1fcbd5268eb550594fd8e"},
- {file = "fonttools-4.57.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7339e6a3283e4b0ade99cade51e97cde3d54cd6d1c3744459e886b66d630c8b3"},
- {file = "fonttools-4.57.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:05efceb2cb5f6ec92a4180fcb7a64aa8d3385fd49cfbbe459350229d1974f0b1"},
- {file = "fonttools-4.57.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a97bb05eb24637714a04dee85bdf0ad1941df64fe3b802ee4ac1c284a5f97b7c"},
- {file = "fonttools-4.57.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:541cb48191a19ceb1a2a4b90c1fcebd22a1ff7491010d3cf840dd3a68aebd654"},
- {file = "fonttools-4.57.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:cdef9a056c222d0479a1fdb721430f9efd68268014c54e8166133d2643cb05d9"},
- {file = "fonttools-4.57.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:3cf97236b192a50a4bf200dc5ba405aa78d4f537a2c6e4c624bb60466d5b03bd"},
- {file = "fonttools-4.57.0-cp39-cp39-win32.whl", hash = "sha256:e952c684274a7714b3160f57ec1d78309f955c6335c04433f07d36c5eb27b1f9"},
- {file = "fonttools-4.57.0-cp39-cp39-win_amd64.whl", hash = "sha256:a2a722c0e4bfd9966a11ff55c895c817158fcce1b2b6700205a376403b546ad9"},
- {file = "fonttools-4.57.0-py3-none-any.whl", hash = "sha256:3122c604a675513c68bd24c6a8f9091f1c2376d18e8f5fe5a101746c81b3e98f"},
- {file = "fonttools-4.57.0.tar.gz", hash = "sha256:727ece10e065be2f9dd239d15dd5d60a66e17eac11aea47d447f9f03fdbc42de"},
-]
-
-[package.dependencies]
-brotli = {version = ">=1.0.1", optional = true, markers = "platform_python_implementation == \"CPython\" and extra == \"woff\""}
-brotlicffi = {version = ">=0.8.0", optional = true, markers = "platform_python_implementation != \"CPython\" and extra == \"woff\""}
-zopfli = {version = ">=0.1.4", optional = true, markers = "extra == \"woff\""}
-
-[package.extras]
-all = ["brotli (>=1.0.1) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\"", "fs (>=2.2.0,<3)", "lxml (>=4.0)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres ; platform_python_implementation == \"PyPy\"", "pycairo", "scipy ; platform_python_implementation != \"PyPy\"", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0) ; python_version <= \"3.12\"", "xattr ; sys_platform == \"darwin\"", "zopfli (>=0.1.4)"]
-graphite = ["lz4 (>=1.7.4.2)"]
-interpolatable = ["munkres ; platform_python_implementation == \"PyPy\"", "pycairo", "scipy ; platform_python_implementation != \"PyPy\""]
-lxml = ["lxml (>=4.0)"]
-pathops = ["skia-pathops (>=0.5.0)"]
-plot = ["matplotlib"]
-repacker = ["uharfbuzz (>=0.23.0)"]
-symfont = ["sympy"]
-type1 = ["xattr ; sys_platform == \"darwin\""]
-ufo = ["fs (>=2.2.0,<3)"]
-unicode = ["unicodedata2 (>=15.1.0) ; python_version <= \"3.12\""]
-woff = ["brotli (>=1.0.1) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\"", "zopfli (>=0.1.4)"]
-
-[[package]]
-name = "frozendict"
-version = "2.4.6"
-description = "A simple immutable dictionary"
-optional = false
-python-versions = ">=3.6"
-groups = ["main"]
-files = [
- {file = "frozendict-2.4.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c3a05c0a50cab96b4bb0ea25aa752efbfceed5ccb24c007612bc63e51299336f"},
- {file = "frozendict-2.4.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f5b94d5b07c00986f9e37a38dd83c13f5fe3bf3f1ccc8e88edea8fe15d6cd88c"},
- {file = "frozendict-2.4.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4c789fd70879ccb6289a603cdebdc4953e7e5dea047d30c1b180529b28257b5"},
- {file = "frozendict-2.4.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da6a10164c8a50b34b9ab508a9420df38f4edf286b9ca7b7df8a91767baecb34"},
- {file = "frozendict-2.4.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:9a8a43036754a941601635ea9c788ebd7a7efbed2becba01b54a887b41b175b9"},
- {file = "frozendict-2.4.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c9905dcf7aa659e6a11b8051114c9fa76dfde3a6e50e6dc129d5aece75b449a2"},
- {file = "frozendict-2.4.6-cp310-cp310-win_amd64.whl", hash = "sha256:323f1b674a2cc18f86ab81698e22aba8145d7a755e0ac2cccf142ee2db58620d"},
- {file = "frozendict-2.4.6-cp310-cp310-win_arm64.whl", hash = "sha256:eabd21d8e5db0c58b60d26b4bb9839cac13132e88277e1376970172a85ee04b3"},
- {file = "frozendict-2.4.6-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:eddabeb769fab1e122d3a6872982c78179b5bcc909fdc769f3cf1964f55a6d20"},
- {file = "frozendict-2.4.6-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:377a65be0a700188fc21e669c07de60f4f6d35fae8071c292b7df04776a1c27b"},
- {file = "frozendict-2.4.6-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce1e9217b85eec6ba9560d520d5089c82dbb15f977906eb345d81459723dd7e3"},
- {file = "frozendict-2.4.6-cp36-cp36m-musllinux_1_2_aarch64.whl", hash = "sha256:7291abacf51798d5ffe632771a69c14fb423ab98d63c4ccd1aa382619afe2f89"},
- {file = "frozendict-2.4.6-cp36-cp36m-musllinux_1_2_x86_64.whl", hash = "sha256:e72fb86e48811957d66ffb3e95580af7b1af1e6fbd760ad63d7bd79b2c9a07f8"},
- {file = "frozendict-2.4.6-cp36-cp36m-win_amd64.whl", hash = "sha256:622301b1c29c4f9bba633667d592a3a2b093cb408ba3ce578b8901ace3931ef3"},
- {file = "frozendict-2.4.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a4e3737cb99ed03200cd303bdcd5514c9f34b29ee48f405c1184141bd68611c9"},
- {file = "frozendict-2.4.6-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:49ffaf09241bc1417daa19362a2241a4aa435f758fd4375c39ce9790443a39cd"},
- {file = "frozendict-2.4.6-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d69418479bfb834ba75b0e764f058af46ceee3d655deb6a0dd0c0c1a5e82f09"},
- {file = "frozendict-2.4.6-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:c131f10c4d3906866454c4e89b87a7e0027d533cce8f4652aa5255112c4d6677"},
- {file = "frozendict-2.4.6-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:fc67cbb3c96af7a798fab53d52589752c1673027e516b702ab355510ddf6bdff"},
- {file = "frozendict-2.4.6-cp37-cp37m-win_amd64.whl", hash = "sha256:7730f8ebe791d147a1586cbf6a42629351d4597773317002181b66a2da0d509e"},
- {file = "frozendict-2.4.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:807862e14b0e9665042458fde692c4431d660c4219b9bb240817f5b918182222"},
- {file = "frozendict-2.4.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9647c74efe3d845faa666d4853cfeabbaee403b53270cabfc635b321f770e6b8"},
- {file = "frozendict-2.4.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:665fad3f0f815aa41294e561d98dbedba4b483b3968e7e8cab7d728d64b96e33"},
- {file = "frozendict-2.4.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f42e6b75254ea2afe428ad6d095b62f95a7ae6d4f8272f0bd44a25dddd20f67"},
- {file = "frozendict-2.4.6-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:02331541611f3897f260900a1815b63389654951126e6e65545e529b63c08361"},
- {file = "frozendict-2.4.6-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:18d50a2598350b89189da9150058191f55057581e40533e470db46c942373acf"},
- {file = "frozendict-2.4.6-cp38-cp38-win_amd64.whl", hash = "sha256:1b4a3f8f6dd51bee74a50995c39b5a606b612847862203dd5483b9cd91b0d36a"},
- {file = "frozendict-2.4.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a76cee5c4be2a5d1ff063188232fffcce05dde6fd5edd6afe7b75b247526490e"},
- {file = "frozendict-2.4.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ba5ef7328706db857a2bdb2c2a17b4cd37c32a19c017cff1bb7eeebc86b0f411"},
- {file = "frozendict-2.4.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:669237c571856be575eca28a69e92a3d18f8490511eff184937283dc6093bd67"},
- {file = "frozendict-2.4.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0aaa11e7c472150efe65adbcd6c17ac0f586896096ab3963775e1c5c58ac0098"},
- {file = "frozendict-2.4.6-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:b8f2829048f29fe115da4a60409be2130e69402e29029339663fac39c90e6e2b"},
- {file = "frozendict-2.4.6-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:94321e646cc39bebc66954a31edd1847d3a2a3483cf52ff051cd0996e7db07db"},
- {file = "frozendict-2.4.6-cp39-cp39-win_amd64.whl", hash = "sha256:74b6b26c15dddfefddeb89813e455b00ebf78d0a3662b89506b4d55c6445a9f4"},
- {file = "frozendict-2.4.6-cp39-cp39-win_arm64.whl", hash = "sha256:7088102345d1606450bd1801a61139bbaa2cb0d805b9b692f8d81918ea835da6"},
- {file = "frozendict-2.4.6-py311-none-any.whl", hash = "sha256:d065db6a44db2e2375c23eac816f1a022feb2fa98cbb50df44a9e83700accbea"},
- {file = "frozendict-2.4.6-py312-none-any.whl", hash = "sha256:49344abe90fb75f0f9fdefe6d4ef6d4894e640fadab71f11009d52ad97f370b9"},
- {file = "frozendict-2.4.6-py313-none-any.whl", hash = "sha256:7134a2bb95d4a16556bb5f2b9736dceb6ea848fa5b6f3f6c2d6dba93b44b4757"},
- {file = "frozendict-2.4.6.tar.gz", hash = "sha256:df7cd16470fbd26fc4969a208efadc46319334eb97def1ddf48919b351192b8e"},
-]
-
-[[package]]
-name = "greenlet"
-version = "3.1.1"
-description = "Lightweight in-process concurrent programming"
-optional = false
-python-versions = ">=3.7"
-groups = ["main"]
-markers = "python_version < \"3.14\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\")"
-files = [
- {file = "greenlet-3.1.1-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:0bbae94a29c9e5c7e4a2b7f0aae5c17e8e90acbfd3bf6270eeba60c39fce3563"},
- {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fde093fb93f35ca72a556cf72c92ea3ebfda3d79fc35bb19fbe685853869a83"},
- {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:36b89d13c49216cadb828db8dfa6ce86bbbc476a82d3a6c397f0efae0525bdd0"},
- {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:94b6150a85e1b33b40b1464a3f9988dcc5251d6ed06842abff82e42632fac120"},
- {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93147c513fac16385d1036b7e5b102c7fbbdb163d556b791f0f11eada7ba65dc"},
- {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:da7a9bff22ce038e19bf62c4dd1ec8391062878710ded0a845bcf47cc0200617"},
- {file = "greenlet-3.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b2795058c23988728eec1f36a4e5e4ebad22f8320c85f3587b539b9ac84128d7"},
- {file = "greenlet-3.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ed10eac5830befbdd0c32f83e8aa6288361597550ba669b04c48f0f9a2c843c6"},
- {file = "greenlet-3.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:77c386de38a60d1dfb8e55b8c1101d68c79dfdd25c7095d51fec2dd800892b80"},
- {file = "greenlet-3.1.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:e4d333e558953648ca09d64f13e6d8f0523fa705f51cae3f03b5983489958c70"},
- {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09fc016b73c94e98e29af67ab7b9a879c307c6731a2c9da0db5a7d9b7edd1159"},
- {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d5e975ca70269d66d17dd995dafc06f1b06e8cb1ec1e9ed54c1d1e4a7c4cf26e"},
- {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b2813dc3de8c1ee3f924e4d4227999285fd335d1bcc0d2be6dc3f1f6a318ec1"},
- {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e347b3bfcf985a05e8c0b7d462ba6f15b1ee1c909e2dcad795e49e91b152c383"},
- {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e8f8c9cb53cdac7ba9793c276acd90168f416b9ce36799b9b885790f8ad6c0a"},
- {file = "greenlet-3.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:62ee94988d6b4722ce0028644418d93a52429e977d742ca2ccbe1c4f4a792511"},
- {file = "greenlet-3.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1776fd7f989fc6b8d8c8cb8da1f6b82c5814957264d1f6cf818d475ec2bf6395"},
- {file = "greenlet-3.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:48ca08c771c268a768087b408658e216133aecd835c0ded47ce955381105ba39"},
- {file = "greenlet-3.1.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:4afe7ea89de619adc868e087b4d2359282058479d7cfb94970adf4b55284574d"},
- {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f406b22b7c9a9b4f8aa9d2ab13d6ae0ac3e85c9a809bd590ad53fed2bf70dc79"},
- {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c3a701fe5a9695b238503ce5bbe8218e03c3bcccf7e204e455e7462d770268aa"},
- {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2846930c65b47d70b9d178e89c7e1a69c95c1f68ea5aa0a58646b7a96df12441"},
- {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99cfaa2110534e2cf3ba31a7abcac9d328d1d9f1b95beede58294a60348fba36"},
- {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1443279c19fca463fc33e65ef2a935a5b09bb90f978beab37729e1c3c6c25fe9"},
- {file = "greenlet-3.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b7cede291382a78f7bb5f04a529cb18e068dd29e0fb27376074b6d0317bf4dd0"},
- {file = "greenlet-3.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:23f20bb60ae298d7d8656c6ec6db134bca379ecefadb0b19ce6f19d1f232a942"},
- {file = "greenlet-3.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:7124e16b4c55d417577c2077be379514321916d5790fa287c9ed6f23bd2ffd01"},
- {file = "greenlet-3.1.1-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:05175c27cb459dcfc05d026c4232f9de8913ed006d42713cb8a5137bd49375f1"},
- {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:935e943ec47c4afab8965954bf49bfa639c05d4ccf9ef6e924188f762145c0ff"},
- {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:667a9706c970cb552ede35aee17339a18e8f2a87a51fba2ed39ceeeb1004798a"},
- {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b8a678974d1f3aa55f6cc34dc480169d58f2e6d8958895d68845fa4ab566509e"},
- {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efc0f674aa41b92da8c49e0346318c6075d734994c3c4e4430b1c3f853e498e4"},
- {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0153404a4bb921f0ff1abeb5ce8a5131da56b953eda6e14b88dc6bbc04d2049e"},
- {file = "greenlet-3.1.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:275f72decf9932639c1c6dd1013a1bc266438eb32710016a1c742df5da6e60a1"},
- {file = "greenlet-3.1.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:c4aab7f6381f38a4b42f269057aee279ab0fc7bf2e929e3d4abfae97b682a12c"},
- {file = "greenlet-3.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:b42703b1cf69f2aa1df7d1030b9d77d3e584a70755674d60e710f0af570f3761"},
- {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1695e76146579f8c06c1509c7ce4dfe0706f49c6831a817ac04eebb2fd02011"},
- {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7876452af029456b3f3549b696bb36a06db7c90747740c5302f74a9e9fa14b13"},
- {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4ead44c85f8ab905852d3de8d86f6f8baf77109f9da589cb4fa142bd3b57b475"},
- {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8320f64b777d00dd7ccdade271eaf0cad6636343293a25074cc5566160e4de7b"},
- {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6510bf84a6b643dabba74d3049ead221257603a253d0a9873f55f6a59a65f822"},
- {file = "greenlet-3.1.1-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:04b013dc07c96f83134b1e99888e7a79979f1a247e2a9f59697fa14b5862ed01"},
- {file = "greenlet-3.1.1-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:411f015496fec93c1c8cd4e5238da364e1da7a124bcb293f085bf2860c32c6f6"},
- {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:47da355d8687fd65240c364c90a31569a133b7b60de111c255ef5b606f2ae291"},
- {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:98884ecf2ffb7d7fe6bd517e8eb99d31ff7855a840fa6d0d63cd07c037f6a981"},
- {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f1d4aeb8891338e60d1ab6127af1fe45def5259def8094b9c7e34690c8858803"},
- {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db32b5348615a04b82240cc67983cb315309e88d444a288934ee6ceaebcad6cc"},
- {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dcc62f31eae24de7f8dce72134c8651c58000d3b1868e01392baea7c32c247de"},
- {file = "greenlet-3.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1d3755bcb2e02de341c55b4fca7a745a24a9e7212ac953f6b3a48d117d7257aa"},
- {file = "greenlet-3.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:b8da394b34370874b4572676f36acabac172602abf054cbc4ac910219f3340af"},
- {file = "greenlet-3.1.1-cp37-cp37m-win32.whl", hash = "sha256:a0dfc6c143b519113354e780a50381508139b07d2177cb6ad6a08278ec655798"},
- {file = "greenlet-3.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:54558ea205654b50c438029505def3834e80f0869a70fb15b871c29b4575ddef"},
- {file = "greenlet-3.1.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:346bed03fe47414091be4ad44786d1bd8bef0c3fcad6ed3dee074a032ab408a9"},
- {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfc59d69fc48664bc693842bd57acfdd490acafda1ab52c7836e3fc75c90a111"},
- {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d21e10da6ec19b457b82636209cbe2331ff4306b54d06fa04b7c138ba18c8a81"},
- {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:37b9de5a96111fc15418819ab4c4432e4f3c2ede61e660b1e33971eba26ef9ba"},
- {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ef9ea3f137e5711f0dbe5f9263e8c009b7069d8a1acea822bd5e9dae0ae49c8"},
- {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:85f3ff71e2e60bd4b4932a043fbbe0f499e263c628390b285cb599154a3b03b1"},
- {file = "greenlet-3.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:95ffcf719966dd7c453f908e208e14cde192e09fde6c7186c8f1896ef778d8cd"},
- {file = "greenlet-3.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:03a088b9de532cbfe2ba2034b2b85e82df37874681e8c470d6fb2f8c04d7e4b7"},
- {file = "greenlet-3.1.1-cp38-cp38-win32.whl", hash = "sha256:8b8b36671f10ba80e159378df9c4f15c14098c4fd73a36b9ad715f057272fbef"},
- {file = "greenlet-3.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:7017b2be767b9d43cc31416aba48aab0d2309ee31b4dbf10a1d38fb7972bdf9d"},
- {file = "greenlet-3.1.1-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:396979749bd95f018296af156201d6211240e7a23090f50a8d5d18c370084dc3"},
- {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca9d0ff5ad43e785350894d97e13633a66e2b50000e8a183a50a88d834752d42"},
- {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f6ff3b14f2df4c41660a7dec01045a045653998784bf8cfcb5a525bdffffbc8f"},
- {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:94ebba31df2aa506d7b14866fed00ac141a867e63143fe5bca82a8e503b36437"},
- {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73aaad12ac0ff500f62cebed98d8789198ea0e6f233421059fa68a5aa7220145"},
- {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:63e4844797b975b9af3a3fb8f7866ff08775f5426925e1e0bbcfe7932059a12c"},
- {file = "greenlet-3.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7939aa3ca7d2a1593596e7ac6d59391ff30281ef280d8632fa03d81f7c5f955e"},
- {file = "greenlet-3.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d0028e725ee18175c6e422797c407874da24381ce0690d6b9396c204c7f7276e"},
- {file = "greenlet-3.1.1-cp39-cp39-win32.whl", hash = "sha256:5e06afd14cbaf9e00899fae69b24a32f2196c19de08fcb9f4779dd4f004e5e7c"},
- {file = "greenlet-3.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:3319aa75e0e0639bc15ff54ca327e8dc7a6fe404003496e3c6925cd3142e0e22"},
- {file = "greenlet-3.1.1.tar.gz", hash = "sha256:4ce3ac6cdb6adf7946475d7ef31777c26d94bccc377e070a7986bd2d5c515467"},
-]
-
-[package.extras]
-docs = ["Sphinx", "furo"]
-test = ["objgraph", "psutil"]
-
-[[package]]
-name = "idna"
-version = "3.10"
-description = "Internationalized Domain Names in Applications (IDNA)"
-optional = false
-python-versions = ">=3.6"
-groups = ["main", "docs"]
-files = [
- {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"},
- {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"},
-]
-
-[package.extras]
-all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"]
-
-[[package]]
-name = "imagesize"
-version = "1.4.1"
-description = "Getting image size from png/jpeg/jpeg2000/gif file"
-optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
-groups = ["docs"]
-files = [
- {file = "imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b"},
- {file = "imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a"},
-]
-
-[[package]]
-name = "iniconfig"
-version = "2.1.0"
-description = "brain-dead simple config-ini parsing"
-optional = false
-python-versions = ">=3.8"
-groups = ["dev"]
-files = [
- {file = "iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760"},
- {file = "iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7"},
-]
-
-[[package]]
-name = "ipython"
-version = "9.1.0"
-description = "IPython: Productive Interactive Computing"
-optional = false
-python-versions = ">=3.11"
-groups = ["main"]
-files = [
- {file = "ipython-9.1.0-py3-none-any.whl", hash = "sha256:2df07257ec2f84a6b346b8d83100bcf8fa501c6e01ab75cd3799b0bb253b3d2a"},
- {file = "ipython-9.1.0.tar.gz", hash = "sha256:a47e13a5e05e02f3b8e1e7a0f9db372199fe8c3763532fe7a1e0379e4e135f16"},
-]
-
-[package.dependencies]
-colorama = {version = "*", markers = "sys_platform == \"win32\""}
-decorator = "*"
-ipython-pygments-lexers = "*"
-jedi = ">=0.16"
-matplotlib-inline = "*"
-pexpect = {version = ">4.3", markers = "sys_platform != \"win32\" and sys_platform != \"emscripten\""}
-prompt_toolkit = ">=3.0.41,<3.1.0"
-pygments = ">=2.4.0"
-stack_data = "*"
-traitlets = ">=5.13.0"
-typing_extensions = {version = ">=4.6", markers = "python_version < \"3.12\""}
-
-[package.extras]
-all = ["ipython[doc,matplotlib,test,test-extra]"]
-black = ["black"]
-doc = ["docrepr", "exceptiongroup", "intersphinx_registry", "ipykernel", "ipython[test]", "matplotlib", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "sphinx_toml (==0.0.4)", "typing_extensions"]
-matplotlib = ["matplotlib"]
-test = ["packaging", "pytest", "pytest-asyncio (<0.22)", "testpath"]
-test-extra = ["curio", "ipykernel", "ipython[test]", "jupyter_ai", "matplotlib (!=3.2.0)", "nbclient", "nbformat", "numpy (>=1.23)", "pandas", "trio"]
-
-[[package]]
-name = "ipython-pygments-lexers"
-version = "1.1.1"
-description = "Defines a variety of Pygments lexers for highlighting IPython code."
-optional = false
-python-versions = ">=3.8"
-groups = ["main"]
-files = [
- {file = "ipython_pygments_lexers-1.1.1-py3-none-any.whl", hash = "sha256:a9462224a505ade19a605f71f8fa63c2048833ce50abc86768a0d81d876dc81c"},
- {file = "ipython_pygments_lexers-1.1.1.tar.gz", hash = "sha256:09c0138009e56b6854f9535736f4171d855c8c08a563a0dcd8022f78355c7e81"},
-]
-
-[package.dependencies]
-pygments = "*"
-
-[[package]]
-name = "isort"
-version = "5.13.2"
-description = "A Python utility / library to sort Python imports."
-optional = false
-python-versions = ">=3.8.0"
-groups = ["dev"]
-files = [
- {file = "isort-5.13.2-py3-none-any.whl", hash = "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6"},
- {file = "isort-5.13.2.tar.gz", hash = "sha256:48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109"},
-]
-
-[package.extras]
-colors = ["colorama (>=0.4.6)"]
-
-[[package]]
-name = "jedi"
-version = "0.19.2"
-description = "An autocompletion tool for Python that can be used for text editors."
-optional = false
-python-versions = ">=3.6"
-groups = ["main"]
-files = [
- {file = "jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9"},
- {file = "jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0"},
-]
-
-[package.dependencies]
-parso = ">=0.8.4,<0.9.0"
-
-[package.extras]
-docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"]
-qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"]
-testing = ["Django", "attrs", "colorama", "docopt", "pytest (<9.0.0)"]
-
-[[package]]
-name = "jinja2"
-version = "3.1.6"
-description = "A very fast and expressive template engine."
-optional = false
-python-versions = ">=3.7"
-groups = ["docs"]
-files = [
- {file = "jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67"},
- {file = "jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d"},
-]
-
-[package.dependencies]
-MarkupSafe = ">=2.0"
-
-[package.extras]
-i18n = ["Babel (>=2.7)"]
-
-[[package]]
-name = "kiwisolver"
-version = "1.4.8"
-description = "A fast implementation of the Cassowary constraint solver"
-optional = false
-python-versions = ">=3.10"
-groups = ["main"]
-files = [
- {file = "kiwisolver-1.4.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:88c6f252f6816a73b1f8c904f7bbe02fd67c09a69f7cb8a0eecdbf5ce78e63db"},
- {file = "kiwisolver-1.4.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c72941acb7b67138f35b879bbe85be0f6c6a70cab78fe3ef6db9c024d9223e5b"},
- {file = "kiwisolver-1.4.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ce2cf1e5688edcb727fdf7cd1bbd0b6416758996826a8be1d958f91880d0809d"},
- {file = "kiwisolver-1.4.8-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c8bf637892dc6e6aad2bc6d4d69d08764166e5e3f69d469e55427b6ac001b19d"},
- {file = "kiwisolver-1.4.8-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:034d2c891f76bd3edbdb3ea11140d8510dca675443da7304205a2eaa45d8334c"},
- {file = "kiwisolver-1.4.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d47b28d1dfe0793d5e96bce90835e17edf9a499b53969b03c6c47ea5985844c3"},
- {file = "kiwisolver-1.4.8-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb158fe28ca0c29f2260cca8c43005329ad58452c36f0edf298204de32a9a3ed"},
- {file = "kiwisolver-1.4.8-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5536185fce131780ebd809f8e623bf4030ce1b161353166c49a3c74c287897f"},
- {file = "kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:369b75d40abedc1da2c1f4de13f3482cb99e3237b38726710f4a793432b1c5ff"},
- {file = "kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:641f2ddf9358c80faa22e22eb4c9f54bd3f0e442e038728f500e3b978d00aa7d"},
- {file = "kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:d561d2d8883e0819445cfe58d7ddd673e4015c3c57261d7bdcd3710d0d14005c"},
- {file = "kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:1732e065704b47c9afca7ffa272f845300a4eb959276bf6970dc07265e73b605"},
- {file = "kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:bcb1ebc3547619c3b58a39e2448af089ea2ef44b37988caf432447374941574e"},
- {file = "kiwisolver-1.4.8-cp310-cp310-win_amd64.whl", hash = "sha256:89c107041f7b27844179ea9c85d6da275aa55ecf28413e87624d033cf1f6b751"},
- {file = "kiwisolver-1.4.8-cp310-cp310-win_arm64.whl", hash = "sha256:b5773efa2be9eb9fcf5415ea3ab70fc785d598729fd6057bea38d539ead28271"},
- {file = "kiwisolver-1.4.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a4d3601908c560bdf880f07d94f31d734afd1bb71e96585cace0e38ef44c6d84"},
- {file = "kiwisolver-1.4.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:856b269c4d28a5c0d5e6c1955ec36ebfd1651ac00e1ce0afa3e28da95293b561"},
- {file = "kiwisolver-1.4.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c2b9a96e0f326205af81a15718a9073328df1173a2619a68553decb7097fd5d7"},
- {file = "kiwisolver-1.4.8-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5020c83e8553f770cb3b5fc13faac40f17e0b205bd237aebd21d53d733adb03"},
- {file = "kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dace81d28c787956bfbfbbfd72fdcef014f37d9b48830829e488fdb32b49d954"},
- {file = "kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:11e1022b524bd48ae56c9b4f9296bce77e15a2e42a502cceba602f804b32bb79"},
- {file = "kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b9b4d2892fefc886f30301cdd80debd8bb01ecdf165a449eb6e78f79f0fabd6"},
- {file = "kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a96c0e790ee875d65e340ab383700e2b4891677b7fcd30a699146f9384a2bb0"},
- {file = "kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:23454ff084b07ac54ca8be535f4174170c1094a4cff78fbae4f73a4bcc0d4dab"},
- {file = "kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:87b287251ad6488e95b4f0b4a79a6d04d3ea35fde6340eb38fbd1ca9cd35bbbc"},
- {file = "kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:b21dbe165081142b1232a240fc6383fd32cdd877ca6cc89eab93e5f5883e1c25"},
- {file = "kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:768cade2c2df13db52475bd28d3a3fac8c9eff04b0e9e2fda0f3760f20b3f7fc"},
- {file = "kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d47cfb2650f0e103d4bf68b0b5804c68da97272c84bb12850d877a95c056bd67"},
- {file = "kiwisolver-1.4.8-cp311-cp311-win_amd64.whl", hash = "sha256:ed33ca2002a779a2e20eeb06aea7721b6e47f2d4b8a8ece979d8ba9e2a167e34"},
- {file = "kiwisolver-1.4.8-cp311-cp311-win_arm64.whl", hash = "sha256:16523b40aab60426ffdebe33ac374457cf62863e330a90a0383639ce14bf44b2"},
- {file = "kiwisolver-1.4.8-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d6af5e8815fd02997cb6ad9bbed0ee1e60014438ee1a5c2444c96f87b8843502"},
- {file = "kiwisolver-1.4.8-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:bade438f86e21d91e0cf5dd7c0ed00cda0f77c8c1616bd83f9fc157fa6760d31"},
- {file = "kiwisolver-1.4.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b83dc6769ddbc57613280118fb4ce3cd08899cc3369f7d0e0fab518a7cf37fdb"},
- {file = "kiwisolver-1.4.8-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:111793b232842991be367ed828076b03d96202c19221b5ebab421ce8bcad016f"},
- {file = "kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:257af1622860e51b1a9d0ce387bf5c2c4f36a90594cb9514f55b074bcc787cfc"},
- {file = "kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:69b5637c3f316cab1ec1c9a12b8c5f4750a4c4b71af9157645bf32830e39c03a"},
- {file = "kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:782bb86f245ec18009890e7cb8d13a5ef54dcf2ebe18ed65f795e635a96a1c6a"},
- {file = "kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc978a80a0db3a66d25767b03688f1147a69e6237175c0f4ffffaaedf744055a"},
- {file = "kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:36dbbfd34838500a31f52c9786990d00150860e46cd5041386f217101350f0d3"},
- {file = "kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:eaa973f1e05131de5ff3569bbba7f5fd07ea0595d3870ed4a526d486fe57fa1b"},
- {file = "kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:a66f60f8d0c87ab7f59b6fb80e642ebb29fec354a4dfad687ca4092ae69d04f4"},
- {file = "kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:858416b7fb777a53f0c59ca08190ce24e9abbd3cffa18886a5781b8e3e26f65d"},
- {file = "kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:085940635c62697391baafaaeabdf3dd7a6c3643577dde337f4d66eba021b2b8"},
- {file = "kiwisolver-1.4.8-cp312-cp312-win_amd64.whl", hash = "sha256:01c3d31902c7db5fb6182832713d3b4122ad9317c2c5877d0539227d96bb2e50"},
- {file = "kiwisolver-1.4.8-cp312-cp312-win_arm64.whl", hash = "sha256:a3c44cb68861de93f0c4a8175fbaa691f0aa22550c331fefef02b618a9dcb476"},
- {file = "kiwisolver-1.4.8-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:1c8ceb754339793c24aee1c9fb2485b5b1f5bb1c2c214ff13368431e51fc9a09"},
- {file = "kiwisolver-1.4.8-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:54a62808ac74b5e55a04a408cda6156f986cefbcf0ada13572696b507cc92fa1"},
- {file = "kiwisolver-1.4.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:68269e60ee4929893aad82666821aaacbd455284124817af45c11e50a4b42e3c"},
- {file = "kiwisolver-1.4.8-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34d142fba9c464bc3bbfeff15c96eab0e7310343d6aefb62a79d51421fcc5f1b"},
- {file = "kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ddc373e0eef45b59197de815b1b28ef89ae3955e7722cc9710fb91cd77b7f47"},
- {file = "kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:77e6f57a20b9bd4e1e2cedda4d0b986ebd0216236f0106e55c28aea3d3d69b16"},
- {file = "kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08e77738ed7538f036cd1170cbed942ef749137b1311fa2bbe2a7fda2f6bf3cc"},
- {file = "kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a5ce1e481a74b44dd5e92ff03ea0cb371ae7a0268318e202be06c8f04f4f1246"},
- {file = "kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:fc2ace710ba7c1dfd1a3b42530b62b9ceed115f19a1656adefce7b1782a37794"},
- {file = "kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:3452046c37c7692bd52b0e752b87954ef86ee2224e624ef7ce6cb21e8c41cc1b"},
- {file = "kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:7e9a60b50fe8b2ec6f448fe8d81b07e40141bfced7f896309df271a0b92f80f3"},
- {file = "kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:918139571133f366e8362fa4a297aeba86c7816b7ecf0bc79168080e2bd79957"},
- {file = "kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e063ef9f89885a1d68dd8b2e18f5ead48653176d10a0e324e3b0030e3a69adeb"},
- {file = "kiwisolver-1.4.8-cp313-cp313-win_amd64.whl", hash = "sha256:a17b7c4f5b2c51bb68ed379defd608a03954a1845dfed7cc0117f1cc8a9b7fd2"},
- {file = "kiwisolver-1.4.8-cp313-cp313-win_arm64.whl", hash = "sha256:3cd3bc628b25f74aedc6d374d5babf0166a92ff1317f46267f12d2ed54bc1d30"},
- {file = "kiwisolver-1.4.8-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:370fd2df41660ed4e26b8c9d6bbcad668fbe2560462cba151a721d49e5b6628c"},
- {file = "kiwisolver-1.4.8-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:84a2f830d42707de1d191b9490ac186bf7997a9495d4e9072210a1296345f7dc"},
- {file = "kiwisolver-1.4.8-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:7a3ad337add5148cf51ce0b55642dc551c0b9d6248458a757f98796ca7348712"},
- {file = "kiwisolver-1.4.8-cp313-cp313t-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7506488470f41169b86d8c9aeff587293f530a23a23a49d6bc64dab66bedc71e"},
- {file = "kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f0121b07b356a22fb0414cec4666bbe36fd6d0d759db3d37228f496ed67c880"},
- {file = "kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d6d6bd87df62c27d4185de7c511c6248040afae67028a8a22012b010bc7ad062"},
- {file = "kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:291331973c64bb9cce50bbe871fb2e675c4331dab4f31abe89f175ad7679a4d7"},
- {file = "kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:893f5525bb92d3d735878ec00f781b2de998333659507d29ea4466208df37bed"},
- {file = "kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b47a465040146981dc9db8647981b8cb96366fbc8d452b031e4f8fdffec3f26d"},
- {file = "kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:99cea8b9dd34ff80c521aef46a1dddb0dcc0283cf18bde6d756f1e6f31772165"},
- {file = "kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:151dffc4865e5fe6dafce5480fab84f950d14566c480c08a53c663a0020504b6"},
- {file = "kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:577facaa411c10421314598b50413aa1ebcf5126f704f1e5d72d7e4e9f020d90"},
- {file = "kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:be4816dc51c8a471749d664161b434912eee82f2ea66bd7628bd14583a833e85"},
- {file = "kiwisolver-1.4.8-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:e7a019419b7b510f0f7c9dceff8c5eae2392037eae483a7f9162625233802b0a"},
- {file = "kiwisolver-1.4.8-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:286b18e86682fd2217a48fc6be6b0f20c1d0ed10958d8dc53453ad58d7be0bf8"},
- {file = "kiwisolver-1.4.8-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4191ee8dfd0be1c3666ccbac178c5a05d5f8d689bbe3fc92f3c4abec817f8fe0"},
- {file = "kiwisolver-1.4.8-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7cd2785b9391f2873ad46088ed7599a6a71e762e1ea33e87514b1a441ed1da1c"},
- {file = "kiwisolver-1.4.8-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c07b29089b7ba090b6f1a669f1411f27221c3662b3a1b7010e67b59bb5a6f10b"},
- {file = "kiwisolver-1.4.8-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:65ea09a5a3faadd59c2ce96dc7bf0f364986a315949dc6374f04396b0d60e09b"},
- {file = "kiwisolver-1.4.8.tar.gz", hash = "sha256:23d5f023bdc8c7e54eb65f03ca5d5bb25b601eac4d7f1a042888a1f45237987e"},
-]
-
-[[package]]
-name = "markdown"
-version = "3.8"
-description = "Python implementation of John Gruber's Markdown."
-optional = false
-python-versions = ">=3.9"
-groups = ["main"]
-files = [
- {file = "markdown-3.8-py3-none-any.whl", hash = "sha256:794a929b79c5af141ef5ab0f2f642d0f7b1872981250230e72682346f7cc90dc"},
- {file = "markdown-3.8.tar.gz", hash = "sha256:7df81e63f0df5c4b24b7d156eb81e4690595239b7d70937d0409f1b0de319c6f"},
-]
-
-[package.extras]
-docs = ["mdx_gh_links (>=0.2)", "mkdocs (>=1.6)", "mkdocs-gen-files", "mkdocs-literate-nav", "mkdocs-nature (>=0.6)", "mkdocs-section-index", "mkdocstrings[python]"]
-testing = ["coverage", "pyyaml"]
-
-[[package]]
-name = "markdown-it-py"
-version = "3.0.0"
-description = "Python port of markdown-it. Markdown parsing, done right!"
-optional = false
-python-versions = ">=3.8"
-groups = ["main", "docs"]
-files = [
- {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"},
- {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"},
-]
-
-[package.dependencies]
-mdurl = ">=0.1,<1.0"
-
-[package.extras]
-benchmarking = ["psutil", "pytest", "pytest-benchmark"]
-code-style = ["pre-commit (>=3.0,<4.0)"]
-compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0,<2.0)", "mistune (>=2.0,<3.0)", "panflute (>=2.3,<3.0)"]
-linkify = ["linkify-it-py (>=1,<3)"]
-plugins = ["mdit-py-plugins"]
-profiling = ["gprof2dot"]
-rtd = ["jupyter_sphinx", "mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"]
-testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"]
-
-[[package]]
-name = "markupsafe"
-version = "3.0.2"
-description = "Safely add untrusted strings to HTML/XML markup."
-optional = false
-python-versions = ">=3.9"
-groups = ["docs"]
-files = [
- {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8"},
- {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158"},
- {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579"},
- {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d"},
- {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb"},
- {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b"},
- {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c"},
- {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171"},
- {file = "MarkupSafe-3.0.2-cp310-cp310-win32.whl", hash = "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50"},
- {file = "MarkupSafe-3.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a"},
- {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d"},
- {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93"},
- {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832"},
- {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84"},
- {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca"},
- {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798"},
- {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e"},
- {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4"},
- {file = "MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d"},
- {file = "MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b"},
- {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf"},
- {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225"},
- {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028"},
- {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8"},
- {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c"},
- {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557"},
- {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22"},
- {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48"},
- {file = "MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30"},
- {file = "MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87"},
- {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd"},
- {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430"},
- {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094"},
- {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396"},
- {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79"},
- {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a"},
- {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca"},
- {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c"},
- {file = "MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1"},
- {file = "MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f"},
- {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c"},
- {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb"},
- {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c"},
- {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d"},
- {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe"},
- {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5"},
- {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a"},
- {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9"},
- {file = "MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6"},
- {file = "MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f"},
- {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a"},
- {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff"},
- {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13"},
- {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144"},
- {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29"},
- {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0"},
- {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0"},
- {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178"},
- {file = "MarkupSafe-3.0.2-cp39-cp39-win32.whl", hash = "sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f"},
- {file = "MarkupSafe-3.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a"},
- {file = "markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0"},
-]
-
-[[package]]
-name = "matplotlib"
-version = "3.10.1"
-description = "Python plotting package"
-optional = false
-python-versions = ">=3.10"
-groups = ["main"]
-files = [
- {file = "matplotlib-3.10.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:ff2ae14910be903f4a24afdbb6d7d3a6c44da210fc7d42790b87aeac92238a16"},
- {file = "matplotlib-3.10.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0721a3fd3d5756ed593220a8b86808a36c5031fce489adb5b31ee6dbb47dd5b2"},
- {file = "matplotlib-3.10.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0673b4b8f131890eb3a1ad058d6e065fb3c6e71f160089b65f8515373394698"},
- {file = "matplotlib-3.10.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e875b95ac59a7908978fe307ecdbdd9a26af7fa0f33f474a27fcf8c99f64a19"},
- {file = "matplotlib-3.10.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:2589659ea30726284c6c91037216f64a506a9822f8e50592d48ac16a2f29e044"},
- {file = "matplotlib-3.10.1-cp310-cp310-win_amd64.whl", hash = "sha256:a97ff127f295817bc34517255c9db6e71de8eddaab7f837b7d341dee9f2f587f"},
- {file = "matplotlib-3.10.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:057206ff2d6ab82ff3e94ebd94463d084760ca682ed5f150817b859372ec4401"},
- {file = "matplotlib-3.10.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a144867dd6bf8ba8cb5fc81a158b645037e11b3e5cf8a50bd5f9917cb863adfe"},
- {file = "matplotlib-3.10.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56c5d9fcd9879aa8040f196a235e2dcbdf7dd03ab5b07c0696f80bc6cf04bedd"},
- {file = "matplotlib-3.10.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f69dc9713e4ad2fb21a1c30e37bd445d496524257dfda40ff4a8efb3604ab5c"},
- {file = "matplotlib-3.10.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4c59af3e8aca75d7744b68e8e78a669e91ccbcf1ac35d0102a7b1b46883f1dd7"},
- {file = "matplotlib-3.10.1-cp311-cp311-win_amd64.whl", hash = "sha256:11b65088c6f3dae784bc72e8d039a2580186285f87448babb9ddb2ad0082993a"},
- {file = "matplotlib-3.10.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:66e907a06e68cb6cfd652c193311d61a12b54f56809cafbed9736ce5ad92f107"},
- {file = "matplotlib-3.10.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e9b4bb156abb8fa5e5b2b460196f7db7264fc6d62678c03457979e7d5254b7be"},
- {file = "matplotlib-3.10.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1985ad3d97f51307a2cbfc801a930f120def19ba22864182dacef55277102ba6"},
- {file = "matplotlib-3.10.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c96f2c2f825d1257e437a1482c5a2cf4fee15db4261bd6fc0750f81ba2b4ba3d"},
- {file = "matplotlib-3.10.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:35e87384ee9e488d8dd5a2dd7baf471178d38b90618d8ea147aced4ab59c9bea"},
- {file = "matplotlib-3.10.1-cp312-cp312-win_amd64.whl", hash = "sha256:cfd414bce89cc78a7e1d25202e979b3f1af799e416010a20ab2b5ebb3a02425c"},
- {file = "matplotlib-3.10.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c42eee41e1b60fd83ee3292ed83a97a5f2a8239b10c26715d8a6172226988d7b"},
- {file = "matplotlib-3.10.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4f0647b17b667ae745c13721602b540f7aadb2a32c5b96e924cd4fea5dcb90f1"},
- {file = "matplotlib-3.10.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa3854b5f9473564ef40a41bc922be978fab217776e9ae1545c9b3a5cf2092a3"},
- {file = "matplotlib-3.10.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e496c01441be4c7d5f96d4e40f7fca06e20dcb40e44c8daa2e740e1757ad9e6"},
- {file = "matplotlib-3.10.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5d45d3f5245be5b469843450617dcad9af75ca50568acf59997bed9311131a0b"},
- {file = "matplotlib-3.10.1-cp313-cp313-win_amd64.whl", hash = "sha256:8e8e25b1209161d20dfe93037c8a7f7ca796ec9aa326e6e4588d8c4a5dd1e473"},
- {file = "matplotlib-3.10.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:19b06241ad89c3ae9469e07d77efa87041eac65d78df4fcf9cac318028009b01"},
- {file = "matplotlib-3.10.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:01e63101ebb3014e6e9f80d9cf9ee361a8599ddca2c3e166c563628b39305dbb"},
- {file = "matplotlib-3.10.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f06bad951eea6422ac4e8bdebcf3a70c59ea0a03338c5d2b109f57b64eb3972"},
- {file = "matplotlib-3.10.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3dfb036f34873b46978f55e240cff7a239f6c4409eac62d8145bad3fc6ba5a3"},
- {file = "matplotlib-3.10.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dc6ab14a7ab3b4d813b88ba957fc05c79493a037f54e246162033591e770de6f"},
- {file = "matplotlib-3.10.1-cp313-cp313t-win_amd64.whl", hash = "sha256:bc411ebd5889a78dabbc457b3fa153203e22248bfa6eedc6797be5df0164dbf9"},
- {file = "matplotlib-3.10.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:648406f1899f9a818cef8c0231b44dcfc4ff36f167101c3fd1c9151f24220fdc"},
- {file = "matplotlib-3.10.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:02582304e352f40520727984a5a18f37e8187861f954fea9be7ef06569cf85b4"},
- {file = "matplotlib-3.10.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3809916157ba871bcdd33d3493acd7fe3037db5daa917ca6e77975a94cef779"},
- {file = "matplotlib-3.10.1.tar.gz", hash = "sha256:e8d2d0e3881b129268585bf4765ad3ee73a4591d77b9a18c214ac7e3a79fb2ba"},
-]
-
-[package.dependencies]
-contourpy = ">=1.0.1"
-cycler = ">=0.10"
-fonttools = ">=4.22.0"
-kiwisolver = ">=1.3.1"
-numpy = ">=1.23"
-packaging = ">=20.0"
-pillow = ">=8"
-pyparsing = ">=2.3.1"
-python-dateutil = ">=2.7"
-
-[package.extras]
-dev = ["meson-python (>=0.13.1,<0.17.0)", "pybind11 (>=2.13.2,!=2.13.3)", "setuptools (>=64)", "setuptools_scm (>=7)"]
-
-[[package]]
-name = "matplotlib-inline"
-version = "0.1.7"
-description = "Inline Matplotlib backend for Jupyter"
-optional = false
-python-versions = ">=3.8"
-groups = ["main"]
-files = [
- {file = "matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca"},
- {file = "matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90"},
-]
-
-[package.dependencies]
-traitlets = "*"
-
-[[package]]
-name = "mccabe"
-version = "0.7.0"
-description = "McCabe checker, plugin for flake8"
-optional = false
-python-versions = ">=3.6"
-groups = ["dev"]
-files = [
- {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"},
- {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"},
-]
-
-[[package]]
-name = "mdit-py-plugins"
-version = "0.4.2"
-description = "Collection of plugins for markdown-it-py"
-optional = false
-python-versions = ">=3.8"
-groups = ["docs"]
-files = [
- {file = "mdit_py_plugins-0.4.2-py3-none-any.whl", hash = "sha256:0c673c3f889399a33b95e88d2f0d111b4447bdfea7f237dab2d488f459835636"},
- {file = "mdit_py_plugins-0.4.2.tar.gz", hash = "sha256:5f2cd1fdb606ddf152d37ec30e46101a60512bc0e5fa1a7002c36647b09e26b5"},
-]
-
-[package.dependencies]
-markdown-it-py = ">=1.0.0,<4.0.0"
-
-[package.extras]
-code-style = ["pre-commit"]
-rtd = ["myst-parser", "sphinx-book-theme"]
-testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"]
-
-[[package]]
-name = "mdurl"
-version = "0.1.2"
-description = "Markdown URL utilities"
-optional = false
-python-versions = ">=3.7"
-groups = ["main", "docs"]
-files = [
- {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"},
- {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"},
-]
-
-[[package]]
-name = "multitasking"
-version = "0.0.11"
-description = "Non-blocking Python methods using decorators"
-optional = false
-python-versions = "*"
-groups = ["main"]
-files = [
- {file = "multitasking-0.0.11-py3-none-any.whl", hash = "sha256:1e5b37a5f8fc1e6cfaafd1a82b6b1cc6d2ed20037d3b89c25a84f499bd7b3dd4"},
- {file = "multitasking-0.0.11.tar.gz", hash = "sha256:4d6bc3cc65f9b2dca72fb5a787850a88dae8f620c2b36ae9b55248e51bcd6026"},
-]
-
-[[package]]
-name = "mypy"
-version = "1.15.0"
-description = "Optional static typing for Python"
-optional = false
-python-versions = ">=3.9"
-groups = ["dev"]
-files = [
- {file = "mypy-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:979e4e1a006511dacf628e36fadfecbcc0160a8af6ca7dad2f5025529e082c13"},
- {file = "mypy-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c4bb0e1bd29f7d34efcccd71cf733580191e9a264a2202b0239da95984c5b559"},
- {file = "mypy-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:be68172e9fd9ad8fb876c6389f16d1c1b5f100ffa779f77b1fb2176fcc9ab95b"},
- {file = "mypy-1.15.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c7be1e46525adfa0d97681432ee9fcd61a3964c2446795714699a998d193f1a3"},
- {file = "mypy-1.15.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:2e2c2e6d3593f6451b18588848e66260ff62ccca522dd231cd4dd59b0160668b"},
- {file = "mypy-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:6983aae8b2f653e098edb77f893f7b6aca69f6cffb19b2cc7443f23cce5f4828"},
- {file = "mypy-1.15.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2922d42e16d6de288022e5ca321cd0618b238cfc5570e0263e5ba0a77dbef56f"},
- {file = "mypy-1.15.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2ee2d57e01a7c35de00f4634ba1bbf015185b219e4dc5909e281016df43f5ee5"},
- {file = "mypy-1.15.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:973500e0774b85d9689715feeffcc980193086551110fd678ebe1f4342fb7c5e"},
- {file = "mypy-1.15.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5a95fb17c13e29d2d5195869262f8125dfdb5c134dc8d9a9d0aecf7525b10c2c"},
- {file = "mypy-1.15.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1905f494bfd7d85a23a88c5d97840888a7bd516545fc5aaedff0267e0bb54e2f"},
- {file = "mypy-1.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:c9817fa23833ff189db061e6d2eff49b2f3b6ed9856b4a0a73046e41932d744f"},
- {file = "mypy-1.15.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:aea39e0583d05124836ea645f412e88a5c7d0fd77a6d694b60d9b6b2d9f184fd"},
- {file = "mypy-1.15.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2f2147ab812b75e5b5499b01ade1f4a81489a147c01585cda36019102538615f"},
- {file = "mypy-1.15.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ce436f4c6d218a070048ed6a44c0bbb10cd2cc5e272b29e7845f6a2f57ee4464"},
- {file = "mypy-1.15.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8023ff13985661b50a5928fc7a5ca15f3d1affb41e5f0a9952cb68ef090b31ee"},
- {file = "mypy-1.15.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1124a18bc11a6a62887e3e137f37f53fbae476dc36c185d549d4f837a2a6a14e"},
- {file = "mypy-1.15.0-cp312-cp312-win_amd64.whl", hash = "sha256:171a9ca9a40cd1843abeca0e405bc1940cd9b305eaeea2dda769ba096932bb22"},
- {file = "mypy-1.15.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:93faf3fdb04768d44bf28693293f3904bbb555d076b781ad2530214ee53e3445"},
- {file = "mypy-1.15.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:811aeccadfb730024c5d3e326b2fbe9249bb7413553f15499a4050f7c30e801d"},
- {file = "mypy-1.15.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:98b7b9b9aedb65fe628c62a6dc57f6d5088ef2dfca37903a7d9ee374d03acca5"},
- {file = "mypy-1.15.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c43a7682e24b4f576d93072216bf56eeff70d9140241f9edec0c104d0c515036"},
- {file = "mypy-1.15.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:baefc32840a9f00babd83251560e0ae1573e2f9d1b067719479bfb0e987c6357"},
- {file = "mypy-1.15.0-cp313-cp313-win_amd64.whl", hash = "sha256:b9378e2c00146c44793c98b8d5a61039a048e31f429fb0eb546d93f4b000bedf"},
- {file = "mypy-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e601a7fa172c2131bff456bb3ee08a88360760d0d2f8cbd7a75a65497e2df078"},
- {file = "mypy-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:712e962a6357634fef20412699a3655c610110e01cdaa6180acec7fc9f8513ba"},
- {file = "mypy-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f95579473af29ab73a10bada2f9722856792a36ec5af5399b653aa28360290a5"},
- {file = "mypy-1.15.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8f8722560a14cde92fdb1e31597760dc35f9f5524cce17836c0d22841830fd5b"},
- {file = "mypy-1.15.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1fbb8da62dc352133d7d7ca90ed2fb0e9d42bb1a32724c287d3c76c58cbaa9c2"},
- {file = "mypy-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:d10d994b41fb3497719bbf866f227b3489048ea4bbbb5015357db306249f7980"},
- {file = "mypy-1.15.0-py3-none-any.whl", hash = "sha256:5469affef548bd1895d86d3bf10ce2b44e33d86923c29e4d675b3e323437ea3e"},
- {file = "mypy-1.15.0.tar.gz", hash = "sha256:404534629d51d3efea5c800ee7c42b72a6554d6c400e6a79eafe15d11341fd43"},
-]
-
-[package.dependencies]
-mypy_extensions = ">=1.0.0"
-typing_extensions = ">=4.6.0"
-
-[package.extras]
-dmypy = ["psutil (>=4.0)"]
-faster-cache = ["orjson"]
-install-types = ["pip"]
-mypyc = ["setuptools (>=50)"]
-reports = ["lxml"]
-
-[[package]]
-name = "mypy-extensions"
-version = "1.1.0"
-description = "Type system extensions for programs checked with the mypy type checker."
-optional = false
-python-versions = ">=3.8"
-groups = ["dev"]
-files = [
- {file = "mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505"},
- {file = "mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558"},
-]
-
-[[package]]
-name = "myst-parser"
-version = "3.0.1"
-description = "An extended [CommonMark](https://spec.commonmark.org/) compliant parser,"
-optional = false
-python-versions = ">=3.8"
-groups = ["docs"]
-files = [
- {file = "myst_parser-3.0.1-py3-none-any.whl", hash = "sha256:6457aaa33a5d474aca678b8ead9b3dc298e89c68e67012e73146ea6fd54babf1"},
- {file = "myst_parser-3.0.1.tar.gz", hash = "sha256:88f0cb406cb363b077d176b51c476f62d60604d68a8dcdf4832e080441301a87"},
-]
-
-[package.dependencies]
-docutils = ">=0.18,<0.22"
-jinja2 = "*"
-markdown-it-py = ">=3.0,<4.0"
-mdit-py-plugins = ">=0.4,<1.0"
-pyyaml = "*"
-sphinx = ">=6,<8"
-
-[package.extras]
-code-style = ["pre-commit (>=3.0,<4.0)"]
-linkify = ["linkify-it-py (>=2.0,<3.0)"]
-rtd = ["ipython", "sphinx (>=7)", "sphinx-autodoc2 (>=0.5.0,<0.6.0)", "sphinx-book-theme (>=1.1,<2.0)", "sphinx-copybutton", "sphinx-design", "sphinx-pyscript", "sphinx-tippy (>=0.4.3)", "sphinx-togglebutton", "sphinxext-opengraph (>=0.9.0,<0.10.0)", "sphinxext-rediraffe (>=0.2.7,<0.3.0)"]
-testing = ["beautifulsoup4", "coverage[toml]", "defusedxml", "pytest (>=8,<9)", "pytest-cov", "pytest-param-files (>=0.6.0,<0.7.0)", "pytest-regressions", "sphinx-pytest"]
-testing-docutils = ["pygments", "pytest (>=8,<9)", "pytest-param-files (>=0.6.0,<0.7.0)"]
-
-[[package]]
-name = "numpy"
-version = "2.2.4"
-description = "Fundamental package for array computing in Python"
-optional = false
-python-versions = ">=3.10"
-groups = ["main"]
-files = [
- {file = "numpy-2.2.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8146f3550d627252269ac42ae660281d673eb6f8b32f113538e0cc2a9aed42b9"},
- {file = "numpy-2.2.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e642d86b8f956098b564a45e6f6ce68a22c2c97a04f5acd3f221f57b8cb850ae"},
- {file = "numpy-2.2.4-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:a84eda42bd12edc36eb5b53bbcc9b406820d3353f1994b6cfe453a33ff101775"},
- {file = "numpy-2.2.4-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:4ba5054787e89c59c593a4169830ab362ac2bee8a969249dc56e5d7d20ff8df9"},
- {file = "numpy-2.2.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7716e4a9b7af82c06a2543c53ca476fa0b57e4d760481273e09da04b74ee6ee2"},
- {file = "numpy-2.2.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:adf8c1d66f432ce577d0197dceaac2ac00c0759f573f28516246351c58a85020"},
- {file = "numpy-2.2.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:218f061d2faa73621fa23d6359442b0fc658d5b9a70801373625d958259eaca3"},
- {file = "numpy-2.2.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:df2f57871a96bbc1b69733cd4c51dc33bea66146b8c63cacbfed73eec0883017"},
- {file = "numpy-2.2.4-cp310-cp310-win32.whl", hash = "sha256:a0258ad1f44f138b791327961caedffbf9612bfa504ab9597157806faa95194a"},
- {file = "numpy-2.2.4-cp310-cp310-win_amd64.whl", hash = "sha256:0d54974f9cf14acf49c60f0f7f4084b6579d24d439453d5fc5805d46a165b542"},
- {file = "numpy-2.2.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e9e0a277bb2eb5d8a7407e14688b85fd8ad628ee4e0c7930415687b6564207a4"},
- {file = "numpy-2.2.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9eeea959168ea555e556b8188da5fa7831e21d91ce031e95ce23747b7609f8a4"},
- {file = "numpy-2.2.4-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:bd3ad3b0a40e713fc68f99ecfd07124195333f1e689387c180813f0e94309d6f"},
- {file = "numpy-2.2.4-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:cf28633d64294969c019c6df4ff37f5698e8326db68cc2b66576a51fad634880"},
- {file = "numpy-2.2.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2fa8fa7697ad1646b5c93de1719965844e004fcad23c91228aca1cf0800044a1"},
- {file = "numpy-2.2.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f4162988a360a29af158aeb4a2f4f09ffed6a969c9776f8f3bdee9b06a8ab7e5"},
- {file = "numpy-2.2.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:892c10d6a73e0f14935c31229e03325a7b3093fafd6ce0af704be7f894d95687"},
- {file = "numpy-2.2.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:db1f1c22173ac1c58db249ae48aa7ead29f534b9a948bc56828337aa84a32ed6"},
- {file = "numpy-2.2.4-cp311-cp311-win32.whl", hash = "sha256:ea2bb7e2ae9e37d96835b3576a4fa4b3a97592fbea8ef7c3587078b0068b8f09"},
- {file = "numpy-2.2.4-cp311-cp311-win_amd64.whl", hash = "sha256:f7de08cbe5551911886d1ab60de58448c6df0f67d9feb7d1fb21e9875ef95e91"},
- {file = "numpy-2.2.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a7b9084668aa0f64e64bd00d27ba5146ef1c3a8835f3bd912e7a9e01326804c4"},
- {file = "numpy-2.2.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:dbe512c511956b893d2dacd007d955a3f03d555ae05cfa3ff1c1ff6df8851854"},
- {file = "numpy-2.2.4-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:bb649f8b207ab07caebba230d851b579a3c8711a851d29efe15008e31bb4de24"},
- {file = "numpy-2.2.4-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:f34dc300df798742b3d06515aa2a0aee20941c13579d7a2f2e10af01ae4901ee"},
- {file = "numpy-2.2.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3f7ac96b16955634e223b579a3e5798df59007ca43e8d451a0e6a50f6bfdfba"},
- {file = "numpy-2.2.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f92084defa704deadd4e0a5ab1dc52d8ac9e8a8ef617f3fbb853e79b0ea3592"},
- {file = "numpy-2.2.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7a4e84a6283b36632e2a5b56e121961f6542ab886bc9e12f8f9818b3c266bfbb"},
- {file = "numpy-2.2.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:11c43995255eb4127115956495f43e9343736edb7fcdb0d973defd9de14cd84f"},
- {file = "numpy-2.2.4-cp312-cp312-win32.whl", hash = "sha256:65ef3468b53269eb5fdb3a5c09508c032b793da03251d5f8722b1194f1790c00"},
- {file = "numpy-2.2.4-cp312-cp312-win_amd64.whl", hash = "sha256:2aad3c17ed2ff455b8eaafe06bcdae0062a1db77cb99f4b9cbb5f4ecb13c5146"},
- {file = "numpy-2.2.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1cf4e5c6a278d620dee9ddeb487dc6a860f9b199eadeecc567f777daace1e9e7"},
- {file = "numpy-2.2.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1974afec0b479e50438fc3648974268f972e2d908ddb6d7fb634598cdb8260a0"},
- {file = "numpy-2.2.4-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:79bd5f0a02aa16808fcbc79a9a376a147cc1045f7dfe44c6e7d53fa8b8a79392"},
- {file = "numpy-2.2.4-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:3387dd7232804b341165cedcb90694565a6015433ee076c6754775e85d86f1fc"},
- {file = "numpy-2.2.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f527d8fdb0286fd2fd97a2a96c6be17ba4232da346931d967a0630050dfd298"},
- {file = "numpy-2.2.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bce43e386c16898b91e162e5baaad90c4b06f9dcbe36282490032cec98dc8ae7"},
- {file = "numpy-2.2.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:31504f970f563d99f71a3512d0c01a645b692b12a63630d6aafa0939e52361e6"},
- {file = "numpy-2.2.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:81413336ef121a6ba746892fad881a83351ee3e1e4011f52e97fba79233611fd"},
- {file = "numpy-2.2.4-cp313-cp313-win32.whl", hash = "sha256:f486038e44caa08dbd97275a9a35a283a8f1d2f0ee60ac260a1790e76660833c"},
- {file = "numpy-2.2.4-cp313-cp313-win_amd64.whl", hash = "sha256:207a2b8441cc8b6a2a78c9ddc64d00d20c303d79fba08c577752f080c4007ee3"},
- {file = "numpy-2.2.4-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8120575cb4882318c791f839a4fd66161a6fa46f3f0a5e613071aae35b5dd8f8"},
- {file = "numpy-2.2.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a761ba0fa886a7bb33c6c8f6f20213735cb19642c580a931c625ee377ee8bd39"},
- {file = "numpy-2.2.4-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:ac0280f1ba4a4bfff363a99a6aceed4f8e123f8a9b234c89140f5e894e452ecd"},
- {file = "numpy-2.2.4-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:879cf3a9a2b53a4672a168c21375166171bc3932b7e21f622201811c43cdd3b0"},
- {file = "numpy-2.2.4-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f05d4198c1bacc9124018109c5fba2f3201dbe7ab6e92ff100494f236209c960"},
- {file = "numpy-2.2.4-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2f085ce2e813a50dfd0e01fbfc0c12bbe5d2063d99f8b29da30e544fb6483b8"},
- {file = "numpy-2.2.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:92bda934a791c01d6d9d8e038363c50918ef7c40601552a58ac84c9613a665bc"},
- {file = "numpy-2.2.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ee4d528022f4c5ff67332469e10efe06a267e32f4067dc76bb7e2cddf3cd25ff"},
- {file = "numpy-2.2.4-cp313-cp313t-win32.whl", hash = "sha256:05c076d531e9998e7e694c36e8b349969c56eadd2cdcd07242958489d79a7286"},
- {file = "numpy-2.2.4-cp313-cp313t-win_amd64.whl", hash = "sha256:188dcbca89834cc2e14eb2f106c96d6d46f200fe0200310fc29089657379c58d"},
- {file = "numpy-2.2.4-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7051ee569db5fbac144335e0f3b9c2337e0c8d5c9fee015f259a5bd70772b7e8"},
- {file = "numpy-2.2.4-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:ab2939cd5bec30a7430cbdb2287b63151b77cf9624de0532d629c9a1c59b1d5c"},
- {file = "numpy-2.2.4-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0f35b19894a9e08639fd60a1ec1978cb7f5f7f1eace62f38dd36be8aecdef4d"},
- {file = "numpy-2.2.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:b4adfbbc64014976d2f91084915ca4e626fbf2057fb81af209c1a6d776d23e3d"},
- {file = "numpy-2.2.4.tar.gz", hash = "sha256:9ba03692a45d3eef66559efe1d1096c4b9b75c0986b5dff5530c378fb8331d4f"},
-]
-
-[[package]]
-name = "packaging"
-version = "24.2"
-description = "Core utilities for Python packages"
-optional = false
-python-versions = ">=3.8"
-groups = ["main", "dev", "docs"]
-files = [
- {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"},
- {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"},
-]
-
-[[package]]
-name = "pandas"
-version = "2.2.3"
-description = "Powerful data structures for data analysis, time series, and statistics"
-optional = false
-python-versions = ">=3.9"
-groups = ["main"]
-files = [
- {file = "pandas-2.2.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1948ddde24197a0f7add2bdc4ca83bf2b1ef84a1bc8ccffd95eda17fd836ecb5"},
- {file = "pandas-2.2.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:381175499d3802cde0eabbaf6324cce0c4f5d52ca6f8c377c29ad442f50f6348"},
- {file = "pandas-2.2.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d9c45366def9a3dd85a6454c0e7908f2b3b8e9c138f5dc38fed7ce720d8453ed"},
- {file = "pandas-2.2.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86976a1c5b25ae3f8ccae3a5306e443569ee3c3faf444dfd0f41cda24667ad57"},
- {file = "pandas-2.2.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b8661b0238a69d7aafe156b7fa86c44b881387509653fdf857bebc5e4008ad42"},
- {file = "pandas-2.2.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:37e0aced3e8f539eccf2e099f65cdb9c8aa85109b0be6e93e2baff94264bdc6f"},
- {file = "pandas-2.2.3-cp310-cp310-win_amd64.whl", hash = "sha256:56534ce0746a58afaf7942ba4863e0ef81c9c50d3f0ae93e9497d6a41a057645"},
- {file = "pandas-2.2.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:66108071e1b935240e74525006034333f98bcdb87ea116de573a6a0dccb6c039"},
- {file = "pandas-2.2.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7c2875855b0ff77b2a64a0365e24455d9990730d6431b9e0ee18ad8acee13dbd"},
- {file = "pandas-2.2.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cd8d0c3be0515c12fed0bdbae072551c8b54b7192c7b1fda0ba56059a0179698"},
- {file = "pandas-2.2.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c124333816c3a9b03fbeef3a9f230ba9a737e9e5bb4060aa2107a86cc0a497fc"},
- {file = "pandas-2.2.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:63cc132e40a2e084cf01adf0775b15ac515ba905d7dcca47e9a251819c575ef3"},
- {file = "pandas-2.2.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:29401dbfa9ad77319367d36940cd8a0b3a11aba16063e39632d98b0e931ddf32"},
- {file = "pandas-2.2.3-cp311-cp311-win_amd64.whl", hash = "sha256:3fc6873a41186404dad67245896a6e440baacc92f5b716ccd1bc9ed2995ab2c5"},
- {file = "pandas-2.2.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b1d432e8d08679a40e2a6d8b2f9770a5c21793a6f9f47fdd52c5ce1948a5a8a9"},
- {file = "pandas-2.2.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a5a1595fe639f5988ba6a8e5bc9649af3baf26df3998a0abe56c02609392e0a4"},
- {file = "pandas-2.2.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5de54125a92bb4d1c051c0659e6fcb75256bf799a732a87184e5ea503965bce3"},
- {file = "pandas-2.2.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fffb8ae78d8af97f849404f21411c95062db1496aeb3e56f146f0355c9989319"},
- {file = "pandas-2.2.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dfcb5ee8d4d50c06a51c2fffa6cff6272098ad6540aed1a76d15fb9318194d8"},
- {file = "pandas-2.2.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:062309c1b9ea12a50e8ce661145c6aab431b1e99530d3cd60640e255778bd43a"},
- {file = "pandas-2.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:59ef3764d0fe818125a5097d2ae867ca3fa64df032331b7e0917cf5d7bf66b13"},
- {file = "pandas-2.2.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f00d1345d84d8c86a63e476bb4955e46458b304b9575dcf71102b5c705320015"},
- {file = "pandas-2.2.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3508d914817e153ad359d7e069d752cdd736a247c322d932eb89e6bc84217f28"},
- {file = "pandas-2.2.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22a9d949bfc9a502d320aa04e5d02feab689d61da4e7764b62c30b991c42c5f0"},
- {file = "pandas-2.2.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3a255b2c19987fbbe62a9dfd6cff7ff2aa9ccab3fc75218fd4b7530f01efa24"},
- {file = "pandas-2.2.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:800250ecdadb6d9c78eae4990da62743b857b470883fa27f652db8bdde7f6659"},
- {file = "pandas-2.2.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6374c452ff3ec675a8f46fd9ab25c4ad0ba590b71cf0656f8b6daa5202bca3fb"},
- {file = "pandas-2.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:61c5ad4043f791b61dd4752191d9f07f0ae412515d59ba8f005832a532f8736d"},
- {file = "pandas-2.2.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3b71f27954685ee685317063bf13c7709a7ba74fc996b84fc6821c59b0f06468"},
- {file = "pandas-2.2.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:38cf8125c40dae9d5acc10fa66af8ea6fdf760b2714ee482ca691fc66e6fcb18"},
- {file = "pandas-2.2.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ba96630bc17c875161df3818780af30e43be9b166ce51c9a18c1feae342906c2"},
- {file = "pandas-2.2.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1db71525a1538b30142094edb9adc10be3f3e176748cd7acc2240c2f2e5aa3a4"},
- {file = "pandas-2.2.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:15c0e1e02e93116177d29ff83e8b1619c93ddc9c49083f237d4312337a61165d"},
- {file = "pandas-2.2.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ad5b65698ab28ed8d7f18790a0dc58005c7629f227be9ecc1072aa74c0c1d43a"},
- {file = "pandas-2.2.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc6b93f9b966093cb0fd62ff1a7e4c09e6d546ad7c1de191767baffc57628f39"},
- {file = "pandas-2.2.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5dbca4c1acd72e8eeef4753eeca07de9b1db4f398669d5994086f788a5d7cc30"},
- {file = "pandas-2.2.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8cd6d7cc958a3910f934ea8dbdf17b2364827bb4dafc38ce6eef6bb3d65ff09c"},
- {file = "pandas-2.2.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99df71520d25fade9db7c1076ac94eb994f4d2673ef2aa2e86ee039b6746d20c"},
- {file = "pandas-2.2.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:31d0ced62d4ea3e231a9f228366919a5ea0b07440d9d4dac345376fd8e1477ea"},
- {file = "pandas-2.2.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7eee9e7cea6adf3e3d24e304ac6b8300646e2a5d1cd3a3c2abed9101b0846761"},
- {file = "pandas-2.2.3-cp39-cp39-win_amd64.whl", hash = "sha256:4850ba03528b6dd51d6c5d273c46f183f39a9baf3f0143e566b89450965b105e"},
- {file = "pandas-2.2.3.tar.gz", hash = "sha256:4f18ba62b61d7e192368b84517265a99b4d7ee8912f8708660fb4a366cc82667"},
-]
-
-[package.dependencies]
-numpy = [
- {version = ">=1.23.2", markers = "python_version == \"3.11\""},
- {version = ">=1.26.0", markers = "python_version >= \"3.12\""},
-]
-python-dateutil = ">=2.8.2"
-pytz = ">=2020.1"
-tzdata = ">=2022.7"
-
-[package.extras]
-all = ["PyQt5 (>=5.15.9)", "SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)", "beautifulsoup4 (>=4.11.2)", "bottleneck (>=1.3.6)", "dataframe-api-compat (>=0.1.7)", "fastparquet (>=2022.12.0)", "fsspec (>=2022.11.0)", "gcsfs (>=2022.11.0)", "html5lib (>=1.1)", "hypothesis (>=6.46.1)", "jinja2 (>=3.1.2)", "lxml (>=4.9.2)", "matplotlib (>=3.6.3)", "numba (>=0.56.4)", "numexpr (>=2.8.4)", "odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "pandas-gbq (>=0.19.0)", "psycopg2 (>=2.9.6)", "pyarrow (>=10.0.1)", "pymysql (>=1.0.2)", "pyreadstat (>=1.2.0)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "qtpy (>=2.3.0)", "s3fs (>=2022.11.0)", "scipy (>=1.10.0)", "tables (>=3.8.0)", "tabulate (>=0.9.0)", "xarray (>=2022.12.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)", "zstandard (>=0.19.0)"]
-aws = ["s3fs (>=2022.11.0)"]
-clipboard = ["PyQt5 (>=5.15.9)", "qtpy (>=2.3.0)"]
-compression = ["zstandard (>=0.19.0)"]
-computation = ["scipy (>=1.10.0)", "xarray (>=2022.12.0)"]
-consortium-standard = ["dataframe-api-compat (>=0.1.7)"]
-excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)"]
-feather = ["pyarrow (>=10.0.1)"]
-fss = ["fsspec (>=2022.11.0)"]
-gcp = ["gcsfs (>=2022.11.0)", "pandas-gbq (>=0.19.0)"]
-hdf5 = ["tables (>=3.8.0)"]
-html = ["beautifulsoup4 (>=4.11.2)", "html5lib (>=1.1)", "lxml (>=4.9.2)"]
-mysql = ["SQLAlchemy (>=2.0.0)", "pymysql (>=1.0.2)"]
-output-formatting = ["jinja2 (>=3.1.2)", "tabulate (>=0.9.0)"]
-parquet = ["pyarrow (>=10.0.1)"]
-performance = ["bottleneck (>=1.3.6)", "numba (>=0.56.4)", "numexpr (>=2.8.4)"]
-plot = ["matplotlib (>=3.6.3)"]
-postgresql = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "psycopg2 (>=2.9.6)"]
-pyarrow = ["pyarrow (>=10.0.1)"]
-spss = ["pyreadstat (>=1.2.0)"]
-sql-other = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)"]
-test = ["hypothesis (>=6.46.1)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)"]
-xml = ["lxml (>=4.9.2)"]
-
-[[package]]
-name = "parso"
-version = "0.8.4"
-description = "A Python Parser"
-optional = false
-python-versions = ">=3.6"
-groups = ["main"]
-files = [
- {file = "parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18"},
- {file = "parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d"},
-]
-
-[package.extras]
-qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"]
-testing = ["docopt", "pytest"]
-
-[[package]]
-name = "pathspec"
-version = "0.12.1"
-description = "Utility library for gitignore style pattern matching of file paths."
-optional = false
-python-versions = ">=3.8"
-groups = ["dev"]
-files = [
- {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"},
- {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"},
-]
-
-[[package]]
-name = "peewee"
-version = "3.17.9"
-description = "a little orm"
-optional = false
-python-versions = "*"
-groups = ["main"]
-files = [
- {file = "peewee-3.17.9.tar.gz", hash = "sha256:fe15cd001758e324c8e3ca8c8ed900e7397c2907291789e1efc383e66b9bc7a8"},
-]
-
-[[package]]
-name = "pexpect"
-version = "4.9.0"
-description = "Pexpect allows easy control of interactive console applications."
-optional = false
-python-versions = "*"
-groups = ["main"]
-markers = "sys_platform != \"win32\" and sys_platform != \"emscripten\""
-files = [
- {file = "pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523"},
- {file = "pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f"},
-]
-
-[package.dependencies]
-ptyprocess = ">=0.5"
-
-[[package]]
-name = "pillow"
-version = "11.2.1"
-description = "Python Imaging Library (Fork)"
-optional = false
-python-versions = ">=3.9"
-groups = ["main"]
-files = [
- {file = "pillow-11.2.1-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:d57a75d53922fc20c165016a20d9c44f73305e67c351bbc60d1adaf662e74047"},
- {file = "pillow-11.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:127bf6ac4a5b58b3d32fc8289656f77f80567d65660bc46f72c0d77e6600cc95"},
- {file = "pillow-11.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b4ba4be812c7a40280629e55ae0b14a0aafa150dd6451297562e1764808bbe61"},
- {file = "pillow-11.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c8bd62331e5032bc396a93609982a9ab6b411c05078a52f5fe3cc59234a3abd1"},
- {file = "pillow-11.2.1-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:562d11134c97a62fe3af29581f083033179f7ff435f78392565a1ad2d1c2c45c"},
- {file = "pillow-11.2.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:c97209e85b5be259994eb5b69ff50c5d20cca0f458ef9abd835e262d9d88b39d"},
- {file = "pillow-11.2.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0c3e6d0f59171dfa2e25d7116217543310908dfa2770aa64b8f87605f8cacc97"},
- {file = "pillow-11.2.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cc1c3bc53befb6096b84165956e886b1729634a799e9d6329a0c512ab651e579"},
- {file = "pillow-11.2.1-cp310-cp310-win32.whl", hash = "sha256:312c77b7f07ab2139924d2639860e084ec2a13e72af54d4f08ac843a5fc9c79d"},
- {file = "pillow-11.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:9bc7ae48b8057a611e5fe9f853baa88093b9a76303937449397899385da06fad"},
- {file = "pillow-11.2.1-cp310-cp310-win_arm64.whl", hash = "sha256:2728567e249cdd939f6cc3d1f049595c66e4187f3c34078cbc0a7d21c47482d2"},
- {file = "pillow-11.2.1-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:35ca289f712ccfc699508c4658a1d14652e8033e9b69839edf83cbdd0ba39e70"},
- {file = "pillow-11.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e0409af9f829f87a2dfb7e259f78f317a5351f2045158be321fd135973fff7bf"},
- {file = "pillow-11.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4e5c5edee874dce4f653dbe59db7c73a600119fbea8d31f53423586ee2aafd7"},
- {file = "pillow-11.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b93a07e76d13bff9444f1a029e0af2964e654bfc2e2c2d46bfd080df5ad5f3d8"},
- {file = "pillow-11.2.1-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:e6def7eed9e7fa90fde255afaf08060dc4b343bbe524a8f69bdd2a2f0018f600"},
- {file = "pillow-11.2.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:8f4f3724c068be008c08257207210c138d5f3731af6c155a81c2b09a9eb3a788"},
- {file = "pillow-11.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a0a6709b47019dff32e678bc12c63008311b82b9327613f534e496dacaefb71e"},
- {file = "pillow-11.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f6b0c664ccb879109ee3ca702a9272d877f4fcd21e5eb63c26422fd6e415365e"},
- {file = "pillow-11.2.1-cp311-cp311-win32.whl", hash = "sha256:cc5d875d56e49f112b6def6813c4e3d3036d269c008bf8aef72cd08d20ca6df6"},
- {file = "pillow-11.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:0f5c7eda47bf8e3c8a283762cab94e496ba977a420868cb819159980b6709193"},
- {file = "pillow-11.2.1-cp311-cp311-win_arm64.whl", hash = "sha256:4d375eb838755f2528ac8cbc926c3e31cc49ca4ad0cf79cff48b20e30634a4a7"},
- {file = "pillow-11.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:78afba22027b4accef10dbd5eed84425930ba41b3ea0a86fa8d20baaf19d807f"},
- {file = "pillow-11.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:78092232a4ab376a35d68c4e6d5e00dfd73454bd12b230420025fbe178ee3b0b"},
- {file = "pillow-11.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25a5f306095c6780c52e6bbb6109624b95c5b18e40aab1c3041da3e9e0cd3e2d"},
- {file = "pillow-11.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c7b29dbd4281923a2bfe562acb734cee96bbb129e96e6972d315ed9f232bef4"},
- {file = "pillow-11.2.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:3e645b020f3209a0181a418bffe7b4a93171eef6c4ef6cc20980b30bebf17b7d"},
- {file = "pillow-11.2.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:b2dbea1012ccb784a65349f57bbc93730b96e85b42e9bf7b01ef40443db720b4"},
- {file = "pillow-11.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:da3104c57bbd72948d75f6a9389e6727d2ab6333c3617f0a89d72d4940aa0443"},
- {file = "pillow-11.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:598174aef4589af795f66f9caab87ba4ff860ce08cd5bb447c6fc553ffee603c"},
- {file = "pillow-11.2.1-cp312-cp312-win32.whl", hash = "sha256:1d535df14716e7f8776b9e7fee118576d65572b4aad3ed639be9e4fa88a1cad3"},
- {file = "pillow-11.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:14e33b28bf17c7a38eede290f77db7c664e4eb01f7869e37fa98a5aa95978941"},
- {file = "pillow-11.2.1-cp312-cp312-win_arm64.whl", hash = "sha256:21e1470ac9e5739ff880c211fc3af01e3ae505859392bf65458c224d0bf283eb"},
- {file = "pillow-11.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:fdec757fea0b793056419bca3e9932eb2b0ceec90ef4813ea4c1e072c389eb28"},
- {file = "pillow-11.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b0e130705d568e2f43a17bcbe74d90958e8a16263868a12c3e0d9c8162690830"},
- {file = "pillow-11.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bdb5e09068332578214cadd9c05e3d64d99e0e87591be22a324bdbc18925be0"},
- {file = "pillow-11.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d189ba1bebfbc0c0e529159631ec72bb9e9bc041f01ec6d3233d6d82eb823bc1"},
- {file = "pillow-11.2.1-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:191955c55d8a712fab8934a42bfefbf99dd0b5875078240943f913bb66d46d9f"},
- {file = "pillow-11.2.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:ad275964d52e2243430472fc5d2c2334b4fc3ff9c16cb0a19254e25efa03a155"},
- {file = "pillow-11.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:750f96efe0597382660d8b53e90dd1dd44568a8edb51cb7f9d5d918b80d4de14"},
- {file = "pillow-11.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fe15238d3798788d00716637b3d4e7bb6bde18b26e5d08335a96e88564a36b6b"},
- {file = "pillow-11.2.1-cp313-cp313-win32.whl", hash = "sha256:3fe735ced9a607fee4f481423a9c36701a39719252a9bb251679635f99d0f7d2"},
- {file = "pillow-11.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:74ee3d7ecb3f3c05459ba95eed5efa28d6092d751ce9bf20e3e253a4e497e691"},
- {file = "pillow-11.2.1-cp313-cp313-win_arm64.whl", hash = "sha256:5119225c622403afb4b44bad4c1ca6c1f98eed79db8d3bc6e4e160fc6339d66c"},
- {file = "pillow-11.2.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8ce2e8411c7aaef53e6bb29fe98f28cd4fbd9a1d9be2eeea434331aac0536b22"},
- {file = "pillow-11.2.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:9ee66787e095127116d91dea2143db65c7bb1e232f617aa5957c0d9d2a3f23a7"},
- {file = "pillow-11.2.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9622e3b6c1d8b551b6e6f21873bdcc55762b4b2126633014cea1803368a9aa16"},
- {file = "pillow-11.2.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63b5dff3a68f371ea06025a1a6966c9a1e1ee452fc8020c2cd0ea41b83e9037b"},
- {file = "pillow-11.2.1-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:31df6e2d3d8fc99f993fd253e97fae451a8db2e7207acf97859732273e108406"},
- {file = "pillow-11.2.1-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:062b7a42d672c45a70fa1f8b43d1d38ff76b63421cbbe7f88146b39e8a558d91"},
- {file = "pillow-11.2.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4eb92eca2711ef8be42fd3f67533765d9fd043b8c80db204f16c8ea62ee1a751"},
- {file = "pillow-11.2.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f91ebf30830a48c825590aede79376cb40f110b387c17ee9bd59932c961044f9"},
- {file = "pillow-11.2.1-cp313-cp313t-win32.whl", hash = "sha256:e0b55f27f584ed623221cfe995c912c61606be8513bfa0e07d2c674b4516d9dd"},
- {file = "pillow-11.2.1-cp313-cp313t-win_amd64.whl", hash = "sha256:36d6b82164c39ce5482f649b437382c0fb2395eabc1e2b1702a6deb8ad647d6e"},
- {file = "pillow-11.2.1-cp313-cp313t-win_arm64.whl", hash = "sha256:225c832a13326e34f212d2072982bb1adb210e0cc0b153e688743018c94a2681"},
- {file = "pillow-11.2.1-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:7491cf8a79b8eb867d419648fff2f83cb0b3891c8b36da92cc7f1931d46108c8"},
- {file = "pillow-11.2.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8b02d8f9cb83c52578a0b4beadba92e37d83a4ef11570a8688bbf43f4ca50909"},
- {file = "pillow-11.2.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:014ca0050c85003620526b0ac1ac53f56fc93af128f7546623cc8e31875ab928"},
- {file = "pillow-11.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3692b68c87096ac6308296d96354eddd25f98740c9d2ab54e1549d6c8aea9d79"},
- {file = "pillow-11.2.1-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:f781dcb0bc9929adc77bad571b8621ecb1e4cdef86e940fe2e5b5ee24fd33b35"},
- {file = "pillow-11.2.1-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:2b490402c96f907a166615e9a5afacf2519e28295f157ec3a2bb9bd57de638cb"},
- {file = "pillow-11.2.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dd6b20b93b3ccc9c1b597999209e4bc5cf2853f9ee66e3fc9a400a78733ffc9a"},
- {file = "pillow-11.2.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:4b835d89c08a6c2ee7781b8dd0a30209a8012b5f09c0a665b65b0eb3560b6f36"},
- {file = "pillow-11.2.1-cp39-cp39-win32.whl", hash = "sha256:b10428b3416d4f9c61f94b494681280be7686bda15898a3a9e08eb66a6d92d67"},
- {file = "pillow-11.2.1-cp39-cp39-win_amd64.whl", hash = "sha256:6ebce70c3f486acf7591a3d73431fa504a4e18a9b97ff27f5f47b7368e4b9dd1"},
- {file = "pillow-11.2.1-cp39-cp39-win_arm64.whl", hash = "sha256:c27476257b2fdcd7872d54cfd119b3a9ce4610fb85c8e32b70b42e3680a29a1e"},
- {file = "pillow-11.2.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:9b7b0d4fd2635f54ad82785d56bc0d94f147096493a79985d0ab57aedd563156"},
- {file = "pillow-11.2.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:aa442755e31c64037aa7c1cb186e0b369f8416c567381852c63444dd666fb772"},
- {file = "pillow-11.2.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0d3348c95b766f54b76116d53d4cb171b52992a1027e7ca50c81b43b9d9e363"},
- {file = "pillow-11.2.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85d27ea4c889342f7e35f6d56e7e1cb345632ad592e8c51b693d7b7556043ce0"},
- {file = "pillow-11.2.1-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:bf2c33d6791c598142f00c9c4c7d47f6476731c31081331664eb26d6ab583e01"},
- {file = "pillow-11.2.1-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e616e7154c37669fc1dfc14584f11e284e05d1c650e1c0f972f281c4ccc53193"},
- {file = "pillow-11.2.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:39ad2e0f424394e3aebc40168845fee52df1394a4673a6ee512d840d14ab3013"},
- {file = "pillow-11.2.1-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:80f1df8dbe9572b4b7abdfa17eb5d78dd620b1d55d9e25f834efdbee872d3aed"},
- {file = "pillow-11.2.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:ea926cfbc3957090becbcbbb65ad177161a2ff2ad578b5a6ec9bb1e1cd78753c"},
- {file = "pillow-11.2.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:738db0e0941ca0376804d4de6a782c005245264edaa253ffce24e5a15cbdc7bd"},
- {file = "pillow-11.2.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9db98ab6565c69082ec9b0d4e40dd9f6181dab0dd236d26f7a50b8b9bfbd5076"},
- {file = "pillow-11.2.1-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:036e53f4170e270ddb8797d4c590e6dd14d28e15c7da375c18978045f7e6c37b"},
- {file = "pillow-11.2.1-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:14f73f7c291279bd65fda51ee87affd7c1e097709f7fdd0188957a16c264601f"},
- {file = "pillow-11.2.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:208653868d5c9ecc2b327f9b9ef34e0e42a4cdd172c2988fd81d62d2bc9bc044"},
- {file = "pillow-11.2.1.tar.gz", hash = "sha256:a64dd61998416367b7ef979b73d3a85853ba9bec4c2925f74e588879a58716b6"},
-]
-
-[package.extras]
-docs = ["furo", "olefile", "sphinx (>=8.2)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinxext-opengraph"]
-fpx = ["olefile"]
-mic = ["olefile"]
-test-arrow = ["pyarrow"]
-tests = ["check-manifest", "coverage (>=7.4.2)", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout", "trove-classifiers (>=2024.10.12)"]
-typing = ["typing-extensions ; python_version < \"3.10\""]
-xmp = ["defusedxml"]
-
-[[package]]
-name = "platformdirs"
-version = "4.3.7"
-description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`."
-optional = false
-python-versions = ">=3.9"
-groups = ["main", "dev"]
-files = [
- {file = "platformdirs-4.3.7-py3-none-any.whl", hash = "sha256:a03875334331946f13c549dbd8f4bac7a13a50a895a0eb1e8c6a8ace80d40a94"},
- {file = "platformdirs-4.3.7.tar.gz", hash = "sha256:eb437d586b6a0986388f0d6f74aa0cde27b48d0e3d66843640bfb6bdcdb6e351"},
-]
-
-[package.extras]
-docs = ["furo (>=2024.8.6)", "proselint (>=0.14)", "sphinx (>=8.1.3)", "sphinx-autodoc-typehints (>=3)"]
-test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.3.4)", "pytest-cov (>=6)", "pytest-mock (>=3.14)"]
-type = ["mypy (>=1.14.1)"]
-
-[[package]]
-name = "pluggy"
-version = "1.5.0"
-description = "plugin and hook calling mechanisms for python"
-optional = false
-python-versions = ">=3.8"
-groups = ["dev"]
-files = [
- {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"},
- {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"},
-]
-
-[package.extras]
-dev = ["pre-commit", "tox"]
-testing = ["pytest", "pytest-benchmark"]
-
-[[package]]
-name = "prompt-toolkit"
-version = "3.0.51"
-description = "Library for building powerful interactive command lines in Python"
-optional = false
-python-versions = ">=3.8"
-groups = ["main"]
-files = [
- {file = "prompt_toolkit-3.0.51-py3-none-any.whl", hash = "sha256:52742911fde84e2d423e2f9a4cf1de7d7ac4e51958f648d9540e0fb8db077b07"},
- {file = "prompt_toolkit-3.0.51.tar.gz", hash = "sha256:931a162e3b27fc90c86f1b48bb1fb2c528c2761475e57c9c06de13311c7b54ed"},
-]
-
-[package.dependencies]
-wcwidth = "*"
-
-[[package]]
-name = "ptyprocess"
-version = "0.7.0"
-description = "Run a subprocess in a pseudo terminal"
-optional = false
-python-versions = "*"
-groups = ["main"]
-markers = "sys_platform != \"win32\" and sys_platform != \"emscripten\""
-files = [
- {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"},
- {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"},
-]
-
-[[package]]
-name = "pure-eval"
-version = "0.2.3"
-description = "Safely evaluate AST nodes without side effects"
-optional = false
-python-versions = "*"
-groups = ["main"]
-files = [
- {file = "pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0"},
- {file = "pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42"},
-]
-
-[package.extras]
-tests = ["pytest"]
-
-[[package]]
-name = "pyarrow"
-version = "19.0.1"
-description = "Python library for Apache Arrow"
-optional = false
-python-versions = ">=3.9"
-groups = ["main"]
-files = [
- {file = "pyarrow-19.0.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:fc28912a2dc924dddc2087679cc8b7263accc71b9ff025a1362b004711661a69"},
- {file = "pyarrow-19.0.1-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:fca15aabbe9b8355800d923cc2e82c8ef514af321e18b437c3d782aa884eaeec"},
- {file = "pyarrow-19.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad76aef7f5f7e4a757fddcdcf010a8290958f09e3470ea458c80d26f4316ae89"},
- {file = "pyarrow-19.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d03c9d6f2a3dffbd62671ca070f13fc527bb1867b4ec2b98c7eeed381d4f389a"},
- {file = "pyarrow-19.0.1-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:65cf9feebab489b19cdfcfe4aa82f62147218558d8d3f0fc1e9dea0ab8e7905a"},
- {file = "pyarrow-19.0.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:41f9706fbe505e0abc10e84bf3a906a1338905cbbcf1177b71486b03e6ea6608"},
- {file = "pyarrow-19.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:c6cb2335a411b713fdf1e82a752162f72d4a7b5dbc588e32aa18383318b05866"},
- {file = "pyarrow-19.0.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:cc55d71898ea30dc95900297d191377caba257612f384207fe9f8293b5850f90"},
- {file = "pyarrow-19.0.1-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:7a544ec12de66769612b2d6988c36adc96fb9767ecc8ee0a4d270b10b1c51e00"},
- {file = "pyarrow-19.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0148bb4fc158bfbc3d6dfe5001d93ebeed253793fff4435167f6ce1dc4bddeae"},
- {file = "pyarrow-19.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f24faab6ed18f216a37870d8c5623f9c044566d75ec586ef884e13a02a9d62c5"},
- {file = "pyarrow-19.0.1-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:4982f8e2b7afd6dae8608d70ba5bd91699077323f812a0448d8b7abdff6cb5d3"},
- {file = "pyarrow-19.0.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:49a3aecb62c1be1d822f8bf629226d4a96418228a42f5b40835c1f10d42e4db6"},
- {file = "pyarrow-19.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:008a4009efdb4ea3d2e18f05cd31f9d43c388aad29c636112c2966605ba33466"},
- {file = "pyarrow-19.0.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:80b2ad2b193e7d19e81008a96e313fbd53157945c7be9ac65f44f8937a55427b"},
- {file = "pyarrow-19.0.1-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:ee8dec072569f43835932a3b10c55973593abc00936c202707a4ad06af7cb294"},
- {file = "pyarrow-19.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d5d1ec7ec5324b98887bdc006f4d2ce534e10e60f7ad995e7875ffa0ff9cb14"},
- {file = "pyarrow-19.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3ad4c0eb4e2a9aeb990af6c09e6fa0b195c8c0e7b272ecc8d4d2b6574809d34"},
- {file = "pyarrow-19.0.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:d383591f3dcbe545f6cc62daaef9c7cdfe0dff0fb9e1c8121101cabe9098cfa6"},
- {file = "pyarrow-19.0.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:b4c4156a625f1e35d6c0b2132635a237708944eb41df5fbe7d50f20d20c17832"},
- {file = "pyarrow-19.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:5bd1618ae5e5476b7654c7b55a6364ae87686d4724538c24185bbb2952679960"},
- {file = "pyarrow-19.0.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:e45274b20e524ae5c39d7fc1ca2aa923aab494776d2d4b316b49ec7572ca324c"},
- {file = "pyarrow-19.0.1-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:d9dedeaf19097a143ed6da37f04f4051aba353c95ef507764d344229b2b740ae"},
- {file = "pyarrow-19.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ebfb5171bb5f4a52319344ebbbecc731af3f021e49318c74f33d520d31ae0c4"},
- {file = "pyarrow-19.0.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2a21d39fbdb948857f67eacb5bbaaf36802de044ec36fbef7a1c8f0dd3a4ab2"},
- {file = "pyarrow-19.0.1-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:99bc1bec6d234359743b01e70d4310d0ab240c3d6b0da7e2a93663b0158616f6"},
- {file = "pyarrow-19.0.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:1b93ef2c93e77c442c979b0d596af45e4665d8b96da598db145b0fec014b9136"},
- {file = "pyarrow-19.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:d9d46e06846a41ba906ab25302cf0fd522f81aa2a85a71021826f34639ad31ef"},
- {file = "pyarrow-19.0.1-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:c0fe3dbbf054a00d1f162fda94ce236a899ca01123a798c561ba307ca38af5f0"},
- {file = "pyarrow-19.0.1-cp313-cp313t-macosx_12_0_x86_64.whl", hash = "sha256:96606c3ba57944d128e8a8399da4812f56c7f61de8c647e3470b417f795d0ef9"},
- {file = "pyarrow-19.0.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f04d49a6b64cf24719c080b3c2029a3a5b16417fd5fd7c4041f94233af732f3"},
- {file = "pyarrow-19.0.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a9137cf7e1640dce4c190551ee69d478f7121b5c6f323553b319cac936395f6"},
- {file = "pyarrow-19.0.1-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:7c1bca1897c28013db5e4c83944a2ab53231f541b9e0c3f4791206d0c0de389a"},
- {file = "pyarrow-19.0.1-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:58d9397b2e273ef76264b45531e9d552d8ec8a6688b7390b5be44c02a37aade8"},
- {file = "pyarrow-19.0.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:b9766a47a9cb56fefe95cb27f535038b5a195707a08bf61b180e642324963b46"},
- {file = "pyarrow-19.0.1-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:6c5941c1aac89a6c2f2b16cd64fe76bcdb94b2b1e99ca6459de4e6f07638d755"},
- {file = "pyarrow-19.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fd44d66093a239358d07c42a91eebf5015aa54fccba959db899f932218ac9cc8"},
- {file = "pyarrow-19.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:335d170e050bcc7da867a1ed8ffb8b44c57aaa6e0843b156a501298657b1e972"},
- {file = "pyarrow-19.0.1-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:1c7556165bd38cf0cd992df2636f8bcdd2d4b26916c6b7e646101aff3c16f76f"},
- {file = "pyarrow-19.0.1-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:699799f9c80bebcf1da0983ba86d7f289c5a2a5c04b945e2f2bcf7e874a91911"},
- {file = "pyarrow-19.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:8464c9fbe6d94a7fe1599e7e8965f350fd233532868232ab2596a71586c5a429"},
- {file = "pyarrow-19.0.1.tar.gz", hash = "sha256:3bf266b485df66a400f282ac0b6d1b500b9d2ae73314a153dbe97d6d5cc8a99e"},
-]
-
-[package.extras]
-test = ["cffi", "hypothesis", "pandas", "pytest", "pytz"]
-
-[[package]]
-name = "pycparser"
-version = "2.22"
-description = "C parser in Python"
-optional = false
-python-versions = ">=3.8"
-groups = ["main"]
-files = [
- {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"},
- {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"},
-]
-
-[[package]]
-name = "pydyf"
-version = "0.11.0"
-description = "A low-level PDF generator."
-optional = false
-python-versions = ">=3.8"
-groups = ["main"]
-files = [
- {file = "pydyf-0.11.0-py3-none-any.whl", hash = "sha256:0aaf9e2ebbe786ec7a78ec3fbffa4cdcecde53fd6f563221d53c6bc1328848a3"},
- {file = "pydyf-0.11.0.tar.gz", hash = "sha256:394dddf619cca9d0c55715e3c55ea121a9bf9cbc780cdc1201a2427917b86b64"},
-]
-
-[package.extras]
-doc = ["sphinx", "sphinx_rtd_theme"]
-test = ["pillow", "pytest", "ruff"]
-
-[[package]]
-name = "pygments"
-version = "2.19.1"
-description = "Pygments is a syntax highlighting package written in Python."
-optional = false
-python-versions = ">=3.8"
-groups = ["main", "docs"]
-files = [
- {file = "pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c"},
- {file = "pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f"},
-]
-
-[package.extras]
-windows-terminal = ["colorama (>=0.4.6)"]
-
-[[package]]
-name = "pylint"
-version = "3.3.6"
-description = "python code static checker"
-optional = false
-python-versions = ">=3.9.0"
-groups = ["dev"]
-files = [
- {file = "pylint-3.3.6-py3-none-any.whl", hash = "sha256:8b7c2d3e86ae3f94fb27703d521dd0b9b6b378775991f504d7c3a6275aa0a6a6"},
- {file = "pylint-3.3.6.tar.gz", hash = "sha256:b634a041aac33706d56a0d217e6587228c66427e20ec21a019bc4cdee48c040a"},
-]
-
-[package.dependencies]
-astroid = ">=3.3.8,<=3.4.0.dev0"
-colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""}
-dill = [
- {version = ">=0.3.6", markers = "python_version >= \"3.11\""},
- {version = ">=0.3.7", markers = "python_version >= \"3.12\""},
-]
-isort = ">=4.2.5,<5.13 || >5.13,<7"
-mccabe = ">=0.6,<0.8"
-platformdirs = ">=2.2"
-tomlkit = ">=0.10.1"
-
-[package.extras]
-spelling = ["pyenchant (>=3.2,<4.0)"]
-testutils = ["gitpython (>3)"]
-
-[[package]]
-name = "pyparsing"
-version = "3.2.3"
-description = "pyparsing module - Classes and methods to define and execute parsing grammars"
-optional = false
-python-versions = ">=3.9"
-groups = ["main"]
-files = [
- {file = "pyparsing-3.2.3-py3-none-any.whl", hash = "sha256:a749938e02d6fd0b59b356ca504a24982314bb090c383e3cf201c95ef7e2bfcf"},
- {file = "pyparsing-3.2.3.tar.gz", hash = "sha256:b9c13f1ab8b3b542f72e28f634bad4de758ab3ce4546e4301970ad6fa77c38be"},
-]
-
-[package.extras]
-diagrams = ["jinja2", "railroad-diagrams"]
-
-[[package]]
-name = "pyphen"
-version = "0.17.2"
-description = "Pure Python module to hyphenate text"
-optional = false
-python-versions = ">=3.9"
-groups = ["main"]
-files = [
- {file = "pyphen-0.17.2-py3-none-any.whl", hash = "sha256:3a07fb017cb2341e1d9ff31b8634efb1ae4dc4b130468c7c39dd3d32e7c3affd"},
- {file = "pyphen-0.17.2.tar.gz", hash = "sha256:f60647a9c9b30ec6c59910097af82bc5dd2d36576b918e44148d8b07ef3b4aa3"},
-]
-
-[package.extras]
-doc = ["sphinx", "sphinx_rtd_theme"]
-test = ["pytest", "ruff"]
-
-[[package]]
-name = "pyqt6"
-version = "6.9.0"
-description = "Python bindings for the Qt cross platform application toolkit"
-optional = false
-python-versions = ">=3.9"
-groups = ["main"]
-files = [
- {file = "PyQt6-6.9.0-cp39-abi3-macosx_10_14_universal2.whl", hash = "sha256:5344240747e81bde1a4e0e98d4e6e2d96ad56a985d8f36b69cd529c1ca9ff760"},
- {file = "PyQt6-6.9.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:e344868228c71fc89a0edeb325497df4ff731a89cfa5fe57a9a4e9baecc9512b"},
- {file = "PyQt6-6.9.0-cp39-abi3-manylinux_2_39_aarch64.whl", hash = "sha256:1cbc5a282454cf19691be09eadbde019783f1ae0523e269b211b0173b67373f6"},
- {file = "PyQt6-6.9.0-cp39-abi3-win_amd64.whl", hash = "sha256:d36482000f0cd7ce84a35863766f88a5e671233d5f1024656b600cd8915b3752"},
- {file = "PyQt6-6.9.0-cp39-abi3-win_arm64.whl", hash = "sha256:0c8b7251608e05b479cfe731f95857e853067459f7cbbcfe90f89de1bcf04280"},
- {file = "pyqt6-6.9.0.tar.gz", hash = "sha256:6a8ff8e3cd18311bb7d937f7d741e787040ae7ff47ce751c28a94c5cddc1b4e6"},
-]
-
-[package.dependencies]
-PyQt6-Qt6 = ">=6.9.0,<6.10.0"
-PyQt6-sip = ">=13.8,<14"
-
-[[package]]
-name = "pyqt6-qt6"
-version = "6.9.0"
-description = "The subset of a Qt installation needed by PyQt6."
-optional = false
-python-versions = "*"
-groups = ["main"]
-files = [
- {file = "PyQt6_Qt6-6.9.0-py3-none-macosx_10_14_x86_64.whl", hash = "sha256:b1c4e4a78f0f22fbf88556e3d07c99e5ce93032feae5c1e575958d914612e0f9"},
- {file = "PyQt6_Qt6-6.9.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:6d3875119dec6bf5f799facea362aa0ad39bb23aa9654112faa92477abccb5ff"},
- {file = "PyQt6_Qt6-6.9.0-py3-none-manylinux_2_28_x86_64.whl", hash = "sha256:9c0e603c934e4f130c110190fbf2c482ff1221a58317266570678bc02db6b152"},
- {file = "PyQt6_Qt6-6.9.0-py3-none-manylinux_2_39_aarch64.whl", hash = "sha256:cf840e8ae20a0704e0343810cf0e485552db28bf09ea976e58ec0e9b7bb27fcd"},
- {file = "PyQt6_Qt6-6.9.0-py3-none-win_amd64.whl", hash = "sha256:c825a6f5a9875ef04ef6681eda16aa3a9e9ad71847aa78dfafcf388c8007aa0a"},
- {file = "PyQt6_Qt6-6.9.0-py3-none-win_arm64.whl", hash = "sha256:1188f118d1c570d27fba39707e3d8a48525f979816e73de0da55b9e6fa9ad0a1"},
-]
-
-[[package]]
-name = "pyqt6-sip"
-version = "13.10.0"
-description = "The sip module support for PyQt6"
-optional = false
-python-versions = ">=3.9"
-groups = ["main"]
-files = [
- {file = "PyQt6_sip-13.10.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e7b1258963717cfae1d30e262bb784db808072a8a674d98f57c2076caaa50499"},
- {file = "PyQt6_sip-13.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d27a3fed2a461f179d3cde6a74530fbad629ccaa66ed739b9544fda1932887af"},
- {file = "PyQt6_sip-13.10.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:0422781c77b85eefd7a26f104c5998ede178a16b0fd35212664250215b6e5e4c"},
- {file = "PyQt6_sip-13.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:f64183dde2af36515dab515f4301a5a8d9b3658b231769fa48fe6287dc52f375"},
- {file = "PyQt6_sip-13.10.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6e78fb8036b18f6258a1af0956c5a3cec1dd3d8dd5196ecd89a31b529bf40e82"},
- {file = "PyQt6_sip-13.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e19d5887fa3003a635419644dfed3158cb15eb566fc27b1ed56913a5767a71dc"},
- {file = "PyQt6_sip-13.10.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:079bb946edc3960f08d92b3a8eebff55d3abb51bc2a0583b6683dfd9f77a616a"},
- {file = "PyQt6_sip-13.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:90974f5dbba1f5d1d2ca9b1cfdfd5258e5e3cfacead03f0df674d54c69973ea7"},
- {file = "PyQt6_sip-13.10.0-cp311-cp311-win_arm64.whl", hash = "sha256:bbefd5539eeda4dec37e8b6dfc362ba240ec31279060336bcceaff572807dac8"},
- {file = "PyQt6_sip-13.10.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:48791db2914fc39c3218519a02d2a5fd3fcd354a1be3141a57bf2880701486f2"},
- {file = "PyQt6_sip-13.10.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:466d6b4791973c9fcbdc2e0087ed194b9ea802a8c3948867a849498f0841c70c"},
- {file = "PyQt6_sip-13.10.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:ae15358941f127cd3d1ab09c1ebd45c4dabb0b2e91587b9eebde0279d0039c54"},
- {file = "PyQt6_sip-13.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:ad573184fa8b00041944e5a17d150ab0d08db2d2189e39c9373574ebab3f2e58"},
- {file = "PyQt6_sip-13.10.0-cp312-cp312-win_arm64.whl", hash = "sha256:2d579d810d0047d40bde9c6aef281d6ed218db93c9496ebc9e55b9e6f27a229d"},
- {file = "PyQt6_sip-13.10.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7b6e250c2e7c14702a623f2cc1479d7fb8db2b6eee9697cac10d06fe79c281bb"},
- {file = "PyQt6_sip-13.10.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fcb30756568f8cd59290f9ef2ae5ee3e72ff9cdd61a6f80c9e3d3b95ae676be"},
- {file = "PyQt6_sip-13.10.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:757ac52c92b2ef0b56ecc7cd763b55a62d3c14271d7ea8d03315af85a70090ff"},
- {file = "PyQt6_sip-13.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:571900c44a3e38738d696234d94fe2043972b9de0633505451c99e2922cb6a34"},
- {file = "PyQt6_sip-13.10.0-cp313-cp313-win_arm64.whl", hash = "sha256:39cba2cc71cf80a99b4dc8147b43508d4716e128f9fb99f5eb5860a37f082282"},
- {file = "PyQt6_sip-13.10.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5f026a1278f9c2a745542d4a05350f2392d4cf339275fb8efccb47b0f213d120"},
- {file = "PyQt6_sip-13.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:548c70bc40d993be0eb011e1bbc41ba7c95f6af375613b58217f39ad8d703345"},
- {file = "PyQt6_sip-13.10.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:21417ffd2c489afef114cb09683bbc0fb24d78df848a21fc0d09e70ecbb0a4a4"},
- {file = "PyQt6_sip-13.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:6e1b1f7a29290afc83bcd9970e0cffa2d0da87d81796b6eab7b6f583e4f49652"},
- {file = "pyqt6_sip-13.10.0.tar.gz", hash = "sha256:d6daa95a0bd315d9ec523b549e0ce97455f61ded65d5eafecd83ed2aa4ae5350"},
-]
-
-[[package]]
-name = "pyqtgraph"
-version = "0.13.7"
-description = "Scientific Graphics and GUI Library for Python"
-optional = false
-python-versions = ">=3.9"
-groups = ["main"]
-files = [
- {file = "pyqtgraph-0.13.7-py3-none-any.whl", hash = "sha256:7754edbefb6c367fa0dfb176e2d0610da3ada20aa7a5318516c74af5fb72bf7a"},
- {file = "pyqtgraph-0.13.7.tar.gz", hash = "sha256:64f84f1935c6996d0e09b1ee66fe478a7771e3ca6f3aaa05f00f6e068321d9e3"},
-]
-
-[package.dependencies]
-numpy = ">=1.22.0"
-
-[[package]]
-name = "pytest"
-version = "8.3.5"
-description = "pytest: simple powerful testing with Python"
-optional = false
-python-versions = ">=3.8"
-groups = ["dev"]
-files = [
- {file = "pytest-8.3.5-py3-none-any.whl", hash = "sha256:c69214aa47deac29fad6c2a4f590b9c4a9fdb16a403176fe154b79c0b4d4d820"},
- {file = "pytest-8.3.5.tar.gz", hash = "sha256:f4efe70cc14e511565ac476b57c279e12a855b11f48f212af1080ef2263d3845"},
-]
-
-[package.dependencies]
-colorama = {version = "*", markers = "sys_platform == \"win32\""}
-iniconfig = "*"
-packaging = "*"
-pluggy = ">=1.5,<2"
-
-[package.extras]
-dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"]
-
-[[package]]
-name = "pytest-cov"
-version = "5.0.0"
-description = "Pytest plugin for measuring coverage."
-optional = false
-python-versions = ">=3.8"
-groups = ["dev"]
-files = [
- {file = "pytest-cov-5.0.0.tar.gz", hash = "sha256:5837b58e9f6ebd335b0f8060eecce69b662415b16dc503883a02f45dfeb14857"},
- {file = "pytest_cov-5.0.0-py3-none-any.whl", hash = "sha256:4f0764a1219df53214206bf1feea4633c3b558a2925c8b59f144f682861ce652"},
-]
-
-[package.dependencies]
-coverage = {version = ">=5.2.1", extras = ["toml"]}
-pytest = ">=4.6"
-
-[package.extras]
-testing = ["fields", "hunter", "process-tests", "pytest-xdist", "virtualenv"]
-
-[[package]]
-name = "python-dateutil"
-version = "2.9.0.post0"
-description = "Extensions to the standard Python datetime module"
-optional = false
-python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7"
-groups = ["main"]
-files = [
- {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"},
- {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"},
-]
-
-[package.dependencies]
-six = ">=1.5"
-
-[[package]]
-name = "pytz"
-version = "2025.2"
-description = "World timezone definitions, modern and historical"
-optional = false
-python-versions = "*"
-groups = ["main"]
-files = [
- {file = "pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00"},
- {file = "pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3"},
-]
-
-[[package]]
-name = "pyyaml"
-version = "6.0.2"
-description = "YAML parser and emitter for Python"
-optional = false
-python-versions = ">=3.8"
-groups = ["main", "docs"]
-files = [
- {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"},
- {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"},
- {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"},
- {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"},
- {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"},
- {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"},
- {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"},
- {file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"},
- {file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"},
- {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"},
- {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"},
- {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"},
- {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"},
- {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"},
- {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"},
- {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"},
- {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"},
- {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"},
- {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"},
- {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"},
- {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"},
- {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"},
- {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"},
- {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"},
- {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"},
- {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"},
- {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"},
- {file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"},
- {file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"},
- {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"},
- {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"},
- {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"},
- {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"},
- {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"},
- {file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"},
- {file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"},
- {file = "PyYAML-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a"},
- {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5"},
- {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d"},
- {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083"},
- {file = "PyYAML-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706"},
- {file = "PyYAML-6.0.2-cp38-cp38-win32.whl", hash = "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a"},
- {file = "PyYAML-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff"},
- {file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"},
- {file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"},
- {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"},
- {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"},
- {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"},
- {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"},
- {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"},
- {file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"},
- {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"},
- {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"},
-]
-
-[[package]]
-name = "quantstats"
-version = "0.0.64"
-description = "Portfolio analytics for quants"
-optional = false
-python-versions = "*"
-groups = ["main"]
-files = [
- {file = "QuantStats-0.0.64-py2.py3-none-any.whl", hash = "sha256:2dc6c2c54e0d879fc31e854c6015047366e30042d01892e127dcb07797e91107"},
- {file = "quantstats-0.0.64.tar.gz", hash = "sha256:a1e2533d751805d47303d8c053192fca12820b06f38b6a171bda2177ac8824cf"},
-]
-
-[package.dependencies]
-matplotlib = ">=3.0.0"
-numpy = ">=1.16.5"
-pandas = ">=0.24.0"
-python-dateutil = ">=2.0"
-scipy = ">=1.2.0"
-seaborn = ">=0.9.0"
-tabulate = ">=0.8.0"
-yfinance = ">=0.1.70"
-
-[[package]]
-name = "requests"
-version = "2.32.3"
-description = "Python HTTP for Humans."
-optional = false
-python-versions = ">=3.8"
-groups = ["main", "docs"]
-files = [
- {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"},
- {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"},
-]
-
-[package.dependencies]
-certifi = ">=2017.4.17"
-charset-normalizer = ">=2,<4"
-idna = ">=2.5,<4"
-urllib3 = ">=1.21.1,<3"
-
-[package.extras]
-socks = ["PySocks (>=1.5.6,!=1.5.7)"]
-use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"]
-
-[[package]]
-name = "rich"
-version = "14.0.0"
-description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal"
-optional = false
-python-versions = ">=3.8.0"
-groups = ["main"]
-files = [
- {file = "rich-14.0.0-py3-none-any.whl", hash = "sha256:1c9491e1951aac09caffd42f448ee3d04e58923ffe14993f6e83068dc395d7e0"},
- {file = "rich-14.0.0.tar.gz", hash = "sha256:82f1bc23a6a21ebca4ae0c45af9bdbc492ed20231dcb63f297d6d1021a9d5725"},
-]
-
-[package.dependencies]
-markdown-it-py = ">=2.2.0"
-pygments = ">=2.13.0,<3.0.0"
-
-[package.extras]
-jupyter = ["ipywidgets (>=7.5.1,<9)"]
-
-[[package]]
-name = "scipy"
-version = "1.15.2"
-description = "Fundamental algorithms for scientific computing in Python"
-optional = false
-python-versions = ">=3.10"
-groups = ["main"]
-files = [
- {file = "scipy-1.15.2-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:a2ec871edaa863e8213ea5df811cd600734f6400b4af272e1c011e69401218e9"},
- {file = "scipy-1.15.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:6f223753c6ea76983af380787611ae1291e3ceb23917393079dcc746ba60cfb5"},
- {file = "scipy-1.15.2-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:ecf797d2d798cf7c838c6d98321061eb3e72a74710e6c40540f0e8087e3b499e"},
- {file = "scipy-1.15.2-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:9b18aa747da280664642997e65aab1dd19d0c3d17068a04b3fe34e2559196cb9"},
- {file = "scipy-1.15.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87994da02e73549dfecaed9e09a4f9d58a045a053865679aeb8d6d43747d4df3"},
- {file = "scipy-1.15.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:69ea6e56d00977f355c0f84eba69877b6df084516c602d93a33812aa04d90a3d"},
- {file = "scipy-1.15.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:888307125ea0c4466287191e5606a2c910963405ce9671448ff9c81c53f85f58"},
- {file = "scipy-1.15.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9412f5e408b397ff5641080ed1e798623dbe1ec0d78e72c9eca8992976fa65aa"},
- {file = "scipy-1.15.2-cp310-cp310-win_amd64.whl", hash = "sha256:b5e025e903b4f166ea03b109bb241355b9c42c279ea694d8864d033727205e65"},
- {file = "scipy-1.15.2-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:92233b2df6938147be6fa8824b8136f29a18f016ecde986666be5f4d686a91a4"},
- {file = "scipy-1.15.2-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:62ca1ff3eb513e09ed17a5736929429189adf16d2d740f44e53270cc800ecff1"},
- {file = "scipy-1.15.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:4c6676490ad76d1c2894d77f976144b41bd1a4052107902238047fb6a473e971"},
- {file = "scipy-1.15.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:a8bf5cb4a25046ac61d38f8d3c3426ec11ebc350246a4642f2f315fe95bda655"},
- {file = "scipy-1.15.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a8e34cf4c188b6dd004654f88586d78f95639e48a25dfae9c5e34a6dc34547e"},
- {file = "scipy-1.15.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28a0d2c2075946346e4408b211240764759e0fabaeb08d871639b5f3b1aca8a0"},
- {file = "scipy-1.15.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:42dabaaa798e987c425ed76062794e93a243be8f0f20fff6e7a89f4d61cb3d40"},
- {file = "scipy-1.15.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6f5e296ec63c5da6ba6fa0343ea73fd51b8b3e1a300b0a8cae3ed4b1122c7462"},
- {file = "scipy-1.15.2-cp311-cp311-win_amd64.whl", hash = "sha256:597a0c7008b21c035831c39927406c6181bcf8f60a73f36219b69d010aa04737"},
- {file = "scipy-1.15.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c4697a10da8f8765bb7c83e24a470da5797e37041edfd77fd95ba3811a47c4fd"},
- {file = "scipy-1.15.2-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:869269b767d5ee7ea6991ed7e22b3ca1f22de73ab9a49c44bad338b725603301"},
- {file = "scipy-1.15.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:bad78d580270a4d32470563ea86c6590b465cb98f83d760ff5b0990cb5518a93"},
- {file = "scipy-1.15.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:b09ae80010f52efddb15551025f9016c910296cf70adbf03ce2a8704f3a5ad20"},
- {file = "scipy-1.15.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a6fd6eac1ce74a9f77a7fc724080d507c5812d61e72bd5e4c489b042455865e"},
- {file = "scipy-1.15.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b871df1fe1a3ba85d90e22742b93584f8d2b8e6124f8372ab15c71b73e428b8"},
- {file = "scipy-1.15.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:03205d57a28e18dfd39f0377d5002725bf1f19a46f444108c29bdb246b6c8a11"},
- {file = "scipy-1.15.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:601881dfb761311045b03114c5fe718a12634e5608c3b403737ae463c9885d53"},
- {file = "scipy-1.15.2-cp312-cp312-win_amd64.whl", hash = "sha256:e7c68b6a43259ba0aab737237876e5c2c549a031ddb7abc28c7b47f22e202ded"},
- {file = "scipy-1.15.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:01edfac9f0798ad6b46d9c4c9ca0e0ad23dbf0b1eb70e96adb9fa7f525eff0bf"},
- {file = "scipy-1.15.2-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:08b57a9336b8e79b305a143c3655cc5bdbe6d5ece3378578888d2afbb51c4e37"},
- {file = "scipy-1.15.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:54c462098484e7466362a9f1672d20888f724911a74c22ae35b61f9c5919183d"},
- {file = "scipy-1.15.2-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:cf72ff559a53a6a6d77bd8eefd12a17995ffa44ad86c77a5df96f533d4e6c6bb"},
- {file = "scipy-1.15.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9de9d1416b3d9e7df9923ab23cd2fe714244af10b763975bea9e4f2e81cebd27"},
- {file = "scipy-1.15.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb530e4794fc8ea76a4a21ccb67dea33e5e0e60f07fc38a49e821e1eae3b71a0"},
- {file = "scipy-1.15.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5ea7ed46d437fc52350b028b1d44e002646e28f3e8ddc714011aaf87330f2f32"},
- {file = "scipy-1.15.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:11e7ad32cf184b74380f43d3c0a706f49358b904fa7d5345f16ddf993609184d"},
- {file = "scipy-1.15.2-cp313-cp313-win_amd64.whl", hash = "sha256:a5080a79dfb9b78b768cebf3c9dcbc7b665c5875793569f48bf0e2b1d7f68f6f"},
- {file = "scipy-1.15.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:447ce30cee6a9d5d1379087c9e474628dab3db4a67484be1b7dc3196bfb2fac9"},
- {file = "scipy-1.15.2-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:c90ebe8aaa4397eaefa8455a8182b164a6cc1d59ad53f79943f266d99f68687f"},
- {file = "scipy-1.15.2-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:def751dd08243934c884a3221156d63e15234a3155cf25978b0a668409d45eb6"},
- {file = "scipy-1.15.2-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:302093e7dfb120e55515936cb55618ee0b895f8bcaf18ff81eca086c17bd80af"},
- {file = "scipy-1.15.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7cd5b77413e1855351cdde594eca99c1f4a588c2d63711388b6a1f1c01f62274"},
- {file = "scipy-1.15.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d0194c37037707b2afa7a2f2a924cf7bac3dc292d51b6a925e5fcb89bc5c776"},
- {file = "scipy-1.15.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:bae43364d600fdc3ac327db99659dcb79e6e7ecd279a75fe1266669d9a652828"},
- {file = "scipy-1.15.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f031846580d9acccd0044efd1a90e6f4df3a6e12b4b6bd694a7bc03a89892b28"},
- {file = "scipy-1.15.2-cp313-cp313t-win_amd64.whl", hash = "sha256:fe8a9eb875d430d81755472c5ba75e84acc980e4a8f6204d402849234d3017db"},
- {file = "scipy-1.15.2.tar.gz", hash = "sha256:cd58a314d92838f7e6f755c8a2167ead4f27e1fd5c1251fd54289569ef3495ec"},
-]
-
-[package.dependencies]
-numpy = ">=1.23.5,<2.5"
-
-[package.extras]
-dev = ["cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy (==1.10.0)", "pycodestyle", "pydevtool", "rich-click", "ruff (>=0.0.292)", "types-psutil", "typing_extensions"]
-doc = ["intersphinx_registry", "jupyterlite-pyodide-kernel", "jupyterlite-sphinx (>=0.16.5)", "jupytext", "matplotlib (>=3.5)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (>=0.15.2)", "sphinx (>=5.0.0,<8.0.0)", "sphinx-copybutton", "sphinx-design (>=0.4.0)"]
-test = ["Cython", "array-api-strict (>=2.0,<2.1.1)", "asv", "gmpy2", "hypothesis (>=6.30)", "meson", "mpmath", "ninja ; sys_platform != \"emscripten\"", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"]
-
-[[package]]
-name = "seaborn"
-version = "0.13.2"
-description = "Statistical data visualization"
-optional = false
-python-versions = ">=3.8"
-groups = ["main"]
-files = [
- {file = "seaborn-0.13.2-py3-none-any.whl", hash = "sha256:636f8336facf092165e27924f223d3c62ca560b1f2bb5dff7ab7fad265361987"},
- {file = "seaborn-0.13.2.tar.gz", hash = "sha256:93e60a40988f4d65e9f4885df477e2fdaff6b73a9ded434c1ab356dd57eefff7"},
-]
-
-[package.dependencies]
-matplotlib = ">=3.4,<3.6.1 || >3.6.1"
-numpy = ">=1.20,<1.24.0 || >1.24.0"
-pandas = ">=1.2"
-
-[package.extras]
-dev = ["flake8", "flit", "mypy", "pandas-stubs", "pre-commit", "pytest", "pytest-cov", "pytest-xdist"]
-docs = ["ipykernel", "nbconvert", "numpydoc", "pydata_sphinx_theme (==0.10.0rc2)", "pyyaml", "sphinx (<6.0.0)", "sphinx-copybutton", "sphinx-design", "sphinx-issues"]
-stats = ["scipy (>=1.7)", "statsmodels (>=0.12)"]
-
-[[package]]
-name = "six"
-version = "1.17.0"
-description = "Python 2 and 3 compatibility utilities"
-optional = false
-python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7"
-groups = ["main"]
-files = [
- {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"},
- {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"},
-]
-
-[[package]]
-name = "snowballstemmer"
-version = "2.2.0"
-description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms."
-optional = false
-python-versions = "*"
-groups = ["docs"]
-files = [
- {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"},
- {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"},
-]
-
-[[package]]
-name = "soupsieve"
-version = "2.6"
-description = "A modern CSS selector implementation for Beautiful Soup."
-optional = false
-python-versions = ">=3.8"
-groups = ["main"]
-files = [
- {file = "soupsieve-2.6-py3-none-any.whl", hash = "sha256:e72c4ff06e4fb6e4b5a9f0f55fe6e81514581fca1515028625d0f299c602ccc9"},
- {file = "soupsieve-2.6.tar.gz", hash = "sha256:e2e68417777af359ec65daac1057404a3c8a5455bb8abc36f1a9866ab1a51abb"},
-]
-
-[[package]]
-name = "sphinx"
-version = "7.4.7"
-description = "Python documentation generator"
-optional = false
-python-versions = ">=3.9"
-groups = ["docs"]
-files = [
- {file = "sphinx-7.4.7-py3-none-any.whl", hash = "sha256:c2419e2135d11f1951cd994d6eb18a1835bd8fdd8429f9ca375dc1f3281bd239"},
- {file = "sphinx-7.4.7.tar.gz", hash = "sha256:242f92a7ea7e6c5b406fdc2615413890ba9f699114a9c09192d7dfead2ee9cfe"},
-]
-
-[package.dependencies]
-alabaster = ">=0.7.14,<0.8.0"
-babel = ">=2.13"
-colorama = {version = ">=0.4.6", markers = "sys_platform == \"win32\""}
-docutils = ">=0.20,<0.22"
-imagesize = ">=1.3"
-Jinja2 = ">=3.1"
-packaging = ">=23.0"
-Pygments = ">=2.17"
-requests = ">=2.30.0"
-snowballstemmer = ">=2.2"
-sphinxcontrib-applehelp = "*"
-sphinxcontrib-devhelp = "*"
-sphinxcontrib-htmlhelp = ">=2.0.0"
-sphinxcontrib-jsmath = "*"
-sphinxcontrib-qthelp = "*"
-sphinxcontrib-serializinghtml = ">=1.1.9"
-
-[package.extras]
-docs = ["sphinxcontrib-websupport"]
-lint = ["flake8 (>=6.0)", "importlib-metadata (>=6.0)", "mypy (==1.10.1)", "pytest (>=6.0)", "ruff (==0.5.2)", "sphinx-lint (>=0.9)", "tomli (>=2)", "types-docutils (==0.21.0.20240711)", "types-requests (>=2.30.0)"]
-test = ["cython (>=3.0)", "defusedxml (>=0.7.1)", "pytest (>=8.0)", "setuptools (>=70.0)", "typing_extensions (>=4.9)"]
-
-[[package]]
-name = "sphinx-copybutton"
-version = "0.5.2"
-description = "Add a copy button to each of your code cells."
-optional = false
-python-versions = ">=3.7"
-groups = ["docs"]
-files = [
- {file = "sphinx-copybutton-0.5.2.tar.gz", hash = "sha256:4cf17c82fb9646d1bc9ca92ac280813a3b605d8c421225fd9913154103ee1fbd"},
- {file = "sphinx_copybutton-0.5.2-py3-none-any.whl", hash = "sha256:fb543fd386d917746c9a2c50360c7905b605726b9355cd26e9974857afeae06e"},
-]
-
-[package.dependencies]
-sphinx = ">=1.8"
-
-[package.extras]
-code-style = ["pre-commit (==2.12.1)"]
-rtd = ["ipython", "myst-nb", "sphinx", "sphinx-book-theme", "sphinx-examples"]
-
-[[package]]
-name = "sphinx-rtd-theme"
-version = "2.0.0"
-description = "Read the Docs theme for Sphinx"
-optional = false
-python-versions = ">=3.6"
-groups = ["docs"]
-files = [
- {file = "sphinx_rtd_theme-2.0.0-py2.py3-none-any.whl", hash = "sha256:ec93d0856dc280cf3aee9a4c9807c60e027c7f7b461b77aeffed682e68f0e586"},
- {file = "sphinx_rtd_theme-2.0.0.tar.gz", hash = "sha256:bd5d7b80622406762073a04ef8fadc5f9151261563d47027de09910ce03afe6b"},
-]
-
-[package.dependencies]
-docutils = "<0.21"
-sphinx = ">=5,<8"
-sphinxcontrib-jquery = ">=4,<5"
-
-[package.extras]
-dev = ["bump2version", "sphinxcontrib-httpdomain", "transifex-client", "wheel"]
-
-[[package]]
-name = "sphinxcontrib-applehelp"
-version = "2.0.0"
-description = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books"
-optional = false
-python-versions = ">=3.9"
-groups = ["docs"]
-files = [
- {file = "sphinxcontrib_applehelp-2.0.0-py3-none-any.whl", hash = "sha256:4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5"},
- {file = "sphinxcontrib_applehelp-2.0.0.tar.gz", hash = "sha256:2f29ef331735ce958efa4734873f084941970894c6090408b079c61b2e1c06d1"},
-]
-
-[package.extras]
-lint = ["mypy", "ruff (==0.5.5)", "types-docutils"]
-standalone = ["Sphinx (>=5)"]
-test = ["pytest"]
-
-[[package]]
-name = "sphinxcontrib-devhelp"
-version = "2.0.0"
-description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp documents"
-optional = false
-python-versions = ">=3.9"
-groups = ["docs"]
-files = [
- {file = "sphinxcontrib_devhelp-2.0.0-py3-none-any.whl", hash = "sha256:aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2"},
- {file = "sphinxcontrib_devhelp-2.0.0.tar.gz", hash = "sha256:411f5d96d445d1d73bb5d52133377b4248ec79db5c793ce7dbe59e074b4dd1ad"},
-]
-
-[package.extras]
-lint = ["mypy", "ruff (==0.5.5)", "types-docutils"]
-standalone = ["Sphinx (>=5)"]
-test = ["pytest"]
-
-[[package]]
-name = "sphinxcontrib-htmlhelp"
-version = "2.1.0"
-description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files"
-optional = false
-python-versions = ">=3.9"
-groups = ["docs"]
-files = [
- {file = "sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl", hash = "sha256:166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8"},
- {file = "sphinxcontrib_htmlhelp-2.1.0.tar.gz", hash = "sha256:c9e2916ace8aad64cc13a0d233ee22317f2b9025b9cf3295249fa985cc7082e9"},
-]
-
-[package.extras]
-lint = ["mypy", "ruff (==0.5.5)", "types-docutils"]
-standalone = ["Sphinx (>=5)"]
-test = ["html5lib", "pytest"]
-
-[[package]]
-name = "sphinxcontrib-jquery"
-version = "4.1"
-description = "Extension to include jQuery on newer Sphinx releases"
-optional = false
-python-versions = ">=2.7"
-groups = ["docs"]
-files = [
- {file = "sphinxcontrib-jquery-4.1.tar.gz", hash = "sha256:1620739f04e36a2c779f1a131a2dfd49b2fd07351bf1968ced074365933abc7a"},
- {file = "sphinxcontrib_jquery-4.1-py2.py3-none-any.whl", hash = "sha256:f936030d7d0147dd026a4f2b5a57343d233f1fc7b363f68b3d4f1cb0993878ae"},
-]
-
-[package.dependencies]
-Sphinx = ">=1.8"
-
-[[package]]
-name = "sphinxcontrib-jsmath"
-version = "1.0.1"
-description = "A sphinx extension which renders display math in HTML via JavaScript"
-optional = false
-python-versions = ">=3.5"
-groups = ["docs"]
-files = [
- {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"},
- {file = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"},
-]
-
-[package.extras]
-test = ["flake8", "mypy", "pytest"]
-
-[[package]]
-name = "sphinxcontrib-qthelp"
-version = "2.0.0"
-description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp documents"
-optional = false
-python-versions = ">=3.9"
-groups = ["docs"]
-files = [
- {file = "sphinxcontrib_qthelp-2.0.0-py3-none-any.whl", hash = "sha256:b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb"},
- {file = "sphinxcontrib_qthelp-2.0.0.tar.gz", hash = "sha256:4fe7d0ac8fc171045be623aba3e2a8f613f8682731f9153bb2e40ece16b9bbab"},
-]
-
-[package.extras]
-lint = ["mypy", "ruff (==0.5.5)", "types-docutils"]
-standalone = ["Sphinx (>=5)"]
-test = ["defusedxml (>=0.7.1)", "pytest"]
-
-[[package]]
-name = "sphinxcontrib-serializinghtml"
-version = "2.0.0"
-description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)"
-optional = false
-python-versions = ">=3.9"
-groups = ["docs"]
-files = [
- {file = "sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl", hash = "sha256:6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331"},
- {file = "sphinxcontrib_serializinghtml-2.0.0.tar.gz", hash = "sha256:e9d912827f872c029017a53f0ef2180b327c3f7fd23c87229f7a8e8b70031d4d"},
-]
-
-[package.extras]
-lint = ["mypy", "ruff (==0.5.5)", "types-docutils"]
-standalone = ["Sphinx (>=5)"]
-test = ["pytest"]
-
-[[package]]
-name = "sqlalchemy"
-version = "2.0.40"
-description = "Database Abstraction Library"
-optional = false
-python-versions = ">=3.7"
-groups = ["main"]
-files = [
- {file = "SQLAlchemy-2.0.40-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:ae9597cab738e7cc823f04a704fb754a9249f0b6695a6aeb63b74055cd417a96"},
- {file = "SQLAlchemy-2.0.40-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37a5c21ab099a83d669ebb251fddf8f5cee4d75ea40a5a1653d9c43d60e20867"},
- {file = "SQLAlchemy-2.0.40-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bece9527f5a98466d67fb5d34dc560c4da964240d8b09024bb21c1246545e04e"},
- {file = "SQLAlchemy-2.0.40-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:8bb131ffd2165fae48162c7bbd0d97c84ab961deea9b8bab16366543deeab625"},
- {file = "SQLAlchemy-2.0.40-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:9408fd453d5f8990405cc9def9af46bfbe3183e6110401b407c2d073c3388f47"},
- {file = "SQLAlchemy-2.0.40-cp37-cp37m-win32.whl", hash = "sha256:00a494ea6f42a44c326477b5bee4e0fc75f6a80c01570a32b57e89cf0fbef85a"},
- {file = "SQLAlchemy-2.0.40-cp37-cp37m-win_amd64.whl", hash = "sha256:c7b927155112ac858357ccf9d255dd8c044fd9ad2dc6ce4c4149527c901fa4c3"},
- {file = "sqlalchemy-2.0.40-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f1ea21bef99c703f44444ad29c2c1b6bd55d202750b6de8e06a955380f4725d7"},
- {file = "sqlalchemy-2.0.40-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:afe63b208153f3a7a2d1a5b9df452b0673082588933e54e7c8aac457cf35e758"},
- {file = "sqlalchemy-2.0.40-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a8aae085ea549a1eddbc9298b113cffb75e514eadbb542133dd2b99b5fb3b6af"},
- {file = "sqlalchemy-2.0.40-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ea9181284754d37db15156eb7be09c86e16e50fbe77610e9e7bee09291771a1"},
- {file = "sqlalchemy-2.0.40-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:5434223b795be5c5ef8244e5ac98056e290d3a99bdcc539b916e282b160dda00"},
- {file = "sqlalchemy-2.0.40-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:15d08d5ef1b779af6a0909b97be6c1fd4298057504eb6461be88bd1696cb438e"},
- {file = "sqlalchemy-2.0.40-cp310-cp310-win32.whl", hash = "sha256:cd2f75598ae70bcfca9117d9e51a3b06fe29edd972fdd7fd57cc97b4dbf3b08a"},
- {file = "sqlalchemy-2.0.40-cp310-cp310-win_amd64.whl", hash = "sha256:2cbafc8d39ff1abdfdda96435f38fab141892dc759a2165947d1a8fffa7ef596"},
- {file = "sqlalchemy-2.0.40-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f6bacab7514de6146a1976bc56e1545bee247242fab030b89e5f70336fc0003e"},
- {file = "sqlalchemy-2.0.40-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5654d1ac34e922b6c5711631f2da497d3a7bffd6f9f87ac23b35feea56098011"},
- {file = "sqlalchemy-2.0.40-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35904d63412db21088739510216e9349e335f142ce4a04b69e2528020ee19ed4"},
- {file = "sqlalchemy-2.0.40-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c7a80ed86d6aaacb8160a1caef6680d4ddd03c944d985aecee940d168c411d1"},
- {file = "sqlalchemy-2.0.40-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:519624685a51525ddaa7d8ba8265a1540442a2ec71476f0e75241eb8263d6f51"},
- {file = "sqlalchemy-2.0.40-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:2ee5f9999a5b0e9689bed96e60ee53c3384f1a05c2dd8068cc2e8361b0df5b7a"},
- {file = "sqlalchemy-2.0.40-cp311-cp311-win32.whl", hash = "sha256:c0cae71e20e3c02c52f6b9e9722bca70e4a90a466d59477822739dc31ac18b4b"},
- {file = "sqlalchemy-2.0.40-cp311-cp311-win_amd64.whl", hash = "sha256:574aea2c54d8f1dd1699449f332c7d9b71c339e04ae50163a3eb5ce4c4325ee4"},
- {file = "sqlalchemy-2.0.40-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:9d3b31d0a1c44b74d3ae27a3de422dfccd2b8f0b75e51ecb2faa2bf65ab1ba0d"},
- {file = "sqlalchemy-2.0.40-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:37f7a0f506cf78c80450ed1e816978643d3969f99c4ac6b01104a6fe95c5490a"},
- {file = "sqlalchemy-2.0.40-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bb933a650323e476a2e4fbef8997a10d0003d4da996aad3fd7873e962fdde4d"},
- {file = "sqlalchemy-2.0.40-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6959738971b4745eea16f818a2cd086fb35081383b078272c35ece2b07012716"},
- {file = "sqlalchemy-2.0.40-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:110179728e442dae85dd39591beb74072ae4ad55a44eda2acc6ec98ead80d5f2"},
- {file = "sqlalchemy-2.0.40-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e8040680eaacdce4d635f12c55c714f3d4c7f57da2bc47a01229d115bd319191"},
- {file = "sqlalchemy-2.0.40-cp312-cp312-win32.whl", hash = "sha256:650490653b110905c10adac69408380688cefc1f536a137d0d69aca1069dc1d1"},
- {file = "sqlalchemy-2.0.40-cp312-cp312-win_amd64.whl", hash = "sha256:2be94d75ee06548d2fc591a3513422b873490efb124048f50556369a834853b0"},
- {file = "sqlalchemy-2.0.40-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:915866fd50dd868fdcc18d61d8258db1bf9ed7fbd6dfec960ba43365952f3b01"},
- {file = "sqlalchemy-2.0.40-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4a4c5a2905a9ccdc67a8963e24abd2f7afcd4348829412483695c59e0af9a705"},
- {file = "sqlalchemy-2.0.40-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55028d7a3ebdf7ace492fab9895cbc5270153f75442a0472d8516e03159ab364"},
- {file = "sqlalchemy-2.0.40-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6cfedff6878b0e0d1d0a50666a817ecd85051d12d56b43d9d425455e608b5ba0"},
- {file = "sqlalchemy-2.0.40-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bb19e30fdae77d357ce92192a3504579abe48a66877f476880238a962e5b96db"},
- {file = "sqlalchemy-2.0.40-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:16d325ea898f74b26ffcd1cf8c593b0beed8714f0317df2bed0d8d1de05a8f26"},
- {file = "sqlalchemy-2.0.40-cp313-cp313-win32.whl", hash = "sha256:a669cbe5be3c63f75bcbee0b266779706f1a54bcb1000f302685b87d1b8c1500"},
- {file = "sqlalchemy-2.0.40-cp313-cp313-win_amd64.whl", hash = "sha256:641ee2e0834812d657862f3a7de95e0048bdcb6c55496f39c6fa3d435f6ac6ad"},
- {file = "sqlalchemy-2.0.40-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:50f5885bbed261fc97e2e66c5156244f9704083a674b8d17f24c72217d29baf5"},
- {file = "sqlalchemy-2.0.40-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cf0e99cdb600eabcd1d65cdba0d3c91418fee21c4aa1d28db47d095b1064a7d8"},
- {file = "sqlalchemy-2.0.40-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fe147fcd85aaed53ce90645c91ed5fca0cc88a797314c70dfd9d35925bd5d106"},
- {file = "sqlalchemy-2.0.40-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baf7cee56bd552385c1ee39af360772fbfc2f43be005c78d1140204ad6148438"},
- {file = "sqlalchemy-2.0.40-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:4aeb939bcac234b88e2d25d5381655e8353fe06b4e50b1c55ecffe56951d18c2"},
- {file = "sqlalchemy-2.0.40-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c268b5100cfeaa222c40f55e169d484efa1384b44bf9ca415eae6d556f02cb08"},
- {file = "sqlalchemy-2.0.40-cp38-cp38-win32.whl", hash = "sha256:46628ebcec4f23a1584fb52f2abe12ddb00f3bb3b7b337618b80fc1b51177aff"},
- {file = "sqlalchemy-2.0.40-cp38-cp38-win_amd64.whl", hash = "sha256:7e0505719939e52a7b0c65d20e84a6044eb3712bb6f239c6b1db77ba8e173a37"},
- {file = "sqlalchemy-2.0.40-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c884de19528e0fcd9dc34ee94c810581dd6e74aef75437ff17e696c2bfefae3e"},
- {file = "sqlalchemy-2.0.40-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1abb387710283fc5983d8a1209d9696a4eae9db8d7ac94b402981fe2fe2e39ad"},
- {file = "sqlalchemy-2.0.40-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cfa124eda500ba4b0d3afc3e91ea27ed4754e727c7f025f293a22f512bcd4c9"},
- {file = "sqlalchemy-2.0.40-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b6b28d303b9d57c17a5164eb1fd2d5119bb6ff4413d5894e74873280483eeb5"},
- {file = "sqlalchemy-2.0.40-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:b5a5bbe29c10c5bfd63893747a1bf6f8049df607638c786252cb9243b86b6706"},
- {file = "sqlalchemy-2.0.40-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:f0fda83e113bb0fb27dc003685f32a5dcb99c9c4f41f4fa0838ac35265c23b5c"},
- {file = "sqlalchemy-2.0.40-cp39-cp39-win32.whl", hash = "sha256:957f8d85d5e834397ef78a6109550aeb0d27a53b5032f7a57f2451e1adc37e98"},
- {file = "sqlalchemy-2.0.40-cp39-cp39-win_amd64.whl", hash = "sha256:1ffdf9c91428e59744f8e6f98190516f8e1d05eec90e936eb08b257332c5e870"},
- {file = "sqlalchemy-2.0.40-py3-none-any.whl", hash = "sha256:32587e2e1e359276957e6fe5dad089758bc042a971a8a09ae8ecf7a8fe23d07a"},
- {file = "sqlalchemy-2.0.40.tar.gz", hash = "sha256:d827099289c64589418ebbcaead0145cd19f4e3e8a93919a0100247af245fa00"},
-]
-
-[package.dependencies]
-greenlet = {version = ">=1", markers = "python_version < \"3.14\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\")"}
-typing-extensions = ">=4.6.0"
-
-[package.extras]
-aiomysql = ["aiomysql (>=0.2.0)", "greenlet (>=1)"]
-aioodbc = ["aioodbc", "greenlet (>=1)"]
-aiosqlite = ["aiosqlite", "greenlet (>=1)", "typing_extensions (!=3.10.0.1)"]
-asyncio = ["greenlet (>=1)"]
-asyncmy = ["asyncmy (>=0.2.3,!=0.2.4,!=0.2.6)", "greenlet (>=1)"]
-mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2,!=1.1.5,!=1.1.10)"]
-mssql = ["pyodbc"]
-mssql-pymssql = ["pymssql"]
-mssql-pyodbc = ["pyodbc"]
-mypy = ["mypy (>=0.910)"]
-mysql = ["mysqlclient (>=1.4.0)"]
-mysql-connector = ["mysql-connector-python"]
-oracle = ["cx_oracle (>=8)"]
-oracle-oracledb = ["oracledb (>=1.0.1)"]
-postgresql = ["psycopg2 (>=2.7)"]
-postgresql-asyncpg = ["asyncpg", "greenlet (>=1)"]
-postgresql-pg8000 = ["pg8000 (>=1.29.1)"]
-postgresql-psycopg = ["psycopg (>=3.0.7)"]
-postgresql-psycopg2binary = ["psycopg2-binary"]
-postgresql-psycopg2cffi = ["psycopg2cffi"]
-postgresql-psycopgbinary = ["psycopg[binary] (>=3.0.7)"]
-pymysql = ["pymysql"]
-sqlcipher = ["sqlcipher3_binary"]
-
-[[package]]
-name = "stack-data"
-version = "0.6.3"
-description = "Extract data from python stack frames and tracebacks for informative displays"
-optional = false
-python-versions = "*"
-groups = ["main"]
-files = [
- {file = "stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695"},
- {file = "stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9"},
-]
-
-[package.dependencies]
-asttokens = ">=2.1.0"
-executing = ">=1.2.0"
-pure-eval = "*"
-
-[package.extras]
-tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"]
-
-[[package]]
-name = "tabulate"
-version = "0.9.0"
-description = "Pretty-print tabular data"
-optional = false
-python-versions = ">=3.7"
-groups = ["main"]
-files = [
- {file = "tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f"},
- {file = "tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c"},
-]
-
-[package.extras]
-widechars = ["wcwidth"]
-
-[[package]]
-name = "tinycss2"
-version = "1.4.0"
-description = "A tiny CSS parser"
-optional = false
-python-versions = ">=3.8"
-groups = ["main"]
-files = [
- {file = "tinycss2-1.4.0-py3-none-any.whl", hash = "sha256:3a49cf47b7675da0b15d0c6e1df8df4ebd96e9394bb905a5775adb0d884c5289"},
- {file = "tinycss2-1.4.0.tar.gz", hash = "sha256:10c0972f6fc0fbee87c3edb76549357415e94548c1ae10ebccdea16fb404a9b7"},
-]
-
-[package.dependencies]
-webencodings = ">=0.4"
-
-[package.extras]
-doc = ["sphinx", "sphinx_rtd_theme"]
-test = ["pytest", "ruff"]
-
-[[package]]
-name = "tinyhtml5"
-version = "2.0.0"
-description = "HTML parser based on the WHATWG HTML specification"
-optional = false
-python-versions = ">=3.9"
-groups = ["main"]
-files = [
- {file = "tinyhtml5-2.0.0-py3-none-any.whl", hash = "sha256:13683277c5b176d070f82d099d977194b7a1e26815b016114f581a74bbfbf47e"},
- {file = "tinyhtml5-2.0.0.tar.gz", hash = "sha256:086f998833da24c300c414d9fe81d9b368fd04cb9d2596a008421cbc705fcfcc"},
-]
-
-[package.dependencies]
-webencodings = ">=0.5.1"
-
-[package.extras]
-doc = ["sphinx", "sphinx_rtd_theme"]
-test = ["pytest", "ruff"]
-
-[[package]]
-name = "tomlkit"
-version = "0.13.2"
-description = "Style preserving TOML library"
-optional = false
-python-versions = ">=3.8"
-groups = ["dev"]
-files = [
- {file = "tomlkit-0.13.2-py3-none-any.whl", hash = "sha256:7a974427f6e119197f670fbbbeae7bef749a6c14e793db934baefc1b5f03efde"},
- {file = "tomlkit-0.13.2.tar.gz", hash = "sha256:fff5fe59a87295b278abd31bec92c15d9bc4a06885ab12bcea52c71119392e79"},
-]
-
-[[package]]
-name = "traitlets"
-version = "5.14.3"
-description = "Traitlets Python configuration system"
-optional = false
-python-versions = ">=3.8"
-groups = ["main"]
-files = [
- {file = "traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f"},
- {file = "traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7"},
-]
-
-[package.extras]
-docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"]
-test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<8.2)", "pytest-mock", "pytest-mypy-testing"]
-
-[[package]]
-name = "typing-extensions"
-version = "4.13.2"
-description = "Backported and Experimental Type Hints for Python 3.8+"
-optional = false
-python-versions = ">=3.8"
-groups = ["main", "dev"]
-files = [
- {file = "typing_extensions-4.13.2-py3-none-any.whl", hash = "sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c"},
- {file = "typing_extensions-4.13.2.tar.gz", hash = "sha256:e6c81219bd689f51865d9e372991c540bda33a0379d5573cddb9a3a23f7caaef"},
-]
-
-[[package]]
-name = "tzdata"
-version = "2025.2"
-description = "Provider of IANA time zone data"
-optional = false
-python-versions = ">=2"
-groups = ["main"]
-files = [
- {file = "tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8"},
- {file = "tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9"},
-]
-
-[[package]]
-name = "urllib3"
-version = "2.4.0"
-description = "HTTP library with thread-safe connection pooling, file post, and more."
-optional = false
-python-versions = ">=3.9"
-groups = ["main", "docs"]
-files = [
- {file = "urllib3-2.4.0-py3-none-any.whl", hash = "sha256:4e16665048960a0900c702d4a66415956a584919c03361cac9f1df5c5dd7e813"},
- {file = "urllib3-2.4.0.tar.gz", hash = "sha256:414bc6535b787febd7567804cc015fee39daab8ad86268f1310a9250697de466"},
-]
-
-[package.extras]
-brotli = ["brotli (>=1.0.9) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\""]
-h2 = ["h2 (>=4,<5)"]
-socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"]
-zstd = ["zstandard (>=0.18.0)"]
-
-[[package]]
-name = "wcwidth"
-version = "0.2.13"
-description = "Measures the displayed width of unicode strings in a terminal"
-optional = false
-python-versions = "*"
-groups = ["main"]
-files = [
- {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"},
- {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"},
-]
-
-[[package]]
-name = "weasyprint"
-version = "65.1"
-description = "The Awesome Document Factory"
-optional = false
-python-versions = ">=3.9"
-groups = ["main"]
-files = [
- {file = "weasyprint-65.1-py3-none-any.whl", hash = "sha256:9baa54282dc86929f6b877034d06b0416e2a7cacb1af3f73d80960592fd0af89"},
- {file = "weasyprint-65.1.tar.gz", hash = "sha256:120281bdbd42ffaa7d7e5cedbe3182a2cef36ea5ad97fe9f357e43be6a1e58ea"},
-]
-
-[package.dependencies]
-cffi = ">=0.6"
-cssselect2 = ">=0.8.0"
-fonttools = {version = ">=4.0.0", extras = ["woff"]}
-Pillow = ">=9.1.0"
-pydyf = ">=0.11.0"
-Pyphen = ">=0.9.1"
-tinycss2 = ">=1.4.0"
-tinyhtml5 = ">=2.0.0b1"
-
-[package.extras]
-doc = ["furo", "sphinx"]
-test = ["pytest", "ruff"]
-
-[[package]]
-name = "webencodings"
-version = "0.5.1"
-description = "Character encoding aliases for legacy web content"
-optional = false
-python-versions = "*"
-groups = ["main"]
-files = [
- {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"},
- {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"},
-]
-
-[[package]]
-name = "yfinance"
-version = "0.2.55"
-description = "Download market data from Yahoo! Finance API"
-optional = false
-python-versions = "*"
-groups = ["main"]
-files = [
- {file = "yfinance-0.2.55-py2.py3-none-any.whl", hash = "sha256:e34529ab69a5e48458b66f8369afeb396cf8c28d0e17cc392c4a02a7f31f1af0"},
- {file = "yfinance-0.2.55.tar.gz", hash = "sha256:a17f62874b12a2e52f66a220033f34b066584db210aa9da88a7add84f4b312ed"},
-]
-
-[package.dependencies]
-beautifulsoup4 = ">=4.11.1"
-frozendict = ">=2.3.4"
-multitasking = ">=0.0.7"
-numpy = ">=1.16.5"
-pandas = ">=1.3.0"
-peewee = ">=3.16.2"
-platformdirs = ">=2.0.0"
-pytz = ">=2022.5"
-requests = ">=2.31"
-
-[package.extras]
-nospam = ["requests_cache (>=1.0)", "requests_ratelimiter (>=0.3.1)"]
-repair = ["scipy (>=1.6.3)"]
-
-[[package]]
-name = "zopfli"
-version = "0.2.3.post1"
-description = "Zopfli module for python"
-optional = false
-python-versions = ">=3.8"
-groups = ["main"]
-files = [
- {file = "zopfli-0.2.3.post1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e0137dd64a493ba6a4be37405cfd6febe650a98cc1e9dca8f6b8c63b1db11b41"},
- {file = "zopfli-0.2.3.post1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:aa588b21044f8a74e423d8c8a4c7fc9988501878aacced793467010039c50734"},
- {file = "zopfli-0.2.3.post1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9f4a7ec2770e6af05f5a02733fd3900f30a9cd58e5d6d3727e14c5bcd6e7d587"},
- {file = "zopfli-0.2.3.post1-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f7d69c1a7168ad0e9cb864e8663acb232986a0c9c9cb9801f56bf6214f53a54d"},
- {file = "zopfli-0.2.3.post1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c2d2bc8129707e34c51f9352c4636ca313b52350bbb7e04637c46c1818a2a70"},
- {file = "zopfli-0.2.3.post1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:39e576f93576c5c223b41d9c780bbb91fd6db4babf3223d2a4fe7bf568e2b5a8"},
- {file = "zopfli-0.2.3.post1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:cbe6df25807227519debd1a57ab236f5f6bad441500e85b13903e51f93a43214"},
- {file = "zopfli-0.2.3.post1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7cce242b5df12b2b172489daf19c32e5577dd2fac659eb4b17f6a6efb446fd5c"},
- {file = "zopfli-0.2.3.post1-cp310-cp310-win32.whl", hash = "sha256:f815fcc2b2a457977724bad97fb4854022980f51ce7b136925e336b530545ae1"},
- {file = "zopfli-0.2.3.post1-cp310-cp310-win_amd64.whl", hash = "sha256:0cc20b02a9531559945324c38302fd4ba763311632d0ec8a1a0aa9c10ea363e6"},
- {file = "zopfli-0.2.3.post1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:518f1f4ed35dd69ce06b552f84e6d081f07c552b4c661c5312d950a0b764a58a"},
- {file = "zopfli-0.2.3.post1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:615a8ac9dda265e9cc38b2a76c3142e4a9f30fea4a79c85f670850783bc6feb4"},
- {file = "zopfli-0.2.3.post1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a82fc2dbebe6eb908b9c665e71496f8525c1bc4d2e3a7a7722ef2b128b6227c8"},
- {file = "zopfli-0.2.3.post1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37d011e92f7b9622742c905fdbed9920a1d0361df84142807ea2a528419dea7f"},
- {file = "zopfli-0.2.3.post1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e63d558847166543c2c9789e6f985400a520b7eacc4b99181668b2c3aeadd352"},
- {file = "zopfli-0.2.3.post1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:60db20f06c3d4c5934b16cfa62a2cc5c3f0686bffe0071ed7804d3c31ab1a04e"},
- {file = "zopfli-0.2.3.post1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:716cdbfc57bfd3d3e31a58e6246e8190e6849b7dbb7c4ce39ef8bbf0edb8f6d5"},
- {file = "zopfli-0.2.3.post1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3a89277ed5f8c0fb2d0b46d669aa0633123aa7381f1f6118c12f15e0fb48f8ca"},
- {file = "zopfli-0.2.3.post1-cp311-cp311-win32.whl", hash = "sha256:75a26a2307b10745a83b660c404416e984ee6fca515ec7f0765f69af3ce08072"},
- {file = "zopfli-0.2.3.post1-cp311-cp311-win_amd64.whl", hash = "sha256:81c341d9bb87a6dbbb0d45d6e272aca80c7c97b4b210f9b6e233bf8b87242f29"},
- {file = "zopfli-0.2.3.post1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:3f0197b6aa6eb3086ae9e66d6dd86c4d502b6c68b0ec490496348ae8c05ecaef"},
- {file = "zopfli-0.2.3.post1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:5fcfc0dc2761e4fcc15ad5d273b4d58c2e8e059d3214a7390d4d3c8e2aee644e"},
- {file = "zopfli-0.2.3.post1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cac2b37ab21c2b36a10b685b1893ebd6b0f83ae26004838ac817680881576567"},
- {file = "zopfli-0.2.3.post1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d5ab297d660b75c159190ce6d73035502310e40fd35170aed7d1a1aea7ddd65"},
- {file = "zopfli-0.2.3.post1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ba214f4f45bec195ee8559651154d3ac2932470b9d91c5715fc29c013349f8c"},
- {file = "zopfli-0.2.3.post1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c1e0ed5d84ffa2d677cc9582fc01e61dab2e7ef8b8996e055f0a76167b1b94df"},
- {file = "zopfli-0.2.3.post1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:bfa1eb759e07d8b7aa7a310a2bc535e127ee70addf90dc8d4b946b593c3e51a8"},
- {file = "zopfli-0.2.3.post1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:cd2c002f160502608dcc822ed2441a0f4509c52e86fcfd1a09e937278ed1ca14"},
- {file = "zopfli-0.2.3.post1-cp312-cp312-win32.whl", hash = "sha256:7be5cc6732eb7b4df17305d8a7b293223f934a31783a874a01164703bc1be6cd"},
- {file = "zopfli-0.2.3.post1-cp312-cp312-win_amd64.whl", hash = "sha256:4e50ffac74842c1c1018b9b73875a0d0a877c066ab06bf7cccbaa84af97e754f"},
- {file = "zopfli-0.2.3.post1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ecb7572df5372abce8073df078207d9d1749f20b8b136089916a4a0868d56051"},
- {file = "zopfli-0.2.3.post1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a1cf720896d2ce998bc8e051d4b4ce0d8bec007aab6243102e8e1d22a0b2fb3f"},
- {file = "zopfli-0.2.3.post1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5aad740b4d4fcbaaae4887823925166ffd062db3b248b3f432198fc287381d1a"},
- {file = "zopfli-0.2.3.post1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6617fb10f9e4393b331941861d73afb119cd847e88e4974bdbe8068ceef3f73f"},
- {file = "zopfli-0.2.3.post1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a53b18797cdef27e019db595d66c4b077325afe2fd62145953275f53d84ce40c"},
- {file = "zopfli-0.2.3.post1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b78008a69300d929ca2efeffec951b64a312e9a811e265ea4a907ab546d79fa6"},
- {file = "zopfli-0.2.3.post1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:0aa5f90d6298bda02a95bc8dc8c3c19004d5a4e44bda00b67ca7431d857b4b54"},
- {file = "zopfli-0.2.3.post1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:2768c877f76c8a0e7519b1c86c93757f3c01492ddde55751e9988afb7eff64e1"},
- {file = "zopfli-0.2.3.post1-cp313-cp313-win32.whl", hash = "sha256:71390dbd3fbf6ebea9a5d85ffed8c26ee1453ee09248e9b88486e30e0397b775"},
- {file = "zopfli-0.2.3.post1-cp313-cp313-win_amd64.whl", hash = "sha256:a86eb88e06bd87e1fff31dac878965c26b0c26db59ddcf78bb0379a954b120de"},
- {file = "zopfli-0.2.3.post1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:3827170de28faf144992d3d4dcf8f3998fe3c8a6a6f4a08f1d42c2ec6119d2bb"},
- {file = "zopfli-0.2.3.post1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b0ec13f352ea5ae0fc91f98a48540512eed0767d0ec4f7f3cb92d92797983d18"},
- {file = "zopfli-0.2.3.post1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f272186e03ad55e7af09ab78055535c201b1a0bcc2944edb1768298d9c483a4"},
- {file = "zopfli-0.2.3.post1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:29ea74e72ffa6e291b8c6f2504ce6c146b4fe990c724c1450eb8e4c27fd31431"},
- {file = "zopfli-0.2.3.post1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:eb45a34f23da4f8bc712b6376ca5396914b0b7c09adbb001dad964eb7f3132f8"},
- {file = "zopfli-0.2.3.post1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:6482db9876c68faac2d20a96b566ffbf65ddaadd97b222e4e73641f4f8722fc4"},
- {file = "zopfli-0.2.3.post1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:95a260cafd56b8fffa679918937401c80bb38e1681c448b988022e4c3610965d"},
- {file = "zopfli-0.2.3.post1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:676919fba7311125244eb0c4393679ac5fe856e5864a15d122bd815205369fa0"},
- {file = "zopfli-0.2.3.post1-cp38-cp38-win32.whl", hash = "sha256:b9026a21b6d41eb0e2e63f5bc1242c3fcc43ecb770963cda99a4307863dac12e"},
- {file = "zopfli-0.2.3.post1-cp38-cp38-win_amd64.whl", hash = "sha256:3c163911f8bad94b3e1db0a572e7c28ba681a0c91d0002ea1e4fa9264c21ef17"},
- {file = "zopfli-0.2.3.post1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b05296e8bc88c92e2b21e0a9bae4740c1551ee613c1d93a51fd28a7a0b2b6fbb"},
- {file = "zopfli-0.2.3.post1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f12000a6accdd4bf0a3fa6eaa1b1c7a7bc80af0a2edf3f89d770d3dcce1d0e22"},
- {file = "zopfli-0.2.3.post1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a241a68581d34d67b40c425cce3d1fd211c092f99d9250947824ccba9f491949"},
- {file = "zopfli-0.2.3.post1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3657e416ffb8f31d9d3424af12122bb251befae109f2e271d87d825c92fc5b7b"},
- {file = "zopfli-0.2.3.post1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:4915a41375bdee4db749ecd07d985a0486eb688a6619f713b7bf6fbfd145e960"},
- {file = "zopfli-0.2.3.post1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:bbe429fc50686bb2a2608a30843e36fbaa123462a5284f136c7d9e0145220bfd"},
- {file = "zopfli-0.2.3.post1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:2345e713260a350bea0b01a816a469ea356bc2d63d009a0d777691ecbbcf7493"},
- {file = "zopfli-0.2.3.post1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:fc39f5c27f962ec8660d8d20c24762431131b5d8c672b44b0a54cf2b5bcde9b9"},
- {file = "zopfli-0.2.3.post1-cp39-cp39-win32.whl", hash = "sha256:9a6aec38a989bad7ddd1ef53f1265699e49e294d08231b5313d61293f3cd6237"},
- {file = "zopfli-0.2.3.post1-cp39-cp39-win_amd64.whl", hash = "sha256:b3df42f52502438ee973042cc551877d24619fa1cd38ef7b7e9ac74200daca8b"},
- {file = "zopfli-0.2.3.post1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:4c1226a7e2c7105ac31503a9bb97454743f55d88164d6d46bc138051b77f609b"},
- {file = "zopfli-0.2.3.post1-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:48dba9251060289101343110ab47c0756f66f809bb4d1ddbb6d5c7e7752115c5"},
- {file = "zopfli-0.2.3.post1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89899641d4de97dbad8e0cde690040d078b6aea04066dacaab98e0b5a23573f2"},
- {file = "zopfli-0.2.3.post1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:3654bfc927bc478b1c3f3ff5056ed7b20a1a37fa108ca503256d0a699c03bbb1"},
- {file = "zopfli-0.2.3.post1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c4278d1873ce6e803e5d4f8d702fd3026bd67fca744aa98881324d1157ddf748"},
- {file = "zopfli-0.2.3.post1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:1d8cc06605519e82b16df090e17cb3990d1158861b2872c3117f1168777b81e4"},
- {file = "zopfli-0.2.3.post1-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:1f990634fd5c5c8ced8edddd8bd45fab565123b4194d6841e01811292650acae"},
- {file = "zopfli-0.2.3.post1-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:91a2327a4d7e77471fa4fbb26991c6de4a738c6fc6a33e09bb25f56a870a4b7b"},
- {file = "zopfli-0.2.3.post1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8fbe5bcf10d01aab3513550f284c09fef32f342b36f56bfae2120a9c4d12c130"},
- {file = "zopfli-0.2.3.post1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:34a99592f3d9eb6f737616b5bd74b48a589fdb3cb59a01a50d636ea81d6af272"},
- {file = "zopfli-0.2.3.post1.tar.gz", hash = "sha256:96484dc0f48be1c5d7ae9f38ed1ce41e3675fd506b27c11a6607f14b49101e99"},
-]
-
-[package.extras]
-test = ["pytest"]
-
-[metadata]
-lock-version = "2.1"
-python-versions = ">=3.11,<4.0"
-content-hash = "f4a8086c3d39ce050429f9d7319f83dd5c3314d59393d7bc76a9407295877b37"
From 77bf7c2d7d5e1d54cae06b28797c198ecd8e2753 Mon Sep 17 00:00:00 2001
From: BonelessWater
Date: Tue, 6 May 2025 23:14:02 -0400
Subject: [PATCH 08/54] .
---
.gitignore | 1 +
.../dashboard/dashboard_generator.py | 764 +++-
.../dashboard/static/html/dashboard.html | 141 -
.../dashboard/utils/default_config.json | 102 +
.../dashboard/utils/default_config.py | 86 +
.../dashboard/web_app/__init__.py} | 0
.../backtesting/dashboard/web_app/app.py | 50 +
.../backtesting/dashboard/web_app/routes.py | 177 +
.../web_app/static/css/dashboard_editor.css | 318 ++
.../web_app/static/js/chart_registery.js | 0
.../web_app/static/js/dashboard_editor.js | 571 +++
.../web_app/templates/chart_config.html | 143 +
.../dashboard/web_app/templates/index.html | 95 +
algosystem/backtesting/engine.py | 205 +-
.../backtesting/utils/graph_config.json | 102 -
algosystem/backtesting/visualization.py | 279 --
algosystem/cli/commands.py | 274 +-
algosystem/dashboard/__init__.py | 15 -
algosystem/dashboard/dashboard_module.py | 1813 --------
algosystem/dashboard/plot_registery.py | 422 --
algosystem/utils/graph_config.json | 103 +-
dashboard/dashboard.css | 125 -
pyproject.toml | 1 +
{dashboard => test_output}/css/dashboard.css | 0
{dashboard => test_output}/dashboard.html | 0
.../dashboard_data.json | 3800 ++++++++---------
.../js/chart_factory.js | 0
{dashboard => test_output}/js/dashboard.js | 0
.../js/metric_factory.js | 0
29 files changed, 4366 insertions(+), 5221 deletions(-)
delete mode 100644 algosystem/backtesting/dashboard/static/html/dashboard.html
create mode 100644 algosystem/backtesting/dashboard/utils/default_config.json
create mode 100644 algosystem/backtesting/dashboard/utils/default_config.py
rename algosystem/{dashboard/chart_handlers.py => backtesting/dashboard/web_app/__init__.py} (100%)
create mode 100644 algosystem/backtesting/dashboard/web_app/app.py
create mode 100644 algosystem/backtesting/dashboard/web_app/routes.py
create mode 100644 algosystem/backtesting/dashboard/web_app/static/css/dashboard_editor.css
create mode 100644 algosystem/backtesting/dashboard/web_app/static/js/chart_registery.js
create mode 100644 algosystem/backtesting/dashboard/web_app/static/js/dashboard_editor.js
create mode 100644 algosystem/backtesting/dashboard/web_app/templates/chart_config.html
create mode 100644 algosystem/backtesting/dashboard/web_app/templates/index.html
delete mode 100644 algosystem/backtesting/utils/graph_config.json
delete mode 100644 algosystem/backtesting/visualization.py
delete mode 100644 algosystem/dashboard/__init__.py
delete mode 100644 algosystem/dashboard/dashboard_module.py
delete mode 100644 algosystem/dashboard/plot_registery.py
delete mode 100644 dashboard/dashboard.css
rename {dashboard => test_output}/css/dashboard.css (100%)
rename {dashboard => test_output}/dashboard.html (100%)
rename {dashboard => test_output}/dashboard_data.json (63%)
rename {dashboard => test_output}/js/chart_factory.js (100%)
rename {dashboard => test_output}/js/dashboard.js (100%)
rename {dashboard => test_output}/js/metric_factory.js (100%)
diff --git a/.gitignore b/.gitignore
index e88e668..21ddb4c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,6 +1,7 @@
venv
algosystem.egg-info
.pytest_cache
+poetry.lock
.coverage
__pycache__
/plots
\ No newline at end of file
diff --git a/algosystem/backtesting/dashboard/dashboard_generator.py b/algosystem/backtesting/dashboard/dashboard_generator.py
index efa89a8..59c9742 100644
--- a/algosystem/backtesting/dashboard/dashboard_generator.py
+++ b/algosystem/backtesting/dashboard/dashboard_generator.py
@@ -21,7 +21,7 @@ def generate_dashboard(engine, output_dir=None, open_browser=True, config_path=N
open_browser : bool, optional
Whether to automatically open the dashboard in browser. Defaults to True
config_path : str, optional
- Path to the graph configuration file. Defaults to utils/graph_config.json
+ Path to the graph configuration file. If None, will use the default config
Returns:
--------
@@ -30,7 +30,11 @@ def generate_dashboard(engine, output_dir=None, open_browser=True, config_path=N
"""
# Check if backtest results are available
if engine.results is None:
- raise ValueError("No backtest results available. Run the backtest first.")
+ # Try to run the backtest if not already run
+ engine.run()
+
+ if engine.results is None:
+ raise ValueError("No backtest results available. Run the backtest first.")
# Set default output directory
if output_dir is None:
@@ -41,11 +45,13 @@ def generate_dashboard(engine, output_dir=None, open_browser=True, config_path=N
# Load graph configuration
if config_path is None:
- config_path = os.path.join(os.path.dirname(os.path.dirname(__file__)),
- "utils", "graph_config.json")
-
- with open(config_path, 'r') as f:
- config = json.load(f)
+ # Use default configuration
+ from .utils.default_config import get_default_config
+ config = get_default_config()
+ else:
+ # Load configuration from file
+ with open(config_path, 'r') as f:
+ config = json.load(f)
# Validate configuration
validate_config(config)
@@ -66,35 +72,741 @@ def generate_dashboard(engine, output_dir=None, open_browser=True, config_path=N
with open(data_path, 'w') as f:
json.dump(dashboard_data, f, indent=2)
- # Copy static files
- static_dir = os.path.join(os.path.dirname(__file__), 'static')
-
- # Create js directory
+ # Create directories for static files
js_dir = os.path.join(output_dir, 'js')
os.makedirs(js_dir, exist_ok=True)
- # Copy main JS file
- main_js_path = os.path.join(static_dir, 'js', 'dashboard.js')
- shutil.copy(main_js_path, js_dir)
-
- # Copy chart factory JS file
- chart_factory_js_path = os.path.join(static_dir, 'js', 'chart_factory.js')
- shutil.copy(chart_factory_js_path, js_dir)
-
- # Copy metric factory JS file
- metric_factory_js_path = os.path.join(static_dir, 'js', 'metric_factory.js')
- shutil.copy(metric_factory_js_path, js_dir)
-
- # Create css directory
css_dir = os.path.join(output_dir, 'css')
os.makedirs(css_dir, exist_ok=True)
+ # Copy static files
+ static_dir = os.path.join(os.path.dirname(__file__), 'static')
+
+ # Copy JS files
+ js_files = ['dashboard.js', 'chart_factory.js', 'metric_factory.js']
+ for js_file in js_files:
+ src_path = os.path.join(static_dir, 'js', js_file)
+ if os.path.exists(src_path):
+ shutil.copy(src_path, js_dir)
+ else:
+ # Create minimum required JS files if they don't exist
+ create_default_js_files(js_dir, js_file)
+
# Copy CSS file
css_path = os.path.join(static_dir, 'css', 'dashboard.css')
- shutil.copy(css_path, css_dir)
+ if os.path.exists(css_path):
+ shutil.copy(css_path, css_dir)
+ else:
+ # Create default CSS file if it doesn't exist
+ create_default_css_file(css_dir)
# Open in browser if requested
if open_browser:
webbrowser.open('file://' + os.path.abspath(dashboard_path))
- return dashboard_path
\ No newline at end of file
+ return dashboard_path
+
+def create_default_js_files(js_dir, file_name):
+ """Create default JS files with minimal functionality if originals don't exist."""
+ if file_name == 'dashboard.js':
+ content = """
+/**
+ * Dashboard - Main dashboard functionality
+ */
+
+// Global data object
+let chartData;
+
+/**
+ * Initialize the dashboard
+ */
+function initDashboard() {
+ // Load data
+ fetch('dashboard_data.json')
+ .then(response => response.json())
+ .then(data => {
+ // Store data globally
+ chartData = data;
+
+ // Initialize dashboard components
+ createDashboard();
+ })
+ .catch(error => {
+ console.error('Error loading dashboard data:', error);
+ document.body.innerHTML = `Error loading dashboard data: ${error.message}
`;
+ });
+}
+
+/**
+ * Create the dashboard
+ */
+function createDashboard() {
+ // Update metadata in the header
+ updateHeader();
+
+ // Create metrics
+ createMetrics();
+
+ // Create charts
+ createCharts();
+}
+
+/**
+ * Update the dashboard header with metadata
+ */
+function updateHeader() {
+ // Update title if needed
+ const titleElement = document.querySelector('.dashboard-header h1');
+ if (titleElement && chartData.metadata.title) {
+ titleElement.textContent = chartData.metadata.title;
+ }
+
+ // Update date range
+ const dateRangeElement = document.querySelector('.date-range');
+ if (dateRangeElement) {
+ dateRangeElement.textContent = `Backtest Period: ${chartData.metadata.start_date} to ${chartData.metadata.end_date}`;
+ }
+
+ // Update total return
+ const totalReturnElement = document.querySelector('.header-summary h2');
+ if (totalReturnElement) {
+ const totalReturn = chartData.metadata.total_return;
+ const sign = totalReturn >= 0 ? '+' : '';
+ totalReturnElement.textContent = `${sign}${totalReturn.toFixed(2)}%`;
+ totalReturnElement.className = totalReturn >= 0 ? 'positive-return' : 'negative-return';
+ }
+}
+
+/**
+ * Create metrics based on data
+ */
+function createMetrics() {
+ // Check if metrics data is available
+ if (!chartData.metrics) return;
+
+ // Update each metric
+ for (const metricId in chartData.metrics) {
+ const metric = chartData.metrics[metricId];
+ updateMetric(metricId, metric);
+ }
+}
+
+/**
+ * Create charts based on data
+ */
+function createCharts() {
+ // Check if charts data is available
+ if (!chartData.charts) return;
+
+ // Create each chart
+ for (const chartId in chartData.charts) {
+ const chart = chartData.charts[chartId];
+ createChart(chartId, chart);
+ }
+}
+
+/**
+ * Update a metric with data
+ */
+function updateMetric(metricId, metricData) {
+ const element = document.getElementById(metricId);
+ if (!element) return;
+
+ // Format value based on type
+ let formattedValue = metricData.value;
+ let className = '';
+
+ if (metricData.type === 'Percentage') {
+ formattedValue = `${(metricData.value * 100).toFixed(2)}%`;
+ className = metricData.value >= 0 ? 'positive' : 'negative';
+ } else if (metricData.type === 'Value') {
+ formattedValue = metricData.value.toFixed(2);
+ className = metricData.value >= 0 ? 'positive' : 'negative';
+ } else if (metricData.type === 'Currency') {
+ formattedValue = `$${metricData.value.toFixed(2)}`;
+ className = metricData.value >= 0 ? 'positive' : 'negative';
+ }
+
+ element.innerHTML = `${formattedValue} `;
+}
+
+/**
+ * Create a chart with data
+ */
+function createChart(chartId, chartData) {
+ const container = document.getElementById(chartId);
+ if (!container) return;
+
+ // Create a simple fallback visualization if Chart.js is not available
+ if (typeof Chart === 'undefined') {
+ container.innerHTML = 'Chart visualization not available. Data is available in the dashboard_data.json file.
';
+ return;
+ }
+
+ // Create a canvas element
+ const canvas = document.createElement('canvas');
+ container.appendChild(canvas);
+
+ // Create the chart based on type
+ if (chartData.type === 'LineChart') {
+ new Chart(canvas, {
+ type: 'line',
+ data: chartData.data,
+ options: getChartOptions(chartData)
+ });
+ } else if (chartData.type === 'HeatmapTable') {
+ // For heatmap tables, create a table instead of a canvas
+ container.innerHTML = createHeatmapTable(chartData.data);
+ }
+}
+
+/**
+ * Get chart options based on configuration
+ */
+function getChartOptions(chartData) {
+ return {
+ responsive: true,
+ maintainAspectRatio: false,
+ plugins: {
+ title: {
+ display: true,
+ text: chartData.title
+ },
+ legend: {
+ display: true,
+ position: 'top'
+ }
+ },
+ scales: {
+ x: {
+ type: 'time',
+ time: {
+ unit: 'day',
+ displayFormats: {
+ day: 'MMM d, yyyy'
+ }
+ },
+ title: {
+ display: true,
+ text: 'Date'
+ }
+ },
+ y: {
+ title: {
+ display: true,
+ text: chartData.config?.y_axis_label || 'Value'
+ }
+ }
+ }
+ };
+}
+
+/**
+ * Create a heatmap table from data
+ */
+function createHeatmapTable(data) {
+ if (!data || !data.years || !data.months) {
+ return 'No data available for heatmap
';
+ }
+
+ let html = '';
+
+ // Add header row with months
+ html += ' ';
+ data.months.forEach(month => {
+ html += `${month} `;
+ });
+ html += ' ';
+
+ // Add rows for each year
+ data.years.forEach(year => {
+ html += `${year} `;
+
+ // Add cells for each month
+ for (let month = 1; month <= 12; month++) {
+ const key = `${year}-${month}`;
+ const value = data.data[key];
+
+ if (value !== undefined) {
+ const formatted = (value * 100).toFixed(1) + '%';
+ const colorClass = value >= 0 ? 'positive' : 'negative';
+ const intensity = Math.min(Math.abs(value) * 10, 1);
+ const style = value >= 0
+ ? `background-color: rgba(46, 204, 113, ${intensity});`
+ : `background-color: rgba(231, 76, 60, ${intensity});`;
+
+ html += `${formatted} `;
+ } else {
+ html += ' ';
+ }
+ }
+
+ html += ' ';
+ });
+
+ html += '
';
+ return html;
+}
+
+// Initialize dashboard when document is loaded
+document.addEventListener('DOMContentLoaded', function() {
+ initDashboard();
+});
+ """
+ elif file_name == 'chart_factory.js':
+ content = """
+/**
+ * Chart Factory - Functions for creating various chart types
+ */
+
+/**
+ * Create a line chart
+ * @param {string} containerId - ID of the container element
+ * @param {object} data - Chart data
+ * @param {object} options - Chart options
+ */
+function createLineChart(containerId, data, options) {
+ const container = document.getElementById(containerId);
+ if (!container) return;
+
+ // Clear existing content
+ container.innerHTML = '';
+
+ // Create canvas element
+ const canvas = document.createElement('canvas');
+ container.appendChild(canvas);
+
+ // Check if data is available
+ if (!data || !data.labels || !data.datasets || data.labels.length === 0) {
+ container.innerHTML = 'No data available
';
+ return;
+ }
+
+ // Create chart instance (requires Chart.js library)
+ if (typeof Chart !== 'undefined') {
+ new Chart(canvas, {
+ type: 'line',
+ data: data,
+ options: options || {}
+ });
+ } else {
+ container.innerHTML = 'Chart.js library not loaded
';
+ }
+}
+
+/**
+ * Create a heatmap table
+ * @param {string} containerId - ID of the container element
+ * @param {object} data - Heatmap data
+ */
+function createHeatmapTable(containerId, data) {
+ const container = document.getElementById(containerId);
+ if (!container) return;
+
+ // Clear existing content
+ container.innerHTML = '';
+
+ // Check if data is available
+ if (!data || !data.years || !data.months || data.years.length === 0) {
+ container.innerHTML = 'No data available
';
+ return;
+ }
+
+ // Create table element
+ const table = document.createElement('table');
+ table.className = 'heatmap-table';
+
+ // Create header row
+ const headerRow = document.createElement('tr');
+
+ // Add empty corner cell
+ const cornerCell = document.createElement('th');
+ headerRow.appendChild(cornerCell);
+
+ // Add month headers
+ for (const month of data.months) {
+ const cell = document.createElement('th');
+ cell.textContent = month;
+ headerRow.appendChild(cell);
+ }
+
+ table.appendChild(headerRow);
+
+ // Create data rows
+ for (const year of data.years) {
+ const row = document.createElement('tr');
+
+ // Add year header
+ const yearCell = document.createElement('th');
+ yearCell.textContent = year;
+ row.appendChild(yearCell);
+
+ // Add data cells
+ for (let month = 1; month <= 12; month++) {
+ const cell = document.createElement('td');
+ const key = `${year}-${month}`;
+
+ if (key in data.data) {
+ const value = data.data[key];
+
+ // Format value
+ cell.textContent = formatAsPercentage(value);
+
+ // Apply color scale
+ applyHeatmapColor(cell, value);
+ }
+
+ row.appendChild(cell);
+ }
+
+ table.appendChild(row);
+ }
+
+ container.appendChild(table);
+}
+
+/**
+ * Apply color to heatmap cell based on value
+ * @param {HTMLElement} cell - Table cell element
+ * @param {number} value - Cell value
+ */
+function applyHeatmapColor(cell, value) {
+ if (value > 0.03) {
+ cell.style.backgroundColor = 'rgba(46, 204, 113, 0.8)';
+ cell.style.color = 'white';
+ } else if (value > 0.01) {
+ cell.style.backgroundColor = 'rgba(46, 204, 113, 0.5)';
+ } else if (value > 0) {
+ cell.style.backgroundColor = 'rgba(46, 204, 113, 0.2)';
+ } else if (value > -0.01) {
+ cell.style.backgroundColor = 'rgba(231, 76, 60, 0.2)';
+ } else if (value > -0.03) {
+ cell.style.backgroundColor = 'rgba(231, 76, 60, 0.5)';
+ } else {
+ cell.style.backgroundColor = 'rgba(231, 76, 60, 0.8)';
+ cell.style.color = 'white';
+ }
+}
+
+/**
+ * Format value as percentage
+ * @param {number} value - Value to format
+ * @returns {string} - Formatted percentage
+ */
+function formatAsPercentage(value) {
+ return `${(value * 100).toFixed(1)}%`;
+}
+ """
+ elif file_name == 'metric_factory.js':
+ content = """
+/**
+ * Metric Factory - Functions for updating various metric types
+ */
+
+/**
+ * Update a percentage metric
+ * @param {string} metricId - ID of the metric element
+ * @param {number} value - Metric value
+ */
+function updatePercentageMetric(metricId, value) {
+ const element = document.getElementById(metricId);
+ if (!element) return;
+
+ // Format value
+ const formattedValue = formatAsPercentage(value);
+
+ // Determine class based on value
+ const className = value >= 0 ? 'positive' : 'negative';
+
+ // Update element
+ element.innerHTML = `${formattedValue} `;
+}
+
+/**
+ * Update a value metric
+ * @param {string} metricId - ID of the metric element
+ * @param {number} value - Metric value
+ */
+function updateValueMetric(metricId, value) {
+ const element = document.getElementById(metricId);
+ if (!element) return;
+
+ // Format value
+ const formattedValue = formatValue(value);
+
+ // Determine class based on value
+ const className = value >= 0 ? 'positive' : 'negative';
+
+ // Update element
+ element.innerHTML = `${formattedValue} `;
+}
+
+/**
+ * Update a currency metric
+ * @param {string} metricId - ID of the metric element
+ * @param {number} value - Metric value
+ */
+function updateCurrencyMetric(metricId, value) {
+ const element = document.getElementById(metricId);
+ if (!element) return;
+
+ // Format value
+ const formattedValue = formatAsCurrency(value);
+
+ // Determine class based on value
+ const className = value >= 0 ? 'positive' : 'negative';
+
+ // Update element
+ element.innerHTML = `${formattedValue} `;
+}
+
+/**
+ * Format value
+ * @param {number} value - Value to format
+ * @returns {string} - Formatted value
+ */
+function formatValue(value) {
+ return value.toFixed(2);
+}
+
+/**
+ * Format value as currency
+ * @param {number} value - Value to format
+ * @returns {string} - Formatted currency
+ */
+function formatAsCurrency(value) {
+ return `${value.toFixed(2)}`;
+}
+ """
+
+ with open(os.path.join(js_dir, file_name), 'w') as f:
+ f.write(content)
+
+def create_default_css_file(css_dir):
+ """Create a default CSS file with basic styling if original doesn't exist."""
+ content = """/**
+ * Dashboard Styling
+ */
+
+/* Reset and base styles */
+* {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+body {
+ font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
+ background-color: #f5f7fa;
+ color: #333;
+ line-height: 1.6;
+}
+
+/* Container */
+.dashboard-container {
+ max-width: 1200px;
+ margin: 0 auto;
+ padding: 20px;
+}
+
+/* Header styles */
+.dashboard-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ padding: 20px;
+ background-color: #2c3e50;
+ color: white;
+ border-radius: 8px;
+ margin-bottom: 20px;
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
+}
+
+.header-info h1 {
+ font-size: 24px;
+ margin-bottom: 5px;
+}
+
+.date-range {
+ font-size: 14px;
+ opacity: 0.8;
+}
+
+.header-summary h2 {
+ font-size: 28px;
+ font-weight: bold;
+ margin-bottom: 5px;
+}
+
+.header-summary .label {
+ font-size: 14px;
+ color: rgba(255, 255, 255, 0.8);
+}
+
+/* Metrics section */
+.metrics-section {
+ margin-bottom: 20px;
+}
+
+.metrics-row {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
+ gap: 20px;
+ margin-bottom: 20px;
+}
+
+.metric-card {
+ background-color: white;
+ border-radius: 8px;
+ padding: 20px;
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
+ transition: transform 0.2s ease-in-out, box-shadow 0.2s ease-in-out;
+}
+
+.metric-card:hover {
+ transform: translateY(-3px);
+ box-shadow: 0 6px 8px rgba(0, 0, 0, 0.15);
+}
+
+.metric-title {
+ font-size: 14px;
+ color: #7f8c8d;
+ margin-bottom: 10px;
+}
+
+.metric-value {
+ font-size: 24px;
+ font-weight: bold;
+}
+
+/* Charts section */
+.charts-section {
+ margin-bottom: 20px;
+}
+
+.charts-row {
+ display: grid;
+ gap: 20px;
+ margin-bottom: 20px;
+}
+
+.chart-card {
+ background-color: white;
+ border-radius: 8px;
+ padding: 20px;
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
+ transition: transform 0.2s ease-in-out, box-shadow 0.2s ease-in-out;
+}
+
+.chart-card:hover {
+ transform: translateY(-3px);
+ box-shadow: 0 6px 8px rgba(0, 0, 0, 0.15);
+}
+
+.chart-header {
+ margin-bottom: 15px;
+}
+
+.chart-title {
+ font-size: 18px;
+ color: #333;
+}
+
+.chart-container {
+ height: 300px;
+ width: 100%;
+ position: relative;
+}
+
+/* Heatmap table */
+.heatmap-table {
+ width: 100%;
+ border-collapse: collapse;
+ font-size: 14px;
+}
+
+.heatmap-table th,
+.heatmap-table td {
+ padding: 8px;
+ text-align: center;
+ border: 1px solid #ddd;
+}
+
+.heatmap-table th {
+ background-color: #f2f2f2;
+ font-weight: bold;
+}
+
+/* Value formatting */
+.positive {
+ color: #2ecc71;
+}
+
+.negative {
+ color: #e74c3c;
+}
+
+.positive-return {
+ color: #2ecc71;
+}
+
+.negative-return {
+ color: #e74c3c;
+}
+
+/* Error messages */
+.error-message {
+ color: #e74c3c;
+ text-align: center;
+ padding: 20px;
+ font-weight: bold;
+}
+
+/* Responsive design */
+@media (max-width: 768px) {
+ .dashboard-header {
+ flex-direction: column;
+ align-items: flex-start;
+ }
+
+ .header-summary {
+ margin-top: 15px;
+ }
+
+ .charts-row {
+ grid-template-columns: 1fr !important;
+ }
+
+ .metrics-row {
+ grid-template-columns: 1fr;
+ }
+}
+
+@media (max-width: 480px) {
+ .dashboard-container {
+ padding: 10px;
+ }
+
+ .dashboard-header {
+ padding: 15px;
+ }
+
+ .header-info h1 {
+ font-size: 20px;
+ }
+
+ .header-summary h2 {
+ font-size: 24px;
+ }
+
+ .metric-value {
+ font-size: 20px;
+ }
+
+ .chart-container {
+ height: 250px;
+ }
+}"""
+
+ with open(os.path.join(css_dir, 'dashboard.css'), 'w') as f:
+ f.write(content)
\ No newline at end of file
diff --git a/algosystem/backtesting/dashboard/static/html/dashboard.html b/algosystem/backtesting/dashboard/static/html/dashboard.html
deleted file mode 100644
index b7a2ba4..0000000
--- a/algosystem/backtesting/dashboard/static/html/dashboard.html
+++ /dev/null
@@ -1,141 +0,0 @@
-
-
-
-
-
- AlgoSystem Trading Dashboard
-
-
-
-
-
-
-
-
-
-
-
-
Annualized Return
-
Loading...
-
-
-
Annualized Volatility
-
Loading...
-
-
-
Sharpe Ratio
-
Loading...
-
-
-
Sortino Ratio
-
Loading...
-
-
-
Max Drawdown
-
Loading...
-
-
-
Calmar Ratio
-
Loading...
-
-
-
-
-
-
-
-
Performance
-
Risk Metrics
-
Return Analysis
-
-
-
-
-
Equity Curve vs Benchmark
-
-
-
-
-
-
Relative Performance
-
-
-
-
Drawdown Analysis
-
-
-
-
-
-
-
-
-
Rolling Volatility
-
-
-
-
Rolling Sharpe Ratio
-
-
-
-
-
Value at Risk (VaR) Analysis
-
-
-
-
-
-
-
Daily Returns Distribution
-
-
-
-
-
Monthly Returns Heatmap
-
-
-
-
Rolling Returns
-
-
-
-
-
-
-
-
Trading Statistics
-
-
-
Win Rate
-
Loading...
-
-
-
Best Month
-
Loading...
-
-
-
Worst Month
-
Loading...
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/algosystem/backtesting/dashboard/utils/default_config.json b/algosystem/backtesting/dashboard/utils/default_config.json
new file mode 100644
index 0000000..0b4c7c6
--- /dev/null
+++ b/algosystem/backtesting/dashboard/utils/default_config.json
@@ -0,0 +1,102 @@
+{
+ "metrics": [
+ {
+ "id": "annual_return",
+ "type": "Percentage",
+ "title": "Annualized Return",
+ "value_key": "annual_return",
+ "position": {
+ "row": 0,
+ "col": 0
+ }
+ },
+ {
+ "id": "volatility",
+ "type": "Percentage",
+ "title": "Volatility",
+ "value_key": "volatility",
+ "position": {
+ "row": 0,
+ "col": 1
+ }
+ },
+ {
+ "id": "sharpe_ratio",
+ "type": "Value",
+ "title": "Sharpe Ratio",
+ "value_key": "sharpe_ratio",
+ "position": {
+ "row": 0,
+ "col": 2
+ }
+ },
+ {
+ "id": "max_drawdown",
+ "type": "Percentage",
+ "title": "Max Drawdown",
+ "value_key": "max_drawdown",
+ "position": {
+ "row": 0,
+ "col": 3
+ }
+ }
+ ],
+ "charts": [
+ {
+ "id": "equity_curve",
+ "type": "LineChart",
+ "title": "Equity Curve",
+ "data_key": "equity",
+ "position": {
+ "row": 1,
+ "col": 0
+ },
+ "config": {
+ "y_axis_label": "Value ($)"
+ }
+ },
+ {
+ "id": "drawdown",
+ "type": "LineChart",
+ "title": "Drawdown Chart",
+ "data_key": "drawdown",
+ "position": {
+ "row": 1,
+ "col": 1
+ },
+ "config": {
+ "y_axis_label": "Drawdown (%)",
+ "percentage_format": true
+ }
+ },
+ {
+ "id": "monthly_returns",
+ "type": "HeatmapTable",
+ "title": "Monthly Returns Heatmap",
+ "data_key": "monthly_returns",
+ "position": {
+ "row": 2,
+ "col": 0
+ },
+ "config": {}
+ },
+ {
+ "id": "rolling_sharpe",
+ "type": "LineChart",
+ "title": "Rolling Sharpe Ratio",
+ "data_key": "rolling_sharpe",
+ "position": {
+ "row": 2,
+ "col": 1
+ },
+ "config": {
+ "y_axis_label": "Sharpe Ratio",
+ "window_size": 252
+ }
+ }
+ ],
+ "layout": {
+ "max_cols": 2,
+ "title": "AlgoSystem Trading Dashboard"
+ }
+}
\ No newline at end of file
diff --git a/algosystem/backtesting/dashboard/utils/default_config.py b/algosystem/backtesting/dashboard/utils/default_config.py
new file mode 100644
index 0000000..cd66e0b
--- /dev/null
+++ b/algosystem/backtesting/dashboard/utils/default_config.py
@@ -0,0 +1,86 @@
+# File: algosystem/backtesting/dashboard/utils/default_config.py
+
+import os
+import json
+
+# Path to the default configuration
+DEFAULT_CONFIG_PATH = os.path.abspath(os.path.join(
+ os.path.dirname(os.path.dirname(os.path.abspath(__file__))),
+ "utils",
+ "default_config.json"
+))
+
+def get_default_config():
+ """Load the default dashboard configuration."""
+ try:
+ with open(DEFAULT_CONFIG_PATH, 'r') as f:
+ return json.load(f)
+ except FileNotFoundError:
+ # Return a minimal default configuration if file not found
+ return {
+ "metrics": [
+ {
+ "id": "annual_return",
+ "type": "Percentage",
+ "title": "Annualized Return",
+ "value_key": "annual_return",
+ "position": {
+ "row": 0,
+ "col": 0
+ }
+ },
+ {
+ "id": "sharpe_ratio",
+ "type": "Value",
+ "title": "Sharpe Ratio",
+ "value_key": "sharpe_ratio",
+ "position": {
+ "row": 0,
+ "col": 1
+ }
+ },
+ {
+ "id": "max_drawdown",
+ "type": "Percentage",
+ "title": "Max Drawdown",
+ "value_key": "max_drawdown",
+ "position": {
+ "row": 0,
+ "col": 2
+ }
+ }
+ ],
+ "charts": [
+ {
+ "id": "equity_curve",
+ "type": "LineChart",
+ "title": "Equity Curve",
+ "data_key": "equity",
+ "position": {
+ "row": 1,
+ "col": 0
+ },
+ "config": {
+ "y_axis_label": "Value ($)"
+ }
+ },
+ {
+ "id": "drawdown",
+ "type": "LineChart",
+ "title": "Drawdown Chart",
+ "data_key": "drawdown",
+ "position": {
+ "row": 1,
+ "col": 1
+ },
+ "config": {
+ "y_axis_label": "Drawdown (%)",
+ "percentage_format": True
+ }
+ }
+ ],
+ "layout": {
+ "max_cols": 2,
+ "title": "AlgoSystem Trading Dashboard"
+ }
+ }
\ No newline at end of file
diff --git a/algosystem/dashboard/chart_handlers.py b/algosystem/backtesting/dashboard/web_app/__init__.py
similarity index 100%
rename from algosystem/dashboard/chart_handlers.py
rename to algosystem/backtesting/dashboard/web_app/__init__.py
diff --git a/algosystem/backtesting/dashboard/web_app/app.py b/algosystem/backtesting/dashboard/web_app/app.py
new file mode 100644
index 0000000..3b4973f
--- /dev/null
+++ b/algosystem/backtesting/dashboard/web_app/app.py
@@ -0,0 +1,50 @@
+from flask import Flask, render_template, request, jsonify, redirect, url_for
+import os
+import json
+import pandas as pd
+import sys
+import tempfile
+from pathlib import Path
+
+# Add the parent directory to the path
+sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))))
+
+# Import AlgoSystem modules
+from algosystem.backtesting.dashboard.dashboard_generator import generate_dashboard
+from algosystem.backtesting.engine import Engine
+
+app = Flask(__name__)
+app.config['UPLOAD_FOLDER'] = tempfile.mkdtemp()
+app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024 # 16MB max upload
+
+# Path to the default configuration
+DEFAULT_CONFIG_PATH = os.path.abspath(os.path.join(
+ os.path.dirname(os.path.dirname(os.path.abspath(__file__))),
+ "utils",
+ "default_config.json"
+))
+
+# Path to the user configuration
+USER_CONFIG_PATH = os.path.abspath(os.path.join(
+ os.path.expanduser("~"),
+ ".algosystem",
+ "dashboard_config.json"
+))
+
+# Ensure the directory exists
+os.makedirs(os.path.dirname(USER_CONFIG_PATH), exist_ok=True)
+
+# Global variables
+uploaded_data = None
+engine = None
+dashboard_path = None
+
+# Import routes
+from algosystem.backtesting.dashboard.web_app.routes import *
+
+def start_dashboard_editor(host='127.0.0.1', port=5000, debug=False):
+ """Start the dashboard editor web server."""
+ app.run(host=host, port=port, debug=debug)
+
+if __name__ == '__main__':
+ start_dashboard_editor(debug=True)
\ No newline at end of file
diff --git a/algosystem/backtesting/dashboard/web_app/routes.py b/algosystem/backtesting/dashboard/web_app/routes.py
new file mode 100644
index 0000000..3bc84fb
--- /dev/null
+++ b/algosystem/backtesting/dashboard/web_app/routes.py
@@ -0,0 +1,177 @@
+from flask import render_template, request, jsonify, redirect, url_for, flash, send_from_directory
+import os
+import json
+import pandas as pd
+import numpy as np
+from werkzeug.utils import secure_filename
+from algosystem.backtesting.dashboard.web_app.app import app, DEFAULT_CONFIG_PATH, USER_CONFIG_PATH, uploaded_data, engine, dashboard_path
+from algosystem.backtesting.engine import Engine
+
+# Available chart types and metrics
+AVAILABLE_CHARTS = [
+ {"id": "equity_curve", "type": "LineChart", "title": "Equity Curve", "data_key": "equity",
+ "description": "Shows the growth of portfolio value over time"},
+ {"id": "drawdown", "type": "LineChart", "title": "Drawdown Chart", "data_key": "drawdown",
+ "description": "Shows the drawdown periods for the strategy"},
+ {"id": "monthly_returns", "type": "HeatmapTable", "title": "Monthly Returns Heatmap", "data_key": "monthly_returns",
+ "description": "Displays monthly returns as a heatmap"},
+ {"id": "rolling_sharpe", "type": "LineChart", "title": "Rolling Sharpe Ratio", "data_key": "rolling_sharpe",
+ "description": "Shows the rolling Sharpe ratio over time"},
+ {"id": "rolling_volatility", "type": "LineChart", "title": "Rolling Volatility", "data_key": "rolling_volatility",
+ "description": "Shows the rolling volatility over time"},
+ {"id": "rolling_returns", "type": "LineChart", "title": "Rolling Returns", "data_key": "rolling_returns",
+ "description": "Shows the rolling returns over time"},
+ {"id": "returns_distribution", "type": "LineChart", "title": "Returns Distribution", "data_key": "returns_distribution",
+ "description": "Shows the distribution of returns"}
+]
+
+AVAILABLE_METRICS = [
+ {"id": "annual_return", "type": "Percentage", "title": "Annualized Return", "value_key": "annual_return",
+ "description": "Annualized return of the strategy"},
+ {"id": "volatility", "type": "Percentage", "title": "Volatility", "value_key": "volatility",
+ "description": "Annualized volatility of the strategy"},
+ {"id": "sharpe_ratio", "type": "Value", "title": "Sharpe Ratio", "value_key": "sharpe_ratio",
+ "description": "Sharpe ratio of the strategy"},
+ {"id": "sortino_ratio", "type": "Value", "title": "Sortino Ratio", "value_key": "sortino_ratio",
+ "description": "Sortino ratio of the strategy"},
+ {"id": "max_drawdown", "type": "Percentage", "title": "Max Drawdown", "value_key": "max_drawdown",
+ "description": "Maximum drawdown of the strategy"},
+ {"id": "calmar_ratio", "type": "Value", "title": "Calmar Ratio", "value_key": "calmar_ratio",
+ "description": "Calmar ratio of the strategy"},
+ {"id": "win_rate", "type": "Percentage", "title": "Win Rate", "value_key": "win_rate",
+ "description": "Percentage of winning trades"},
+ {"id": "avg_win", "type": "Percentage", "title": "Average Win", "value_key": "avg_win",
+ "description": "Average return of winning trades"},
+ {"id": "avg_loss", "type": "Percentage", "title": "Average Loss", "value_key": "avg_loss",
+ "description": "Average return of losing trades"}
+]
+
+def load_config(config_path=None):
+ """Load configuration from file or use default if file doesn't exist."""
+ if config_path is None:
+ config_path = USER_CONFIG_PATH
+
+ if os.path.exists(config_path):
+ with open(config_path, 'r') as f:
+ return json.load(f)
+ else:
+ # Use default config
+ with open(DEFAULT_CONFIG_PATH, 'r') as f:
+ config = json.load(f)
+
+ # Save to user config
+ with open(USER_CONFIG_PATH, 'w') as f:
+ json.dump(config, f, indent=2)
+
+ return config
+
+def save_config(config, config_path=None):
+ """Save configuration to file."""
+ if config_path is None:
+ config_path = USER_CONFIG_PATH
+
+ with open(config_path, 'w') as f:
+ json.dump(config, f, indent=2)
+
+@app.route('/')
+def index():
+ """Render the dashboard editor."""
+ config = load_config()
+ return render_template('index.html',
+ config=config,
+ available_charts=AVAILABLE_CHARTS,
+ available_metrics=AVAILABLE_METRICS,
+ data_loaded=(uploaded_data is not None))
+
+@app.route('/api/config', methods=['GET'])
+def get_config():
+ """Get the current configuration."""
+ config = load_config()
+ return jsonify(config)
+
+@app.route('/api/config', methods=['POST'])
+def update_config():
+ """Update the configuration."""
+ config = request.json
+ save_config(config)
+ return jsonify({"status": "success"})
+
+@app.route('/api/reset-config', methods=['POST'])
+def reset_config():
+ """Reset to the default configuration."""
+ with open(DEFAULT_CONFIG_PATH, 'r') as f:
+ config = json.load(f)
+
+ save_config(config)
+ return jsonify({"status": "success"})
+
+@app.route('/api/upload-csv', methods=['POST'])
+def upload_csv():
+ """Upload a CSV file and process it."""
+ global uploaded_data, engine, dashboard_path
+
+ if 'file' not in request.files:
+ return jsonify({"status": "error", "message": "No file part"})
+
+ file = request.files['file']
+
+ if file.filename == '':
+ return jsonify({"status": "error", "message": "No selected file"})
+
+ if file and file.filename.endswith('.csv'):
+ filename = secure_filename(file.filename)
+ filepath = os.path.join(app.config['UPLOAD_FOLDER'], filename)
+ file.save(filepath)
+
+ try:
+ # Load the CSV data
+ data = pd.read_csv(filepath, index_col=0, parse_dates=True)
+
+ # If it's a multi-column DataFrame, use the first column as price data
+ if isinstance(data, pd.DataFrame) and data.shape[1] > 1:
+ price_data = data.iloc[:, 0]
+ else:
+ price_data = data
+
+ # Create a backtest engine
+ engine = Engine(data=price_data, benchmark=None)
+ results = engine.run()
+
+ # Generate dashboard
+ dashboard_path = engine.generate_dashboard(
+ output_dir=os.path.join(app.config['UPLOAD_FOLDER'], 'dashboard'),
+ open_browser=False,
+ config_path=USER_CONFIG_PATH
+ )
+
+ # Store the uploaded data for later use
+ uploaded_data = data
+
+ return jsonify({
+ "status": "success",
+ "message": f"Successfully processed {filename}",
+ "dashboard_url": f"/dashboard"
+ })
+
+ except Exception as e:
+ return jsonify({"status": "error", "message": f"Error processing file: {str(e)}"})
+
+ return jsonify({"status": "error", "message": "Invalid file format"})
+
+@app.route('/dashboard')
+def view_dashboard():
+ """View the generated dashboard."""
+ if dashboard_path:
+ dashboard_dir = os.path.dirname(dashboard_path)
+ return send_from_directory(dashboard_dir, 'dashboard.html')
+ else:
+ return redirect(url_for('index'))
+
+@app.route('/dashboard/')
+def dashboard_files(filename):
+ """Serve dashboard files."""
+ if dashboard_path:
+ dashboard_dir = os.path.dirname(dashboard_path)
+ return send_from_directory(dashboard_dir, filename)
+ else:
+ return redirect(url_for('index'))
\ No newline at end of file
diff --git a/algosystem/backtesting/dashboard/web_app/static/css/dashboard_editor.css b/algosystem/backtesting/dashboard/web_app/static/css/dashboard_editor.css
new file mode 100644
index 0000000..0345f76
--- /dev/null
+++ b/algosystem/backtesting/dashboard/web_app/static/css/dashboard_editor.css
@@ -0,0 +1,318 @@
+/* Base styles */
+* {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+body {
+ font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
+ line-height: 1.6;
+ color: #333;
+ background-color: #f5f7fa;
+}
+
+.container {
+ max-width: 1400px;
+ margin: 0 auto;
+ padding: 20px;
+}
+
+/* Header */
+header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 30px;
+ background-color: #2c3e50;
+ color: white;
+ padding: 15px 20px;
+ border-radius: 8px;
+}
+
+header h1 {
+ margin: 0;
+ font-size: 24px;
+}
+
+.controls {
+ display: flex;
+ gap: 10px;
+}
+
+button {
+ padding: 8px 15px;
+ background-color: #3498db;
+ color: white;
+ border: none;
+ border-radius: 4px;
+ cursor: pointer;
+ font-size: 14px;
+ transition: background-color 0.2s;
+}
+
+button:hover {
+ background-color: #2980b9;
+}
+
+button:disabled {
+ background-color: #95a5a6;
+ cursor: not-allowed;
+}
+
+/* Main content layout */
+.main-content {
+ display: grid;
+ grid-template-columns: 300px 1fr;
+ gap: 20px;
+}
+
+/* Sidebar */
+.sidebar {
+ background-color: white;
+ border-radius: 8px;
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
+ padding: 20px;
+}
+
+.upload-section {
+ margin-bottom: 20px;
+ padding-bottom: 20px;
+ border-bottom: 1px solid #eee;
+}
+
+.upload-section h3,
+.components-section h3,
+.component-category h4 {
+ margin-bottom: 15px;
+ color: #2c3e50;
+}
+
+#upload-form {
+ display: flex;
+ flex-direction: column;
+ gap: 10px;
+ margin-bottom: 15px;
+}
+
+#upload-status {
+ font-size: 14px;
+ margin-top: 10px;
+}
+
+/* Component lists */
+.component-category {
+ margin-bottom: 20px;
+}
+
+.component-list {
+ max-height: 300px;
+ overflow-y: auto;
+ border: 1px solid #eee;
+ border-radius: 4px;
+}
+
+.component-item {
+ padding: 10px;
+ border-bottom: 1px solid #eee;
+ cursor: move;
+ background-color: #f9f9f9;
+ transition: background-color 0.2s;
+}
+
+.component-item:hover {
+ background-color: #ecf0f1;
+}
+
+.component-item:last-child {
+ border-bottom: none;
+}
+
+.component-title {
+ display: block;
+ font-weight: bold;
+ margin-bottom: 5px;
+}
+
+.component-description {
+ display: block;
+ font-size: 12px;
+ color: #7f8c8d;
+}
+
+.metric-item {
+ border-left: 4px solid #2ecc71;
+}
+
+.chart-item {
+ border-left: 4px solid #3498db;
+}
+
+/* Dashboard preview */
+.dashboard-preview {
+ background-color: white;
+ border-radius: 8px;
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
+ padding: 20px;
+}
+
+.metrics-section,
+.charts-section {
+ margin-bottom: 30px;
+}
+
+.metrics-section h4,
+.charts-section h4 {
+ margin-bottom: 15px;
+ color: #2c3e50;
+}
+
+/* Dashboard rows */
+.metrics-row,
+.charts-row {
+ display: flex;
+ margin-bottom: 15px;
+ min-height: 100px;
+ background-color: #f9f9f9;
+ border-radius: 4px;
+ padding: 10px;
+ border: 2px dashed #ccc;
+}
+
+/* Placeholders for empty rows */
+.metrics-row::before {
+ content: "Drop metrics here (max 4 per row)";
+ color: #95a5a6;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ width: 100%;
+ height: 100%;
+ font-style: italic;
+}
+
+.charts-row::before {
+ content: "Drop charts here (max 2 per row)";
+ color: #95a5a6;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ width: 100%;
+ height: 100%;
+ font-style: italic;
+}
+
+.metrics-row.has-items::before,
+.charts-row.has-items::before {
+ content: "";
+ display: none;
+}
+
+/* Items in the dashboard */
+.dashboard-item {
+ background-color: white;
+ border-radius: 4px;
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
+ padding: 15px;
+ margin: 5px;
+ position: relative;
+}
+
+.dashboard-metric {
+ border-top: 3px solid #2ecc71;
+ flex: 1;
+ max-width: calc(25% - 10px);
+ min-height: 80px;
+}
+
+.dashboard-chart {
+ border-top: 3px solid #3498db;
+ flex: 1;
+ max-width: calc(50% - 10px);
+ min-height: 150px;
+}
+
+.item-title {
+ font-weight: bold;
+ margin-bottom: 10px;
+ font-size: 14px;
+}
+
+.item-remove {
+ position: absolute;
+ top: 5px;
+ right: 5px;
+ background-color: #e74c3c;
+ color: white;
+ width: 20px;
+ height: 20px;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ border-radius: 50%;
+ font-size: 12px;
+ cursor: pointer;
+}
+
+.item-remove:hover {
+ background-color: #c0392b;
+}
+
+/* Buttons */
+#add-metrics-row,
+#add-charts-row {
+ margin-top: 10px;
+ background-color: #27ae60;
+}
+
+#add-metrics-row:hover,
+#add-charts-row:hover {
+ background-color: #219653;
+}
+
+/* Drag and drop styling */
+.ui-draggable-dragging {
+ z-index: 1000;
+ opacity: 0.8;
+}
+
+.ui-sortable-placeholder {
+ border: 2px dashed #3498db;
+ background-color: rgba(52, 152, 219, 0.1);
+ visibility: visible !important;
+}
+
+.drop-hover {
+ background-color: #ecf0f1;
+ border-color: #3498db;
+}
+
+/* Responsive styles */
+@media (max-width: 1200px) {
+ .main-content {
+ grid-template-columns: 1fr;
+ }
+
+ .sidebar {
+ order: 2;
+ }
+
+ .dashboard-preview {
+ order: 1;
+ }
+}
+
+@media (max-width: 768px) {
+ .dashboard-metric {
+ max-width: calc(50% - 10px);
+ }
+
+ .dashboard-chart {
+ max-width: 100%;
+ }
+
+ .metrics-row,
+ .charts-row {
+ flex-wrap: wrap;
+ }
+}
\ No newline at end of file
diff --git a/algosystem/backtesting/dashboard/web_app/static/js/chart_registery.js b/algosystem/backtesting/dashboard/web_app/static/js/chart_registery.js
new file mode 100644
index 0000000..e69de29
diff --git a/algosystem/backtesting/dashboard/web_app/static/js/dashboard_editor.js b/algosystem/backtesting/dashboard/web_app/static/js/dashboard_editor.js
new file mode 100644
index 0000000..7979243
--- /dev/null
+++ b/algosystem/backtesting/dashboard/web_app/static/js/dashboard_editor.js
@@ -0,0 +1,571 @@
+/* File: algosystem/backtesting/dashboard/web_app/static/js/dashboard_editor.js */
+
+$(document).ready(function() {
+ // Global variables
+ let currentConfig = {};
+
+ // Load the initial configuration
+ $.getJSON('/api/config', function(config) {
+ currentConfig = config;
+ renderDashboard(config);
+ });
+
+ // Initialize drag and drop for components
+ initDragAndDrop();
+
+ // Add event listeners for buttons
+ $('#save-config').click(saveConfiguration);
+ $('#reset-config').click(resetConfiguration);
+ $('#view-dashboard').click(viewDashboard);
+ $('#add-metrics-row').click(addMetricsRow);
+ $('#add-charts-row').click(addChartsRow);
+
+ // Handle file upload
+ $('#upload-form').submit(function(e) {
+ e.preventDefault();
+ uploadCSV();
+ });
+
+ // Function to render the dashboard layout
+ function renderDashboard(config) {
+ // Clear existing containers
+ $('#metrics-container').empty();
+ $('#charts-container').empty();
+
+ // Render metrics rows
+ if (config.metrics && config.metrics.length > 0) {
+ // Group metrics by row
+ const metricsByRow = {};
+ config.metrics.forEach(metric => {
+ const row = metric.position.row;
+ if (!metricsByRow[row]) {
+ metricsByRow[row] = [];
+ }
+ metricsByRow[row].push(metric);
+ });
+
+ // Create rows and add metrics
+ Object.keys(metricsByRow).sort((a, b) => parseInt(a) - parseInt(b)).forEach(row => {
+ const metrics = metricsByRow[row];
+ const metricsRow = $('
').attr('data-row', row);
+
+ // Sort metrics by column
+ metrics.sort((a, b) => a.position.col - b.position.col).forEach(metric => {
+ const metricItem = createDashboardMetric(metric);
+ metricsRow.append(metricItem);
+ });
+
+ $('#metrics-container').append(metricsRow);
+ });
+ } else {
+ // Add an empty row if no metrics
+ addMetricsRow();
+ }
+
+ // Render charts rows
+ if (config.charts && config.charts.length > 0) {
+ // Group charts by row
+ const chartsByRow = {};
+ config.charts.forEach(chart => {
+ const row = chart.position.row;
+ if (!chartsByRow[row]) {
+ chartsByRow[row] = [];
+ }
+ chartsByRow[row].push(chart);
+ });
+
+ // Create rows and add charts
+ Object.keys(chartsByRow).sort((a, b) => parseInt(a) - parseInt(b)).forEach(row => {
+ const charts = chartsByRow[row];
+ const chartsRow = $('
').attr('data-row', row);
+
+ // Sort charts by column
+/* File: algosystem/backtesting/dashboard/web_app/static/js/dashboard_editor.js (continued) */
+
+charts.sort((a, b) => a.position.col - b.position.col).forEach(chart => {
+ const chartItem = createDashboardChart(chart);
+ chartsRow.append(chartItem);
+});
+
+$('#charts-container').append(chartsRow);
+});
+} else {
+// Add an empty row if no charts
+addChartsRow();
+}
+
+// Initialize sortable for newly created rows
+initSortable();
+}
+
+// Function to create a dashboard metric element
+function createDashboardMetric(metric) {
+const metricItem = $('
')
+.attr('data-id', metric.id)
+.attr('data-type', metric.type)
+.attr('data-title', metric.title)
+.attr('data-value-key', metric.value_key)
+.attr('data-col', metric.position.col);
+
+metricItem.append(`${metric.title}
`);
+metricItem.append('×
');
+
+metricItem.find('.item-remove').click(function() {
+$(this).parent().remove();
+updateRowStatus($(this).closest('.metrics-row'));
+updateConfiguration();
+});
+
+return metricItem;
+}
+
+// Function to create a dashboard chart element
+function createDashboardChart(chart) {
+const chartItem = $('
')
+.attr('data-id', chart.id)
+.attr('data-type', chart.type)
+.attr('data-title', chart.title)
+.attr('data-data-key', chart.data_key)
+.attr('data-col', chart.position.col);
+
+chartItem.append(`${chart.title}
`);
+chartItem.append('×
');
+
+if (chart.config) {
+chartItem.attr('data-config', JSON.stringify(chart.config));
+}
+
+chartItem.find('.item-remove').click(function() {
+$(this).parent().remove();
+updateRowStatus($(this).closest('.charts-row'));
+updateConfiguration();
+});
+
+return chartItem;
+}
+
+// Function to initialize drag and drop
+function initDragAndDrop() {
+// Make metric items draggable
+$('.metric-item').draggable({
+helper: 'clone',
+connectToSortable: '.metrics-row',
+revert: 'invalid'
+});
+
+// Make chart items draggable
+$('.chart-item').draggable({
+helper: 'clone',
+connectToSortable: '.charts-row',
+revert: 'invalid'
+});
+
+// Initialize sortable for existing rows
+initSortable();
+}
+
+// Function to initialize sortable rows
+function initSortable() {
+// Make metrics rows sortable
+$('.metrics-row').sortable({
+tolerance: 'pointer',
+connectWith: '.metrics-row',
+placeholder: 'ui-sortable-placeholder',
+forcePlaceholderSize: true,
+receive: function(event, ui) {
+const row = $(this);
+
+// Check if it's a new item from the sidebar
+if (ui.item.hasClass('metric-item')) {
+ const metricData = {
+ id: ui.item.data('id'),
+ type: ui.item.data('type'),
+ title: ui.item.data('title'),
+ value_key: ui.item.data('value-key'),
+ position: {
+ row: parseInt(row.attr('data-row')),
+ col: row.children().length - 1
+ }
+ };
+
+ // Create a new dashboard metric and replace the dragged item
+ const newMetric = createDashboardMetric(metricData);
+ ui.item.replaceWith(newMetric);
+}
+
+// Check if we have more than 4 metrics in a row
+if (row.children().length > 4) {
+ // Move the last item to a new row or the next row
+ const lastItem = row.children().last();
+
+ // Find the next row or create a new one
+ let nextRow = row.next('.metrics-row');
+ if (!nextRow.length) {
+ addMetricsRow();
+ nextRow = row.next('.metrics-row');
+ }
+
+ // Move the item
+ lastItem.detach();
+ nextRow.append(lastItem);
+ nextRow.addClass('has-items');
+}
+
+updateRowStatus(row);
+updateConfiguration();
+},
+update: function(event, ui) {
+// Update column positions
+updateColumnPositions($(this));
+updateConfiguration();
+}
+});
+
+// Make charts rows sortable
+$('.charts-row').sortable({
+tolerance: 'pointer',
+connectWith: '.charts-row',
+placeholder: 'ui-sortable-placeholder',
+forcePlaceholderSize: true,
+receive: function(event, ui) {
+const row = $(this);
+
+// Check if it's a new item from the sidebar
+if (ui.item.hasClass('chart-item')) {
+ const chartData = {
+ id: ui.item.data('id'),
+ type: ui.item.data('type'),
+ title: ui.item.data('title'),
+ data_key: ui.item.data('data-key'),
+ position: {
+ row: parseInt(row.attr('data-row')),
+ col: row.children().length - 1
+ },
+ config: {}
+ };
+
+ // Create a new dashboard chart and replace the dragged item
+ const newChart = createDashboardChart(chartData);
+ ui.item.replaceWith(newChart);
+}
+
+// Check if we have more than 2 charts in a row
+if (row.children().length > 2) {
+ // Move the last item to a new row or the next row
+ const lastItem = row.children().last();
+
+ // Find the next row or create a new one
+ let nextRow = row.next('.charts-row');
+ if (!nextRow.length) {
+ addChartsRow();
+ nextRow = row.next('.charts-row');
+ }
+
+ // Move the item
+ lastItem.detach();
+ nextRow.append(lastItem);
+ nextRow.addClass('has-items');
+}
+
+updateRowStatus(row);
+updateConfiguration();
+},
+update: function(event, ui) {
+// Update column positions
+updateColumnPositions($(this));
+updateConfiguration();
+}
+});
+}
+
+// Function to update column positions in a row
+function updateColumnPositions(row) {
+row.children().each(function(index) {
+$(this).attr('data-col', index);
+});
+}
+
+// Function to update the has-items class on a row
+function updateRowStatus(row) {
+if (row.children().length > 0) {
+row.addClass('has-items');
+} else {
+row.removeClass('has-items');
+}
+}
+
+// Function to add a new metrics row
+function addMetricsRow() {
+const rowIndex = $('.metrics-row').length;
+const newRow = $('
').attr('data-row', rowIndex);
+$('#metrics-container').append(newRow);
+
+// Initialize sortable for the new row
+newRow.sortable({
+tolerance: 'pointer',
+connectWith: '.metrics-row',
+placeholder: 'ui-sortable-placeholder',
+forcePlaceholderSize: true,
+receive: function(event, ui) {
+// Same logic as in initSortable
+const row = $(this);
+
+if (ui.item.hasClass('metric-item')) {
+ const metricData = {
+ id: ui.item.data('id'),
+ type: ui.item.data('type'),
+ title: ui.item.data('title'),
+ value_key: ui.item.data('value-key'),
+ position: {
+ row: parseInt(row.attr('data-row')),
+ col: row.children().length - 1
+ }
+ };
+
+ const newMetric = createDashboardMetric(metricData);
+ ui.item.replaceWith(newMetric);
+}
+
+if (row.children().length > 4) {
+ const lastItem = row.children().last();
+
+ let nextRow = row.next('.metrics-row');
+ if (!nextRow.length) {
+ addMetricsRow();
+ nextRow = row.next('.metrics-row');
+ }
+
+ lastItem.detach();
+ nextRow.append(lastItem);
+ nextRow.addClass('has-items');
+}
+
+updateRowStatus(row);
+updateConfiguration();
+},
+update: function(event, ui) {
+updateColumnPositions($(this));
+updateConfiguration();
+}
+});
+
+return newRow;
+}
+
+// Function to add a new charts row
+function addChartsRow() {
+const rowIndex = $('.charts-row').length;
+const newRow = $('
').attr('data-row', rowIndex);
+$('#charts-container').append(newRow);
+
+// Initialize sortable for the new row
+newRow.sortable({
+tolerance: 'pointer',
+connectWith: '.charts-row',
+placeholder: 'ui-sortable-placeholder',
+forcePlaceholderSize: true,
+receive: function(event, ui) {
+// Same logic as in initSortable
+const row = $(this);
+
+if (ui.item.hasClass('chart-item')) {
+ const chartData = {
+ id: ui.item.data('id'),
+ type: ui.item.data('type'),
+ title: ui.item.data('title'),
+ data_key: ui.item.data('data-key'),
+ position: {
+ row: parseInt(row.attr('data-row')),
+ col: row.children().length - 1
+ },
+ config: {}
+ };
+
+ const newChart = createDashboardChart(chartData);
+ ui.item.replaceWith(newChart);
+}
+
+if (row.children().length > 2) {
+ const lastItem = row.children().last();
+
+ let nextRow = row.next('.charts-row');
+ if (!nextRow.length) {
+ addChartsRow();
+ nextRow = row.next('.charts-row');
+ }
+
+ lastItem.detach();
+ nextRow.append(lastItem);
+ nextRow.addClass('has-items');
+}
+
+updateRowStatus(row);
+updateConfiguration();
+},
+update: function(event, ui) {
+updateColumnPositions($(this));
+updateConfiguration();
+}
+});
+
+return newRow;
+}
+
+// Function to update the configuration based on the current layout
+function updateConfiguration() {
+// Build a new configuration object
+const config = {
+metrics: [],
+charts: [],
+layout: {
+max_cols: 2,
+title: "AlgoSystem Trading Dashboard"
+}
+};
+
+// Collect metrics
+$('.metrics-row').each(function() {
+const rowIndex = parseInt($(this).attr('data-row'));
+
+$(this).children('.dashboard-metric').each(function() {
+const colIndex = parseInt($(this).attr('data-col'));
+
+const metric = {
+ id: $(this).attr('data-id'),
+ type: $(this).attr('data-type'),
+ title: $(this).attr('data-title'),
+ value_key: $(this).attr('data-value-key'),
+ position: {
+ row: rowIndex,
+ col: colIndex
+ }
+};
+
+config.metrics.push(metric);
+});
+});
+
+// Collect charts
+$('.charts-row').each(function() {
+const rowIndex = parseInt($(this).attr('data-row'));
+
+$(this).children('.dashboard-chart').each(function() {
+const colIndex = parseInt($(this).attr('data-col'));
+
+const chart = {
+ id: $(this).attr('data-id'),
+ type: $(this).attr('data-type'),
+ title: $(this).attr('data-title'),
+ data_key: $(this).attr('data-data-key'),
+ position: {
+ row: rowIndex,
+ col: colIndex
+ },
+ config: {}
+};
+
+// Parse config if present
+const configStr = $(this).attr('data-config');
+if (configStr) {
+ try {
+ chart.config = JSON.parse(configStr);
+ } catch (e) {
+ console.error('Error parsing chart config:', e);
+ }
+}
+
+config.charts.push(chart);
+});
+});
+
+// Update global configuration
+currentConfig = config;
+}
+
+// Function to save the configuration
+function saveConfiguration() {
+// Update the configuration first
+updateConfiguration();
+
+// Send to the server
+$.ajax({
+url: '/api/config',
+type: 'POST',
+data: JSON.stringify(currentConfig),
+contentType: 'application/json',
+success: function(response) {
+alert('Configuration saved successfully!');
+},
+error: function(xhr, status, error) {
+alert('Error saving configuration: ' + error);
+}
+});
+}
+
+// Function to reset to the default configuration
+function resetConfiguration() {
+if (confirm('Are you sure you want to reset to the default configuration? All changes will be lost.')) {
+$.ajax({
+url: '/api/reset-config',
+type: 'POST',
+success: function(response) {
+ // Reload the configuration
+ $.getJSON('/api/config', function(config) {
+ currentConfig = config;
+ renderDashboard(config);
+ });
+
+ alert('Reset to default configuration successfully!');
+},
+error: function(xhr, status, error) {
+ alert('Error resetting configuration: ' + error);
+}
+});
+}
+}
+
+// Function to view the dashboard
+function viewDashboard() {
+// Save the configuration first
+saveConfiguration();
+
+// Open the dashboard in a new tab
+window.open('/dashboard', '_blank');
+}
+
+// Function to upload and process a CSV file
+function uploadCSV() {
+const fileInput = $('#csv-file')[0];
+if (!fileInput.files.length) {
+$('#upload-status').text('Please select a file first.');
+return;
+}
+
+const file = fileInput.files[0];
+const formData = new FormData();
+formData.append('file', file);
+
+$('#upload-status').text('Uploading and processing file...');
+
+$.ajax({
+url: '/api/upload-csv',
+type: 'POST',
+data: formData,
+processData: false,
+contentType: false,
+success: function(response) {
+if (response.status === 'success') {
+ $('#upload-status').html(`${response.message} `);
+ $('#view-dashboard').prop('disabled', false);
+} else {
+ $('#upload-status').html(`${response.message} `);
+}
+},
+error: function(xhr, status, error) {
+$('#upload-status').html(`Error: ${error} `);
+}
+});
+}
+});
+
+
diff --git a/algosystem/backtesting/dashboard/web_app/templates/chart_config.html b/algosystem/backtesting/dashboard/web_app/templates/chart_config.html
new file mode 100644
index 0000000..ca0cfa3
--- /dev/null
+++ b/algosystem/backtesting/dashboard/web_app/templates/chart_config.html
@@ -0,0 +1,143 @@
+
+
+
+
+
+
+
+ Chart Configuration
+
+
+
+
+
+
+ Chart Configuration: {{ chart.title }}
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/algosystem/backtesting/dashboard/web_app/templates/index.html b/algosystem/backtesting/dashboard/web_app/templates/index.html
new file mode 100644
index 0000000..2ba85c8
--- /dev/null
+++ b/algosystem/backtesting/dashboard/web_app/templates/index.html
@@ -0,0 +1,95 @@
+
+
+
+
+
+
+
+ AlgoSystem Dashboard Editor
+
+
+
+
+
+
+
+
+
+
+
+
+
Dashboard Layout
+
+
Metrics
+
+
+
+
Add Metrics Row
+
+
+
+
Charts
+
+
+
+
Add Charts Row
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/algosystem/backtesting/engine.py b/algosystem/backtesting/engine.py
index 6002cff..84ae087 100644
--- a/algosystem/backtesting/engine.py
+++ b/algosystem/backtesting/engine.py
@@ -1,19 +1,9 @@
import pandas as pd
import numpy as np
import os
-import shutil
-import json
-import webbrowser
import matplotlib.pyplot as plt
from algosystem.utils._logging import get_logger
-from algosystem.backtesting.visualization import (
- create_equity_chart,
- create_drawdown_chart,
- create_monthly_returns_heatmap,
- create_rolling_sharpe_chart
-)
-
from algosystem.backtesting import metrics
logger = get_logger(__name__)
@@ -21,7 +11,7 @@
class Engine:
"""Backtesting engine that uses a price series (e.g. portfolio value) as input."""
- def __init__(self, data, benchmark, start_date=None, end_date=None,
+ def __init__(self, data, benchmark=None, start_date=None, end_date=None,
initial_capital=None, price_column=None):
"""
Initialize the backtesting engine using a price series.
@@ -29,8 +19,10 @@ def __init__(self, data, benchmark, start_date=None, end_date=None,
Parameters:
-----------
data : pd.DataFrame or pd.Series
- Historical data of the strategy’s portfolio value.
+ Historical data of the strategy's portfolio value.
If a DataFrame is provided, you must either pass a price_column or ensure it has one column.
+ benchmark : pd.DataFrame or pd.Series, optional
+ Benchmark data to compare against
start_date : str, optional
Start date for the backtest (YYYY-MM-DD). Defaults to the first date in data.
end_date : str, optional
@@ -55,8 +47,18 @@ def __init__(self, data, benchmark, start_date=None, end_date=None,
else:
raise TypeError("data must be a pandas DataFrame or Series")
-
- self.benchmark_series = benchmark.copy() if benchmark is not None else None
+ # Handle benchmark data
+ self.benchmark_series = None
+ if benchmark is not None:
+ if isinstance(benchmark, pd.DataFrame):
+ if benchmark.shape[1] == 1:
+ self.benchmark_series = benchmark.iloc[:, 0].copy()
+ else:
+ raise ValueError("Benchmark DataFrame has multiple columns; only first column will be used")
+ elif isinstance(benchmark, pd.Series):
+ self.benchmark_series = benchmark.copy()
+ else:
+ raise TypeError("benchmark must be a pandas DataFrame or Series")
# Set date range based on provided dates or available index
self.start_date = pd.to_datetime(start_date) if start_date else self.price_series.index[0]
@@ -64,6 +66,11 @@ def __init__(self, data, benchmark, start_date=None, end_date=None,
mask = (self.price_series.index >= self.start_date) & (self.price_series.index <= self.end_date)
self.price_series = self.price_series.loc[mask]
+ # Apply same date filter to benchmark if it exists
+ if self.benchmark_series is not None:
+ benchmark_mask = (self.benchmark_series.index >= self.start_date) & (self.benchmark_series.index <= self.end_date)
+ self.benchmark_series = self.benchmark_series.loc[benchmark_mask]
+
if self.price_series.empty:
raise ValueError("No data available for the specified date range")
@@ -71,7 +78,7 @@ def __init__(self, data, benchmark, start_date=None, end_date=None,
self.initial_capital = initial_capital if initial_capital is not None else self.price_series.iloc[0]
self.results = None
- self.metrics = None
+ self.metrics_data = None
self.plots = None
logger.info(f"Initialized backtest from {self.start_date.date()} to {self.end_date.date()}")
@@ -96,23 +103,22 @@ def run(self):
equity_series = self.initial_capital * (self.price_series / self.price_series.iloc[0])
logger.info("Calculating performance metrics")
- self.metrics = metrics.calculate_metrics(equity_series, self.benchmark_series)
+ # Calculate metrics
+ self.metrics_data = metrics.calculate_metrics(equity_series, self.benchmark_series)
- logger.info("Generating performance plots")
- # Fix: Pass benchmark_series instead of initial_capital
+ logger.info("Calculating time series data")
+ # Calculate time series data
self.plots = metrics.calculate_time_series_data(equity_series, self.benchmark_series)
self.results = {
'equity': equity_series,
- # Positions and trades are not computed in this model because the data
- # represents the final portfolio value. If desired, you can derive additional metrics.
'initial_capital': self.initial_capital,
'final_capital': equity_series.iloc[-1],
'returns': (equity_series.iloc[-1] - self.initial_capital) / self.initial_capital,
'data': self.price_series,
'start_date': self.start_date,
'end_date': self.end_date,
- 'metrics': self.metrics,
+ 'metrics': self.metrics_data,
'plots': self.plots,
}
@@ -120,99 +126,108 @@ def run(self):
return self.results
def get_results(self):
+ """Get the full results dictionary."""
+ if self.results is None:
+ logger.warning("No results available. Run the backtest first.")
+ return {}
return self.results
def get_metrics(self):
- return self.metrics
+ """Get the metrics dictionary."""
+ if self.metrics_data is None:
+ logger.warning("No metrics available. Run the backtest first.")
+ return {}
+ return self.metrics_data
def print_metrics(self):
- """
- Print performance metrics to console.
- """
+ """Print performance metrics to console."""
metrics = self.get_metrics()
+ if not metrics:
+ logger.warning("No metrics available. Run the backtest first.")
+ return
+
logger.info("Performance Metrics:")
for key, value in metrics.items():
logger.info(f"{key}: {value}")
- def get_plots(self, output_path=None, show_charts=True):
+ def get_plots(self, show_charts=False):
"""
- Generate, save, and return performance plots.
-
+ Get the plot data and optionally display charts.
+
Parameters:
-----------
- output_path : str, optional
- Directory in which to save the plots.
- If not provided, defaults to a subfolder named 'plots' in the current working directory.
show_charts : bool, optional
- If True, display the charts interactively. If False, the charts will not be shown.
-
+ Whether to display the charts using matplotlib. Defaults to False.
+
Returns:
--------
plots : dict
- Dictionary containing matplotlib figure objects for each plot.
+ Dictionary containing plot data
"""
- # Extract the equity series from the results for those plots that require it:
- equity_series = self.results['equity']
-
- equity_chart = create_equity_chart(equity_series)
- drawdown_chart = create_drawdown_chart(equity_series)
- monthly_returns_heatmap = create_monthly_returns_heatmap(equity_series)
- rolling_sharpe_chart = create_rolling_sharpe_chart(equity_series)
-
- plots = {
- 'equity_chart': equity_chart,
- 'drawdown_chart': drawdown_chart,
- 'monthly_returns_heatmap': monthly_returns_heatmap,
- 'rolling_sharpe_chart': rolling_sharpe_chart
- }
-
- # Set default output path if none provided; default to "./plots"
- if output_path is None:
- output_path = os.path.join(os.getcwd(), "plots")
- else:
- output_path = os.path.abspath(output_path)
-
- # Create the directory if it doesn't exist.
- os.makedirs(output_path, exist_ok=True)
-
- # Save each plot to a separate PNG file.
- for key, fig in plots.items():
- file_path = os.path.join(output_path, f"{key}.png")
- fig.savefig(file_path)
- print(f"Saved {key} to {file_path}")
-
- # If show_charts is True, display the plots interactively.
+ if self.plots is None:
+ logger.warning("No plots available. Run the backtest first.")
+ return {}
+
if show_charts:
- # Turn interactive mode off to force blocking behavior.
- plt.ioff()
- # This call will block until all open figure windows are closed.
- plt.show(block=True)
-
- return plots
-
- def _format_time_series(self, series):
- """Format a time series for the dashboard"""
- if series is None or series.empty:
- return []
-
- result = []
- for date, value in series.items():
- # Convert date to string
- date_str = date.strftime('%Y-%m-%d') if hasattr(date, 'strftime') else str(date)
+ self._display_charts()
- # Handle NumPy types
- if isinstance(value, (np.integer, np.floating)):
- value_float = float(value.item())
- else:
- value_float = float(value) if pd.notna(value) else None
+ return self.plots
+
+ def _display_charts(self):
+ """Display important charts using matplotlib."""
+ if self.results is None or self.plots is None:
+ logger.warning("No results available. Run the backtest first.")
+ return
- result.append({'date': date_str, 'value': value_float})
+ # Create a figure with 2x2 subplots
+ fig, axs = plt.subplots(2, 2, figsize=(14, 10))
+
+ # Plot equity curve
+ axs[0, 0].plot(self.results['equity'])
+ axs[0, 0].set_title('Equity Curve')
+ axs[0, 0].set_xlabel('Date')
+ axs[0, 0].set_ylabel('Value')
+ axs[0, 0].grid(True)
+
+ # Plot drawdown
+ if 'drawdown_series' in self.plots:
+ axs[0, 1].fill_between(
+ self.plots['drawdown_series'].index,
+ 0,
+ self.plots['drawdown_series'],
+ color='red',
+ alpha=0.3
+ )
+ axs[0, 1].set_title('Drawdown')
+ axs[0, 1].set_xlabel('Date')
+ axs[0, 1].set_ylabel('Drawdown')
+ axs[0, 1].grid(True)
+
+ # Plot rolling Sharpe ratio
+ if 'rolling_sharpe' in self.plots:
+ axs[1, 0].plot(self.plots['rolling_sharpe'])
+ axs[1, 0].set_title('Rolling Sharpe Ratio')
+ axs[1, 0].set_xlabel('Date')
+ axs[1, 0].set_ylabel('Sharpe Ratio')
+ axs[1, 0].grid(True)
+
+ # Plot monthly returns
+ if 'monthly_returns' in self.plots:
+ monthly_returns = self.plots['monthly_returns']
+ axs[1, 1].bar(monthly_returns.index, monthly_returns)
+ axs[1, 1].set_title('Monthly Returns')
+ axs[1, 1].set_xlabel('Date')
+ axs[1, 1].set_ylabel('Return')
+ axs[1, 1].grid(True)
+
+ plt.tight_layout()
+ plt.show()
+
+ return fig
- return result
-
def generate_dashboard(self, output_dir=None, open_browser=True, config_path=None):
"""
- Generate an HTML dashboard for the backtest results based on graph_config.json
+ Generate an HTML dashboard for the backtest results.
Parameters:
-----------
@@ -221,12 +236,16 @@ def generate_dashboard(self, output_dir=None, open_browser=True, config_path=Non
open_browser : bool, optional
Whether to automatically open the dashboard in browser. Defaults to True
config_path : str, optional
- Path to the graph configuration file. Defaults to utils/graph_config.json
+ Path to the graph configuration file.
Returns:
--------
dashboard_path : str
Path to the generated dashboard HTML file
"""
- from .dashboard.dashboard_generator import generate_dashboard
- return generate_dashboard(self, output_dir, open_browser, config_path)
+ if self.results is None:
+ logger.warning("No results available. Running backtest first.")
+ self.run()
+
+ from algosystem.backtesting.dashboard.dashboard_generator import generate_dashboard
+ return generate_dashboard(self, output_dir, open_browser, config_path)
\ No newline at end of file
diff --git a/algosystem/backtesting/utils/graph_config.json b/algosystem/backtesting/utils/graph_config.json
deleted file mode 100644
index 2f49794..0000000
--- a/algosystem/backtesting/utils/graph_config.json
+++ /dev/null
@@ -1,102 +0,0 @@
-{
- "metrics": [
- {
- "id": "annual_return",
- "type": "Percentage",
- "title": "Annualized Return",
- "value_key": "annual_return",
- "position": {
- "row": 0,
- "col": 0
- }
- },
- {
- "id": "volatility",
- "type": "Percentage",
- "title": "Volatility",
- "value_key": "volatility",
- "position": {
- "row": 0,
- "col": 1
- }
- },
- {
- "id": "sharpe_ratio",
- "type": "Value",
- "title": "Sharpe Ratio",
- "value_key": "sharpe_ratio",
- "position": {
- "row": 0,
- "col": 2
- }
- },
- {
- "id": "max_drawdown",
- "type": "Percentage",
- "title": "Max Drawdown",
- "value_key": "max_drawdown",
- "position": {
- "row": 0,
- "col": 3
- }
- }
- ],
- "charts": [
- {
- "id": "equity_curve",
- "type": "LineChart",
- "title": "Equity Curve",
- "data_key": "equity",
- "position": {
- "row": 1,
- "col": 0
- },
- "config": {
- "y_axis_label": "Value ($)"
- }
- },
- {
- "id": "drawdown",
- "type": "LineChart",
- "title": "Drawdown Chart",
- "data_key": "drawdown",
- "position": {
- "row": 1,
- "col": 1
- },
- "config": {
- "y_axis_label": "Drawdown (%)",
- "percentage_format": true
- }
- },
- {
- "id": "monthly_returns",
- "type": "HeatmapTable",
- "title": "Monthly Returns Heatmap",
- "data_key": "monthly_returns",
- "position": {
- "row": 2,
- "col": 0
- },
- "config": {}
- },
- {
- "id": "rolling_sharpe",
- "type": "LineChart",
- "title": "Rolling Sharpe Ratio",
- "data_key": "rolling_sharpe",
- "position": {
- "row": 2,
- "col": 1
- },
- "config": {
- "y_axis_label": "Sharpe Ratio",
- "window_size": 252
- }
- }
- ],
- "layout": {
- "max_cols": 2,
- "title": "AlgoSystem Trading Dashboard"
- }
- }
\ No newline at end of file
diff --git a/algosystem/backtesting/visualization.py b/algosystem/backtesting/visualization.py
deleted file mode 100644
index 9d1560e..0000000
--- a/algosystem/backtesting/visualization.py
+++ /dev/null
@@ -1,279 +0,0 @@
-import matplotlib.pyplot as plt
-import seaborn as sns
-import pandas as pd
-import numpy as np
-from matplotlib.gridspec import GridSpec
-from matplotlib.ticker import FuncFormatter
-
-def create_equity_chart(equity_curve, benchmark=None, figsize=(10, 6)):
- """Create an equity curve chart with optional benchmark comparison."""
- plt.figure(figsize=figsize)
-
- # Plot equity curve
- plt.plot(equity_curve, label='Strategy', linewidth=2)
-
- # Plot benchmark if provided
- if benchmark is not None:
- # Reindex to match equity curve
- benchmark = benchmark.reindex(equity_curve.index, method='ffill')
- # Normalize to same starting value
- benchmark = benchmark * (equity_curve.iloc[0] / benchmark.iloc[0])
- plt.plot(benchmark, label='Benchmark', linewidth=2, alpha=0.7)
-
- # Add buy and hold line
- buy_hold = pd.Series(data=equity_curve.iloc[0], index=equity_curve.index)
- plt.plot(buy_hold, 'k--', label='Initial Capital', linewidth=1, alpha=0.5)
-
- # Format and label
- plt.grid(alpha=0.3)
- plt.xlabel('Date')
- plt.ylabel('Equity ($)')
- plt.title('Equity Curve')
- plt.legend()
-
- return plt.gcf()
-
-def create_drawdown_chart(equity_curve, figsize=(10, 6)):
- """Create a drawdown chart from the equity curve."""
- # Calculate drawdown
- returns = equity_curve.pct_change().dropna()
- cum_returns = (1 + returns).cumprod()
- running_max = cum_returns.cummax()
- drawdown = (cum_returns / running_max) - 1
-
- plt.figure(figsize=figsize)
- plt.fill_between(drawdown.index, 0, drawdown, color='red', alpha=0.3)
- plt.plot(drawdown, color='red', linewidth=1)
-
- # Format and label
- plt.grid(alpha=0.3)
- plt.xlabel('Date')
- plt.ylabel('Drawdown (%)')
- plt.title('Drawdown Chart')
-
- # Format y-axis as percentage
- plt.gca().yaxis.set_major_formatter(FuncFormatter(lambda y, _: f'{y:.0%}'))
-
- return plt.gcf()
-
-def create_monthly_returns_heatmap(equity_curve, figsize=(10, 6)):
- """Create a monthly returns heatmap."""
- # Calculate monthly returns
- monthly_returns = equity_curve.resample('M').last().pct_change().dropna()
-
- # Transform to a 12x? matrix (years x months)
- returns_matrix = monthly_returns.groupby([monthly_returns.index.year, monthly_returns.index.month]).first().unstack()
-
- plt.figure(figsize=figsize)
-
- # Create heatmap
- sns.heatmap(returns_matrix, annot=True, fmt='.1%', cmap='RdYlGn',
- cbar_kws={'label': 'Monthly Return'}, linewidths=0.5)
-
- plt.title('Monthly Returns Heatmap')
- plt.xlabel('Month')
- plt.ylabel('Year')
-
- return plt.gcf()
-
-def create_rolling_sharpe_chart(equity_curve, window=252, figsize=(10, 6)):
- """Create a rolling Sharpe ratio chart."""
- returns = equity_curve.pct_change().dropna()
-
- # Calculate rolling Sharpe ratio (assuming risk-free rate = 0)
- rolling_return = returns.rolling(window).mean() * 252
- rolling_vol = returns.rolling(window).std() * np.sqrt(252)
- rolling_sharpe = rolling_return / rolling_vol
-
- plt.figure(figsize=figsize)
- plt.plot(rolling_sharpe, linewidth=2)
-
- # Add horizontal line at Sharpe = 1
- plt.axhline(y=1, color='green', linestyle='--', alpha=0.7)
- plt.axhline(y=0, color='red', linestyle='--', alpha=0.7)
-
- # Format and label
- plt.grid(alpha=0.3)
- plt.xlabel('Date')
- plt.ylabel('Sharpe Ratio (Rolling)')
- plt.title(f'Rolling {window//252}-Year Sharpe Ratio')
-
- return plt.gcf()
-
-def create_performance_dashboard(backtest_results, benchmark=None, save_path=None):
- """
- Create a comprehensive performance dashboard from backtest results.
-
- Parameters:
- -----------
- backtest_results : dict
- Dictionary containing backtest results
- benchmark : pandas.Series, optional
- Benchmark price series for comparison
- save_path : str, optional
- Path to save the dashboard figure
-
- Returns:
- --------
- fig : matplotlib.Figure
- The dashboard figure
- """
- # Extract equity curve
- equity = backtest_results['equity']
-
- # Set up figure and grid
- fig = plt.figure(figsize=(15, 12))
- gs = GridSpec(3, 2, figure=fig)
-
- # Equity curve
- ax1 = fig.add_subplot(gs[0, :])
- equity_plot = create_equity_chart(equity, benchmark)
- equity_plot_ax = equity_plot.axes[0]
- equity_plot_ax.get_figure().delaxes(equity_plot_ax)
- ax1.plot(equity, label='Strategy', linewidth=2)
-
- if benchmark is not None:
- # Normalize to same starting value
- benchmark = benchmark.reindex(equity.index, method='ffill')
- benchmark = benchmark * (equity.iloc[0] / benchmark.iloc[0])
- ax1.plot(benchmark, label='Benchmark', linewidth=2, alpha=0.7)
-
- ax1.axhline(y=equity.iloc[0], color='k', linestyle='--', linewidth=1, alpha=0.5, label='Initial Capital')
- ax1.set_title('Equity Curve')
- ax1.set_xlabel('Date')
- ax1.set_ylabel('Equity ($)')
- ax1.grid(alpha=0.3)
- ax1.legend()
-
- # Drawdown chart
- ax2 = fig.add_subplot(gs[1, 0])
- returns = equity.pct_change().dropna()
- cum_returns = (1 + returns).cumprod()
- running_max = cum_returns.cummax()
- drawdown = (cum_returns / running_max) - 1
-
- ax2.fill_between(drawdown.index, 0, drawdown, color='red', alpha=0.3)
- ax2.plot(drawdown, color='red', linewidth=1)
- ax2.set_title('Drawdown Chart')
- ax2.set_xlabel('Date')
- ax2.set_ylabel('Drawdown (%)')
- ax2.grid(alpha=0.3)
- ax2.yaxis.set_major_formatter(FuncFormatter(lambda y, _: f'{y:.0%}'))
-
- # Rolling Sharpe ratio
- ax3 = fig.add_subplot(gs[1, 1])
- window = min(252, len(returns) // 2) # Use 1 year or half the data length
- rolling_return = returns.rolling(window).mean() * 252
- rolling_vol = returns.rolling(window).std() * np.sqrt(252)
- rolling_sharpe = rolling_return / rolling_vol
-
- ax3.plot(rolling_sharpe, linewidth=2)
- ax3.axhline(y=1, color='green', linestyle='--', alpha=0.7)
- ax3.axhline(y=0, color='red', linestyle='--', alpha=0.7)
- ax3.set_title(f'Rolling Sharpe Ratio ({window} days)')
- ax3.set_xlabel('Date')
- ax3.set_ylabel('Sharpe Ratio')
- ax3.grid(alpha=0.3)
-
- # Monthly returns heatmap
- ax4 = fig.add_subplot(gs[2, :])
- monthly_returns = equity.resample('M').last().pct_change().dropna()
-
- # Create more meaningful representation if very few months
- if len(monthly_returns) <= 6:
- # Use bar chart for few months
- ax4.bar(monthly_returns.index, monthly_returns, color='blue', alpha=0.7)
- ax4.set_title('Monthly Returns')
- ax4.set_xlabel('Date')
- ax4.set_ylabel('Return (%)')
- ax4.yaxis.set_major_formatter(FuncFormatter(lambda y, _: f'{y:.1%}'))
- ax4.grid(alpha=0.3)
- else:
- # Use heatmap for many months
- years = monthly_returns.index.year.unique()
- months = range(1, 13)
-
- # Create a matrix of returns with years as rows and months as columns
- returns_matrix = pd.DataFrame(index=years, columns=months, dtype=float)
-
- for date, ret in monthly_returns.items():
- returns_matrix.loc[date.year, date.month] = ret
-
- sns.heatmap(returns_matrix, annot=True, fmt='.1%', cmap='RdYlGn',
- ax=ax4, cbar_kws={'label': 'Return'}, linewidths=0.5)
- ax4.set_title('Monthly Returns Heatmap')
- ax4.set_xlabel('Month')
- ax4.set_ylabel('Year')
-
- # Add key metrics as text
- from ..backtesting.metrics import calculate_metrics
- metrics = calculate_metrics(equity)
-
- # Calculate additional stats
- total_return = metrics['total_return']
- annual_return = metrics['annual_return']
- sharpe = metrics['sharpe_ratio']
- max_dd = metrics['max_drawdown']
- volatility = metrics['volatility']
-
- # Create a text box with metrics
- metrics_text = (
- f"Total Return: {total_return:.2%}\n"
- f"Annual Return: {annual_return:.2%}\n"
- f"Sharpe Ratio: {sharpe:.2f}\n"
- f"Max Drawdown: {max_dd:.2%}\n"
- f"Volatility: {volatility:.2%}"
- )
-
- fig.text(0.02, 0.02, metrics_text, fontsize=10,
- bbox=dict(facecolor='lightgray', alpha=0.5))
-
- # Add title
- strategy_name = backtest_results.get('strategy_name', 'Strategy Backtest')
- fig.suptitle(strategy_name, fontsize=16)
-
- # Adjust layout
- plt.tight_layout(rect=[0, 0.03, 1, 0.97])
-
- # Save if path provided
- if save_path:
- plt.savefig(save_path, dpi=300, bbox_inches='tight')
-
- return fig
-
-def create_simple_performance_chart(backtest_results, output_path=None):
- """Create a simple performance chart for command-line usage."""
- equity = backtest_results['equity']
-
- fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 8))
-
- # Equity curve
- ax1.plot(equity, linewidth=2)
- ax1.set_title('Equity Curve')
- ax1.set_xlabel('Date')
- ax1.set_ylabel('Equity ($)')
- ax1.grid(alpha=0.3)
-
- # Drawdown
- returns = equity.pct_change().dropna()
- cum_returns = (1 + returns).cumprod()
- running_max = cum_returns.cummax()
- drawdown = (cum_returns / running_max) - 1
-
- ax2.fill_between(drawdown.index, 0, drawdown, color='red', alpha=0.3)
- ax2.plot(drawdown, color='red', linewidth=1)
- ax2.set_title('Drawdown')
- ax2.set_xlabel('Date')
- ax2.set_ylabel('Drawdown (%)')
- ax2.grid(alpha=0.3)
- ax2.yaxis.set_major_formatter(FuncFormatter(lambda y, _: f'{y:.0%}'))
-
- plt.tight_layout()
-
- if output_path:
- plt.savefig(output_path, dpi=300, bbox_inches='tight')
- plt.close(fig)
- return output_path
- else:
- return fig
-
diff --git a/algosystem/cli/commands.py b/algosystem/cli/commands.py
index 3f28f4d..b2484fc 100644
--- a/algosystem/cli/commands.py
+++ b/algosystem/cli/commands.py
@@ -17,10 +17,14 @@ def cli():
help='Path to a dashboard configuration file to load')
@click.option('--data-dir', '-d', type=click.Path(exists=True),
help='Directory containing data files to preload')
-def launch(config, data_dir):
+@click.option('--host', type=str, default='127.0.0.1',
+ help='Host to run the dashboard editor server on (default: 127.0.0.1)')
+@click.option('--port', type=int, default=5000,
+ help='Port to run the dashboard editor server on (default: 5000)')
+@click.option('--debug', is_flag=True, default=False,
+ help='Run the server in debug mode')
+def launch(config, data_dir, host, port, debug):
"""Launch the AlgoSystem Dashboard UI."""
- from algosystem.dashboard.dashboard_module import launch_dashboard
-
# Set environment variables for config and data if provided
if config:
os.environ['ALGO_DASHBOARD_CONFIG'] = os.path.abspath(config)
@@ -28,181 +32,89 @@ def launch(config, data_dir):
if data_dir:
os.environ['ALGO_DASHBOARD_DATA_DIR'] = os.path.abspath(data_dir)
- # Launch the dashboard
- launch_dashboard()
+ # Launch the dashboard web editor
+ from algosystem.backtesting.dashboard.web_app.app import start_dashboard_editor
+ click.echo(f"Starting AlgoSystem Dashboard Editor on http://{host}:{port}/")
+ click.echo("Press Ctrl+C to stop the server.")
+ start_dashboard_editor(host=host, port=port, debug=debug)
@cli.command()
@click.argument('input_file', type=click.Path(exists=True))
-@click.argument('output_file', type=click.Path())
-def render(input_file, output_file,):
+@click.option('--output-dir', '-o', type=click.Path(), default="./dashboard_output",
+ help='Directory to save the dashboard files (default: ./dashboard_output)')
+@click.option('--config', '-c', type=click.Path(exists=True),
+ help='Path to a custom dashboard configuration file')
+@click.option('--benchmark', '-b', type=click.Path(exists=True),
+ help='Path to a CSV file with benchmark data')
+@click.option('--open-browser', is_flag=True, default=False,
+ help='Open the dashboard in a browser after rendering')
+def render(input_file, output_dir, config, benchmark, open_browser):
"""
- Render a dashboard from a configuration file and CSV data.
+ Render a dashboard from a CSV file with strategy data.
INPUT_FILE: Path to a CSV file with strategy data
- OUTPUT_FILE: Path to save the dashboard image (PNG or PDF)
"""
import json
- import matplotlib.pyplot as plt
- from matplotlib.gridspec import GridSpec
+ import webbrowser
from algosystem.backtesting.engine import Engine
+ from algosystem.backtesting.dashboard.dashboard_generator import generate_dashboard
+
+ # Create output directory if it doesn't exist
+ os.makedirs(output_dir, exist_ok=True)
# Load the dashboard configuration
- with open('algosystem/utils/graph_config.json', 'r') as f:
- dashboard_config = json.load(f)
+ config_path = config
+ if not config_path:
+ # Use default config path
+ from algosystem.backtesting.dashboard.utils.default_config import DEFAULT_CONFIG_PATH
+ config_path = DEFAULT_CONFIG_PATH
- # Load the CSV data
try:
+ # Load the CSV data
+ click.echo(f"Loading data from {input_file}...")
data = pd.read_csv(input_file, index_col=0, parse_dates=True)
- print(f"Loaded data with shape: {data.shape}")
- except Exception as e:
- print(f"Error loading CSV file: {e}")
- sys.exit(1)
-
- # Create a backtest engine to process the data
- try:
+ click.echo(f"Loaded data with shape: {data.shape}")
+
+ # Load benchmark data if provided
+ benchmark_data = None
+ if benchmark:
+ click.echo(f"Loading benchmark data from {benchmark}...")
+ benchmark_data = pd.read_csv(benchmark, index_col=0, parse_dates=True)
+ if isinstance(benchmark_data, pd.DataFrame) and benchmark_data.shape[1] > 1:
+ benchmark_data = benchmark_data.iloc[:, 0] # Use first column
+ click.echo(f"Loaded benchmark data with {len(benchmark_data)} rows")
+
+ # Create a backtest engine to process the data
+ click.echo("Running backtest...")
if isinstance(data, pd.DataFrame) and data.shape[1] > 1:
- # Use the first column as price data for simplicity
+ # Use the first column as price data
price_data = data.iloc[:, 0]
else:
price_data = data
- engine = Engine(data=price_data)
+ # Initialize and run the engine
+ engine = Engine(data=price_data, benchmark=benchmark_data)
results = engine.run()
- print("Backtest completed successfully")
- except Exception as e:
- print(f"Error running backtest: {e}")
- sys.exit(1)
-
- # Determine the dashboard grid size
- if 'dashboard' in dashboard_config and 'max_cols' in dashboard_config['dashboard']:
- max_cols = dashboard_config['dashboard']['max_cols']
- else:
- max_cols = 2
-
- # Count plots to determine grid size
- if 'dashboard' in dashboard_config and 'plots' in dashboard_config['dashboard']:
- plots = dashboard_config['dashboard']['plots']
- num_plots = len(plots)
- else:
- print("No plots defined in configuration file")
- sys.exit(1)
-
- # Calculate grid dimensions
- num_rows = (num_plots + max_cols - 1) // max_cols
-
- # Create matplotlib figure for the dashboard
- fig = plt.figure(figsize=(max_cols * 8, num_rows * 6))
- gs = GridSpec(num_rows, max_cols, figure=fig)
-
- # Create a plot for each defined plot in the configuration
- plot_positions = {}
- for i, plot_config in enumerate(plots):
- # Get plot position from config or calculate it
- if 'position' in plot_config:
- row, col = plot_config['position']['row'], plot_config['position']['col']
- else:
- row, col = i // max_cols, i % max_cols
-
- # Store position to avoid duplicates
- pos_key = f"{row},{col}"
- if pos_key in plot_positions:
- # Position already occupied, find next available spot
- for r in range(num_rows):
- for c in range(max_cols):
- test_key = f"{r},{c}"
- if test_key not in plot_positions:
- row, col = r, c
- pos_key = test_key
- break
-
- plot_positions[pos_key] = True
-
- # Create the plot based on its type
- ax = fig.add_subplot(gs[row, col])
-
- # Get plot type and title
- plot_type = plot_config.get('type', 'Unknown')
- title = plot_config.get('title', plot_type)
-
- # Create the appropriate plot based on type
- if plot_type == 'Equity Curve':
- equity = results['equity']
- ax.plot(equity, label='Strategy')
- ax.set_title(title)
- ax.set_xlabel('Date')
- ax.set_ylabel('Equity ($)')
- ax.grid(alpha=0.3)
+ click.echo("Backtest completed successfully")
- elif plot_type == 'Drawdown Chart':
- # Calculate drawdown
- equity = results['equity']
- returns = equity.pct_change().dropna()
- cum_returns = (1 + returns).cumprod()
- running_max = cum_returns.cummax()
- drawdown = (cum_returns / running_max) - 1
-
- ax.fill_between(drawdown.index, 0, drawdown, color='red', alpha=0.3)
- ax.plot(drawdown, color='red', linewidth=1)
- ax.set_title(title)
- ax.set_xlabel('Date')
- ax.set_ylabel('Drawdown (%)')
- ax.grid(alpha=0.3)
+ # Generate dashboard
+ click.echo("Generating dashboard...")
+ dashboard_path = generate_dashboard(
+ engine=engine,
+ output_dir=output_dir,
+ open_browser=open_browser,
+ config_path=config_path
+ )
- elif plot_type == 'Monthly Returns Heatmap':
- equity = results['equity']
- monthly_returns = equity.resample('M').last().pct_change().dropna()
- returns_matrix = monthly_returns.groupby(
- [monthly_returns.index.year, monthly_returns.index.month]).first().unstack()
-
- # Create heatmap (simplified version)
- cax = ax.imshow(returns_matrix, cmap='RdYlGn')
- plt.colorbar(cax, ax=ax, label='Monthly Return')
- ax.set_title(title)
- ax.set_xlabel('Month')
- ax.set_ylabel('Year')
+ click.echo(f"Dashboard generated successfully at: {dashboard_path}")
- elif plot_type == 'Rolling Sharpe Ratio':
- equity = results['equity']
- returns = equity.pct_change().dropna()
- window = plot_config.get('config', {}).get('window_size', 252)
-
- # Calculate rolling Sharpe ratio
- rolling_return = returns.rolling(window).mean() * 252
- rolling_vol = returns.rolling(window).std() * (252 ** 0.5)
- rolling_sharpe = rolling_return / rolling_vol
-
- ax.plot(rolling_sharpe, linewidth=2)
- ax.axhline(y=1, color='green', linestyle='--', alpha=0.7)
- ax.axhline(y=0, color='red', linestyle='--', alpha=0.7)
-
- ax.set_title(f"{title} ({window//252}-Year Window)")
- ax.set_xlabel('Date')
- ax.set_ylabel('Sharpe Ratio')
- ax.grid(alpha=0.3)
-
- else:
- # Generic plot for unrecognized types
- ax.text(0.5, 0.5, f"Plot Type: {plot_type}", ha='center', va='center')
- ax.set_title(title)
- ax.axis('off')
-
- # Add overall title
- fig.suptitle("AlgoSystem Dashboard", fontsize=16)
-
- # Adjust layout and save
- fig.tight_layout(rect=[0, 0, 1, 0.97])
-
- try:
- output_ext = os.path.splitext(output_file)[1].lower()
- if output_ext == '.pdf':
- fig.savefig(output_file, format='pdf')
- else:
- # Default to PNG
- fig.savefig(output_file, format='png', dpi=300)
+ # Provide instructions for viewing
+ if not open_browser:
+ click.echo("To view the dashboard, open this file in a web browser:")
+ click.echo(f" {os.path.abspath(dashboard_path)}")
- print(f"Dashboard saved to: {output_file}")
except Exception as e:
- print(f"Error saving dashboard: {e}")
+ click.echo(f"Error: {str(e)}", err=True)
sys.exit(1)
@cli.command()
@@ -213,58 +125,12 @@ def create_config(output_dir):
OUTPUT_DIR: Directory to save the sample configuration
"""
+ # Load the default configuration
+ from algosystem.backtesting.dashboard.utils.default_config import DEFAULT_CONFIG_PATH
import json
- # Create a sample configuration
- sample_config = {
- 'dashboard': {
- 'max_cols': 2,
- 'plots': [
- {
- 'id': 1,
- 'type': 'Equity Curve',
- 'title': 'Strategy Equity',
- 'position': {'row': 0, 'col': 0},
- 'config': {
- 'line_color': '#0000FF',
- 'line_width': 2,
- 'grid': {'x': True, 'y': True}
- }
- },
- {
- 'id': 2,
- 'type': 'Drawdown Chart',
- 'title': 'Drawdown Analysis',
- 'position': {'row': 0, 'col': 1},
- 'config': {
- 'line_color': '#FF0000',
- 'line_width': 1,
- 'grid': {'x': True, 'y': True}
- }
- },
- {
- 'id': 3,
- 'type': 'Monthly Returns Heatmap',
- 'title': 'Monthly Performance',
- 'position': {'row': 1, 'col': 0},
- 'config': {}
- },
- {
- 'id': 4,
- 'type': 'Rolling Sharpe Ratio',
- 'title': 'Rolling Sharpe',
- 'position': {'row': 1, 'col': 1},
- 'config': {
- 'window_size': 252,
- 'line_color': '#00AA00',
- 'line_width': 2,
- 'grid': {'x': True, 'y': True}
- }
- }
- ]
- },
- 'data_sources': []
- }
+ with open(DEFAULT_CONFIG_PATH, 'r') as f:
+ sample_config = json.load(f)
# Ensure output directory exists
os.makedirs(output_dir, exist_ok=True)
@@ -274,7 +140,7 @@ def create_config(output_dir):
with open(output_path, 'w') as f:
json.dump(sample_config, f, indent=4)
- print(f"Sample configuration saved to: {output_path}")
+ click.echo(f"Sample configuration saved to: {output_path}")
if __name__ == '__main__':
cli()
\ No newline at end of file
diff --git a/algosystem/dashboard/__init__.py b/algosystem/dashboard/__init__.py
deleted file mode 100644
index 124c307..0000000
--- a/algosystem/dashboard/__init__.py
+++ /dev/null
@@ -1,15 +0,0 @@
-from algosystem.dashboard.dashboard_module import (
- DataManager,
- PlotRegistry,
- EnhancedGraphModule,
- DashboardArea,
- launch_dashboard
-)
-
-__all__ = [
- "DataManager",
- "PlotRegistry",
- "EnhancedGraphModule",
- "DashboardArea",
- "launch_dashboard"
-]
\ No newline at end of file
diff --git a/algosystem/dashboard/dashboard_module.py b/algosystem/dashboard/dashboard_module.py
deleted file mode 100644
index 78a9863..0000000
--- a/algosystem/dashboard/dashboard_module.py
+++ /dev/null
@@ -1,1813 +0,0 @@
-import os
-import sys
-import json
-import numpy as np
-import pandas as pd
-from datetime import datetime
-from PyQt6.QtWidgets import (
- QApplication, QMainWindow, QVBoxLayout, QHBoxLayout,
- QWidget, QPushButton, QLabel, QMenu, QDialog,
- QGridLayout, QComboBox, QColorDialog, QSlider, QSpinBox,
- QDoubleSpinBox, QCheckBox, QGroupBox, QToolButton, QScrollArea,
- QFileDialog, QTabWidget, QLineEdit, QMessageBox, QListWidget,
- QSplitter, QTreeWidget, QTreeWidgetItem
-)
-from PyQt6.QtCore import Qt, pyqtSignal, QPoint, QSize
-from PyQt6.QtGui import QIcon, QDrag, QPixmap
-import pyqtgraph as pg
-from PyQt6.QtGui import QPainter, QDrag, QPixmap
-from PyQt6.QtCore import QMimeData
-import matplotlib.pyplot as plt
-from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
-
-# Import AlgoSystem modules
-from algosystem.utils.config import load_config, save_config
-
-# Import performance functions
-from algosystem.analysis.performance import (
- calculate_returns_stats,
- calculate_rolling_stats,
- compare_strategies,
- analyze_returns_by_period
-)
-
-# Import portfolio functions
-from algosystem.analysis.portfolio import (
- calculate_portfolio_return,
- calculate_portfolio_variance,
- calculate_portfolio_std,
- calculate_sharpe_ratio,
- optimize_portfolio,
- calculate_efficient_frontier
-)
-
-# Import risk functions
-from algosystem.analysis.risk import (
- calculate_var,
- calculate_cvar,
- calculate_risk_metrics,
- stress_test
-)
-
-from algosystem.backtesting.engine import Engine
-from algosystem.backtesting.visualization import (
- create_equity_chart,
- create_drawdown_chart,
- create_monthly_returns_heatmap,
- create_rolling_sharpe_chart,
- create_performance_dashboard
-)
-
-class PlotRegistry:
- """Registry of available plot types and their associated functions"""
-
- def __init__(self):
- self.plot_types = {}
- self.register_default_plots()
-
- def register_plot(self, name, function, description, required_data, parameters=None):
- """Register a new plot type"""
- self.plot_types[name] = {
- 'function': function,
- 'description': description,
- 'required_data': required_data,
- 'parameters': parameters or {}
- }
-
- def register_default_plots(self):
- """Register the default plot types that come with AlgoSystem"""
-
- # Performance plots
- self.register_plot(
- name="Equity Curve",
- function=create_equity_chart,
- description="Shows the growth of portfolio value over time",
- required_data=["equity"],
- parameters={
- 'benchmark': {'type': 'data', 'required': False, 'default': None},
- 'figsize': {'type': 'tuple', 'required': False, 'default': (10, 6)}
- }
- )
-
- self.register_plot(
- name="Drawdown Chart",
- function=create_drawdown_chart,
- description="Shows the drawdown periods for the strategy",
- required_data=["equity"],
- parameters={
- 'figsize': {'type': 'tuple', 'required': False, 'default': (10, 6)}
- }
- )
-
- self.register_plot(
- name="Monthly Returns Heatmap",
- function=create_monthly_returns_heatmap,
- description="Displays monthly returns as a heatmap",
- required_data=["equity"],
- parameters={
- 'figsize': {'type': 'tuple', 'required': False, 'default': (10, 6)}
- }
- )
-
- self.register_plot(
- name="Rolling Sharpe Ratio",
- function=create_rolling_sharpe_chart,
- description="Shows the rolling Sharpe ratio over time",
- required_data=["equity"],
- parameters={
- 'window': {'type': 'int', 'required': False, 'default': 252},
- 'figsize': {'type': 'tuple', 'required': False, 'default': (10, 6)}
- }
- )
-
- # Risk analysis plots - using functions from risk.py
- self.register_plot(
- name="Value at Risk (VaR)",
- function=self._create_var_plot,
- description="Shows the Value at Risk at different confidence levels",
- required_data=["returns"],
- parameters={
- 'confidence_levels': {'type': 'list', 'required': False, 'default': [0.9, 0.95, 0.99]},
- 'method': {'type': 'choice', 'required': False, 'default': 'historical',
- 'choices': ['historical', 'parametric', 'monte_carlo']}
- }
- )
-
- # Portfolio optimization plots - using functions from portfolio.py
- self.register_plot(
- name="Efficient Frontier",
- function=self._create_efficient_frontier_plot,
- description="Shows the efficient frontier for a portfolio of assets",
- required_data=["returns_matrix"],
- parameters={
- 'num_points': {'type': 'int', 'required': False, 'default': 50},
- 'risk_free_rate': {'type': 'float', 'required': False, 'default': 0.0}
- }
- )
-
- # Add more plot types from performance.py
- self.register_plot(
- name="Returns by Period",
- function=self._create_returns_by_period_plot,
- description="Shows returns broken down by different time periods",
- required_data=["returns"],
- parameters={}
- )
-
- self.register_plot(
- name="Rolling Performance",
- function=self._create_rolling_performance_plot,
- description="Shows rolling performance metrics over time",
- required_data=["returns"],
- parameters={
- 'window': {'type': 'int', 'required': False, 'default': 252}
- }
- )
-
- # Add more plot types from risk.py
- self.register_plot(
- name="Return Distribution",
- function=self._create_return_distribution_plot,
- description="Histogram of returns with normal distribution overlay",
- required_data=["returns"],
- parameters={
- 'bins': {'type': 'int', 'required': False, 'default': 50}
- }
- )
-
- self.register_plot(
- name="Risk Metrics",
- function=self._create_risk_metrics_plot,
- description="Visual summary of key risk metrics",
- required_data=["returns"],
- parameters={
- 'risk_free_rate': {'type': 'float', 'required': False, 'default': 0.0}
- }
- )
-
- def _create_var_plot(self, returns, confidence_levels=[0.9, 0.95, 0.99], method='historical'):
- """Create VaR plot using calculate_var from risk.py"""
- fig = plt.figure(figsize=(10, 6))
- ax = fig.add_subplot(111)
-
- # Calculate VaR at different confidence levels using risk.py function
- var_values = [calculate_var(returns, cl, method) for cl in confidence_levels]
-
- # Plot returns histogram
- returns.hist(bins=50, ax=ax, alpha=0.5)
-
- # Add VaR lines
- colors = ['green', 'orange', 'red']
- for i, (cl, var) in enumerate(zip(confidence_levels, var_values)):
- ax.axvline(-var, color=colors[i], linestyle='--',
- label=f'VaR {cl*100:.0f}%: {var:.2%}')
-
- ax.set_title(f'Value at Risk ({method.capitalize()})')
- ax.set_xlabel('Returns')
- ax.set_ylabel('Frequency')
- ax.legend()
-
- return fig
-
- def _create_efficient_frontier_plot(self, returns_matrix, num_points=50, risk_free_rate=0.0):
- """Create efficient frontier plot using functions from portfolio.py"""
- fig = plt.figure(figsize=(10, 6))
- ax = fig.add_subplot(111)
-
- # Calculate the efficient frontier using portfolio.py function
- frontier_returns, frontier_volatilities, frontier_weights = calculate_efficient_frontier(
- returns_matrix, num_points, risk_free_rate
- )
-
- # Plot the efficient frontier
- ax.plot(frontier_volatilities, frontier_returns, 'b-', linewidth=3, label='Efficient Frontier')
-
- # Calculate and plot the optimal portfolio (maximum Sharpe ratio)
- optimal_weights, performance = optimize_portfolio(returns_matrix, risk_free_rate)
- optimal_return = performance['expected_return']
- optimal_volatility = performance['volatility']
-
- ax.scatter(optimal_volatility, optimal_return, marker='*', s=200, color='red',
- label=f'Optimal Portfolio (Sharpe: {performance["sharpe_ratio"]:.2f})')
-
- # Add capital market line if risk-free rate is provided
- if risk_free_rate > 0:
- max_vol = frontier_volatilities[-1] * 1.2
- x_values = np.linspace(0, max_vol, 100)
- slope = (optimal_return - risk_free_rate) / optimal_volatility
- y_values = risk_free_rate + slope * x_values
- ax.plot(x_values, y_values, 'g--', label='Capital Market Line')
- ax.scatter(0, risk_free_rate, marker='o', color='green', label='Risk-Free Asset')
-
- ax.set_title('Efficient Frontier')
- ax.set_xlabel('Volatility (Standard Deviation)')
- ax.set_ylabel('Expected Return')
- ax.legend()
- ax.grid(True)
-
- return fig
-
- def _create_return_distribution_plot(self, returns, bins=50):
- """Create histogram of returns with normal distribution overlay"""
- fig = plt.figure(figsize=(10, 6))
- ax = fig.add_subplot(111)
-
- # Plot histogram
- n, bins, patches = ax.hist(returns, bins=bins, density=True, alpha=0.6, color='blue')
-
- # Fit normal distribution
- mu = returns.mean()
- sigma = returns.std()
- x = np.linspace(mu - 4*sigma, mu + 4*sigma, 100)
- y = (1 / (sigma * np.sqrt(2 * np.pi))) * np.exp(- (x - mu)**2 / (2 * sigma**2))
-
- # Plot normal distribution
- ax.plot(x, y, 'r--', linewidth=2, label='Normal Distribution')
-
- # Add mean line
- ax.axvline(mu, color='green', linestyle='-', linewidth=2,
- label=f'Mean: {mu:.2%}')
-
- # Calculate and display skewness and kurtosis
- skew = returns.skew()
- kurt = returns.kurtosis()
- stats_text = f'Skewness: {skew:.2f}\nKurtosis: {kurt:.2f}'
- ax.text(0.95, 0.95, stats_text, transform=ax.transAxes, verticalalignment='top',
- horizontalalignment='right', bbox={'facecolor': 'white', 'alpha': 0.8})
-
- ax.set_title('Return Distribution')
- ax.set_xlabel('Returns')
- ax.set_ylabel('Density')
- ax.legend()
- ax.grid(True, alpha=0.3)
-
- return fig
-
- def _create_risk_metrics_plot(self, returns, risk_free_rate=0.0):
- """Create visual summary of risk metrics using calculate_risk_metrics from risk.py"""
- # Calculate risk metrics
- metrics = calculate_risk_metrics(returns, risk_free_rate)
-
- fig = plt.figure(figsize=(10, 6))
- ax = fig.add_subplot(111)
-
- # Create bar chart of key metrics
- metric_names = ['annual_return', 'volatility', 'sharpe_ratio', 'sortino_ratio', 'max_drawdown']
- metric_labels = ['Annual Return', 'Volatility', 'Sharpe Ratio', 'Sortino Ratio', 'Max Drawdown']
- metric_values = [metrics[name] for name in metric_names]
-
- # Adjust max_drawdown to positive for visualization
- metric_values[4] = abs(metric_values[4])
-
- x = np.arange(len(metric_names))
- bars = ax.bar(x, metric_values, width=0.6, alpha=0.7)
-
- # Add value labels on top of bars
- for bar in bars:
- height = bar.get_height()
- ax.annotate(f'{height:.2f}',
- xy=(bar.get_x() + bar.get_width() / 2, height),
- xytext=(0, 3), # 3 points vertical offset
- textcoords="offset points",
- ha='center', va='bottom')
-
- ax.set_title('Risk Metrics Summary')
- ax.set_xticks(x)
- ax.set_xticklabels(metric_labels, rotation=45)
- ax.grid(True, alpha=0.3, axis='y')
-
- return fig
-
- def _create_returns_by_period_plot(self, returns):
- """Create returns by period plot using analyze_returns_by_period from performance.py"""
- # Get period analysis
- period_analysis = analyze_returns_by_period(returns)
-
- fig = plt.figure(figsize=(12, 10))
-
- # Create subplot for monthly returns
- ax1 = fig.add_subplot(2, 2, 1)
- monthly_returns = period_analysis['monthly']['returns']
- monthly_returns.plot(kind='bar', ax=ax1)
- ax1.set_title('Monthly Returns')
- ax1.set_ylabel('Return')
- ax1.grid(True, alpha=0.3)
-
- # Create subplot for day of week analysis
- ax2 = fig.add_subplot(2, 2, 2)
- dow_analysis = period_analysis['day_of_week']
- dow_analysis['mean'].plot(kind='bar', ax=ax2)
- ax2.set_title('Average Return by Day of Week')
- ax2.set_ylabel('Return')
- ax2.grid(True, alpha=0.3)
-
- # Create subplot for month of year analysis
- ax3 = fig.add_subplot(2, 2, 3)
- moy_analysis = period_analysis['month_of_year']
- moy_analysis['mean'].plot(kind='bar', ax=ax3)
- ax3.set_title('Average Return by Month')
- ax3.set_ylabel('Return')
- ax3.grid(True, alpha=0.3)
-
- # Create subplot for positive percentage by period
- ax4 = fig.add_subplot(2, 2, 4)
- periods = ['daily', 'monthly', 'quarterly', 'annual']
- period_labels = ['Daily', 'Monthly', 'Quarterly', 'Annual']
- positive_pcts = [period_analysis[p]['positive_pct'] for p in periods]
-
- ax4.bar(period_labels, positive_pcts)
- ax4.set_title('Percentage of Positive Returns by Period')
- ax4.set_ylabel('Percentage')
- ax4.set_ylim([0, 1])
- ax4.grid(True, alpha=0.3)
-
- plt.tight_layout()
- return fig
-
- def _create_rolling_performance_plot(self, returns, window=252):
- """Create rolling performance plot using calculate_rolling_stats from performance.py"""
- # Calculate rolling statistics
- rolling_stats = calculate_rolling_stats(returns, window)
-
- fig = plt.figure(figsize=(12, 10))
-
- # Create subplot for rolling return
- ax1 = fig.add_subplot(2, 2, 1)
- rolling_stats['rolling_return'].plot(ax=ax1)
- ax1.set_title(f'Rolling {window}-Day Return (Annualized)')
- ax1.set_ylabel('Return')
- ax1.grid(True, alpha=0.3)
-
- # Create subplot for rolling volatility
- ax2 = fig.add_subplot(2, 2, 2)
- rolling_stats['rolling_volatility'].plot(ax=ax2)
- ax2.set_title(f'Rolling {window}-Day Volatility (Annualized)')
- ax2.set_ylabel('Volatility')
- ax2.grid(True, alpha=0.3)
-
- # Create subplot for rolling Sharpe ratio
- ax3 = fig.add_subplot(2, 2, 3)
- rolling_stats['rolling_sharpe'].plot(ax=ax3)
- ax3.set_title(f'Rolling {window}-Day Sharpe Ratio')
- ax3.set_ylabel('Sharpe Ratio')
- ax3.grid(True, alpha=0.3)
-
- # Create subplot for rolling max drawdown
- ax4 = fig.add_subplot(2, 2, 4)
- rolling_stats['rolling_max_drawdown'].plot(ax=ax4)
- ax4.set_title(f'Rolling {window}-Day Max Drawdown')
- ax4.set_ylabel('Drawdown')
- ax4.grid(True, alpha=0.3)
-
- plt.tight_layout()
- return fig
-
- def get_plot_types(self):
- """Get list of available plot types"""
- return list(self.plot_types.keys())
-
- def get_plot_info(self, name):
- """Get information about a specific plot type"""
- return self.plot_types.get(name)
-
- def create_plot(self, plot_type, data, **kwargs):
- """Create a plot of the specified type using the provided data"""
- if plot_type not in self.plot_types:
- raise ValueError(f"Unknown plot type: {plot_type}")
-
- plot_info = self.plot_types[plot_type]
- plot_func = plot_info['function']
-
- # Check if we have the required data
- required_data = plot_info['required_data']
- for req in required_data:
- if req not in data:
- raise ValueError(f"Missing required data for {plot_type}: {req}")
-
- # Extract required data from data dictionary
- plot_data = {req: data[req] for req in required_data if req in data}
-
- # Merge kwargs with default parameters
- parameters = plot_info['parameters']
- for param_name, param_info in parameters.items():
- if param_name not in kwargs and 'default' in param_info:
- kwargs[param_name] = param_info['default']
-
- # Create the plot
- return plot_func(**plot_data, **kwargs)
-
-
-class DataManager:
- """Handles loading and preprocessing of strategy data"""
-
- def __init__(self):
- self.data_sources = {}
- self.current_data = None
- self.prepared_data = {} # Store preprocessed data for charts
-
- def load_csv(self, file_path, name=None):
- """Load data from a CSV file"""
- try:
- # Auto-generate name from filename if not provided
- if name is None:
- name = os.path.splitext(os.path.basename(file_path))[0]
-
- # Load the CSV data
- data = pd.read_csv(file_path, index_col=0, parse_dates=True)
-
- # Store the data
- self.data_sources[name] = {
- 'type': 'csv',
- 'path': file_path,
- 'data': data
- }
-
- # Preprocess the data for charts
- self._prepare_data_for_charts(name)
-
- return name
- except Exception as e:
- print(f"Error loading CSV: {e}")
- return None
-
- def load_backtest_results(self, results_dict, name=None):
- """Load data from backtest results"""
- try:
- # Auto-generate name if not provided
- if name is None:
- name = f"Backtest_{datetime.now().strftime('%Y%m%d_%H%M%S')}"
-
- # Store the data
- self.data_sources[name] = {
- 'type': 'backtest',
- 'data': results_dict
- }
-
- # Preprocess the data for charts
- self._prepare_data_for_charts(name)
-
- return name
- except Exception as e:
- print(f"Error loading backtest results: {e}")
- return None
-
- def _prepare_data_for_charts(self, source_name):
- """Preprocess data for charts when data is loaded"""
- if source_name not in self.data_sources:
- return
-
- source_info = self.data_sources[source_name]
- source_type = source_info['type']
- source_data = source_info['data']
-
- # Initialize prepared data for this source
- self.prepared_data[source_name] = {}
-
- # For backtest results
- if source_type == 'backtest':
- # Extract equity curve
- if 'equity' in source_data:
- equity = source_data['equity']
- self.prepared_data[source_name]['equity'] = equity
-
- # Calculate returns
- returns = equity.pct_change().dropna()
- self.prepared_data[source_name]['returns'] = returns
-
- # Calculate drawdown
- cumulative_returns = (1 + returns).cumprod()
- drawdown = (cumulative_returns / cumulative_returns.cummax()) - 1
- self.prepared_data[source_name]['drawdown'] = drawdown
-
- # If there are positions, calculate turnover
- if 'positions' in source_data:
- positions = source_data['positions']
- daily_turnover = positions.diff().abs().sum(axis=1)
- self.prepared_data[source_name]['turnover'] = daily_turnover
-
- # Calculate performance metrics
- try:
- from algosystem.analysis.risk import calculate_risk_metrics
- metrics = calculate_risk_metrics(returns)
- self.prepared_data[source_name]['metrics'] = metrics
- except Exception as e:
- print(f"Error calculating risk metrics: {e}")
-
- # For CSV data
- elif source_type == 'csv':
- data = source_data
-
- # If it's a DataFrame with a single column, treat it as an equity curve
- if isinstance(data, pd.DataFrame) and data.shape[1] == 1:
- equity = data.iloc[:, 0]
- self.prepared_data[source_name]['equity'] = equity
-
- # Calculate returns
- returns = equity.pct_change().dropna()
- self.prepared_data[source_name]['returns'] = returns
-
- # Calculate drawdown
- cumulative_returns = (1 + returns).cumprod()
- drawdown = (cumulative_returns / cumulative_returns.cummax()) - 1
- self.prepared_data[source_name]['drawdown'] = drawdown
-
- # Calculate performance metrics
- try:
- from algosystem.analysis.risk import calculate_risk_metrics
- metrics = calculate_risk_metrics(returns)
- self.prepared_data[source_name]['metrics'] = metrics
- except Exception as e:
- print(f"Error calculating risk metrics: {e}")
-
- # If it's a DataFrame with multiple columns, treat it as returns of multiple assets
- elif isinstance(data, pd.DataFrame) and data.shape[1] > 1:
- # Store the data as returns matrix for portfolio analysis
- self.prepared_data[source_name]['returns_matrix'] = data
-
- # Calculate correlation matrix
- correlation = data.corr()
- self.prepared_data[source_name]['correlation'] = correlation
-
- # Calculate efficient frontier
- try:
- from algosystem.analysis.portfolio import calculate_efficient_frontier, optimize_portfolio
- frontier_returns, frontier_volatilities, frontier_weights = calculate_efficient_frontier(data, 20, 0.0)
- optimal_weights, performance = optimize_portfolio(data, 0.0)
-
- self.prepared_data[source_name]['frontier_returns'] = frontier_returns
- self.prepared_data[source_name]['frontier_volatilities'] = frontier_volatilities
- self.prepared_data[source_name]['frontier_weights'] = frontier_weights
- self.prepared_data[source_name]['optimal_weights'] = optimal_weights
- self.prepared_data[source_name]['optimal_performance'] = performance
- except Exception as e:
- print(f"Error calculating portfolio optimization: {e}")
-
- def get_data_source_names(self):
- """Get list of available data sources"""
- return list(self.data_sources.keys())
-
- def get_data(self, name):
- """Get data for a specific source"""
- if name in self.data_sources:
- return self.data_sources[name]['data']
- return None
-
- def get_prepared_data(self, name, data_type=None):
- """Get prepared data for a specific source and data type"""
- if name in self.prepared_data:
- if data_type is not None:
- return self.prepared_data[name].get(data_type)
- return self.prepared_data[name]
- return None
-
- def generate_returns(self, data_name, price_column=None):
- """Generate returns series from price data"""
- # First check if returns are already prepared
- prepared_returns = self.get_prepared_data(data_name, 'returns')
- if prepared_returns is not None:
- return prepared_returns
-
- # If not, calculate returns from the data
- data = self.get_data(data_name)
- if data is None:
- return None
-
- # If it's a backtest result, extract the equity curve
- if self.data_sources[data_name]['type'] == 'backtest':
- if 'equity' in data:
- equity = data['equity']
- returns = equity.pct_change().dropna()
- # Store the results for future use
- if data_name in self.prepared_data:
- self.prepared_data[data_name]['returns'] = returns
- return returns
-
- # Otherwise, treat as a DataFrame with a price column
- elif isinstance(data, pd.DataFrame):
- if price_column is None:
- if data.shape[1] == 1:
- price_column = data.columns[0]
- else:
- raise ValueError("DataFrame has multiple columns; specify price_column.")
-
- prices = data[price_column]
- returns = prices.pct_change().dropna()
- # Store the results for future use
- if data_name in self.prepared_data:
- self.prepared_data[data_name]['returns'] = returns
- return returns
-
- return None
-
-
-class EnhancedGraphModule(pg.GraphicsLayoutWidget):
- """A modular plot widget that can be customized and placed in the dashboard"""
-
- removed = pyqtSignal(object) # Signal emitted when plot is removed
-
- def __init__(self, parent=None, plot_id=None, plot_type=None, title="Plot", config=None):
- super().__init__(parent)
- self.plot_id = plot_id if plot_id else id(self) # Unique identifier
- self.plot_type = plot_type
- self.plot_title = title
- self.config = config or {}
-
- # Set the background and size
- self.setBackground('w')
- self.setMinimumSize(300, 200)
-
- # Create a plot area
- self.plot_item = self.addPlot(title=title)
-
- # Add controls as overlay
- self.controls = QWidget(self)
- self.controls_layout = QHBoxLayout(self.controls)
- self.controls_layout.setContentsMargins(5, 5, 5, 5)
- self.controls_layout.setSpacing(2)
-
- # Title label
- self.title_label = QLabel(title)
- self.title_label.setStyleSheet("background-color: rgba(255, 255, 255, 0.7); padding: 2px;")
- self.controls_layout.addWidget(self.title_label)
-
- # Spacer to push buttons to the right
- self.controls_layout.addStretch()
-
- # Settings button
- self.settings_btn = QToolButton()
- self.settings_btn.setText("⚙")
- self.settings_btn.setStyleSheet("background-color: rgba(255, 255, 255, 0.7);")
- self.settings_btn.clicked.connect(self.show_settings)
- self.controls_layout.addWidget(self.settings_btn)
-
- # Remove button with black x
- self.remove_btn = QToolButton()
- self.remove_btn.setText("✕")
- self.remove_btn.setStyleSheet("background-color: rgba(255, 255, 255, 0.7); color: black; font-weight: bold;")
- self.remove_btn.clicked.connect(self.remove_self)
- self.controls_layout.addWidget(self.remove_btn)
-
- # Position the controls at the top
- self.controls.setGeometry(0, 0, self.width(), 30)
-
- # Apply the configuration if available
- self.apply_config()
-
- def resizeEvent(self, event):
- """Handle resize event to reposition controls"""
- super().resizeEvent(event)
- # Make sure controls exist before setting geometry
- if hasattr(self, 'controls'):
- self.controls.setGeometry(0, 0, self.width(), 30)
-
- def apply_config(self):
- """Apply saved configuration to the plot"""
- if not self.config:
- return
-
- # Apply plot-specific settings
- if "title" in self.config:
- self.plot_title = self.config["title"]
- self.title_label.setText(self.plot_title)
- self.plot_item.setTitle(self.plot_title)
-
- if "grid" in self.config:
- self.plot_item.showGrid(x=self.config["grid"].get("x", True),
- y=self.config["grid"].get("y", True))
-
- def update_plot_data(self, data):
- """Update the plot with new data"""
- self.plot_item.clear()
-
- # Example: Simple line plot
- if isinstance(data, pd.Series):
- x = np.arange(len(data))
- y = data.values
- self.plot_item.plot(x, y, pen=pg.mkPen(color='b', width=2))
- elif isinstance(data, pd.DataFrame):
- for column in data.columns:
- y = data[column].values
- x = np.arange(len(y))
- self.plot_item.plot(x, y, pen=pg.mkPen(width=2), name=column)
-
- # Add legend if multiple series
- if isinstance(data, pd.DataFrame) and len(data.columns) > 1:
- self.plot_item.addLegend()
-
- def show_settings(self):
- """Open settings dialog for this plot"""
- settings_dialog = PlotSettingsDialog(self, self.config, self.plot_type)
- if settings_dialog.exec():
- # Update configuration based on dialog results
- self.config = settings_dialog.get_config()
- self.apply_config()
-
- def remove_self(self):
- """Remove this plot from the dashboard"""
- self.removed.emit(self)
- self.deleteLater()
-
- def get_config_dict(self):
- """Return a dictionary with configuration for saving"""
- return {
- "id": self.plot_id,
- "type": self.plot_type,
- "title": self.plot_title,
- "config": self.config
- }
-
-
-class PlotSettingsDialog(QDialog):
- """Dialog for editing plot settings"""
-
- def __init__(self, parent=None, config=None, plot_type=None):
- super().__init__(parent)
- self.config = config or {}
- self.plot_type = plot_type
-
- self.setWindowTitle("Plot Settings")
- self.setMinimumWidth(400)
-
- layout = QVBoxLayout(self)
-
- # Title settings
- title_group = QGroupBox("Title")
- title_layout = QHBoxLayout()
- title_group.setLayout(title_layout)
-
- self.title_edit = QLineEdit()
- if "title" in self.config:
- self.title_edit.setText(self.config["title"])
- else:
- self.title_edit.setText(f"{plot_type or 'Plot'}")
- title_layout.addWidget(self.title_edit)
-
- layout.addWidget(title_group)
-
- # Data source settings
- data_group = QGroupBox("Data Source")
- data_layout = QGridLayout()
- data_group.setLayout(data_layout)
-
- data_layout.addWidget(QLabel("Source:"), 0, 0)
- self.data_source = QComboBox()
- # These would be populated from the dashboard's data manager
- self.data_source.addItems(["Strategy 1", "Benchmark", "Custom"])
- data_layout.addWidget(self.data_source, 0, 1)
-
- data_layout.addWidget(QLabel("Column:"), 1, 0)
- self.data_column = QComboBox()
- # These would be populated based on the selected data source
- self.data_column.addItems(["Close", "Open", "High", "Low", "Volume"])
- data_layout.addWidget(self.data_column, 1, 1)
-
- layout.addWidget(data_group)
-
- # Visual settings
- visual_group = QGroupBox("Visual Settings")
- visual_layout = QGridLayout()
- visual_group.setLayout(visual_layout)
-
- # Line color
- visual_layout.addWidget(QLabel("Line Color:"), 0, 0)
- self.line_color_btn = QPushButton()
- self.line_color = self.config.get("line_color", "#0000FF")
- self.line_color_btn.setStyleSheet(f"background-color: {self.line_color}")
- self.line_color_btn.clicked.connect(self.choose_line_color)
- visual_layout.addWidget(self.line_color_btn, 0, 1)
-
- # Line width
- visual_layout.addWidget(QLabel("Line Width:"), 1, 0)
- self.line_width = QSpinBox()
- self.line_width.setRange(1, 10)
- self.line_width.setValue(self.config.get("line_width", 2))
- visual_layout.addWidget(self.line_width, 1, 1)
-
- # Grid options
- visual_layout.addWidget(QLabel("Show Grid:"), 2, 0)
- grid_layout = QHBoxLayout()
-
- self.grid_x = QCheckBox("X")
- self.grid_y = QCheckBox("Y")
-
- grid_config = self.config.get("grid", {"x": True, "y": True})
- self.grid_x.setChecked(grid_config.get("x", True))
- self.grid_y.setChecked(grid_config.get("y", True))
-
- grid_layout.addWidget(self.grid_x)
- grid_layout.addWidget(self.grid_y)
- visual_layout.addLayout(grid_layout, 2, 1)
-
- layout.addWidget(visual_group)
-
- # Plot-specific settings
- if self.plot_type:
- specific_group = QGroupBox(f"{self.plot_type} Settings")
- specific_layout = QGridLayout()
- specific_group.setLayout(specific_layout)
-
- # Add plot-specific settings based on plot type
- if self.plot_type == "Equity Curve":
- specific_layout.addWidget(QLabel("Show Benchmark:"), 0, 0)
- self.show_benchmark = QCheckBox()
- self.show_benchmark.setChecked(self.config.get("show_benchmark", False))
- specific_layout.addWidget(self.show_benchmark, 0, 1)
-
- specific_layout.addWidget(QLabel("Benchmark:"), 1, 0)
- self.benchmark_source = QComboBox()
- # Would be populated from dashboard's data manager
- self.benchmark_source.addItems(["S&P 500", "Nasdaq", "Custom"])
- specific_layout.addWidget(self.benchmark_source, 1, 1)
-
- elif self.plot_type == "Rolling Sharpe Ratio":
- specific_layout.addWidget(QLabel("Window (days):"), 0, 0)
- self.window_size = QSpinBox()
- self.window_size.setRange(5, 500)
- self.window_size.setValue(self.config.get("window_size", 252))
- specific_layout.addWidget(self.window_size, 0, 1)
-
- layout.addWidget(specific_group)
-
- # Buttons
- button_layout = QHBoxLayout()
- ok_button = QPushButton("OK")
- ok_button.clicked.connect(self.accept)
- cancel_button = QPushButton("Cancel")
- cancel_button.clicked.connect(self.reject)
-
- button_layout.addWidget(cancel_button)
- button_layout.addWidget(ok_button)
- layout.addLayout(button_layout)
-
- def choose_line_color(self):
- """Open color picker for line color"""
- color = QColorDialog.getColor()
- if color.isValid():
- self.line_color = color.name()
- self.line_color_btn.setStyleSheet(f"background-color: {self.line_color}")
-
- def get_config(self):
- """Return the updated configuration"""
- config = {
- "title": self.title_edit.text(),
- "line_color": self.line_color,
- "line_width": self.line_width.value(),
- "grid": {
- "x": self.grid_x.isChecked(),
- "y": self.grid_y.isChecked()
- },
- "data_source": self.data_source.currentText(),
- "data_column": self.data_column.currentText()
- }
-
- # Add plot-specific settings
- if self.plot_type == "Equity Curve":
- config["show_benchmark"] = self.show_benchmark.isChecked()
- config["benchmark_source"] = self.benchmark_source.currentText()
- elif self.plot_type == "Rolling Sharpe Ratio":
- config["window_size"] = self.window_size.value()
-
- return config
-
-
-class PlotPalette(QTreeWidget):
- """Widget displaying available plot types categorized by function"""
-
- def __init__(self, parent=None, plot_registry=None):
- super().__init__(parent)
- self.plot_registry = plot_registry or PlotRegistry()
-
- # Set up the tree widget
- self.setHeaderLabel("Available Plots")
- self.setDragEnabled(True)
-
- # Populate the tree with plot types
- self.populate()
-
- def populate(self):
- """Populate the tree with available plot types"""
- self.clear()
-
- # Create categories
- performance_category = QTreeWidgetItem(self, ["Performance"])
- risk_category = QTreeWidgetItem(self, ["Risk Analysis"])
- portfolio_category = QTreeWidgetItem(self, ["Portfolio Optimization"])
-
- # Categorize plot types
- plot_types = self.plot_registry.get_plot_types()
- for plot_type in plot_types:
- item = QTreeWidgetItem([plot_type])
-
- # Add to appropriate category
- if "Equity" in plot_type or "Drawdown" in plot_type or "Sharpe" in plot_type or "Monthly Returns" in plot_type:
- performance_category.addChild(item)
- elif "VaR" in plot_type or "Risk" in plot_type or "Return Distribution" in plot_type:
- risk_category.addChild(item)
- elif "Efficient" in plot_type or "Portfolio" in plot_type:
- portfolio_category.addChild(item)
- else:
- self.addTopLevelItem(item)
-
- # Expand all categories
- self.expandAll()
-
- def mousePressEvent(self, event):
- """Handle mouse press event for dragging"""
- super().mousePressEvent(event)
-
- if event.button() == Qt.MouseButton.LeftButton:
- # Get the item under the cursor
- item = self.itemAt(event.pos())
- if item and item.parent(): # Only allow dragging leaf nodes
- # Store the plot type
- self.drag_plot_type = item.text(0)
-
- # Start drag operation
- drag = QDrag(self)
- mime_data = QMimeData()
- mime_data.setText(self.drag_plot_type)
- drag.setMimeData(mime_data)
-
- # Create a pixmap for the drag icon
- pixmap = QPixmap(100, 30)
- pixmap.fill(Qt.GlobalColor.transparent)
- painter = QPainter(pixmap)
- painter.drawText(0, 20, self.drag_plot_type)
- painter.end()
-
- drag.setPixmap(pixmap)
- drag.exec(Qt.DropAction.CopyAction)
-
-
-class DashboardArea(QWidget):
- """Widget containing the dashboard grid where plots are arranged"""
-
- def __init__(self, parent=None, data_manager=None, plot_registry=None):
- super().__init__(parent)
- self.data_manager = data_manager or DataManager()
- self.plot_registry = plot_registry or PlotRegistry()
-
- # Set up layout
- self.layout = QGridLayout(self)
- self.layout.setSpacing(10)
-
- # Track plots
- self.plots = []
- self.grid_positions = {} # Map plot ID to grid position
- self.current_row = 0
- self.current_col = 0
- self.max_cols = 2
-
- # Currently active data source
- self.active_data_source = None
-
- # Accept drops
- self.setAcceptDrops(True)
-
- def dragEnterEvent(self, event):
- """Handle drag enter event"""
- if event.mimeData().hasText():
- event.accept()
- else:
- event.ignore()
-
- def dropEvent(self, event):
- """Handle drop event"""
- if event.mimeData().hasText():
- plot_type = event.mimeData().text()
-
- # Add the plot to the grid
- self.add_plot(plot_type)
-
- event.accept()
- else:
- event.ignore()
-
- def add_plot(self, plot_type, config=None):
- """Add a new plot to the dashboard"""
- # Create the plot
- plot = EnhancedGraphModule(plot_type=plot_type, title=plot_type, config=config)
- plot.removed.connect(self.remove_plot)
-
- # Add to grid layout
- grid_pos = (self.current_row, self.current_col)
- self.layout.addWidget(plot, *grid_pos)
- self.grid_positions[plot.plot_id] = grid_pos
-
- # Update grid position for next plot
- self.current_col += 1
- if self.current_col >= self.max_cols:
- self.current_col = 0
- self.current_row += 1
-
- self.plots.append(plot)
-
- # If there's active data, update the plot with it
- if self.active_data_source:
- self.update_plot_with_source(plot, self.active_data_source)
- else:
- # No data available, generate sample data
- self.update_plot_with_sample_data(plot)
-
- return plot
-
- def update_plot_with_source(self, plot, source_name):
- """Update a plot with data from a specific source"""
- # Get prepared data for this source
- prepared_data = self.data_manager.get_prepared_data(source_name)
- if not prepared_data:
- # If no prepared data, use sample data
- self.update_plot_with_sample_data(plot)
- return
-
- # Get plot info
- plot_info = self.plot_registry.get_plot_info(plot.plot_type)
- if not plot_info:
- return
-
- # Check if we have all required data
- required_data = plot_info['required_data']
- missing_data = [req for req in required_data if req not in prepared_data]
-
- if missing_data:
- # Try to generate missing data
- for req in missing_data:
- if req == 'returns' and 'equity' in prepared_data:
- # Generate returns from equity
- equity = prepared_data['equity']
- prepared_data['returns'] = equity.pct_change().dropna()
- elif req == 'returns_matrix' and 'equity' in prepared_data:
- # For single-asset data, create a dummy returns matrix with just this asset
- returns = prepared_data.get('returns')
- if returns is None:
- returns = prepared_data['equity'].pct_change().dropna()
- prepared_data['returns_matrix'] = pd.DataFrame(returns, columns=['Asset'])
- elif req == 'drawdown' and 'returns' in prepared_data:
- # Generate drawdown series from returns
- returns = prepared_data['returns']
- cumulative_returns = (1 + returns).cumprod()
- prepared_data['drawdown'] = (cumulative_returns / cumulative_returns.cummax()) - 1
-
- # If we still have missing data after trying to generate it, use sample data
- missing_data = [req for req in required_data if req not in prepared_data]
- if missing_data:
- self.update_plot_with_sample_data(plot)
- return
-
- # Extract required data for the plot
- plot_data = {req: prepared_data[req] for req in required_data}
-
- # Get default parameters
- parameters = plot_info['parameters']
- kwargs = {}
- for param_name, param_info in parameters.items():
- if 'default' in param_info:
- kwargs[param_name] = param_info['default']
-
- # Apply configuration parameters if available
- if plot.config and 'parameters' in plot.config:
- for param_name, value in plot.config['parameters'].items():
- kwargs[param_name] = value
-
- try:
- # Create the plot figure using the plot registry function
- figure = self.plot_registry.create_plot(plot.plot_type, plot_data, **kwargs)
-
- # Convert matplotlib figure to PyQtGraph plot data
- self._update_pyqtgraph_from_matplotlib(plot, figure)
- except Exception as e:
- print(f"Error updating plot {plot.plot_type}: {e}")
- self.update_plot_with_sample_data(plot)
-
- def _update_pyqtgraph_from_matplotlib(self, plot_widget, matplotlib_figure):
- """Convert matplotlib figure to data for PyQtGraph plot"""
- # This is a simplified conversion that extracts data from the first axes of the matplotlib figure
- # For a complete solution, you would need to handle multiple axes, different plot types, etc.
- try:
- # Extract data from the first axes
- axes = matplotlib_figure.axes[0]
-
- # Clear existing plot items
- plot_widget.plot_item.clear()
-
- # Get all line plots from the axes
- for line in axes.get_lines():
- x_data = line.get_xdata()
- y_data = line.get_ydata()
-
- # Convert data to numpy arrays if needed
- if not isinstance(x_data, np.ndarray):
- x_data = np.array(x_data)
- if not isinstance(y_data, np.ndarray):
- y_data = np.array(y_data)
-
- # Get color and create pen
- color = line.get_color()
- if isinstance(color, tuple) and len(color) == 3:
- color = tuple(int(c * 255) for c in color) + (255,) # RGBA
- elif isinstance(color, str):
- # Convert matplotlib color string to RGBA tuple
- from matplotlib.colors import to_rgba
- rgba = to_rgba(color)
- color = tuple(int(c * 255) for c in rgba)
-
- pen = pg.mkPen(color=color, width=line.get_linewidth())
-
- # Add to plot
- plot_widget.plot_item.plot(x_data, y_data, pen=pen, name=line.get_label())
-
- # Update plot title and labels
- plot_widget.plot_item.setTitle(axes.get_title())
- plot_widget.plot_item.setLabel('bottom', axes.get_xlabel())
- plot_widget.plot_item.setLabel('left', axes.get_ylabel())
-
- # Add legend if needed
- if axes.get_legend():
- plot_widget.plot_item.addLegend()
-
- # Close matplotlib figure to free resources
- plt.close(matplotlib_figure)
-
- except Exception as e:
- print(f"Error converting matplotlib figure to PyQtGraph: {e}")
- # Fall back to sample data
- self.update_plot_with_sample_data(plot_widget)
-
- def update_plot_with_sample_data(self, plot):
- """Update a plot with sample data if no real data is available"""
- # Generate sample data based on plot type
- plot.plot_item.clear()
-
- if plot.plot_type == "Equity Curve":
- # Sample equity curve
- x = np.arange(100)
- y = 100 * (1 + 0.001 * np.cumsum(np.random.normal(0.001, 0.01, 100)))
- plot.plot_item.plot(x, y, pen=pg.mkPen(color='b', width=2))
-
- elif plot.plot_type == "Drawdown Chart":
- # Sample drawdown chart
- x = np.arange(100)
- drawdown = -0.01 * np.abs(np.cumsum(np.random.normal(0, 1, 100)))
- drawdown = np.maximum(drawdown, -0.3) # Cap at -30%
- plot.plot_item.plot(x, drawdown, pen=pg.mkPen(color='r', width=2))
-
- elif plot.plot_type == "Monthly Returns Heatmap":
- # For heatmap, we need a different approach since PyQtGraph doesn't directly support heatmaps
- # Create a colorful grid as placeholder
- img = np.random.normal(0, 1, (12, 5)) # 12 months x 5 years
- colormap = pg.colormap.get('viridis')
- image_item = pg.ImageItem(img)
- image_item.setLookupTable(colormap.getLookupTable())
- plot.plot_item.addItem(image_item)
-
- elif plot.plot_type == "Rolling Sharpe Ratio":
- # Sample rolling sharpe ratio
- x = np.arange(100)
- y = np.cumsum(np.random.normal(0, 0.2, 100))
- y = y - np.min(y) # Make all positive
- y = y / np.max(y) * 3 # Scale to reasonable Sharpe values
- plot.plot_item.plot(x, y, pen=pg.mkPen(color='g', width=2))
-
- elif "VaR" in plot.plot_type:
- # Sample VaR distribution
- x = np.linspace(-0.05, 0.05, 100)
- y = np.exp(-(x-0.001)**2/(2*0.01**2)) / (0.01 * np.sqrt(2*np.pi))
- plot.plot_item.plot(x, y, pen=pg.mkPen(color='b', width=2))
-
- # Add VaR lines
- var_95 = -0.02
- plot.plot_item.addLine(x=var_95, pen=pg.mkPen(color='r', width=2, style=Qt.PenStyle.DashLine))
-
- elif "Efficient Frontier" in plot.plot_type:
- # Sample efficient frontier
- risk = np.linspace(0.05, 0.3, 100)
- return_values = 0.02 + 0.3 * risk + 0.05 * np.random.random(100)
- plot.plot_item.plot(risk, return_values, pen=pg.mkPen(color='b', width=2))
-
- # Add points
- scatter = pg.ScatterPlotItem(size=10, brush=pg.mkBrush(255, 0, 0, 255))
- scatter.addPoints([0.1, 0.2], [0.05, 0.12])
- plot.plot_item.addItem(scatter)
-
- else:
- # Generic line plot for other plot types
- x = np.arange(100)
- y = np.cumsum(np.random.normal(0, 1, 100))
- plot.plot_item.plot(x, y, pen=pg.mkPen(color='b', width=2))
-
- def set_active_data_source(self, source_name):
- """Set the active data source and update all plots"""
- self.active_data_source = source_name
-
- # Update all existing plots with the new data source
- for plot in self.plots:
- self.update_plot_with_source(plot, source_name)
-
- def remove_plot(self, plot):
- """Remove a plot from the dashboard"""
- if plot in self.plots:
- self.plots.remove(plot)
- self.layout.removeWidget(plot)
-
- # Delete from grid positions
- if plot.plot_id in self.grid_positions:
- del self.grid_positions[plot.plot_id]
-
- # Rearrange the remaining plots
- self.rearrange_plots()
-
- def rearrange_plots(self):
- """Rearrange all plots in the grid"""
- # Remove all plots from grid layout
- for plot in self.plots:
- self.layout.removeWidget(plot)
-
- # Reset grid positions
- self.grid_positions = {}
- self.current_row = 0
- self.current_col = 0
-
- # Re-add plots to layout
- for plot in self.plots:
- grid_pos = (self.current_row, self.current_col)
- self.layout.addWidget(plot, *grid_pos)
- self.grid_positions[plot.plot_id] = grid_pos
-
- # Update grid position for next plot
- self.current_col += 1
- if self.current_col >= self.max_cols:
- self.current_col = 0
- self.current_row += 1
-
- def get_dashboard_config(self):
- """Get the dashboard configuration for saving"""
- plot_configs = []
- for plot in self.plots:
- config = plot.get_config_dict()
- # Add grid position
- if plot.plot_id in self.grid_positions:
- row, col = self.grid_positions[plot.plot_id]
- config['position'] = {'row': row, 'col': col}
- plot_configs.append(config)
-
- return {
- 'plots': plot_configs,
- 'max_cols': self.max_cols,
- 'active_data_source': self.active_data_source
- }
-
- def load_dashboard_config(self, config):
- """Load dashboard from configuration"""
- if not config or 'plots' not in config:
- return
-
- # Clear existing plots
- for plot in self.plots[:]:
- self.remove_plot(plot)
-
- # Set max columns
- self.max_cols = config.get('max_cols', 2)
-
- # Set active data source
- if 'active_data_source' in config:
- self.active_data_source = config['active_data_source']
-
- # Add plots from config
- for plot_config in config['plots']:
- plot_type = plot_config.get('type')
- if not plot_type:
- continue
-
- # Create the plot
- plot = self.add_plot(plot_type, plot_config.get('config'))
-
- # Set position if specified
- if 'position' in plot_config:
- pos = plot_config['position']
- if plot.plot_id in self.grid_positions:
- del self.grid_positions[plot.plot_id]
- self.layout.removeWidget(plot)
-
- row, col = pos.get('row', 0), pos.get('col', 0)
- self.layout.addWidget(plot, row, col)
- self.grid_positions[plot.plot_id] = (row, col)
-
- def load_data(self):
- """Load data from a file and add it to the data manager."""
- # Open file dialog to select data file
- file_path, _ = QFileDialog.getOpenFileName(
- self,
- "Load Data File",
- "",
- "CSV Files (*.csv);;All Files (*)"
- )
-
- if file_path:
- try:
- # Load the data into the data manager
- source_name = self.data_manager.load_csv(file_path)
-
- if source_name:
- # Update data source selector
- self.update_data_sources()
-
- # Select the newly loaded data source
- index = self.data_source_selector.findText(source_name)
- if index >= 0:
- self.data_source_selector.setCurrentIndex(index)
-
- QMessageBox.information(
- self,
- "Data Loaded",
- f"Successfully loaded data from {os.path.basename(file_path)}"
- )
- else:
- QMessageBox.warning(
- self,
- "Load Error",
- "Failed to load data from the selected file."
- )
- except Exception as e:
- QMessageBox.critical(
- self,
- "Error",
- f"An error occurred while loading the data: {str(e)}"
- )
-
- def update_data_sources(self):
- """Update the data source selector with available data sources."""
- # Get list of data sources
- sources = self.data_manager.get_data_source_names()
-
- # Save current selection
- current_text = self.data_source_selector.currentText()
-
- # Clear and repopulate
- self.data_source_selector.clear()
- self.data_source_selector.addItems(sources)
-
- # Restore selection if possible
- if current_text:
- index = self.data_source_selector.findText(current_text)
- if index >= 0:
- self.data_source_selector.setCurrentIndex(index)
- elif self.data_source_selector.count() > 0:
- # Otherwise select the first item
- self.data_source_selector.setCurrentIndex(0)
-
- def on_data_source_changed(self, source_name):
- """Handle changes to the selected data source."""
- if source_name:
- # Set the active data source in the dashboard area
- self.dashboard_area.set_active_data_source(source_name)
-
- def refresh_all_charts(self):
- """Refresh all charts with current data."""
- current_source = self.data_source_selector.currentText()
- if current_source:
- self.dashboard_area.set_active_data_source(current_source)
- QMessageBox.information(
- self,
- "Refresh Complete",
- "All charts have been refreshed with the current data."
- )
- else:
- QMessageBox.warning(
- self,
- "No Data Selected",
- "Please select a data source to refresh charts."
- )
-
- def save_configuration(self):
- """Save the current dashboard configuration."""
- file_path, _ = QFileDialog.getSaveFileName(
- self,
- "Save Dashboard Configuration",
- "",
- "JSON Files (*.json);;All Files (*)"
- )
-
- if file_path:
- try:
- # Get configuration from dashboard area
- dashboard_config = self.dashboard_area.get_dashboard_config()
-
- # Save configuration to file
- with open(file_path, 'w') as f:
- import json
- json.dump(dashboard_config, f, indent=4)
-
- QMessageBox.information(
- self,
- "Save Complete",
- f"Dashboard configuration saved to {os.path.basename(file_path)}"
- )
- except Exception as e:
- QMessageBox.critical(
- self,
- "Error",
- f"An error occurred while saving the configuration: {str(e)}"
- )
-
- def load_configuration(self):
- """Load a dashboard configuration from a file."""
- file_path, _ = QFileDialog.getOpenFileName(
- self,
- "Load Dashboard Configuration",
- "",
- "JSON Files (*.json);;All Files (*)"
- )
-
- if file_path:
- try:
- # Load configuration from file
- with open(file_path, 'r') as f:
- import json
- dashboard_config = json.load(f)
-
- # Apply configuration to dashboard area
- self.dashboard_area.load_dashboard_config(dashboard_config)
-
- # Update active data source if specified
- if 'active_data_source' in dashboard_config and dashboard_config['active_data_source']:
- source_name = dashboard_config['active_data_source']
- index = self.data_source_selector.findText(source_name)
- if index >= 0:
- self.data_source_selector.setCurrentIndex(index)
-
- QMessageBox.information(
- self,
- "Load Complete",
- f"Dashboard configuration loaded from {os.path.basename(file_path)}"
- )
- except Exception as e:
- QMessageBox.critical(
- self,
- "Error",
- f"An error occurred while loading the configuration: {str(e)}"
- )
-
- def load_config_from_env(self):
- """Load configuration from environment variable."""
- config_path = os.environ.get('ALGO_DASHBOARD_CONFIG')
- if config_path and os.path.exists(config_path):
- try:
- # Load configuration from file
- with open(config_path, 'r') as f:
- import json
- dashboard_config = json.load(f)
-
- # Apply configuration to dashboard area
- self.dashboard_area.load_dashboard_config(dashboard_config)
-
- print(f"Loaded configuration from environment variable: {config_path}")
- except Exception as e:
- print(f"Error loading configuration from environment: {e}")
-
- def load_data_from_env(self):
- """Load data from directory specified in environment variable."""
- data_dir = os.environ.get('ALGO_DASHBOARD_DATA_DIR')
- if data_dir and os.path.exists(data_dir):
- try:
- # Look for CSV files in the directory
- import glob
- csv_files = glob.glob(os.path.join(data_dir, "*.csv"))
-
- for csv_file in csv_files:
- source_name = self.data_manager.load_csv(csv_file)
- if source_name:
- print(f"Loaded data from: {csv_file}")
-
- # Update data source selector
- self.update_data_sources()
-
- # Select the first data source if available
- if self.data_source_selector.count() > 0:
- self.data_source_selector.setCurrentIndex(0)
-
- print(f"Loaded data from environment variable directory: {data_dir}")
- except Exception as e:
- print(f"Error loading data from environment: {e}")
-
-def launch_dashboard():
- """Launch the AlgoSystem Dashboard application."""
- import sys
-
- class DashboardApp(QMainWindow):
- def __init__(self):
- super().__init__()
- # Set window properties
- self.setWindowTitle("AlgoSystem Dashboard")
- self.resize(1200, 800)
-
- # Initialize core components
- self.plot_registry = PlotRegistry() # Registry of available chart types
- self.data_manager = DataManager() # Handles loading and preprocessing data
-
- # Set up the main layout
- self.central_widget = QWidget()
- self.setCentralWidget(self.central_widget)
- self.main_layout = QVBoxLayout(self.central_widget)
-
- # Create toolbar with buttons and data source selector
- toolbar_layout = QHBoxLayout()
-
- # Add Load Data button
- self.load_data_btn = QPushButton("Load Data")
- self.load_data_btn.clicked.connect(self.load_data)
- toolbar_layout.addWidget(self.load_data_btn)
-
- # Add data source selector dropdown
- toolbar_layout.addWidget(QLabel("Data Source:"))
- self.data_source_selector = QComboBox()
- self.data_source_selector.currentTextChanged.connect(self.on_data_source_changed)
- toolbar_layout.addWidget(self.data_source_selector)
-
- # Add Refresh Charts button
- self.refresh_btn = QPushButton("Refresh Charts")
- self.refresh_btn.clicked.connect(self.refresh_all_charts)
- toolbar_layout.addWidget(self.refresh_btn)
-
- toolbar_layout.addStretch() # Push remaining buttons to the right
-
- # Add Save/Load Configuration buttons
- self.save_config_btn = QPushButton("Save Configuration")
- self.save_config_btn.clicked.connect(self.save_configuration)
- toolbar_layout.addWidget(self.save_config_btn)
-
- self.load_config_btn = QPushButton("Load Configuration")
- self.load_config_btn.clicked.connect(self.load_configuration)
- toolbar_layout.addWidget(self.load_config_btn)
-
- self.main_layout.addLayout(toolbar_layout)
-
- # Create split view with plot palette on left and dashboard area on right
- self.splitter = QSplitter(Qt.Orientation.Horizontal)
-
- # Add plot palette (left side)
- self.plot_palette = PlotPalette(plot_registry=self.plot_registry)
- self.splitter.addWidget(self.plot_palette)
-
- # Add dashboard area (right side)
- self.dashboard_area = DashboardArea(
- data_manager=self.data_manager,
- plot_registry=self.plot_registry
- )
- self.splitter.addWidget(self.dashboard_area)
-
- # Set initial sizes for the splitter (palette vs. dashboard)
- self.splitter.setSizes([300, 900])
-
- self.main_layout.addWidget(self.splitter)
-
- # Load configuration from environment variable if available
- self.load_config_from_env()
-
- # Load data from directory if available
- self.load_data_from_env()
-
- # ADDING MISSING METHODS
- def load_data(self):
- """Load data from a file and add it to the data manager."""
- # Open file dialog to select data file
- file_path, _ = QFileDialog.getOpenFileName(
- self,
- "Load Data File",
- "",
- "CSV Files (*.csv);;All Files (*)"
- )
-
- if file_path:
- try:
- # Load the data into the data manager
- source_name = self.data_manager.load_csv(file_path)
-
- if source_name:
- # Update data source selector
- self.update_data_sources()
-
- # Select the newly loaded data source
- index = self.data_source_selector.findText(source_name)
- if index >= 0:
- self.data_source_selector.setCurrentIndex(index)
-
- QMessageBox.information(
- self,
- "Data Loaded",
- f"Successfully loaded data from {os.path.basename(file_path)}"
- )
- else:
- QMessageBox.warning(
- self,
- "Load Error",
- "Failed to load data from the selected file."
- )
- except Exception as e:
- QMessageBox.critical(
- self,
- "Error",
- f"An error occurred while loading the data: {str(e)}"
- )
-
- def update_data_sources(self):
- """Update the data source selector with available data sources."""
- # Get list of data sources
- sources = self.data_manager.get_data_source_names()
-
- # Save current selection
- current_text = self.data_source_selector.currentText()
-
- # Clear and repopulate
- self.data_source_selector.clear()
- self.data_source_selector.addItems(sources)
-
- # Restore selection if possible
- if current_text:
- index = self.data_source_selector.findText(current_text)
- if index >= 0:
- self.data_source_selector.setCurrentIndex(index)
- elif self.data_source_selector.count() > 0:
- # Otherwise select the first item
- self.data_source_selector.setCurrentIndex(0)
-
- def on_data_source_changed(self, source_name):
- """Handle changes to the selected data source."""
- if source_name:
- # Set the active data source in the dashboard area
- self.dashboard_area.set_active_data_source(source_name)
-
- def refresh_all_charts(self):
- """Refresh all charts with current data."""
- current_source = self.data_source_selector.currentText()
- if current_source:
- self.dashboard_area.set_active_data_source(current_source)
- QMessageBox.information(
- self,
- "Refresh Complete",
- "All charts have been refreshed with the current data."
- )
- else:
- QMessageBox.warning(
- self,
- "No Data Selected",
- "Please select a data source to refresh charts."
- )
-
- def save_configuration(self):
- """Save the current dashboard configuration."""
- file_path, _ = QFileDialog.getSaveFileName(
- self,
- "Save Dashboard Configuration",
- "",
- "JSON Files (*.json);;All Files (*)"
- )
-
- if file_path:
- try:
- # Get configuration from dashboard area
- dashboard_config = self.dashboard_area.get_dashboard_config()
-
- # Save configuration to file
- with open(file_path, 'w') as f:
- import json
- json.dump(dashboard_config, f, indent=4)
-
- QMessageBox.information(
- self,
- "Save Complete",
- f"Dashboard configuration saved to {os.path.basename(file_path)}"
- )
- except Exception as e:
- QMessageBox.critical(
- self,
- "Error",
- f"An error occurred while saving the configuration: {str(e)}"
- )
-
- def load_configuration(self):
- """Load a dashboard configuration from a file."""
- file_path, _ = QFileDialog.getOpenFileName(
- self,
- "Load Dashboard Configuration",
- "",
- "JSON Files (*.json);;All Files (*)"
- )
-
- if file_path:
- try:
- # Load configuration from file
- with open(file_path, 'r') as f:
- import json
- dashboard_config = json.load(f)
-
- # Apply configuration to dashboard area
- self.dashboard_area.load_dashboard_config(dashboard_config)
-
- # Update active data source if specified
- if 'active_data_source' in dashboard_config and dashboard_config['active_data_source']:
- source_name = dashboard_config['active_data_source']
- index = self.data_source_selector.findText(source_name)
- if index >= 0:
- self.data_source_selector.setCurrentIndex(index)
-
- QMessageBox.information(
- self,
- "Load Complete",
- f"Dashboard configuration loaded from {os.path.basename(file_path)}"
- )
- except Exception as e:
- QMessageBox.critical(
- self,
- "Error",
- f"An error occurred while loading the configuration: {str(e)}"
- )
-
- def load_config_from_env(self):
- """Load configuration from environment variable."""
- config_path = os.environ.get('ALGO_DASHBOARD_CONFIG')
- if config_path and os.path.exists(config_path):
- try:
- # Load configuration from file
- with open(config_path, 'r') as f:
- import json
- dashboard_config = json.load(f)
-
- # Apply configuration to dashboard area
- self.dashboard_area.load_dashboard_config(dashboard_config)
-
- print(f"Loaded configuration from environment variable: {config_path}")
- except Exception as e:
- print(f"Error loading configuration from environment: {e}")
-
- def load_data_from_env(self):
- """Load data from directory specified in environment variable."""
- data_dir = os.environ.get('ALGO_DASHBOARD_DATA_DIR')
- if data_dir and os.path.exists(data_dir):
- try:
- # Look for CSV files in the directory
- import glob
- csv_files = glob.glob(os.path.join(data_dir, "*.csv"))
-
- for csv_file in csv_files:
- source_name = self.data_manager.load_csv(csv_file)
- if source_name:
- print(f"Loaded data from: {csv_file}")
-
- # Update data source selector
- self.update_data_sources()
-
- # Select the first data source if available
- if self.data_source_selector.count() > 0:
- self.data_source_selector.setCurrentIndex(0)
-
- print(f"Loaded data from environment variable directory: {data_dir}")
- except Exception as e:
- print(f"Error loading data from environment: {e}")
-
- # Create and run the application
- app = QApplication(sys.argv)
- dashboard = DashboardApp()
- dashboard.show()
- sys.exit(app.exec())
-
-
diff --git a/algosystem/dashboard/plot_registery.py b/algosystem/dashboard/plot_registery.py
deleted file mode 100644
index 4d08cfb..0000000
--- a/algosystem/dashboard/plot_registery.py
+++ /dev/null
@@ -1,422 +0,0 @@
-import pandas as pd
-import numpy as np
-import matplotlib.pyplot as plt
-from matplotlib.figure import Figure
-
-# Import visualization functions
-from algosystem.backtesting.visualization import (
- create_equity_chart,
- create_drawdown_chart,
- create_monthly_returns_heatmap,
- create_rolling_sharpe_chart
-)
-
-# Import performance functions
-from algosystem.analysis.performance import (
- calculate_returns_stats,
- calculate_rolling_stats,
- compare_strategies,
- analyze_returns_by_period
-)
-
-# Import portfolio functions
-from algosystem.analysis.portfolio import (
- calculate_portfolio_return,
- calculate_portfolio_variance,
- calculate_portfolio_std,
- calculate_sharpe_ratio,
- optimize_portfolio,
- calculate_efficient_frontier
-)
-
-# Import risk functions
-from algosystem.analysis.risk import (
- calculate_var,
- calculate_cvar,
- calculate_risk_metrics,
- stress_test
-)
-
-class PlotRegistry:
- """Registry of available plot types and their associated functions"""
-
- def __init__(self):
- self.plot_types = {}
- self.register_default_plots()
-
- def register_plot(self, name, function, description, required_data, parameters=None):
- """Register a new plot type"""
- self.plot_types[name] = {
- 'function': function,
- 'description': description,
- 'required_data': required_data,
- 'parameters': parameters or {}
- }
-
- def register_default_plots(self):
- """Register the default plot types that come with AlgoSystem"""
-
- # Performance plots
- self.register_plot(
- name="Equity Curve",
- function=create_equity_chart,
- description="Shows the growth of portfolio value over time",
- required_data=["equity"],
- parameters={
- 'benchmark': {'type': 'data', 'required': False, 'default': None},
- 'figsize': {'type': 'tuple', 'required': False, 'default': (10, 6)}
- }
- )
-
- self.register_plot(
- name="Drawdown Chart",
- function=create_drawdown_chart,
- description="Shows the drawdown periods for the strategy",
- required_data=["equity"],
- parameters={
- 'figsize': {'type': 'tuple', 'required': False, 'default': (10, 6)}
- }
- )
-
- self.register_plot(
- name="Monthly Returns Heatmap",
- function=create_monthly_returns_heatmap,
- description="Displays monthly returns as a heatmap",
- required_data=["equity"],
- parameters={
- 'figsize': {'type': 'tuple', 'required': False, 'default': (10, 6)}
- }
- )
-
- self.register_plot(
- name="Rolling Sharpe Ratio",
- function=create_rolling_sharpe_chart,
- description="Shows the rolling Sharpe ratio over time",
- required_data=["equity"],
- parameters={
- 'window': {'type': 'int', 'required': False, 'default': 252},
- 'figsize': {'type': 'tuple', 'required': False, 'default': (10, 6)}
- }
- )
-
- # Risk analysis plots - using functions from risk.py
- self.register_plot(
- name="Value at Risk (VaR)",
- function=self._create_var_plot,
- description="Shows the Value at Risk at different confidence levels",
- required_data=["returns"],
- parameters={
- 'confidence_levels': {'type': 'list', 'required': False, 'default': [0.9, 0.95, 0.99]},
- 'method': {'type': 'choice', 'required': False, 'default': 'historical',
- 'choices': ['historical', 'parametric', 'monte_carlo']}
- }
- )
-
- # Portfolio optimization plots - using functions from portfolio.py
- self.register_plot(
- name="Efficient Frontier",
- function=self._create_efficient_frontier_plot,
- description="Shows the efficient frontier for a portfolio of assets",
- required_data=["returns_matrix"],
- parameters={
- 'num_points': {'type': 'int', 'required': False, 'default': 50},
- 'risk_free_rate': {'type': 'float', 'required': False, 'default': 0.0}
- }
- )
-
- # Add more plot types from performance.py
- self.register_plot(
- name="Returns by Period",
- function=self._create_returns_by_period_plot,
- description="Shows returns broken down by different time periods",
- required_data=["returns"],
- parameters={}
- )
-
- self.register_plot(
- name="Rolling Performance",
- function=self._create_rolling_performance_plot,
- description="Shows rolling performance metrics over time",
- required_data=["returns"],
- parameters={
- 'window': {'type': 'int', 'required': False, 'default': 252}
- }
- )
-
- # Add more plot types from risk.py
- self.register_plot(
- name="Return Distribution",
- function=self._create_return_distribution_plot,
- description="Histogram of returns with normal distribution overlay",
- required_data=["returns"],
- parameters={
- 'bins': {'type': 'int', 'required': False, 'default': 50}
- }
- )
-
- self.register_plot(
- name="Risk Metrics",
- function=self._create_risk_metrics_plot,
- description="Visual summary of key risk metrics",
- required_data=["returns"],
- parameters={
- 'risk_free_rate': {'type': 'float', 'required': False, 'default': 0.0}
- }
- )
-
- def _create_var_plot(self, returns, confidence_levels=[0.9, 0.95, 0.99], method='historical'):
- """Create VaR plot using calculate_var from risk.py"""
- fig = plt.figure(figsize=(10, 6))
- ax = fig.add_subplot(111)
-
- # Calculate VaR at different confidence levels using risk.py function
- var_values = [calculate_var(returns, cl, method) for cl in confidence_levels]
-
- # Plot returns histogram
- returns.hist(bins=50, ax=ax, alpha=0.5)
-
- # Add VaR lines
- colors = ['green', 'orange', 'red']
- for i, (cl, var) in enumerate(zip(confidence_levels, var_values)):
- ax.axvline(-var, color=colors[i], linestyle='--',
- label=f'VaR {cl*100:.0f}%: {var:.2%}')
-
- ax.set_title(f'Value at Risk ({method.capitalize()})')
- ax.set_xlabel('Returns')
- ax.set_ylabel('Frequency')
- ax.legend()
-
- return fig
-
- def _create_efficient_frontier_plot(self, returns_matrix, num_points=50, risk_free_rate=0.0):
- """Create efficient frontier plot using functions from portfolio.py"""
- fig = plt.figure(figsize=(10, 6))
- ax = fig.add_subplot(111)
-
- # Calculate the efficient frontier using portfolio.py function
- frontier_returns, frontier_volatilities, frontier_weights = calculate_efficient_frontier(
- returns_matrix, num_points, risk_free_rate
- )
-
- # Plot the efficient frontier
- ax.plot(frontier_volatilities, frontier_returns, 'b-', linewidth=3, label='Efficient Frontier')
-
- # Calculate and plot the optimal portfolio (maximum Sharpe ratio)
- optimal_weights, performance = optimize_portfolio(returns_matrix, risk_free_rate)
- optimal_return = performance['expected_return']
- optimal_volatility = performance['volatility']
-
- ax.scatter(optimal_volatility, optimal_return, marker='*', s=200, color='red',
- label=f'Optimal Portfolio (Sharpe: {performance["sharpe_ratio"]:.2f})')
-
- # Add capital market line if risk-free rate is provided
- if risk_free_rate > 0:
- max_vol = frontier_volatilities[-1] * 1.2
- x_values = np.linspace(0, max_vol, 100)
- slope = (optimal_return - risk_free_rate) / optimal_volatility
- y_values = risk_free_rate + slope * x_values
- ax.plot(x_values, y_values, 'g--', label='Capital Market Line')
- ax.scatter(0, risk_free_rate, marker='o', color='green', label='Risk-Free Asset')
-
- ax.set_title('Efficient Frontier')
- ax.set_xlabel('Volatility (Standard Deviation)')
- ax.set_ylabel('Expected Return')
- ax.legend()
- ax.grid(True)
-
- return fig
-
- def _create_return_distribution_plot(self, returns, bins=50):
- """Create histogram of returns with normal distribution overlay"""
- fig = plt.figure(figsize=(10, 6))
- ax = fig.add_subplot(111)
-
- # Plot histogram
- n, bins, patches = ax.hist(returns, bins=bins, density=True, alpha=0.6, color='blue')
-
- # Fit normal distribution
- mu = returns.mean()
- sigma = returns.std()
- x = np.linspace(mu - 4*sigma, mu + 4*sigma, 100)
- y = (1 / (sigma * np.sqrt(2 * np.pi))) * np.exp(- (x - mu)**2 / (2 * sigma**2))
-
- # Plot normal distribution
- ax.plot(x, y, 'r--', linewidth=2, label='Normal Distribution')
-
- # Add mean line
- ax.axvline(mu, color='green', linestyle='-', linewidth=2,
- label=f'Mean: {mu:.2%}')
-
- # Calculate and display skewness and kurtosis
- skew = returns.skew()
- kurt = returns.kurtosis()
- stats_text = f'Skewness: {skew:.2f}\nKurtosis: {kurt:.2f}'
- ax.text(0.95, 0.95, stats_text, transform=ax.transAxes, verticalalignment='top',
- horizontalalignment='right', bbox={'facecolor': 'white', 'alpha': 0.8})
-
- ax.set_title('Return Distribution')
- ax.set_xlabel('Returns')
- ax.set_ylabel('Density')
- ax.legend()
- ax.grid(True, alpha=0.3)
-
- return fig
-
- def _create_risk_metrics_plot(self, returns, risk_free_rate=0.0):
- """Create visual summary of risk metrics using calculate_risk_metrics from risk.py"""
- # Calculate risk metrics
- metrics = calculate_risk_metrics(returns, risk_free_rate)
-
- fig = plt.figure(figsize=(10, 6))
- ax = fig.add_subplot(111)
-
- # Create bar chart of key metrics
- metric_names = ['annual_return', 'volatility', 'sharpe_ratio', 'sortino_ratio', 'max_drawdown']
- metric_labels = ['Annual Return', 'Volatility', 'Sharpe Ratio', 'Sortino Ratio', 'Max Drawdown']
- metric_values = [metrics[name] for name in metric_names]
-
- # Adjust max_drawdown to positive for visualization
- metric_values[4] = abs(metric_values[4])
-
- x = np.arange(len(metric_names))
- bars = ax.bar(x, metric_values, width=0.6, alpha=0.7)
-
- # Add value labels on top of bars
- for bar in bars:
- height = bar.get_height()
- ax.annotate(f'{height:.2f}',
- xy=(bar.get_x() + bar.get_width() / 2, height),
- xytext=(0, 3), # 3 points vertical offset
- textcoords="offset points",
- ha='center', va='bottom')
-
- ax.set_title('Risk Metrics Summary')
- ax.set_xticks(x)
- ax.set_xticklabels(metric_labels, rotation=45)
- ax.grid(True, alpha=0.3, axis='y')
-
- return fig
-
- def _create_returns_by_period_plot(self, returns):
- """Create returns by period plot using analyze_returns_by_period from performance.py"""
- # Get period analysis
- period_analysis = analyze_returns_by_period(returns)
-
- fig = plt.figure(figsize=(12, 10))
-
- # Create subplot for monthly returns
- ax1 = fig.add_subplot(2, 2, 1)
- monthly_returns = period_analysis['monthly']['returns']
- monthly_returns.plot(kind='bar', ax=ax1)
- ax1.set_title('Monthly Returns')
- ax1.set_ylabel('Return')
- ax1.grid(True, alpha=0.3)
-
- # Create subplot for day of week analysis
- ax2 = fig.add_subplot(2, 2, 2)
- dow_analysis = period_analysis['day_of_week']
- dow_analysis['mean'].plot(kind='bar', ax=ax2)
- ax2.set_title('Average Return by Day of Week')
- ax2.set_ylabel('Return')
- ax2.grid(True, alpha=0.3)
-
- # Create subplot for month of year analysis
- ax3 = fig.add_subplot(2, 2, 3)
- moy_analysis = period_analysis['month_of_year']
- moy_analysis['mean'].plot(kind='bar', ax=ax3)
- ax3.set_title('Average Return by Month')
- ax3.set_ylabel('Return')
- ax3.grid(True, alpha=0.3)
-
- # Create subplot for positive percentage by period
- ax4 = fig.add_subplot(2, 2, 4)
- periods = ['daily', 'monthly', 'quarterly', 'annual']
- period_labels = ['Daily', 'Monthly', 'Quarterly', 'Annual']
- positive_pcts = [period_analysis[p]['positive_pct'] for p in periods]
-
- ax4.bar(period_labels, positive_pcts)
- ax4.set_title('Percentage of Positive Returns by Period')
- ax4.set_ylabel('Percentage')
- ax4.set_ylim([0, 1])
- ax4.grid(True, alpha=0.3)
-
- plt.tight_layout()
- return fig
-
- def _create_rolling_performance_plot(self, returns, window=252):
- """Create rolling performance plot using calculate_rolling_stats from performance.py"""
- # Calculate rolling statistics
- rolling_stats = calculate_rolling_stats(returns, window)
-
- fig = plt.figure(figsize=(12, 10))
-
- # Create subplot for rolling return
- ax1 = fig.add_subplot(2, 2, 1)
- rolling_stats['rolling_return'].plot(ax=ax1)
- ax1.set_title(f'Rolling {window}-Day Return (Annualized)')
- ax1.set_ylabel('Return')
- ax1.grid(True, alpha=0.3)
-
- # Create subplot for rolling volatility
- ax2 = fig.add_subplot(2, 2, 2)
- rolling_stats['rolling_volatility'].plot(ax=ax2)
- ax2.set_title(f'Rolling {window}-Day Volatility (Annualized)')
- ax2.set_ylabel('Volatility')
- ax2.grid(True, alpha=0.3)
-
- # Create subplot for rolling Sharpe ratio
- ax3 = fig.add_subplot(2, 2, 3)
- rolling_stats['rolling_sharpe'].plot(ax=ax3)
- ax3.set_title(f'Rolling {window}-Day Sharpe Ratio')
- ax3.set_ylabel('Sharpe Ratio')
- ax3.grid(True, alpha=0.3)
-
- # Create subplot for rolling max drawdown
- ax4 = fig.add_subplot(2, 2, 4)
- rolling_stats['rolling_max_drawdown'].plot(ax=ax4)
- ax4.set_title(f'Rolling {window}-Day Max Drawdown')
- ax4.set_ylabel('Drawdown')
- ax4.grid(True, alpha=0.3)
-
- plt.tight_layout()
- return fig
-
- def get_plot_types(self):
- """Get list of available plot types"""
- return list(self.plot_types.keys())
-
- def get_plot_info(self, name):
- """Get information about a specific plot type"""
- return self.plot_types.get(name)
-
- def create_plot(self, plot_type, data, **kwargs):
- """Create a plot of the specified type using the provided data"""
- if plot_type not in self.plot_types:
- raise ValueError(f"Unknown plot type: {plot_type}")
-
- plot_info = self.plot_types[plot_type]
- plot_func = plot_info['function']
-
- # Check if we have the required data
- required_data = plot_info['required_data']
- for req in required_data:
- if req not in data:
- raise ValueError(f"Missing required data for {plot_type}: {req}")
-
- # Extract required data from data dictionary
- plot_data = {req: data[req] for req in required_data if req in data}
-
- # Merge kwargs with default parameters
- parameters = plot_info['parameters']
- for param_name, param_info in parameters.items():
- if param_name not in kwargs and 'default' in param_info:
- kwargs[param_name] = param_info['default']
-
- # Create the plot
- return plot_func(**plot_data, **kwargs)
-
-
-# Utility function to create a plot registry with default plots
-def create_plot_registry():
- """Create and return a plot registry with default plots"""
- return PlotRegistry()
\ No newline at end of file
diff --git a/algosystem/utils/graph_config.json b/algosystem/utils/graph_config.json
index 2f49794..6ad5b4f 100644
--- a/algosystem/utils/graph_config.json
+++ b/algosystem/utils/graph_config.json
@@ -1,102 +1,3 @@
{
- "metrics": [
- {
- "id": "annual_return",
- "type": "Percentage",
- "title": "Annualized Return",
- "value_key": "annual_return",
- "position": {
- "row": 0,
- "col": 0
- }
- },
- {
- "id": "volatility",
- "type": "Percentage",
- "title": "Volatility",
- "value_key": "volatility",
- "position": {
- "row": 0,
- "col": 1
- }
- },
- {
- "id": "sharpe_ratio",
- "type": "Value",
- "title": "Sharpe Ratio",
- "value_key": "sharpe_ratio",
- "position": {
- "row": 0,
- "col": 2
- }
- },
- {
- "id": "max_drawdown",
- "type": "Percentage",
- "title": "Max Drawdown",
- "value_key": "max_drawdown",
- "position": {
- "row": 0,
- "col": 3
- }
- }
- ],
- "charts": [
- {
- "id": "equity_curve",
- "type": "LineChart",
- "title": "Equity Curve",
- "data_key": "equity",
- "position": {
- "row": 1,
- "col": 0
- },
- "config": {
- "y_axis_label": "Value ($)"
- }
- },
- {
- "id": "drawdown",
- "type": "LineChart",
- "title": "Drawdown Chart",
- "data_key": "drawdown",
- "position": {
- "row": 1,
- "col": 1
- },
- "config": {
- "y_axis_label": "Drawdown (%)",
- "percentage_format": true
- }
- },
- {
- "id": "monthly_returns",
- "type": "HeatmapTable",
- "title": "Monthly Returns Heatmap",
- "data_key": "monthly_returns",
- "position": {
- "row": 2,
- "col": 0
- },
- "config": {}
- },
- {
- "id": "rolling_sharpe",
- "type": "LineChart",
- "title": "Rolling Sharpe Ratio",
- "data_key": "rolling_sharpe",
- "position": {
- "row": 2,
- "col": 1
- },
- "config": {
- "y_axis_label": "Sharpe Ratio",
- "window_size": 252
- }
- }
- ],
- "layout": {
- "max_cols": 2,
- "title": "AlgoSystem Trading Dashboard"
- }
- }
\ No newline at end of file
+ "graphs": []
+}
\ No newline at end of file
diff --git a/dashboard/dashboard.css b/dashboard/dashboard.css
deleted file mode 100644
index c6ef620..0000000
--- a/dashboard/dashboard.css
+++ /dev/null
@@ -1,125 +0,0 @@
-
- /* Dashboard styles */
- body {
- font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
- margin: 0;
- padding: 0;
- background-color: #f5f7fa;
- color: #333;
- }
-
- .container {
- max-width: 1200px;
- margin: 0 auto;
- padding: 20px;
- }
-
- .header {
- background-color: #2c3e50;
- color: white;
- padding: 20px;
- border-radius: 8px;
- margin-bottom: 20px;
- display: flex;
- justify-content: space-between;
- align-items: center;
- }
-
- .header h1 {
- margin: 0;
- font-size: 24px;
- }
-
- .date-range {
- font-size: 14px;
- opacity: 0.8;
- }
-
- .total-return {
- font-size: 32px;
- font-weight: bold;
- margin: 0;
- }
-
- .positive-return {
- color: #2ecc71;
- }
-
- .negative-return {
- color: #e74c3c;
- }
-
- /* Metrics grid */
- .metrics-grid {
- display: grid;
- grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
- grid-gap: 20px;
- margin-bottom: 20px;
- }
-
- .metric-card {
- background-color: white;
- border-radius: 8px;
- padding: 20px;
- box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
- }
-
- .metric-title {
- font-size: 14px;
- color: #7f8c8d;
- margin: 0 0 5px 0;
- }
-
- .metric-value {
- font-size: 24px;
- font-weight: bold;
- margin: 0;
- }
-
- /* Plots grid */
- .plots-grid {
- display: flex;
- flex-direction: column;
- gap: 20px;
- }
-
- .plot-row {
- display: grid;
- grid-template-columns: repeat(2, 1fr);
- grid-gap: 20px;
- }
-
- .plot-card {
- background-color: white;
- border-radius: 8px;
- padding: 20px;
- box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
- }
-
- .plot-title {
- font-size: 18px;
- margin-top: 0;
- margin-bottom: 15px;
- }
-
- .plot-container {
- height: 300px;
- width: 100%;
- }
-
- /* Responsive layout */
- @media (max-width: 768px) {
- .plot-row {
- grid-template-columns: 1fr;
- }
-
- .header {
- flex-direction: column;
- align-items: flex-start;
- }
-
- .header > div:last-child {
- margin-top: 15px;
- }
- }
-
\ No newline at end of file
diff --git a/pyproject.toml b/pyproject.toml
index 90175d1..909cac5 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -39,6 +39,7 @@ pyqt6 = "^6.9.0"
pyqtgraph = "^0.13.7"
pyarrow = "^19.0.1"
rich = "^14.0.0"
+flask = "^3.1.0"
[tool.poetry.scripts]
algosystem = "algosystem.cli.commands:cli"
diff --git a/dashboard/css/dashboard.css b/test_output/css/dashboard.css
similarity index 100%
rename from dashboard/css/dashboard.css
rename to test_output/css/dashboard.css
diff --git a/dashboard/dashboard.html b/test_output/dashboard.html
similarity index 100%
rename from dashboard/dashboard.html
rename to test_output/dashboard.html
diff --git a/dashboard/dashboard_data.json b/test_output/dashboard_data.json
similarity index 63%
rename from dashboard/dashboard_data.json
rename to test_output/dashboard_data.json
index 43805f5..369e820 100644
--- a/dashboard/dashboard_data.json
+++ b/test_output/dashboard_data.json
@@ -3,10 +3,10 @@
"title": "AlgoSystem Trading Dashboard",
"start_date": "2020-01-01",
"end_date": "2023-10-31",
- "total_return": 16.89738612587541,
- "initial_capital": 100.04928216116915,
+ "total_return": 16.897386125875393,
+ "initial_capital": 100.04928216116916,
"final_capital": 116.95499568410848,
- "run_date": "2025-05-05 17:30:16"
+ "run_date": "2025-05-06 23:09:17"
},
"metrics": {
"annual_return": {
@@ -33,7 +33,7 @@
"id": "sharpe_ratio",
"title": "Sharpe Ratio",
"type": "Value",
- "value": 0.32619165105959474,
+ "value": 0.3261916510595918,
"position": {
"row": 0,
"col": 2
@@ -43,7 +43,7 @@
"id": "max_drawdown",
"title": "Max Drawdown",
"type": "Percentage",
- "value": -38.622794888060916,
+ "value": -38.62279488806094,
"position": {
"row": 0,
"col": 3
@@ -1062,52 +1062,52 @@
{
"label": "Equity Curve",
"data": [
- 100.04928216116915,
+ 100.04928216116916,
99.43338274457996,
- 99.00769674949291,
- 98.01319211411241,
+ 99.00769674949292,
+ 98.0131921141124,
96.22152829230674,
95.40738467576404,
95.63741192273196,
95.92631047180063,
95.40216502822742,
94.98687343123018,
- 95.09342478016177,
+ 95.09342478016175,
93.67238701717456,
- 92.16228879276849,
+ 92.16228879276848,
92.49727762198562,
- 93.16927495129373,
- 93.54486146800703,
+ 93.16927495129372,
+ 93.54486146800704,
93.82142759557004,
93.3265377392572,
93.88048326991742,
- 93.25463516949857,
- 92.36209774625237,
+ 93.25463516949856,
+ 92.36209774625236,
93.77366399275992,
- 93.72715636240217,
+ 93.72715636240216,
94.15381303829798,
- 93.69384356101287,
+ 93.69384356101288,
92.7474071262368,
91.65209582965464,
92.08437481908142,
91.90817101317052,
- 92.39914463319289,
- 91.98099363174083,
+ 92.39914463319288,
+ 91.98099363174084,
92.4790824051198,
94.1023691977374,
92.17898703578314,
92.83603090789757,
93.96190375901357,
- 92.88724863409603,
+ 92.88724863409604,
92.06074128174583,
- 91.18697031061507,
+ 91.18697031061508,
91.29727998862644,
90.9922585124584,
90.45173890147557,
90.46821972408614,
89.58453686722915,
91.57546851286608,
- 92.43012460391631,
+ 92.43012460391633,
94.53021008349334,
93.9980711245277,
91.52176846136864,
@@ -1120,8 +1120,8 @@
90.47451487678364,
92.3079872475235,
91.03990658356264,
- 90.85796969103743,
- 90.53958275899183,
+ 90.85796969103744,
+ 90.53958275899184,
88.77613444026758,
86.82210744880805,
86.56213392726751,
@@ -1562,17 +1562,17 @@
64.58932148804814,
64.59566293804507,
64.40181857446547,
- 63.80555878437538,
+ 63.80555878437537,
63.06520102155356,
- 63.18145924288727,
+ 63.181459242887264,
62.493668130387334,
62.7787823759108,
- 61.380113156075964,
- 61.02943127688013,
- 61.923997198521576,
+ 61.38011315607598,
+ 61.029431276880146,
+ 61.92399719852157,
62.167530639542,
- 62.40059952076171,
- 63.76616453561887,
+ 62.4005995207617,
+ 63.766164535618884,
64.93728906945917,
65.25820357903218,
65.27869983902409,
@@ -1708,18 +1708,18 @@
88.25286928727508,
89.14406149537409,
91.33932936855308,
- 92.14662105940293,
+ 92.14662105940292,
91.05130560953648,
91.4602953847768,
- 91.48668507140661,
+ 91.4866850714066,
92.228468581953,
91.54047559635757,
91.39189450559554,
- 91.10208733008925,
+ 91.10208733008923,
90.10472462758624,
89.29797475434759,
- 90.33094502221877,
- 90.99286441307737,
+ 90.33094502221876,
+ 90.99286441307736,
91.44676597240078,
90.05239276278901,
90.44834002562278,
@@ -1831,236 +1831,236 @@
88.76080796228784,
88.92759898717574,
89.69088615022592,
- 90.86133091324217,
- 91.55872762927673,
- 91.60663420663843,
+ 90.86133091324216,
+ 91.55872762927672,
+ 91.60663420663845,
90.6626759178906,
- 90.75437276111207,
- 92.11413147459831,
+ 90.75437276111208,
+ 92.11413147459832,
91.52344338117835,
91.1575576085469,
- 91.67859013863297,
+ 91.67859013863296,
91.94316263617904,
90.7845061008017,
90.97632696975698,
92.12797605397436,
- 91.92103682804213,
+ 91.92103682804212,
93.05298354362964,
- 95.90647878529339,
+ 95.9064787852934,
96.33553196789563,
- 96.16111877231407,
- 97.21923421087631,
+ 96.16111877231408,
+ 97.21923421087632,
95.7728159411279,
94.39465706402768,
94.1134908985829,
95.6399253902326,
- 96.43093908380125,
- 97.72439038872889,
+ 96.43093908380123,
+ 97.72439038872888,
98.98358731197624,
99.43282685504067,
100.37234821422354,
99.92714959531224,
- 101.5950191767626,
+ 101.59501917676262,
100.38464568259585,
99.90801323319488,
98.9225266935796,
- 100.05429771428841,
+ 100.05429771428842,
98.72380970547232,
97.36479124205492,
- 95.92306210840623,
- 95.68393209719697,
- 94.47180119912643,
- 94.84579616089573,
- 95.05307431700199,
+ 95.92306210840624,
+ 95.68393209719696,
+ 94.47180119912645,
+ 94.84579616089572,
+ 95.053074317002,
96.47937046459054,
94.42969985226924,
- 95.16583271831749,
+ 95.16583271831747,
95.28073391099926,
95.2232425814606,
97.06090737693395,
96.2980242794829,
95.21404345221072,
96.23566507594931,
- 97.33918675404169,
- 96.50807389454167,
- 96.54974121197057,
+ 97.33918675404168,
+ 96.50807389454168,
+ 96.54974121197056,
97.52470253790894,
- 98.85425967385349,
+ 98.85425967385348,
98.4337388030057,
98.89546801847318,
- 96.17036777813757,
+ 96.17036777813756,
94.84746221322114,
95.69923293542055,
95.30228515776452,
96.10112302645472,
- 96.57791250820131,
- 95.37783770634279,
+ 96.57791250820132,
+ 95.3778377063428,
96.25345915658356,
96.58198741685467,
94.84167883755129,
- 93.90240133422837,
+ 93.90240133422836,
94.47787384349282,
93.63596645897508,
93.17148959353835,
93.84320149393449,
- 93.98246865464391,
- 94.36447955005957,
- 93.22977516327333,
- 93.72493673112801,
- 94.22663498535941,
+ 93.98246865464392,
+ 94.36447955005956,
+ 93.22977516327332,
+ 93.724936731128,
+ 94.2266349853594,
94.46716538692698,
93.33272247090554,
- 92.20975603962283,
+ 92.20975603962285,
93.04376562953648,
- 92.44577492745705,
- 93.14560458560837,
+ 92.44577492745704,
+ 93.14560458560835,
93.36563684880976,
- 92.48627226750371,
+ 92.48627226750372,
93.77427148588036,
95.68670586603108,
97.19804404692589,
97.5381643609706,
98.44250881217312,
- 98.18992991812155,
+ 98.18992991812156,
99.08237423282053,
98.33154921263043,
- 99.19558892743007,
- 100.38108317190837,
- 100.56907993729719,
- 101.65733998534672,
- 102.58329707983917,
- 103.93710688926947,
- 105.72444498272114,
- 107.00847812585044,
- 107.90630485727456,
- 105.55104427647015,
- 104.68315339791525,
- 103.0660647187833,
- 102.50736704208467,
- 103.43857411848796,
- 103.8908008882891,
- 102.7506516091747,
- 103.20923140777322,
+ 99.19558892743008,
+ 100.38108317190839,
+ 100.56907993729718,
+ 101.65733998534671,
+ 102.58329707983916,
+ 103.93710688926949,
+ 105.72444498272115,
+ 107.00847812585046,
+ 107.90630485727459,
+ 105.55104427647017,
+ 104.68315339791522,
+ 103.06606471878331,
+ 102.50736704208464,
+ 103.43857411848799,
+ 103.89080088828912,
+ 102.75065160917468,
+ 103.2092314077732,
104.40916463128411,
- 106.91280448999623,
+ 106.91280448999622,
106.5462514886828,
106.84509394920607,
- 105.89831715609526,
- 106.23947228277801,
+ 105.89831715609527,
+ 106.23947228277798,
107.6925185543695,
- 107.81445993660893,
- 108.52896777040712,
+ 107.81445993660894,
+ 108.5289677704071,
107.47348766588688,
- 107.31506001903593,
+ 107.31506001903591,
108.04756304574964,
109.31965200934664,
- 108.31075677089639,
+ 108.3107567708964,
107.9526537769693,
- 106.06422517932283,
- 108.37077076414538,
- 110.42297660710743,
- 112.76069368001019,
+ 106.06422517932282,
+ 108.37077076414539,
+ 110.42297660710746,
+ 112.7606936800102,
112.55729172190992,
- 113.76607854416316,
- 114.56739637242822,
- 116.04581163619783,
+ 113.76607854416315,
+ 114.5673963724282,
+ 116.04581163619784,
114.78770244767466,
- 112.38119917309865,
- 113.74182979860858,
- 113.23573867493832,
- 112.93443741064952,
+ 112.38119917309864,
+ 113.74182979860856,
+ 113.23573867493833,
+ 112.93443741064951,
113.7874100232255,
111.42047489161632,
- 110.6246380974324,
+ 110.62463809743238,
111.30805799905129,
- 111.5226302763902,
- 110.50939112518678,
- 112.8511587112086,
- 113.65791088279661,
+ 111.52263027639019,
+ 110.50939112518677,
+ 112.85115871120858,
+ 113.65791088279659,
112.8045638392464,
- 113.96116794253962,
- 113.12493452251718,
+ 113.9611679425396,
+ 113.1249345225172,
112.8255953453562,
- 113.07085337449338,
+ 113.0708533744934,
112.84923654044408,
- 113.29860471070805,
- 112.69476694032022,
- 112.40514636236014,
+ 113.29860471070803,
+ 112.6947669403202,
+ 112.40514636236016,
110.7498236726629,
110.10004021788733,
- 109.94224045074816,
+ 109.94224045074814,
110.77352673072475,
- 110.48973431521003,
- 110.47046389769572,
- 109.59319698678844,
- 108.09408844721864,
+ 110.48973431521004,
+ 110.47046389769574,
+ 109.59319698678846,
+ 108.09408844721862,
108.84798365607526,
- 109.58336562886909,
+ 109.58336562886907,
110.11126595334156,
109.47634242514546,
110.53646530875147,
- 112.61029404449488,
- 111.74138351222085,
- 111.37928968991189,
- 110.77668466394509,
+ 112.61029404449486,
+ 111.74138351222082,
+ 111.3792896899119,
+ 110.77668466394512,
110.14833351356964,
110.43461013048908,
- 109.84343861029281,
+ 109.84343861029284,
108.28269238411853,
- 108.34248909231734,
- 107.96780535297073,
- 108.49463545680462,
- 108.07648478171427,
- 109.3366366413195,
+ 108.34248909231732,
+ 107.96780535297071,
+ 108.4946354568046,
+ 108.07648478171429,
+ 109.33663664131949,
110.8167046673262,
- 110.90256403343605,
- 112.18820677818451,
- 112.18297842065601,
+ 110.90256403343604,
+ 112.18820677818452,
+ 112.182978420656,
113.58127693704994,
- 112.60070566364739,
- 112.91121967450378,
- 112.64209971942086,
- 111.80333835118667,
+ 112.60070566364736,
+ 112.9112196745038,
+ 112.64209971942088,
+ 111.80333835118664,
111.77419548399345,
- 112.35522013469372,
- 111.9615603133205,
- 113.77550083229293,
- 114.14088102291694,
+ 112.35522013469371,
+ 111.96156031332053,
+ 113.77550083229295,
+ 114.14088102291691,
113.49439123237917,
- 113.48303932892227,
- 113.19329240964584,
- 112.0055027178427,
- 112.92069462289751,
- 112.58623807833347,
+ 113.48303932892226,
+ 113.19329240964585,
+ 112.00550271784269,
+ 112.92069462289753,
+ 112.58623807833344,
113.5582905663451,
- 113.41776262412525,
+ 113.41776262412523,
113.29912455156594,
- 114.68468731610214,
+ 114.68468731610211,
116.59781304429475,
- 117.69953098710413,
+ 117.69953098710411,
118.6996230170952,
- 117.7290495361903,
+ 117.72904953619033,
116.95244596195936,
119.00180175479125,
- 118.38944000194745,
+ 118.38944000194743,
117.74690920953807,
- 117.70457445623967,
- 116.59738869712922,
- 119.39960642342658,
- 119.34606617457193,
- 118.07274019733025,
- 117.45147372914295,
- 116.74335446382979,
+ 117.70457445623964,
+ 116.5973886971292,
+ 119.3996064234266,
+ 119.34606617457192,
+ 118.07274019733022,
+ 117.45147372914292,
+ 116.74335446382982,
117.48058459074697,
- 117.0561268383702,
- 115.07334728709905,
- 114.71838020549323,
- 116.10381959537652,
+ 117.05612683837019,
+ 115.07334728709904,
+ 114.71838020549326,
+ 116.1038195953765,
118.4340570748463,
- 118.24885716659018,
+ 118.24885716659021,
117.57168531960758,
- 117.18046884722312,
- 118.57883225385108,
+ 117.18046884722311,
+ 118.57883225385106,
116.95499568410848
],
"borderColor": "#2ecc71",
@@ -3089,869 +3089,869 @@
"label": "Drawdown Chart",
"data": [
0.0,
- -0.004281117501357956,
- -0.01428283531412855,
+ -0.004281117501357845,
+ -0.014282835314128661,
-0.032301570796637646,
-0.04048940061868089,
-0.0381760201360033,
-0.03527057187411731,
-0.04054189453362722,
-0.04471847573336385,
- -0.04364689045696535,
+ -0.04364689045696557,
-0.05793824536980696,
- -0.07312527997251306,
- -0.06975630247249553,
- -0.06299803567356443,
- -0.05922076785518915,
- -0.056439346566591886,
- -0.06141644623526232,
- -0.055845424558536805,
+ -0.07312527997251328,
+ -0.06975630247249542,
+ -0.06299803567356455,
+ -0.05922076785518904,
+ -0.056439346566591775,
+ -0.06141644623526221,
+ -0.055845424558536694,
-0.06213956927275721,
-0.07111580440235055,
-0.05691970438497984,
- -0.057387430907743564,
- -0.05309655128443047,
- -0.05772245723863767,
+ -0.057387430907743675,
+ -0.05309655128443036,
+ -0.05772245723863745,
-0.06724075389769057,
-0.07825628275076935,
-0.07390885960680182,
-0.07568093857110236,
- -0.07074322443053482,
+ -0.07074322443053505,
-0.07494856261686789,
- -0.06993929148849398,
- -0.0536139211972364,
- -0.07295734599949777,
- -0.06634946588943236,
- -0.055026579952743515,
+ -0.0699392914884942,
+ -0.053613921197236625,
+ -0.07295734599949799,
+ -0.06634946588943258,
+ -0.05502657995274374,
-0.06583437000528625,
- -0.07414654172806956,
+ -0.07414654172806978,
-0.08293404293755036,
- -0.08182466020343637,
- -0.08489225649503163,
- -0.09032825390418442,
- -0.09016250652482682,
- -0.0990496914165141,
- -0.07902692249643062,
- -0.070431659341745,
- -0.04931113199358417,
- -0.05466284531437693,
- -0.07956698308790588,
- -0.07922582153100044,
- -0.08094752112481851,
- -0.08582138718169818,
- -0.10236547155566333,
- -0.10683964270557789,
- -0.11074537319922195,
- -0.09009919627102914,
- -0.07165999285531521,
- -0.08441306057723164,
- -0.08624279710538096,
- -0.08944480958104484,
- -0.1071797821832956,
- -0.12683140156427297,
- -0.12944595126945957,
- -0.14446909661290175,
- -0.15029062618610878,
- -0.13576045167781214,
- -0.137762690102045,
- -0.1302604354380309,
- -0.13323170780473326,
- -0.13739331924846354,
- -0.13729569395493968,
- -0.14088188258846912,
- -0.1359195001283301,
- -0.14293540941129967,
- -0.1514994135879527,
- -0.1536242319374327,
- -0.14775002449093166,
- -0.14609723767571048,
- -0.15336029647891936,
- -0.15274790679937533,
- -0.14162970144359388,
- -0.1384364045552824,
- -0.13745319263097766,
- -0.13906368341483655,
- -0.1354565518986136,
- -0.13648874403818712,
- -0.13693448935988928,
- -0.13626236709501627,
- -0.13490668297239516,
- -0.1325768338841954,
- -0.1345319565440919,
- -0.1348653071666297,
- -0.14890022820146487,
- -0.14068755927780852,
- -0.15573491424520125,
- -0.157558853766941,
- -0.16236961870420796,
- -0.15530912053739465,
- -0.17153735193522157,
- -0.17039594849676298,
- -0.1656877291590345,
- -0.17350801187817422,
- -0.16874049214968634,
- -0.17345426257939078,
- -0.18134279412767318,
- -0.1929760508609173,
- -0.19841479309960763,
- -0.18948226459340167,
- -0.19435017256458953,
- -0.1913667101150155,
- -0.18639374898559036,
- -0.17896487600275934,
- -0.1721526133798219,
- -0.18309262813979443,
- -0.19581789457023469,
- -0.20783932828800356,
- -0.2129970568423315,
- -0.19888043711061998,
- -0.19594698340493533,
- -0.192407211621339,
- -0.19229675838415772,
- -0.19952280366111041,
- -0.19889438830819983,
- -0.20250350836666664,
- -0.19287013248881069,
- -0.18975257843115167,
- -0.2023128358935452,
- -0.2000087280464774,
- -0.19465877044444513,
- -0.1843032616345841,
- -0.19601040944157633,
- -0.20285715041869112,
- -0.1919880179804917,
- -0.2090093932490934,
- -0.22048670192255626,
- -0.22302127756076895,
- -0.21269667182228003,
- -0.20556114803585868,
- -0.19702310935630574,
- -0.20848144127301194,
- -0.19507242439274486,
- -0.20682929119887983,
- -0.20601223041048167,
- -0.19930987250352705,
- -0.20154349586065234,
- -0.19522767604243274,
- -0.20170535437784287,
- -0.20345015035486202,
- -0.2111151158983755,
- -0.2151814075038384,
- -0.2125400212338976,
- -0.19957279968958674,
- -0.1970505903394325,
- -0.20209298212849036,
- -0.21333150170895343,
- -0.2120817222575344,
- -0.2033392160190851,
- -0.2138492031224435,
- -0.21356895900116402,
- -0.21376796354525773,
- -0.21488752483932194,
- -0.22958491748820808,
- -0.23824708228307268,
- -0.23404365267925697,
- -0.2385144951129149,
- -0.24218744225860045,
- -0.24030624755814511,
- -0.24204986740088152,
- -0.24929873931499447,
- -0.2660828608039133,
- -0.26053007951827645,
- -0.2712642030476755,
- -0.2707338082135724,
- -0.2740303870616434,
- -0.27231637719115254,
- -0.27412187369805663,
- -0.27565328970443403,
- -0.2890064149513113,
- -0.2890882807556414,
- -0.2874193940185854,
- -0.28214470651712553,
- -0.2837967460940011,
- -0.2863711072222702,
- -0.2844350379567181,
- -0.2882911358736616,
- -0.2907014854226003,
- -0.30182475884265425,
- -0.30662389161805537,
- -0.318084731327258,
- -0.3163333070548837,
- -0.2999602002403169,
- -0.3060821279374999,
- -0.3170278745524503,
- -0.31639365874953984,
- -0.3130442820504781,
- -0.30876074665060893,
- -0.31414572034232946,
- -0.32492869324439566,
- -0.3247747078533083,
- -0.332864172842926,
- -0.34205792965691817,
- -0.34192685511587706,
- -0.35091191359326024,
- -0.3542582301048729,
- -0.36081644853925654,
- -0.35645651071256734,
- -0.35018174591652695,
- -0.3503350922452586,
- -0.3543347657864363,
- -0.34998480573026214,
- -0.3462794863584622,
- -0.3514411276488886,
- -0.3475841816613622,
- -0.3439887278940138,
- -0.3511418144642855,
- -0.3502075309006051,
- -0.34509653379287153,
- -0.33840577149177076,
- -0.3231847893639562,
- -0.3172944714846708,
- -0.3201699414293635,
- -0.3183885975298014,
- -0.32361379711573823,
- -0.32445248934348314,
- -0.3281846907330007,
- -0.3354178123932615,
- -0.3416366597088718,
- -0.3425419127319692,
- -0.34350307387268886,
- -0.33940485286937394,
- -0.33932384086120404,
- -0.3414431557440306,
- -0.3506947759631781,
- -0.34849201024057463,
- -0.3502437044716614,
- -0.34713921806570636,
- -0.34433938457422875,
- -0.3328609086976332,
- -0.33065563413367405,
- -0.32763096039781536,
- -0.3200495276937294,
- -0.32916551049716936,
- -0.3299162254482998,
- -0.33689367119322755,
- -0.34395647325648415,
- -0.3431348915961848,
- -0.34350698869319884,
- -0.34095511958955205,
- -0.3187123966952269,
- -0.32760951158513496,
- -0.33508973858567104,
- -0.32488330025019363,
- -0.3176840231697151,
- -0.31705459064872155,
- -0.31189247253425356,
- -0.3025974173014666,
- -0.29805381820943244,
- -0.2899246641945691,
- -0.2843891305399999,
- -0.2795592943337204,
- -0.26854141537354115,
- -0.2557485359171586,
- -0.25597076058326906,
- -0.25955173820438293,
- -0.26809781497675766,
- -0.2746617236871255,
- -0.27177828971011886,
- -0.2850628407927973,
- -0.2782832949033356,
- -0.28323396707275406,
- -0.27828580012638104,
- -0.2859398562118741,
- -0.2918284150994098,
- -0.2859073469898229,
- -0.29453544602481563,
- -0.309000484001847,
- -0.31129310662590237,
- -0.31155581578489133,
- -0.3021607123671516,
- -0.30563652162041177,
- -0.2892448422436691,
- -0.2813342035600028,
- -0.2854160774151543,
- -0.2871549989913307,
- -0.2954234493056829,
- -0.29209866770918935,
- -0.2937042417011553,
- -0.280883834227718,
- -0.2746305043174829,
- -0.27742898014229034,
- -0.2799112223072646,
- -0.28592085129005707,
- -0.2801061623379534,
- -0.30070563011893414,
- -0.28531981994069666,
- -0.28507669422471715,
- -0.2864787413755572,
- -0.2879891654380965,
- -0.2914085164845378,
- -0.29541040023299525,
- -0.29315667582122107,
- -0.2948499338228907,
- -0.2958766303071432,
- -0.2916096717544123,
- -0.2892742191657982,
- -0.286778210969997,
- -0.2770950320374679,
- -0.2609034457153603,
- -0.25667222770513587,
- -0.266248101870738,
- -0.26504477978672536,
- -0.26219261378777536,
- -0.2680794461356325,
- -0.2647809814387474,
- -0.2576207794093003,
- -0.26684303121901654,
- -0.2695632747501344,
- -0.2692540085120194,
- -0.2774635735344102,
- -0.26501429633841134,
- -0.25778721032125806,
- -0.2640546126105542,
- -0.2545970285099147,
- -0.24929105869655455,
- -0.25018643591506307,
- -0.24313634536209305,
- -0.25148864764064316,
- -0.2573305690811073,
- -0.25256622410081997,
- -0.25201801256316303,
- -0.25831097703854,
- -0.2543605939719211,
- -0.24983297819607053,
- -0.2579364237279671,
- -0.263051570832342,
- -0.25496160792604117,
- -0.2524268584078866,
- -0.2519448020861036,
- -0.2553570022211591,
- -0.262054104013581,
- -0.2611012659855808,
- -0.2601965823374155,
- -0.26690683560891393,
- -0.2559202440458167,
- -0.2497630358300389,
- -0.2623490353679291,
- -0.2624095940161022,
- -0.2677207986894019,
- -0.2729059836911669,
- -0.2812848724063933,
- -0.27842286802859795,
- -0.278360096372256,
- -0.27218666678992043,
- -0.27054047539992043,
- -0.28097185155802107,
- -0.27774357326597177,
- -0.2741106759079528,
- -0.25743781251821907,
- -0.26522291233888284,
- -0.27756814914336325,
- -0.28802804448659003,
- -0.28634833703205065,
- -0.28928564387524447,
- -0.2929250011418808,
- -0.2902610338879912,
- -0.28451715775951625,
- -0.28085323385857186,
- -0.2892562378942346,
- -0.3030317707198549,
- -0.29761882693723096,
- -0.3127245293631431,
- -0.30994162100369405,
- -0.3164291209413387,
- -0.3062995679071737,
- -0.31003571326866364,
- -0.31202990647952034,
- -0.2966618973764391,
- -0.2964161304406835,
- -0.29429603313254904,
- -0.2901512750619305,
- -0.3071868214579716,
- -0.3014922954837477,
- -0.29838037282715024,
- -0.3033567997075376,
- -0.3151881759305496,
- -0.31784615680717143,
- -0.32659823415110134,
- -0.3246497340522817,
- -0.33286823215246264,
- -0.33587256601998483,
- -0.3363505257911328,
- -0.32537851416655517,
- -0.32947443854372205,
- -0.3185946332819505,
- -0.32447163935189993,
- -0.32277859149035615,
- -0.31147367411167304,
- -0.3125945433616224,
- -0.31897767130289345,
- -0.32065668095072775,
- -0.3259730238884765,
- -0.318842955357455,
- -0.3313855796976921,
- -0.33690593897199717,
- -0.32935481349529083,
- -0.3259943447168526,
- -0.3205935924135297,
- -0.3237147802236632,
- -0.3211732739571811,
- -0.31939198066500296,
- -0.3246632636110228,
- -0.3235656378055166,
- -0.3313435813474356,
- -0.32863051140345045,
- -0.3256350036526876,
- -0.33045972230960674,
- -0.34017025071919527,
- -0.32733878646062897,
- -0.33431019796251704,
- -0.33227717505548005,
- -0.3313070859188991,
- -0.32321521877304726,
- -0.31882916817253304,
- -0.32362459040044467,
- -0.3233277953100845,
- -0.3233365852105725,
- -0.33203134094608044,
- -0.33743949868226986,
- -0.33943334413343984,
- -0.33893150888433765,
- -0.33082187147294306,
- -0.325664368959133,
- -0.322177612115672,
- -0.3263740329994135,
- -0.32235931528520445,
- -0.325464766480284,
- -0.3297555444311123,
- -0.33406469896074664,
- -0.3329055862389749,
- -0.32640962184737277,
- -0.3139169247543401,
- -0.3059179269985445,
- -0.3068050595268462,
- -0.3065475629985378,
- -0.30639286273338007,
- -0.3036402216661581,
- -0.3142499416459009,
- -0.3076937702434799,
- -0.29994031245302866,
- -0.2981852714366716,
- -0.2936812863608199,
- -0.2829133212124426,
- -0.28991904074643715,
- -0.28685063498836416,
- -0.2910502987109449,
- -0.2885464063778237,
- -0.2836769644123128,
- -0.2874656111781483,
- -0.28767334092513364,
- -0.29039825028589694,
- -0.2945549973857482,
- -0.29749028996647797,
- -0.30557789225397347,
- -0.2987095317558729,
- -0.30555059594939593,
- -0.2994617986468031,
- -0.31433467460209874,
- -0.32340089262958616,
- -0.3143098292802674,
- -0.3104953152659824,
- -0.30975632439678136,
- -0.32656645285631936,
- -0.32638187671021723,
- -0.3210868968640598,
- -0.3151484272248366,
- -0.31851423333403994,
- -0.32990441309467733,
- -0.33530176183692084,
- -0.3371173158547025,
- -0.34557132051213235,
- -0.3523794365834738,
- -0.3427436632551497,
- -0.33106431519084145,
- -0.3343008395079148,
- -0.3302016908398169,
- -0.3222446286980747,
- -0.33085584226873554,
- -0.32535620218264094,
- -0.32159141747491826,
- -0.3232404220691971,
- -0.3274334490480352,
- -0.328147248333714,
- -0.32736084099385,
- -0.3268808291101475,
- -0.33157217431086294,
- -0.3445869023890177,
- -0.343962397691841,
- -0.35042618781297563,
- -0.35036241194795026,
- -0.35231190172923965,
- -0.35830847726184256,
- -0.36575424388856614,
- -0.36458503674580645,
- -0.3715021413792343,
- -0.3686347517998628,
- -0.3827011466184691,
- -0.3862279488806092,
- -0.37723131317387315,
- -0.3747821011054675,
- -0.37243813095392986,
- -0.35870466461531625,
- -0.3469266832018847,
- -0.34369925091792664,
- -0.34349312034662194,
- -0.34224168893951,
- -0.3329140789023728,
- -0.32936419533817796,
- -0.3278603939156768,
- -0.3297753923635347,
- -0.32983503432224726,
- -0.3260507286373385,
- -0.3343435273290759,
- -0.3268545730769623,
- -0.3289341019497515,
- -0.33122252779829353,
- -0.32868710809526436,
- -0.3251114316371434,
- -0.3213873492999293,
- -0.3193303736337313,
- -0.3071151447640639,
- -0.29143547411614856,
- -0.280437308102817,
- -0.2809096159716622,
- -0.27821520801520994,
- -0.2836160461568459,
- -0.2745287080053591,
- -0.27065340606306576,
- -0.27031991315919834,
- -0.25995606359637957,
- -0.2572819595497643,
- -0.2628663847935082,
- -0.26632532148565413,
- -0.27265801300699577,
- -0.2816277734064617,
- -0.28148994688493567,
- -0.276578370784168,
- -0.2691476274325548,
- -0.2584700631063944,
- -0.2531908759333522,
- -0.2358485095762023,
- -0.23500100411193148,
- -0.23334601086861662,
- -0.23253462890893317,
- -0.2272379560027743,
- -0.2217368966432195,
- -0.21561275074863662,
- -0.22541178393947792,
- -0.22958473397859902,
- -0.21938504543366621,
- -0.21865972248766108,
- -0.216790558456871,
- -0.20801144602009325,
- -0.20662655956619025,
- -0.1994922775013971,
- -0.21372454028275967,
- -0.1925270137452546,
- -0.1975647572358551,
- -0.20289971670703522,
- -0.20354078300610579,
- -0.19497611838104945,
- -0.1900225611409495,
- -0.18911525713330546,
- -0.1813772414126782,
- -0.17500952837930728,
- -0.17187352030915903,
- -0.15296208760598162,
- -0.15765154321664243,
- -0.14647599132906297,
- -0.14962614887174985,
- -0.144084165990233,
- -0.14416220430024007,
- -0.1334181294244473,
- -0.13739224598729283,
- -0.1260679722847522,
- -0.12542973241235067,
- -0.1333078216782836,
- -0.13267696851310673,
- -0.1418086485037523,
- -0.15229580322970382,
- -0.1595942565359756,
- -0.1685762012597415,
- -0.1653765049324436,
- -0.17282004843552756,
- -0.1750220684529571,
- -0.19229203331547984,
- -0.1898489859408694,
- -0.18924241122847985,
- -0.19586949500032813,
- -0.204308984051504,
- -0.19161552625987888,
- -0.19378344801293013,
- -0.18463090911608104,
- -0.19263557991579494,
- -0.18062353800670994,
- -0.18663927164465832,
- -0.2012670736215748,
- -0.18641534366905654,
- -0.18722115934946904,
- -0.18393622108002072,
- -0.1723872993319081,
- -0.16221095473294833,
- -0.18157889892816903,
- -0.18419275805554258,
- -0.18415344428774183,
- -0.18465633632587586,
- -0.17735641935698743,
- -0.1813671637534613,
- -0.17002625944158567,
- -0.16774674378858923,
- -0.1627731789769924,
- -0.1575088716499935,
- -0.15929103486929108,
- -0.15349608272485016,
- -0.15074863272842687,
- -0.14753521840122363,
- -0.15955933707946035,
- -0.15471817798808218,
- -0.1408284890982764,
- -0.15017236117395416,
- -0.1548564957649774,
- -0.16411368618509448,
- -0.1761482365104453,
- -0.16837846459935435,
- -0.16075145080218134,
- -0.15047839143470687,
- -0.15778931087600878,
- -0.1615001647175336,
- -0.14456311448841985,
- -0.1426760805150863,
- -0.1378291963406839,
- -0.13751743521640702,
- -0.12896957837787404,
- -0.12287148834132333,
- -0.11244225177398137,
- -0.10347954545242077,
- -0.08140177023664541,
- -0.07328285012584546,
- -0.0842984207484404,
- -0.08018521687312918,
- -0.07991981620082578,
- -0.0724597108511782,
- -0.0793788457192206,
- -0.0808731234623774,
- -0.08378770976636296,
- -0.09381817111619939,
- -0.10193164217562212,
- -0.09154307608887202,
- -0.08488616296182983,
- -0.08032128196517929,
- -0.09434447187508688,
- -0.09036243634632624,
- -0.09460155863018105,
- -0.10312261272317225,
- -0.11743211314276314,
- -0.1127591997687587,
- -0.11596845258889454,
- -0.11699361196159774,
- -0.11375957156824135,
- -0.13444382711039393,
- -0.12973951746246792,
- -0.14545937176415835,
- -0.14818946298016733,
- -0.12140733370894707,
- -0.13805095632532594,
- -0.13579924495713658,
- -0.13684562476446605,
- -0.1373441903462188,
- -0.13784418597018544,
- -0.14550263222956028,
- -0.15195377894602935,
- -0.15031064923788484,
- -0.14807884836737661,
- -0.1434618189571899,
- -0.13345045119094157,
- -0.1217303827610442,
- -0.11111379529610421,
- -0.12150798830959975,
- -0.11658025908988656,
- -0.11308765778328966,
- -0.11525430288818417,
- -0.1112898428555037,
- -0.10490987869791957,
- -0.10576910074821333,
- -0.0980733250884076,
- -0.10720889123888866,
- -0.10608970764452075,
- -0.11597836915621429,
- -0.12726466721534502,
- -0.13128621304656873,
- -0.13403378443122482,
- -0.1396022907358544,
- -0.13343065832480727,
- -0.13082108168317175,
- -0.12246823888387903,
- -0.11586338872667123,
- -0.11925294416721255,
- -0.12388390741761823,
- -0.13430128245707285,
- -0.1287733813517309,
- -0.127113422440587,
- -0.12631252499684953,
- -0.13999025856001712,
- -0.15456326303091494,
- -0.16260870162683316,
- -0.14926522708536416,
- -0.138869280040826,
- -0.1517991170456413,
- -0.14822926277023696,
- -0.15246091015660412,
- -0.15493060042246898,
- -0.15104935512371465,
- -0.16322047965402686,
- -0.16143311855069586,
- -0.15425195401502678,
- -0.1441997840265007,
- -0.15090439725427385,
- -0.1533154739527145,
- -0.1634146676302154,
- -0.17608872924242103,
- -0.17679148223886176,
- -0.17022397638812414,
- -0.15217818565844277,
- -0.14765297295572777,
- -0.1467951342161662,
- -0.14648142815733922,
- -0.13320986715246874,
- -0.12961360499813068,
- -0.13399383619463423,
- -0.1486034166507929,
- -0.1494523195166948,
- -0.14341837885126918,
- -0.15307359728256342,
- -0.15372237510876663,
- -0.15567295440308515,
- -0.1626782368058899,
- -0.1611493238449494,
- -0.14412513387576975,
- -0.1333489459354521,
- -0.14545047004151113,
- -0.16127215966764408,
- -0.16839911009668862,
- -0.1593501852142687,
- -0.16799284544807558,
- -0.14672499436713682,
- -0.13680853821310668,
- -0.13255749415160245,
- -0.13372333552548388,
- -0.13295233348907576,
- -0.1306698835101595,
- -0.12202164543767935,
- -0.120317705230365,
- -0.12654868816634246,
- -0.12524315048936385,
- -0.12185856750640556,
- -0.1159539279425632,
- -0.10867754468053126,
- -0.10733392033646483,
- -0.10565650556605155,
- -0.09798013831411068,
- -0.086208993345395,
- -0.07919528530504805,
+ -0.0818246602034367,
+ -0.08489225649503185,
+ -0.09032825390418475,
+ -0.09016250652482705,
+ -0.09904969141651432,
+ -0.07902692249643084,
+ -0.07043165934174522,
+ -0.04931113199358461,
+ -0.05466284531437737,
+ -0.07956698308790644,
+ -0.07922582153100088,
+ -0.08094752112481896,
+ -0.08582138718169863,
+ -0.10236547155566378,
+ -0.10683964270557844,
+ -0.11074537319922251,
+ -0.09009919627102969,
+ -0.07165999285531577,
+ -0.08441306057723219,
+ -0.08624279710538141,
+ -0.08944480958104528,
+ -0.10717978218329616,
+ -0.12683140156427353,
+ -0.12944595126946,
+ -0.1444690966129022,
+ -0.15029062618610922,
+ -0.1357604516778126,
+ -0.13776269010204545,
+ -0.13026043543803134,
+ -0.1332317078047337,
+ -0.13739331924846399,
+ -0.13729569395494012,
+ -0.14088188258846956,
+ -0.13591950012833054,
+ -0.14293540941130012,
+ -0.15149941358795316,
+ -0.15362423193743313,
+ -0.1477500244909321,
+ -0.14609723767571092,
+ -0.1533602964789198,
+ -0.15274790679937578,
+ -0.14162970144359432,
+ -0.13843640455528283,
+ -0.1374531926309781,
+ -0.139063683414837,
+ -0.13545655189861405,
+ -0.13648874403818756,
+ -0.13693448935988983,
+ -0.1362623670950167,
+ -0.1349066829723956,
+ -0.13257683388419594,
+ -0.13453195654409233,
+ -0.13486530716663014,
+ -0.1489002282014653,
+ -0.14068755927780907,
+ -0.1557349142452017,
+ -0.15755885376694156,
+ -0.1623696187042084,
+ -0.1553091205373951,
+ -0.17153735193522202,
+ -0.17039594849676343,
+ -0.16568772915903496,
+ -0.17350801187817466,
+ -0.16874049214968678,
+ -0.17345426257939123,
+ -0.18134279412767362,
+ -0.19297605086091774,
+ -0.19841479309960808,
+ -0.18948226459340212,
+ -0.19435017256458997,
+ -0.19136671011501605,
+ -0.1863937489855908,
+ -0.1789648760027598,
+ -0.17215261337982246,
+ -0.18309262813979488,
+ -0.19581789457023513,
+ -0.207839328288004,
+ -0.21299705684233206,
+ -0.19888043711062053,
+ -0.19594698340493577,
+ -0.19240721162133945,
+ -0.19229675838415827,
+ -0.19952280366111086,
+ -0.19889438830820028,
+ -0.20250350836666708,
+ -0.19287013248881113,
+ -0.18975257843115212,
+ -0.20231283589354565,
+ -0.20000872804647785,
+ -0.19465877044444557,
+ -0.18430326163458455,
+ -0.19601040944157677,
+ -0.20285715041869168,
+ -0.19198801798049214,
+ -0.20900939324909384,
+ -0.2204867019225567,
+ -0.2230212775607694,
+ -0.21269667182228047,
+ -0.20556114803585923,
+ -0.19702310935630618,
+ -0.20848144127301238,
+ -0.1950724243927454,
+ -0.20682929119888027,
+ -0.2060122304104821,
+ -0.1993098725035275,
+ -0.2015434958606528,
+ -0.19522767604243318,
+ -0.20170535437784332,
+ -0.20345015035486247,
+ -0.21111511589837595,
+ -0.21518140750383896,
+ -0.21254002123389804,
+ -0.1995727996895873,
+ -0.19705059033943295,
+ -0.2020929821284908,
+ -0.21333150170895387,
+ -0.21208172225753485,
+ -0.20333921601908578,
+ -0.21384920312244404,
+ -0.21356895900116468,
+ -0.2137679635452583,
+ -0.2148875248393225,
+ -0.22958491748820864,
+ -0.23824708228307334,
+ -0.23404365267925764,
+ -0.23851449511291556,
+ -0.242187442258601,
+ -0.24030624755814578,
+ -0.2420498674008822,
+ -0.24929873931499513,
+ -0.26608286080391397,
+ -0.2605300795182771,
+ -0.2712642030476762,
+ -0.27073380821357307,
+ -0.27403038706164395,
+ -0.2723163771911532,
+ -0.2741218736980573,
+ -0.2756532897044346,
+ -0.28900641495131185,
+ -0.28908828075564197,
+ -0.28741939401858596,
+ -0.2821447065171261,
+ -0.28379674609400163,
+ -0.28637110722227077,
+ -0.28443503795671865,
+ -0.2882911358736623,
+ -0.2907014854226009,
+ -0.3018247588426548,
+ -0.3066238916180559,
+ -0.31808473132725856,
+ -0.3163333070548844,
+ -0.29996020024031744,
+ -0.30608212793750045,
+ -0.31702787455245085,
+ -0.3163936587495404,
+ -0.31304428205047874,
+ -0.3087607466506096,
+ -0.31414572034233,
+ -0.3249286932443963,
+ -0.32477470785330886,
+ -0.3328641728429267,
+ -0.34205792965691884,
+ -0.3419268551158776,
+ -0.3509119135932608,
+ -0.35425823010487345,
+ -0.3608164485392572,
+ -0.3564565107125679,
+ -0.3501817459165275,
+ -0.35033509224525927,
+ -0.35433476578643697,
+ -0.3499848057302627,
+ -0.34627948635846273,
+ -0.35144112764888924,
+ -0.34758418166136273,
+ -0.34398872789401436,
+ -0.35114181446428605,
+ -0.35020753090060575,
+ -0.3450965337928721,
+ -0.3384057714917713,
+ -0.3231847893639569,
+ -0.3172944714846715,
+ -0.32016994142936417,
+ -0.3183885975298021,
+ -0.3236137971157389,
+ -0.3244524893434838,
+ -0.3281846907330014,
+ -0.3354178123932623,
+ -0.34163665970887247,
+ -0.3425419127319699,
+ -0.3435030738726895,
+ -0.3394048528693747,
+ -0.3393238408612047,
+ -0.3414431557440313,
+ -0.3506947759631788,
+ -0.3484920102405754,
+ -0.3502437044716622,
+ -0.347139218065707,
+ -0.3443393845742294,
+ -0.33286090869763396,
+ -0.3306556341336747,
+ -0.32763096039781603,
+ -0.3200495276937302,
+ -0.32916551049717,
+ -0.32991622544830035,
+ -0.3368936711932281,
+ -0.3439564732564848,
+ -0.3431348915961854,
+ -0.3435069886931995,
+ -0.3409551195895526,
+ -0.31871239669522744,
+ -0.3276095115851355,
+ -0.3350897385856716,
+ -0.3248833002501943,
+ -0.31768402316971567,
+ -0.3170545906487221,
+ -0.3118924725342541,
+ -0.30259741730146716,
+ -0.298053818209433,
+ -0.28992466419456964,
+ -0.2843891305400005,
+ -0.27955929433372095,
+ -0.2685414153735418,
+ -0.2557485359171593,
+ -0.25597076058326973,
+ -0.2595517382043835,
+ -0.26809781497675833,
+ -0.27466172368712605,
+ -0.2717782897101194,
+ -0.285062840792798,
+ -0.27828329490333614,
+ -0.2832339670727547,
+ -0.2782858001263817,
+ -0.2859398562118747,
+ -0.2918284150994105,
+ -0.28590734698982345,
+ -0.2945354460248162,
+ -0.30900048400184754,
+ -0.3112931066259029,
+ -0.3115558157848919,
+ -0.30216071236715214,
+ -0.3056365216204123,
+ -0.28924484224366975,
+ -0.2813342035600035,
+ -0.28541607741515507,
+ -0.28715499899133134,
+ -0.29542344930568365,
+ -0.29209866770919013,
+ -0.29370424170115594,
+ -0.2808838342277187,
+ -0.2746305043174837,
+ -0.277428980142291,
+ -0.2799112223072653,
+ -0.28592085129005773,
+ -0.28010616233795405,
+ -0.3007056301189347,
+ -0.28531981994069733,
+ -0.2850766942247178,
+ -0.28647874137555795,
+ -0.28798916543809716,
+ -0.29140851648453847,
+ -0.2954104002329959,
+ -0.29315667582122185,
+ -0.2948499338228914,
+ -0.29587663030714384,
+ -0.291609671754413,
+ -0.2892742191657989,
+ -0.2867782109699978,
+ -0.27709503203746866,
+ -0.26090344571536106,
+ -0.25667222770513654,
+ -0.26624810187073866,
+ -0.265044779786726,
+ -0.26219261378777603,
+ -0.26807944613563317,
+ -0.26478098143874806,
+ -0.25762077940930095,
+ -0.2668430312190173,
+ -0.2695632747501351,
+ -0.2692540085120201,
+ -0.277463573534411,
+ -0.265014296338412,
+ -0.25778721032125873,
+ -0.26405461261055485,
+ -0.2545970285099154,
+ -0.24929105869655532,
+ -0.25018643591506373,
+ -0.24313634536209372,
+ -0.25148864764064394,
+ -0.25733056908110796,
+ -0.25256622410082064,
+ -0.2520180125631638,
+ -0.2583109770385408,
+ -0.2543605939719218,
+ -0.2498329781960712,
+ -0.25793642372796777,
+ -0.26305157083234254,
+ -0.25496160792604183,
+ -0.25242685840788714,
+ -0.25194480208610415,
+ -0.25535700222115976,
+ -0.26205410401358153,
+ -0.26110126598558137,
+ -0.26019658233741605,
+ -0.2669068356089145,
+ -0.25592024404581726,
+ -0.24976303583003945,
+ -0.26234903536792964,
+ -0.26240959401610275,
+ -0.26772079868940235,
+ -0.2729059836911675,
+ -0.2812848724063939,
+ -0.2784228680285984,
+ -0.27836009637225645,
+ -0.2721866667899209,
+ -0.270540475399921,
+ -0.2809718515580216,
+ -0.2777435732659722,
+ -0.27411067590795335,
+ -0.25743781251821973,
+ -0.2652229123388834,
+ -0.2775681491433638,
+ -0.2880280444865906,
+ -0.2863483370320513,
+ -0.289285643875245,
+ -0.29292500114188136,
+ -0.29026103388799174,
+ -0.2845171577595168,
+ -0.2808532338585725,
+ -0.28925623789423516,
+ -0.30303177071985543,
+ -0.2976188269372315,
+ -0.31272452936314377,
+ -0.3099416210036946,
+ -0.3164291209413391,
+ -0.30629956790717416,
+ -0.3100357132686641,
+ -0.3120299064795209,
+ -0.29666189737643955,
+ -0.29641613044068404,
+ -0.2942960331325496,
+ -0.29015127506193095,
+ -0.30718682145797205,
+ -0.3014922954837481,
+ -0.2983803728271507,
+ -0.30335679970753804,
+ -0.31518817593055004,
+ -0.3178461568071719,
+ -0.3265982341511018,
+ -0.32464973405228226,
+ -0.3328682321524632,
+ -0.3358725660199853,
+ -0.3363505257911332,
+ -0.3253785141665557,
+ -0.3294744385437225,
+ -0.31859463328195103,
+ -0.3244716393519005,
+ -0.3227785914903566,
+ -0.3114736741116735,
+ -0.31259454336162285,
+ -0.3189776713028939,
+ -0.3206566809507282,
+ -0.32597302388847693,
+ -0.31884295535745544,
+ -0.33138557969769256,
+ -0.3369059389719977,
+ -0.3293548134952914,
+ -0.3259943447168532,
+ -0.32059359241353014,
+ -0.3237147802236636,
+ -0.32117327395718154,
+ -0.3193919806650034,
+ -0.3246632636110234,
+ -0.32356563780551706,
+ -0.331343581347436,
+ -0.3286305114034509,
+ -0.32563500365268794,
+ -0.3304597223096072,
+ -0.3401702507191956,
+ -0.3273387864606293,
+ -0.3343101979625174,
+ -0.3322771750554804,
+ -0.33130708591889957,
+ -0.3232152187730476,
+ -0.3188291681725335,
+ -0.323624590400445,
+ -0.3233277953100848,
+ -0.32333658521057296,
+ -0.3320313409460808,
+ -0.3374394986822702,
+ -0.3394333441334403,
+ -0.338931508884338,
+ -0.3308218714729435,
+ -0.3256643689591333,
+ -0.3221776121156723,
+ -0.3263740329994139,
+ -0.3223593152852048,
+ -0.32546476648028444,
+ -0.32975554443111277,
+ -0.334064698960747,
+ -0.33290558623897526,
+ -0.3264096218473732,
+ -0.3139169247543404,
+ -0.3059179269985449,
+ -0.30680505952684656,
+ -0.30654756299853825,
+ -0.3063928627333804,
+ -0.30364022166615845,
+ -0.31424994164590137,
+ -0.3076937702434803,
+ -0.299940312453029,
+ -0.29818527143667206,
+ -0.29368128636082025,
+ -0.28291332121244306,
+ -0.2899190407464375,
+ -0.2868506349883646,
+ -0.29105029871094523,
+ -0.28854640637782414,
+ -0.28367696441231316,
+ -0.28746561117814873,
+ -0.28767334092513397,
+ -0.2903982502858973,
+ -0.29455499738574864,
+ -0.2974902899664783,
+ -0.3055778922539739,
+ -0.2987095317558732,
+ -0.3055505959493964,
+ -0.29946179864680345,
+ -0.3143346746020991,
+ -0.3234008926295866,
+ -0.31430982928026785,
+ -0.31049531526598273,
+ -0.3097563243967817,
+ -0.3265664528563197,
+ -0.32638187671021757,
+ -0.3210868968640601,
+ -0.31514842722483705,
+ -0.3185142333340404,
+ -0.3299044130946778,
+ -0.3353017618369212,
+ -0.33711731585470295,
+ -0.3455713205121328,
+ -0.35237943658347415,
+ -0.34274366325515015,
+ -0.3310643151908419,
+ -0.3343008395079151,
+ -0.3302016908398172,
+ -0.322244628698075,
+ -0.330855842268736,
+ -0.3253562021826413,
+ -0.3215914174749187,
+ -0.32324042206919745,
+ -0.3274334490480356,
+ -0.32814724833371445,
+ -0.32736084099385043,
+ -0.3268808291101478,
+ -0.3315721743108633,
+ -0.344586902389018,
+ -0.34396239769184134,
+ -0.35042618781297596,
+ -0.3503624119479506,
+ -0.3523119017292401,
+ -0.358308477261843,
+ -0.3657542438885665,
+ -0.364585036745807,
+ -0.37150214137923465,
+ -0.36863475179986327,
+ -0.3827011466184692,
+ -0.3862279488806094,
+ -0.3772313131738735,
+ -0.3747821011054677,
+ -0.3724381309539303,
+ -0.3587046646153166,
+ -0.34692668320188513,
+ -0.3436992509179271,
+ -0.3434931203466225,
+ -0.34224168893951046,
+ -0.33291407890237323,
+ -0.3293641953381785,
+ -0.32786039391567734,
+ -0.32977539236353526,
+ -0.3298350343222478,
+ -0.3260507286373391,
+ -0.33434352732907624,
+ -0.32685457307696264,
+ -0.3289341019497519,
+ -0.33122252779829386,
+ -0.3286871080952647,
+ -0.32511143163714373,
+ -0.3213873492999296,
+ -0.3193303736337316,
+ -0.3071151447640642,
+ -0.2914354741161489,
+ -0.2804373081028174,
+ -0.28090961597166253,
+ -0.2782152080152104,
+ -0.2836160461568462,
+ -0.27452870800535956,
+ -0.2706534060630662,
+ -0.2703199131591988,
+ -0.2599560635963801,
+ -0.25728195954976474,
+ -0.26286638479350866,
+ -0.2663253214856546,
+ -0.2726580130069962,
+ -0.28162777340646217,
+ -0.2814899468849361,
+ -0.27657837078416847,
+ -0.26914762743255527,
+ -0.25847006310639487,
+ -0.25319087593335265,
+ -0.23584850957620274,
+ -0.23500100411193192,
+ -0.23334601086861706,
+ -0.23253462890893373,
+ -0.22723795600277474,
+ -0.22173689664322005,
+ -0.21561275074863706,
+ -0.22541178393947836,
+ -0.22958473397859946,
+ -0.21938504543366666,
+ -0.21865972248766152,
+ -0.21679055845687145,
+ -0.2080114460200937,
+ -0.2066265595661908,
+ -0.19949227750139753,
+ -0.2137245402827601,
+ -0.19252701374525527,
+ -0.19756475723585565,
+ -0.20289971670703566,
+ -0.20354078300610623,
+ -0.1949761183810499,
+ -0.19002256114094995,
+ -0.1891152571333059,
+ -0.18137724141267864,
+ -0.17500952837930783,
+ -0.17187352030915948,
+ -0.15296208760598207,
+ -0.15765154321664288,
+ -0.14647599132906342,
+ -0.1496261488717503,
+ -0.14408416599023344,
+ -0.14416220430024052,
+ -0.13341812942444775,
+ -0.13739224598729327,
+ -0.12606797228475275,
+ -0.1254297324123511,
+ -0.13330782167828403,
+ -0.13267696851310717,
+ -0.14180864850375274,
+ -0.15229580322970426,
+ -0.15959425653597614,
+ -0.16857620125974193,
+ -0.16537650493244405,
+ -0.172820048435528,
+ -0.17502206845295754,
+ -0.1922920333154804,
+ -0.18984898594086985,
+ -0.1892424112284803,
+ -0.19586949500032858,
+ -0.20430898405150444,
+ -0.19161552625987932,
+ -0.19378344801293057,
+ -0.1846309091160815,
+ -0.19263557991579527,
+ -0.18062353800671027,
+ -0.18663927164465866,
+ -0.20126707362157514,
+ -0.18641534366905688,
+ -0.18722115934946948,
+ -0.18393622108002106,
+ -0.17238729933190844,
+ -0.16221095473294866,
+ -0.18157889892816936,
+ -0.1841927580555428,
+ -0.18415344428774216,
+ -0.18465633632587608,
+ -0.17735641935698765,
+ -0.1813671637534615,
+ -0.1700262594415859,
+ -0.16774674378858945,
+ -0.16277317897699262,
+ -0.15750887164999372,
+ -0.1592910348692913,
+ -0.15349608272485038,
+ -0.1507486327284271,
+ -0.14753521840122386,
+ -0.15955933707946057,
+ -0.1547181779880824,
+ -0.1408284890982766,
+ -0.15017236117395438,
+ -0.15485649576497762,
+ -0.1641136861850947,
+ -0.17614823651044553,
+ -0.16837846459935457,
+ -0.16075145080218156,
+ -0.1504783914347071,
+ -0.157789310876009,
+ -0.1615001647175338,
+ -0.14456311448842007,
+ -0.1426760805150865,
+ -0.13782919634068413,
+ -0.13751743521640725,
+ -0.12896957837787426,
+ -0.12287148834132355,
+ -0.1124422517739816,
+ -0.103479545452421,
+ -0.08140177023664574,
+ -0.07328285012584579,
+ -0.08429842074844063,
+ -0.0801852168731294,
+ -0.07991981620082622,
+ -0.07245971085117853,
+ -0.07937884571922094,
+ -0.08087312346237774,
+ -0.0837877097663634,
+ -0.09381817111619972,
+ -0.10193164217562245,
+ -0.09154307608887258,
+ -0.08488616296183038,
+ -0.08032128196517963,
+ -0.09434447187508732,
+ -0.09036243634632657,
+ -0.09460155863018138,
+ -0.10312261272317258,
+ -0.11743211314276347,
+ -0.11275919976875903,
+ -0.11596845258889488,
+ -0.11699361196159808,
+ -0.11375957156824179,
+ -0.13444382711039427,
+ -0.12973951746246837,
+ -0.14545937176415868,
+ -0.14818946298016766,
+ -0.12140733370894763,
+ -0.13805095632532638,
+ -0.13579924495713713,
+ -0.1368456247644665,
+ -0.13734419034621925,
+ -0.13784418597018588,
+ -0.14550263222956072,
+ -0.1519537789460298,
+ -0.15031064923788529,
+ -0.14807884836737706,
+ -0.14346181895719046,
+ -0.13345045119094212,
+ -0.12173038276104475,
+ -0.11111379529610488,
+ -0.1215079883096003,
+ -0.11658025908988723,
+ -0.11308765778329022,
+ -0.11525430288818472,
+ -0.11128984285550425,
+ -0.10490987869792012,
+ -0.10576910074821388,
+ -0.09807332508840816,
+ -0.10720889123888921,
+ -0.1060897076445213,
+ -0.11597836915621484,
+ -0.12726466721534557,
+ -0.1312862130465693,
+ -0.13403378443122538,
+ -0.13960229073585495,
+ -0.13343065832480783,
+ -0.1308210816831723,
+ -0.12246823888387959,
+ -0.11586338872667179,
+ -0.1192529441672131,
+ -0.12388390741761879,
+ -0.1343012824570734,
+ -0.12877338135173155,
+ -0.12711342244058754,
+ -0.12631252499685008,
+ -0.13999025856001768,
+ -0.1545632630309155,
+ -0.16260870162683383,
+ -0.14926522708536472,
+ -0.13886928004082655,
+ -0.15179911704564186,
+ -0.1482292627702375,
+ -0.15246091015660468,
+ -0.15493060042246953,
+ -0.1510493551237151,
+ -0.1632204796540273,
+ -0.1614331185506963,
+ -0.15425195401502723,
+ -0.14419978402650113,
+ -0.1509043972542743,
+ -0.15331547395271505,
+ -0.16341466763021584,
+ -0.17608872924242147,
+ -0.1767914822388622,
+ -0.1702239763881246,
+ -0.1521781856584432,
+ -0.1476529729557282,
+ -0.14679513421616663,
+ -0.14648142815733967,
+ -0.13320986715246919,
+ -0.12961360499813124,
+ -0.13399383619463479,
+ -0.14860341665079335,
+ -0.14945231951669524,
+ -0.14341837885126962,
+ -0.15307359728256387,
+ -0.15372237510876707,
+ -0.1556729544030856,
+ -0.16267823680589033,
+ -0.16114932384494995,
+ -0.1441251338757702,
+ -0.13334894593545255,
+ -0.14545047004151146,
+ -0.16127215966764452,
+ -0.16839911009668895,
+ -0.15935018521426902,
+ -0.16799284544807602,
+ -0.14672499436713715,
+ -0.136808538213107,
+ -0.13255749415160278,
+ -0.1337233355254842,
+ -0.1329523334890761,
+ -0.13066988351015996,
+ -0.1220216454376798,
+ -0.12031770523036533,
+ -0.1265486881663428,
+ -0.12524315048936419,
+ -0.12185856750640589,
+ -0.11595392794256354,
+ -0.10867754468053159,
+ -0.10733392033646516,
+ -0.10565650556605188,
+ -0.09798013831411101,
+ -0.08620899334539545,
+ -0.07919528530504849,
-0.07871348959379532,
- -0.08820686357638052,
- -0.08728466983530059,
- -0.07360959738021633,
- -0.07955013844515513,
- -0.08322984602959216,
- -0.07798982989311531,
+ -0.08820686357638075,
+ -0.08728466983530048,
+ -0.07360959738021622,
+ -0.07955013844515524,
+ -0.08322984602959238,
+ -0.07798982989311565,
-0.07532902835701871,
-0.0869816193017885,
-0.0850524797747948,
-0.07347036265849705,
- -0.0755515472689392,
- -0.06416757657073613,
- -0.035470018840112694,
- -0.0311550375857349,
- -0.032909108409510335,
- -0.02226765772810002,
- -0.036814264006837405,
- -0.05067438662421209,
- -0.0535020704229926,
- -0.0381507422320293,
+ -0.07555154726893942,
+ -0.06416757657073624,
+ -0.03547001884011258,
+ -0.03115503758573479,
+ -0.03290910840951,
+ -0.022267657728099688,
+ -0.036814264006837294,
+ -0.050674386624211976,
+ -0.05350207042299249,
+ -0.03815074223202919,
-0.03019552968937078,
- -0.017187309821701247,
- -0.004523585743421377,
- -5.590572539682093e-06,
+ -0.017187309821701136,
+ -0.004523585743421266,
+ -5.59057253957107e-06,
0.0,
-0.0044354707928234705,
0.0,
- -0.011913708998478212,
- -0.01660520325935022,
- -0.026305349463374816,
+ -0.011913708998478434,
+ -0.016605203259350443,
+ -0.02630534946337504,
-0.015165324786184153,
- -0.02826132121984004,
- -0.041638142981671455,
- -0.055829086054778876,
- -0.0581828432876329,
- -0.07011385041664964,
- -0.06643261717510074,
- -0.06439237782295681,
+ -0.028261321219840152,
+ -0.041638142981671566,
+ -0.055829086054778765,
+ -0.05818284328763301,
+ -0.07011385041664953,
+ -0.06643261717510085,
+ -0.06439237782295659,
-0.050353341666007134,
-0.07052825406752106,
- -0.06328249662770535,
- -0.06215152393226375,
- -0.06271741121694097,
- -0.0446292725427796,
- -0.052138332569863555,
- -0.0628079582666331,
- -0.05275213434911297,
- -0.04189016801420442,
- -0.05007081374107791,
- -0.04966068224283571,
- -0.04006413574047163,
- -0.026977301890563132,
- -0.031116489758780785,
- -0.02657168806270427,
- -0.053394855796884966,
- -0.0664162182183512,
- -0.05803223710292427,
- -0.06193939496236023,
- -0.05407643204190138,
- -0.049383392111301494,
- -0.06119573105845533,
- -0.05257698717380377,
- -0.049343282776351804,
- -0.06647314399794846,
- -0.07571845455484394,
- -0.07005407736462754,
- -0.07834097362528902,
- -0.08291282044613157,
- -0.07630115871468934,
- -0.07493035174169083,
- -0.07117021764740994,
- -0.08233911545343331,
- -0.07746523903835845,
- -0.07252702200472116,
- -0.07015948072645184,
- -0.08132580487515484,
- -0.09237916595901763,
- -0.08417000770823202,
- -0.09005603152047226,
- -0.0831676066368301,
- -0.08100182858014648,
- -0.08965741611220912,
- -0.07697963693746745,
- -0.05815554107482179,
- -0.04327943599465767,
- -0.039931630986097644,
- -0.031030166539016135,
- -0.03351630115563653,
- -0.024731969778659768,
- -0.032122342124411785,
- -0.023617597287498904,
- -0.011948774799108164,
- -0.010098322218733746,
+ -0.06328249662770558,
+ -0.062151523932263975,
+ -0.06271741121694119,
+ -0.04462927254277982,
+ -0.052138332569863666,
+ -0.06280795826663332,
+ -0.05275213434911319,
+ -0.041890168014204754,
+ -0.050070813741078135,
+ -0.049660682242836374,
+ -0.040064135740472295,
+ -0.02697730189056402,
+ -0.031116489758781563,
+ -0.026571688062704935,
+ -0.05339485579688574,
+ -0.06641621821835186,
+ -0.05803223710292482,
+ -0.061939394962360894,
+ -0.054076432041901934,
+ -0.04938339211130216,
+ -0.061195731058456104,
+ -0.05257698717380477,
+ -0.049343282776352804,
+ -0.06647314399794935,
+ -0.07571845455484483,
+ -0.07005407736462854,
+ -0.07834097362529002,
+ -0.08291282044613257,
+ -0.07630115871469034,
+ -0.07493035174169183,
+ -0.07117021764741116,
+ -0.08233911545343453,
+ -0.07746523903835978,
+ -0.0725270220047225,
+ -0.07015948072645295,
+ -0.08132580487515595,
+ -0.09237916595901852,
+ -0.08417000770823291,
+ -0.09005603152047326,
+ -0.0831676066368312,
+ -0.08100182858014748,
+ -0.0896574161122099,
+ -0.07697963693746823,
+ -0.05815554107482257,
+ -0.043279435994658444,
+ -0.03993163098609842,
+ -0.031030166539016912,
+ -0.033516301155637196,
+ -0.024731969778660656,
+ -0.03212234212441256,
+ -0.023617597287499792,
+ -0.011948774799109052,
+ -0.010098322218734967,
0.0,
0.0,
0.0,
@@ -3959,134 +3959,134 @@
0.0,
0.0,
-0.02182690421954192,
- -0.02986990856208549,
- -0.04485595299452927,
- -0.05003357146119436,
- -0.04140379697642271,
- -0.037212876247561866,
- -0.04777898061581398,
- -0.04352918446900789,
- -0.03240904440770154,
- -0.009207065042143303,
- -0.01260402133490357,
- -0.009834558874683652,
- -0.01860862258081364,
- -0.01544703598831565,
- -0.0019812216087630174,
- -0.000851154349016503,
+ -0.029869908562085934,
+ -0.04485595299452949,
+ -0.050033571461195026,
+ -0.041403796976422935,
+ -0.03721287624756209,
+ -0.04777898061581465,
+ -0.04352918446900855,
+ -0.03240904440770209,
+ -0.00920706504214397,
+ -0.012604021334904236,
+ -0.009834558874684207,
+ -0.018608622580814083,
+ -0.01544703598831676,
+ -0.0019812216087637946,
+ -0.0008511543490173912,
0.0,
-0.009725330722329284,
-0.011185103630020787,
- -0.004435725636641741,
+ -0.004435725636641852,
0.0,
- -0.00922885519580674,
+ -0.009228855195806629,
-0.01250459736425491,
- -0.029778971760223594,
- -0.008679878025225851,
+ -0.029778971760223705,
+ -0.008679878025225629,
0.0,
0.0,
- -0.001803837414103504,
+ -0.0018038374141037261,
0.0,
0.0,
0.0,
- -0.010841487260801141,
- -0.031579015316706815,
- -0.019854071466294476,
- -0.024215203647926842,
- -0.026811602949552316,
- -0.019461293614390418,
- -0.039857851648122056,
- -0.04671580526973873,
- -0.040826580212987906,
- -0.03897754943528431,
- -0.04770892144188388,
- -0.02752923935768059,
- -0.02057722480228097,
- -0.02793076071640299,
+ -0.010841487260801252,
+ -0.03157901531670726,
+ -0.019854071466295142,
+ -0.024215203647927175,
+ -0.02681160294955298,
+ -0.019461293614390862,
+ -0.03985785164812228,
+ -0.046715805269739175,
+ -0.04082658021298824,
+ -0.03897754943528475,
+ -0.04770892144188432,
+ -0.027529239357681035,
+ -0.020577224802281413,
+ -0.027930760716403102,
-0.0179639718509923,
- -0.025170034769006255,
- -0.027749526203814656,
- -0.025636067512982752,
- -0.027545803253761103,
+ -0.025170034769006033,
+ -0.027749526203814767,
+ -0.02563606751298253,
+ -0.027545803253761214,
-0.023673469009827253,
- -0.028876912045590064,
- -0.031372655527207804,
- -0.04563704530877655,
+ -0.028876912045590175,
+ -0.03137265552720769,
+ -0.04563704530877666,
-0.051236415467974195,
- -0.05259622126289487,
- -0.04543278926775607,
- -0.04787830980411478,
- -0.048044368511814595,
- -0.055604028774758896,
- -0.0685222764773945,
- -0.06202574551064077,
- -0.05568874840212623,
- -0.05113968008997183,
+ -0.05259622126289498,
+ -0.04543278926775596,
+ -0.04787830980411445,
+ -0.04804436851181437,
+ -0.055604028774758674,
+ -0.06852227647739462,
+ -0.062025745510640884,
+ -0.05568874840212634,
+ -0.05113968008997172,
-0.056610998005232505,
- -0.04747561544675227,
- -0.029604839186038623,
- -0.03709249014062921,
- -0.040212756328642185,
- -0.04540557645261156,
- -0.05082025830554493,
- -0.04835333069408654,
- -0.053447625023722356,
- -0.06689702232784211,
- -0.0663817369646248,
- -0.06961049407411213,
- -0.06507064815976327,
- -0.06867397230558625,
- -0.057814882762951325,
- -0.04506071261981248,
- -0.044320837867770524,
- -0.033242086066034404,
- -0.03328714032051183,
- -0.021237601464447198,
- -0.029687465010377112,
- -0.027011676832602416,
- -0.029330760574518222,
- -0.0365586075463995,
+ -0.04747561544675216,
+ -0.029604839186038845,
+ -0.03709249014062965,
+ -0.04021275632864241,
+ -0.04540557645261167,
+ -0.050820258305545374,
+ -0.04835333069408698,
+ -0.05344762502372269,
+ -0.06689702232784267,
+ -0.06638173696462546,
+ -0.0696104940741128,
+ -0.06507064815976393,
+ -0.0686739723055868,
+ -0.05781488276295199,
+ -0.045060712619812926,
+ -0.04432083786777108,
+ -0.033242086066034626,
+ -0.033287140320512276,
+ -0.02123760146444742,
+ -0.029687465010377556,
+ -0.027011676832602527,
+ -0.02933076057451811,
+ -0.036558607546399724,
-0.03680973998092951,
- -0.031802884132294484,
+ -0.03180288413229482,
-0.035195163576272503,
- -0.01956391852402417,
- -0.016415332758865753,
- -0.021986320469861487,
- -0.02208414307368356,
- -0.02458097527461467,
+ -0.019563918524024615,
+ -0.016415332758866308,
+ -0.02198632046986171,
+ -0.022084143073683782,
+ -0.024580975274614558,
-0.03481649928927566,
- -0.026930028488210023,
- -0.029812136337242667,
+ -0.02693002848820991,
+ -0.02981213633724289,
-0.02143568160521836,
-0.02264665113732356,
- -0.02366898939224682,
+ -0.02366898939224671,
-0.011729198158075271,
0.0,
0.0,
0.0,
- -0.008176719152386158,
+ -0.008176719152386047,
-0.014719314271825601,
0.0,
- -0.005145819170919719,
- -0.01054515584426996,
+ -0.00514581917091983,
+ -0.010545155844269738,
-0.010900904687347501,
- -0.02020484582759885,
+ -0.02020484582759896,
0.0,
- -0.0004484122725225692,
- -0.011112819094150628,
- -0.016316072997552222,
- -0.022246739659902537,
+ -0.0004484122725230133,
+ -0.01111281909415096,
+ -0.016316072997552666,
+ -0.022246739659902426,
-0.016072262632710888,
- -0.019627196900010913,
+ -0.019627196900011135,
-0.036233445535702735,
- -0.03920637896688184,
+ -0.03920637896688128,
-0.02760299574491276,
-0.00808670461740213,
- -0.009637797739094123,
+ -0.009637797739094012,
-0.015309272438777444,
-0.018585803108376875,
-0.006874178183342128,
- -0.020474194283763736
+ -0.020474194283763514
],
"borderColor": "#2ecc71",
"backgroundColor": "rgba(46, 204, 113, 0.1)",
@@ -4130,9 +4130,9 @@
"Dec"
],
"data": {
- "2020-1": -0.06319011653259732,
+ "2020-1": -0.06319011653259754,
"2020-2": -0.034770463169874644,
- "2020-3": -0.06608665843349593,
+ "2020-3": -0.06608665843349637,
"2020-4": 0.015718476502466716,
"2020-5": -0.06088503663475009,
"2020-6": 0.0063897466182143425,
@@ -4153,7 +4153,7 @@
"2021-9": 0.0570838672255527,
"2021-10": -0.07206915715373297,
"2021-11": -0.02559077024083445,
- "2021-12": 0.03930491963685201,
+ "2021-12": 0.03930491963685179,
"2022-1": 0.06718726423981458,
"2022-2": 0.11433556708413439,
"2022-3": 0.08346616417358366,
@@ -4166,16 +4166,16 @@
"2022-10": -0.0004392659482208572,
"2022-11": 0.03322272131884563,
"2022-12": 0.05088900643743055,
- "2023-1": 0.05922207366085819,
- "2023-2": 0.010978789635499364,
- "2023-3": -0.05182182851256667,
- "2023-4": 0.11361914811463492,
- "2023-5": 0.03954753292160995,
+ "2023-1": 0.059222073660858854,
+ "2023-2": 0.010978789635498698,
+ "2023-3": -0.051821828512567,
+ "2023-4": 0.11361914811463514,
+ "2023-5": 0.03954753292160884,
"2023-6": 0.022784670103060733,
- "2023-7": -0.008379609071131,
- "2023-8": 0.030368240896207377,
- "2023-9": 0.04266918624716998,
- "2023-10": -0.006574875573456707
+ "2023-7": -0.00837960907113,
+ "2023-8": 0.03036824089620782,
+ "2023-9": 0.0426691862471702,
+ "2023-10": -0.006574875573457484
}
},
"config": {},
@@ -5319,446 +5319,446 @@
null,
null,
null,
- -47.39984325241671,
- -47.27985073197235,
- -47.01737779185457,
- -46.46869947427751,
- -46.64034281658469,
- -46.639562771160435,
- -46.10024472543196,
- -45.73646649940165,
- -45.57840525216609,
- -45.57334212108233,
- -45.054003237045755,
- -44.88592230653748,
- -44.692356361409836,
- -44.658456946865904,
- -44.11034090235202,
- -44.08886236012681,
- -44.13286084505862,
- -43.840834594575064,
- -44.02551070925105,
- -43.76296744505657,
- -43.78204766358,
- -44.43821290528709,
- -44.43604524007909,
- -44.589542145106435,
- -44.471449457860125,
- -43.76366200106879,
- -43.738460502681804,
- -43.88239857406071,
- -43.76196414816617,
- -43.863746734410135,
- -43.45350255809025,
- -43.519371031103695,
+ -47.39984325241674,
+ -47.27985073197239,
+ -47.0173777918546,
+ -46.46869947427755,
+ -46.64034281658473,
+ -46.63956277116046,
+ -46.100244725432,
+ -45.736466499401686,
+ -45.57840525216613,
+ -45.57334212108236,
+ -45.054003237045784,
+ -44.8859223065375,
+ -44.69235636140986,
+ -44.65845694686593,
+ -44.11034090235204,
+ -44.08886236012684,
+ -44.13286084505865,
+ -43.840834594575085,
+ -44.02551070925108,
+ -43.762967445056596,
+ -43.78204766358002,
+ -44.43821290528711,
+ -44.436045240079096,
+ -44.589542145106456,
+ -44.471449457860146,
+ -43.763662001068816,
+ -43.73846050268184,
+ -43.88239857406074,
+ -43.76196414816619,
+ -43.86374673441014,
+ -43.45350255809027,
+ -43.5193710311037,
-44.29305539569671,
- -44.6525730879257,
+ -44.65257308792571,
-44.87822947926211,
- -45.06181758048483,
- -45.06589630723667,
+ -45.06181758048484,
+ -45.06589630723666,
-44.898175681940074,
- -44.93084383464244,
- -44.99746148401625,
+ -44.93084383464243,
+ -44.997461484016235,
-44.905796251712026,
- -44.89470982472417,
+ -44.89470982472416,
-44.906201145159976,
-44.44945151842589,
-45.44359818615088,
- -45.66986785351638,
- -47.029494604783665,
- -47.02813313312257,
- -47.78057568859948,
- -47.82610344370386,
- -47.82904921774291,
- -47.48082226050117,
- -47.76280578353858,
- -47.65510297422347,
- -47.354070966459226,
- -48.96535680376554,
- -50.37404625317337,
- -50.42145936513741,
- -50.43941854171039,
- -50.4386530806616,
- -50.666190137327796,
- -51.38355491647,
- -51.04383323794095,
+ -45.66986785351637,
+ -47.02949460478363,
+ -47.02813313312256,
+ -47.78057568859944,
+ -47.82610344370382,
+ -47.829049217742885,
+ -47.48082226050114,
+ -47.762805783538546,
+ -47.65510297422343,
+ -47.354070966459204,
+ -48.965356803765516,
+ -50.37404625317334,
+ -50.42145936513736,
+ -50.439418541710346,
+ -50.43865308066158,
+ -50.66619013732778,
+ -51.38355491646998,
+ -51.04383323794093,
-51.30825964940644,
- -49.4038976653099,
- -50.444308103459825,
- -50.16763458678886,
- -50.51415797333046,
- -50.30092193537733,
- -50.02468512647869,
- -50.055238728680884,
- -49.78336693417707,
- -49.980501208315964,
- -49.89035373669542,
- -49.772176465292425,
- -49.72633839183533,
- -49.879238214869176,
- -49.990592327314324,
- -49.9598957084176,
- -49.718722616387794,
- -49.96662347937753,
- -50.088705049077205,
- -50.17663200188364,
- -49.88351722849617,
- -49.81584143373547,
- -49.83526106515239,
- -49.61043266278192,
- -49.43896460076584,
- -49.469427042964654,
- -49.509185303773606,
- -49.159232129718795,
- -48.70730260308604,
- -47.36138247678202,
- -47.413987782176164,
- -47.724945218803136,
- -47.6270710351593,
- -47.61282151495316,
- -47.943621418930405,
- -48.36977390599741,
- -48.37485106866167,
- -48.56721778260087,
- -48.5825350583198,
- -48.79836776289503,
- -48.53781227791402,
- -48.533974991011064,
- -48.72220139352249,
- -48.54382119308119,
- -48.9427411766193,
- -48.9372078147306,
- -48.89550093714436,
- -48.97570794727586,
- -48.330476754903806,
- -48.55234854803985,
- -48.52821978255037,
- -48.259820515652756,
- -48.32445669433152,
- -48.312187827539,
- -49.3282075790968,
- -49.39308281193249,
- -49.49787436779095,
- -49.51171223040554,
- -49.39582675935796,
- -46.41789063134425,
- -46.283562295756084,
- -46.7435754122952,
- -46.12072075674354,
- -45.8992038004055,
- -45.94663381227005,
- -45.908788437308466,
- -45.86609572000514,
- -45.81889902621962,
- -45.38064523517615,
- -45.70452116664303,
- -46.0178617866094,
- -45.5236997322161,
- -44.681351535711606,
- -45.1967461617885,
- -45.509051332782434,
- -45.812264542510626,
- -45.96651611125888,
- -46.704064526115786,
- -46.52427401725146,
- -46.215226615255524,
- -46.507196327611815,
- -46.27324372214485,
- -46.47510931057414,
- -46.472060993903646,
- -46.17404263842438,
- -46.11074375754026,
- -45.61756165491733,
- -45.72718391662124,
- -46.522953461004995,
- -46.00898777055701,
- -46.0147645815571,
- -44.76062542578035,
- -44.40513968901,
- -44.817286410653146,
- -44.95207068800079,
- -44.895402176942994,
- -44.77975028129813,
- -44.78714813702242,
- -44.27982367345334,
- -44.08997157820155,
- -44.24675980465832,
- -44.252257693293345,
- -44.220298776603656,
- -44.03728713251562,
- -43.05382467628511,
- -42.021631277412844,
- -42.50199184715477,
- -42.70828788867695,
- -42.88136378254569,
- -42.9153164519858,
- -42.91118967141819,
- -42.89289404922297,
- -42.892472873739834,
- -42.88787515888202,
- -43.07803474957162,
- -43.01813812045069,
- -42.99260579579649,
- -42.704888207105945,
- -41.634086541285726,
- -41.50074010053919,
- -41.43311049557726,
- -41.39432340047387,
- -41.30892599533365,
- -41.50223053738808,
- -41.4221902358505,
- -41.42899065472672,
- -41.35191525575822,
- -42.53800487892743,
- -42.56313969348721,
- -42.718516227150545,
- -42.057728815671894,
- -41.889921480141176,
- -41.99014392407985,
- -41.611798324516876,
- -41.70220084915616,
- -41.71351380770531,
- -41.6041759088787,
- -41.69020980448355,
- -41.66368519735983,
- -41.72225800194041,
- -41.7146359351536,
- -41.7533929343784,
- -41.796226469616414,
- -41.924742569373144,
- -41.82318535514171,
- -41.813861546403444,
- -41.6531270675784,
- -41.70757992888221,
- -41.7348767677185,
- -41.85088610869978,
- -41.899035800291834,
- -41.982210619402615,
- -41.98509615524852,
- -42.1063131867781,
- -41.86326612636135,
- -42.779998124529925,
- -42.68170994358738,
- -42.66948152532122,
- -42.694570999683755,
- -42.70307851183704,
- -42.590663908323364,
- -42.514912301861564,
- -42.598082831623785,
- -42.44428950234348,
- -42.40367404821713,
- -42.19080883842563,
- -42.23935702497268,
- -42.14896985128071,
- -41.07315946899167,
- -41.177118915310125,
- -40.94615064437384,
- -40.75451478813362,
- -40.803857482858916,
- -40.88902548992294,
- -41.54783460255334,
- -41.53789563026269,
- -41.43077018976059,
- -41.651960794486406,
- -41.70116245640977,
- -41.32279583798213,
- -41.20046684119725,
- -40.79785276835147,
- -40.74654427726535,
- -40.713434453023226,
- -40.30590933110546,
- -42.40774178396848,
- -42.55131423178996,
- -41.584011804198326,
- -42.117138730837546,
- -42.370817805666775,
- -42.26097855116571,
- -41.807245586699075,
- -42.046946299391166,
- -42.10667723828914,
- -42.4662677225834,
- -42.42461476987612,
- -42.61162898328736,
- -43.10492071767682,
- -43.79827444748512,
- -43.72923403566365,
- -43.729364833075074,
- -43.788496349892284,
- -43.11074976479541,
- -43.217139392322665,
- -42.858139303875966,
- -43.12676508252799,
- -43.06525985022017,
- -42.56780964471048,
- -42.623973991107135,
- -42.60861517028539,
- -42.851721773092315,
- -42.93127157907674,
- -43.033951098711725,
- -42.69251073400137,
- -42.68532876420359,
- -42.80483076822098,
- -42.6755521094904,
- -43.690852706976074,
- -44.082234250977066,
- -43.98299751163038,
- -43.912391352053554,
- -43.989041840709575,
- -44.06504102556426,
- -43.97158792209462,
- -44.72000724462305,
- -44.88173423292154,
- -44.864263559827336,
- -44.67242226276134,
- -43.74159520027263,
- -43.93208835253276,
- -44.91358839880239,
- -46.12804686286844,
- -45.67030585323435,
- -45.47650486123637,
- -45.46043425049031,
- -45.429629420481895,
- -45.41136487025191,
- -45.34485476835407,
- -45.3146676894006,
- -45.324201619250886,
- -45.46963816769901,
- -45.07875639091737,
- -44.93233127638324,
- -45.34526537830319,
- -46.67972511812615,
- -46.67047182321855,
- -46.83345600072112,
- -46.882903717060756,
- -46.99529740706174,
- -46.96259793984441,
- -46.727763813380754,
- -46.09579781943459,
- -45.77398646685272,
- -45.76241243363631,
- -45.76324060654808,
- -45.846079027363864,
- -46.60136245513039,
- -46.70465475829781,
- -46.390465364311254,
- -46.49524650371475,
- -46.654871910890435,
- -46.45983794536644,
- -46.08565325415802,
- -46.11944432874841,
- -46.02913373655384,
- -46.21909705415507,
- -46.15457666312793,
- -45.98475729397393,
- -46.13614602921802,
- -46.301970960414245,
- -46.40697773127846,
- -46.418887036263435,
- -46.85362789817574,
- -46.830735990423726,
- -46.491576465207665,
- -46.42018454833822,
- -46.164643835579525,
- -45.62320700962588,
- -45.51445564852195,
- -44.99844012513177,
- -45.49619659142145,
- -45.731984137116235,
- -45.26410859499609,
- -45.25858205034436,
- -45.015644686665844,
- -44.73922933320055,
- -44.84308324724903,
- -44.663518687519655,
- -44.66698491972809,
- -44.95241643680251,
- -44.899862915940055,
- -45.01172165590987,
- -44.49870593346014,
- -43.816151841950784,
- -45.10641536756893,
- -44.98144366607723,
- -44.81484429756479,
- -44.87699599985571,
- -44.681541992187576,
- -44.52087864999982,
- -44.52032606333994,
- -44.614975907753,
- -44.86091797661469,
- -44.963022137327755,
- -45.03538385327832,
- -45.47575113454374,
- -45.26429816885558,
- -45.819715598171626,
- -45.86349712788218,
- -45.89792236797918,
- -46.581188704430836,
- -46.52541566616815,
- -46.40608252528024,
- -47.758345934181555,
- -47.69401940639976,
- -47.643003666356016,
- -47.168159301371624,
- -47.98519693212338,
- -47.56178065114382,
- -47.57982734493735,
- -47.47467920873558,
- -46.46883965368615,
- -45.51132565314017,
- -45.53571150659429,
+ -49.40389766530989,
+ -50.444308103459804,
+ -50.167634586788836,
+ -50.514157973330455,
+ -50.30092193537732,
+ -50.024685126478666,
+ -50.05523872868086,
+ -49.78336693417706,
+ -49.98050120831595,
+ -49.89035373669539,
+ -49.77217646529241,
+ -49.72633839183531,
+ -49.87923821486916,
+ -49.9905923273143,
+ -49.959895708417584,
+ -49.71872261638779,
+ -49.96662347937752,
+ -50.088705049077184,
+ -50.17663200188362,
+ -49.883517228496146,
+ -49.815841433735464,
+ -49.83526106515237,
+ -49.610432662781896,
+ -49.43896460076583,
+ -49.46942704296465,
+ -49.50918530377359,
+ -49.15923212971878,
+ -48.70730260308603,
+ -47.361382476782005,
+ -47.41398778217615,
+ -47.724945218803114,
+ -47.62707103515929,
+ -47.612821514953154,
+ -47.94362141893039,
+ -48.3697739059974,
+ -48.37485106866165,
+ -48.567217782600856,
+ -48.582535058319785,
+ -48.79836776289501,
+ -48.537812277914,
+ -48.53397499101105,
+ -48.72220139352247,
+ -48.54382119308117,
+ -48.942741176619286,
+ -48.93720781473057,
+ -48.89550093714434,
+ -48.97570794727584,
+ -48.33047675490379,
+ -48.55234854803984,
+ -48.528219782550366,
+ -48.25982051565275,
+ -48.324456694331516,
+ -48.31218782753899,
+ -49.32820757909678,
+ -49.393082811932466,
+ -49.49787436779094,
+ -49.51171223040553,
+ -49.39582675935793,
+ -46.417890631344235,
+ -46.28356229575608,
+ -46.74357541229519,
+ -46.12072075674352,
+ -45.89920380040548,
+ -45.946633812270036,
+ -45.90878843730846,
+ -45.86609572000513,
+ -45.8188990262196,
+ -45.380645235176125,
+ -45.70452116664301,
+ -46.01786178660937,
+ -45.52369973221607,
+ -44.68135153571158,
+ -45.19674616178847,
+ -45.509051332782406,
+ -45.8122645425106,
+ -45.96651611125886,
+ -46.70406452611576,
+ -46.52427401725143,
+ -46.215226615255496,
+ -46.50719632761179,
+ -46.27324372214483,
+ -46.47510931057412,
+ -46.47206099390362,
+ -46.17404263842436,
+ -46.11074375754024,
+ -45.6175616549173,
+ -45.72718391662123,
+ -46.522953461004974,
+ -46.008987770557,
+ -46.01476458155709,
+ -44.76062542578032,
+ -44.40513968900998,
+ -44.817286410653125,
+ -44.95207068800077,
+ -44.89540217694298,
+ -44.77975028129811,
+ -44.7871481370224,
+ -44.279823673453315,
+ -44.089971578201514,
+ -44.246759804658296,
+ -44.25225769329331,
+ -44.22029877660363,
+ -44.03728713251559,
+ -43.053824676285096,
+ -42.02163127741282,
+ -42.50199184715474,
+ -42.70828788867693,
+ -42.88136378254566,
+ -42.915316451985774,
+ -42.911189671418164,
+ -42.89289404922293,
+ -42.892472873739806,
+ -42.88787515888199,
+ -43.0780347495716,
+ -43.01813812045066,
+ -42.99260579579647,
+ -42.70488820710591,
+ -41.6340865412857,
+ -41.50074010053916,
+ -41.43311049557723,
+ -41.39432340047384,
+ -41.308925995333624,
+ -41.50223053738805,
+ -41.422190235850465,
+ -41.42899065472669,
+ -41.35191525575819,
+ -42.538004878927396,
+ -42.563139693487166,
+ -42.71851622715051,
+ -42.05772881567185,
+ -41.88992148014113,
+ -41.990143924079824,
+ -41.61179832451685,
+ -41.702200849156114,
+ -41.71351380770527,
+ -41.60417590887866,
+ -41.6902098044835,
+ -41.6636851973598,
+ -41.72225800194038,
+ -41.71463593515356,
+ -41.75339293437836,
+ -41.79622646961637,
+ -41.9247425693731,
+ -41.82318535514166,
+ -41.8138615464034,
+ -41.65312706757837,
+ -41.70757992888216,
+ -41.734876767718454,
+ -41.850886108699754,
+ -41.899035800291784,
+ -41.982210619402586,
+ -41.98509615524847,
+ -42.10631318677806,
+ -41.86326612636131,
+ -42.77999812452988,
+ -42.68170994358733,
+ -42.66948152532118,
+ -42.69457099968372,
+ -42.70307851183699,
+ -42.590663908323336,
+ -42.51491230186153,
+ -42.59808283162375,
+ -42.44428950234343,
+ -42.403674048217084,
+ -42.190808838425596,
+ -42.239357024972655,
+ -42.148969851280675,
+ -41.073159468991626,
+ -41.17711891531008,
+ -40.946150644373795,
+ -40.754514788133584,
+ -40.80385748285888,
+ -40.8890254899229,
+ -41.547834602553294,
+ -41.537895630262646,
+ -41.43077018976056,
+ -41.65196079448637,
+ -41.70116245640972,
+ -41.32279583798209,
+ -41.20046684119721,
+ -40.797852768351426,
+ -40.7465442772653,
+ -40.71343445302318,
+ -40.305909331105426,
+ -42.40774178396845,
+ -42.551314231789924,
+ -41.58401180419828,
+ -42.117138730837496,
+ -42.37081780566672,
+ -42.26097855116565,
+ -41.807245586699025,
+ -42.04694629939112,
+ -42.10667723828909,
+ -42.46626772258336,
+ -42.42461476987609,
+ -42.61162898328732,
+ -43.10492071767678,
+ -43.79827444748506,
+ -43.72923403566361,
+ -43.729364833075046,
+ -43.78849634989224,
+ -43.110749764795365,
+ -43.217139392322615,
+ -42.85813930387592,
+ -43.126765082527946,
+ -43.06525985022014,
+ -42.567809644710444,
+ -42.62397399110709,
+ -42.608615170285354,
+ -42.85172177309226,
+ -42.93127157907669,
+ -43.03395109871167,
+ -42.69251073400133,
+ -42.68532876420355,
+ -42.80483076822094,
+ -42.675552109490354,
+ -43.69085270697603,
+ -44.08223425097701,
+ -43.98299751163033,
+ -43.912391352053504,
+ -43.989041840709525,
+ -44.065041025564206,
+ -43.97158792209456,
+ -44.720007244623,
+ -44.88173423292148,
+ -44.864263559827286,
+ -44.6724222627613,
+ -43.741595200272585,
+ -43.932088352532716,
+ -44.91358839880233,
+ -46.12804686286837,
+ -45.67030585323429,
+ -45.47650486123632,
+ -45.46043425049026,
+ -45.42962942048185,
+ -45.41136487025185,
+ -45.34485476835402,
+ -45.31466768940055,
+ -45.324201619250836,
+ -45.46963816769895,
+ -45.07875639091732,
+ -44.93233127638319,
+ -45.345265378303125,
+ -46.679725118126086,
+ -46.6704718232185,
+ -46.83345600072106,
+ -46.88290371706069,
+ -46.995297407061685,
+ -46.96259793984434,
+ -46.7277638133807,
+ -46.09579781943454,
+ -45.77398646685267,
+ -45.76241243363625,
+ -45.76324060654803,
+ -45.84607902736381,
+ -46.601362455130335,
+ -46.70465475829775,
+ -46.39046536431119,
+ -46.495246503714704,
+ -46.65487191089037,
+ -46.459837945366374,
+ -46.08565325415797,
+ -46.119444328748344,
+ -46.02913373655378,
+ -46.219097054155014,
+ -46.15457666312788,
+ -45.984757293973864,
+ -46.13614602921797,
+ -46.3019709604142,
+ -46.40697773127841,
+ -46.41888703626337,
+ -46.85362789817567,
+ -46.83073599042366,
+ -46.4915764652076,
+ -46.42018454833816,
+ -46.16464383557947,
+ -45.623207009625816,
+ -45.5144556485219,
+ -44.99844012513173,
+ -45.4961965914214,
+ -45.73198413711618,
+ -45.26410859499604,
+ -45.2585820503443,
+ -45.0156446866658,
+ -44.739229333200505,
+ -44.843083247248984,
+ -44.66351868751961,
+ -44.66698491972803,
+ -44.952416436802466,
+ -44.89986291593999,
+ -45.011721655909824,
+ -44.49870593346008,
+ -43.816151841950735,
+ -45.106415367568886,
+ -44.98144366607718,
+ -44.81484429756474,
+ -44.87699599985566,
+ -44.68154199218753,
+ -44.520878649999766,
+ -44.520326063339894,
+ -44.61497590775295,
+ -44.86091797661463,
+ -44.963022137327705,
+ -45.03538385327828,
+ -45.475751134543685,
+ -45.26429816885554,
+ -45.819715598171584,
+ -45.86349712788213,
+ -45.89792236797911,
+ -46.58118870443077,
+ -46.52541566616809,
+ -46.40608252528018,
+ -47.7583459341815,
+ -47.694019406399704,
+ -47.643003666355966,
+ -47.1681593013716,
+ -47.98519693212335,
+ -47.561780651143806,
+ -47.57982734493733,
+ -47.47467920873557,
+ -46.468839653686125,
+ -45.511325653140155,
+ -45.535711506594275,
-45.587024790571036,
-45.679529296587745,
- -45.08484992060888,
- -44.95571449352894,
- -45.65974287699725,
- -45.674848965258086,
- -46.425657369761225,
- -46.321876239016774,
- -46.222246300542736,
- -46.61073565145115,
- -46.61668972682826,
+ -45.08484992060887,
+ -44.95571449352893,
+ -45.659742876997235,
+ -45.67484896525807,
+ -46.42565736976121,
+ -46.32187623901677,
+ -46.22224630054272,
+ -46.610735651451144,
+ -46.616689726828255,
-46.69138898316569,
-46.588419564877675,
- -46.481596120312744,
+ -46.48159612031274,
-46.72051894062572,
- -47.15394160931306,
- -46.2816596213053,
- -45.3619059561934,
+ -47.153941609313044,
+ -46.28165962130529,
+ -45.36190595619338,
-44.81751626038014,
- -45.03858420464847,
+ -45.03858420464848,
-44.959959024138435,
- -45.00281651568625,
- -44.592014535482605,
+ -45.00281651568624,
+ -44.5920145354826,
-44.51165654311959,
- -44.528705471713494,
- -44.13296108897732,
- -44.143817114055636,
- -44.19431575882676,
- -44.22472086324186,
- -44.426483446712005,
- -45.204566038371325,
- -45.306514600826056,
- -45.190676624276605,
+ -44.52870547171349,
+ -44.13296108897731,
+ -44.143817114055615,
+ -44.194315758826754,
+ -44.224720863241856,
+ -44.426483446712,
+ -45.20456603837132,
+ -45.30651460082605,
+ -45.19067662427661,
-44.89177004150835,
-44.73351887674124,
- -44.70992560868683,
- -43.484589568970975,
- -43.476501052389104,
+ -44.70992560868682,
+ -43.48458956897098,
+ -43.4765010523891,
-43.44791214384768,
-43.628484557149264,
- -43.53408375790696,
- -43.37294225517441,
+ -43.534083757906956,
+ -43.3729422551744,
-43.201865544871346,
-43.39445422760965,
-43.56533780732282,
-43.21985828465908,
- -43.22744230656427,
- -43.31280690349751,
+ -43.22744230656428,
+ -43.3128069034975,
-42.98872138104202,
- -42.991857272647906,
- -42.80066172703802,
+ -42.99185727264791,
+ -42.800661727038026,
-42.393109170026555,
- -41.19194126518373,
+ -41.191941265183736,
-41.89360478043088,
-42.204545472215415,
-42.20208514003651,
@@ -5767,432 +5767,432 @@
-41.85263371083348,
-41.89091692593308,
-41.95748449451604,
- -42.20677612276606,
- -41.183975818707005,
+ -42.20677612276605,
+ -41.18397581870701,
-41.292545191776334,
- -41.400272890174094,
+ -41.40027289017409,
-41.48808918304961,
-41.43187606177071,
- -41.44554217631824,
+ -41.445542176318234,
-41.139973567426544,
- -41.266894878650724,
- -40.89736826531138,
- -40.88938740129759,
+ -41.26689487865073,
+ -40.897368265311385,
+ -40.88938740129758,
-40.81974068761446,
- -40.82681613063418,
- -40.722991729073954,
- -40.701484854000064,
- -40.87720663430996,
+ -40.82681613063417,
+ -40.72299172907395,
+ -40.70148485400006,
+ -40.87720663430995,
-40.85417091421293,
- -40.9909849694776,
+ -40.990984969477594,
-41.50175337007495,
-41.70677757374956,
- -41.53831309978723,
+ -41.53831309978724,
-41.59489981801598,
- -41.5985079472006,
- -42.36776552651507,
- -42.259834265197014,
+ -41.59850794720061,
+ -42.367765526515065,
+ -42.25983426519701,
-41.864877044059874,
- -42.073964033166554,
+ -42.07396403316655,
-41.76738935833998,
-42.027912108941536,
- -41.59433411113219,
- -41.54781061866711,
+ -41.594334111132184,
+ -41.5478106186671,
-41.31608215658822,
- -40.728544907917986,
+ -40.72854490791798,
-41.19527684600463,
-41.7961233185855,
- -41.36393690068169,
- -41.13389217787931,
+ -41.3639369006817,
+ -41.13389217787932,
-40.74451836114012,
- -40.9151730182358,
+ -40.91517301823579,
-41.08430825255962,
-41.18087472960117,
- -40.97568011145429,
+ -40.97568011145428,
-40.989604632493965,
- -40.57837547809401,
+ -40.57837547809402,
-40.55766961249439,
-40.46599411256055,
- -40.39209970547978,
- -40.88958854115181,
+ -40.39209970547977,
+ -40.8895885411518,
-40.777582530640075,
-40.8472027309967,
-40.803350513810855,
- -40.55204537060705,
+ -40.552045370607054,
-40.554944962260095,
- -40.19363949678382,
- -40.070045430769504,
- -40.18522583472992,
- -40.10480263388929,
- -40.53347203836316,
- -40.3679035496128,
- -40.61054742942594,
- -40.34901205557951,
- -40.30882477906183,
- -41.212284388819405,
- -41.08167320311966,
- -41.129720583232455,
- -41.04687808953681,
- -41.061041565760135,
- -41.259854148953146,
- -41.21524950845933,
- -40.932136751297996,
- -40.70907474830598,
- -39.60948237296406,
- -39.52278175039994,
- -39.53672962028875,
- -39.734469341320924,
- -39.73417454936947,
- -39.598542892621325,
- -39.582714643781195,
- -39.654963457350874,
- -39.728429506881405,
- -39.62716030885311,
- -40.15354499997205,
- -40.82887411790412,
- -41.19038783369999,
- -41.11498850619212,
- -40.872577276272295,
- -40.85665629818903,
- -41.19839559079489,
- -41.199684356840564,
- -40.90548175542956,
- -41.25335247670095,
- -41.30935725079218,
- -41.35030932290129,
- -41.30115583852202,
- -40.662096192318316,
- -40.71821810984539,
- -40.352790751065996,
- -40.48857920306174,
- -39.038241347010896,
- -39.10703747770835,
- -39.20487925640765,
- -40.17734064168914,
- -40.193875922583175,
- -40.22510194053463,
- -40.20390481597059,
- -40.327297810881106,
- -40.44554973798669,
- -40.57729059670748,
- -40.59011574516365,
- -40.27296396716396,
- -40.259192568675836,
- -39.94879466658464,
- -39.8885259233847,
- -40.0742214941032,
- -40.03585263763779,
- -40.25032418889346,
- -40.47808522010875,
- -41.7062190033879,
- -41.717237034140645,
- -41.527855127938324,
- -41.45054943877827,
- -41.722501796781025,
- -41.75449775369638,
- -41.638176880490214,
- -41.89603425430358,
- -42.09414726389755,
- -42.16374052078004,
- -43.11647589178894,
- -43.0539429588223,
- -43.23885174809314,
- -43.03681913526729,
- -43.202675046942325,
- -43.21563899806898,
- -43.537908832104584,
- -43.36986281866425,
- -43.799752923268805,
- -43.796880168979754,
- -43.59528470559877,
- -43.33368788374619,
- -43.354645557555955,
- -42.82995911105415,
- -42.46161967408114,
- -42.33237686022589,
- -42.32355844876622,
- -42.366083727545096,
- -42.36671775411652,
- -42.76550069673355,
- -42.632843075966534,
- -42.61050407387431,
- -42.41369945731343,
- -42.12522591456009,
- -42.697288276258334,
- -42.69756658806329,
- -42.93806871349705,
- -42.778459662771304,
- -43.336383227749025,
- -43.136250568110555,
- -42.43993320175078,
- -43.119116700727076,
- -43.096877501608056,
- -43.165654473880025,
- -43.0787549291745,
- -43.4021830988713,
- -44.11360187602157,
- -43.76711426203899,
- -43.777226775482234,
- -43.60105164733228,
- -43.74885061749858,
- -43.74221458699811,
- -44.27054005540678,
- -44.294271948843836,
- -44.40515818390703,
- -43.56880747231182,
- -43.13052276828717,
- -43.12638501511285,
- -42.842337331811116,
- -42.90268123496529,
- -42.7232356491056,
- -42.80288268272473,
- -42.08279829607403,
- -41.791142714051546,
- -41.681453389737136,
- -41.7562340020613,
- -41.91249689755856,
- -42.11704534444846,
- -42.08477638959313,
- -42.43472267889249,
- -42.456515337102154,
- -42.41867029009528,
- -43.262126158029325,
- -43.14073892141879,
- -43.050257453162466,
- -43.03352992455931,
- -43.287880392606425,
- -43.227158536111126,
- -43.164269163094005,
- -43.26609895367135,
- -44.64079131808283,
- -44.83488675637461,
- -44.930471304902476,
- -44.41749949422998,
- -44.426110965342026,
- -44.67240576407425,
- -44.54632895009039,
- -44.479302815025754,
- -44.325912287484435,
- -44.37294472163574,
- -43.96744679198958,
- -44.36687347528282,
- -44.127675747630505,
- -42.26407218661231,
- -42.4004111124968,
- -42.49271778000831,
- -42.16524012238819,
- -42.005858927585344,
- -42.066459944763565,
- -42.1838486259667,
- -41.580114774966894,
- -41.38181200231138,
- -41.03042956058327,
- -41.29299259650865,
- -41.31505253944656,
- -41.46866392504106,
- -41.46310576809921,
- -42.8002597175207,
- -43.135004100844604,
- -43.167386253564715,
- -43.06663521727571,
- -42.7298561140452,
- -42.526938690737296,
- -42.378064310034915,
- -42.16612880952958,
- -42.20201744358183,
- -42.087071262745305,
- -42.12366444797121,
- -42.4360473679011,
- -42.350480079466024,
- -42.18291052786511,
- -42.106918812199865,
- -42.20057092786136,
- -42.272209447626494,
- -41.465088403403556,
- -41.52042879176279,
- -41.589946758429164,
- -41.29346369133216,
- -41.17670049067488,
- -41.2063018350919,
- -41.21661494880464,
- -41.04203709198502,
- -40.764803596295785,
- -40.766454516019415,
+ -40.1936394967838,
+ -40.0700454307695,
+ -40.18522583472991,
+ -40.10480263388928,
+ -40.53347203836313,
+ -40.36790354961278,
+ -40.6105474294259,
+ -40.349012055579465,
+ -40.30882477906179,
+ -41.21228438881938,
+ -41.08167320311962,
+ -41.12972058323241,
+ -41.04687808953677,
+ -41.06104156576009,
+ -41.259854148953096,
+ -41.21524950845929,
+ -40.93213675129795,
+ -40.709074748305945,
+ -39.60948237296402,
+ -39.5227817503999,
+ -39.53672962028872,
+ -39.73446934132089,
+ -39.73417454936944,
+ -39.59854289262129,
+ -39.58271464378115,
+ -39.65496345735084,
+ -39.72842950688136,
+ -39.62716030885307,
+ -40.15354499997202,
+ -40.828874117904085,
+ -41.19038783369995,
+ -41.114988506192084,
+ -40.87257727627226,
+ -40.85665629818901,
+ -41.19839559079485,
+ -41.199684356840535,
+ -40.905481755429534,
+ -41.25335247670092,
+ -41.309357250792154,
+ -41.35030932290125,
+ -41.301155838521986,
+ -40.662096192318295,
+ -40.718218109845346,
+ -40.35279075106596,
+ -40.48857920306171,
+ -39.038241347010874,
+ -39.107037477708325,
+ -39.20487925640762,
+ -40.17734064168911,
+ -40.19387592258316,
+ -40.2251019405346,
+ -40.20390481597056,
+ -40.327297810881085,
+ -40.44554973798667,
+ -40.577290596707456,
+ -40.59011574516364,
+ -40.27296396716393,
+ -40.259192568675815,
+ -39.94879466658462,
+ -39.88852592338468,
+ -40.07422149410318,
+ -40.03585263763777,
+ -40.25032418889343,
+ -40.47808522010873,
+ -41.70621900338788,
+ -41.71723703414062,
+ -41.527855127938295,
+ -41.45054943877823,
+ -41.72250179678099,
+ -41.75449775369634,
+ -41.63817688049018,
+ -41.896034254303544,
+ -42.09414726389751,
+ -42.16374052078001,
+ -43.11647589178891,
+ -43.053942958822255,
+ -43.238851748093104,
+ -43.03681913526725,
+ -43.202675046942296,
+ -43.21563899806897,
+ -43.537908832104556,
+ -43.36986281866423,
+ -43.79975292326878,
+ -43.796880168979726,
+ -43.59528470559874,
+ -43.333687883746165,
+ -43.35464555755593,
+ -42.82995911105414,
+ -42.46161967408111,
+ -42.33237686022587,
+ -42.32355844876621,
+ -42.366083727545075,
+ -42.36671775411651,
+ -42.765500696733525,
+ -42.63284307596652,
+ -42.61050407387429,
+ -42.413699457313406,
+ -42.12522591456007,
+ -42.69728827625831,
+ -42.697566588063275,
+ -42.93806871349703,
+ -42.77845966277128,
+ -43.336383227749,
+ -43.13625056811054,
+ -42.43993320175076,
+ -43.119116700727055,
+ -43.09687750160803,
+ -43.165654473880004,
+ -43.07875492917449,
+ -43.40218309887127,
+ -44.113601876021534,
+ -43.767114262038966,
+ -43.77722677548221,
+ -43.601051647332255,
+ -43.748850617498576,
+ -43.742214586998095,
+ -44.270540055406755,
+ -44.29427194884382,
+ -44.405158183907005,
+ -43.5688074723118,
+ -43.13052276828715,
+ -43.12638501511283,
+ -42.8423373318111,
+ -42.90268123496528,
+ -42.72323564910558,
+ -42.80288268272472,
+ -42.08279829607402,
+ -41.79114271405153,
+ -41.68145338973713,
+ -41.75623400206128,
+ -41.91249689755855,
+ -42.11704534444844,
+ -42.08477638959311,
+ -42.43472267889246,
+ -42.45651533710213,
+ -42.41867029009526,
+ -43.262126158029304,
+ -43.14073892141878,
+ -43.050257453162445,
+ -43.03352992455929,
+ -43.28788039260641,
+ -43.22715853611111,
+ -43.16426916309399,
+ -43.26609895367134,
+ -44.64079131808281,
+ -44.834886756374566,
+ -44.93047130490243,
+ -44.41749949422993,
+ -44.42611096534198,
+ -44.672405764074234,
+ -44.54632895009036,
+ -44.479302815025726,
+ -44.3259122874844,
+ -44.37294472163571,
+ -43.96744679198955,
+ -44.366873475282794,
+ -44.12767574763047,
+ -42.26407218661225,
+ -42.400411112496734,
+ -42.49271778000825,
+ -42.165240122388134,
+ -42.00585892758527,
+ -42.06645994476349,
+ -42.183848625966625,
+ -41.58011477496682,
+ -41.38181200231129,
+ -41.03042956058321,
+ -41.29299259650858,
+ -41.31505253944649,
+ -41.46866392504099,
+ -41.46310576809914,
+ -42.80025971752062,
+ -43.13500410084452,
+ -43.167386253564636,
+ -43.06663521727563,
+ -42.72985611404511,
+ -42.52693869073721,
+ -42.37806431003482,
+ -42.16612880952951,
+ -42.20201744358176,
+ -42.08707126274525,
+ -42.12366444797116,
+ -42.43604736790104,
+ -42.35048007946598,
+ -42.18291052786508,
+ -42.10691881219983,
+ -42.20057092786133,
+ -42.272209447626466,
+ -41.46508840340352,
+ -41.52042879176276,
+ -41.58994675842913,
+ -41.29346369133212,
+ -41.176700490674854,
+ -41.206301835091885,
+ -41.216614948804626,
+ -41.042037091985,
+ -40.76480359629578,
+ -40.76645451601941,
-40.67926247395842,
- -39.8142267659288,
- -39.81550120507677,
+ -39.81422676592879,
+ -39.815501205076764,
-39.659819280922285,
-39.8951487572643,
-39.86790191744298,
-39.77005876939145,
-39.663145282037405,
- -39.544185685460455,
+ -39.54418568546047,
-39.61172052484428,
- -39.36192144332903,
- -39.3368457980986,
+ -39.361921443329045,
+ -39.336845798098615,
-39.40662305509801,
-39.61608976514001,
-39.66566342775528,
- -40.03068097849681,
- -40.34384745872581,
- -40.46931529832114,
- -40.43577227625151,
- -40.33329115716194,
- -40.22737310233085,
- -40.267334370762654,
- -40.33550501480789,
- -40.263525377603386,
- -40.24673718774802,
+ -40.03068097849682,
+ -40.34384745872582,
+ -40.46931529832115,
+ -40.43577227625152,
+ -40.333291157161945,
+ -40.22737310233086,
+ -40.26733437076267,
+ -40.335505014807886,
+ -40.26352537760341,
+ -40.246737187748025,
-40.56898856573796,
- -40.425425089234444,
+ -40.42542508923445,
-40.37975142235301,
- -40.434611393873986,
+ -40.43461139387398,
-40.22369465473932,
-39.4465751916708,
- -39.12426398103099,
- -39.92589786202198,
+ -39.124263981030985,
+ -39.925897862021976,
-39.80974839070683,
-39.83186546412003,
- -39.640768729403035,
- -40.10357442361006,
- -39.97604295467204,
+ -39.64076872940304,
+ -40.103574423610084,
+ -39.976042954672046,
-39.663031217039105,
- -39.91788211995389,
- -39.65633441976001,
- -39.593662401134296,
+ -39.917882119953894,
+ -39.65633441976,
+ -39.5936624011343,
-39.345907458579084,
- -38.803070509983705,
- -38.51048070102561,
- -38.40358098741713,
- -37.91836819377449,
- -38.57453051761722,
+ -38.8030705099837,
+ -38.51048070102559,
+ -38.403580987417115,
+ -37.91836819377448,
+ -38.574530517617205,
-38.67627457771305,
- -38.83500921349971,
- -38.99448187955538,
- -38.981187570221074,
- -39.130210951283644,
- -39.14860801223101,
- -40.00757750809748,
- -39.27182883189915,
- -39.34809008835406,
- -39.310236173447485,
- -39.26777553393683,
- -39.25861779719772,
- -39.10678309572493,
- -39.1160509938544,
- -39.02922491002538,
- -38.97710967355735,
- -39.033190581517935,
- -39.03052537843221,
- -38.90610289010333,
+ -38.835009213499696,
+ -38.99448187955536,
+ -38.981187570221046,
+ -39.130210951283615,
+ -39.14860801223097,
+ -40.00757750809743,
+ -39.27182883189913,
+ -39.348090088354034,
+ -39.310236173447464,
+ -39.267775533936806,
+ -39.258617797197715,
+ -39.1067830957249,
+ -39.11605099385439,
+ -39.02922491002537,
+ -38.97710967355733,
+ -39.03319058151793,
+ -39.030525378432195,
+ -38.90610289010331,
-38.86888171187693,
- -38.89707511075645,
- -38.78234962329847,
- -38.31295966630159,
- -37.84141362373395,
- -37.134316832011834,
- -37.198723283767954,
- -36.99174653551943,
- -37.26038462268863,
- -36.97442732306246,
- -36.89778472639669,
- -36.6064837478887,
- -36.38093383402621,
- -36.48293734351494,
- -36.51357935607297,
- -36.66994658776598,
- -36.31679290418942,
- -36.57928824429222,
- -37.84394745045535,
- -37.88532274580825,
- -37.84882625852266,
- -37.36687580327678,
- -37.39294940825172,
- -37.52248859495469,
- -37.303856987289876,
- -37.74296257100266,
+ -38.89707511075643,
+ -38.782349623298465,
+ -38.31295966630156,
+ -37.84141362373391,
+ -37.1343168320118,
+ -37.198723283767926,
+ -36.991746535519404,
+ -37.2603846226886,
+ -36.97442732306242,
+ -36.897784726396644,
+ -36.60648374788867,
+ -36.380933834026166,
+ -36.4829373435149,
+ -36.513579356072924,
+ -36.669946587765935,
+ -36.31679290418938,
+ -36.57928824429219,
+ -37.84394745045534,
+ -37.88532274580823,
+ -37.848826258522635,
+ -37.366875803276756,
+ -37.3929494082517,
+ -37.52248859495467,
+ -37.30385698728986,
+ -37.74296257100264,
-37.90737850094596,
- -38.22102348762433,
- -38.55564638634221,
+ -38.22102348762431,
+ -38.555646386342204,
-38.566616880856486,
-38.77641998754972,
- -38.776706363827735,
+ -38.77670636382773,
-39.149110376645424,
- -39.23377466427786,
- -39.22970194364533,
- -39.12192942117353,
- -39.41856534281063,
- -39.53858864426104,
+ -39.23377466427785,
+ -39.229701943645324,
+ -39.12192942117352,
+ -39.41856534281064,
+ -39.53858864426103,
-39.66102875101976,
- -39.69579925796855,
- -39.55211308477443,
- -39.545685020169216,
- -39.527857675662965,
- -39.55523868795577,
- -39.786926134732624,
- -39.59878268060566,
- -39.72455198626129,
- -39.748062430133764,
- -39.74651350713148,
- -40.459354206114796,
- -40.44928665097635,
- -40.54589452059427,
- -40.63596535142331,
- -40.93555099844014,
- -40.9812713068479,
- -40.90398965474542,
- -41.16848554578267,
- -41.26474395638993,
- -40.84394827941438,
- -40.91259527853427,
- -41.557353817690206,
- -41.75932781918302,
- -41.60682956467718,
- -41.54752929193785,
- -41.696885906818906,
- -41.78901936222538,
- -41.913786413993215,
- -42.13530999407161,
- -42.09407765855666,
- -42.516716896180995,
- -42.02825880594662,
- -42.0971436944227,
- -42.15587496674248,
- -42.16377654379765,
- -42.31530168009572,
- -42.217168742903354,
- -42.098217529936434,
- -42.26705183330567,
- -42.16114582302581,
- -42.25762175176314,
- -42.29432667596999,
- -42.10857705703778,
- -41.68598764614212,
- -41.67048696665244,
- -41.52709174058122,
- -41.60553880247966,
- -41.59722206469951,
- -41.06023780116072,
- -41.45974723928298,
- -42.3051313943407,
- -42.87188266148616,
- -42.8286996915544,
- -41.84930275841945,
- -41.844794191627216,
- -41.94014485341284,
- -41.97305023465549,
- -42.16053597410947,
- -42.384980956023924,
- -42.414018005008955,
- -42.36449417497322,
- -42.603547628691516,
- -42.663008130838136,
- -42.45195879639187,
- -42.833019365713696,
- -43.03910871297196,
- -43.692193511347625,
- -43.364450412332566,
- -43.44227783774658
+ -39.695799257968545,
+ -39.55211308477441,
+ -39.54568502016918,
+ -39.52785767566293,
+ -39.555238687955736,
+ -39.78692613473258,
+ -39.59878268060562,
+ -39.72455198626124,
+ -39.748062430133714,
+ -39.746513507131446,
+ -40.45935420611475,
+ -40.449286650976305,
+ -40.545894520594224,
+ -40.63596535142326,
+ -40.935550998440085,
+ -40.981271306847844,
+ -40.90398965474536,
+ -41.16848554578262,
+ -41.26474395638987,
+ -40.8439482794143,
+ -40.9125952785342,
+ -41.55735381769012,
+ -41.759327819182914,
+ -41.606829564677064,
+ -41.54752929193772,
+ -41.696885906818785,
+ -41.78901936222526,
+ -41.91378641399308,
+ -42.13530999407147,
+ -42.09407765855653,
+ -42.51671689618085,
+ -42.02825880594649,
+ -42.09714369442257,
+ -42.15587496674235,
+ -42.16377654379752,
+ -42.3153016800956,
+ -42.217168742903226,
+ -42.09821752993629,
+ -42.26705183330552,
+ -42.161145823025656,
+ -42.25762175176299,
+ -42.29432667596985,
+ -42.108577057037635,
+ -41.68598764614194,
+ -41.67048696665226,
+ -41.52709174058104,
+ -41.6055388024795,
+ -41.597222064699345,
+ -41.06023780116055,
+ -41.45974723928281,
+ -42.30513139434052,
+ -42.87188266148598,
+ -42.828699691554235,
+ -41.84930275841927,
+ -41.84479419162704,
+ -41.940144853412654,
+ -41.973050234655304,
+ -42.16053597410931,
+ -42.38498095602375,
+ -42.4140180050088,
+ -42.364494174973075,
+ -42.60354762869137,
+ -42.663008130838016,
+ -42.45195879639176,
+ -42.83301936571358,
+ -43.03910871297185,
+ -43.69219351134751,
+ -43.364450412332445,
+ -43.442277837746445
],
"borderColor": "#2ecc71",
"backgroundColor": "rgba(46, 204, 113, 0.1)",
diff --git a/dashboard/js/chart_factory.js b/test_output/js/chart_factory.js
similarity index 100%
rename from dashboard/js/chart_factory.js
rename to test_output/js/chart_factory.js
diff --git a/dashboard/js/dashboard.js b/test_output/js/dashboard.js
similarity index 100%
rename from dashboard/js/dashboard.js
rename to test_output/js/dashboard.js
diff --git a/dashboard/js/metric_factory.js b/test_output/js/metric_factory.js
similarity index 100%
rename from dashboard/js/metric_factory.js
rename to test_output/js/metric_factory.js
From ed0acc6d7ad21a3bf77756205f3af339daf29422 Mon Sep 17 00:00:00 2001
From: BonelessWater
Date: Thu, 8 May 2025 00:46:53 -0400
Subject: [PATCH 09/54] standalone html file created successfully
---
.gitignore | 1 -
.../dashboard/components/__init__.py | 0
.../dashboard/components/chart_components.py | 0
.../dashboard/components/metric_components.py | 0
.../dashboard/dashboard_generator.py | 758 +-
.../dashboard/static/css/dashboard.css | 47 +
.../backtesting/dashboard/web_app/app.py | 100 +-
.../dashboard/web_app/available_components.py | 115 +
.../backtesting/dashboard/web_app/routes.py | 248 +-
.../web_app/static/css/dashboard_editor.css | 43 +
.../web_app/static/js/chart_registery.js | 0
.../web_app/static/js/dashboard_editor.js | 26 +
.../dashboard/web_app/templates/index.html | 222 +-
algosystem/backtesting/engine.py | 25 +-
algosystem/cli/commands.py | 251 +-
algosystem/data/connectors/database.py | 255 -
algosystem/tests/temp.py | 162 -
algosystem/tests/test.py | 46 -
poetry.lock | 3153 +++++++++
standalone_dashboard.html | 601 ++
test_output/css/dashboard.css | 223 -
test_output/dashboard.html | 104 -
test_output/dashboard_data.json | 6214 -----------------
test_output/js/chart_factory.js | 157 -
test_output/js/dashboard.js | 211 -
test_output/js/metric_factory.js | 60 -
26 files changed, 5367 insertions(+), 7655 deletions(-)
delete mode 100644 algosystem/backtesting/dashboard/components/__init__.py
delete mode 100644 algosystem/backtesting/dashboard/components/chart_components.py
delete mode 100644 algosystem/backtesting/dashboard/components/metric_components.py
create mode 100644 algosystem/backtesting/dashboard/web_app/available_components.py
delete mode 100644 algosystem/backtesting/dashboard/web_app/static/js/chart_registery.js
delete mode 100644 algosystem/data/connectors/database.py
delete mode 100644 algosystem/tests/temp.py
delete mode 100644 algosystem/tests/test.py
create mode 100644 poetry.lock
create mode 100644 standalone_dashboard.html
delete mode 100644 test_output/css/dashboard.css
delete mode 100644 test_output/dashboard.html
delete mode 100644 test_output/dashboard_data.json
delete mode 100644 test_output/js/chart_factory.js
delete mode 100644 test_output/js/dashboard.js
delete mode 100644 test_output/js/metric_factory.js
diff --git a/.gitignore b/.gitignore
index 21ddb4c..e88e668 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,7 +1,6 @@
venv
algosystem.egg-info
.pytest_cache
-poetry.lock
.coverage
__pycache__
/plots
\ No newline at end of file
diff --git a/algosystem/backtesting/dashboard/components/__init__.py b/algosystem/backtesting/dashboard/components/__init__.py
deleted file mode 100644
index e69de29..0000000
diff --git a/algosystem/backtesting/dashboard/components/chart_components.py b/algosystem/backtesting/dashboard/components/chart_components.py
deleted file mode 100644
index e69de29..0000000
diff --git a/algosystem/backtesting/dashboard/components/metric_components.py b/algosystem/backtesting/dashboard/components/metric_components.py
deleted file mode 100644
index e69de29..0000000
diff --git a/algosystem/backtesting/dashboard/dashboard_generator.py b/algosystem/backtesting/dashboard/dashboard_generator.py
index 59c9742..2925c23 100644
--- a/algosystem/backtesting/dashboard/dashboard_generator.py
+++ b/algosystem/backtesting/dashboard/dashboard_generator.py
@@ -1,5 +1,6 @@
import os
import json
+import tempfile
import webbrowser
import shutil
@@ -7,7 +8,6 @@
from .utils.data_formatter import prepare_dashboard_data
from .utils.config_parser import validate_config
-
def generate_dashboard(engine, output_dir=None, open_browser=True, config_path=None):
"""
Generate an HTML dashboard for the backtest results based on graph_config.json
@@ -45,13 +45,33 @@ def generate_dashboard(engine, output_dir=None, open_browser=True, config_path=N
# Load graph configuration
if config_path is None:
- # Use default configuration
- from .utils.default_config import get_default_config
- config = get_default_config()
+ # Check for a user config first
+ user_config = os.path.join(os.path.expanduser("~"), ".algosystem", "dashboard_config.json")
+ if os.path.exists(user_config):
+ print(f"Using user configuration from: {user_config}")
+ with open(user_config, 'r') as f:
+ config = json.load(f)
+ else:
+ # Use default configuration
+ from .utils.default_config import get_default_config
+ config = get_default_config()
else:
- # Load configuration from file
- with open(config_path, 'r') as f:
- config = json.load(f)
+ # Use the specified configuration
+ if os.path.exists(config_path):
+ with open(config_path, 'r') as f:
+ config = json.load(f)
+ else:
+ # If the specified config doesn't exist, use default and create the file
+ print(f"Warning: Configuration file {config_path} not found. Creating it with default configuration.")
+ from .utils.default_config import get_default_config
+ config = get_default_config()
+
+ # Ensure directory exists for the config path
+ os.makedirs(os.path.dirname(os.path.abspath(config_path)), exist_ok=True)
+
+ # Save the default config to the specified location
+ with open(config_path, 'w') as f:
+ json.dump(config, f, indent=4)
# Validate configuration
validate_config(config)
@@ -100,6 +120,26 @@ def generate_dashboard(engine, output_dir=None, open_browser=True, config_path=N
# Create default CSS file if it doesn't exist
create_default_css_file(css_dir)
+ # Add configuration source information to the HTML file
+ config_info = ""
+ if config_path:
+ config_info = f"Configuration source: {os.path.basename(config_path)}
"
+ else:
+ user_config = os.path.join(os.path.expanduser("~"), ".algosystem", "dashboard_config.json")
+ if os.path.exists(user_config):
+ config_info = f"Configuration source: User configuration
"
+ else:
+ config_info = "Configuration source: Default configuration
"
+
+ # Insert config info before the closing body tag
+ with open(dashboard_path, 'r') as f:
+ html_content = f.read()
+
+ html_content = html_content.replace('
+
+
+ Print Dashboard
+ Export as PDF
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+')
+
+ with open(dashboard_path, 'w') as f:
+ f.write(html_content)
+
# Open in browser if requested
if open_browser:
webbrowser.open('file://' + os.path.abspath(dashboard_path))
@@ -809,4 +849,706 @@ def create_default_css_file(css_dir):
}"""
with open(os.path.join(css_dir, 'dashboard.css'), 'w') as f:
- f.write(content)
\ No newline at end of file
+ f.write(content)
+
+def generate_standalone_dashboard(engine, output_path=None, config_path=None):
+ """
+ Generate a completely standalone HTML dashboard with no external dependencies.
+ The entire dashboard including all data, styles, and JavaScript is embedded
+ in a single HTML file that can be viewed without a web server.
+
+ Parameters:
+ -----------
+ engine : Engine
+ Backtesting engine with results
+ output_path : str, optional
+ Path where the standalone HTML file will be saved.
+ Defaults to './standalone_dashboard.html'
+ config_path : str, optional
+ Path to a custom dashboard configuration file
+
+ Returns:
+ --------
+ output_path : str
+ Path to the generated standalone HTML file
+ """
+ import os
+ import json
+ from datetime import datetime
+
+ # Check if backtest results are available
+ if engine.results is None:
+ # Try to run the backtest if not already run
+ engine.run()
+
+ if engine.results is None:
+ raise ValueError("No backtest results available. Run the backtest first.")
+
+ # Set default output path if not provided
+ if output_path is None:
+ output_path = os.path.join(os.getcwd(), "standalone_dashboard.html")
+
+ # Ensure the output directory exists
+ os.makedirs(os.path.dirname(os.path.abspath(output_path)), exist_ok=True)
+
+ # Determine which configuration to use
+ config = None
+ config_source = "Default configuration"
+
+ if config_path is not None:
+ # User specified a configuration file
+ if os.path.exists(config_path):
+ try:
+ with open(config_path, 'r') as f:
+ config = json.load(f)
+ config_source = f"Custom configuration from {os.path.basename(config_path)}"
+ print(f"Using configuration from: {config_path}")
+ except Exception as e:
+ print(f"Warning: Failed to load configuration from {config_path}: {str(e)}")
+ print("Using default configuration instead.")
+ config = None
+ else:
+ print(f"Warning: Configuration file {config_path} not found.")
+ print("Using default configuration instead.")
+
+ if config is None:
+ # Check for user configuration in the home directory
+ user_config_path = os.path.join(os.path.expanduser("~"), ".algosystem", "dashboard_config.json")
+ if os.path.exists(user_config_path):
+ try:
+ with open(user_config_path, 'r') as f:
+ config = json.load(f)
+ config_source = f"User configuration from {os.path.basename(user_config_path)}"
+ print(f"Using user configuration from: {user_config_path}")
+ except Exception as e:
+ print(f"Warning: Failed to load user configuration: {str(e)}")
+ print("Using default configuration instead.")
+ config = None
+
+ if config is None:
+ # Use default configuration
+ from .utils.default_config import get_default_config
+ config = get_default_config()
+ print("Using default dashboard configuration")
+
+ # Prepare dashboard data
+ from .utils.data_formatter import prepare_dashboard_data
+ dashboard_data = prepare_dashboard_data(engine, config)
+
+ # Include data generation timestamp
+ generation_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
+ dashboard_data['metadata']['generation_time'] = generation_time
+
+ # Create the standalone HTML content with embedded data, CSS, and JavaScript
+ html = f"""
+
+