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.
- mainsequence/cli/cli.py +4 -7
- mainsequence/cli/ssh_utils.py +17 -2
- mainsequence/client/__init__.py +3 -3
- mainsequence/client/base.py +3 -3
- mainsequence/client/data_sources_interfaces/timescale.py +20 -19
- mainsequence/client/models_helpers.py +2 -2
- mainsequence/client/models_tdag.py +96 -86
- mainsequence/client/models_vam.py +9 -9
- mainsequence/instruments/__init__.py +1 -1
- mainsequence/instruments/data_interface/__init__.py +1 -1
- mainsequence/instruments/data_interface/data_interface.py +3 -4
- mainsequence/instruments/pricing_models/indices.py +29 -14
- mainsequence/instruments/settings.py +2 -162
- mainsequence/tdag/config.py +2 -2
- mainsequence/tdag/data_nodes/build_operations.py +3 -3
- mainsequence/tdag/data_nodes/data_nodes.py +23 -23
- mainsequence/tdag/data_nodes/persist_managers.py +121 -121
- mainsequence/tdag/data_nodes/run_operations.py +25 -25
- mainsequence/virtualfundbuilder/contrib/apps/portfolio_report_app.py +1 -1
- mainsequence/virtualfundbuilder/contrib/prices/data_nodes.py +2 -2
- mainsequence/virtualfundbuilder/data_nodes.py +1 -1
- mainsequence/virtualfundbuilder/portfolio_interface.py +7 -7
- mainsequence/virtualfundbuilder/utils.py +2 -2
- {mainsequence-2.0.4rc0.dist-info → mainsequence-3.0.1.dist-info}/METADATA +1 -1
- {mainsequence-2.0.4rc0.dist-info → mainsequence-3.0.1.dist-info}/RECORD +29 -29
- {mainsequence-2.0.4rc0.dist-info → mainsequence-3.0.1.dist-info}/WHEEL +0 -0
- {mainsequence-2.0.4rc0.dist-info → mainsequence-3.0.1.dist-info}/entry_points.txt +0 -0
- {mainsequence-2.0.4rc0.dist-info → mainsequence-3.0.1.dist-info}/licenses/LICENSE +0 -0
- {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.
|
74
|
-
time_serie_ids=[self.ts.
|
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,
|
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
|
-
|
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.
|
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["
|
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["
|
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.
|
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.
|
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
|
-
|
135
|
-
|
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
|
138
|
+
self.ts.update_details_tree = {key: v.run_configuration for key, v in data_node_updates_map.items()}
|
139
139
|
|
140
|
-
return
|
140
|
+
return data_node_updates_map, state_data
|
141
141
|
|
142
|
-
def _setup_execution_environment(self) -> Dict[int, ms_client.
|
143
|
-
|
144
|
-
return
|
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.
|
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.
|
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.
|
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.
|
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.
|
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["
|
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.
|
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.
|
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.
|
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.
|
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,
|
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.
|
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.
|
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(
|
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
|
-
|
75
|
-
|
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.
|
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.
|
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.
|
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.
|
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
|
-
|
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 =
|
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
|
|
@@ -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=
|
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=
|
9
|
-
mainsequence/client/__init__.py,sha256=
|
10
|
-
mainsequence/client/base.py,sha256=
|
11
|
-
mainsequence/client/models_helpers.py,sha256=
|
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=
|
14
|
-
mainsequence/client/models_vam.py,sha256=
|
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=
|
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=
|
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=
|
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=
|
40
|
-
mainsequence/instruments/data_interface/data_interface.py,sha256=
|
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=
|
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=
|
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=
|
70
|
-
mainsequence/tdag/data_nodes/data_nodes.py,sha256=
|
71
|
-
mainsequence/tdag/data_nodes/persist_managers.py,sha256=
|
72
|
-
mainsequence/tdag/data_nodes/run_operations.py,sha256=
|
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=
|
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=
|
83
|
-
mainsequence/virtualfundbuilder/utils.py,sha256=
|
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=
|
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=
|
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-
|
113
|
-
mainsequence-
|
114
|
-
mainsequence-
|
115
|
-
mainsequence-
|
116
|
-
mainsequence-
|
117
|
-
mainsequence-
|
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,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|