mainsequence 2.0.4rc0__py3-none-any.whl → 3.0.2__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 (33) hide show
  1. mainsequence/cli/cli.py +4 -7
  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/exceptions.py +11 -0
  7. mainsequence/client/models_helpers.py +2 -2
  8. mainsequence/client/models_tdag.py +104 -87
  9. mainsequence/client/models_vam.py +9 -9
  10. mainsequence/dashboards/streamlit/core/theme.py +128 -109
  11. mainsequence/dashboards/streamlit/scaffold.py +3 -0
  12. mainsequence/instruments/__init__.py +1 -1
  13. mainsequence/instruments/data_interface/__init__.py +1 -1
  14. mainsequence/instruments/data_interface/data_interface.py +31 -11
  15. mainsequence/instruments/instruments/bond.py +8 -0
  16. mainsequence/instruments/pricing_models/indices.py +26 -14
  17. mainsequence/instruments/settings.py +2 -162
  18. mainsequence/tdag/config.py +2 -2
  19. mainsequence/tdag/data_nodes/build_operations.py +3 -3
  20. mainsequence/tdag/data_nodes/data_nodes.py +23 -23
  21. mainsequence/tdag/data_nodes/persist_managers.py +121 -121
  22. mainsequence/tdag/data_nodes/run_operations.py +25 -25
  23. mainsequence/virtualfundbuilder/contrib/apps/portfolio_report_app.py +1 -1
  24. mainsequence/virtualfundbuilder/contrib/prices/data_nodes.py +2 -2
  25. mainsequence/virtualfundbuilder/data_nodes.py +1 -1
  26. mainsequence/virtualfundbuilder/portfolio_interface.py +7 -7
  27. mainsequence/virtualfundbuilder/utils.py +2 -2
  28. {mainsequence-2.0.4rc0.dist-info → mainsequence-3.0.2.dist-info}/METADATA +1 -1
  29. {mainsequence-2.0.4rc0.dist-info → mainsequence-3.0.2.dist-info}/RECORD +33 -32
  30. {mainsequence-2.0.4rc0.dist-info → mainsequence-3.0.2.dist-info}/WHEEL +0 -0
  31. {mainsequence-2.0.4rc0.dist-info → mainsequence-3.0.2.dist-info}/entry_points.txt +0 -0
  32. {mainsequence-2.0.4rc0.dist-info → mainsequence-3.0.2.dist-info}/licenses/LICENSE +0 -0
  33. {mainsequence-2.0.4rc0.dist-info → mainsequence-3.0.2.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.4rc0
3
+ Version: 3.0.2
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,22 +3,23 @@ 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=XURBOlfLvE_n5IkIXOsMOWhyOPWe0ZUCyIBTEfjnUro,17503
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/exceptions.py,sha256=pon9585d5RyMfCVy6dyfpDJ9tCH2ugQ4ptq-eqAl2rY,295
12
+ mainsequence/client/models_helpers.py,sha256=aXANVSt8qMhI4Diwe_1k4-P6NnJANYvCAfDWQhqGQX8,4095
12
13
  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
14
+ mainsequence/client/models_tdag.py,sha256=bzHnu0_dFY2-DZ8CeS9Um8cc8aaXLldmlBL2abOgxXw,95529
15
+ mainsequence/client/models_vam.py,sha256=4dqJkGyVboabo844LjUWO1sTxt40OshzrRoTfSTo-lU,72891
15
16
  mainsequence/client/utils.py,sha256=4aLctRMmQdFtLzaI9b28ifP141pO-VAmiQ7wTdHpqGg,11665
16
17
  mainsequence/client/data_sources_interfaces/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
17
18
  mainsequence/client/data_sources_interfaces/duckdb.py,sha256=cOvq_241eU6jPUw3DqLQDBWOUt3cXkP9UaMWzLhSG0M,67207
18
- mainsequence/client/data_sources_interfaces/timescale.py,sha256=y_-vnX2JPUnweuajmBSPQxirNAA7BeljuYfYiFrlKcU,20126
19
+ mainsequence/client/data_sources_interfaces/timescale.py,sha256=UkbFnYKv50-qPJDdYXgYOh_e3ildpJyzjC6oD7q6uUk,20318
19
20
  mainsequence/dashboards/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
20
21
  mainsequence/dashboards/streamlit/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
21
- mainsequence/dashboards/streamlit/scaffold.py,sha256=oOhwHmzwgeDTDQgDwzPvTkWrkf_-KmI1ankOi7r5IUk,7532
22
+ mainsequence/dashboards/streamlit/scaffold.py,sha256=ww-ON3-ZPSPBPPJPISAOXl0000dI93s3_258uJLhjGA,7535
22
23
  mainsequence/dashboards/streamlit/assets/config.toml,sha256=GCsLTasaF9kJlRRY1SnXLY-X5PyzLkGG4LX48gefkcc,314
23
24
  mainsequence/dashboards/streamlit/assets/favicon.png,sha256=-CHfKx6jfMlXb8TnFQh2BNIBiKeVFfxK7g9K9BaqX6I,347
24
25
  mainsequence/dashboards/streamlit/assets/image_1_base64.txt,sha256=Smm9HT5A6FhC8FUvj9HYEREwUostku8igxiJsS5CT4Q,315018
@@ -28,19 +29,19 @@ mainsequence/dashboards/streamlit/assets/image_4_base64.txt,sha256=4KiKYChYUNLB-
28
29
  mainsequence/dashboards/streamlit/assets/image_5_base64.txt,sha256=E9Xl4dSMhc_2z-ipHh7BAXsd6Gz2si8dP5NjjhQhyVc,592742
29
30
  mainsequence/dashboards/streamlit/assets/logo.png,sha256=20KBis07H579XnXi0vMNzcjFyaAfW0CmI_dOtj-UYc4,34970
30
31
  mainsequence/dashboards/streamlit/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
31
- mainsequence/dashboards/streamlit/core/theme.py,sha256=Uq0xcv9seSo_FEzwWPPON9Ab5xZ1k0JuffhRL5k2vy8,7939
32
+ mainsequence/dashboards/streamlit/core/theme.py,sha256=CBmrv7mu7V7lDzml8inMP41hYfaUpk7mC7tbpa9ug4s,8087
32
33
  mainsequence/dashboards/streamlit/pages/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
33
34
  mainsequence/instrumentation/__init__.py,sha256=qfHOseVGOW_WdoTgw7TWZYpF1REwf14eF9awxWcLtfI,154
34
35
  mainsequence/instrumentation/utils.py,sha256=XgVg9FijubSy5qMNw0yCkl5TMD2n56TnT4Q58WfZXbw,3354
35
- mainsequence/instruments/__init__.py,sha256=RZzyEw7P9mcNKhTd8G1a59xdDBEgUgtSLCuac49svtA,52
36
+ mainsequence/instruments/__init__.py,sha256=zw8w75sitdpkfqmDpiqc6wjVb0KXz1in8Z_eybautug,28
36
37
  mainsequence/instruments/instruments.default.toml,sha256=RnCWtS7YJ4t_JqTHJWUdvJhEf-SkADsnQzAyhJZTcXA,452
37
- mainsequence/instruments/settings.py,sha256=Jtwg9rO42uJ7DOL6HkW8RPgkDxE-G2YDuw0QcU8itrA,5857
38
+ mainsequence/instruments/settings.py,sha256=QbgNar9gEkaFrpMUM79T7SWkoBcvFVMAKVL8CvSlB4g,279
38
39
  mainsequence/instruments/utils.py,sha256=eiqaTfcq4iulSdEwgi1sMq8xAKK8ONl22a-FNItcbYk,698
39
- mainsequence/instruments/data_interface/__init__.py,sha256=Mz-Xx-qLNwI-iIJGL2ik-veUZuraU4aaDyUKhcOXsLg,548
40
- mainsequence/instruments/data_interface/data_interface.py,sha256=Xrvm8GQgALSTxt4vWK888J49X7pXisiitB2DTu9KnCg,15229
40
+ mainsequence/instruments/data_interface/__init__.py,sha256=aQNXx0csDadrwwFqDlYKRwnqIk1OREsYF7ybjm29Ipo,556
41
+ mainsequence/instruments/data_interface/data_interface.py,sha256=XDTk7BUApt_H5sGhhtQKycrBLT3iPoF1EUarfM22lEg,16014
41
42
  mainsequence/instruments/instruments/__init__.py,sha256=Xe1hCMsOGc3IyyfA90Xuv7pO9t8TctpM7fo-6hML9Cg,154
42
43
  mainsequence/instruments/instruments/base_instrument.py,sha256=XQeZxDSGhZ_ZNut3867I_q3UvDvp9VZDW4VRzyyFe-A,3185
43
- mainsequence/instruments/instruments/bond.py,sha256=tm1Xr-OX2kbAzEZin5qbFBPhWyrFNUjLf7aWVQ6FTzg,17432
44
+ mainsequence/instruments/instruments/bond.py,sha256=DNFm9zAFdiLoEjZaEoJJUMuPYHzZ3krVFxZ0VBhRmoU,17925
44
45
  mainsequence/instruments/instruments/european_option.py,sha256=amyl52DsgOSMDiMZn4CbmWA4QGfVn38ojVVMhdOLKXM,2760
45
46
  mainsequence/instruments/instruments/interest_rate_swap.py,sha256=GJLi4yiIZNwjASLiOnEGw2owCh-v4NDQdcONNWS-wGs,7893
46
47
  mainsequence/instruments/instruments/json_codec.py,sha256=94sOEL2N7nPMUsleB3GD3FzwYy5sVYsgthvQ2g8u9gE,22070
@@ -52,7 +53,7 @@ mainsequence/instruments/pricing_models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5J
52
53
  mainsequence/instruments/pricing_models/black_scholes.py,sha256=bs7fsgiDKRuBZo7fvemVdmUHN-NjC2v6XUjhPaLNC-4,1588
53
54
  mainsequence/instruments/pricing_models/bond_pricer.py,sha256=JXBOsDonlLwYG3GyHGD7rV1cddCPot8ZgE1Th-tHiqY,6566
54
55
  mainsequence/instruments/pricing_models/fx_option_pricer.py,sha256=cMRejaIo3ZEhKCS960C7lg8ejh3b9RqIfL3Hhj4LB0A,3292
55
- mainsequence/instruments/pricing_models/indices.py,sha256=20FgSKeWu7L2bpAZ1zklUnJ6SOi1BJk7yt1WfKPfDLg,12923
56
+ mainsequence/instruments/pricing_models/indices.py,sha256=yptDA8joZ5wD28Xljp7jcE77MCEMK3EF1ScRCBanNEs,13552
56
57
  mainsequence/instruments/pricing_models/knockout_fx_pricer.py,sha256=FrO1uRn63zktkm6LwfLKZf0vPn5x0NOCBIPfSPEIO9c,6772
57
58
  mainsequence/instruments/pricing_models/swap_pricer.py,sha256=vQXL1pgWPS9EUu8xXDyrA6QZm-t7wH0Hx3GU3yl1HHw,17994
58
59
  mainsequence/reportbuilder/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -62,32 +63,32 @@ mainsequence/reportbuilder/slide_templates.py,sha256=VCHtrWl0FJIGGyo3cdHUjMCQuuO
62
63
  mainsequence/reportbuilder/examples/ms_template_report.py,sha256=pOfUcVqixmyWMArJvJ340L1SWaD3SAnXHTHcHFgVeok,39208
63
64
  mainsequence/tdag/__init__.py,sha256=CFxObmFsuyq06hOSxpv0VceZgOuDC8ebm_u7evQW0Bs,210
64
65
  mainsequence/tdag/__main__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
65
- mainsequence/tdag/config.py,sha256=oscijihkIloNwOaqLubxQoB3H8JT5rBb2aU0yP_alYE,3824
66
+ mainsequence/tdag/config.py,sha256=4nbr943wsAGfr9h1BQX9Z41_O5DHNsR-0sOxOkUIFNs,3834
66
67
  mainsequence/tdag/future_registry.py,sha256=wWD_u9pFt2tP80ra22kkvQT3cNj-ELmocoeXE9UUTPM,732
67
68
  mainsequence/tdag/utils.py,sha256=vxEBaz94ZC1lm-Nc1OZMvpPJLVDSI8lGYn-RozcuGbo,1025
68
69
  mainsequence/tdag/data_nodes/__init__.py,sha256=nyNxBWGTE1aoNtZAMMTNnQP-mZ6aU0zcvnKcd0EeXrs,103
69
- mainsequence/tdag/data_nodes/build_operations.py,sha256=23CruSozk1-FhAg6JLGVubiXKFyLe9qWv4dw1sltFxI,28348
70
- mainsequence/tdag/data_nodes/data_nodes.py,sha256=4TTEs4Wpa_-mp0gq8zjps3sOv-bDxh4gu4cqhvazpdQ,51727
71
- mainsequence/tdag/data_nodes/persist_managers.py,sha256=11NtBm-J0lhr6VHSD9R3eFadgrGEMTalFNRpNgrA_OA,33440
72
- mainsequence/tdag/data_nodes/run_operations.py,sha256=Oy51i6kCJmKFiUmqHZBT3PwESfspi4SzUR-RNIk0_78,23428
70
+ mainsequence/tdag/data_nodes/build_operations.py,sha256=4mQZYqF2j_ljwZUeg0yEsBh5cgdR-Q5QpqBrex1T64A,28377
71
+ mainsequence/tdag/data_nodes/data_nodes.py,sha256=3K3Ehen8FnPKyQ_-kuo85U_hquOUTQ9ExLs2iVr0mfo,51772
72
+ mainsequence/tdag/data_nodes/persist_managers.py,sha256=v0SizLXvWjk4-nClmipfAB44s13Ofsj5EsBaJeYhg7o,33978
73
+ mainsequence/tdag/data_nodes/run_operations.py,sha256=Q94Ef9qf13tCt2rpc5rPHEVTH987BT07se-14gfKcns,23473
73
74
  mainsequence/tdag/data_nodes/utils.py,sha256=atFF14Gg_itQs1J8BrmVSJl8Us29qu7fdCooDqFvP78,613
74
75
  mainsequence/virtualfundbuilder/__init__.py,sha256=sOqlMt1qteORAHc_PDjUI9gZY1Bh86nTAd_ZtxfuQcQ,1438
75
76
  mainsequence/virtualfundbuilder/__main__.py,sha256=mdj8cQ1Zims8ZkX8TR4zVSCEzTtzPpaxInQmXY0WBYM,8873
76
77
  mainsequence/virtualfundbuilder/agent_interface.py,sha256=1xUZCvP1XcHp9JZanIRAFBydAaP7uUoGH02B6kkTywo,2744
77
78
  mainsequence/virtualfundbuilder/config_handling.py,sha256=pDQB7SIY2-Hqh1wRhcDa3bOAWAwCezbmRG6TwlzzRHQ,3982
78
- mainsequence/virtualfundbuilder/data_nodes.py,sha256=NvazPj2UOsIlqz1yiuvgNORAO_FIUNxtRJH6nRU2vkk,27838
79
+ mainsequence/virtualfundbuilder/data_nodes.py,sha256=o26GYQ1rHbN7upY23fzBV4Ab69LBsberizOo6ScAkak,27838
79
80
  mainsequence/virtualfundbuilder/enums.py,sha256=aTNmhK9Syp0ZuhzfQ_-Hsdr_u53SQShUL84CD3kVgMA,544
80
81
  mainsequence/virtualfundbuilder/models.py,sha256=eoRXICs2wcyCP2-64ki9VXyJicfFku9dG4xcAW1a7ko,11666
81
82
  mainsequence/virtualfundbuilder/notebook_handling.py,sha256=R_iiqQvP8ReEEYxk6vCcgcUg6SjFBsU1oVpZk8jC3X0,1148
82
- mainsequence/virtualfundbuilder/portfolio_interface.py,sha256=ejYXLDgxDQsIQWQjGcT7N9iXhArcmaSDg-Lnelw1o5U,12303
83
- mainsequence/virtualfundbuilder/utils.py,sha256=XwWtout8EitwY-iD49zebgzSNHoACfxKXrh2-rjLs7M,15128
83
+ mainsequence/virtualfundbuilder/portfolio_interface.py,sha256=mDlI7XpaLvRCINK0-dmKdylp4ymadPsoryDts-KkR5I,12303
84
+ mainsequence/virtualfundbuilder/utils.py,sha256=ybmyMNQaHRHgZ23g2UoYZ37Ic1pdrty89mFbHZN4huE,15146
84
85
  mainsequence/virtualfundbuilder/contrib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
85
86
  mainsequence/virtualfundbuilder/contrib/apps/__init__.py,sha256=oBt3cy1TxA87ZesCm9djRYEyGnRvAuNs3wVOYm1i4Kk,259
86
87
  mainsequence/virtualfundbuilder/contrib/apps/etf_replicator_app.py,sha256=a9lR8un2av7rp-N-DT0eQjOvWglBUUKRgosfV7HO3dc,7960
87
88
  mainsequence/virtualfundbuilder/contrib/apps/generate_report.py,sha256=Q5O63AUpQQEDJRSR3KvkpE6644l4FwQaVQKz8ZXpjwc,12891
88
89
  mainsequence/virtualfundbuilder/contrib/apps/load_external_portfolio.py,sha256=flp0LQbCZHckZLPRi9RIWXjhP99gBaE0lNIROoitQ5Y,4544
89
90
  mainsequence/virtualfundbuilder/contrib/apps/news_app.py,sha256=I0GfkxIIfnk--nc0qfyCad4ZrlvwJpfntL2SLMjI_z4,20156
90
- mainsequence/virtualfundbuilder/contrib/apps/portfolio_report_app.py,sha256=dFwx8Kea0K-Lo29O3cLdR-ldLX4pGviKtPmusARMEdQ,3672
91
+ mainsequence/virtualfundbuilder/contrib/apps/portfolio_report_app.py,sha256=lK8QaelSp02Te74GNorRpk35LhQjv90aNhz2_PomAdQ,3672
91
92
  mainsequence/virtualfundbuilder/contrib/apps/portfolio_table.py,sha256=oJxUnskf2bDJIGs09_r1TgDbU4xJYwYVh6r_eQNx8BM,4906
92
93
  mainsequence/virtualfundbuilder/contrib/apps/run_named_portfolio.py,sha256=qu36aMC0VZhirfum-s0PJ8jASuY7VrA75kxI51AuXE4,1809
93
94
  mainsequence/virtualfundbuilder/contrib/apps/run_portfolio.py,sha256=a6A23aiyRk0EBfRR3e_sKqhRARWHoQd7lGxjymdwUlk,1649
@@ -100,7 +101,7 @@ mainsequence/virtualfundbuilder/contrib/data_nodes/market_cap.py,sha256=LjfDMqW1
100
101
  mainsequence/virtualfundbuilder/contrib/data_nodes/mock_signal.py,sha256=UtfrHo9bnHfO5aaXZXh8dVhP0CqjXe1WE-l9cdjLNKU,3447
101
102
  mainsequence/virtualfundbuilder/contrib/data_nodes/portfolio_replicator.py,sha256=EitkOzOX_OpNZGInkfyybZNiyHxx9jGA1utu3GTIS4U,10321
102
103
  mainsequence/virtualfundbuilder/contrib/prices/__init__.py,sha256=m27GuJPSzOYAhMuTo1xv3aBDigvSxufZ2HQANKbyaVA,58
103
- mainsequence/virtualfundbuilder/contrib/prices/data_nodes.py,sha256=pFbrTxbrbnRB531-JJJn7CXqh7X8eu_c-3-Rek3b-nw,32228
104
+ mainsequence/virtualfundbuilder/contrib/prices/data_nodes.py,sha256=U6AVYDCb41u-fcdQnVXthOSNq9bDA32bSUTdMxkL1aM,32237
104
105
  mainsequence/virtualfundbuilder/contrib/prices/utils.py,sha256=Mg0Xjty4264N2wqwKX7DC_44_1vQi2xaOzp-EVJxIeg,358
105
106
  mainsequence/virtualfundbuilder/contrib/rebalance_strategies/__init__.py,sha256=qeRNqy36lPrzzthnIbZ3X7q-1KPuAfr-amnA6Bo46RE,35
106
107
  mainsequence/virtualfundbuilder/contrib/rebalance_strategies/rebalance_strategies.py,sha256=C0sleZsFVzl26iw_l07zkkdBTp5k9gokIWCZvxLMxl0,14493
@@ -109,9 +110,9 @@ mainsequence/virtualfundbuilder/resource_factory/app_factory.py,sha256=XSZo9ImdT
109
110
  mainsequence/virtualfundbuilder/resource_factory/base_factory.py,sha256=jPXdK2WCaNw3r6kP3sZGIL7M4ygfIMs8ek3Yq4QYQZg,9434
110
111
  mainsequence/virtualfundbuilder/resource_factory/rebalance_factory.py,sha256=ysEeJrlbxrMPA7wFw7KDtuCTzXYkdfYZuxUFpPPY7vE,3732
111
112
  mainsequence/virtualfundbuilder/resource_factory/signal_factory.py,sha256=ywa7vxxLlQopuRwwRKyj866ftgaj8uKVoiPQ9YJ2IIo,7198
112
- mainsequence-2.0.4rc0.dist-info/licenses/LICENSE,sha256=fXoCKgEuZXmP84_QDXpvO18QHze_6AAhd-zvZBUjJxQ,4524
113
- mainsequence-2.0.4rc0.dist-info/METADATA,sha256=3H2QqoxvIzCwiowe4IYl7NpexP4w5By56SAIgxov0Ss,8031
114
- mainsequence-2.0.4rc0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
115
- mainsequence-2.0.4rc0.dist-info/entry_points.txt,sha256=2J8TprrUndh7AttNTlXAaxgGtkXFUAHgXs-M7DCj5MU,58
116
- mainsequence-2.0.4rc0.dist-info/top_level.txt,sha256=uSLD9rXMDMN0cc1x0p808bwyQMoRmYY2pdQZEWLajX8,13
117
- mainsequence-2.0.4rc0.dist-info/RECORD,,
113
+ mainsequence-3.0.2.dist-info/licenses/LICENSE,sha256=fXoCKgEuZXmP84_QDXpvO18QHze_6AAhd-zvZBUjJxQ,4524
114
+ mainsequence-3.0.2.dist-info/METADATA,sha256=Sjbad1ij3ayfAZzZkzzr0-se9kqL6vQU9X5XHWTKC9Y,8028
115
+ mainsequence-3.0.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
116
+ mainsequence-3.0.2.dist-info/entry_points.txt,sha256=2J8TprrUndh7AttNTlXAaxgGtkXFUAHgXs-M7DCj5MU,58
117
+ mainsequence-3.0.2.dist-info/top_level.txt,sha256=uSLD9rXMDMN0cc1x0p808bwyQMoRmYY2pdQZEWLajX8,13
118
+ mainsequence-3.0.2.dist-info/RECORD,,