qis 3.0.3__tar.gz → 3.0.5__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 (150) hide show
  1. {qis-3.0.3 → qis-3.0.5}/PKG-INFO +1 -1
  2. {qis-3.0.3 → qis-3.0.5}/pyproject.toml +8 -3
  3. {qis-3.0.3 → qis-3.0.5}/qis/plots/boxplot.py +1 -0
  4. {qis-3.0.3 → qis-3.0.5}/qis/plots/derived/perf_table.py +11 -0
  5. {qis-3.0.3 → qis-3.0.5}/qis/portfolio/ewm_portfolio_risk.py +7 -1
  6. {qis-3.0.3 → qis-3.0.5}/qis/portfolio/multi_portfolio_data.py +34 -9
  7. {qis-3.0.3 → qis-3.0.5}/qis/portfolio/reports/strategy_benchmark_factsheet.py +1 -0
  8. {qis-3.0.3 → qis-3.0.5}/qis/settings.yaml +1 -1
  9. {qis-3.0.3 → qis-3.0.5}/qis/utils/np_ops.py +2 -3
  10. {qis-3.0.3 → qis-3.0.5}/LICENSE.txt +0 -0
  11. {qis-3.0.3 → qis-3.0.5}/README.md +0 -0
  12. {qis-3.0.3 → qis-3.0.5}/qis/__init__.py +0 -0
  13. {qis-3.0.3 → qis-3.0.5}/qis/examples/best_returns.py +0 -0
  14. {qis-3.0.3 → qis-3.0.5}/qis/examples/bond_futures_portfolio.py +0 -0
  15. {qis-3.0.3 → qis-3.0.5}/qis/examples/bootstrap_analysis.py +0 -0
  16. {qis-3.0.3 → qis-3.0.5}/qis/examples/boxplot_conditional_returns.py +0 -0
  17. {qis-3.0.3 → qis-3.0.5}/qis/examples/btc_asset_corr.py +0 -0
  18. {qis-3.0.3 → qis-3.0.5}/qis/examples/constant_notional.py +0 -0
  19. {qis-3.0.3 → qis-3.0.5}/qis/examples/constant_weight_portfolios.py +0 -0
  20. {qis-3.0.3 → qis-3.0.5}/qis/examples/core/perf_bbg_prices.py +0 -0
  21. {qis-3.0.3 → qis-3.0.5}/qis/examples/core/price_plots.py +0 -0
  22. {qis-3.0.3 → qis-3.0.5}/qis/examples/core/us_election.py +0 -0
  23. {qis-3.0.3 → qis-3.0.5}/qis/examples/credit_spreads.py +0 -0
  24. {qis-3.0.3 → qis-3.0.5}/qis/examples/credit_trackers.py +0 -0
  25. {qis-3.0.3 → qis-3.0.5}/qis/examples/europe_futures.py +0 -0
  26. {qis-3.0.3 → qis-3.0.5}/qis/examples/factsheets/multi_assets.py +0 -0
  27. {qis-3.0.3 → qis-3.0.5}/qis/examples/factsheets/multi_strategy.py +0 -0
  28. {qis-3.0.3 → qis-3.0.5}/qis/examples/factsheets/pyblogs_reports.py +0 -0
  29. {qis-3.0.3 → qis-3.0.5}/qis/examples/factsheets/strategy.py +0 -0
  30. {qis-3.0.3 → qis-3.0.5}/qis/examples/factsheets/strategy_benchmark.py +0 -0
  31. {qis-3.0.3 → qis-3.0.5}/qis/examples/generate_option_rolls.py +0 -0
  32. {qis-3.0.3 → qis-3.0.5}/qis/examples/interpolation_infrequent_returns.py +0 -0
  33. {qis-3.0.3 → qis-3.0.5}/qis/examples/leveraged_strategies.py +0 -0
  34. {qis-3.0.3 → qis-3.0.5}/qis/examples/long_short.py +0 -0
  35. {qis-3.0.3 → qis-3.0.5}/qis/examples/momentum_indices.py +0 -0
  36. {qis-3.0.3 → qis-3.0.5}/qis/examples/oakmark_analysis.py +0 -0
  37. {qis-3.0.3 → qis-3.0.5}/qis/examples/ohlc_vol_analysis.py +0 -0
  38. {qis-3.0.3 → qis-3.0.5}/qis/examples/overnight_returns.py +0 -0
  39. {qis-3.0.3 → qis-3.0.5}/qis/examples/perf_external_assets.py +0 -0
  40. {qis-3.0.3 → qis-3.0.5}/qis/examples/perp_pricing.py +0 -0
  41. {qis-3.0.3 → qis-3.0.5}/qis/examples/readme_performances.py +0 -0
  42. {qis-3.0.3 → qis-3.0.5}/qis/examples/risk_return_frontier.py +0 -0
  43. {qis-3.0.3 → qis-3.0.5}/qis/examples/rolling_performance.py +0 -0
  44. {qis-3.0.3 → qis-3.0.5}/qis/examples/seasonality.py +0 -0
  45. {qis-3.0.3 → qis-3.0.5}/qis/examples/sharpe_vs_sortino.py +0 -0
  46. {qis-3.0.3 → qis-3.0.5}/qis/examples/simulate_quant_strats.py +0 -0
  47. {qis-3.0.3 → qis-3.0.5}/qis/examples/test_ewm.py +0 -0
  48. {qis-3.0.3 → qis-3.0.5}/qis/examples/test_scatter.py +0 -0
  49. {qis-3.0.3 → qis-3.0.5}/qis/examples/try_pybloqs.py +0 -0
  50. {qis-3.0.3 → qis-3.0.5}/qis/examples/universe_corrs.py +0 -0
  51. {qis-3.0.3 → qis-3.0.5}/qis/examples/vix_beta_to_equities_bonds.py +0 -0
  52. {qis-3.0.3 → qis-3.0.5}/qis/examples/vix_conditional_returns.py +0 -0
  53. {qis-3.0.3 → qis-3.0.5}/qis/examples/vix_spy_by_year.py +0 -0
  54. {qis-3.0.3 → qis-3.0.5}/qis/examples/vix_tenor_analysis.py +0 -0
  55. {qis-3.0.3 → qis-3.0.5}/qis/examples/vol_without_weekends.py +0 -0
  56. {qis-3.0.3 → qis-3.0.5}/qis/file_utils.py +0 -0
  57. {qis-3.0.3 → qis-3.0.5}/qis/local_path.py +0 -0
  58. {qis-3.0.3 → qis-3.0.5}/qis/models/README.md +0 -0
  59. {qis-3.0.3 → qis-3.0.5}/qis/models/__init__.py +0 -0
  60. {qis-3.0.3 → qis-3.0.5}/qis/models/linear/__init__.py +0 -0
  61. {qis-3.0.3 → qis-3.0.5}/qis/models/linear/auto_corr.py +0 -0
  62. {qis-3.0.3 → qis-3.0.5}/qis/models/linear/corr_cov_matrix.py +0 -0
  63. {qis-3.0.3 → qis-3.0.5}/qis/models/linear/ewm.py +0 -0
  64. {qis-3.0.3 → qis-3.0.5}/qis/models/linear/ewm_convolution.py +0 -0
  65. {qis-3.0.3 → qis-3.0.5}/qis/models/linear/ewm_factors.py +0 -0
  66. {qis-3.0.3 → qis-3.0.5}/qis/models/linear/ewm_winsor_outliers.py +0 -0
  67. {qis-3.0.3 → qis-3.0.5}/qis/models/linear/pca.py +0 -0
  68. {qis-3.0.3 → qis-3.0.5}/qis/models/linear/plot_correlations.py +0 -0
  69. {qis-3.0.3 → qis-3.0.5}/qis/models/linear/ra_returns.py +0 -0
  70. {qis-3.0.3 → qis-3.0.5}/qis/models/stats/__init__.py +0 -0
  71. {qis-3.0.3 → qis-3.0.5}/qis/models/stats/bootstrap.py +0 -0
  72. {qis-3.0.3 → qis-3.0.5}/qis/models/stats/ohlc_vol.py +0 -0
  73. {qis-3.0.3 → qis-3.0.5}/qis/models/stats/rolling_stats.py +0 -0
  74. {qis-3.0.3 → qis-3.0.5}/qis/models/stats/test_bootstrap.py +0 -0
  75. {qis-3.0.3 → qis-3.0.5}/qis/perfstats/README.md +0 -0
  76. {qis-3.0.3 → qis-3.0.5}/qis/perfstats/__init__.py +0 -0
  77. {qis-3.0.3 → qis-3.0.5}/qis/perfstats/cond_regression.py +0 -0
  78. {qis-3.0.3 → qis-3.0.5}/qis/perfstats/config.py +0 -0
  79. {qis-3.0.3 → qis-3.0.5}/qis/perfstats/desc_table.py +0 -0
  80. {qis-3.0.3 → qis-3.0.5}/qis/perfstats/fx_ops.py +0 -0
  81. {qis-3.0.3 → qis-3.0.5}/qis/perfstats/perf_stats.py +0 -0
  82. {qis-3.0.3 → qis-3.0.5}/qis/perfstats/regime_classifier.py +0 -0
  83. {qis-3.0.3 → qis-3.0.5}/qis/perfstats/returns.py +0 -0
  84. {qis-3.0.3 → qis-3.0.5}/qis/perfstats/timeseries_bfill.py +0 -0
  85. {qis-3.0.3 → qis-3.0.5}/qis/plots/README.md +0 -0
  86. {qis-3.0.3 → qis-3.0.5}/qis/plots/__init__.py +0 -0
  87. {qis-3.0.3 → qis-3.0.5}/qis/plots/bars.py +0 -0
  88. {qis-3.0.3 → qis-3.0.5}/qis/plots/contour.py +0 -0
  89. {qis-3.0.3 → qis-3.0.5}/qis/plots/derived/__init__.py +0 -0
  90. {qis-3.0.3 → qis-3.0.5}/qis/plots/derived/data_timeseries.py +0 -0
  91. {qis-3.0.3 → qis-3.0.5}/qis/plots/derived/desc_table.py +0 -0
  92. {qis-3.0.3 → qis-3.0.5}/qis/plots/derived/drawdowns.py +0 -0
  93. {qis-3.0.3 → qis-3.0.5}/qis/plots/derived/prices.py +0 -0
  94. {qis-3.0.3 → qis-3.0.5}/qis/plots/derived/regime_class_table.py +0 -0
  95. {qis-3.0.3 → qis-3.0.5}/qis/plots/derived/regime_data.py +0 -0
  96. {qis-3.0.3 → qis-3.0.5}/qis/plots/derived/regime_pdf.py +0 -0
  97. {qis-3.0.3 → qis-3.0.5}/qis/plots/derived/regime_scatter.py +0 -0
  98. {qis-3.0.3 → qis-3.0.5}/qis/plots/derived/returns_heatmap.py +0 -0
  99. {qis-3.0.3 → qis-3.0.5}/qis/plots/derived/returns_scatter.py +0 -0
  100. {qis-3.0.3 → qis-3.0.5}/qis/plots/errorbar.py +0 -0
  101. {qis-3.0.3 → qis-3.0.5}/qis/plots/heatmap.py +0 -0
  102. {qis-3.0.3 → qis-3.0.5}/qis/plots/histogram.py +0 -0
  103. {qis-3.0.3 → qis-3.0.5}/qis/plots/histplot2d.py +0 -0
  104. {qis-3.0.3 → qis-3.0.5}/qis/plots/lineplot.py +0 -0
  105. {qis-3.0.3 → qis-3.0.5}/qis/plots/pie.py +0 -0
  106. {qis-3.0.3 → qis-3.0.5}/qis/plots/qqplot.py +0 -0
  107. {qis-3.0.3 → qis-3.0.5}/qis/plots/reports/__init__.py +0 -0
  108. {qis-3.0.3 → qis-3.0.5}/qis/plots/reports/econ_data_single.py +0 -0
  109. {qis-3.0.3 → qis-3.0.5}/qis/plots/reports/gantt_data_history.py +0 -0
  110. {qis-3.0.3 → qis-3.0.5}/qis/plots/reports/price_history.py +0 -0
  111. {qis-3.0.3 → qis-3.0.5}/qis/plots/reports/utils.py +0 -0
  112. {qis-3.0.3 → qis-3.0.5}/qis/plots/scatter.py +0 -0
  113. {qis-3.0.3 → qis-3.0.5}/qis/plots/stackplot.py +0 -0
  114. {qis-3.0.3 → qis-3.0.5}/qis/plots/table.py +0 -0
  115. {qis-3.0.3 → qis-3.0.5}/qis/plots/time_series.py +0 -0
  116. {qis-3.0.3 → qis-3.0.5}/qis/plots/utils.py +0 -0
  117. {qis-3.0.3 → qis-3.0.5}/qis/portfolio/README.md +0 -0
  118. {qis-3.0.3 → qis-3.0.5}/qis/portfolio/__init__.py +0 -0
  119. {qis-3.0.3 → qis-3.0.5}/qis/portfolio/backtester.py +0 -0
  120. {qis-3.0.3 → qis-3.0.5}/qis/portfolio/portfolio_data.py +0 -0
  121. {qis-3.0.3 → qis-3.0.5}/qis/portfolio/reports/__init__.py +0 -0
  122. {qis-3.0.3 → qis-3.0.5}/qis/portfolio/reports/brinson_attribution.py +0 -0
  123. {qis-3.0.3 → qis-3.0.5}/qis/portfolio/reports/config.py +0 -0
  124. {qis-3.0.3 → qis-3.0.5}/qis/portfolio/reports/multi_assets_factsheet.py +0 -0
  125. {qis-3.0.3 → qis-3.0.5}/qis/portfolio/reports/multi_strategy_factseet_pybloqs.py +0 -0
  126. {qis-3.0.3 → qis-3.0.5}/qis/portfolio/reports/multi_strategy_factsheet.py +0 -0
  127. {qis-3.0.3 → qis-3.0.5}/qis/portfolio/reports/strategy_benchmark_factsheet_pybloqs.py +0 -0
  128. {qis-3.0.3 → qis-3.0.5}/qis/portfolio/reports/strategy_factsheet.py +0 -0
  129. {qis-3.0.3 → qis-3.0.5}/qis/portfolio/reports/strategy_signal_factsheet.py +0 -0
  130. {qis-3.0.3 → qis-3.0.5}/qis/portfolio/strats/__init__.py +0 -0
  131. {qis-3.0.3 → qis-3.0.5}/qis/portfolio/strats/quant_strats_delta1.py +0 -0
  132. {qis-3.0.3 → qis-3.0.5}/qis/portfolio/strats/seasonal_strats.py +0 -0
  133. {qis-3.0.3 → qis-3.0.5}/qis/sql_engine.py +0 -0
  134. {qis-3.0.3 → qis-3.0.5}/qis/test_data.py +0 -0
  135. {qis-3.0.3 → qis-3.0.5}/qis/utils/README.md +0 -0
  136. {qis-3.0.3 → qis-3.0.5}/qis/utils/__init__.py +0 -0
  137. {qis-3.0.3 → qis-3.0.5}/qis/utils/dates.py +0 -0
  138. {qis-3.0.3 → qis-3.0.5}/qis/utils/df_agg.py +0 -0
  139. {qis-3.0.3 → qis-3.0.5}/qis/utils/df_cut.py +0 -0
  140. {qis-3.0.3 → qis-3.0.5}/qis/utils/df_freq.py +0 -0
  141. {qis-3.0.3 → qis-3.0.5}/qis/utils/df_groups.py +0 -0
  142. {qis-3.0.3 → qis-3.0.5}/qis/utils/df_melt.py +0 -0
  143. {qis-3.0.3 → qis-3.0.5}/qis/utils/df_ops.py +0 -0
  144. {qis-3.0.3 → qis-3.0.5}/qis/utils/df_str.py +0 -0
  145. {qis-3.0.3 → qis-3.0.5}/qis/utils/df_to_scores.py +0 -0
  146. {qis-3.0.3 → qis-3.0.5}/qis/utils/df_to_weights.py +0 -0
  147. {qis-3.0.3 → qis-3.0.5}/qis/utils/generic.py +0 -0
  148. {qis-3.0.3 → qis-3.0.5}/qis/utils/ols.py +0 -0
  149. {qis-3.0.3 → qis-3.0.5}/qis/utils/sampling.py +0 -0
  150. {qis-3.0.3 → qis-3.0.5}/qis/utils/struct_ops.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: qis
3
- Version: 3.0.3
3
+ Version: 3.0.5
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.0.3"
3
+ version = "3.0.5"
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>"]
@@ -50,6 +50,11 @@ pyarrow = ">=10.0.1"
50
50
  fsspec = ">=2022.11.0"
51
51
  yfinance = ">=0.1.38"
52
52
 
53
+ #[build-system]
54
+ #requires = ["poetry-core>=1.0.0"]
55
+ #
56
+
53
57
  [build-system]
54
- requires = ["poetry-core>=1.0.0"]
55
- build-backend = "poetry.core.masonry.api"
58
+ requires = ["poetry-core>=1.0.0", "hatchling==1.27.0", "hatch-vcs"]
59
+ #build-backend = "hatchling.build"
60
+ build-backend = "poetry.core.masonry.api"
@@ -552,6 +552,7 @@ def run_unit_test(unit_test: UnitTests):
552
552
  hue_var_name='instruments',
553
553
  y_var_name='weights',
554
554
  ylabel='weights',
555
+ legend_loc=None,
555
556
  showmedians=True,
556
557
  add_y_median_labels=True)
557
558
 
@@ -125,6 +125,8 @@ def plot_ra_perf_table_benchmark(prices: pd.DataFrame,
125
125
  fontsize: int = 10,
126
126
  transpose: bool = False,
127
127
  alpha_an_factor: float = None,
128
+ is_convert_to_str: bool = True,
129
+ df_to_add: pd.DataFrame = None,
128
130
  ax: plt.Subplot = None,
129
131
  **kwargs
130
132
  ) -> Tuple[Optional[plt.Figure], pd.DataFrame]:
@@ -138,10 +140,19 @@ def plot_ra_perf_table_benchmark(prices: pd.DataFrame,
138
140
  perf_columns=perf_columns,
139
141
  column_header=column_header,
140
142
  alpha_an_factor=alpha_an_factor,
143
+ is_convert_to_str=is_convert_to_str,
141
144
  **kwargs)
142
145
  if not drop_benchmark and special_rows_colors is None:
143
146
  special_rows_colors = [(1, 'skyblue')] # for benchmarl separation
144
147
  kwargs = sop.update_kwargs(kwargs, dict(special_rows_colors=special_rows_colors))
148
+
149
+ if df_to_add is not None:
150
+ df_to_add = df_to_add.reindex(index=ra_perf_table.index)
151
+ if is_convert_to_str:
152
+ df_to_add = df_to_add.fillna('')
153
+ ra_perf_table = pd.concat([ra_perf_table, df_to_add], axis=1)
154
+
155
+
145
156
  fig = ptb.plot_df_table(df=ra_perf_table,
146
157
  transpose=transpose,
147
158
  special_columns_colors=special_columns_colors,
@@ -217,7 +217,13 @@ def compute_portfolio_independent_var_by_ac(prices: pd.DataFrame,
217
217
  def compute_portfolio_risk_contributions(w: Union[np.ndarray, pd.Series],
218
218
  covar: Union[np.ndarray, pd.DataFrame]
219
219
  ) -> Union[np.ndarray, pd.Series]:
220
+ if isinstance(covar, pd.DataFrame) and isinstance(w, pd.Series): # make sure weights are alined
221
+ w = w.reindex(index=covar.index).fillna(0.0)
222
+ elif isinstance(covar, np.ndarray) and isinstance(w, np.ndarray):
223
+ assert covar.shape[0] == covar.shape[1] == w.shape[0]
224
+ else:
225
+ raise ValueError(f"unnsuported types {type(w)} and {type(covar)}")
220
226
  portfolio_vol = np.sqrt(w.T @ covar @ w)
221
227
  marginal_risk_contribution = covar @ w.T
222
228
  rc = np.multiply(marginal_risk_contribution, w) / portfolio_vol
223
- return rc
229
+ return rc
@@ -427,6 +427,9 @@ class MultiPortfolioData:
427
427
  time_period: TimePeriod = None,
428
428
  perf_params: PerfParams = PERF_PARAMS,
429
429
  perf_columns: List[PerfStat] = rpt.BENCHMARK_TABLE_COLUMNS,
430
+ strategy_idx: int = 0,
431
+ benchmark_idx: int = 1,
432
+ add_turnover: bool = False,
430
433
  ax: plt.Subplot = None,
431
434
  **kwargs
432
435
  ) -> pd.DataFrame:
@@ -437,6 +440,14 @@ class MultiPortfolioData:
437
440
  drop_benchmark = False
438
441
  ra_perf_title = f"RA performance table for {perf_params.freq_vol}-freq returns with beta to {benchmark}: " \
439
442
  f"{qis.get_time_period(prices).to_str()}"
443
+
444
+ if add_turnover:
445
+ turnover = self.get_turnover(time_period=time_period, **kwargs)
446
+ turnover = turnover.mean(axis=0).to_frame('Turnover')
447
+ df_to_add = qis.df_to_str(turnover, var_format='{:,.0%}')
448
+ else:
449
+ df_to_add = None
450
+
440
451
  fig, ra_perf_table = ppt.plot_ra_perf_table_benchmark(prices=prices,
441
452
  benchmark=benchmark,
442
453
  perf_params=perf_params,
@@ -444,6 +455,7 @@ class MultiPortfolioData:
444
455
  drop_benchmark=drop_benchmark,
445
456
  title=ra_perf_title,
446
457
  rotation_for_columns_headers=0,
458
+ df_to_add=df_to_add,
447
459
  ax=ax,
448
460
  **kwargs)
449
461
  return ra_perf_table
@@ -598,7 +610,24 @@ class MultiPortfolioData:
598
610
  **kwargs)
599
611
  if benchmark is not None:
600
612
  self.add_regime_shadows(ax=ax, regime_benchmark=benchmark, index=diff.index, regime_params=regime_params)
601
-
613
+
614
+ def get_turnover(self,
615
+ time_period: TimePeriod = None,
616
+ turnover_rolling_period: Optional[int] = 12,
617
+ freq_turnover: Optional[str] = 'ME',
618
+ is_unit_based_traded_volume: bool = True,
619
+ **kwargs
620
+ ):
621
+ turnover = []
622
+ for portfolio in self.portfolio_datas:
623
+ turnover.append(portfolio.get_turnover(roll_period=turnover_rolling_period, freq=freq_turnover, is_agg=True,
624
+ is_unit_based_traded_volume=is_unit_based_traded_volume).rename(
625
+ portfolio.nav.name))
626
+ turnover = pd.concat(turnover, axis=1)
627
+ if time_period is not None:
628
+ turnover = time_period.locate(turnover)
629
+ return turnover
630
+
602
631
  def plot_turnover(self,
603
632
  benchmark: str = None,
604
633
  time_period: TimePeriod = None,
@@ -609,14 +638,10 @@ class MultiPortfolioData:
609
638
  is_unit_based_traded_volume: bool = True,
610
639
  ax: plt.Subplot = None,
611
640
  **kwargs) -> None:
612
-
613
- turnover = []
614
- for portfolio in self.portfolio_datas:
615
- turnover.append(portfolio.get_turnover(roll_period=turnover_rolling_period, freq=freq_turnover, is_agg=True,
616
- is_unit_based_traded_volume=is_unit_based_traded_volume).rename(portfolio.nav.name))
617
- turnover = pd.concat(turnover, axis=1)
618
- if time_period is not None:
619
- turnover = time_period.locate(turnover)
641
+
642
+ turnover = self.get_turnover(turnover_rolling_period=turnover_rolling_period, freq_turnover=freq_turnover,
643
+ is_unit_based_traded_volume=is_unit_based_traded_volume,
644
+ time_period=time_period)
620
645
  freq = pd.infer_freq(turnover.index)
621
646
  turnover_title = f"{turnover_rolling_period}-period rolling {freq}-freq Turnover"
622
647
  pts.plot_time_series(df=turnover,
@@ -542,6 +542,7 @@ def weights_tracking_error_report(multi_portfolio_data: MultiPortfolioData,
542
542
  add_benchmarks_to_navs=add_benchmarks_to_navs,
543
543
  perf_params=perf_params,
544
544
  time_period=time_period,
545
+ add_turnover=True,
545
546
  ax=ax,
546
547
  **kwargs)
547
548
  dfs['ra_perf_table'] = ra_perf_table
@@ -3,6 +3,7 @@
3
3
  # remove from git tracking:
4
4
  # git rm -r --cached setting.yaml
5
5
 
6
+
6
7
  RESOURCE_PATH:
7
8
  "..\\"
8
9
 
@@ -17,4 +18,3 @@ OUTPUT_PATH:
17
18
 
18
19
  AWS_POSTGRES:
19
20
  ""
20
-
@@ -249,14 +249,13 @@ def to_finite_ratio(x: Union[pd.Series, pd.DataFrame, np.ndarray],
249
249
  return x_y
250
250
 
251
251
 
252
- @njit
253
- def covar_to_corr(covar: np.ndarray) -> np.ndarray:
252
+ def covar_to_corr(covar: Union[np.ndarray, pd.DataFrame]) -> Union[np.ndarray, pd.DataFrame]:
254
253
  """
255
254
  compute correlation out of covariance
256
255
  """
257
256
  inv_vol = np.reciprocal(np.sqrt(np.diag(covar)))
258
257
  norm = np.outer(inv_vol, inv_vol)
259
- covar *= norm
258
+ covar = covar.multiply(norm)
260
259
  return covar
261
260
 
262
261
 
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes