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.
Files changed (147) hide show
  1. {qis-3.2.8 → qis-3.2.9}/PKG-INFO +1 -1
  2. {qis-3.2.8 → qis-3.2.9}/pyproject.toml +1 -1
  3. {qis-3.2.8 → qis-3.2.9}/qis/portfolio/multi_portfolio_data.py +39 -8
  4. {qis-3.2.8 → qis-3.2.9}/qis/portfolio/portfolio_data.py +7 -6
  5. {qis-3.2.8 → qis-3.2.9}/qis/portfolio/reports/strategy_benchmark_factsheet.py +39 -21
  6. {qis-3.2.8 → qis-3.2.9}/qis/settings.yaml +1 -0
  7. {qis-3.2.8 → qis-3.2.9}/LICENSE.txt +0 -0
  8. {qis-3.2.8 → qis-3.2.9}/README.md +0 -0
  9. {qis-3.2.8 → qis-3.2.9}/qis/__init__.py +0 -0
  10. {qis-3.2.8 → qis-3.2.9}/qis/examples/best_returns.py +0 -0
  11. {qis-3.2.8 → qis-3.2.9}/qis/examples/bootstrap_analysis.py +0 -0
  12. {qis-3.2.8 → qis-3.2.9}/qis/examples/boxplot_conditional_returns.py +0 -0
  13. {qis-3.2.8 → qis-3.2.9}/qis/examples/btc_asset_corr.py +0 -0
  14. {qis-3.2.8 → qis-3.2.9}/qis/examples/constant_notional.py +0 -0
  15. {qis-3.2.8 → qis-3.2.9}/qis/examples/constant_weight_portfolios.py +0 -0
  16. {qis-3.2.8 → qis-3.2.9}/qis/examples/core/perf_bbg_prices.py +0 -0
  17. {qis-3.2.8 → qis-3.2.9}/qis/examples/core/price_plots.py +0 -0
  18. {qis-3.2.8 → qis-3.2.9}/qis/examples/core/us_election.py +0 -0
  19. {qis-3.2.8 → qis-3.2.9}/qis/examples/credit_spreads.py +0 -0
  20. {qis-3.2.8 → qis-3.2.9}/qis/examples/europe_futures.py +0 -0
  21. {qis-3.2.8 → qis-3.2.9}/qis/examples/factsheets/multi_assets.py +0 -0
  22. {qis-3.2.8 → qis-3.2.9}/qis/examples/factsheets/multi_strategy.py +0 -0
  23. {qis-3.2.8 → qis-3.2.9}/qis/examples/factsheets/pyblogs_reports.py +0 -0
  24. {qis-3.2.8 → qis-3.2.9}/qis/examples/factsheets/strategy.py +0 -0
  25. {qis-3.2.8 → qis-3.2.9}/qis/examples/factsheets/strategy_benchmark.py +0 -0
  26. {qis-3.2.8 → qis-3.2.9}/qis/examples/generate_option_rolls.py +0 -0
  27. {qis-3.2.8 → qis-3.2.9}/qis/examples/interpolation_infrequent_returns.py +0 -0
  28. {qis-3.2.8 → qis-3.2.9}/qis/examples/leveraged_strategies.py +0 -0
  29. {qis-3.2.8 → qis-3.2.9}/qis/examples/long_short.py +0 -0
  30. {qis-3.2.8 → qis-3.2.9}/qis/examples/momentum_indices.py +0 -0
  31. {qis-3.2.8 → qis-3.2.9}/qis/examples/ohlc_vol_analysis.py +0 -0
  32. {qis-3.2.8 → qis-3.2.9}/qis/examples/overnight_returns.py +0 -0
  33. {qis-3.2.8 → qis-3.2.9}/qis/examples/perf_external_assets.py +0 -0
  34. {qis-3.2.8 → qis-3.2.9}/qis/examples/readme_performances.py +0 -0
  35. {qis-3.2.8 → qis-3.2.9}/qis/examples/risk_return_frontier.py +0 -0
  36. {qis-3.2.8 → qis-3.2.9}/qis/examples/rolling_performance.py +0 -0
  37. {qis-3.2.8 → qis-3.2.9}/qis/examples/seasonality.py +0 -0
  38. {qis-3.2.8 → qis-3.2.9}/qis/examples/sharpe_vs_sortino.py +0 -0
  39. {qis-3.2.8 → qis-3.2.9}/qis/examples/simulate_quant_strats.py +0 -0
  40. {qis-3.2.8 → qis-3.2.9}/qis/examples/test_ewm.py +0 -0
  41. {qis-3.2.8 → qis-3.2.9}/qis/examples/test_scatter.py +0 -0
  42. {qis-3.2.8 → qis-3.2.9}/qis/examples/try_pybloqs.py +0 -0
  43. {qis-3.2.8 → qis-3.2.9}/qis/examples/universe_corrs.py +0 -0
  44. {qis-3.2.8 → qis-3.2.9}/qis/examples/vix_beta_to_equities_bonds.py +0 -0
  45. {qis-3.2.8 → qis-3.2.9}/qis/examples/vix_conditional_returns.py +0 -0
  46. {qis-3.2.8 → qis-3.2.9}/qis/examples/vix_spy_by_year.py +0 -0
  47. {qis-3.2.8 → qis-3.2.9}/qis/examples/vix_tenor_analysis.py +0 -0
  48. {qis-3.2.8 → qis-3.2.9}/qis/examples/vol_without_weekends.py +0 -0
  49. {qis-3.2.8 → qis-3.2.9}/qis/file_utils.py +0 -0
  50. {qis-3.2.8 → qis-3.2.9}/qis/local_path.py +0 -0
  51. {qis-3.2.8 → qis-3.2.9}/qis/models/README.md +0 -0
  52. {qis-3.2.8 → qis-3.2.9}/qis/models/__init__.py +0 -0
  53. {qis-3.2.8 → qis-3.2.9}/qis/models/linear/__init__.py +0 -0
  54. {qis-3.2.8 → qis-3.2.9}/qis/models/linear/auto_corr.py +0 -0
  55. {qis-3.2.8 → qis-3.2.9}/qis/models/linear/corr_cov_matrix.py +0 -0
  56. {qis-3.2.8 → qis-3.2.9}/qis/models/linear/ewm.py +0 -0
  57. {qis-3.2.8 → qis-3.2.9}/qis/models/linear/ewm_convolution.py +0 -0
  58. {qis-3.2.8 → qis-3.2.9}/qis/models/linear/ewm_factors.py +0 -0
  59. {qis-3.2.8 → qis-3.2.9}/qis/models/linear/ewm_winsor_outliers.py +0 -0
  60. {qis-3.2.8 → qis-3.2.9}/qis/models/linear/pca.py +0 -0
  61. {qis-3.2.8 → qis-3.2.9}/qis/models/linear/plot_correlations.py +0 -0
  62. {qis-3.2.8 → qis-3.2.9}/qis/models/linear/ra_returns.py +0 -0
  63. {qis-3.2.8 → qis-3.2.9}/qis/models/stats/__init__.py +0 -0
  64. {qis-3.2.8 → qis-3.2.9}/qis/models/stats/bootstrap.py +0 -0
  65. {qis-3.2.8 → qis-3.2.9}/qis/models/stats/ohlc_vol.py +0 -0
  66. {qis-3.2.8 → qis-3.2.9}/qis/models/stats/rolling_stats.py +0 -0
  67. {qis-3.2.8 → qis-3.2.9}/qis/models/stats/test_bootstrap.py +0 -0
  68. {qis-3.2.8 → qis-3.2.9}/qis/perfstats/README.md +0 -0
  69. {qis-3.2.8 → qis-3.2.9}/qis/perfstats/__init__.py +0 -0
  70. {qis-3.2.8 → qis-3.2.9}/qis/perfstats/cond_regression.py +0 -0
  71. {qis-3.2.8 → qis-3.2.9}/qis/perfstats/config.py +0 -0
  72. {qis-3.2.8 → qis-3.2.9}/qis/perfstats/desc_table.py +0 -0
  73. {qis-3.2.8 → qis-3.2.9}/qis/perfstats/fx_ops.py +0 -0
  74. {qis-3.2.8 → qis-3.2.9}/qis/perfstats/perf_stats.py +0 -0
  75. {qis-3.2.8 → qis-3.2.9}/qis/perfstats/regime_classifier.py +0 -0
  76. {qis-3.2.8 → qis-3.2.9}/qis/perfstats/returns.py +0 -0
  77. {qis-3.2.8 → qis-3.2.9}/qis/perfstats/timeseries_bfill.py +0 -0
  78. {qis-3.2.8 → qis-3.2.9}/qis/plots/README.md +0 -0
  79. {qis-3.2.8 → qis-3.2.9}/qis/plots/__init__.py +0 -0
  80. {qis-3.2.8 → qis-3.2.9}/qis/plots/bars.py +0 -0
  81. {qis-3.2.8 → qis-3.2.9}/qis/plots/boxplot.py +0 -0
  82. {qis-3.2.8 → qis-3.2.9}/qis/plots/contour.py +0 -0
  83. {qis-3.2.8 → qis-3.2.9}/qis/plots/derived/__init__.py +0 -0
  84. {qis-3.2.8 → qis-3.2.9}/qis/plots/derived/data_timeseries.py +0 -0
  85. {qis-3.2.8 → qis-3.2.9}/qis/plots/derived/desc_table.py +0 -0
  86. {qis-3.2.8 → qis-3.2.9}/qis/plots/derived/drawdowns.py +0 -0
  87. {qis-3.2.8 → qis-3.2.9}/qis/plots/derived/perf_table.py +0 -0
  88. {qis-3.2.8 → qis-3.2.9}/qis/plots/derived/prices.py +0 -0
  89. {qis-3.2.8 → qis-3.2.9}/qis/plots/derived/regime_class_table.py +0 -0
  90. {qis-3.2.8 → qis-3.2.9}/qis/plots/derived/regime_data.py +0 -0
  91. {qis-3.2.8 → qis-3.2.9}/qis/plots/derived/regime_pdf.py +0 -0
  92. {qis-3.2.8 → qis-3.2.9}/qis/plots/derived/regime_scatter.py +0 -0
  93. {qis-3.2.8 → qis-3.2.9}/qis/plots/derived/returns_heatmap.py +0 -0
  94. {qis-3.2.8 → qis-3.2.9}/qis/plots/derived/returns_scatter.py +0 -0
  95. {qis-3.2.8 → qis-3.2.9}/qis/plots/errorbar.py +0 -0
  96. {qis-3.2.8 → qis-3.2.9}/qis/plots/heatmap.py +0 -0
  97. {qis-3.2.8 → qis-3.2.9}/qis/plots/histogram.py +0 -0
  98. {qis-3.2.8 → qis-3.2.9}/qis/plots/histplot2d.py +0 -0
  99. {qis-3.2.8 → qis-3.2.9}/qis/plots/lineplot.py +0 -0
  100. {qis-3.2.8 → qis-3.2.9}/qis/plots/pie.py +0 -0
  101. {qis-3.2.8 → qis-3.2.9}/qis/plots/qqplot.py +0 -0
  102. {qis-3.2.8 → qis-3.2.9}/qis/plots/reports/__init__.py +0 -0
  103. {qis-3.2.8 → qis-3.2.9}/qis/plots/reports/econ_data_single.py +0 -0
  104. {qis-3.2.8 → qis-3.2.9}/qis/plots/reports/gantt_data_history.py +0 -0
  105. {qis-3.2.8 → qis-3.2.9}/qis/plots/reports/price_history.py +0 -0
  106. {qis-3.2.8 → qis-3.2.9}/qis/plots/reports/utils.py +0 -0
  107. {qis-3.2.8 → qis-3.2.9}/qis/plots/scatter.py +0 -0
  108. {qis-3.2.8 → qis-3.2.9}/qis/plots/stackplot.py +0 -0
  109. {qis-3.2.8 → qis-3.2.9}/qis/plots/table.py +0 -0
  110. {qis-3.2.8 → qis-3.2.9}/qis/plots/time_series.py +0 -0
  111. {qis-3.2.8 → qis-3.2.9}/qis/plots/utils.py +0 -0
  112. {qis-3.2.8 → qis-3.2.9}/qis/portfolio/README.md +0 -0
  113. {qis-3.2.8 → qis-3.2.9}/qis/portfolio/__init__.py +0 -0
  114. {qis-3.2.8 → qis-3.2.9}/qis/portfolio/backtester.py +0 -0
  115. {qis-3.2.8 → qis-3.2.9}/qis/portfolio/ewm_portfolio_risk.py +0 -0
  116. {qis-3.2.8 → qis-3.2.9}/qis/portfolio/reports/__init__.py +0 -0
  117. {qis-3.2.8 → qis-3.2.9}/qis/portfolio/reports/brinson_attribution.py +0 -0
  118. {qis-3.2.8 → qis-3.2.9}/qis/portfolio/reports/config.py +0 -0
  119. {qis-3.2.8 → qis-3.2.9}/qis/portfolio/reports/multi_assets_factsheet.py +0 -0
  120. {qis-3.2.8 → qis-3.2.9}/qis/portfolio/reports/multi_strategy_factseet_pybloqs.py +0 -0
  121. {qis-3.2.8 → qis-3.2.9}/qis/portfolio/reports/multi_strategy_factsheet.py +0 -0
  122. {qis-3.2.8 → qis-3.2.9}/qis/portfolio/reports/strategy_benchmark_factsheet_pybloqs.py +0 -0
  123. {qis-3.2.8 → qis-3.2.9}/qis/portfolio/reports/strategy_factsheet.py +0 -0
  124. {qis-3.2.8 → qis-3.2.9}/qis/portfolio/reports/strategy_signal_factsheet.py +0 -0
  125. {qis-3.2.8 → qis-3.2.9}/qis/portfolio/signal_data.py +0 -0
  126. {qis-3.2.8 → qis-3.2.9}/qis/portfolio/strats/__init__.py +0 -0
  127. {qis-3.2.8 → qis-3.2.9}/qis/portfolio/strats/quant_strats_delta1.py +0 -0
  128. {qis-3.2.8 → qis-3.2.9}/qis/portfolio/strats/seasonal_strats.py +0 -0
  129. {qis-3.2.8 → qis-3.2.9}/qis/sql_engine.py +0 -0
  130. {qis-3.2.8 → qis-3.2.9}/qis/test_data.py +0 -0
  131. {qis-3.2.8 → qis-3.2.9}/qis/utils/README.md +0 -0
  132. {qis-3.2.8 → qis-3.2.9}/qis/utils/__init__.py +0 -0
  133. {qis-3.2.8 → qis-3.2.9}/qis/utils/dates.py +0 -0
  134. {qis-3.2.8 → qis-3.2.9}/qis/utils/df_agg.py +0 -0
  135. {qis-3.2.8 → qis-3.2.9}/qis/utils/df_cut.py +0 -0
  136. {qis-3.2.8 → qis-3.2.9}/qis/utils/df_freq.py +0 -0
  137. {qis-3.2.8 → qis-3.2.9}/qis/utils/df_groups.py +0 -0
  138. {qis-3.2.8 → qis-3.2.9}/qis/utils/df_melt.py +0 -0
  139. {qis-3.2.8 → qis-3.2.9}/qis/utils/df_ops.py +0 -0
  140. {qis-3.2.8 → qis-3.2.9}/qis/utils/df_str.py +0 -0
  141. {qis-3.2.8 → qis-3.2.9}/qis/utils/df_to_scores.py +0 -0
  142. {qis-3.2.8 → qis-3.2.9}/qis/utils/df_to_weights.py +0 -0
  143. {qis-3.2.8 → qis-3.2.9}/qis/utils/generic.py +0 -0
  144. {qis-3.2.8 → qis-3.2.9}/qis/utils/np_ops.py +0 -0
  145. {qis-3.2.8 → qis-3.2.9}/qis/utils/ols.py +0 -0
  146. {qis-3.2.8 → qis-3.2.9}/qis/utils/sampling.py +0 -0
  147. {qis-3.2.8 → qis-3.2.9}/qis/utils/struct_ops.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: qis
3
- Version: 3.2.8
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
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "qis"
3
- version = "3.2.8"
3
+ version = "3.2.9"
4
4
  description = "Implementation of visualisation and reporting analytics for Quantitative Investment Strategies"
5
5
  license = "LICENSE.txt"
6
6
  authors = ["Artur Sepp <artursepp@gmail.com>"]
@@ -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
- ) -> pd.Series:
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
- tracking_error = {}
212
- for date, pd_covar in self.covar_dict.items():
213
- w = weight_diffs.loc[date]
214
- tracking_error[date] = np.sqrt(w @ pd_covar @ w.T)
215
- tracking_error = pd.Series(tracking_error, name='Tracking error')
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
- roll_period: Optional[int] = 260,
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=roll_period,
1500
+ roll_period=turnover_rolling_period,
1501
1501
  add_total=add_total,
1502
- freq=freq,
1502
+ freq=freq_turnover,
1503
1503
  **kwargs)
1504
- turnover_title = title or f"{roll_period}-period rolling {freq}-freq Turnover"
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
- # y_limits=(0.0, None),
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
 
@@ -18,3 +18,4 @@ OUTPUT_PATH:
18
18
 
19
19
  AWS_POSTGRES:
20
20
  ""
21
+
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