qis 3.1.3__tar.gz → 3.1.4__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 (149) hide show
  1. {qis-3.1.3 → qis-3.1.4}/PKG-INFO +1 -1
  2. {qis-3.1.3 → qis-3.1.4}/pyproject.toml +1 -1
  3. {qis-3.1.3 → qis-3.1.4}/qis/plots/bars.py +4 -2
  4. {qis-3.1.3 → qis-3.1.4}/qis/plots/table.py +2 -1
  5. {qis-3.1.3 → qis-3.1.4}/qis/portfolio/portfolio_data.py +12 -2
  6. {qis-3.1.3 → qis-3.1.4}/qis/portfolio/reports/strategy_benchmark_factsheet.py +2 -2
  7. {qis-3.1.3 → qis-3.1.4}/qis/settings.yaml +1 -0
  8. {qis-3.1.3 → qis-3.1.4}/LICENSE.txt +0 -0
  9. {qis-3.1.3 → qis-3.1.4}/README.md +0 -0
  10. {qis-3.1.3 → qis-3.1.4}/qis/__init__.py +0 -0
  11. {qis-3.1.3 → qis-3.1.4}/qis/examples/best_returns.py +0 -0
  12. {qis-3.1.3 → qis-3.1.4}/qis/examples/bond_futures_portfolio.py +0 -0
  13. {qis-3.1.3 → qis-3.1.4}/qis/examples/bootstrap_analysis.py +0 -0
  14. {qis-3.1.3 → qis-3.1.4}/qis/examples/boxplot_conditional_returns.py +0 -0
  15. {qis-3.1.3 → qis-3.1.4}/qis/examples/btc_asset_corr.py +0 -0
  16. {qis-3.1.3 → qis-3.1.4}/qis/examples/constant_notional.py +0 -0
  17. {qis-3.1.3 → qis-3.1.4}/qis/examples/constant_weight_portfolios.py +0 -0
  18. {qis-3.1.3 → qis-3.1.4}/qis/examples/core/perf_bbg_prices.py +0 -0
  19. {qis-3.1.3 → qis-3.1.4}/qis/examples/core/price_plots.py +0 -0
  20. {qis-3.1.3 → qis-3.1.4}/qis/examples/core/us_election.py +0 -0
  21. {qis-3.1.3 → qis-3.1.4}/qis/examples/credit_spreads.py +0 -0
  22. {qis-3.1.3 → qis-3.1.4}/qis/examples/credit_trackers.py +0 -0
  23. {qis-3.1.3 → qis-3.1.4}/qis/examples/europe_futures.py +0 -0
  24. {qis-3.1.3 → qis-3.1.4}/qis/examples/factsheets/multi_assets.py +0 -0
  25. {qis-3.1.3 → qis-3.1.4}/qis/examples/factsheets/multi_strategy.py +0 -0
  26. {qis-3.1.3 → qis-3.1.4}/qis/examples/factsheets/pyblogs_reports.py +0 -0
  27. {qis-3.1.3 → qis-3.1.4}/qis/examples/factsheets/strategy.py +0 -0
  28. {qis-3.1.3 → qis-3.1.4}/qis/examples/factsheets/strategy_benchmark.py +0 -0
  29. {qis-3.1.3 → qis-3.1.4}/qis/examples/generate_option_rolls.py +0 -0
  30. {qis-3.1.3 → qis-3.1.4}/qis/examples/interpolation_infrequent_returns.py +0 -0
  31. {qis-3.1.3 → qis-3.1.4}/qis/examples/leveraged_strategies.py +0 -0
  32. {qis-3.1.3 → qis-3.1.4}/qis/examples/long_short.py +0 -0
  33. {qis-3.1.3 → qis-3.1.4}/qis/examples/momentum_indices.py +0 -0
  34. {qis-3.1.3 → qis-3.1.4}/qis/examples/ohlc_vol_analysis.py +0 -0
  35. {qis-3.1.3 → qis-3.1.4}/qis/examples/overnight_returns.py +0 -0
  36. {qis-3.1.3 → qis-3.1.4}/qis/examples/perf_external_assets.py +0 -0
  37. {qis-3.1.3 → qis-3.1.4}/qis/examples/perp_pricing.py +0 -0
  38. {qis-3.1.3 → qis-3.1.4}/qis/examples/readme_performances.py +0 -0
  39. {qis-3.1.3 → qis-3.1.4}/qis/examples/risk_return_frontier.py +0 -0
  40. {qis-3.1.3 → qis-3.1.4}/qis/examples/rolling_performance.py +0 -0
  41. {qis-3.1.3 → qis-3.1.4}/qis/examples/seasonality.py +0 -0
  42. {qis-3.1.3 → qis-3.1.4}/qis/examples/sharpe_vs_sortino.py +0 -0
  43. {qis-3.1.3 → qis-3.1.4}/qis/examples/simulate_quant_strats.py +0 -0
  44. {qis-3.1.3 → qis-3.1.4}/qis/examples/test_ewm.py +0 -0
  45. {qis-3.1.3 → qis-3.1.4}/qis/examples/test_scatter.py +0 -0
  46. {qis-3.1.3 → qis-3.1.4}/qis/examples/try_pybloqs.py +0 -0
  47. {qis-3.1.3 → qis-3.1.4}/qis/examples/universe_corrs.py +0 -0
  48. {qis-3.1.3 → qis-3.1.4}/qis/examples/vix_beta_to_equities_bonds.py +0 -0
  49. {qis-3.1.3 → qis-3.1.4}/qis/examples/vix_conditional_returns.py +0 -0
  50. {qis-3.1.3 → qis-3.1.4}/qis/examples/vix_spy_by_year.py +0 -0
  51. {qis-3.1.3 → qis-3.1.4}/qis/examples/vix_tenor_analysis.py +0 -0
  52. {qis-3.1.3 → qis-3.1.4}/qis/examples/vol_without_weekends.py +0 -0
  53. {qis-3.1.3 → qis-3.1.4}/qis/file_utils.py +0 -0
  54. {qis-3.1.3 → qis-3.1.4}/qis/local_path.py +0 -0
  55. {qis-3.1.3 → qis-3.1.4}/qis/models/README.md +0 -0
  56. {qis-3.1.3 → qis-3.1.4}/qis/models/__init__.py +0 -0
  57. {qis-3.1.3 → qis-3.1.4}/qis/models/linear/__init__.py +0 -0
  58. {qis-3.1.3 → qis-3.1.4}/qis/models/linear/auto_corr.py +0 -0
  59. {qis-3.1.3 → qis-3.1.4}/qis/models/linear/corr_cov_matrix.py +0 -0
  60. {qis-3.1.3 → qis-3.1.4}/qis/models/linear/ewm.py +0 -0
  61. {qis-3.1.3 → qis-3.1.4}/qis/models/linear/ewm_convolution.py +0 -0
  62. {qis-3.1.3 → qis-3.1.4}/qis/models/linear/ewm_factors.py +0 -0
  63. {qis-3.1.3 → qis-3.1.4}/qis/models/linear/ewm_winsor_outliers.py +0 -0
  64. {qis-3.1.3 → qis-3.1.4}/qis/models/linear/pca.py +0 -0
  65. {qis-3.1.3 → qis-3.1.4}/qis/models/linear/plot_correlations.py +0 -0
  66. {qis-3.1.3 → qis-3.1.4}/qis/models/linear/ra_returns.py +0 -0
  67. {qis-3.1.3 → qis-3.1.4}/qis/models/stats/__init__.py +0 -0
  68. {qis-3.1.3 → qis-3.1.4}/qis/models/stats/bootstrap.py +0 -0
  69. {qis-3.1.3 → qis-3.1.4}/qis/models/stats/ohlc_vol.py +0 -0
  70. {qis-3.1.3 → qis-3.1.4}/qis/models/stats/rolling_stats.py +0 -0
  71. {qis-3.1.3 → qis-3.1.4}/qis/models/stats/test_bootstrap.py +0 -0
  72. {qis-3.1.3 → qis-3.1.4}/qis/perfstats/README.md +0 -0
  73. {qis-3.1.3 → qis-3.1.4}/qis/perfstats/__init__.py +0 -0
  74. {qis-3.1.3 → qis-3.1.4}/qis/perfstats/cond_regression.py +0 -0
  75. {qis-3.1.3 → qis-3.1.4}/qis/perfstats/config.py +0 -0
  76. {qis-3.1.3 → qis-3.1.4}/qis/perfstats/desc_table.py +0 -0
  77. {qis-3.1.3 → qis-3.1.4}/qis/perfstats/fx_ops.py +0 -0
  78. {qis-3.1.3 → qis-3.1.4}/qis/perfstats/perf_stats.py +0 -0
  79. {qis-3.1.3 → qis-3.1.4}/qis/perfstats/regime_classifier.py +0 -0
  80. {qis-3.1.3 → qis-3.1.4}/qis/perfstats/returns.py +0 -0
  81. {qis-3.1.3 → qis-3.1.4}/qis/perfstats/timeseries_bfill.py +0 -0
  82. {qis-3.1.3 → qis-3.1.4}/qis/plots/README.md +0 -0
  83. {qis-3.1.3 → qis-3.1.4}/qis/plots/__init__.py +0 -0
  84. {qis-3.1.3 → qis-3.1.4}/qis/plots/boxplot.py +0 -0
  85. {qis-3.1.3 → qis-3.1.4}/qis/plots/contour.py +0 -0
  86. {qis-3.1.3 → qis-3.1.4}/qis/plots/derived/__init__.py +0 -0
  87. {qis-3.1.3 → qis-3.1.4}/qis/plots/derived/data_timeseries.py +0 -0
  88. {qis-3.1.3 → qis-3.1.4}/qis/plots/derived/desc_table.py +0 -0
  89. {qis-3.1.3 → qis-3.1.4}/qis/plots/derived/drawdowns.py +0 -0
  90. {qis-3.1.3 → qis-3.1.4}/qis/plots/derived/perf_table.py +0 -0
  91. {qis-3.1.3 → qis-3.1.4}/qis/plots/derived/prices.py +0 -0
  92. {qis-3.1.3 → qis-3.1.4}/qis/plots/derived/regime_class_table.py +0 -0
  93. {qis-3.1.3 → qis-3.1.4}/qis/plots/derived/regime_data.py +0 -0
  94. {qis-3.1.3 → qis-3.1.4}/qis/plots/derived/regime_pdf.py +0 -0
  95. {qis-3.1.3 → qis-3.1.4}/qis/plots/derived/regime_scatter.py +0 -0
  96. {qis-3.1.3 → qis-3.1.4}/qis/plots/derived/returns_heatmap.py +0 -0
  97. {qis-3.1.3 → qis-3.1.4}/qis/plots/derived/returns_scatter.py +0 -0
  98. {qis-3.1.3 → qis-3.1.4}/qis/plots/errorbar.py +0 -0
  99. {qis-3.1.3 → qis-3.1.4}/qis/plots/heatmap.py +0 -0
  100. {qis-3.1.3 → qis-3.1.4}/qis/plots/histogram.py +0 -0
  101. {qis-3.1.3 → qis-3.1.4}/qis/plots/histplot2d.py +0 -0
  102. {qis-3.1.3 → qis-3.1.4}/qis/plots/lineplot.py +0 -0
  103. {qis-3.1.3 → qis-3.1.4}/qis/plots/pie.py +0 -0
  104. {qis-3.1.3 → qis-3.1.4}/qis/plots/qqplot.py +0 -0
  105. {qis-3.1.3 → qis-3.1.4}/qis/plots/reports/__init__.py +0 -0
  106. {qis-3.1.3 → qis-3.1.4}/qis/plots/reports/econ_data_single.py +0 -0
  107. {qis-3.1.3 → qis-3.1.4}/qis/plots/reports/gantt_data_history.py +0 -0
  108. {qis-3.1.3 → qis-3.1.4}/qis/plots/reports/price_history.py +0 -0
  109. {qis-3.1.3 → qis-3.1.4}/qis/plots/reports/utils.py +0 -0
  110. {qis-3.1.3 → qis-3.1.4}/qis/plots/scatter.py +0 -0
  111. {qis-3.1.3 → qis-3.1.4}/qis/plots/stackplot.py +0 -0
  112. {qis-3.1.3 → qis-3.1.4}/qis/plots/time_series.py +0 -0
  113. {qis-3.1.3 → qis-3.1.4}/qis/plots/utils.py +0 -0
  114. {qis-3.1.3 → qis-3.1.4}/qis/portfolio/README.md +0 -0
  115. {qis-3.1.3 → qis-3.1.4}/qis/portfolio/__init__.py +0 -0
  116. {qis-3.1.3 → qis-3.1.4}/qis/portfolio/backtester.py +0 -0
  117. {qis-3.1.3 → qis-3.1.4}/qis/portfolio/ewm_portfolio_risk.py +0 -0
  118. {qis-3.1.3 → qis-3.1.4}/qis/portfolio/multi_portfolio_data.py +0 -0
  119. {qis-3.1.3 → qis-3.1.4}/qis/portfolio/reports/__init__.py +0 -0
  120. {qis-3.1.3 → qis-3.1.4}/qis/portfolio/reports/brinson_attribution.py +0 -0
  121. {qis-3.1.3 → qis-3.1.4}/qis/portfolio/reports/config.py +0 -0
  122. {qis-3.1.3 → qis-3.1.4}/qis/portfolio/reports/multi_assets_factsheet.py +0 -0
  123. {qis-3.1.3 → qis-3.1.4}/qis/portfolio/reports/multi_strategy_factseet_pybloqs.py +0 -0
  124. {qis-3.1.3 → qis-3.1.4}/qis/portfolio/reports/multi_strategy_factsheet.py +0 -0
  125. {qis-3.1.3 → qis-3.1.4}/qis/portfolio/reports/strategy_benchmark_factsheet_pybloqs.py +0 -0
  126. {qis-3.1.3 → qis-3.1.4}/qis/portfolio/reports/strategy_factsheet.py +0 -0
  127. {qis-3.1.3 → qis-3.1.4}/qis/portfolio/reports/strategy_signal_factsheet.py +0 -0
  128. {qis-3.1.3 → qis-3.1.4}/qis/portfolio/strats/__init__.py +0 -0
  129. {qis-3.1.3 → qis-3.1.4}/qis/portfolio/strats/quant_strats_delta1.py +0 -0
  130. {qis-3.1.3 → qis-3.1.4}/qis/portfolio/strats/seasonal_strats.py +0 -0
  131. {qis-3.1.3 → qis-3.1.4}/qis/sql_engine.py +0 -0
  132. {qis-3.1.3 → qis-3.1.4}/qis/test_data.py +0 -0
  133. {qis-3.1.3 → qis-3.1.4}/qis/utils/README.md +0 -0
  134. {qis-3.1.3 → qis-3.1.4}/qis/utils/__init__.py +0 -0
  135. {qis-3.1.3 → qis-3.1.4}/qis/utils/dates.py +0 -0
  136. {qis-3.1.3 → qis-3.1.4}/qis/utils/df_agg.py +0 -0
  137. {qis-3.1.3 → qis-3.1.4}/qis/utils/df_cut.py +0 -0
  138. {qis-3.1.3 → qis-3.1.4}/qis/utils/df_freq.py +0 -0
  139. {qis-3.1.3 → qis-3.1.4}/qis/utils/df_groups.py +0 -0
  140. {qis-3.1.3 → qis-3.1.4}/qis/utils/df_melt.py +0 -0
  141. {qis-3.1.3 → qis-3.1.4}/qis/utils/df_ops.py +0 -0
  142. {qis-3.1.3 → qis-3.1.4}/qis/utils/df_str.py +0 -0
  143. {qis-3.1.3 → qis-3.1.4}/qis/utils/df_to_scores.py +0 -0
  144. {qis-3.1.3 → qis-3.1.4}/qis/utils/df_to_weights.py +0 -0
  145. {qis-3.1.3 → qis-3.1.4}/qis/utils/generic.py +0 -0
  146. {qis-3.1.3 → qis-3.1.4}/qis/utils/np_ops.py +0 -0
  147. {qis-3.1.3 → qis-3.1.4}/qis/utils/ols.py +0 -0
  148. {qis-3.1.3 → qis-3.1.4}/qis/utils/sampling.py +0 -0
  149. {qis-3.1.3 → qis-3.1.4}/qis/utils/struct_ops.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: qis
3
- Version: 3.1.3
3
+ Version: 3.1.4
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.1.3"
3
+ version = "3.1.4"
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>"]
@@ -217,7 +217,7 @@ def plot_bars(df: Union[pd.DataFrame, pd.Series],
217
217
  return fig
218
218
 
219
219
 
220
- def plot_vbars(df: pd.DataFrame,
220
+ def plot_vbars(df: Union[pd.DataFrame, pd.Series],
221
221
  title: Optional[str] = None,
222
222
  fontsize: int = 10,
223
223
  add_bar_values: bool = True,
@@ -244,6 +244,8 @@ def plot_vbars(df: pd.DataFrame,
244
244
  **kwargs
245
245
  ) -> plt.Figure:
246
246
 
247
+ if isinstance(df, pd.Series):
248
+ df = df.to_frame()
247
249
  category_names = df.columns.to_list()
248
250
 
249
251
  if add_total_to_index and totals is not None:
@@ -516,7 +518,7 @@ def run_unit_test(unit_test: UnitTests):
516
518
 
517
519
  if __name__ == '__main__':
518
520
 
519
- unit_test = UnitTests.BARS
521
+ unit_test = UnitTests.VBAR_WEIGHTS
520
522
 
521
523
  is_run_all_tests = False
522
524
  if is_run_all_tests:
@@ -49,6 +49,7 @@ def plot_df_table(df: pd.DataFrame,
49
49
  data_colors: List[Tuple[float, float, float]] = None,
50
50
  diagonal_color: str = None,
51
51
  rows_edge_lines: List[int] = None,
52
+ rows_edge_color: str = 'blue',
52
53
  columns_edge_lines: List[Tuple[int, str]] = None,
53
54
  bold_font: bool = False,
54
55
  linewidth: float = 0.5, # table borders
@@ -211,7 +212,7 @@ def plot_df_table(df: pd.DataFrame,
211
212
 
212
213
  if rows_edge_lines is not None:
213
214
  for rows_edge_line in rows_edge_lines:
214
- ax.axhline(y=rows_edge_line, color='black', alpha=0.5*alpha, lw=0.75)
215
+ ax.axhline(y=rows_edge_line, color=rows_edge_color, alpha=0.5*alpha, lw=0.75)
215
216
 
216
217
  if columns_edge_lines is not None:
217
218
  for columns_edge_line in columns_edge_lines:
@@ -80,6 +80,7 @@ class PortfolioData:
80
80
  benchmark_prices: pd.DataFrame = None # can pass benchmark prices here
81
81
  ticker: str = None
82
82
  strategy_signal_data: StrategySignalData = None
83
+ covar_dict: Dict[pd.Timestamp, pd.DataFrame] = None # for computing risk contributions
83
84
 
84
85
  def __post_init__(self):
85
86
  if isinstance(self.nav, pd.DataFrame):
@@ -715,7 +716,7 @@ class PortfolioData:
715
716
  return portfolio_vars, instrument_vars
716
717
 
717
718
  def compute_risk_contributions_implied_by_covar(self,
718
- covar_dict: Dict[pd.Timestamp, pd.DataFrame],
719
+ covar_dict: Dict[pd.Timestamp, pd.DataFrame] = None,
719
720
  group_data: pd.Series = None,
720
721
  group_order: List[str] = None,
721
722
  align_with_covar_dates: bool = True,
@@ -725,6 +726,11 @@ class PortfolioData:
725
726
  """
726
727
  compute risk contributions using covar_dict
727
728
  """
729
+ if covar_dict is None:
730
+ if self.covar_dict is None:
731
+ raise ValueError(f"must provide covar_dict")
732
+ else:
733
+ covar_dict = self.covar_dict
728
734
  strategy_weights = self.get_weights(freq=freq, is_input_weights=True)
729
735
  covar_index = list(covar_dict.keys())
730
736
  strategy_rc = {}
@@ -1236,10 +1242,13 @@ class PortfolioData:
1236
1242
  add_top_bar_values: Optional[bool] = None,
1237
1243
  time_period: TimePeriod = None,
1238
1244
  title: str = None,
1245
+ group_data: pd.Series = None,
1246
+ group_order: List[str] = None,
1239
1247
  ax: plt.Subplot = None,
1240
1248
  **kwargs
1241
1249
  ) -> None:
1242
- weights = self.get_weights(is_input_weights=True, freq=None, is_grouped=is_grouped)
1250
+ weights = self.get_weights(is_input_weights=True, freq=None, is_grouped=is_grouped,
1251
+ group_data=group_data, group_order=group_order)
1243
1252
  if time_period is not None:
1244
1253
  weights_1 = time_period.locate(weights)
1245
1254
  if len(weights_1.index) > 0:
@@ -1456,6 +1465,7 @@ class PortfolioData:
1456
1465
  ax=axs[1],
1457
1466
  **kwargs)
1458
1467
 
1468
+
1459
1469
  @dataclass
1460
1470
  class StrategySignalData:
1461
1471
  """
@@ -566,9 +566,9 @@ def weights_tracking_error_report_by_ac_subac(multi_portfolio_data: MultiPortfol
566
566
  # benchmark weights
567
567
  benchmark_data = multi_portfolio_data.portfolio_datas[benchmark_idx]
568
568
  benchmark_ticker = benchmark_data.ticker
569
- benchmark_exposures_ac = benchmark_data.get_weights(group_data=ac_group_data, group_order=sub_ac_group_order,
569
+ benchmark_exposures_ac = benchmark_data.get_weights(group_data=ac_group_data, group_order=ac_group_order,
570
570
  **weight_kwargs)
571
- benchmark_exposures_subac = benchmark_data.get_weights(group_data=sub_ac_group_data, group_order=ac_group_order,
571
+ benchmark_exposures_subac = benchmark_data.get_weights(group_data=sub_ac_group_data, group_order=sub_ac_group_order,
572
572
  **weight_kwargs)
573
573
 
574
574
  # plot strategy and benchmark weights by ac
@@ -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