mainsequence 2.0.4b0__py3-none-any.whl → 3.0.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. mainsequence/cli/cli.py +17 -10
  2. mainsequence/cli/ssh_utils.py +17 -2
  3. mainsequence/client/__init__.py +3 -3
  4. mainsequence/client/base.py +3 -3
  5. mainsequence/client/data_sources_interfaces/timescale.py +20 -19
  6. mainsequence/client/models_helpers.py +2 -2
  7. mainsequence/client/models_tdag.py +96 -86
  8. mainsequence/client/models_vam.py +9 -9
  9. mainsequence/dashboards/streamlit/assets/image_1_base64.txt +1 -0
  10. mainsequence/dashboards/streamlit/assets/image_2_base64.txt +1 -0
  11. mainsequence/dashboards/streamlit/assets/image_3_base64.txt +1 -0
  12. mainsequence/dashboards/streamlit/assets/image_4_base64.txt +1 -0
  13. mainsequence/dashboards/streamlit/assets/image_5_base64.txt +1 -0
  14. mainsequence/dashboards/streamlit/core/theme.py +2 -2
  15. mainsequence/instruments/__init__.py +1 -1
  16. mainsequence/instruments/data_interface/__init__.py +1 -1
  17. mainsequence/instruments/data_interface/data_interface.py +3 -4
  18. mainsequence/instruments/pricing_models/indices.py +29 -14
  19. mainsequence/instruments/settings.py +2 -162
  20. mainsequence/tdag/config.py +2 -2
  21. mainsequence/tdag/data_nodes/build_operations.py +3 -3
  22. mainsequence/tdag/data_nodes/data_nodes.py +23 -23
  23. mainsequence/tdag/data_nodes/persist_managers.py +121 -121
  24. mainsequence/tdag/data_nodes/run_operations.py +25 -25
  25. mainsequence/virtualfundbuilder/contrib/apps/portfolio_report_app.py +1 -1
  26. mainsequence/virtualfundbuilder/contrib/prices/data_nodes.py +2 -2
  27. mainsequence/virtualfundbuilder/data_nodes.py +1 -1
  28. mainsequence/virtualfundbuilder/portfolio_interface.py +7 -7
  29. mainsequence/virtualfundbuilder/utils.py +2 -2
  30. {mainsequence-2.0.4b0.dist-info → mainsequence-3.0.1.dist-info}/METADATA +1 -1
  31. {mainsequence-2.0.4b0.dist-info → mainsequence-3.0.1.dist-info}/RECORD +35 -30
  32. {mainsequence-2.0.4b0.dist-info → mainsequence-3.0.1.dist-info}/WHEEL +0 -0
  33. {mainsequence-2.0.4b0.dist-info → mainsequence-3.0.1.dist-info}/entry_points.txt +0 -0
  34. {mainsequence-2.0.4b0.dist-info → mainsequence-3.0.1.dist-info}/licenses/LICENSE +0 -0
  35. {mainsequence-2.0.4b0.dist-info → mainsequence-3.0.1.dist-info}/top_level.txt +0 -0
@@ -70,20 +70,20 @@ class UpdateRunner:
70
70
 
71
71
  name_prefix = "DEBUG_" if self.debug_mode else ""
72
72
  self.scheduler = ms_client.Scheduler.build_and_assign_to_ts(
73
- scheduler_name=f"{name_prefix}{self.ts.local_time_serie.id}",
74
- time_serie_ids=[self.ts.local_time_serie.id],
73
+ scheduler_name=f"{name_prefix}{self.ts.data_node_update.id}",
74
+ time_serie_ids=[self.ts.data_node_update.id],
75
75
  remove_from_other_schedulers=True,
76
76
  running_in_debug_mode=self.debug_mode
77
77
  )
78
78
  self.scheduler.start_heart_beat()
79
79
 
80
- def _pre_update_routines(self, local_metadata: Optional[dict] = None) -> Tuple[Dict[int,ms_client.LocalTimeSerie], Any]:
80
+ def _pre_update_routines(self, data_node_update: Optional[dict] = None) -> Tuple[Dict[int,ms_client.DataNodeUpdate], Any]:
81
81
  """
82
82
  Prepares the DataNode and its dependencies for an update by fetching the
83
83
  latest metadata for the entire dependency graph.
84
84
 
85
85
  Args:
86
- local_metadata: Optional dictionary with metadata for the head node,
86
+ data_node_update: Optional dictionary with metadata for the head node,
87
87
  used to synchronize before fetching the full tree.
88
88
 
89
89
  Returns:
@@ -91,7 +91,7 @@ class UpdateRunner:
91
91
  tree (keyed by ID) and the corresponding state data.
92
92
  """
93
93
  # 1. Synchronize the head node and load its dependency structure.
94
- self.ts.local_persist_manager.synchronize_metadata(local_metadata=local_metadata)
94
+ self.ts.local_persist_manager.synchronize_data_node_update(data_node_update=data_node_update)
95
95
  self.ts.set_relation_tree()
96
96
 
97
97
  # The `load_dependencies` logic is now integrated here.
@@ -102,19 +102,19 @@ class UpdateRunner:
102
102
  if not self.ts._scheduler_tree_connected and self.update_tree:
103
103
  self.logger.debug("Connecting dependency tree to scheduler...")
104
104
  if not self.ts.depth_df.empty:
105
- all_ids = self.ts.depth_df["local_time_serie_id"].to_list() + [self.ts.local_time_serie.id]
105
+ all_ids = self.ts.depth_df["data_node_update_id"].to_list() + [self.ts.data_node_update.id]
106
106
  self.scheduler.in_active_tree_connect(local_time_series_ids=all_ids)
107
107
  self.ts._scheduler_tree_connected = True
108
108
 
109
109
  # 3. Collect all IDs in the dependency graph to fetch their metadata.
110
110
  # This correctly initializes the list, fixing the original bug.
111
111
  if not self.ts.depth_df.empty:
112
- all_ids_in_tree = self.ts.depth_df["local_time_serie_id"].to_list()
112
+ all_ids_in_tree = self.ts.depth_df["data_node_update_id"].to_list()
113
113
  else:
114
114
  all_ids_in_tree = []
115
115
 
116
116
  # Always include the head node itself.
117
- all_ids_in_tree.append(self.ts.local_time_serie.id)
117
+ all_ids_in_tree.append(self.ts.data_node_update.id)
118
118
 
119
119
  # 4. Fetch the latest metadata for the entire tree from the backend.
120
120
  update_details_batch = dict(
@@ -123,7 +123,7 @@ class UpdateRunner:
123
123
  active_update_status="Q" # Assuming queue status is always set here
124
124
  )
125
125
 
126
- all_metadatas_response = ms_client.LocalTimeSerie.get_metadatas_and_set_updates(
126
+ all_metadatas_response = ms_client.DataNodeUpdate.get_data_nodes_and_set_updates(
127
127
  local_time_series_ids=all_ids_in_tree,
128
128
  update_details_kwargs=update_details_batch,
129
129
  update_priority_dict=None
@@ -131,28 +131,28 @@ class UpdateRunner:
131
131
 
132
132
  # 5. Process and return the results.
133
133
  state_data = all_metadatas_response['state_data']
134
- local_metadatas_list = all_metadatas_response["local_metadatas"]
135
- local_metadatas_map = {m.id: m for m in local_metadatas_list}
134
+ data_node_updates_list = all_metadatas_response["data_node_updates"]
135
+ data_node_updates_map = {m.id: m for m in data_node_updates_list}
136
136
 
137
137
  self.ts.scheduler = self.scheduler
138
- self.ts.update_details_tree = {key: v.run_configuration for key, v in local_metadatas_map.items()}
138
+ self.ts.update_details_tree = {key: v.run_configuration for key, v in data_node_updates_map.items()}
139
139
 
140
- return local_metadatas_map, state_data
140
+ return data_node_updates_map, state_data
141
141
 
142
- def _setup_execution_environment(self) -> Dict[int, ms_client.LocalTimeSerie]:
143
- local_metadatas, state_data = self._pre_update_routines()
144
- return local_metadatas
142
+ def _setup_execution_environment(self) -> Dict[int, ms_client.DataNodeUpdate]:
143
+ data_node_updates, state_data = self._pre_update_routines()
144
+ return data_node_updates
145
145
 
146
146
  def _start_update(self, use_state_for_update: bool,override_update_stats:Optional[UpdateStatistics]=None) -> [bool,pd.DataFrame]:
147
147
  """Orchestrates a single DataNode update, including pre/post routines."""
148
- historical_update = self.ts.local_persist_manager.local_metadata.set_start_of_execution(
148
+ historical_update = self.ts.local_persist_manager.data_node_update.set_start_of_execution(
149
149
  active_update_scheduler_id=self.scheduler.id
150
150
  )
151
151
 
152
152
  must_update = historical_update.must_update or self.force_update
153
153
 
154
154
  # Ensure metadata is fully loaded with relationship details before proceeding.
155
- self.ts.local_persist_manager.set_local_metadata_lazy(include_relations_detail=True)
155
+ self.ts.local_persist_manager.set_data_node_update_lazy(include_relations_detail=True)
156
156
 
157
157
 
158
158
  if override_update_stats is not None:
@@ -178,13 +178,13 @@ class UpdateRunner:
178
178
  error_on_last_update = True
179
179
  raise e
180
180
  finally:
181
- self.ts.local_persist_manager.local_metadata.set_end_of_execution(
181
+ self.ts.local_persist_manager.data_node_update.set_end_of_execution(
182
182
  historical_update_id=historical_update.id,
183
183
  error_on_update=error_on_last_update
184
184
  )
185
185
 
186
186
  # Always set last relations details after the run completes.
187
- self.ts.local_persist_manager.set_local_metadata_lazy(include_relations_detail=True)
187
+ self.ts.local_persist_manager.set_data_node_update_lazy(include_relations_detail=True)
188
188
 
189
189
  self.ts.run_post_update_routines(error_on_last_update=error_on_last_update)
190
190
  self.ts.local_persist_manager.set_column_metadata(columns_metadata=self.ts.get_column_metadata())
@@ -305,17 +305,17 @@ class UpdateRunner:
305
305
  """
306
306
  # 1. Ensure the dependency graph is built in the backend
307
307
  declared_dependencies = self.ts.dependencies() or {}
308
- deps_ids=[d.local_time_serie.id if (d.is_api ==False and d.local_time_serie is not None) else None for d in declared_dependencies.values()]
308
+ deps_ids=[d.data_node_update.id if (d.is_api ==False and d.data_node_update is not None) else None for d in declared_dependencies.values()]
309
309
 
310
310
  # 2. Get the list of dependencies to update
311
311
  dependencies_df = self.ts.dependencies_df
312
312
 
313
- if any([a is None for a in deps_ids]) or any([d not in dependencies_df["local_time_serie_id"].to_list() for d in deps_ids]):
313
+ if any([a is None for a in deps_ids]) or any([d not in dependencies_df["data_node_update_id"].to_list() for d in deps_ids]):
314
314
  #Datanode not update set
315
- self.ts.local_persist_manager.local_metadata.patch(ogm_dependencies_linked=False)
315
+ self.ts.local_persist_manager.data_node_update.patch(ogm_dependencies_linked=False)
316
316
 
317
317
 
318
- if self.ts.local_persist_manager.local_metadata.ogm_dependencies_linked==False:
318
+ if self.ts.local_persist_manager.data_node_update.ogm_dependencies_linked==False:
319
319
  self.logger.info("Dependency tree not set. Building now...")
320
320
  start_time = time.time()
321
321
  self.ts.set_relation_tree()
@@ -507,7 +507,7 @@ class UpdateRunner:
507
507
 
508
508
  # 4. Wait for the scheduled update time, if not forcing an immediate run
509
509
  if not self.force_update:
510
- self.ts.local_time_serie.wait_for_update_time()
510
+ self.ts.data_node_update.wait_for_update_time()
511
511
 
512
512
  # 5. Trigger the core update process
513
513
  error_on_last_update,updated_df=self._start_update(
@@ -39,7 +39,7 @@ class PortfolioReport(HtmlApp):
39
39
  for portfolio_id in self.configuration.portfolio_ids:
40
40
  try:
41
41
  portfolio = Portfolio.get(id=portfolio_id)
42
- data = portfolio.local_time_serie.get_data_between_dates_from_api()
42
+ data = portfolio.data_node_update.get_data_between_dates_from_api()
43
43
  data['time_index'] = pd.to_datetime(data['time_index'])
44
44
  report_data = data[data['time_index'] >= start_date].copy().sort_values('time_index')
45
45
 
@@ -8,7 +8,7 @@ import datetime
8
8
  import pandas_market_calendars as mcal
9
9
 
10
10
  from mainsequence.tdag.data_nodes import DataNode, WrapperDataNode, APIDataNode
11
- from mainsequence.client import (CONSTANTS, LocalTimeSeriesDoesNotExist, LocalTimeSerie, DynamicTableDataSource,
11
+ from mainsequence.client import (CONSTANTS, LocalTimeSeriesDoesNotExist, DataNodeUpdate, DynamicTableDataSource,
12
12
  UpdateStatistics, AssetCategory, AssetTranslationTable, AssetTranslationRule, AssetFilter
13
13
  )
14
14
  from mainsequence.client import MARKETS_CONSTANTS, ExecutionVenue
@@ -604,7 +604,7 @@ class InterpolatedPrices(DataNode):
604
604
  return required
605
605
 
606
606
  def run_post_update_routines(self, error_on_last_update):
607
- if not self.local_persist_manager.metadata.protect_from_deletion:
607
+ if not self.local_persist_manager.data_node_storage.protect_from_deletion:
608
608
  self.local_persist_manager.protect_from_deletion()
609
609
 
610
610
  def _transform_raw_data_to_upsampled_df(
@@ -614,7 +614,7 @@ rebalance details:"""
614
614
 
615
615
 
616
616
  def get_table_metadata(self) -> Optional[ms_client.TableMetaData]:
617
- asset = ms_client.PortfolioIndexAsset.get_or_none(reference_portfolio__local_time_serie__update_hash=self.local_time_serie.update_hash)
617
+ asset = ms_client.PortfolioIndexAsset.get_or_none(reference_portfolio__local_time_serie__update_hash=self.data_node_update.update_hash)
618
618
  if asset is not None:
619
619
  identifier = asset.unique_identifier
620
620
  return ms_client.TableMetaData(
@@ -69,10 +69,10 @@ class PortfolioInterface():
69
69
 
70
70
 
71
71
  ## manualely
72
- target_portfolio = Portfolio.get_or_none(local_time_serie__id=portfolio_node.local_time_serie.id)
72
+ target_portfolio = Portfolio.get_or_none(data_node_update__id=portfolio_node.data_node_update.id)
73
73
  standard_kwargs = dict(portfolio_name=portfolio_node.portfolio_name,
74
- local_time_serie_id=portfolio_node.local_time_serie.id,
75
- signal_local_time_serie_id=None,
74
+ data_node_update_id=portfolio_node.data_node_update.id,
75
+ signal_data_node_update_id=None,
76
76
  is_active=True,
77
77
  calendar_name=portfolio_node.calendar_name,
78
78
  target_portfolio_about=dict(description=portfolio_node.target_portfolio_about,
@@ -121,9 +121,9 @@ class PortfolioInterface():
121
121
  signal_weights_ts = ts.signal_weights
122
122
 
123
123
  # timeseries can be running in local lake so need to request the id
124
- standard_kwargs = dict(local_time_serie_id=ts.local_time_serie.id,
124
+ standard_kwargs = dict(local_time_serie_id=ts.data_node_update.id,
125
125
  is_active=True,
126
- signal_local_time_serie_id=signal_weights_ts.local_time_serie.id,
126
+ signal_local_time_serie_id=signal_weights_ts.data_node_update.id,
127
127
  )
128
128
 
129
129
  user_kwargs = self.portfolio_markets_config.model_dump()
@@ -145,13 +145,13 @@ class PortfolioInterface():
145
145
 
146
146
  standard_kwargs["backtest_table_price_column_name"] = "close"
147
147
 
148
- target_portfolio = Portfolio.get_or_none(local_time_serie__id=ts.local_time_serie.id)
148
+ target_portfolio = Portfolio.get_or_none(local_time_serie__id=ts.data_node_update.id)
149
149
  if target_portfolio is None:
150
150
  target_portfolio, index_asset = Portfolio.create_from_time_series(**standard_kwargs)
151
151
  else:
152
152
  # patch timeserie of portfolio to guaranteed recreation
153
153
  target_portfolio.patch(**standard_kwargs)
154
- self.logger.debug(f"Target portfolio {target_portfolio.portfolio_ticker} for local time serie {ts.local_time_serie.update_hash} already exists in Backend")
154
+ self.logger.debug(f"Target portfolio {target_portfolio.portfolio_ticker} for local time serie {ts.data_node_update.update_hash} already exists in Backend")
155
155
  index_asset = PortfolioIndexAsset.get(reference_portfolio__id=target_portfolio.id)
156
156
 
157
157
  return target_portfolio, index_asset
@@ -94,7 +94,7 @@ def convert_to_binance_frequency(freq: str) -> str:
94
94
 
95
95
  def get_last_query_times_per_asset(
96
96
  latest_value: datetime,
97
- metadata: dict,
97
+ data_node_storage: dict,
98
98
  asset_list: List[Asset],
99
99
  max_lookback_time: datetime,
100
100
  current_time: datetime,
@@ -115,7 +115,7 @@ def get_last_query_times_per_asset(
115
115
  Dict[str, Optional[float]]: A dictionary mapping asset IDs to their respective last query times expressed in UNIX timestamp.
116
116
  """
117
117
  if latest_value:
118
- last_query_times_per_asset = metadata["sourcetableconfiguration"]["multi_index_stats"]["max_per_asset_symbol"]
118
+ last_query_times_per_asset = data_node_storage["sourcetableconfiguration"]["multi_index_stats"]["max_per_asset_symbol"]
119
119
  else:
120
120
  last_query_times_per_asset = {}
121
121
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mainsequence
3
- Version: 2.0.4b0
3
+ Version: 3.0.1
4
4
  Summary: Main Sequence SDK
5
5
  Author-email: Main Sequence GmbH <dev@main-sequence.io>
6
6
  License: MainSequence GmbH SDK License Agreement
@@ -3,36 +3,41 @@ mainsequence/__main__.py,sha256=1_gCQd-MlXQxAubgVdTDgmP2117UQmj5DvTI_PASZis,162
3
3
  mainsequence/logconf.py,sha256=OLkhALon2uIDZSeGOwX3DneapkVqlwDjqJm96TRAhgA,10057
4
4
  mainsequence/cli/__init__.py,sha256=TNxXsTPgb52OhakIda9wTRh91cqoBqgQRx5TxjzQQFU,21
5
5
  mainsequence/cli/api.py,sha256=P8faj8MrAvB25BxICYApT3J7-Mlx1MiqpYscjVj_zL8,7339
6
- mainsequence/cli/cli.py,sha256=EE9oHiCvx6FeuzAYg7Yq178rddddmXiTVBOVILKApnI,17016
6
+ mainsequence/cli/cli.py,sha256=v96YT_VJGp-gzfFNMDK2EqVgTDSigpcyY7pT2_G9Wak,17264
7
7
  mainsequence/cli/config.py,sha256=UAi0kfxro2oJhzaRdd2D3F72eGpqkYaWjSsCzBrb2LY,2705
8
- mainsequence/cli/ssh_utils.py,sha256=95CmZk2nIoJhNTCmifMEsE9QXJrXY3zvfxLQp3QpdiM,5088
9
- mainsequence/client/__init__.py,sha256=5aDPrdS9GVebgQ52yYFre1H14n8pMrEEo0OVDZH0zvw,878
10
- mainsequence/client/base.py,sha256=yY8dar55QXKkN-g0ohw1jQEboZx5ZnNsnE01xwji93Q,15036
11
- mainsequence/client/models_helpers.py,sha256=QXu-EZK54ryszVbjREwb7qRrS2WPvn_voboptPTR6kM,4100
8
+ mainsequence/cli/ssh_utils.py,sha256=cqodXCJd1EK-PHfG8K_poeg004K6cyqRz6ahpYnbEdk,6127
9
+ mainsequence/client/__init__.py,sha256=dkiXwFedl9yrmKHprzL_B9BfHRWHRj3d9f_o4-aRH7U,867
10
+ mainsequence/client/base.py,sha256=yqSu9lUMPDr7ewU1DWJm6jBqXrNUUVGqsihhFcZPs2s,15025
11
+ mainsequence/client/models_helpers.py,sha256=aXANVSt8qMhI4Diwe_1k4-P6NnJANYvCAfDWQhqGQX8,4095
12
12
  mainsequence/client/models_report_studio.py,sha256=mKu7k0STyUZMTzTK98w46t2b1jv8hVhDpmCzI4EeSnQ,13971
13
- mainsequence/client/models_tdag.py,sha256=n8IK3tjiNqAlYSae_iVAfY45M0mts9EgWEjnaRger2M,94938
14
- mainsequence/client/models_vam.py,sha256=E78QsdDNszpgweVvGUY5QF3DDOtSjJNZeVXvast2BjU,72891
13
+ mainsequence/client/models_tdag.py,sha256=FRcbf3TYDCjTFZ6JRxHiHKZyu9M9mGrUjNLfSnzgirQ,95293
14
+ mainsequence/client/models_vam.py,sha256=4dqJkGyVboabo844LjUWO1sTxt40OshzrRoTfSTo-lU,72891
15
15
  mainsequence/client/utils.py,sha256=4aLctRMmQdFtLzaI9b28ifP141pO-VAmiQ7wTdHpqGg,11665
16
16
  mainsequence/client/data_sources_interfaces/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
17
17
  mainsequence/client/data_sources_interfaces/duckdb.py,sha256=cOvq_241eU6jPUw3DqLQDBWOUt3cXkP9UaMWzLhSG0M,67207
18
- mainsequence/client/data_sources_interfaces/timescale.py,sha256=y_-vnX2JPUnweuajmBSPQxirNAA7BeljuYfYiFrlKcU,20126
18
+ mainsequence/client/data_sources_interfaces/timescale.py,sha256=UkbFnYKv50-qPJDdYXgYOh_e3ildpJyzjC6oD7q6uUk,20318
19
19
  mainsequence/dashboards/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
20
20
  mainsequence/dashboards/streamlit/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
21
21
  mainsequence/dashboards/streamlit/scaffold.py,sha256=oOhwHmzwgeDTDQgDwzPvTkWrkf_-KmI1ankOi7r5IUk,7532
22
22
  mainsequence/dashboards/streamlit/assets/config.toml,sha256=GCsLTasaF9kJlRRY1SnXLY-X5PyzLkGG4LX48gefkcc,314
23
23
  mainsequence/dashboards/streamlit/assets/favicon.png,sha256=-CHfKx6jfMlXb8TnFQh2BNIBiKeVFfxK7g9K9BaqX6I,347
24
+ mainsequence/dashboards/streamlit/assets/image_1_base64.txt,sha256=Smm9HT5A6FhC8FUvj9HYEREwUostku8igxiJsS5CT4Q,315018
25
+ mainsequence/dashboards/streamlit/assets/image_2_base64.txt,sha256=iohyvDIUMZX6-rTrVvNgMEIa8UU5fNT9JxbCoetWzcU,384570
26
+ mainsequence/dashboards/streamlit/assets/image_3_base64.txt,sha256=iohyvDIUMZX6-rTrVvNgMEIa8UU5fNT9JxbCoetWzcU,384570
27
+ mainsequence/dashboards/streamlit/assets/image_4_base64.txt,sha256=4KiKYChYUNLB-ennKwPeQp85huStgglk3s0Vyp3nlN4,543762
28
+ mainsequence/dashboards/streamlit/assets/image_5_base64.txt,sha256=E9Xl4dSMhc_2z-ipHh7BAXsd6Gz2si8dP5NjjhQhyVc,592742
24
29
  mainsequence/dashboards/streamlit/assets/logo.png,sha256=20KBis07H579XnXi0vMNzcjFyaAfW0CmI_dOtj-UYc4,34970
25
30
  mainsequence/dashboards/streamlit/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
26
- mainsequence/dashboards/streamlit/core/theme.py,sha256=Gc2lIUDugogTSGgBLn6nL3PDJxhpsKgWGj6FP3f4huY,7977
31
+ mainsequence/dashboards/streamlit/core/theme.py,sha256=Uq0xcv9seSo_FEzwWPPON9Ab5xZ1k0JuffhRL5k2vy8,7939
27
32
  mainsequence/dashboards/streamlit/pages/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
28
33
  mainsequence/instrumentation/__init__.py,sha256=qfHOseVGOW_WdoTgw7TWZYpF1REwf14eF9awxWcLtfI,154
29
34
  mainsequence/instrumentation/utils.py,sha256=XgVg9FijubSy5qMNw0yCkl5TMD2n56TnT4Q58WfZXbw,3354
30
- mainsequence/instruments/__init__.py,sha256=RZzyEw7P9mcNKhTd8G1a59xdDBEgUgtSLCuac49svtA,52
35
+ mainsequence/instruments/__init__.py,sha256=zw8w75sitdpkfqmDpiqc6wjVb0KXz1in8Z_eybautug,28
31
36
  mainsequence/instruments/instruments.default.toml,sha256=RnCWtS7YJ4t_JqTHJWUdvJhEf-SkADsnQzAyhJZTcXA,452
32
- mainsequence/instruments/settings.py,sha256=Jtwg9rO42uJ7DOL6HkW8RPgkDxE-G2YDuw0QcU8itrA,5857
37
+ mainsequence/instruments/settings.py,sha256=QbgNar9gEkaFrpMUM79T7SWkoBcvFVMAKVL8CvSlB4g,279
33
38
  mainsequence/instruments/utils.py,sha256=eiqaTfcq4iulSdEwgi1sMq8xAKK8ONl22a-FNItcbYk,698
34
- mainsequence/instruments/data_interface/__init__.py,sha256=Mz-Xx-qLNwI-iIJGL2ik-veUZuraU4aaDyUKhcOXsLg,548
35
- mainsequence/instruments/data_interface/data_interface.py,sha256=Xrvm8GQgALSTxt4vWK888J49X7pXisiitB2DTu9KnCg,15229
39
+ mainsequence/instruments/data_interface/__init__.py,sha256=aQNXx0csDadrwwFqDlYKRwnqIk1OREsYF7ybjm29Ipo,556
40
+ mainsequence/instruments/data_interface/data_interface.py,sha256=tK_-8XooHGWCTVRWdYRQk38-2c9ZVSS78xdhPnMK0Nk,15142
36
41
  mainsequence/instruments/instruments/__init__.py,sha256=Xe1hCMsOGc3IyyfA90Xuv7pO9t8TctpM7fo-6hML9Cg,154
37
42
  mainsequence/instruments/instruments/base_instrument.py,sha256=XQeZxDSGhZ_ZNut3867I_q3UvDvp9VZDW4VRzyyFe-A,3185
38
43
  mainsequence/instruments/instruments/bond.py,sha256=tm1Xr-OX2kbAzEZin5qbFBPhWyrFNUjLf7aWVQ6FTzg,17432
@@ -47,7 +52,7 @@ mainsequence/instruments/pricing_models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5J
47
52
  mainsequence/instruments/pricing_models/black_scholes.py,sha256=bs7fsgiDKRuBZo7fvemVdmUHN-NjC2v6XUjhPaLNC-4,1588
48
53
  mainsequence/instruments/pricing_models/bond_pricer.py,sha256=JXBOsDonlLwYG3GyHGD7rV1cddCPot8ZgE1Th-tHiqY,6566
49
54
  mainsequence/instruments/pricing_models/fx_option_pricer.py,sha256=cMRejaIo3ZEhKCS960C7lg8ejh3b9RqIfL3Hhj4LB0A,3292
50
- mainsequence/instruments/pricing_models/indices.py,sha256=20FgSKeWu7L2bpAZ1zklUnJ6SOi1BJk7yt1WfKPfDLg,12923
55
+ mainsequence/instruments/pricing_models/indices.py,sha256=NEYu94uBw11afIPohnQ3qhqjLXyd1FEI1lKhyvTvrRM,13749
51
56
  mainsequence/instruments/pricing_models/knockout_fx_pricer.py,sha256=FrO1uRn63zktkm6LwfLKZf0vPn5x0NOCBIPfSPEIO9c,6772
52
57
  mainsequence/instruments/pricing_models/swap_pricer.py,sha256=vQXL1pgWPS9EUu8xXDyrA6QZm-t7wH0Hx3GU3yl1HHw,17994
53
58
  mainsequence/reportbuilder/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -57,32 +62,32 @@ mainsequence/reportbuilder/slide_templates.py,sha256=VCHtrWl0FJIGGyo3cdHUjMCQuuO
57
62
  mainsequence/reportbuilder/examples/ms_template_report.py,sha256=pOfUcVqixmyWMArJvJ340L1SWaD3SAnXHTHcHFgVeok,39208
58
63
  mainsequence/tdag/__init__.py,sha256=CFxObmFsuyq06hOSxpv0VceZgOuDC8ebm_u7evQW0Bs,210
59
64
  mainsequence/tdag/__main__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
60
- mainsequence/tdag/config.py,sha256=oscijihkIloNwOaqLubxQoB3H8JT5rBb2aU0yP_alYE,3824
65
+ mainsequence/tdag/config.py,sha256=4nbr943wsAGfr9h1BQX9Z41_O5DHNsR-0sOxOkUIFNs,3834
61
66
  mainsequence/tdag/future_registry.py,sha256=wWD_u9pFt2tP80ra22kkvQT3cNj-ELmocoeXE9UUTPM,732
62
67
  mainsequence/tdag/utils.py,sha256=vxEBaz94ZC1lm-Nc1OZMvpPJLVDSI8lGYn-RozcuGbo,1025
63
68
  mainsequence/tdag/data_nodes/__init__.py,sha256=nyNxBWGTE1aoNtZAMMTNnQP-mZ6aU0zcvnKcd0EeXrs,103
64
- mainsequence/tdag/data_nodes/build_operations.py,sha256=23CruSozk1-FhAg6JLGVubiXKFyLe9qWv4dw1sltFxI,28348
65
- mainsequence/tdag/data_nodes/data_nodes.py,sha256=4TTEs4Wpa_-mp0gq8zjps3sOv-bDxh4gu4cqhvazpdQ,51727
66
- mainsequence/tdag/data_nodes/persist_managers.py,sha256=11NtBm-J0lhr6VHSD9R3eFadgrGEMTalFNRpNgrA_OA,33440
67
- mainsequence/tdag/data_nodes/run_operations.py,sha256=Oy51i6kCJmKFiUmqHZBT3PwESfspi4SzUR-RNIk0_78,23428
69
+ mainsequence/tdag/data_nodes/build_operations.py,sha256=4mQZYqF2j_ljwZUeg0yEsBh5cgdR-Q5QpqBrex1T64A,28377
70
+ mainsequence/tdag/data_nodes/data_nodes.py,sha256=3K3Ehen8FnPKyQ_-kuo85U_hquOUTQ9ExLs2iVr0mfo,51772
71
+ mainsequence/tdag/data_nodes/persist_managers.py,sha256=v0SizLXvWjk4-nClmipfAB44s13Ofsj5EsBaJeYhg7o,33978
72
+ mainsequence/tdag/data_nodes/run_operations.py,sha256=Q94Ef9qf13tCt2rpc5rPHEVTH987BT07se-14gfKcns,23473
68
73
  mainsequence/tdag/data_nodes/utils.py,sha256=atFF14Gg_itQs1J8BrmVSJl8Us29qu7fdCooDqFvP78,613
69
74
  mainsequence/virtualfundbuilder/__init__.py,sha256=sOqlMt1qteORAHc_PDjUI9gZY1Bh86nTAd_ZtxfuQcQ,1438
70
75
  mainsequence/virtualfundbuilder/__main__.py,sha256=mdj8cQ1Zims8ZkX8TR4zVSCEzTtzPpaxInQmXY0WBYM,8873
71
76
  mainsequence/virtualfundbuilder/agent_interface.py,sha256=1xUZCvP1XcHp9JZanIRAFBydAaP7uUoGH02B6kkTywo,2744
72
77
  mainsequence/virtualfundbuilder/config_handling.py,sha256=pDQB7SIY2-Hqh1wRhcDa3bOAWAwCezbmRG6TwlzzRHQ,3982
73
- mainsequence/virtualfundbuilder/data_nodes.py,sha256=NvazPj2UOsIlqz1yiuvgNORAO_FIUNxtRJH6nRU2vkk,27838
78
+ mainsequence/virtualfundbuilder/data_nodes.py,sha256=o26GYQ1rHbN7upY23fzBV4Ab69LBsberizOo6ScAkak,27838
74
79
  mainsequence/virtualfundbuilder/enums.py,sha256=aTNmhK9Syp0ZuhzfQ_-Hsdr_u53SQShUL84CD3kVgMA,544
75
80
  mainsequence/virtualfundbuilder/models.py,sha256=eoRXICs2wcyCP2-64ki9VXyJicfFku9dG4xcAW1a7ko,11666
76
81
  mainsequence/virtualfundbuilder/notebook_handling.py,sha256=R_iiqQvP8ReEEYxk6vCcgcUg6SjFBsU1oVpZk8jC3X0,1148
77
- mainsequence/virtualfundbuilder/portfolio_interface.py,sha256=ejYXLDgxDQsIQWQjGcT7N9iXhArcmaSDg-Lnelw1o5U,12303
78
- mainsequence/virtualfundbuilder/utils.py,sha256=XwWtout8EitwY-iD49zebgzSNHoACfxKXrh2-rjLs7M,15128
82
+ mainsequence/virtualfundbuilder/portfolio_interface.py,sha256=mDlI7XpaLvRCINK0-dmKdylp4ymadPsoryDts-KkR5I,12303
83
+ mainsequence/virtualfundbuilder/utils.py,sha256=ybmyMNQaHRHgZ23g2UoYZ37Ic1pdrty89mFbHZN4huE,15146
79
84
  mainsequence/virtualfundbuilder/contrib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
80
85
  mainsequence/virtualfundbuilder/contrib/apps/__init__.py,sha256=oBt3cy1TxA87ZesCm9djRYEyGnRvAuNs3wVOYm1i4Kk,259
81
86
  mainsequence/virtualfundbuilder/contrib/apps/etf_replicator_app.py,sha256=a9lR8un2av7rp-N-DT0eQjOvWglBUUKRgosfV7HO3dc,7960
82
87
  mainsequence/virtualfundbuilder/contrib/apps/generate_report.py,sha256=Q5O63AUpQQEDJRSR3KvkpE6644l4FwQaVQKz8ZXpjwc,12891
83
88
  mainsequence/virtualfundbuilder/contrib/apps/load_external_portfolio.py,sha256=flp0LQbCZHckZLPRi9RIWXjhP99gBaE0lNIROoitQ5Y,4544
84
89
  mainsequence/virtualfundbuilder/contrib/apps/news_app.py,sha256=I0GfkxIIfnk--nc0qfyCad4ZrlvwJpfntL2SLMjI_z4,20156
85
- mainsequence/virtualfundbuilder/contrib/apps/portfolio_report_app.py,sha256=dFwx8Kea0K-Lo29O3cLdR-ldLX4pGviKtPmusARMEdQ,3672
90
+ mainsequence/virtualfundbuilder/contrib/apps/portfolio_report_app.py,sha256=lK8QaelSp02Te74GNorRpk35LhQjv90aNhz2_PomAdQ,3672
86
91
  mainsequence/virtualfundbuilder/contrib/apps/portfolio_table.py,sha256=oJxUnskf2bDJIGs09_r1TgDbU4xJYwYVh6r_eQNx8BM,4906
87
92
  mainsequence/virtualfundbuilder/contrib/apps/run_named_portfolio.py,sha256=qu36aMC0VZhirfum-s0PJ8jASuY7VrA75kxI51AuXE4,1809
88
93
  mainsequence/virtualfundbuilder/contrib/apps/run_portfolio.py,sha256=a6A23aiyRk0EBfRR3e_sKqhRARWHoQd7lGxjymdwUlk,1649
@@ -95,7 +100,7 @@ mainsequence/virtualfundbuilder/contrib/data_nodes/market_cap.py,sha256=LjfDMqW1
95
100
  mainsequence/virtualfundbuilder/contrib/data_nodes/mock_signal.py,sha256=UtfrHo9bnHfO5aaXZXh8dVhP0CqjXe1WE-l9cdjLNKU,3447
96
101
  mainsequence/virtualfundbuilder/contrib/data_nodes/portfolio_replicator.py,sha256=EitkOzOX_OpNZGInkfyybZNiyHxx9jGA1utu3GTIS4U,10321
97
102
  mainsequence/virtualfundbuilder/contrib/prices/__init__.py,sha256=m27GuJPSzOYAhMuTo1xv3aBDigvSxufZ2HQANKbyaVA,58
98
- mainsequence/virtualfundbuilder/contrib/prices/data_nodes.py,sha256=pFbrTxbrbnRB531-JJJn7CXqh7X8eu_c-3-Rek3b-nw,32228
103
+ mainsequence/virtualfundbuilder/contrib/prices/data_nodes.py,sha256=U6AVYDCb41u-fcdQnVXthOSNq9bDA32bSUTdMxkL1aM,32237
99
104
  mainsequence/virtualfundbuilder/contrib/prices/utils.py,sha256=Mg0Xjty4264N2wqwKX7DC_44_1vQi2xaOzp-EVJxIeg,358
100
105
  mainsequence/virtualfundbuilder/contrib/rebalance_strategies/__init__.py,sha256=qeRNqy36lPrzzthnIbZ3X7q-1KPuAfr-amnA6Bo46RE,35
101
106
  mainsequence/virtualfundbuilder/contrib/rebalance_strategies/rebalance_strategies.py,sha256=C0sleZsFVzl26iw_l07zkkdBTp5k9gokIWCZvxLMxl0,14493
@@ -104,9 +109,9 @@ mainsequence/virtualfundbuilder/resource_factory/app_factory.py,sha256=XSZo9ImdT
104
109
  mainsequence/virtualfundbuilder/resource_factory/base_factory.py,sha256=jPXdK2WCaNw3r6kP3sZGIL7M4ygfIMs8ek3Yq4QYQZg,9434
105
110
  mainsequence/virtualfundbuilder/resource_factory/rebalance_factory.py,sha256=ysEeJrlbxrMPA7wFw7KDtuCTzXYkdfYZuxUFpPPY7vE,3732
106
111
  mainsequence/virtualfundbuilder/resource_factory/signal_factory.py,sha256=ywa7vxxLlQopuRwwRKyj866ftgaj8uKVoiPQ9YJ2IIo,7198
107
- mainsequence-2.0.4b0.dist-info/licenses/LICENSE,sha256=fXoCKgEuZXmP84_QDXpvO18QHze_6AAhd-zvZBUjJxQ,4524
108
- mainsequence-2.0.4b0.dist-info/METADATA,sha256=MJTXQZJGKRolfV8q3HtsNOAb6d_CUdWE7URRlPTGg84,8030
109
- mainsequence-2.0.4b0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
110
- mainsequence-2.0.4b0.dist-info/entry_points.txt,sha256=2J8TprrUndh7AttNTlXAaxgGtkXFUAHgXs-M7DCj5MU,58
111
- mainsequence-2.0.4b0.dist-info/top_level.txt,sha256=uSLD9rXMDMN0cc1x0p808bwyQMoRmYY2pdQZEWLajX8,13
112
- mainsequence-2.0.4b0.dist-info/RECORD,,
112
+ mainsequence-3.0.1.dist-info/licenses/LICENSE,sha256=fXoCKgEuZXmP84_QDXpvO18QHze_6AAhd-zvZBUjJxQ,4524
113
+ mainsequence-3.0.1.dist-info/METADATA,sha256=0wfqq0c1BIKAVkvSZE-qLkQs13IqzVDHV9q10cj8Wyo,8028
114
+ mainsequence-3.0.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
115
+ mainsequence-3.0.1.dist-info/entry_points.txt,sha256=2J8TprrUndh7AttNTlXAaxgGtkXFUAHgXs-M7DCj5MU,58
116
+ mainsequence-3.0.1.dist-info/top_level.txt,sha256=uSLD9rXMDMN0cc1x0p808bwyQMoRmYY2pdQZEWLajX8,13
117
+ mainsequence-3.0.1.dist-info/RECORD,,