wbportfolio 1.54.3__tar.gz → 1.54.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.

Potentially problematic release.


This version of wbportfolio might be problematic. Click here for more details.

Files changed (529) hide show
  1. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/PKG-INFO +1 -1
  2. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/handlers/trade.py +3 -3
  3. wbportfolio-1.54.5/wbportfolio/migrations/0080_alter_trade_drift_factor_alter_trade_weighting.py +19 -0
  4. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/models/asset.py +21 -19
  5. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/models/portfolio.py +100 -90
  6. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/models/transactions/rebalancing.py +22 -12
  7. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/models/transactions/trade_proposals.py +202 -80
  8. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/models/transactions/trades.py +36 -19
  9. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/pms/analytics/portfolio.py +5 -6
  10. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/pms/trading/handler.py +16 -19
  11. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/pms/typing.py +26 -11
  12. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/rebalancing/base.py +12 -1
  13. wbportfolio-1.54.5/wbportfolio/rebalancing/models/equally_weighted.py +34 -0
  14. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/rebalancing/models/market_capitalization_weighted.py +18 -9
  15. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/serializers/transactions/trade_proposals.py +2 -2
  16. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/tests/models/test_portfolios.py +6 -4
  17. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/tests/models/transactions/test_trade_proposals.py +13 -12
  18. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/tests/pms/test_analytics.py +4 -3
  19. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/tests/rebalancing/test_models.py +16 -10
  20. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/display/trade_proposals.py +9 -0
  21. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/transactions/trade_proposals.py +1 -1
  22. wbportfolio-1.54.3/wbportfolio/rebalancing/models/equally_weighted.py +0 -32
  23. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/.gitignore +0 -0
  24. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/LICENSE +0 -0
  25. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/pyproject.toml +0 -0
  26. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/__init__.py +0 -0
  27. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/admin/__init__.py +0 -0
  28. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/admin/asset.py +0 -0
  29. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/admin/custodians.py +0 -0
  30. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/admin/indexes.py +0 -0
  31. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/admin/portfolio.py +0 -0
  32. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/admin/portfolio_relationships.py +0 -0
  33. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/admin/product_groups.py +0 -0
  34. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/admin/products.py +0 -0
  35. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/admin/reconciliations.py +0 -0
  36. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/admin/registers.py +0 -0
  37. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/admin/roles.py +0 -0
  38. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/admin/transactions/__init__.py +0 -0
  39. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/admin/transactions/claim.py +0 -0
  40. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/admin/transactions/dividends.py +0 -0
  41. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/admin/transactions/fees.py +0 -0
  42. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/admin/transactions/rebalancing.py +0 -0
  43. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/admin/transactions/trades.py +0 -0
  44. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/analysis/__init__.py +0 -0
  45. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/analysis/claims.py +0 -0
  46. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/apps.py +0 -0
  47. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/contrib/__init__.py +0 -0
  48. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/contrib/company_portfolio/__init__.py +0 -0
  49. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/contrib/company_portfolio/admin.py +0 -0
  50. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/contrib/company_portfolio/apps.py +0 -0
  51. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/contrib/company_portfolio/configs/__init__.py +0 -0
  52. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/contrib/company_portfolio/configs/display.py +0 -0
  53. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/contrib/company_portfolio/configs/endpoints.py +0 -0
  54. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/contrib/company_portfolio/configs/previews.py +0 -0
  55. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/contrib/company_portfolio/constants.py +0 -0
  56. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/contrib/company_portfolio/dynamic_preferences_registry.py +0 -0
  57. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/contrib/company_portfolio/factories.py +0 -0
  58. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/contrib/company_portfolio/filters.py +0 -0
  59. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/contrib/company_portfolio/management.py +0 -0
  60. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/contrib/company_portfolio/migrations/0001_initial.py +0 -0
  61. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/contrib/company_portfolio/migrations/__init__.py +0 -0
  62. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/contrib/company_portfolio/models.py +0 -0
  63. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/contrib/company_portfolio/scripts.py +0 -0
  64. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/contrib/company_portfolio/serializers.py +0 -0
  65. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/contrib/company_portfolio/tasks.py +0 -0
  66. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/contrib/company_portfolio/tests/__init__.py +0 -0
  67. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/contrib/company_portfolio/tests/conftest.py +0 -0
  68. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/contrib/company_portfolio/tests/test_models.py +0 -0
  69. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/contrib/company_portfolio/urls.py +0 -0
  70. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/contrib/company_portfolio/viewsets.py +0 -0
  71. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/defaults/__init__.py +0 -0
  72. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/defaults/fees/__init__.py +0 -0
  73. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/defaults/fees/default.py +0 -0
  74. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/dynamic_preferences_registry.py +0 -0
  75. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/factories/__init__.py +0 -0
  76. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/factories/adjustments.py +0 -0
  77. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/factories/assets.py +0 -0
  78. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/factories/claim.py +0 -0
  79. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/factories/custodians.py +0 -0
  80. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/factories/dividends.py +0 -0
  81. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/factories/fees.py +0 -0
  82. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/factories/indexes.py +0 -0
  83. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/factories/portfolio_cash_flow.py +0 -0
  84. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/factories/portfolio_cash_targets.py +0 -0
  85. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/factories/portfolio_swing_pricings.py +0 -0
  86. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/factories/portfolios.py +0 -0
  87. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/factories/product_groups.py +0 -0
  88. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/factories/products.py +0 -0
  89. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/factories/rebalancing.py +0 -0
  90. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/factories/reconciliations.py +0 -0
  91. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/factories/roles.py +0 -0
  92. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/factories/trades.py +0 -0
  93. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/fdm/__init__.py +0 -0
  94. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/fdm/tasks.py +0 -0
  95. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/filters/__init__.py +0 -0
  96. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/filters/assets.py +0 -0
  97. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/filters/assets_and_net_new_money_progression.py +0 -0
  98. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/filters/custodians.py +0 -0
  99. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/filters/esg.py +0 -0
  100. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/filters/performances.py +0 -0
  101. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/filters/portfolios.py +0 -0
  102. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/filters/positions.py +0 -0
  103. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/filters/products.py +0 -0
  104. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/filters/roles.py +0 -0
  105. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/filters/signals.py +0 -0
  106. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/filters/transactions/__init__.py +0 -0
  107. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/filters/transactions/claim.py +0 -0
  108. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/filters/transactions/fees.py +0 -0
  109. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/filters/transactions/mixins.py +0 -0
  110. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/filters/transactions/trades.py +0 -0
  111. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/filters/transactions/utils.py +0 -0
  112. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/fixtures/product_factsheets.yaml +0 -0
  113. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/fixtures/wbportfolio.yaml.gz +0 -0
  114. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/fixtures/wbrisk_management.yaml.gz +0 -0
  115. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/__init__.py +0 -0
  116. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/backends/__init__.py +0 -0
  117. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/backends/refinitiv/adjustment.py +0 -0
  118. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/backends/ubs/__init__.py +0 -0
  119. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/backends/ubs/asset_position.py +0 -0
  120. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/backends/ubs/fees.py +0 -0
  121. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/backends/ubs/instrument_price.py +0 -0
  122. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/backends/ubs/mixin.py +0 -0
  123. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/backends/utils.py +0 -0
  124. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/backends/wbfdm/__init__.py +0 -0
  125. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/backends/wbfdm/adjustment.py +0 -0
  126. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/backends/wbfdm/dividend.py +0 -0
  127. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/backends/wbfdm/mixin.py +0 -0
  128. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/handlers/__init__.py +0 -0
  129. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/handlers/adjustment.py +0 -0
  130. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/handlers/asset_position.py +0 -0
  131. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/handlers/dividend.py +0 -0
  132. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/handlers/fees.py +0 -0
  133. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/handlers/portfolio_cash_flow.py +0 -0
  134. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/handlers/register.py +0 -0
  135. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/parsers/__init__.py +0 -0
  136. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/parsers/default_mapping.py +0 -0
  137. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/parsers/jpmorgan/__init__.py +0 -0
  138. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/parsers/jpmorgan/customer_trade.py +0 -0
  139. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/parsers/jpmorgan/fees.py +0 -0
  140. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/parsers/jpmorgan/strategy.py +0 -0
  141. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/parsers/jpmorgan/valuation.py +0 -0
  142. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/parsers/leonteq/__init__.py +0 -0
  143. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/parsers/leonteq/customer_trade.py +0 -0
  144. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/parsers/leonteq/equity.py +0 -0
  145. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/parsers/leonteq/fees.py +0 -0
  146. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/parsers/leonteq/trade.py +0 -0
  147. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/parsers/leonteq/valuation.py +0 -0
  148. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/parsers/natixis/__init__.py +0 -0
  149. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/parsers/natixis/customer_trade.py +0 -0
  150. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/parsers/natixis/d1_customer_trade.py +0 -0
  151. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/parsers/natixis/d1_equity.py +0 -0
  152. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/parsers/natixis/d1_fees.py +0 -0
  153. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/parsers/natixis/d1_trade.py +0 -0
  154. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/parsers/natixis/d1_valuation.py +0 -0
  155. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/parsers/natixis/dividend.py +0 -0
  156. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/parsers/natixis/equity.py +0 -0
  157. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/parsers/natixis/fees.py +0 -0
  158. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/parsers/natixis/trade.py +0 -0
  159. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/parsers/natixis/utils.py +0 -0
  160. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/parsers/natixis/valuation.py +0 -0
  161. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/parsers/refinitiv/__init__.py +0 -0
  162. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/parsers/refinitiv/adjustment.py +0 -0
  163. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/parsers/sg_lux/__init__.py +0 -0
  164. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/parsers/sg_lux/custodian_positions.py +0 -0
  165. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/parsers/sg_lux/customer_trade.py +0 -0
  166. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/parsers/sg_lux/customer_trade_pending_slk.py +0 -0
  167. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/parsers/sg_lux/customer_trade_slk.py +0 -0
  168. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/parsers/sg_lux/customer_trade_without_pw.py +0 -0
  169. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/parsers/sg_lux/equity.py +0 -0
  170. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/parsers/sg_lux/fees.py +0 -0
  171. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/parsers/sg_lux/perf_fees.py +0 -0
  172. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/parsers/sg_lux/portfolio_cash_flow.py +0 -0
  173. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/parsers/sg_lux/portfolio_future_cash_flow.py +0 -0
  174. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/parsers/sg_lux/registers.py +0 -0
  175. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/parsers/sg_lux/sylk.py +0 -0
  176. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/parsers/sg_lux/utils.py +0 -0
  177. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/parsers/sg_lux/valuation.py +0 -0
  178. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/parsers/societe_generale/__init__.py +0 -0
  179. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/parsers/societe_generale/customer_trade.py +0 -0
  180. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/parsers/societe_generale/strategy.py +0 -0
  181. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/parsers/societe_generale/valuation.py +0 -0
  182. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/parsers/tellco/__init__.py +0 -0
  183. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/parsers/tellco/customer_trade.py +0 -0
  184. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/parsers/tellco/equity.py +0 -0
  185. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/parsers/tellco/valuation.py +0 -0
  186. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/parsers/ubs/__init__.py +0 -0
  187. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/parsers/ubs/api/__init__.py +0 -0
  188. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/parsers/ubs/api/asset_position.py +0 -0
  189. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/parsers/ubs/api/fees.py +0 -0
  190. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/parsers/ubs/api/instrument_price.py +0 -0
  191. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/parsers/ubs/api/utils.py +0 -0
  192. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/parsers/ubs/customer_trade.py +0 -0
  193. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/parsers/ubs/equity.py +0 -0
  194. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/parsers/ubs/historical_customer_trade.py +0 -0
  195. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/parsers/ubs/valuation.py +0 -0
  196. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/parsers/vontobel/__init__.py +0 -0
  197. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/parsers/vontobel/asset_position.py +0 -0
  198. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/parsers/vontobel/customer_trade.py +0 -0
  199. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/parsers/vontobel/historical_customer_trade.py +0 -0
  200. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/parsers/vontobel/instrument.py +0 -0
  201. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/parsers/vontobel/management_fees.py +0 -0
  202. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/parsers/vontobel/performance_fees.py +0 -0
  203. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/parsers/vontobel/trade.py +0 -0
  204. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/parsers/vontobel/utils.py +0 -0
  205. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/parsers/vontobel/valuation.py +0 -0
  206. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/parsers/vontobel/valuation_api.py +0 -0
  207. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/resources/__init__.py +0 -0
  208. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/resources/assets.py +0 -0
  209. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/resources/trades.py +0 -0
  210. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/import_export/utils.py +0 -0
  211. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/jinja2/wbportfolio/sql/aum_nnm.sql +0 -0
  212. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/kpi_handlers/nnm.py +0 -0
  213. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/locale/de/LC_MESSAGES/django.mo +0 -0
  214. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/locale/de/LC_MESSAGES/django.po +0 -0
  215. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/locale/en/LC_MESSAGES/django.mo +0 -0
  216. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/locale/en/LC_MESSAGES/django.po +0 -0
  217. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/locale/fr/LC_MESSAGES/django.mo +0 -0
  218. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/locale/fr/LC_MESSAGES/django.po +0 -0
  219. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/metric/__init__.py +0 -0
  220. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/metric/backends/__init__.py +0 -0
  221. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/metric/backends/base.py +0 -0
  222. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/metric/backends/constants.py +0 -0
  223. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/metric/backends/portfolio_base.py +0 -0
  224. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/metric/backends/portfolio_esg.py +0 -0
  225. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/metric/tests/__init__.py +0 -0
  226. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/metric/tests/conftest.py +0 -0
  227. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/metric/tests/test_portfolio_base.py +0 -0
  228. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/metric/tests/test_portfolio_esg.py +0 -0
  229. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/migrations/0001_initial_squashed.py +0 -0
  230. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/migrations/0002_product_default_sub_account_squashed_0039_alter_assetallocation_company_and_more.py +0 -0
  231. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/migrations/0040_instrument_financial_instrument.py +0 -0
  232. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/migrations/0041_remove_listresearch_research_ptr_and_more.py +0 -0
  233. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/migrations/0042_instrumentlist_instrumentlistthroughmodel_and_more.py +0 -0
  234. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/migrations/0043_alter_instrumentlistthroughmodel_options_and_more.py +0 -0
  235. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/migrations/0044_alter_instrumentlist_identifier.py +0 -0
  236. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/migrations/0045_alter_instrument_financial_instrument.py +0 -0
  237. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/migrations/0046_add_product_default_account.py +0 -0
  238. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/migrations/0047_remove_product_default_sub_account.py +0 -0
  239. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/migrations/0048_alter_trade_status.py +0 -0
  240. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/migrations/0049_trade_claimed_shares.py +0 -0
  241. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/migrations/0050_fees_fee_date_fees_wbportfolio_transac_1f7a29_idx.py +0 -0
  242. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/migrations/0051_delete_macroreview.py +0 -0
  243. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/migrations/0052_remove_cash_instrument_ptr_and_more.py +0 -0
  244. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/migrations/0053_remove_product_group.py +0 -0
  245. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/migrations/0054_portfolioinstrumentpreferredclassificationthroughmodel_and_more.py +0 -0
  246. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/migrations/0055_remove_product__custom_management_rebates_and_more.py +0 -0
  247. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/migrations/0056_remove_companyportfoliodata_assets_under_management_currency_and_more.py +0 -0
  248. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/migrations/0057_alter_portfolio_preferred_instrument_classifications_and_more.py +0 -0
  249. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/migrations/0058_pmsinstrument.py +0 -0
  250. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/migrations/0059_fees_unique_fees.py +0 -0
  251. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/migrations/0060_alter_portfolioportfoliothroughmodel_type.py +0 -0
  252. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/migrations/0061_portfolio_bank_accounts_product_bank_account_and_more.py +0 -0
  253. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/migrations/0062_alter_dailyportfoliocashflow_options.py +0 -0
  254. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/migrations/0063_accountreconciliation_accountreconciliationline_and_more.py +0 -0
  255. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/migrations/0064_alter_portfolio_managers_portfolio_is_tracked_and_more.py +0 -0
  256. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/migrations/0065_alter_portfolio_managers_claim_as_shares_and_more.py +0 -0
  257. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/migrations/0066_assetposition_initial_shares_at_custodian_and_more.py +0 -0
  258. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/migrations/0067_assetposition_unique_asset_position.py +0 -0
  259. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/migrations/0068_trade_internal_trade_trade_marked_as_internal_and_more.py +0 -0
  260. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/migrations/0069_remove_portfolio_is_invested_and_more.py +0 -0
  261. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/migrations/0070_remove_assetposition_unique_asset_position_and_more.py +0 -0
  262. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/migrations/0071_alter_trade_options_alter_trade_order.py +0 -0
  263. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/migrations/0072_trade_diff_shares.py +0 -0
  264. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/migrations/0073_remove_product_price_computation_and_more.py +0 -0
  265. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/migrations/0074_alter_rebalancer_frequency_and_more.py +0 -0
  266. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/migrations/0075_portfolio_initial_position_date_and_more.py +0 -0
  267. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/migrations/0076_alter_dividendtransaction_price_and_more.py +0 -0
  268. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/migrations/0077_remove_transaction_currency_and_more.py +0 -0
  269. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/migrations/0078_trade_drift_factor.py +0 -0
  270. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/migrations/0079_alter_trade_drift_factor.py +0 -0
  271. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/migrations/__init__.py +0 -0
  272. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/models/__init__.py +0 -0
  273. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/models/adjustments.py +0 -0
  274. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/models/custodians.py +0 -0
  275. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/models/exceptions.py +0 -0
  276. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/models/graphs/__init__.py +0 -0
  277. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/models/graphs/portfolio.py +0 -0
  278. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/models/graphs/utils.py +0 -0
  279. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/models/indexes.py +0 -0
  280. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/models/llm/wbcrm/analyze_relationship.py +0 -0
  281. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/models/mixins/__init__.py +0 -0
  282. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/models/mixins/instruments.py +0 -0
  283. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/models/mixins/liquidity_stress_test.py +0 -0
  284. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/models/portfolio_cash_flow.py +0 -0
  285. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/models/portfolio_cash_targets.py +0 -0
  286. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/models/portfolio_relationship.py +0 -0
  287. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/models/portfolio_swing_pricings.py +0 -0
  288. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/models/product_groups.py +0 -0
  289. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/models/products.py +0 -0
  290. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/models/reconciliations/__init__.py +0 -0
  291. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/models/reconciliations/account_reconciliation_lines.py +0 -0
  292. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/models/reconciliations/account_reconciliations.py +0 -0
  293. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/models/reconciliations/reconciliations.py +0 -0
  294. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/models/registers.py +0 -0
  295. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/models/roles.py +0 -0
  296. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/models/signals.py +0 -0
  297. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/models/transactions/__init__.py +0 -0
  298. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/models/transactions/claim.py +0 -0
  299. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/models/transactions/dividends.py +0 -0
  300. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/models/transactions/fees.py +0 -0
  301. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/models/transactions/transactions.py +0 -0
  302. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/models/utils.py +0 -0
  303. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/permissions.py +0 -0
  304. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/pms/__init__.py +0 -0
  305. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/pms/analytics/__init__.py +0 -0
  306. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/pms/statistics/__init__.py +0 -0
  307. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/pms/trading/__init__.py +0 -0
  308. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/preferences.py +0 -0
  309. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/rebalancing/__init__.py +0 -0
  310. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/rebalancing/decorators.py +0 -0
  311. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/rebalancing/models/__init__.py +0 -0
  312. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/rebalancing/models/composite.py +0 -0
  313. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/rebalancing/models/model_portfolio.py +0 -0
  314. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/reports/__init__.py +0 -0
  315. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/reports/monthly_position_report.py +0 -0
  316. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/risk_management/__init__.py +0 -0
  317. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/risk_management/backends/__init__.py +0 -0
  318. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/risk_management/backends/accounts.py +0 -0
  319. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/risk_management/backends/controversy_portfolio.py +0 -0
  320. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/risk_management/backends/exposure_portfolio.py +0 -0
  321. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/risk_management/backends/instrument_list_portfolio.py +0 -0
  322. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/risk_management/backends/liquidity_risk.py +0 -0
  323. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/risk_management/backends/liquidity_stress_instrument.py +0 -0
  324. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/risk_management/backends/mixins.py +0 -0
  325. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/risk_management/backends/product_integrity.py +0 -0
  326. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/risk_management/backends/stop_loss_instrument.py +0 -0
  327. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/risk_management/backends/stop_loss_portfolio.py +0 -0
  328. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/risk_management/backends/ucits_portfolio.py +0 -0
  329. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/risk_management/tests/__init__.py +0 -0
  330. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/risk_management/tests/conftest.py +0 -0
  331. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/risk_management/tests/test_accounts.py +0 -0
  332. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/risk_management/tests/test_controversy_portfolio.py +0 -0
  333. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/risk_management/tests/test_exposure_portfolio.py +0 -0
  334. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/risk_management/tests/test_instrument_list_portfolio.py +0 -0
  335. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/risk_management/tests/test_liquidity_risk.py +0 -0
  336. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/risk_management/tests/test_product_integrity.py +0 -0
  337. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/risk_management/tests/test_stop_loss_instrument.py +0 -0
  338. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/risk_management/tests/test_stop_loss_portfolio.py +0 -0
  339. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/risk_management/tests/test_ucits_portfolio.py +0 -0
  340. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/serializers/__init__.py +0 -0
  341. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/serializers/adjustments.py +0 -0
  342. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/serializers/assets.py +0 -0
  343. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/serializers/custodians.py +0 -0
  344. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/serializers/portfolio_cash_flow.py +0 -0
  345. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/serializers/portfolio_cash_targets.py +0 -0
  346. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/serializers/portfolio_relationship.py +0 -0
  347. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/serializers/portfolio_swing_pricing.py +0 -0
  348. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/serializers/portfolios.py +0 -0
  349. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/serializers/positions.py +0 -0
  350. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/serializers/product_group.py +0 -0
  351. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/serializers/products.py +0 -0
  352. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/serializers/rebalancing.py +0 -0
  353. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/serializers/reconciliations.py +0 -0
  354. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/serializers/registers.py +0 -0
  355. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/serializers/roles.py +0 -0
  356. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/serializers/signals.py +0 -0
  357. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/serializers/transactions/__init__.py +0 -0
  358. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/serializers/transactions/claim.py +0 -0
  359. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/serializers/transactions/dividends.py +0 -0
  360. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/serializers/transactions/fees.py +0 -0
  361. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/serializers/transactions/trades.py +0 -0
  362. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/static/wbportfolio/css/macro_review.css +0 -0
  363. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/static/wbportfolio/markdown/documentation/account_holding_reconciliation.md +0 -0
  364. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/static/wbportfolio/markdown/documentation/aggregate_asset_position_liquidity.md +0 -0
  365. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/static/wbportfolio/markdown/documentation/company.md +0 -0
  366. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/static/wbportfolio/markdown/documentation/earnings_instrument.md +0 -0
  367. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/static/wbportfolio/markdown/documentation/financial_analysis_instrument_ratios.md +0 -0
  368. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/static/wbportfolio/markdown/documentation/financial_statistics.md +0 -0
  369. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/static/wbportfolio/markdown/documentation/person.md +0 -0
  370. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/tasks.py +0 -0
  371. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/templates/portfolio/email/customer_report.html +0 -0
  372. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/templates/portfolio/email/customer_trade_notification.html +0 -0
  373. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/templates/portfolio/email/email_base_template.html +0 -0
  374. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/templates/portfolio/email/rebalancing_report.html +0 -0
  375. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/templates/portfolio/macro/macro_review.html +0 -0
  376. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/tests/__init__.py +0 -0
  377. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/tests/conftest.py +0 -0
  378. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/tests/models/__init__.py +0 -0
  379. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/tests/models/test_account_reconciliation.py +0 -0
  380. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/tests/models/test_assets.py +0 -0
  381. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/tests/models/test_custodians.py +0 -0
  382. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/tests/models/test_customer_trades.py +0 -0
  383. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/tests/models/test_dividends.py +0 -0
  384. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/tests/models/test_imports.py +0 -0
  385. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/tests/models/test_instrument_mixins.py +0 -0
  386. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/tests/models/test_merge.py +0 -0
  387. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/tests/models/test_portfolio_cash_flow.py +0 -0
  388. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/tests/models/test_portfolio_cash_targets.py +0 -0
  389. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/tests/models/test_portfolio_swing_pricings.py +0 -0
  390. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/tests/models/test_product_groups.py +0 -0
  391. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/tests/models/test_products.py +0 -0
  392. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/tests/models/test_roles.py +0 -0
  393. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/tests/models/test_splits.py +0 -0
  394. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/tests/models/transactions/__init__.py +0 -0
  395. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/tests/models/transactions/test_claim.py +0 -0
  396. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/tests/models/transactions/test_fees.py +0 -0
  397. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/tests/models/transactions/test_rebalancing.py +0 -0
  398. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/tests/models/transactions/test_trades.py +0 -0
  399. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/tests/models/utils.py +0 -0
  400. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/tests/pms/__init__.py +0 -0
  401. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/tests/rebalancing/__init__.py +0 -0
  402. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/tests/serializers/__init__.py +0 -0
  403. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/tests/serializers/test_claims.py +0 -0
  404. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/tests/signals.py +0 -0
  405. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/tests/tests.py +0 -0
  406. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/tests/viewsets/__init__.py +0 -0
  407. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/tests/viewsets/test_assets.py +0 -0
  408. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/tests/viewsets/test_performances.py +0 -0
  409. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/tests/viewsets/test_products.py +0 -0
  410. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/tests/viewsets/transactions/__init__.py +0 -0
  411. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/tests/viewsets/transactions/test_claims.py +0 -0
  412. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/urls.py +0 -0
  413. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/utils.py +0 -0
  414. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/__init__.py +0 -0
  415. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/adjustments.py +0 -0
  416. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/assets.py +0 -0
  417. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/assets_and_net_new_money_progression.py +0 -0
  418. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/charts/__init__.py +0 -0
  419. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/charts/assets.py +0 -0
  420. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/__init__.py +0 -0
  421. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/buttons/__init__.py +0 -0
  422. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/buttons/adjustments.py +0 -0
  423. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/buttons/assets.py +0 -0
  424. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/buttons/claims.py +0 -0
  425. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/buttons/custodians.py +0 -0
  426. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/buttons/fees.py +0 -0
  427. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/buttons/mixins.py +0 -0
  428. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/buttons/portfolios.py +0 -0
  429. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/buttons/products.py +0 -0
  430. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/buttons/reconciliations.py +0 -0
  431. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/buttons/registers.py +0 -0
  432. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/buttons/signals.py +0 -0
  433. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/buttons/trade_proposals.py +0 -0
  434. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/buttons/trades.py +0 -0
  435. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/display/__init__.py +0 -0
  436. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/display/adjustments.py +0 -0
  437. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/display/assets.py +0 -0
  438. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/display/claim.py +0 -0
  439. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/display/custodians.py +0 -0
  440. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/display/esg.py +0 -0
  441. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/display/fees.py +0 -0
  442. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/display/portfolio_cash_flow.py +0 -0
  443. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/display/portfolio_relationship.py +0 -0
  444. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/display/portfolios.py +0 -0
  445. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/display/positions.py +0 -0
  446. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/display/product_groups.py +0 -0
  447. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/display/product_performance.py +0 -0
  448. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/display/products.py +0 -0
  449. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/display/rebalancing.py +0 -0
  450. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/display/reconciliations.py +0 -0
  451. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/display/registers.py +0 -0
  452. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/display/roles.py +0 -0
  453. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/display/trades.py +0 -0
  454. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/endpoints/__init__.py +0 -0
  455. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/endpoints/adjustments.py +0 -0
  456. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/endpoints/assets.py +0 -0
  457. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/endpoints/claim.py +0 -0
  458. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/endpoints/custodians.py +0 -0
  459. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/endpoints/esg.py +0 -0
  460. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/endpoints/fees.py +0 -0
  461. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/endpoints/portfolio_relationship.py +0 -0
  462. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/endpoints/portfolios.py +0 -0
  463. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/endpoints/positions.py +0 -0
  464. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/endpoints/product_groups.py +0 -0
  465. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/endpoints/product_performance.py +0 -0
  466. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/endpoints/products.py +0 -0
  467. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/endpoints/rebalancing.py +0 -0
  468. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/endpoints/reconciliations.py +0 -0
  469. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/endpoints/roles.py +0 -0
  470. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/endpoints/trade_proposals.py +0 -0
  471. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/endpoints/trades.py +0 -0
  472. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/menu/__init__.py +0 -0
  473. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/menu/adjustments.py +0 -0
  474. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/menu/assets.py +0 -0
  475. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/menu/claim.py +0 -0
  476. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/menu/custodians.py +0 -0
  477. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/menu/fees.py +0 -0
  478. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/menu/instrument_prices.py +0 -0
  479. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/menu/portfolio_cash_flow.py +0 -0
  480. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/menu/portfolios.py +0 -0
  481. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/menu/positions.py +0 -0
  482. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/menu/product_groups.py +0 -0
  483. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/menu/product_performance.py +0 -0
  484. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/menu/products.py +0 -0
  485. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/menu/reconciliations.py +0 -0
  486. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/menu/registers.py +0 -0
  487. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/menu/roles.py +0 -0
  488. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/menu/trades.py +0 -0
  489. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/previews/__init__.py +0 -0
  490. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/previews/portfolios.py +0 -0
  491. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/titles/__init__.py +0 -0
  492. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/titles/adjustments.py +0 -0
  493. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/titles/assets.py +0 -0
  494. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/titles/assets_and_net_new_money_progression.py +0 -0
  495. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/titles/claim.py +0 -0
  496. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/titles/custodians.py +0 -0
  497. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/titles/esg.py +0 -0
  498. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/titles/fees.py +0 -0
  499. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/titles/instrument_prices.py +0 -0
  500. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/titles/portfolios.py +0 -0
  501. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/titles/positions.py +0 -0
  502. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/titles/product_groups.py +0 -0
  503. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/titles/product_performance.py +0 -0
  504. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/titles/products.py +0 -0
  505. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/titles/registers.py +0 -0
  506. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/titles/roles.py +0 -0
  507. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/configs/titles/trades.py +0 -0
  508. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/custodians.py +0 -0
  509. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/esg.py +0 -0
  510. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/mixins.py +0 -0
  511. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/portfolio_cash_flow.py +0 -0
  512. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/portfolio_cash_targets.py +0 -0
  513. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/portfolio_relationship.py +0 -0
  514. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/portfolio_swing_pricing.py +0 -0
  515. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/portfolios.py +0 -0
  516. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/positions.py +0 -0
  517. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/product_groups.py +0 -0
  518. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/product_performance.py +0 -0
  519. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/products.py +0 -0
  520. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/reconciliations.py +0 -0
  521. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/registers.py +0 -0
  522. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/roles.py +0 -0
  523. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/signals.py +0 -0
  524. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/transactions/__init__.py +0 -0
  525. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/transactions/claim.py +0 -0
  526. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/transactions/fees.py +0 -0
  527. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/transactions/mixins.py +0 -0
  528. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/transactions/rebalancing.py +0 -0
  529. {wbportfolio-1.54.3 → wbportfolio-1.54.5}/wbportfolio/viewsets/transactions/trades.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: wbportfolio
3
- Version: 1.54.3
3
+ Version: 1.54.5
4
4
  Author-email: Christopher Wittlinger <c.wittlinger@stainly.com>
5
5
  License-File: LICENSE
6
6
  Requires-Dist: cryptography==3.4.*
@@ -195,6 +195,8 @@ class TradeImportHandler(ImportExportHandler):
195
195
  modified_objs: list[models.Model],
196
196
  unmodified_objs: list[models.Model],
197
197
  ):
198
+ from wbportfolio.models.transactions.trade_proposals import replay_as_task
199
+
198
200
  for instrument in set(
199
201
  map(lambda x: x.underlying_instrument, filter(lambda t: t.is_customer_trade, created_objs + modified_objs))
200
202
  ):
@@ -203,9 +205,7 @@ class TradeImportHandler(ImportExportHandler):
203
205
 
204
206
  # if the trade import relates to a trade proposal, we reset the TP after the import to ensure it contains the deleted positions (often forgotten by user)
205
207
  for changed_trade_proposal in self.trade_proposals:
206
- changed_trade_proposal.reset_trades(
207
- target_portfolio=changed_trade_proposal._build_dto().convert_to_portfolio()
208
- )
208
+ replay_as_task.delay(changed_trade_proposal.id)
209
209
 
210
210
  def _post_processing_updated_object(self, _object):
211
211
  if _object.marked_for_deletion:
@@ -0,0 +1,19 @@
1
+ # Generated by Django 5.0.14 on 2025-07-10 09:00
2
+
3
+ from decimal import Decimal
4
+ from django.db import migrations, models
5
+
6
+
7
+ class Migration(migrations.Migration):
8
+
9
+ dependencies = [
10
+ ('wbportfolio', '0079_alter_trade_drift_factor'),
11
+ ]
12
+
13
+ operations = [
14
+ migrations.AlterField(
15
+ model_name='assetposition',
16
+ name='weighting',
17
+ field=models.DecimalField(decimal_places=8, default=Decimal('0'), help_text='The Weight of the Asset on the price date of the Asset.', max_digits=9, verbose_name='Weight'),
18
+ ),
19
+ ]
@@ -112,19 +112,20 @@ class AssetPositionIterator:
112
112
  return fx_rate
113
113
 
114
114
  def _get_price(self, val_date: date, instrument: Instrument) -> float | None:
115
- try:
116
- return self._prices[val_date][instrument.id]
117
- except KeyError:
118
- return None
115
+ with suppress(KeyError):
116
+ if (_p := self._prices[val_date][instrument.id]) is not None:
117
+ return _p
118
+ return None
119
119
 
120
- def _dict_to_model(self, val_date: date, instrument_id: int, weighting: float) -> "AssetPosition":
120
+ def _dict_to_model(self, val_date: date, instrument_id: int, weighting: float, **kwargs) -> "AssetPosition":
121
121
  underlying_quote = self._get_instrument(instrument_id)
122
122
  currency_fx_rate_portfolio_to_usd = self._get_fx_rate(val_date, self.portfolio.currency)
123
123
  currency_fx_rate_instrument_to_usd = self._get_fx_rate(val_date, underlying_quote.currency)
124
124
  price = self._get_price(val_date, underlying_quote)
125
- position = AssetPosition(
125
+
126
+ parameters = dict(
126
127
  underlying_quote=underlying_quote,
127
- weighting=weighting,
128
+ weighting=round(weighting, 8),
128
129
  date=val_date,
129
130
  asset_valuation_date=val_date,
130
131
  is_estimated=True,
@@ -137,15 +138,14 @@ class AssetPositionIterator:
137
138
  underlying_quote_price=None,
138
139
  underlying_instrument=None,
139
140
  )
141
+ parameters.update(kwargs)
142
+ position = AssetPosition(**parameters)
140
143
  position.pre_save(
141
144
  infer_underlying_quote_price=self.infer_underlying_quote_price
142
145
  ) # inferring underlying quote price is potentially very slow for big dataset of positions, it's not very needed for model portfolio so we disable it
143
146
  return position
144
147
 
145
- def add(
146
- self,
147
- positions: list["AssetPosition"] | tuple[date, dict[int, float]],
148
- ):
148
+ def add(self, positions: list["AssetPosition"] | tuple[date, dict[int, float]], **kwargs):
149
149
  """
150
150
  Add multiple positions efficiently with batch processing
151
151
 
@@ -157,7 +157,7 @@ class AssetPositionIterator:
157
157
  positions = [(val_date, i, w) for i, w in positions[1].items()] # unflatten data to make it iterable
158
158
  for position in positions:
159
159
  if not isinstance(position, AssetPosition):
160
- position = self._dict_to_model(*position)
160
+ position = self._dict_to_model(*position, **kwargs)
161
161
 
162
162
  # Generate unique composite key
163
163
  key = (
@@ -168,7 +168,8 @@ class AssetPositionIterator:
168
168
  # Merge duplicate positions
169
169
  if existing_position := self.positions.get(key):
170
170
  position.weighting += existing_position.weighting
171
- position.initial_shares += existing_position.initial_shares
171
+ if existing_position.initial_shares:
172
+ position.initial_shares += existing_position.initial_shares
172
173
  # ensure the position portfolio is the iterator portfolio (could be different when computing look-through for instance)
173
174
  position.portfolio = self.portfolio
174
175
  if position.initial_price is not None and position.initial_currency_fx_rate is not None:
@@ -464,8 +465,8 @@ class AssetPosition(ImportMixin, models.Model):
464
465
  # )
465
466
 
466
467
  weighting = models.DecimalField(
467
- decimal_places=6,
468
- max_digits=7,
468
+ decimal_places=8,
469
+ max_digits=9,
469
470
  default=Decimal(0),
470
471
  verbose_name="Weight",
471
472
  help_text="The Weight of the Asset on the price date of the Asset.",
@@ -693,15 +694,15 @@ class AssetPosition(ImportMixin, models.Model):
693
694
  def get_portfolio_total_asset_value(self) -> Decimal:
694
695
  return self.portfolio.get_total_asset_value(self.date)
695
696
 
696
- def _build_dto(self, new_weight: Decimal = None, **kwargs) -> PositionDTO:
697
+ def _build_dto(self, **kwargs) -> PositionDTO:
697
698
  """
698
699
  Data Transfer Object
699
700
  Returns:
700
701
  DTO position object
701
702
  """
702
- return PositionDTO(
703
+ parameters = dict(
703
704
  underlying_instrument=self.underlying_quote.id,
704
- weighting=self.weighting if new_weight is None else new_weight,
705
+ weighting=self.weighting,
705
706
  shares=self._shares,
706
707
  date=self.date,
707
708
  asset_valuation_date=self.asset_valuation_date,
@@ -726,8 +727,9 @@ class AssetPosition(ImportMixin, models.Model):
726
727
  price=self._price,
727
728
  currency_fx_rate=self._currency_fx_rate,
728
729
  portfolio_created=self.portfolio_created.id if self.portfolio_created else None,
729
- **kwargs,
730
730
  )
731
+ parameters.update(kwargs)
732
+ return PositionDTO(**parameters)
731
733
 
732
734
  @cached_property
733
735
  @admin.display(description="Adjusting Factor (adjustment)")
@@ -18,7 +18,6 @@ from django.db.models import (
18
18
  Q,
19
19
  QuerySet,
20
20
  Sum,
21
- Value,
22
21
  )
23
22
  from django.db.models.signals import post_save
24
23
  from django.dispatch import receiver
@@ -26,12 +25,13 @@ from django.utils import timezone
26
25
  from django.utils.functional import cached_property
27
26
  from pandas._libs.tslibs.offsets import BDay
28
27
  from skfolio.preprocessing import prices_to_returns
29
- from wbcore.contrib.currency.models import Currency, CurrencyFXRates
28
+ from wbcore.contrib.currency.models import Currency
30
29
  from wbcore.contrib.notifications.utils import create_notification_type
31
30
  from wbcore.models import WBModel
32
31
  from wbcore.utils.importlib import import_from_dotted_path
33
32
  from wbcore.utils.models import ActiveObjectManager, DeleteToDisableMixin
34
33
  from wbfdm.contrib.metric.tasks import compute_metrics_as_task
34
+ from wbfdm.enums import MarketData
35
35
  from wbfdm.models import Instrument, InstrumentType
36
36
  from wbfdm.models.instruments.instrument_prices import InstrumentPrice
37
37
  from wbfdm.signals import investable_universe_updated
@@ -45,6 +45,7 @@ from wbportfolio.models.portfolio_relationship import (
45
45
  from wbportfolio.models.products import Product
46
46
  from wbportfolio.pms.analytics.portfolio import Portfolio as AnalyticPortfolio
47
47
  from wbportfolio.pms.typing import Portfolio as PortfolioDTO
48
+ from wbportfolio.pms.typing import Position as PositionDTO
48
49
 
49
50
  from . import ProductGroup
50
51
  from .exceptions import InvalidAnalyticPortfolio
@@ -54,34 +55,13 @@ if TYPE_CHECKING:
54
55
  from wbportfolio.models.transactions.trade_proposals import TradeProposal
55
56
 
56
57
 
57
- def get_prices(instrument_ids: list[int], from_date: date, to_date: date) -> dict[date, dict[int, float]]:
58
- """
59
- Utility to fetch raw prices
60
- """
61
- prices = InstrumentPrice.objects.filter(instrument__in=instrument_ids, date__gte=from_date, date__lte=to_date)
62
- df = (
63
- pd.DataFrame(
64
- prices.filter_only_valid_prices().values_list("instrument", "net_value", "date"),
65
- columns=["instrument", "net_value", "date"],
66
- )
67
- .pivot_table(index="date", values="net_value", columns="instrument")
68
- .astype(float)
69
- .sort_index()
70
- )
71
- ts = pd.bdate_range(df.index.min(), df.index.max(), freq="B")
72
- df = df.reindex(ts)
73
- df = df.ffill()
74
- df.index = pd.to_datetime(df.index)
75
- return {ts.date(): row for ts, row in df.to_dict("index").items()}
76
-
77
-
78
58
  def get_returns(
79
59
  instrument_ids: list[int],
80
60
  from_date: date,
81
61
  to_date: date,
82
62
  to_currency: Currency | None = None,
83
63
  ffill_returns: bool = True,
84
- ) -> pd.DataFrame:
64
+ ) -> tuple[dict[date, dict[int, float]], pd.DataFrame]:
85
65
  """
86
66
  Utility methods to get instrument returns for a given date range
87
67
 
@@ -92,31 +72,40 @@ def get_returns(
92
72
  Returns:
93
73
  Return a tuple of the returns and the last prices series for conveniance
94
74
  """
75
+ # if to_currency:
76
+ # fx_rate = CurrencyFXRates.get_fx_rates_subquery_for_two_currencies("date", "instrument__currency", to_currency)
77
+ # else:
78
+ # fx_rate = Value(Decimal(1.0))
79
+ # prices = InstrumentPrice.objects.filter(
80
+ # instrument__in=instrument_ids, date__gte=from_date, date__lte=to_date
81
+ # ).annotate(fx_rate=fx_rate, price_fx_portfolio=F("net_value") * F("fx_rate"))
82
+ # prices_df = (
83
+ # pd.DataFrame(
84
+ # prices.filter_only_valid_prices().values_list("instrument", "price_fx_portfolio", "date"),
85
+ # columns=["instrument", "price_fx_portfolio", "date"],
86
+ # )
87
+ # .pivot_table(index="date", values="price_fx_portfolio", columns="instrument")
88
+ # .astype(float)
89
+ # .sort_index()
90
+ # )
91
+ kwargs = dict(from_date=from_date, to_date=to_date, values=[MarketData.CLOSE])
95
92
  if to_currency:
96
- fx_rate = CurrencyFXRates.get_fx_rates_subquery_for_two_currencies("date", "instrument__currency", to_currency)
97
- else:
98
- fx_rate = Value(Decimal(1.0))
99
- prices = InstrumentPrice.objects.filter(
100
- instrument__in=instrument_ids, date__gte=from_date, date__lte=to_date
101
- ).annotate(fx_rate=fx_rate, price_fx_portfolio=F("net_value") * F("fx_rate"))
102
- prices_df = (
103
- pd.DataFrame(
104
- prices.filter_only_valid_prices().values_list("instrument", "price_fx_portfolio", "date"),
105
- columns=["instrument", "price_fx_portfolio", "date"],
106
- )
107
- .pivot_table(index="date", values="price_fx_portfolio", columns="instrument")
108
- .astype(float)
109
- .sort_index()
110
- )
93
+ kwargs["target_currency"] = to_currency.key
94
+ prices_df = pd.DataFrame(Instrument.objects.filter(id__in=instrument_ids).dl.market_data(**kwargs))
111
95
  if prices_df.empty:
112
96
  raise InvalidAnalyticPortfolio()
97
+ prices_df = prices_df[["instrument_id", "close", "valuation_date"]].pivot(
98
+ index="valuation_date", columns="instrument_id", values="close"
99
+ )
113
100
  ts = pd.bdate_range(prices_df.index.min(), prices_df.index.max(), freq="B")
114
101
  prices_df = prices_df.reindex(ts)
115
102
  if ffill_returns:
116
103
  prices_df = prices_df.ffill()
117
104
  prices_df.index = pd.to_datetime(prices_df.index)
118
105
  returns = prices_to_returns(prices_df, drop_inceptions_nan=False, fill_nan=ffill_returns)
119
- return returns.replace([np.inf, -np.inf, np.nan], 0)
106
+ return {ts.date(): row for ts, row in prices_df.replace(np.nan, None).to_dict("index").items()}, returns.replace(
107
+ [np.inf, -np.inf, np.nan], 0
108
+ )
120
109
 
121
110
 
122
111
  class DefaultPortfolioQueryset(QuerySet):
@@ -353,26 +342,23 @@ class Portfolio(DeleteToDisableMixin, WBModel):
353
342
  instrument.delisted_date = date.today() - timedelta(days=1)
354
343
  instrument.save()
355
344
 
356
- def _build_dto(self, val_date: date, **extra_kwargs) -> PortfolioDTO:
345
+ def _build_dto(self, val_date: date, include_drift_factor: bool = False, **extra_kwargs) -> PortfolioDTO:
357
346
  "returns the dto representation of this portfolio at the specified date"
358
347
  assets = self.assets.filter(date=val_date, **extra_kwargs)
359
348
  try:
360
349
  drifted_weights = self.get_analytic_portfolio(val_date).get_next_weights()
361
350
  except InvalidAnalyticPortfolio:
362
351
  drifted_weights = {}
363
- return PortfolioDTO(
364
- tuple(
365
- [
366
- pos._build_dto(
367
- drift_factor=drifted_weights.get(pos.underlying_quote.id, float(pos.weighting))
368
- / float(pos.weighting)
369
- if pos.weighting
370
- else Decimal(1.0)
371
- )
372
- for pos in assets
373
- ]
374
- ),
375
- )
352
+ positions = []
353
+ for asset in assets:
354
+ drift_factor = (
355
+ Decimal(drifted_weights.get(asset.underlying_quote.id, asset.weighting)) / asset.weighting
356
+ if asset.weighting
357
+ else Decimal(1.0)
358
+ )
359
+ positions.append(asset._build_dto(drift_factor=drift_factor))
360
+
361
+ return PortfolioDTO(positions)
376
362
 
377
363
  def get_weights(self, val_date: date) -> dict[int, float]:
378
364
  """
@@ -410,7 +396,7 @@ class Portfolio(DeleteToDisableMixin, WBModel):
410
396
  if not weights:
411
397
  weights = self.get_weights(val_date)
412
398
  return_date = (val_date + BDay(1)).date()
413
- returns = get_returns(
399
+ _, returns = get_returns(
414
400
  list(weights.keys()), (val_date - BDay(2)).date(), return_date, to_currency=self.currency, **kwargs
415
401
  )
416
402
  if pd.Timestamp(return_date) not in returns.index:
@@ -705,6 +691,10 @@ class Portfolio(DeleteToDisableMixin, WBModel):
705
691
  if portfolio := asset.underlying_instrument.portfolio:
706
692
  yield portfolio, asset.weighting
707
693
 
694
+ def get_next_rebalancing_date(self, start_date: date) -> date | None:
695
+ if automatic_rebalancer := getattr(self, "automatic_rebalancer", None):
696
+ return automatic_rebalancer.get_next_rebalancing_date(start_date)
697
+
708
698
  def change_at_date(
709
699
  self,
710
700
  val_date: date,
@@ -756,17 +746,20 @@ class Portfolio(DeleteToDisableMixin, WBModel):
756
746
  self.handle_controlling_portfolio_change_at_date(val_date)
757
747
 
758
748
  def handle_controlling_portfolio_change_at_date(self, val_date: date):
759
- for rel in PortfolioPortfolioThroughModel.objects.filter(
760
- dependency_portfolio=self, type=PortfolioPortfolioThroughModel.Type.PRIMARY, portfolio__is_lookthrough=True
761
- ):
762
- rel.portfolio.compute_lookthrough(val_date)
763
- for rel in PortfolioPortfolioThroughModel.objects.filter(
764
- dependency_portfolio=self, type=PortfolioPortfolioThroughModel.Type.MODEL
765
- ):
766
- rel.portfolio.evaluate_rebalancing(val_date)
767
- for dependent_portfolio in self.get_child_portfolios(val_date):
768
- dependent_portfolio.change_at_date(val_date)
769
- dependent_portfolio.handle_controlling_portfolio_change_at_date(val_date)
749
+ if self.is_tracked:
750
+ for rel in PortfolioPortfolioThroughModel.objects.filter(
751
+ dependency_portfolio=self,
752
+ type=PortfolioPortfolioThroughModel.Type.PRIMARY,
753
+ portfolio__is_lookthrough=True,
754
+ ):
755
+ rel.portfolio.compute_lookthrough(val_date)
756
+ for rel in PortfolioPortfolioThroughModel.objects.filter(
757
+ dependency_portfolio=self, type=PortfolioPortfolioThroughModel.Type.MODEL
758
+ ):
759
+ rel.portfolio.evaluate_rebalancing(val_date)
760
+ for dependent_portfolio in self.get_child_portfolios(val_date):
761
+ dependent_portfolio.change_at_date(val_date)
762
+ dependent_portfolio.handle_controlling_portfolio_change_at_date(val_date)
770
763
 
771
764
  def evaluate_rebalancing(self, val_date: date):
772
765
  if hasattr(self, "automatic_rebalancer"):
@@ -802,7 +795,9 @@ class Portfolio(DeleteToDisableMixin, WBModel):
802
795
  ): # if price date is the latest instrument price date, we recompute the last valuation data
803
796
  instrument.update_last_valuation_date()
804
797
 
805
- def drift_weights(self, start_date: date, end_date: date) -> tuple[AssetPositionIterator, "TradeProposal"]:
798
+ def drift_weights(
799
+ self, start_date: date, end_date: date, stop_at_rebalancing: bool = False
800
+ ) -> tuple[AssetPositionIterator, "TradeProposal"]:
806
801
  logger.info(f"drift weights for {self} from {start_date:%Y-%m-%d} to {end_date:%Y-%m-%d}")
807
802
  rebalancer = getattr(self, "automatic_rebalancer", None)
808
803
  # Get initial weights
@@ -814,7 +809,8 @@ class Portfolio(DeleteToDisableMixin, WBModel):
814
809
 
815
810
  # Get returns and prices data for the whole date range
816
811
  instrument_ids = list(weights.keys())
817
- returns = get_returns(
812
+
813
+ prices, returns = get_returns(
818
814
  instrument_ids,
819
815
  (start_date - BDay(3)).date(),
820
816
  end_date,
@@ -822,7 +818,6 @@ class Portfolio(DeleteToDisableMixin, WBModel):
822
818
  ffill_returns=True,
823
819
  )
824
820
  # Get raw prices to speed up asset position creation
825
- prices = get_prices(instrument_ids, (start_date - BDay(3)).date(), end_date)
826
821
  # Instantiate the position iterator with the initial weights
827
822
  positions = AssetPositionIterator(self, prices=prices)
828
823
  last_trade_proposal = None
@@ -830,30 +825,43 @@ class Portfolio(DeleteToDisableMixin, WBModel):
830
825
  to_date = to_date_ts.date()
831
826
  to_is_active = self.is_active_at_date(to_date)
832
827
  logger.info(f"Processing {to_date:%Y-%m-%d}")
828
+
829
+ try:
830
+ last_returns = returns.loc[[to_date_ts], :]
831
+ analytic_portfolio = AnalyticPortfolio(weights=weights, X=last_returns)
832
+ drifted_weights = analytic_portfolio.get_next_weights()
833
+ except KeyError: # if no return for that date, we break and continue
834
+ drifted_weights = weights
835
+
833
836
  if rebalancer and rebalancer.is_valid(to_date):
834
- last_trade_proposal = rebalancer.evaluate_rebalancing(to_date)
835
- # if trade proposal/rebalancing is not approved, we cannot continue the drift
836
- if last_trade_proposal.status != last_trade_proposal.Status.APPROVED:
837
+ effective_portfolio = PortfolioDTO(
838
+ positions=[
839
+ PositionDTO(
840
+ date=to_date,
841
+ underlying_instrument=i,
842
+ weighting=Decimal(w),
843
+ drift_factor=Decimal(drifted_weights.get(i, w) / float(w)) if w else Decimal(1.0),
844
+ )
845
+ for i, w in weights.items()
846
+ ]
847
+ )
848
+ last_trade_proposal = rebalancer.evaluate_rebalancing(to_date, effective_portfolio=effective_portfolio)
849
+ if stop_at_rebalancing:
837
850
  break
838
- target_portfolio = last_trade_proposal._build_dto().convert_to_portfolio()
839
851
  next_weights = {
840
- underlying_quote_id: float(pos.weighting)
841
- for underlying_quote_id, pos in target_portfolio.positions_map.items()
852
+ trade.underlying_instrument: float(trade._target_weight)
853
+ for trade in last_trade_proposal.trades.all().annotate_base_info()
842
854
  }
855
+ positions.add((to_date, next_weights), is_estimated=False)
843
856
  else:
844
- try:
845
- last_returns = returns.loc[[to_date_ts], :]
846
- analytic_portfolio = AnalyticPortfolio(weights=weights, X=last_returns)
847
- next_weights = analytic_portfolio.get_next_weights()
848
- except KeyError: # if no return for that date, we break and continue
849
- next_weights = weights
850
- if to_is_active:
851
- positions.add((to_date, next_weights))
852
- else:
853
- positions.add(
854
- (to_date, {underlying_quote_id: 0.0 for underlying_quote_id in weights.keys()})
855
- ) # if we have no return or portfolio is not active anymore, we return an emptied portfolio
856
- break
857
+ next_weights = drifted_weights
858
+ if to_is_active:
859
+ positions.add((to_date, next_weights))
860
+ else:
861
+ positions.add(
862
+ (to_date, {underlying_quote_id: 0.0 for underlying_quote_id in weights.keys()})
863
+ ) # if we have no return or portfolio is not active anymore, we return an emptied portfolio
864
+ break
857
865
  weights = next_weights
858
866
  return positions, last_trade_proposal
859
867
 
@@ -1023,6 +1031,7 @@ class Portfolio(DeleteToDisableMixin, WBModel):
1023
1031
  delete_leftovers: bool = False,
1024
1032
  force_save: bool = False,
1025
1033
  compute_metrics: bool = True,
1034
+ broadcast_changes_at_date: bool = True,
1026
1035
  **kwargs,
1027
1036
  ):
1028
1037
  if positions:
@@ -1071,8 +1080,9 @@ class Portfolio(DeleteToDisableMixin, WBModel):
1071
1080
  basket_id=self.id,
1072
1081
  basket_content_type_id=ContentType.objects.get_for_model(Portfolio).id,
1073
1082
  )
1074
- for update_date, changed_weights in positions.get_weights().items():
1075
- self.change_at_date(update_date, changed_weights=changed_weights, **kwargs)
1083
+ if broadcast_changes_at_date:
1084
+ for update_date, changed_weights in positions.get_weights().items():
1085
+ self.change_at_date(update_date, changed_weights=changed_weights, **kwargs)
1076
1086
 
1077
1087
  @classmethod
1078
1088
  def _get_or_create_portfolio(cls, instrument_handler, portfolio_data):
@@ -43,9 +43,16 @@ class RebalancingModel(models.Model):
43
43
  return import_from_dotted_path(self.class_path)
44
44
 
45
45
  def get_target_portfolio(
46
- self, portfolio: Portfolio, trade_date: date, last_effective_date: date, **kwargs
46
+ self,
47
+ portfolio: Portfolio,
48
+ trade_date: date,
49
+ last_effective_date: date,
50
+ effective_portfolio: PortfolioDTO | None = None,
51
+ **kwargs,
47
52
  ) -> PortfolioDTO:
48
- model = self.model_class(portfolio, trade_date, last_effective_date, **kwargs)
53
+ model = self.model_class(
54
+ portfolio, trade_date, last_effective_date, effective_portfolio=effective_portfolio, **kwargs
55
+ )
49
56
  if not model.is_valid():
50
57
  raise ValidationError(model.validation_errors)
51
58
  return model.get_target_portfolio()
@@ -115,7 +122,7 @@ class Rebalancer(ComplexToStringMixin, models.Model):
115
122
  break
116
123
  return False
117
124
 
118
- def evaluate_rebalancing(self, trade_date: date):
125
+ def evaluate_rebalancing(self, trade_date: date, effective_portfolio=None):
119
126
  trade_proposal, _ = TradeProposal.objects.get_or_create(
120
127
  trade_date=trade_date,
121
128
  portfolio=self.portfolio,
@@ -126,24 +133,27 @@ class Rebalancer(ComplexToStringMixin, models.Model):
126
133
  )
127
134
 
128
135
  if trade_proposal.rebalancing_model == self.rebalancing_model:
129
- trade_proposal.status = TradeProposal.Status.DRAFT
130
136
  try:
131
137
  logger.info(
132
138
  f"Getting target portfolio ({self.portfolio}) for rebalancing model {self.rebalancing_model} for trade date {trade_date:%Y-%m-%d}"
133
139
  )
134
140
  target_portfolio = self.rebalancing_model.get_target_portfolio(
135
- self.portfolio, trade_date, trade_proposal.last_effective_date, **self.parameters
141
+ self.portfolio,
142
+ trade_proposal.trade_date,
143
+ trade_proposal.value_date,
144
+ effective_portfolio=effective_portfolio,
145
+ **self.parameters,
146
+ )
147
+ trade_proposal.approve_workflow(
148
+ approve_automatically=self.approve_trade_proposal_automatically,
149
+ target_portfolio=target_portfolio,
150
+ effective_portfolio=effective_portfolio,
136
151
  )
137
- trade_proposal.reset_trades(target_portfolio)
138
- trade_proposal.submit()
139
- if self.approve_trade_proposal_automatically and self.portfolio.can_be_rebalanced:
140
- trade_proposal.approve(replay=False)
141
- except ValidationError:
152
+ except ValidationError as e:
153
+ logger.warning(f"Validation error while approving the orders: {e}")
142
154
  # If we encountered a validation error, we set the trade proposal as failed
143
155
  trade_proposal.status = TradeProposal.Status.FAILED
144
-
145
156
  trade_proposal.save()
146
-
147
157
  return trade_proposal
148
158
 
149
159
  @property