qis 3.2.8__tar.gz → 3.2.9__tar.gz
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.
- {qis-3.2.8 → qis-3.2.9}/PKG-INFO +1 -1
- {qis-3.2.8 → qis-3.2.9}/pyproject.toml +1 -1
- {qis-3.2.8 → qis-3.2.9}/qis/portfolio/multi_portfolio_data.py +39 -8
- {qis-3.2.8 → qis-3.2.9}/qis/portfolio/portfolio_data.py +7 -6
- {qis-3.2.8 → qis-3.2.9}/qis/portfolio/reports/strategy_benchmark_factsheet.py +39 -21
- {qis-3.2.8 → qis-3.2.9}/qis/settings.yaml +1 -0
- {qis-3.2.8 → qis-3.2.9}/LICENSE.txt +0 -0
- {qis-3.2.8 → qis-3.2.9}/README.md +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/__init__.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/examples/best_returns.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/examples/bootstrap_analysis.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/examples/boxplot_conditional_returns.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/examples/btc_asset_corr.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/examples/constant_notional.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/examples/constant_weight_portfolios.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/examples/core/perf_bbg_prices.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/examples/core/price_plots.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/examples/core/us_election.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/examples/credit_spreads.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/examples/europe_futures.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/examples/factsheets/multi_assets.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/examples/factsheets/multi_strategy.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/examples/factsheets/pyblogs_reports.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/examples/factsheets/strategy.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/examples/factsheets/strategy_benchmark.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/examples/generate_option_rolls.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/examples/interpolation_infrequent_returns.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/examples/leveraged_strategies.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/examples/long_short.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/examples/momentum_indices.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/examples/ohlc_vol_analysis.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/examples/overnight_returns.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/examples/perf_external_assets.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/examples/readme_performances.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/examples/risk_return_frontier.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/examples/rolling_performance.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/examples/seasonality.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/examples/sharpe_vs_sortino.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/examples/simulate_quant_strats.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/examples/test_ewm.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/examples/test_scatter.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/examples/try_pybloqs.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/examples/universe_corrs.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/examples/vix_beta_to_equities_bonds.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/examples/vix_conditional_returns.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/examples/vix_spy_by_year.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/examples/vix_tenor_analysis.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/examples/vol_without_weekends.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/file_utils.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/local_path.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/models/README.md +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/models/__init__.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/models/linear/__init__.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/models/linear/auto_corr.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/models/linear/corr_cov_matrix.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/models/linear/ewm.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/models/linear/ewm_convolution.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/models/linear/ewm_factors.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/models/linear/ewm_winsor_outliers.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/models/linear/pca.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/models/linear/plot_correlations.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/models/linear/ra_returns.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/models/stats/__init__.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/models/stats/bootstrap.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/models/stats/ohlc_vol.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/models/stats/rolling_stats.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/models/stats/test_bootstrap.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/perfstats/README.md +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/perfstats/__init__.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/perfstats/cond_regression.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/perfstats/config.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/perfstats/desc_table.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/perfstats/fx_ops.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/perfstats/perf_stats.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/perfstats/regime_classifier.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/perfstats/returns.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/perfstats/timeseries_bfill.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/plots/README.md +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/plots/__init__.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/plots/bars.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/plots/boxplot.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/plots/contour.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/plots/derived/__init__.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/plots/derived/data_timeseries.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/plots/derived/desc_table.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/plots/derived/drawdowns.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/plots/derived/perf_table.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/plots/derived/prices.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/plots/derived/regime_class_table.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/plots/derived/regime_data.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/plots/derived/regime_pdf.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/plots/derived/regime_scatter.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/plots/derived/returns_heatmap.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/plots/derived/returns_scatter.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/plots/errorbar.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/plots/heatmap.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/plots/histogram.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/plots/histplot2d.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/plots/lineplot.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/plots/pie.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/plots/qqplot.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/plots/reports/__init__.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/plots/reports/econ_data_single.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/plots/reports/gantt_data_history.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/plots/reports/price_history.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/plots/reports/utils.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/plots/scatter.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/plots/stackplot.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/plots/table.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/plots/time_series.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/plots/utils.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/portfolio/README.md +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/portfolio/__init__.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/portfolio/backtester.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/portfolio/ewm_portfolio_risk.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/portfolio/reports/__init__.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/portfolio/reports/brinson_attribution.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/portfolio/reports/config.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/portfolio/reports/multi_assets_factsheet.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/portfolio/reports/multi_strategy_factseet_pybloqs.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/portfolio/reports/multi_strategy_factsheet.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/portfolio/reports/strategy_benchmark_factsheet_pybloqs.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/portfolio/reports/strategy_factsheet.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/portfolio/reports/strategy_signal_factsheet.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/portfolio/signal_data.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/portfolio/strats/__init__.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/portfolio/strats/quant_strats_delta1.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/portfolio/strats/seasonal_strats.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/sql_engine.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/test_data.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/utils/README.md +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/utils/__init__.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/utils/dates.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/utils/df_agg.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/utils/df_cut.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/utils/df_freq.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/utils/df_groups.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/utils/df_melt.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/utils/df_ops.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/utils/df_str.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/utils/df_to_scores.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/utils/df_to_weights.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/utils/generic.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/utils/np_ops.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/utils/ols.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/utils/sampling.py +0 -0
- {qis-3.2.8 → qis-3.2.9}/qis/utils/struct_ops.py +0 -0
{qis-3.2.8 → qis-3.2.9}/PKG-INFO
RENAMED
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.3
|
2
2
|
Name: qis
|
3
|
-
Version: 3.2.
|
3
|
+
Version: 3.2.9
|
4
4
|
Summary: Implementation of visualisation and reporting analytics for Quantitative Investment Strategies
|
5
5
|
License: LICENSE.txt
|
6
6
|
Keywords: quantitative,investing,portfolio optimization,systematic strategies,volatility
|
@@ -192,8 +192,11 @@ class MultiPortfolioData:
|
|
192
192
|
|
193
193
|
def compute_tracking_error_implied_by_covar(self,
|
194
194
|
strategy_idx: int = 0,
|
195
|
-
benchmark_idx: int = 1
|
196
|
-
|
195
|
+
benchmark_idx: int = 1,
|
196
|
+
is_grouped: bool = False,
|
197
|
+
group_data: pd.Series = None,
|
198
|
+
group_order: List[str] = None
|
199
|
+
) -> Union[pd.Series, pd.DataFrame]:
|
197
200
|
"""
|
198
201
|
compute Ex ante tracking error =
|
199
202
|
(strategy_weights - strategy_weights) @ covar @ (strategy_weights - strategy_weights).T
|
@@ -208,11 +211,33 @@ class MultiPortfolioData:
|
|
208
211
|
benchmark_weights = benchmark_weights.reindex(index=covar_index, columns=investable_assets).ffill().fillna(0.0)
|
209
212
|
|
210
213
|
weight_diffs = benchmark_weights - strategy_weights
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
214
|
+
if not is_grouped:
|
215
|
+
tracking_error = {}
|
216
|
+
for date, pd_covar in self.covar_dict.items():
|
217
|
+
w = weight_diffs.loc[date]
|
218
|
+
tracking_error[date] = np.sqrt(w @ pd_covar @ w.T)
|
219
|
+
tracking_error = pd.Series(tracking_error, name='Tracking error')
|
220
|
+
else:
|
221
|
+
if group_data is None:
|
222
|
+
group_data = self.portfolio_datas[strategy_idx].group_data
|
223
|
+
if group_order is None:
|
224
|
+
group_order = self.portfolio_datas[strategy_idx].group_order
|
225
|
+
group_dict = dfg.get_group_dict(group_data=group_data,
|
226
|
+
group_order=group_order,
|
227
|
+
total_column='Total')
|
228
|
+
tracking_error = {key: {} for key in group_dict.keys()}
|
229
|
+
for date, pd_covar in self.covar_dict.items():
|
230
|
+
w = weight_diffs.loc[date]
|
231
|
+
for key, tickers in group_dict.items():
|
232
|
+
w_g = w.loc[tickers]
|
233
|
+
pd_covar_g = pd_covar.loc[tickers, tickers]
|
234
|
+
tracking_error[key][date] = np.sqrt(w_g @ pd_covar_g @ w_g.T)
|
235
|
+
# merge
|
236
|
+
tracking_error_pd = {}
|
237
|
+
for key in group_dict.keys():
|
238
|
+
tracking_error_pd[key] = pd.Series(tracking_error[key], name=key)
|
239
|
+
tracking_error = pd.DataFrame.from_dict(tracking_error_pd, orient='columns')
|
240
|
+
|
216
241
|
return tracking_error
|
217
242
|
|
218
243
|
def compute_tracking_error_table(self,
|
@@ -1007,6 +1032,9 @@ class MultiPortfolioData:
|
|
1007
1032
|
def plot_tre_time_series(self,
|
1008
1033
|
strategy_idx: int = 0,
|
1009
1034
|
benchmark_idx: int = 1,
|
1035
|
+
is_grouped: bool = False,
|
1036
|
+
group_data: pd.Series = None,
|
1037
|
+
group_order: List[str] = None,
|
1010
1038
|
regime_benchmark: str = None,
|
1011
1039
|
regime_params: BenchmarkReturnsQuantileRegimeSpecs = REGIME_PARAMS,
|
1012
1040
|
time_period: TimePeriod = None,
|
@@ -1015,13 +1043,16 @@ class MultiPortfolioData:
|
|
1015
1043
|
ax: plt.Subplot = None,
|
1016
1044
|
**kwargs
|
1017
1045
|
) -> None:
|
1018
|
-
tre = self.compute_tracking_error_implied_by_covar(strategy_idx=strategy_idx, benchmark_idx=benchmark_idx
|
1046
|
+
tre = self.compute_tracking_error_implied_by_covar(strategy_idx=strategy_idx, benchmark_idx=benchmark_idx,
|
1047
|
+
is_grouped=is_grouped, group_data=group_data,
|
1048
|
+
group_order=group_order)
|
1019
1049
|
if time_period is not None:
|
1020
1050
|
tre = time_period.locate(tre)
|
1021
1051
|
pts.plot_time_series(df=tre,
|
1022
1052
|
var_format=var_format,
|
1023
1053
|
legend_stats=pts.LegendStats.AVG_NONNAN_LAST,
|
1024
1054
|
title=title,
|
1055
|
+
y_limits=(0.0, None),
|
1025
1056
|
ax=ax,
|
1026
1057
|
**kwargs)
|
1027
1058
|
if regime_benchmark is not None:
|
@@ -1484,10 +1484,10 @@ class PortfolioData:
|
|
1484
1484
|
group_data: pd.Series = None,
|
1485
1485
|
group_order: List[str] = None,
|
1486
1486
|
time_period: TimePeriod = None,
|
1487
|
-
|
1487
|
+
turnover_rolling_period: Optional[int] = 260,
|
1488
|
+
freq_turnover: Optional[str] = 'B',
|
1488
1489
|
add_total: bool = True,
|
1489
1490
|
title: str = None,
|
1490
|
-
freq: Optional[str] = None,
|
1491
1491
|
regime_params: BenchmarkReturnsQuantileRegimeSpecs = None,
|
1492
1492
|
ax: plt.Subplot = None,
|
1493
1493
|
**kwargs
|
@@ -1497,14 +1497,15 @@ class PortfolioData:
|
|
1497
1497
|
group_data=group_data,
|
1498
1498
|
group_order=group_order,
|
1499
1499
|
time_period=time_period,
|
1500
|
-
roll_period=
|
1500
|
+
roll_period=turnover_rolling_period,
|
1501
1501
|
add_total=add_total,
|
1502
|
-
freq=
|
1502
|
+
freq=freq_turnover,
|
1503
1503
|
**kwargs)
|
1504
|
-
|
1504
|
+
freq = pd.infer_freq(turnover.index)
|
1505
|
+
turnover_title = title or f"{turnover_rolling_period}-period rolling {freq}-freq Turnover"
|
1505
1506
|
qis.plot_time_series(df=turnover,
|
1506
1507
|
var_format='{:,.2%}',
|
1507
|
-
|
1508
|
+
y_limits=(0.0, None),
|
1508
1509
|
legend_stats=qis.LegendStats.AVG_NONNAN_LAST,
|
1509
1510
|
title=turnover_title,
|
1510
1511
|
ax=ax,
|
@@ -665,22 +665,6 @@ def weights_tracking_error_report_by_ac_subac(multi_portfolio_data: MultiPortfol
|
|
665
665
|
allow_negative=True,
|
666
666
|
**kwargs)
|
667
667
|
|
668
|
-
# tracking error
|
669
|
-
fig, ax = plt.subplots(1, 1, figsize=figsize, tight_layout=True)
|
670
|
-
figs['tre_time_series'] = fig
|
671
|
-
if add_titles:
|
672
|
-
title = 'Tracking Error'
|
673
|
-
else:
|
674
|
-
title = None
|
675
|
-
multi_portfolio_data.plot_tre_time_series(strategy_idx=strategy_idx,
|
676
|
-
benchmark_idx=benchmark_idx,
|
677
|
-
regime_benchmark=regime_benchmark,
|
678
|
-
regime_params=regime_params,
|
679
|
-
title=title,
|
680
|
-
ax=ax,
|
681
|
-
time_period=time_period,
|
682
|
-
**kwargs)
|
683
|
-
|
684
668
|
# brinson by asset class
|
685
669
|
totals_table, active_total, grouped_allocation_return, grouped_selection_return, grouped_interaction_return = \
|
686
670
|
multi_portfolio_data.compute_brinson_attribution(strategy_idx=strategy_idx,
|
@@ -744,6 +728,41 @@ def weights_tracking_error_report_by_ac_subac(multi_portfolio_data: MultiPortfol
|
|
744
728
|
figs['brinson_table_subac'] = qis.plot_brinson_totals_table(totals_table=totals_table, **kwargs)
|
745
729
|
dfs['brinson_table_subac'] = totals_table
|
746
730
|
|
731
|
+
# tracking error
|
732
|
+
fig, ax = plt.subplots(1, 1, figsize=figsize, tight_layout=True)
|
733
|
+
figs['tre_time_series'] = fig
|
734
|
+
if add_titles:
|
735
|
+
title = 'Tracking Error'
|
736
|
+
else:
|
737
|
+
title = None
|
738
|
+
multi_portfolio_data.plot_tre_time_series(strategy_idx=strategy_idx,
|
739
|
+
benchmark_idx=benchmark_idx,
|
740
|
+
regime_benchmark=regime_benchmark,
|
741
|
+
regime_params=regime_params,
|
742
|
+
title=title,
|
743
|
+
ax=ax,
|
744
|
+
time_period=time_period,
|
745
|
+
**kwargs)
|
746
|
+
|
747
|
+
# group tracking error
|
748
|
+
fig, ax = plt.subplots(1, 1, figsize=figsize, tight_layout=True)
|
749
|
+
figs['tre_group_time_series'] = fig
|
750
|
+
if add_titles:
|
751
|
+
title = 'Asset Class Tracking Error'
|
752
|
+
else:
|
753
|
+
title = None
|
754
|
+
multi_portfolio_data.plot_tre_time_series(strategy_idx=strategy_idx,
|
755
|
+
benchmark_idx=benchmark_idx,
|
756
|
+
is_grouped=True,
|
757
|
+
group_data=ac_group_data,
|
758
|
+
group_order=ac_group_order,
|
759
|
+
regime_benchmark=regime_benchmark,
|
760
|
+
regime_params=regime_params,
|
761
|
+
title=title,
|
762
|
+
ax=ax,
|
763
|
+
time_period=time_period,
|
764
|
+
**kwargs)
|
765
|
+
|
747
766
|
# turnover
|
748
767
|
fig, ax = plt.subplots(1, 1, figsize=figsize, tight_layout=True)
|
749
768
|
figs['joint_turnover'] = fig
|
@@ -751,9 +770,9 @@ def weights_tracking_error_report_by_ac_subac(multi_portfolio_data: MultiPortfol
|
|
751
770
|
time_period=time_period,
|
752
771
|
regime_benchmark=regime_benchmark,
|
753
772
|
regime_params=regime_params,
|
754
|
-
#turnover_rolling_period=260,
|
755
|
-
#freq_turnover=None,
|
756
773
|
**kwargs)
|
774
|
+
if not add_titles:
|
775
|
+
ax.title.set_visible(False)
|
757
776
|
# group turnover
|
758
777
|
fig, ax = plt.subplots(1, 1, figsize=figsize, tight_layout=True)
|
759
778
|
figs['group_turnover'] = fig
|
@@ -765,10 +784,9 @@ def weights_tracking_error_report_by_ac_subac(multi_portfolio_data: MultiPortfol
|
|
765
784
|
group_data=turnover_groups,
|
766
785
|
group_order=turnover_order,
|
767
786
|
add_total=False,
|
768
|
-
#turnover_rolling_period=260,
|
769
|
-
#freq_turnover=None,
|
770
787
|
**kwargs)
|
771
|
-
|
788
|
+
if not add_titles:
|
789
|
+
ax.title.set_visible(False)
|
772
790
|
return figs, dfs
|
773
791
|
|
774
792
|
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|