qis 3.2.9__tar.gz → 3.2.10__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.9 → qis-3.2.10}/PKG-INFO +1 -1
  2. {qis-3.2.9 → qis-3.2.10}/pyproject.toml +1 -1
  3. {qis-3.2.9 → qis-3.2.10}/qis/portfolio/multi_portfolio_data.py +19 -6
  4. {qis-3.2.9 → qis-3.2.10}/qis/portfolio/portfolio_data.py +2 -2
  5. {qis-3.2.9 → qis-3.2.10}/qis/portfolio/reports/strategy_benchmark_factsheet.py +5 -0
  6. {qis-3.2.9 → qis-3.2.10}/qis/settings.yaml +0 -1
  7. {qis-3.2.9 → qis-3.2.10}/LICENSE.txt +0 -0
  8. {qis-3.2.9 → qis-3.2.10}/README.md +0 -0
  9. {qis-3.2.9 → qis-3.2.10}/qis/__init__.py +0 -0
  10. {qis-3.2.9 → qis-3.2.10}/qis/examples/best_returns.py +0 -0
  11. {qis-3.2.9 → qis-3.2.10}/qis/examples/bootstrap_analysis.py +0 -0
  12. {qis-3.2.9 → qis-3.2.10}/qis/examples/boxplot_conditional_returns.py +0 -0
  13. {qis-3.2.9 → qis-3.2.10}/qis/examples/btc_asset_corr.py +0 -0
  14. {qis-3.2.9 → qis-3.2.10}/qis/examples/constant_notional.py +0 -0
  15. {qis-3.2.9 → qis-3.2.10}/qis/examples/constant_weight_portfolios.py +0 -0
  16. {qis-3.2.9 → qis-3.2.10}/qis/examples/core/perf_bbg_prices.py +0 -0
  17. {qis-3.2.9 → qis-3.2.10}/qis/examples/core/price_plots.py +0 -0
  18. {qis-3.2.9 → qis-3.2.10}/qis/examples/core/us_election.py +0 -0
  19. {qis-3.2.9 → qis-3.2.10}/qis/examples/credit_spreads.py +0 -0
  20. {qis-3.2.9 → qis-3.2.10}/qis/examples/europe_futures.py +0 -0
  21. {qis-3.2.9 → qis-3.2.10}/qis/examples/factsheets/multi_assets.py +0 -0
  22. {qis-3.2.9 → qis-3.2.10}/qis/examples/factsheets/multi_strategy.py +0 -0
  23. {qis-3.2.9 → qis-3.2.10}/qis/examples/factsheets/pyblogs_reports.py +0 -0
  24. {qis-3.2.9 → qis-3.2.10}/qis/examples/factsheets/strategy.py +0 -0
  25. {qis-3.2.9 → qis-3.2.10}/qis/examples/factsheets/strategy_benchmark.py +0 -0
  26. {qis-3.2.9 → qis-3.2.10}/qis/examples/generate_option_rolls.py +0 -0
  27. {qis-3.2.9 → qis-3.2.10}/qis/examples/interpolation_infrequent_returns.py +0 -0
  28. {qis-3.2.9 → qis-3.2.10}/qis/examples/leveraged_strategies.py +0 -0
  29. {qis-3.2.9 → qis-3.2.10}/qis/examples/long_short.py +0 -0
  30. {qis-3.2.9 → qis-3.2.10}/qis/examples/momentum_indices.py +0 -0
  31. {qis-3.2.9 → qis-3.2.10}/qis/examples/ohlc_vol_analysis.py +0 -0
  32. {qis-3.2.9 → qis-3.2.10}/qis/examples/overnight_returns.py +0 -0
  33. {qis-3.2.9 → qis-3.2.10}/qis/examples/perf_external_assets.py +0 -0
  34. {qis-3.2.9 → qis-3.2.10}/qis/examples/readme_performances.py +0 -0
  35. {qis-3.2.9 → qis-3.2.10}/qis/examples/risk_return_frontier.py +0 -0
  36. {qis-3.2.9 → qis-3.2.10}/qis/examples/rolling_performance.py +0 -0
  37. {qis-3.2.9 → qis-3.2.10}/qis/examples/seasonality.py +0 -0
  38. {qis-3.2.9 → qis-3.2.10}/qis/examples/sharpe_vs_sortino.py +0 -0
  39. {qis-3.2.9 → qis-3.2.10}/qis/examples/simulate_quant_strats.py +0 -0
  40. {qis-3.2.9 → qis-3.2.10}/qis/examples/test_ewm.py +0 -0
  41. {qis-3.2.9 → qis-3.2.10}/qis/examples/test_scatter.py +0 -0
  42. {qis-3.2.9 → qis-3.2.10}/qis/examples/try_pybloqs.py +0 -0
  43. {qis-3.2.9 → qis-3.2.10}/qis/examples/universe_corrs.py +0 -0
  44. {qis-3.2.9 → qis-3.2.10}/qis/examples/vix_beta_to_equities_bonds.py +0 -0
  45. {qis-3.2.9 → qis-3.2.10}/qis/examples/vix_conditional_returns.py +0 -0
  46. {qis-3.2.9 → qis-3.2.10}/qis/examples/vix_spy_by_year.py +0 -0
  47. {qis-3.2.9 → qis-3.2.10}/qis/examples/vix_tenor_analysis.py +0 -0
  48. {qis-3.2.9 → qis-3.2.10}/qis/examples/vol_without_weekends.py +0 -0
  49. {qis-3.2.9 → qis-3.2.10}/qis/file_utils.py +0 -0
  50. {qis-3.2.9 → qis-3.2.10}/qis/local_path.py +0 -0
  51. {qis-3.2.9 → qis-3.2.10}/qis/models/README.md +0 -0
  52. {qis-3.2.9 → qis-3.2.10}/qis/models/__init__.py +0 -0
  53. {qis-3.2.9 → qis-3.2.10}/qis/models/linear/__init__.py +0 -0
  54. {qis-3.2.9 → qis-3.2.10}/qis/models/linear/auto_corr.py +0 -0
  55. {qis-3.2.9 → qis-3.2.10}/qis/models/linear/corr_cov_matrix.py +0 -0
  56. {qis-3.2.9 → qis-3.2.10}/qis/models/linear/ewm.py +0 -0
  57. {qis-3.2.9 → qis-3.2.10}/qis/models/linear/ewm_convolution.py +0 -0
  58. {qis-3.2.9 → qis-3.2.10}/qis/models/linear/ewm_factors.py +0 -0
  59. {qis-3.2.9 → qis-3.2.10}/qis/models/linear/ewm_winsor_outliers.py +0 -0
  60. {qis-3.2.9 → qis-3.2.10}/qis/models/linear/pca.py +0 -0
  61. {qis-3.2.9 → qis-3.2.10}/qis/models/linear/plot_correlations.py +0 -0
  62. {qis-3.2.9 → qis-3.2.10}/qis/models/linear/ra_returns.py +0 -0
  63. {qis-3.2.9 → qis-3.2.10}/qis/models/stats/__init__.py +0 -0
  64. {qis-3.2.9 → qis-3.2.10}/qis/models/stats/bootstrap.py +0 -0
  65. {qis-3.2.9 → qis-3.2.10}/qis/models/stats/ohlc_vol.py +0 -0
  66. {qis-3.2.9 → qis-3.2.10}/qis/models/stats/rolling_stats.py +0 -0
  67. {qis-3.2.9 → qis-3.2.10}/qis/models/stats/test_bootstrap.py +0 -0
  68. {qis-3.2.9 → qis-3.2.10}/qis/perfstats/README.md +0 -0
  69. {qis-3.2.9 → qis-3.2.10}/qis/perfstats/__init__.py +0 -0
  70. {qis-3.2.9 → qis-3.2.10}/qis/perfstats/cond_regression.py +0 -0
  71. {qis-3.2.9 → qis-3.2.10}/qis/perfstats/config.py +0 -0
  72. {qis-3.2.9 → qis-3.2.10}/qis/perfstats/desc_table.py +0 -0
  73. {qis-3.2.9 → qis-3.2.10}/qis/perfstats/fx_ops.py +0 -0
  74. {qis-3.2.9 → qis-3.2.10}/qis/perfstats/perf_stats.py +0 -0
  75. {qis-3.2.9 → qis-3.2.10}/qis/perfstats/regime_classifier.py +0 -0
  76. {qis-3.2.9 → qis-3.2.10}/qis/perfstats/returns.py +0 -0
  77. {qis-3.2.9 → qis-3.2.10}/qis/perfstats/timeseries_bfill.py +0 -0
  78. {qis-3.2.9 → qis-3.2.10}/qis/plots/README.md +0 -0
  79. {qis-3.2.9 → qis-3.2.10}/qis/plots/__init__.py +0 -0
  80. {qis-3.2.9 → qis-3.2.10}/qis/plots/bars.py +0 -0
  81. {qis-3.2.9 → qis-3.2.10}/qis/plots/boxplot.py +0 -0
  82. {qis-3.2.9 → qis-3.2.10}/qis/plots/contour.py +0 -0
  83. {qis-3.2.9 → qis-3.2.10}/qis/plots/derived/__init__.py +0 -0
  84. {qis-3.2.9 → qis-3.2.10}/qis/plots/derived/data_timeseries.py +0 -0
  85. {qis-3.2.9 → qis-3.2.10}/qis/plots/derived/desc_table.py +0 -0
  86. {qis-3.2.9 → qis-3.2.10}/qis/plots/derived/drawdowns.py +0 -0
  87. {qis-3.2.9 → qis-3.2.10}/qis/plots/derived/perf_table.py +0 -0
  88. {qis-3.2.9 → qis-3.2.10}/qis/plots/derived/prices.py +0 -0
  89. {qis-3.2.9 → qis-3.2.10}/qis/plots/derived/regime_class_table.py +0 -0
  90. {qis-3.2.9 → qis-3.2.10}/qis/plots/derived/regime_data.py +0 -0
  91. {qis-3.2.9 → qis-3.2.10}/qis/plots/derived/regime_pdf.py +0 -0
  92. {qis-3.2.9 → qis-3.2.10}/qis/plots/derived/regime_scatter.py +0 -0
  93. {qis-3.2.9 → qis-3.2.10}/qis/plots/derived/returns_heatmap.py +0 -0
  94. {qis-3.2.9 → qis-3.2.10}/qis/plots/derived/returns_scatter.py +0 -0
  95. {qis-3.2.9 → qis-3.2.10}/qis/plots/errorbar.py +0 -0
  96. {qis-3.2.9 → qis-3.2.10}/qis/plots/heatmap.py +0 -0
  97. {qis-3.2.9 → qis-3.2.10}/qis/plots/histogram.py +0 -0
  98. {qis-3.2.9 → qis-3.2.10}/qis/plots/histplot2d.py +0 -0
  99. {qis-3.2.9 → qis-3.2.10}/qis/plots/lineplot.py +0 -0
  100. {qis-3.2.9 → qis-3.2.10}/qis/plots/pie.py +0 -0
  101. {qis-3.2.9 → qis-3.2.10}/qis/plots/qqplot.py +0 -0
  102. {qis-3.2.9 → qis-3.2.10}/qis/plots/reports/__init__.py +0 -0
  103. {qis-3.2.9 → qis-3.2.10}/qis/plots/reports/econ_data_single.py +0 -0
  104. {qis-3.2.9 → qis-3.2.10}/qis/plots/reports/gantt_data_history.py +0 -0
  105. {qis-3.2.9 → qis-3.2.10}/qis/plots/reports/price_history.py +0 -0
  106. {qis-3.2.9 → qis-3.2.10}/qis/plots/reports/utils.py +0 -0
  107. {qis-3.2.9 → qis-3.2.10}/qis/plots/scatter.py +0 -0
  108. {qis-3.2.9 → qis-3.2.10}/qis/plots/stackplot.py +0 -0
  109. {qis-3.2.9 → qis-3.2.10}/qis/plots/table.py +0 -0
  110. {qis-3.2.9 → qis-3.2.10}/qis/plots/time_series.py +0 -0
  111. {qis-3.2.9 → qis-3.2.10}/qis/plots/utils.py +0 -0
  112. {qis-3.2.9 → qis-3.2.10}/qis/portfolio/README.md +0 -0
  113. {qis-3.2.9 → qis-3.2.10}/qis/portfolio/__init__.py +0 -0
  114. {qis-3.2.9 → qis-3.2.10}/qis/portfolio/backtester.py +0 -0
  115. {qis-3.2.9 → qis-3.2.10}/qis/portfolio/ewm_portfolio_risk.py +0 -0
  116. {qis-3.2.9 → qis-3.2.10}/qis/portfolio/reports/__init__.py +0 -0
  117. {qis-3.2.9 → qis-3.2.10}/qis/portfolio/reports/brinson_attribution.py +0 -0
  118. {qis-3.2.9 → qis-3.2.10}/qis/portfolio/reports/config.py +0 -0
  119. {qis-3.2.9 → qis-3.2.10}/qis/portfolio/reports/multi_assets_factsheet.py +0 -0
  120. {qis-3.2.9 → qis-3.2.10}/qis/portfolio/reports/multi_strategy_factseet_pybloqs.py +0 -0
  121. {qis-3.2.9 → qis-3.2.10}/qis/portfolio/reports/multi_strategy_factsheet.py +0 -0
  122. {qis-3.2.9 → qis-3.2.10}/qis/portfolio/reports/strategy_benchmark_factsheet_pybloqs.py +0 -0
  123. {qis-3.2.9 → qis-3.2.10}/qis/portfolio/reports/strategy_factsheet.py +0 -0
  124. {qis-3.2.9 → qis-3.2.10}/qis/portfolio/reports/strategy_signal_factsheet.py +0 -0
  125. {qis-3.2.9 → qis-3.2.10}/qis/portfolio/signal_data.py +0 -0
  126. {qis-3.2.9 → qis-3.2.10}/qis/portfolio/strats/__init__.py +0 -0
  127. {qis-3.2.9 → qis-3.2.10}/qis/portfolio/strats/quant_strats_delta1.py +0 -0
  128. {qis-3.2.9 → qis-3.2.10}/qis/portfolio/strats/seasonal_strats.py +0 -0
  129. {qis-3.2.9 → qis-3.2.10}/qis/sql_engine.py +0 -0
  130. {qis-3.2.9 → qis-3.2.10}/qis/test_data.py +0 -0
  131. {qis-3.2.9 → qis-3.2.10}/qis/utils/README.md +0 -0
  132. {qis-3.2.9 → qis-3.2.10}/qis/utils/__init__.py +0 -0
  133. {qis-3.2.9 → qis-3.2.10}/qis/utils/dates.py +0 -0
  134. {qis-3.2.9 → qis-3.2.10}/qis/utils/df_agg.py +0 -0
  135. {qis-3.2.9 → qis-3.2.10}/qis/utils/df_cut.py +0 -0
  136. {qis-3.2.9 → qis-3.2.10}/qis/utils/df_freq.py +0 -0
  137. {qis-3.2.9 → qis-3.2.10}/qis/utils/df_groups.py +0 -0
  138. {qis-3.2.9 → qis-3.2.10}/qis/utils/df_melt.py +0 -0
  139. {qis-3.2.9 → qis-3.2.10}/qis/utils/df_ops.py +0 -0
  140. {qis-3.2.9 → qis-3.2.10}/qis/utils/df_str.py +0 -0
  141. {qis-3.2.9 → qis-3.2.10}/qis/utils/df_to_scores.py +0 -0
  142. {qis-3.2.9 → qis-3.2.10}/qis/utils/df_to_weights.py +0 -0
  143. {qis-3.2.9 → qis-3.2.10}/qis/utils/generic.py +0 -0
  144. {qis-3.2.9 → qis-3.2.10}/qis/utils/np_ops.py +0 -0
  145. {qis-3.2.9 → qis-3.2.10}/qis/utils/ols.py +0 -0
  146. {qis-3.2.9 → qis-3.2.10}/qis/utils/sampling.py +0 -0
  147. {qis-3.2.9 → qis-3.2.10}/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.9
3
+ Version: 3.2.10
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.9"
3
+ version = "3.2.10"
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>"]
@@ -195,7 +195,8 @@ class MultiPortfolioData:
195
195
  benchmark_idx: int = 1,
196
196
  is_grouped: bool = False,
197
197
  group_data: pd.Series = None,
198
- group_order: List[str] = None
198
+ group_order: List[str] = None,
199
+ total_column: Optional[str] = 'Total'
199
200
  ) -> Union[pd.Series, pd.DataFrame]:
200
201
  """
201
202
  compute Ex ante tracking error =
@@ -224,7 +225,7 @@ class MultiPortfolioData:
224
225
  group_order = self.portfolio_datas[strategy_idx].group_order
225
226
  group_dict = dfg.get_group_dict(group_data=group_data,
226
227
  group_order=group_order,
227
- total_column='Total')
228
+ total_column=total_column)
228
229
  tracking_error = {key: {} for key in group_dict.keys()}
229
230
  for date, pd_covar in self.covar_dict.items():
230
231
  w = weight_diffs.loc[date]
@@ -645,7 +646,7 @@ class MultiPortfolioData:
645
646
  **kwargs)
646
647
  if regime_benchmark is not None:
647
648
  self.add_regime_shadows(ax=ax, regime_benchmark=regime_benchmark, index=diff.index, regime_params=regime_params)
648
-
649
+
649
650
  def get_turnover(self,
650
651
  time_period: TimePeriod = None,
651
652
  turnover_rolling_period: Optional[int] = 12,
@@ -662,7 +663,7 @@ class MultiPortfolioData:
662
663
  if time_period is not None:
663
664
  turnover = time_period.locate(turnover)
664
665
  return turnover
665
-
666
+
666
667
  def plot_turnover(self,
667
668
  regime_benchmark: str = None,
668
669
  time_period: TimePeriod = None,
@@ -673,7 +674,7 @@ class MultiPortfolioData:
673
674
  is_unit_based_traded_volume: bool = True,
674
675
  ax: plt.Subplot = None,
675
676
  **kwargs) -> None:
676
-
677
+
677
678
  turnover = self.get_turnover(turnover_rolling_period=turnover_rolling_period,
678
679
  freq_turnover=freq_turnover,
679
680
  is_unit_based_traded_volume=is_unit_based_traded_volume,
@@ -1039,13 +1040,25 @@ class MultiPortfolioData:
1039
1040
  regime_params: BenchmarkReturnsQuantileRegimeSpecs = REGIME_PARAMS,
1040
1041
  time_period: TimePeriod = None,
1041
1042
  title: Optional[str] = 'Tracking error',
1043
+ total_column: Optional[str] = 'Total',
1042
1044
  var_format: str = '{:.2%}',
1045
+ tre_max_clip: Optional[float] = None,
1043
1046
  ax: plt.Subplot = None,
1044
1047
  **kwargs
1045
1048
  ) -> None:
1046
1049
  tre = self.compute_tracking_error_implied_by_covar(strategy_idx=strategy_idx, benchmark_idx=benchmark_idx,
1047
1050
  is_grouped=is_grouped, group_data=group_data,
1048
- group_order=group_order)
1051
+ group_order=group_order,
1052
+ total_column=total_column)
1053
+ if tre_max_clip is not None:
1054
+ if isinstance(tre, pd.DataFrame): # skip total_column from trimming
1055
+ tre_columns = tre.columns.to_list()
1056
+ if total_column in tre:
1057
+ tre_columns.remove(total_column)
1058
+ tre[tre_columns] = tre[tre_columns].clip(upper=tre_max_clip)
1059
+ else:
1060
+ tre = tre.clip(upper=tre_max_clip)
1061
+
1049
1062
  if time_period is not None:
1050
1063
  tre = time_period.locate(tre)
1051
1064
  pts.plot_time_series(df=tre,
@@ -1504,13 +1504,13 @@ class PortfolioData:
1504
1504
  freq = pd.infer_freq(turnover.index)
1505
1505
  turnover_title = title or f"{turnover_rolling_period}-period rolling {freq}-freq Turnover"
1506
1506
  qis.plot_time_series(df=turnover,
1507
- var_format='{:,.2%}',
1507
+ var_format='{:,.1%}',
1508
1508
  y_limits=(0.0, None),
1509
1509
  legend_stats=qis.LegendStats.AVG_NONNAN_LAST,
1510
1510
  title=turnover_title,
1511
1511
  ax=ax,
1512
1512
  **kwargs)
1513
- if regime_benchmark is not None:
1513
+ if regime_benchmark is not None and self.benchmark_prices is not None:
1514
1514
  self.add_regime_shadows(ax=ax, regime_benchmark=regime_benchmark, index=turnover.index,
1515
1515
  regime_params=regime_params)
1516
1516
 
@@ -513,6 +513,7 @@ def weights_tracking_error_report_by_ac_subac(multi_portfolio_data: MultiPortfol
513
513
  perf_params: PerfParams = PERF_PARAMS,
514
514
  regime_params: BenchmarkReturnsQuantileRegimeSpecs = REGIME_PARAMS,
515
515
  add_benchmarks_to_navs: bool = True,
516
+ tre_max_clip: Optional[float] = None,
516
517
  figsize: Tuple[float, float] = (11.7, 8.3),
517
518
  var_format: str = '{:.1%}',
518
519
  add_titles: bool = True,
@@ -758,6 +759,7 @@ def weights_tracking_error_report_by_ac_subac(multi_portfolio_data: MultiPortfol
758
759
  group_order=ac_group_order,
759
760
  regime_benchmark=regime_benchmark,
760
761
  regime_params=regime_params,
762
+ tre_max_clip=tre_max_clip,
761
763
  title=title,
762
764
  ax=ax,
763
765
  time_period=time_period,
@@ -785,6 +787,9 @@ def weights_tracking_error_report_by_ac_subac(multi_portfolio_data: MultiPortfol
785
787
  group_order=turnover_order,
786
788
  add_total=False,
787
789
  **kwargs)
790
+ if regime_benchmark is not None:
791
+ multi_portfolio_data.add_regime_shadows(ax=ax, regime_benchmark=regime_benchmark,
792
+ index=grouped_selection_return.index, regime_params=regime_params)
788
793
  if not add_titles:
789
794
  ax.title.set_visible(False)
790
795
  return figs, dfs
@@ -18,4 +18,3 @@ 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