mainsequence 2.0.4rc0__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 (29) 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/models_helpers.py +2 -2
  7. mainsequence/client/models_tdag.py +96 -86
  8. mainsequence/client/models_vam.py +9 -9
  9. mainsequence/instruments/__init__.py +1 -1
  10. mainsequence/instruments/data_interface/__init__.py +1 -1
  11. mainsequence/instruments/data_interface/data_interface.py +3 -4
  12. mainsequence/instruments/pricing_models/indices.py +29 -14
  13. mainsequence/instruments/settings.py +2 -162
  14. mainsequence/tdag/config.py +2 -2
  15. mainsequence/tdag/data_nodes/build_operations.py +3 -3
  16. mainsequence/tdag/data_nodes/data_nodes.py +23 -23
  17. mainsequence/tdag/data_nodes/persist_managers.py +121 -121
  18. mainsequence/tdag/data_nodes/run_operations.py +25 -25
  19. mainsequence/virtualfundbuilder/contrib/apps/portfolio_report_app.py +1 -1
  20. mainsequence/virtualfundbuilder/contrib/prices/data_nodes.py +2 -2
  21. mainsequence/virtualfundbuilder/data_nodes.py +1 -1
  22. mainsequence/virtualfundbuilder/portfolio_interface.py +7 -7
  23. mainsequence/virtualfundbuilder/utils.py +2 -2
  24. {mainsequence-2.0.4rc0.dist-info → mainsequence-3.0.1.dist-info}/METADATA +1 -1
  25. {mainsequence-2.0.4rc0.dist-info → mainsequence-3.0.1.dist-info}/RECORD +29 -29
  26. {mainsequence-2.0.4rc0.dist-info → mainsequence-3.0.1.dist-info}/WHEEL +0 -0
  27. {mainsequence-2.0.4rc0.dist-info → mainsequence-3.0.1.dist-info}/entry_points.txt +0 -0
  28. {mainsequence-2.0.4rc0.dist-info → mainsequence-3.0.1.dist-info}/licenses/LICENSE +0 -0
  29. {mainsequence-2.0.4rc0.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.4rc0
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,19 +3,19 @@ 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/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
@@ -32,12 +32,12 @@ mainsequence/dashboards/streamlit/core/theme.py,sha256=Uq0xcv9seSo_FEzwWPPON9Ab5
32
32
  mainsequence/dashboards/streamlit/pages/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
33
33
  mainsequence/instrumentation/__init__.py,sha256=qfHOseVGOW_WdoTgw7TWZYpF1REwf14eF9awxWcLtfI,154
34
34
  mainsequence/instrumentation/utils.py,sha256=XgVg9FijubSy5qMNw0yCkl5TMD2n56TnT4Q58WfZXbw,3354
35
- mainsequence/instruments/__init__.py,sha256=RZzyEw7P9mcNKhTd8G1a59xdDBEgUgtSLCuac49svtA,52
35
+ mainsequence/instruments/__init__.py,sha256=zw8w75sitdpkfqmDpiqc6wjVb0KXz1in8Z_eybautug,28
36
36
  mainsequence/instruments/instruments.default.toml,sha256=RnCWtS7YJ4t_JqTHJWUdvJhEf-SkADsnQzAyhJZTcXA,452
37
- mainsequence/instruments/settings.py,sha256=Jtwg9rO42uJ7DOL6HkW8RPgkDxE-G2YDuw0QcU8itrA,5857
37
+ mainsequence/instruments/settings.py,sha256=QbgNar9gEkaFrpMUM79T7SWkoBcvFVMAKVL8CvSlB4g,279
38
38
  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
39
+ mainsequence/instruments/data_interface/__init__.py,sha256=aQNXx0csDadrwwFqDlYKRwnqIk1OREsYF7ybjm29Ipo,556
40
+ mainsequence/instruments/data_interface/data_interface.py,sha256=tK_-8XooHGWCTVRWdYRQk38-2c9ZVSS78xdhPnMK0Nk,15142
41
41
  mainsequence/instruments/instruments/__init__.py,sha256=Xe1hCMsOGc3IyyfA90Xuv7pO9t8TctpM7fo-6hML9Cg,154
42
42
  mainsequence/instruments/instruments/base_instrument.py,sha256=XQeZxDSGhZ_ZNut3867I_q3UvDvp9VZDW4VRzyyFe-A,3185
43
43
  mainsequence/instruments/instruments/bond.py,sha256=tm1Xr-OX2kbAzEZin5qbFBPhWyrFNUjLf7aWVQ6FTzg,17432
@@ -52,7 +52,7 @@ mainsequence/instruments/pricing_models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5J
52
52
  mainsequence/instruments/pricing_models/black_scholes.py,sha256=bs7fsgiDKRuBZo7fvemVdmUHN-NjC2v6XUjhPaLNC-4,1588
53
53
  mainsequence/instruments/pricing_models/bond_pricer.py,sha256=JXBOsDonlLwYG3GyHGD7rV1cddCPot8ZgE1Th-tHiqY,6566
54
54
  mainsequence/instruments/pricing_models/fx_option_pricer.py,sha256=cMRejaIo3ZEhKCS960C7lg8ejh3b9RqIfL3Hhj4LB0A,3292
55
- mainsequence/instruments/pricing_models/indices.py,sha256=20FgSKeWu7L2bpAZ1zklUnJ6SOi1BJk7yt1WfKPfDLg,12923
55
+ mainsequence/instruments/pricing_models/indices.py,sha256=NEYu94uBw11afIPohnQ3qhqjLXyd1FEI1lKhyvTvrRM,13749
56
56
  mainsequence/instruments/pricing_models/knockout_fx_pricer.py,sha256=FrO1uRn63zktkm6LwfLKZf0vPn5x0NOCBIPfSPEIO9c,6772
57
57
  mainsequence/instruments/pricing_models/swap_pricer.py,sha256=vQXL1pgWPS9EUu8xXDyrA6QZm-t7wH0Hx3GU3yl1HHw,17994
58
58
  mainsequence/reportbuilder/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -62,32 +62,32 @@ mainsequence/reportbuilder/slide_templates.py,sha256=VCHtrWl0FJIGGyo3cdHUjMCQuuO
62
62
  mainsequence/reportbuilder/examples/ms_template_report.py,sha256=pOfUcVqixmyWMArJvJ340L1SWaD3SAnXHTHcHFgVeok,39208
63
63
  mainsequence/tdag/__init__.py,sha256=CFxObmFsuyq06hOSxpv0VceZgOuDC8ebm_u7evQW0Bs,210
64
64
  mainsequence/tdag/__main__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
65
- mainsequence/tdag/config.py,sha256=oscijihkIloNwOaqLubxQoB3H8JT5rBb2aU0yP_alYE,3824
65
+ mainsequence/tdag/config.py,sha256=4nbr943wsAGfr9h1BQX9Z41_O5DHNsR-0sOxOkUIFNs,3834
66
66
  mainsequence/tdag/future_registry.py,sha256=wWD_u9pFt2tP80ra22kkvQT3cNj-ELmocoeXE9UUTPM,732
67
67
  mainsequence/tdag/utils.py,sha256=vxEBaz94ZC1lm-Nc1OZMvpPJLVDSI8lGYn-RozcuGbo,1025
68
68
  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
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
73
73
  mainsequence/tdag/data_nodes/utils.py,sha256=atFF14Gg_itQs1J8BrmVSJl8Us29qu7fdCooDqFvP78,613
74
74
  mainsequence/virtualfundbuilder/__init__.py,sha256=sOqlMt1qteORAHc_PDjUI9gZY1Bh86nTAd_ZtxfuQcQ,1438
75
75
  mainsequence/virtualfundbuilder/__main__.py,sha256=mdj8cQ1Zims8ZkX8TR4zVSCEzTtzPpaxInQmXY0WBYM,8873
76
76
  mainsequence/virtualfundbuilder/agent_interface.py,sha256=1xUZCvP1XcHp9JZanIRAFBydAaP7uUoGH02B6kkTywo,2744
77
77
  mainsequence/virtualfundbuilder/config_handling.py,sha256=pDQB7SIY2-Hqh1wRhcDa3bOAWAwCezbmRG6TwlzzRHQ,3982
78
- mainsequence/virtualfundbuilder/data_nodes.py,sha256=NvazPj2UOsIlqz1yiuvgNORAO_FIUNxtRJH6nRU2vkk,27838
78
+ mainsequence/virtualfundbuilder/data_nodes.py,sha256=o26GYQ1rHbN7upY23fzBV4Ab69LBsberizOo6ScAkak,27838
79
79
  mainsequence/virtualfundbuilder/enums.py,sha256=aTNmhK9Syp0ZuhzfQ_-Hsdr_u53SQShUL84CD3kVgMA,544
80
80
  mainsequence/virtualfundbuilder/models.py,sha256=eoRXICs2wcyCP2-64ki9VXyJicfFku9dG4xcAW1a7ko,11666
81
81
  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
82
+ mainsequence/virtualfundbuilder/portfolio_interface.py,sha256=mDlI7XpaLvRCINK0-dmKdylp4ymadPsoryDts-KkR5I,12303
83
+ mainsequence/virtualfundbuilder/utils.py,sha256=ybmyMNQaHRHgZ23g2UoYZ37Ic1pdrty89mFbHZN4huE,15146
84
84
  mainsequence/virtualfundbuilder/contrib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
85
85
  mainsequence/virtualfundbuilder/contrib/apps/__init__.py,sha256=oBt3cy1TxA87ZesCm9djRYEyGnRvAuNs3wVOYm1i4Kk,259
86
86
  mainsequence/virtualfundbuilder/contrib/apps/etf_replicator_app.py,sha256=a9lR8un2av7rp-N-DT0eQjOvWglBUUKRgosfV7HO3dc,7960
87
87
  mainsequence/virtualfundbuilder/contrib/apps/generate_report.py,sha256=Q5O63AUpQQEDJRSR3KvkpE6644l4FwQaVQKz8ZXpjwc,12891
88
88
  mainsequence/virtualfundbuilder/contrib/apps/load_external_portfolio.py,sha256=flp0LQbCZHckZLPRi9RIWXjhP99gBaE0lNIROoitQ5Y,4544
89
89
  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
90
+ mainsequence/virtualfundbuilder/contrib/apps/portfolio_report_app.py,sha256=lK8QaelSp02Te74GNorRpk35LhQjv90aNhz2_PomAdQ,3672
91
91
  mainsequence/virtualfundbuilder/contrib/apps/portfolio_table.py,sha256=oJxUnskf2bDJIGs09_r1TgDbU4xJYwYVh6r_eQNx8BM,4906
92
92
  mainsequence/virtualfundbuilder/contrib/apps/run_named_portfolio.py,sha256=qu36aMC0VZhirfum-s0PJ8jASuY7VrA75kxI51AuXE4,1809
93
93
  mainsequence/virtualfundbuilder/contrib/apps/run_portfolio.py,sha256=a6A23aiyRk0EBfRR3e_sKqhRARWHoQd7lGxjymdwUlk,1649
@@ -100,7 +100,7 @@ mainsequence/virtualfundbuilder/contrib/data_nodes/market_cap.py,sha256=LjfDMqW1
100
100
  mainsequence/virtualfundbuilder/contrib/data_nodes/mock_signal.py,sha256=UtfrHo9bnHfO5aaXZXh8dVhP0CqjXe1WE-l9cdjLNKU,3447
101
101
  mainsequence/virtualfundbuilder/contrib/data_nodes/portfolio_replicator.py,sha256=EitkOzOX_OpNZGInkfyybZNiyHxx9jGA1utu3GTIS4U,10321
102
102
  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
103
+ mainsequence/virtualfundbuilder/contrib/prices/data_nodes.py,sha256=U6AVYDCb41u-fcdQnVXthOSNq9bDA32bSUTdMxkL1aM,32237
104
104
  mainsequence/virtualfundbuilder/contrib/prices/utils.py,sha256=Mg0Xjty4264N2wqwKX7DC_44_1vQi2xaOzp-EVJxIeg,358
105
105
  mainsequence/virtualfundbuilder/contrib/rebalance_strategies/__init__.py,sha256=qeRNqy36lPrzzthnIbZ3X7q-1KPuAfr-amnA6Bo46RE,35
106
106
  mainsequence/virtualfundbuilder/contrib/rebalance_strategies/rebalance_strategies.py,sha256=C0sleZsFVzl26iw_l07zkkdBTp5k9gokIWCZvxLMxl0,14493
@@ -109,9 +109,9 @@ mainsequence/virtualfundbuilder/resource_factory/app_factory.py,sha256=XSZo9ImdT
109
109
  mainsequence/virtualfundbuilder/resource_factory/base_factory.py,sha256=jPXdK2WCaNw3r6kP3sZGIL7M4ygfIMs8ek3Yq4QYQZg,9434
110
110
  mainsequence/virtualfundbuilder/resource_factory/rebalance_factory.py,sha256=ysEeJrlbxrMPA7wFw7KDtuCTzXYkdfYZuxUFpPPY7vE,3732
111
111
  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,,
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,,