wbportfolio 1.49.5__tar.gz → 1.49.7__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.
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/PKG-INFO +1 -1
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/filters/__init__.py +1 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/filters/assets.py +4 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/filters/positions.py +19 -12
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/models/asset.py +23 -3
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/models/portfolio.py +44 -68
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/models/transactions/rebalancing.py +9 -5
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/models/transactions/trade_proposals.py +112 -52
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/models/transactions/trades.py +38 -15
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/rebalancing/models/composite.py +6 -2
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/rebalancing/models/equally_weighted.py +12 -1
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/rebalancing/models/model_portfolio.py +11 -5
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/tests/models/transactions/test_rebalancing.py +6 -2
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/tests/models/transactions/test_trade_proposals.py +25 -8
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/tests/rebalancing/test_models.py +18 -12
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/assets.py +40 -7
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/display/portfolios.py +1 -3
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/positions.py +7 -8
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/transactions/trades.py +9 -7
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/.gitignore +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/LICENSE +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/pyproject.toml +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/__init__.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/admin/__init__.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/admin/asset.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/admin/custodians.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/admin/indexes.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/admin/portfolio.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/admin/portfolio_relationships.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/admin/product_groups.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/admin/products.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/admin/reconciliations.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/admin/registers.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/admin/roles.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/admin/transactions/__init__.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/admin/transactions/claim.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/admin/transactions/dividends.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/admin/transactions/fees.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/admin/transactions/rebalancing.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/admin/transactions/trades.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/admin/transactions/transactions.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/analysis/__init__.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/analysis/claims.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/apps.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/contrib/__init__.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/contrib/company_portfolio/__init__.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/contrib/company_portfolio/admin.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/contrib/company_portfolio/apps.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/contrib/company_portfolio/configs/__init__.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/contrib/company_portfolio/configs/display.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/contrib/company_portfolio/configs/endpoints.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/contrib/company_portfolio/configs/previews.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/contrib/company_portfolio/constants.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/contrib/company_portfolio/dynamic_preferences_registry.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/contrib/company_portfolio/factories.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/contrib/company_portfolio/filters.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/contrib/company_portfolio/management.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/contrib/company_portfolio/migrations/0001_initial.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/contrib/company_portfolio/migrations/__init__.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/contrib/company_portfolio/models.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/contrib/company_portfolio/scripts.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/contrib/company_portfolio/serializers.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/contrib/company_portfolio/tasks.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/contrib/company_portfolio/tests/__init__.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/contrib/company_portfolio/tests/conftest.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/contrib/company_portfolio/tests/test_models.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/contrib/company_portfolio/urls.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/contrib/company_portfolio/viewsets.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/defaults/__init__.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/defaults/fees/__init__.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/defaults/fees/default.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/dynamic_preferences_registry.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/factories/__init__.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/factories/adjustments.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/factories/assets.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/factories/claim.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/factories/custodians.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/factories/dividends.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/factories/fees.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/factories/indexes.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/factories/portfolio_cash_flow.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/factories/portfolio_cash_targets.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/factories/portfolio_swing_pricings.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/factories/portfolios.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/factories/product_groups.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/factories/products.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/factories/rebalancing.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/factories/reconciliations.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/factories/roles.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/factories/trades.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/factories/transactions.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/fdm/__init__.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/fdm/tasks.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/filters/assets_and_net_new_money_progression.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/filters/custodians.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/filters/esg.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/filters/performances.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/filters/portfolios.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/filters/products.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/filters/roles.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/filters/signals.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/filters/transactions/__init__.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/filters/transactions/claim.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/filters/transactions/fees.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/filters/transactions/mixins.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/filters/transactions/trades.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/filters/transactions/transactions.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/fixtures/product_factsheets.yaml +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/fixtures/wbportfolio.yaml.gz +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/fixtures/wbrisk_management.yaml.gz +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/__init__.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/backends/__init__.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/backends/refinitiv/adjustment.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/backends/ubs/__init__.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/backends/ubs/asset_position.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/backends/ubs/fees.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/backends/ubs/instrument_price.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/backends/ubs/mixin.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/backends/utils.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/backends/wbfdm/__init__.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/backends/wbfdm/adjustment.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/backends/wbfdm/dividend.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/backends/wbfdm/mixin.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/handlers/__init__.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/handlers/adjustment.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/handlers/asset_position.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/handlers/dividend.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/handlers/fees.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/handlers/portfolio_cash_flow.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/handlers/register.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/handlers/trade.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/__init__.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/default_mapping.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/jpmorgan/__init__.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/jpmorgan/customer_trade.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/jpmorgan/fees.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/jpmorgan/strategy.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/jpmorgan/valuation.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/leonteq/__init__.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/leonteq/customer_trade.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/leonteq/equity.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/leonteq/fees.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/leonteq/trade.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/leonteq/valuation.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/natixis/__init__.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/natixis/customer_trade.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/natixis/d1_customer_trade.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/natixis/d1_equity.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/natixis/d1_fees.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/natixis/d1_trade.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/natixis/d1_valuation.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/natixis/dividend.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/natixis/equity.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/natixis/fees.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/natixis/trade.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/natixis/utils.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/natixis/valuation.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/refinitiv/__init__.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/refinitiv/adjustment.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/sg_lux/__init__.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/sg_lux/custodian_positions.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/sg_lux/customer_trade.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/sg_lux/customer_trade_pending_slk.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/sg_lux/customer_trade_slk.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/sg_lux/customer_trade_without_pw.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/sg_lux/equity.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/sg_lux/fees.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/sg_lux/perf_fees.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/sg_lux/portfolio_cash_flow.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/sg_lux/portfolio_future_cash_flow.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/sg_lux/registers.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/sg_lux/sylk.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/sg_lux/utils.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/sg_lux/valuation.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/societe_generale/__init__.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/societe_generale/customer_trade.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/societe_generale/strategy.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/societe_generale/valuation.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/tellco/__init__.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/tellco/customer_trade.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/tellco/equity.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/tellco/valuation.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/ubs/__init__.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/ubs/api/__init__.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/ubs/api/asset_position.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/ubs/api/fees.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/ubs/api/instrument_price.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/ubs/api/utils.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/ubs/customer_trade.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/ubs/equity.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/ubs/historical_customer_trade.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/ubs/valuation.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/vontobel/__init__.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/vontobel/asset_position.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/vontobel/customer_trade.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/vontobel/historical_customer_trade.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/vontobel/instrument.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/vontobel/management_fees.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/vontobel/performance_fees.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/vontobel/trade.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/vontobel/utils.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/vontobel/valuation.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/vontobel/valuation_api.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/resources/__init__.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/resources/assets.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/resources/trades.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/utils.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/jinja2/wbportfolio/sql/aum_nnm.sql +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/kpi_handlers/nnm.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/metric/__init__.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/metric/backends/__init__.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/metric/backends/base.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/metric/backends/constants.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/metric/backends/portfolio_base.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/metric/backends/portfolio_esg.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/metric/tests/__init__.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/metric/tests/conftest.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/metric/tests/test_portfolio_base.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/metric/tests/test_portfolio_esg.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/migrations/0001_initial_squashed.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/migrations/0002_product_default_sub_account_squashed_0039_alter_assetallocation_company_and_more.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/migrations/0040_instrument_financial_instrument.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/migrations/0041_remove_listresearch_research_ptr_and_more.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/migrations/0042_instrumentlist_instrumentlistthroughmodel_and_more.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/migrations/0043_alter_instrumentlistthroughmodel_options_and_more.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/migrations/0044_alter_instrumentlist_identifier.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/migrations/0045_alter_instrument_financial_instrument.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/migrations/0046_add_product_default_account.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/migrations/0047_remove_product_default_sub_account.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/migrations/0048_alter_trade_status.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/migrations/0049_trade_claimed_shares.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/migrations/0050_fees_fee_date_fees_wbportfolio_transac_1f7a29_idx.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/migrations/0051_delete_macroreview.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/migrations/0052_remove_cash_instrument_ptr_and_more.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/migrations/0053_remove_product_group.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/migrations/0054_portfolioinstrumentpreferredclassificationthroughmodel_and_more.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/migrations/0055_remove_product__custom_management_rebates_and_more.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/migrations/0056_remove_companyportfoliodata_assets_under_management_currency_and_more.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/migrations/0057_alter_portfolio_preferred_instrument_classifications_and_more.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/migrations/0058_pmsinstrument.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/migrations/0059_fees_unique_fees.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/migrations/0060_alter_portfolioportfoliothroughmodel_type.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/migrations/0061_portfolio_bank_accounts_product_bank_account_and_more.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/migrations/0062_alter_dailyportfoliocashflow_options.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/migrations/0063_accountreconciliation_accountreconciliationline_and_more.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/migrations/0064_alter_portfolio_managers_portfolio_is_tracked_and_more.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/migrations/0065_alter_portfolio_managers_claim_as_shares_and_more.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/migrations/0066_assetposition_initial_shares_at_custodian_and_more.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/migrations/0067_assetposition_unique_asset_position.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/migrations/0068_trade_internal_trade_trade_marked_as_internal_and_more.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/migrations/0069_remove_portfolio_is_invested_and_more.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/migrations/0070_remove_assetposition_unique_asset_position_and_more.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/migrations/0071_alter_trade_options_alter_trade_order.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/migrations/0072_trade_diff_shares.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/migrations/0073_remove_product_price_computation_and_more.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/migrations/0074_alter_rebalancer_frequency_and_more.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/migrations/0075_portfolio_initial_position_date_and_more.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/migrations/0076_alter_dividendtransaction_price_and_more.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/migrations/__init__.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/models/__init__.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/models/adjustments.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/models/custodians.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/models/exceptions.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/models/graphs/__init__.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/models/graphs/portfolio.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/models/graphs/utils.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/models/indexes.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/models/llm/wbcrm/analyze_relationship.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/models/mixins/__init__.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/models/mixins/instruments.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/models/mixins/liquidity_stress_test.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/models/portfolio_cash_flow.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/models/portfolio_cash_targets.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/models/portfolio_relationship.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/models/portfolio_swing_pricings.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/models/product_groups.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/models/products.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/models/reconciliations/__init__.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/models/reconciliations/account_reconciliation_lines.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/models/reconciliations/account_reconciliations.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/models/reconciliations/reconciliations.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/models/registers.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/models/roles.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/models/transactions/__init__.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/models/transactions/claim.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/models/transactions/dividends.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/models/transactions/expiry.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/models/transactions/fees.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/models/transactions/transactions.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/models/utils.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/permissions.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/pms/__init__.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/pms/analytics/__init__.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/pms/analytics/portfolio.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/pms/statistics/__init__.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/pms/trading/__init__.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/pms/trading/handler.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/pms/typing.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/preferences.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/rebalancing/__init__.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/rebalancing/base.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/rebalancing/decorators.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/rebalancing/models/__init__.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/rebalancing/models/market_capitalization_weighted.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/reports/__init__.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/reports/monthly_position_report.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/risk_management/__init__.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/risk_management/backends/__init__.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/risk_management/backends/accounts.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/risk_management/backends/controversy_portfolio.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/risk_management/backends/exposure_portfolio.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/risk_management/backends/instrument_list_portfolio.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/risk_management/backends/liquidity_risk.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/risk_management/backends/liquidity_stress_instrument.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/risk_management/backends/mixins.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/risk_management/backends/product_integrity.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/risk_management/backends/stop_loss_instrument.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/risk_management/backends/stop_loss_portfolio.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/risk_management/backends/ucits_portfolio.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/risk_management/tests/__init__.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/risk_management/tests/conftest.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/risk_management/tests/test_accounts.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/risk_management/tests/test_controversy_portfolio.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/risk_management/tests/test_exposure_portfolio.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/risk_management/tests/test_instrument_list_portfolio.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/risk_management/tests/test_liquidity_risk.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/risk_management/tests/test_product_integrity.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/risk_management/tests/test_stop_loss_instrument.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/risk_management/tests/test_stop_loss_portfolio.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/risk_management/tests/test_ucits_portfolio.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/serializers/__init__.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/serializers/adjustments.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/serializers/assets.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/serializers/custodians.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/serializers/portfolio_cash_flow.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/serializers/portfolio_cash_targets.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/serializers/portfolio_relationship.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/serializers/portfolio_swing_pricing.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/serializers/portfolios.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/serializers/positions.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/serializers/product_group.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/serializers/products.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/serializers/rebalancing.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/serializers/reconciliations.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/serializers/registers.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/serializers/roles.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/serializers/signals.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/serializers/transactions/__init__.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/serializers/transactions/claim.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/serializers/transactions/dividends.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/serializers/transactions/expiry.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/serializers/transactions/fees.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/serializers/transactions/trade_proposals.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/serializers/transactions/trades.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/serializers/transactions/transactions.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/static/wbportfolio/css/macro_review.css +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/static/wbportfolio/markdown/documentation/account_holding_reconciliation.md +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/static/wbportfolio/markdown/documentation/aggregate_asset_position_liquidity.md +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/static/wbportfolio/markdown/documentation/company.md +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/static/wbportfolio/markdown/documentation/earnings_instrument.md +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/static/wbportfolio/markdown/documentation/financial_analysis_instrument_ratios.md +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/static/wbportfolio/markdown/documentation/financial_statistics.md +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/static/wbportfolio/markdown/documentation/person.md +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/tasks.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/templates/portfolio/email/customer_report.html +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/templates/portfolio/email/customer_trade_notification.html +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/templates/portfolio/email/email_base_template.html +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/templates/portfolio/email/rebalancing_report.html +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/templates/portfolio/macro/macro_review.html +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/tests/__init__.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/tests/conftest.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/tests/models/__init__.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/tests/models/test_account_reconciliation.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/tests/models/test_assets.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/tests/models/test_custodians.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/tests/models/test_customer_trades.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/tests/models/test_dividends.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/tests/models/test_imports.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/tests/models/test_instrument_mixins.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/tests/models/test_merge.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/tests/models/test_portfolio_cash_flow.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/tests/models/test_portfolio_cash_targets.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/tests/models/test_portfolio_swing_pricings.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/tests/models/test_portfolios.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/tests/models/test_product_groups.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/tests/models/test_products.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/tests/models/test_roles.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/tests/models/test_splits.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/tests/models/transactions/__init__.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/tests/models/transactions/test_claim.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/tests/models/transactions/test_fees.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/tests/models/transactions/test_trades.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/tests/models/utils.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/tests/pms/__init__.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/tests/pms/test_analytics.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/tests/rebalancing/__init__.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/tests/serializers/__init__.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/tests/serializers/test_claims.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/tests/signals.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/tests/tests.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/tests/viewsets/__init__.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/tests/viewsets/test_assets.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/tests/viewsets/test_performances.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/tests/viewsets/test_products.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/tests/viewsets/transactions/__init__.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/tests/viewsets/transactions/test_claims.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/urls.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/utils.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/__init__.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/adjustments.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/assets_and_net_new_money_progression.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/charts/__init__.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/charts/assets.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/__init__.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/buttons/__init__.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/buttons/adjustments.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/buttons/assets.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/buttons/claims.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/buttons/custodians.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/buttons/fees.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/buttons/mixins.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/buttons/portfolios.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/buttons/products.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/buttons/reconciliations.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/buttons/registers.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/buttons/signals.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/buttons/trade_proposals.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/buttons/trades.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/display/__init__.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/display/adjustments.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/display/assets.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/display/claim.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/display/custodians.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/display/esg.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/display/fees.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/display/portfolio_cash_flow.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/display/portfolio_relationship.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/display/positions.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/display/product_groups.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/display/product_performance.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/display/products.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/display/rebalancing.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/display/reconciliations.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/display/registers.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/display/roles.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/display/trade_proposals.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/display/trades.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/display/transactions.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/endpoints/__init__.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/endpoints/adjustments.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/endpoints/assets.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/endpoints/claim.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/endpoints/custodians.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/endpoints/esg.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/endpoints/fees.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/endpoints/portfolio_relationship.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/endpoints/portfolios.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/endpoints/positions.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/endpoints/product_groups.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/endpoints/product_performance.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/endpoints/products.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/endpoints/rebalancing.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/endpoints/reconciliations.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/endpoints/roles.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/endpoints/trade_proposals.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/endpoints/trades.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/endpoints/transactions.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/menu/__init__.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/menu/adjustments.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/menu/assets.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/menu/claim.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/menu/custodians.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/menu/fees.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/menu/instrument_prices.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/menu/portfolio_cash_flow.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/menu/portfolios.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/menu/positions.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/menu/product_groups.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/menu/product_performance.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/menu/products.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/menu/reconciliations.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/menu/registers.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/menu/roles.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/menu/trades.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/menu/transactions.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/previews/__init__.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/previews/portfolios.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/titles/__init__.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/titles/adjustments.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/titles/assets.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/titles/assets_and_net_new_money_progression.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/titles/claim.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/titles/custodians.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/titles/esg.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/titles/fees.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/titles/instrument_prices.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/titles/portfolios.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/titles/positions.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/titles/product_groups.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/titles/product_performance.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/titles/products.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/titles/registers.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/titles/roles.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/titles/trades.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/titles/transactions.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/custodians.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/esg.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/mixins.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/portfolio_cash_flow.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/portfolio_cash_targets.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/portfolio_relationship.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/portfolio_swing_pricing.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/portfolios.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/product_groups.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/product_performance.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/products.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/reconciliations.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/registers.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/roles.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/signals.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/transactions/__init__.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/transactions/claim.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/transactions/fees.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/transactions/mixins.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/transactions/rebalancing.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/transactions/trade_proposals.py +0 -0
- {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/transactions/transactions.py +0 -0
|
@@ -9,6 +9,7 @@ from .assets import ( # ProductAllocationEquityFilter, AssetPositionAPIFilter,
|
|
|
9
9
|
CashPositionPortfolioFilterSet,
|
|
10
10
|
CompositionModelPortfolioPandasFilter,
|
|
11
11
|
ContributionChartFilter,
|
|
12
|
+
CompositionContributionChartFilter,
|
|
12
13
|
DistributionFilter,
|
|
13
14
|
)
|
|
14
15
|
from .custodians import CustodianFilterSet
|
|
@@ -462,6 +462,10 @@ class ContributionChartFilter(wb_filters.FilterSet):
|
|
|
462
462
|
fields = {}
|
|
463
463
|
|
|
464
464
|
|
|
465
|
+
class CompositionContributionChartFilter(ContributionChartFilter):
|
|
466
|
+
show_lookthrough = wb_filters.BooleanFilter(label="Show Lookthrough", default=False, method="fake_filter")
|
|
467
|
+
|
|
468
|
+
|
|
465
469
|
class AssetPositionUnderlyingInstrumentChartFilter(DateFilterMixin, wb_filters.FilterSet):
|
|
466
470
|
portfolio = wb_filters.ModelMultipleChoiceFilter(
|
|
467
471
|
label="Portfolios",
|
|
@@ -3,15 +3,17 @@ import datetime as dt
|
|
|
3
3
|
from django.db.models import TextChoices
|
|
4
4
|
from pandas.tseries.offsets import BDay
|
|
5
5
|
from wbcore import filters as wb_filters
|
|
6
|
-
from wbcore.contrib.currency.models import CurrencyFXRates
|
|
6
|
+
from wbcore.contrib.currency.models import Currency, CurrencyFXRates
|
|
7
|
+
from wbcore.contrib.geography.models import Geography
|
|
7
8
|
from wbcore.pandas.filterset import PandasFilterSetMixin
|
|
8
9
|
from wbcore.utils.date import current_financial_month
|
|
10
|
+
from wbfdm.models import Classification, Instrument
|
|
9
11
|
|
|
10
12
|
from wbportfolio.filters.assets import (
|
|
11
13
|
DateFilterMixin,
|
|
12
14
|
get_latest_end_quarter_date_asset_position,
|
|
13
15
|
)
|
|
14
|
-
from wbportfolio.models import AssetPosition
|
|
16
|
+
from wbportfolio.models import AssetPosition, Portfolio
|
|
15
17
|
|
|
16
18
|
|
|
17
19
|
class GroupbyChoice(TextChoices):
|
|
@@ -33,16 +35,21 @@ class GroupbyChoice(TextChoices):
|
|
|
33
35
|
"PREFERRED_CLASSIFICATION": "classification_id",
|
|
34
36
|
}[name]
|
|
35
37
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
38
|
+
def get_repr(self, ids: list[int]) -> dict[int, str]:
|
|
39
|
+
match self:
|
|
40
|
+
case GroupbyChoice.UNDERLYING_INSTRUMENT:
|
|
41
|
+
return dict(Instrument.objects.filter(id__in=ids).values_list("id", "name_repr"))
|
|
42
|
+
case GroupbyChoice.CURRENCY:
|
|
43
|
+
return dict(Currency.objects.filter(id__in=ids).values_list("id", "key"))
|
|
44
|
+
case GroupbyChoice.COUNTRY:
|
|
45
|
+
return dict(Geography.countries.filter(id__in=ids).values_list("id", "name"))
|
|
46
|
+
case GroupbyChoice.PORTFOLIO:
|
|
47
|
+
return dict(Portfolio.objects.filter(id__in=ids).values_list("id", "name"))
|
|
48
|
+
case GroupbyChoice.PRIMARY_CLASSIFICATION:
|
|
49
|
+
return dict(Classification.objects.filter(id__in=ids).values_list("id", "name"))
|
|
50
|
+
case GroupbyChoice.PREFERRED_CLASSIFICATION:
|
|
51
|
+
return dict(Classification.objects.filter(id__in=ids).values_list("id", "name"))
|
|
52
|
+
raise ValueError("invalid self value")
|
|
46
53
|
|
|
47
54
|
|
|
48
55
|
def get_latest_date_based_on_multiple_models(field, request, view):
|
|
@@ -24,7 +24,7 @@ from django.db.models.functions import Coalesce
|
|
|
24
24
|
from django.db.models.signals import post_save
|
|
25
25
|
from django.dispatch import receiver
|
|
26
26
|
from django.utils.functional import cached_property
|
|
27
|
-
from wbcore.contrib.currency.models import CurrencyFXRates
|
|
27
|
+
from wbcore.contrib.currency.models import Currency, CurrencyFXRates
|
|
28
28
|
from wbcore.contrib.io.mixins import ImportMixin
|
|
29
29
|
from wbcore.signals import pre_merge
|
|
30
30
|
from wbcore.utils.enum import ChoiceEnum
|
|
@@ -77,6 +77,24 @@ class AssetPositionDefaultQueryset(QuerySet):
|
|
|
77
77
|
classification_title=Subquery(base_qs.values(ref_title)[:1]),
|
|
78
78
|
)
|
|
79
79
|
|
|
80
|
+
def annotate_hedged_currency_fx_rate(self, hedged_currency: Currency | None) -> QuerySet:
|
|
81
|
+
return self.annotate(
|
|
82
|
+
_is_hedged=Case(
|
|
83
|
+
When(
|
|
84
|
+
underlying_instrument__currency__isnull=False,
|
|
85
|
+
underlying_instrument__currency=hedged_currency,
|
|
86
|
+
then=Value(True),
|
|
87
|
+
),
|
|
88
|
+
default=Value(False),
|
|
89
|
+
output_field=models.BooleanField(),
|
|
90
|
+
),
|
|
91
|
+
hedged_currency_fx_rate=Case(
|
|
92
|
+
When(_is_hedged=True, then=Value(Decimal(1.0))),
|
|
93
|
+
default=F("currency_fx_rate"),
|
|
94
|
+
output_field=models.BooleanField(),
|
|
95
|
+
),
|
|
96
|
+
)
|
|
97
|
+
|
|
80
98
|
|
|
81
99
|
class DefaultAssetPositionManager(models.Manager):
|
|
82
100
|
def annotate_classification_for_group(
|
|
@@ -93,7 +111,10 @@ class DefaultAssetPositionManager(models.Manager):
|
|
|
93
111
|
classification_group, classification_height=classification_height
|
|
94
112
|
)
|
|
95
113
|
|
|
96
|
-
def
|
|
114
|
+
def annotate_hedged_currency_fx_rate(self, hedged_currency: Currency | None) -> QuerySet:
|
|
115
|
+
return self.get_queryset().annotate_hedged_currency_fx_rate(hedged_currency)
|
|
116
|
+
|
|
117
|
+
def get_queryset(self) -> AssetPositionDefaultQueryset:
|
|
97
118
|
return AssetPositionDefaultQueryset(self.model).annotate(
|
|
98
119
|
adjusting_factor=Coalesce(
|
|
99
120
|
F("applied_adjustment__cumulative_factor") * F("applied_adjustment__factor"), Decimal(1.0)
|
|
@@ -511,7 +532,6 @@ class AssetPosition(ImportMixin, models.Model):
|
|
|
511
532
|
self.initial_shares = new_weighting * self.get_portfolio_total_asset_value()
|
|
512
533
|
else:
|
|
513
534
|
self.initial_shares = (new_weighting / self.weighting) * self.initial_shares
|
|
514
|
-
self.save()
|
|
515
535
|
|
|
516
536
|
def get_portfolio_total_asset_value(self) -> Decimal:
|
|
517
537
|
return self.portfolio.get_total_asset_value(self.date)
|
|
@@ -13,16 +13,12 @@ from django.contrib.contenttypes.models import ContentType
|
|
|
13
13
|
from django.contrib.postgres.fields import DateRangeField
|
|
14
14
|
from django.db import models
|
|
15
15
|
from django.db.models import (
|
|
16
|
-
BooleanField,
|
|
17
|
-
Case,
|
|
18
16
|
Exists,
|
|
19
17
|
F,
|
|
20
18
|
OuterRef,
|
|
21
19
|
Q,
|
|
22
20
|
QuerySet,
|
|
23
21
|
Sum,
|
|
24
|
-
Value,
|
|
25
|
-
When,
|
|
26
22
|
)
|
|
27
23
|
from django.db.models.signals import post_save
|
|
28
24
|
from django.dispatch import receiver
|
|
@@ -629,11 +625,28 @@ class Portfolio(DeleteToDisableMixin, WBModel):
|
|
|
629
625
|
)
|
|
630
626
|
return df
|
|
631
627
|
|
|
632
|
-
def get_portfolio_contribution_df(
|
|
628
|
+
def get_portfolio_contribution_df(
|
|
629
|
+
self,
|
|
630
|
+
start: date,
|
|
631
|
+
end: date,
|
|
632
|
+
with_cash: bool = True,
|
|
633
|
+
hedged_currency: Currency | None = None,
|
|
634
|
+
only_equity: bool = False,
|
|
635
|
+
) -> pd.DataFrame:
|
|
633
636
|
qs = self._get_assets(with_cash=with_cash).filter(date__gte=start, date__lte=end)
|
|
634
637
|
if only_equity:
|
|
635
638
|
qs = qs.filter(underlying_instrument__instrument_type=InstrumentType.EQUITY)
|
|
636
|
-
|
|
639
|
+
qs = qs.annotate_hedged_currency_fx_rate(hedged_currency)
|
|
640
|
+
df = Portfolio.get_contribution_df(
|
|
641
|
+
qs.select_related("underlying_instrument").values_list(
|
|
642
|
+
"date", "price", "hedged_currency_fx_rate", "underlying_instrument", "weighting"
|
|
643
|
+
)
|
|
644
|
+
)
|
|
645
|
+
df = df.rename(columns={"group_key": "underlying_instrument"})
|
|
646
|
+
df["underlying_instrument__name_repr"] = df["underlying_instrument"].map(
|
|
647
|
+
dict(Instrument.objects.filter(id__in=df["underlying_instrument"]).values_list("id", "name_repr"))
|
|
648
|
+
)
|
|
649
|
+
return df
|
|
637
650
|
|
|
638
651
|
def check_related_portfolio_at_date(self, val_date: date, related_portfolio: "Portfolio"):
|
|
639
652
|
assets = AssetPosition.objects.filter(
|
|
@@ -730,6 +743,7 @@ class Portfolio(DeleteToDisableMixin, WBModel):
|
|
|
730
743
|
):
|
|
731
744
|
rel.portfolio.evaluate_rebalancing(val_date)
|
|
732
745
|
for dependent_portfolio in self.get_child_portfolios(val_date):
|
|
746
|
+
dependent_portfolio.change_at_date(val_date)
|
|
733
747
|
dependent_portfolio.handle_controlling_portfolio_change_at_date(val_date)
|
|
734
748
|
|
|
735
749
|
def evaluate_rebalancing(self, val_date: date):
|
|
@@ -1088,104 +1102,68 @@ class Portfolio(DeleteToDisableMixin, WBModel):
|
|
|
1088
1102
|
return returns.replace([np.inf, -np.inf, np.nan], 0), prices_df.replace([np.inf, -np.inf, np.nan], None)
|
|
1089
1103
|
|
|
1090
1104
|
@classmethod
|
|
1091
|
-
def get_contribution_df(
|
|
1092
|
-
cls,
|
|
1093
|
-
qs,
|
|
1094
|
-
need_normalize=False,
|
|
1095
|
-
groupby_label_id="underlying_instrument",
|
|
1096
|
-
groubpy_label_title="underlying_instrument__name_repr",
|
|
1097
|
-
currency_fx_rate_label="currency_fx_rate",
|
|
1098
|
-
hedged_currency=None,
|
|
1099
|
-
):
|
|
1100
|
-
# qs = AssetPosition.annotate_underlying_instrument(qs)
|
|
1101
|
-
weight_label = "weighting" if not need_normalize else "total_value_fx_portfolio"
|
|
1102
|
-
qs = qs.annotate(
|
|
1103
|
-
is_hedged=Case(
|
|
1104
|
-
When(
|
|
1105
|
-
underlying_instrument__currency__isnull=False,
|
|
1106
|
-
underlying_instrument__currency=hedged_currency,
|
|
1107
|
-
then=Value(True),
|
|
1108
|
-
),
|
|
1109
|
-
default=Value(False),
|
|
1110
|
-
output_field=BooleanField(),
|
|
1111
|
-
),
|
|
1112
|
-
coalesce_currency_fx_rate=Case(
|
|
1113
|
-
When(is_hedged=True, then=Value(Decimal(1.0))),
|
|
1114
|
-
default=F(currency_fx_rate_label),
|
|
1115
|
-
output_field=models.BooleanField(),
|
|
1116
|
-
),
|
|
1117
|
-
).select_related("underlying_instrument")
|
|
1105
|
+
def get_contribution_df(cls, data, need_normalize: bool = False):
|
|
1118
1106
|
df = pd.DataFrame(
|
|
1119
|
-
|
|
1120
|
-
"date",
|
|
1121
|
-
"price",
|
|
1122
|
-
"coalesce_currency_fx_rate",
|
|
1123
|
-
groupby_label_id,
|
|
1124
|
-
groubpy_label_title,
|
|
1125
|
-
weight_label,
|
|
1126
|
-
),
|
|
1107
|
+
data,
|
|
1127
1108
|
columns=[
|
|
1128
1109
|
"date",
|
|
1129
1110
|
"price",
|
|
1130
|
-
"
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
weight_label,
|
|
1111
|
+
"currency_fx_rate",
|
|
1112
|
+
"group_key",
|
|
1113
|
+
"value",
|
|
1134
1114
|
],
|
|
1135
1115
|
)
|
|
1136
1116
|
if not df.empty:
|
|
1137
|
-
df = df[df[
|
|
1117
|
+
df = df[df["value"] != 0]
|
|
1138
1118
|
df.date = pd.to_datetime(df.date)
|
|
1139
|
-
df["price_fx_portfolio"] = df.price * df.
|
|
1119
|
+
df["price_fx_portfolio"] = df.price * df.currency_fx_rate
|
|
1140
1120
|
|
|
1141
|
-
df[["price", "price_fx_portfolio",
|
|
1142
|
-
["price", "price_fx_portfolio",
|
|
1121
|
+
df[["price", "price_fx_portfolio", "value", "currency_fx_rate"]] = df[
|
|
1122
|
+
["price", "price_fx_portfolio", "value", "currency_fx_rate"]
|
|
1143
1123
|
].astype("float")
|
|
1144
1124
|
|
|
1145
|
-
df[
|
|
1146
|
-
df[groubpy_label_title] = df[groubpy_label_title].fillna("N/A")
|
|
1147
|
-
df_static = df[[groupby_label_id, groubpy_label_title]].groupby(groupby_label_id, dropna=False).first()
|
|
1125
|
+
df["group_key"] = df["group_key"].fillna(0)
|
|
1148
1126
|
|
|
1149
1127
|
df = (
|
|
1150
1128
|
df[
|
|
1151
1129
|
[
|
|
1152
|
-
|
|
1130
|
+
"group_key",
|
|
1153
1131
|
"date",
|
|
1154
1132
|
"price",
|
|
1155
1133
|
"price_fx_portfolio",
|
|
1156
|
-
|
|
1157
|
-
"
|
|
1134
|
+
"value",
|
|
1135
|
+
"currency_fx_rate",
|
|
1158
1136
|
]
|
|
1159
1137
|
]
|
|
1160
|
-
.groupby(["date",
|
|
1138
|
+
.groupby(["date", "group_key"], dropna=False)
|
|
1161
1139
|
.agg(
|
|
1162
1140
|
{
|
|
1163
1141
|
"price": "mean",
|
|
1164
1142
|
"price_fx_portfolio": "mean",
|
|
1165
|
-
|
|
1166
|
-
"
|
|
1143
|
+
"value": "sum",
|
|
1144
|
+
"currency_fx_rate": "mean",
|
|
1167
1145
|
}
|
|
1168
1146
|
)
|
|
1169
1147
|
.reset_index()
|
|
1170
1148
|
.set_index("date")
|
|
1171
1149
|
.sort_index()
|
|
1172
1150
|
)
|
|
1173
|
-
df[
|
|
1151
|
+
df["value"] = df["value"].fillna(0)
|
|
1174
1152
|
value = df.pivot_table(
|
|
1175
1153
|
index="date",
|
|
1176
|
-
columns=[
|
|
1177
|
-
values=
|
|
1154
|
+
columns=["group_key"],
|
|
1155
|
+
values="value",
|
|
1178
1156
|
fill_value=0,
|
|
1179
1157
|
aggfunc="sum",
|
|
1180
1158
|
)
|
|
1181
1159
|
weights_ = value
|
|
1182
1160
|
if need_normalize:
|
|
1183
|
-
total_value_price = df[
|
|
1161
|
+
total_value_price = df["value"].groupby("date", dropna=False).sum()
|
|
1184
1162
|
weights_ = value.divide(total_value_price, axis=0)
|
|
1185
1163
|
prices_usd = (
|
|
1186
1164
|
df.pivot_table(
|
|
1187
1165
|
index="date",
|
|
1188
|
-
columns=[
|
|
1166
|
+
columns=["group_key"],
|
|
1189
1167
|
values="price_fx_portfolio",
|
|
1190
1168
|
aggfunc="mean",
|
|
1191
1169
|
)
|
|
@@ -1196,8 +1174,8 @@ class Portfolio(DeleteToDisableMixin, WBModel):
|
|
|
1196
1174
|
rates_fx = (
|
|
1197
1175
|
df.pivot_table(
|
|
1198
1176
|
index="date",
|
|
1199
|
-
columns=[
|
|
1200
|
-
values="
|
|
1177
|
+
columns=["group_key"],
|
|
1178
|
+
values="currency_fx_rate",
|
|
1201
1179
|
aggfunc="mean",
|
|
1202
1180
|
)
|
|
1203
1181
|
.replace(0, np.nan)
|
|
@@ -1220,7 +1198,6 @@ class Portfolio(DeleteToDisableMixin, WBModel):
|
|
|
1220
1198
|
|
|
1221
1199
|
res = pd.concat(
|
|
1222
1200
|
[
|
|
1223
|
-
df_static,
|
|
1224
1201
|
monthly_perf_prices,
|
|
1225
1202
|
monthly_perf_rates_fx,
|
|
1226
1203
|
contributions_prices,
|
|
@@ -1233,8 +1210,7 @@ class Portfolio(DeleteToDisableMixin, WBModel):
|
|
|
1233
1210
|
axis=1,
|
|
1234
1211
|
).reset_index()
|
|
1235
1212
|
res.columns = [
|
|
1236
|
-
|
|
1237
|
-
groubpy_label_title,
|
|
1213
|
+
"group_key",
|
|
1238
1214
|
"performance_total",
|
|
1239
1215
|
"performance_forex",
|
|
1240
1216
|
"contribution_total",
|
|
@@ -95,12 +95,15 @@ class Rebalancer(ComplexToStringMixin, models.Model):
|
|
|
95
95
|
while TradeProposal.objects.filter(
|
|
96
96
|
portfolio=self.portfolio, status=TradeProposal.Status.FAILED, trade_date=pivot_date
|
|
97
97
|
).exists():
|
|
98
|
-
pivot_date
|
|
98
|
+
pivot_date = (pivot_date + BDay(1)).date()
|
|
99
99
|
return pivot_date
|
|
100
100
|
|
|
101
101
|
def is_valid(self, trade_date: date) -> bool:
|
|
102
102
|
if TradeProposal.objects.filter(
|
|
103
|
-
portfolio=self.portfolio,
|
|
103
|
+
portfolio=self.portfolio,
|
|
104
|
+
status=TradeProposal.Status.APPROVED,
|
|
105
|
+
trade_date=trade_date,
|
|
106
|
+
rebalancing_model__isnull=True,
|
|
104
107
|
).exists(): # if a already approved trade proposal exists, we do not allow a re-evaluatioon of the rebalancing (only possible if "replayed")
|
|
105
108
|
return False
|
|
106
109
|
for initial_valid_datetime in self.get_rrule(trade_date):
|
|
@@ -121,12 +124,13 @@ class Rebalancer(ComplexToStringMixin, models.Model):
|
|
|
121
124
|
"rebalancing_model": self.rebalancing_model,
|
|
122
125
|
},
|
|
123
126
|
)
|
|
124
|
-
|
|
125
|
-
f"Getting target portfolio ({self.portfolio}) for rebalancing model {self.rebalancing_model} for trade date {trade_date:%Y-%m-%d}"
|
|
126
|
-
)
|
|
127
|
+
|
|
127
128
|
if trade_proposal.rebalancing_model == self.rebalancing_model:
|
|
128
129
|
trade_proposal.status = TradeProposal.Status.DRAFT
|
|
129
130
|
try:
|
|
131
|
+
logger.info(
|
|
132
|
+
f"Getting target portfolio ({self.portfolio}) for rebalancing model {self.rebalancing_model} for trade date {trade_date:%Y-%m-%d}"
|
|
133
|
+
)
|
|
130
134
|
target_portfolio = self.rebalancing_model.get_target_portfolio(
|
|
131
135
|
self.portfolio, trade_date, trade_proposal.last_effective_date, **self.parameters
|
|
132
136
|
)
|
{wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/models/transactions/trade_proposals.py
RENAMED
|
@@ -18,6 +18,7 @@ from wbcore.enums import RequestType
|
|
|
18
18
|
from wbcore.metadata.configs.buttons import ActionButton
|
|
19
19
|
from wbcore.models import WBModel
|
|
20
20
|
from wbcore.utils.models import CloneMixin
|
|
21
|
+
from wbfdm.models import InstrumentPrice
|
|
21
22
|
from wbfdm.models.instruments.instruments import Cash, Instrument
|
|
22
23
|
|
|
23
24
|
from wbportfolio.models.roles import PortfolioRole
|
|
@@ -80,8 +81,6 @@ class TradeProposal(CloneMixin, RiskCheckMixin, WBModel):
|
|
|
80
81
|
if not self.trade_date and self.portfolio.assets.exists():
|
|
81
82
|
self.trade_date = (self.portfolio.assets.latest("date").date + BDay(1)).date()
|
|
82
83
|
super().save(*args, **kwargs)
|
|
83
|
-
if self.status == TradeProposal.Status.APPROVED:
|
|
84
|
-
self.portfolio.change_at_date(self.trade_date)
|
|
85
84
|
|
|
86
85
|
@property
|
|
87
86
|
def checked_object(self):
|
|
@@ -256,6 +255,9 @@ class TradeProposal(CloneMixin, RiskCheckMixin, WBModel):
|
|
|
256
255
|
# we cannot do a bulk-create because Trade is a multi table inheritance
|
|
257
256
|
try:
|
|
258
257
|
trade = self.trades.get(underlying_instrument=instrument)
|
|
258
|
+
trade.weighting = trade_dto.delta_weight
|
|
259
|
+
trade.currency_fx_rate = currency_fx_rate
|
|
260
|
+
trade.status = Trade.Status.DRAFT
|
|
259
261
|
except Trade.DoesNotExist:
|
|
260
262
|
trade = Trade(
|
|
261
263
|
underlying_instrument=instrument,
|
|
@@ -272,35 +274,43 @@ class TradeProposal(CloneMixin, RiskCheckMixin, WBModel):
|
|
|
272
274
|
|
|
273
275
|
def replay(self):
|
|
274
276
|
last_trade_proposal = self
|
|
277
|
+
last_trade_proposal_created = False
|
|
275
278
|
while last_trade_proposal and last_trade_proposal.status == TradeProposal.Status.APPROVED:
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
if
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
279
|
+
if not last_trade_proposal_created:
|
|
280
|
+
logger.info(f"Replaying trade proposal {last_trade_proposal}")
|
|
281
|
+
last_trade_proposal.portfolio.assets.filter(
|
|
282
|
+
date=last_trade_proposal.trade_date
|
|
283
|
+
).delete() # we delete the existing position and we reapply the trade proposal
|
|
284
|
+
if last_trade_proposal.status == TradeProposal.Status.APPROVED:
|
|
285
|
+
logger.info("Reverting trade proposal ...")
|
|
286
|
+
last_trade_proposal.revert()
|
|
287
|
+
if last_trade_proposal.status == TradeProposal.Status.DRAFT:
|
|
288
|
+
if self.rebalancing_model: # if there is no position (for any reason) or we the trade proposal has a rebalancer model attached (trades are computed based on an aglo), we reapply this trade proposal
|
|
289
|
+
logger.info(f"Resetting trades from rebalancer model {self.rebalancing_model} ...")
|
|
290
|
+
with suppress(
|
|
291
|
+
ValidationError
|
|
292
|
+
): # we silent any validation error while setting proposal, because if this happens, we assume the current trade proposal state if valid and we continue to batch compute
|
|
293
|
+
self.reset_trades()
|
|
294
|
+
logger.info("Submitting trade proposal ...")
|
|
295
|
+
last_trade_proposal.submit()
|
|
296
|
+
if last_trade_proposal.status == TradeProposal.Status.SUBMIT:
|
|
297
|
+
logger.info("Approving trade proposal ...")
|
|
298
|
+
last_trade_proposal.approve(replay=False)
|
|
299
|
+
last_trade_proposal.save()
|
|
296
300
|
next_trade_proposal = last_trade_proposal.next_trade_proposal
|
|
301
|
+
|
|
297
302
|
next_trade_date = (
|
|
298
303
|
next_trade_proposal.trade_date - timedelta(days=1) if next_trade_proposal else date.today()
|
|
299
304
|
)
|
|
300
305
|
overriding_trade_proposal = last_trade_proposal.portfolio.batch_portfolio(
|
|
301
306
|
last_trade_proposal.trade_date, next_trade_date
|
|
302
307
|
)
|
|
303
|
-
|
|
308
|
+
if overriding_trade_proposal:
|
|
309
|
+
last_trade_proposal_created = True
|
|
310
|
+
last_trade_proposal = overriding_trade_proposal
|
|
311
|
+
else:
|
|
312
|
+
last_trade_proposal_created = False
|
|
313
|
+
last_trade_proposal = next_trade_proposal
|
|
304
314
|
|
|
305
315
|
def get_estimated_shares(self, weight: Decimal, underlying_quote: Instrument) -> Decimal:
|
|
306
316
|
"""
|
|
@@ -333,7 +343,7 @@ class TradeProposal(CloneMixin, RiskCheckMixin, WBModel):
|
|
|
333
343
|
except Exception:
|
|
334
344
|
raise ValueError("We couldn't estimate the number of shares")
|
|
335
345
|
|
|
336
|
-
def get_estimated_target_cash(self, currency: Currency) ->
|
|
346
|
+
def get_estimated_target_cash(self, currency: Currency) -> AssetPosition:
|
|
337
347
|
"""
|
|
338
348
|
Estimates the target cash weight and shares for a trade proposal.
|
|
339
349
|
|
|
@@ -374,7 +384,29 @@ class TradeProposal(CloneMixin, RiskCheckMixin, WBModel):
|
|
|
374
384
|
with suppress(ValueError):
|
|
375
385
|
total_target_shares = self.get_estimated_shares(target_cash_weight, cash_component)
|
|
376
386
|
|
|
377
|
-
|
|
387
|
+
cash_component = Cash.objects.get_or_create(
|
|
388
|
+
currency=self.portfolio.currency, defaults={"name": self.portfolio.currency.title}
|
|
389
|
+
)[0]
|
|
390
|
+
# otherwise, we create a new position
|
|
391
|
+
underlying_quote_price = InstrumentPrice.objects.get_or_create(
|
|
392
|
+
instrument=cash_component,
|
|
393
|
+
date=self.trade_date,
|
|
394
|
+
calculated=False,
|
|
395
|
+
defaults={"net_value": Decimal(1)},
|
|
396
|
+
)[0]
|
|
397
|
+
return AssetPosition(
|
|
398
|
+
underlying_quote=cash_component,
|
|
399
|
+
portfolio_created=None,
|
|
400
|
+
portfolio=self.portfolio,
|
|
401
|
+
date=self.trade_date,
|
|
402
|
+
weighting=target_cash_weight,
|
|
403
|
+
initial_price=underlying_quote_price.net_value,
|
|
404
|
+
initial_shares=total_target_shares,
|
|
405
|
+
asset_valuation_date=self.trade_date,
|
|
406
|
+
underlying_quote_price=underlying_quote_price,
|
|
407
|
+
currency=cash_component.currency,
|
|
408
|
+
is_estimated=False,
|
|
409
|
+
)
|
|
378
410
|
|
|
379
411
|
# Start FSM logics
|
|
380
412
|
|
|
@@ -398,30 +430,30 @@ class TradeProposal(CloneMixin, RiskCheckMixin, WBModel):
|
|
|
398
430
|
},
|
|
399
431
|
)
|
|
400
432
|
def submit(self, by=None, description=None, **kwargs):
|
|
401
|
-
self.trades.update(comment="", status=Trade.Status.DRAFT)
|
|
402
433
|
self.reset_trades(target_portfolio=self._build_dto().convert_to_portfolio())
|
|
434
|
+
trades = []
|
|
403
435
|
for trade in self.trades.all():
|
|
404
|
-
trade.
|
|
405
|
-
trade.
|
|
436
|
+
trade.status = Trade.Status.SUBMIT
|
|
437
|
+
trade.comment = ""
|
|
438
|
+
trades.append(trade)
|
|
439
|
+
|
|
440
|
+
Trade.objects.bulk_update(trades, ["status", "comment"])
|
|
406
441
|
|
|
407
442
|
# If we estimate cash on this trade proposal, we make sure to create the corresponding cash component
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
)
|
|
443
|
+
estimated_cash_position = self.get_estimated_target_cash(self.portfolio.currency)
|
|
444
|
+
target_portfolio = self.validated_trading_service.target_portfolio
|
|
445
|
+
if estimated_cash_position.weighting:
|
|
446
|
+
if existing_cash_position := target_portfolio.positions_map.get(
|
|
447
|
+
estimated_cash_position.underlying_quote.id
|
|
448
|
+
):
|
|
449
|
+
existing_cash_position += estimated_cash_position
|
|
450
|
+
else:
|
|
451
|
+
target_portfolio.positions_map[estimated_cash_position.underlying_quote.id] = (
|
|
452
|
+
estimated_cash_position._build_dto()
|
|
453
|
+
)
|
|
454
|
+
target_portfolio = PortfolioDTO(positions=tuple(target_portfolio.positions_map.values()))
|
|
421
455
|
|
|
422
|
-
self.evaluate_active_rules(
|
|
423
|
-
self.trade_date, self.validated_trading_service.target_portfolio, asynchronously=True
|
|
424
|
-
)
|
|
456
|
+
self.evaluate_active_rules(self.trade_date, target_portfolio, asynchronously=True)
|
|
425
457
|
|
|
426
458
|
def can_submit(self):
|
|
427
459
|
errors = dict()
|
|
@@ -475,11 +507,27 @@ class TradeProposal(CloneMixin, RiskCheckMixin, WBModel):
|
|
|
475
507
|
# We validate trade which will create or update the initial asset positions
|
|
476
508
|
if not self.portfolio.can_be_rebalanced:
|
|
477
509
|
raise ValueError("Non-Rebalanceable portfolio cannot be traded manually.")
|
|
478
|
-
|
|
479
|
-
|
|
510
|
+
trades = []
|
|
511
|
+
assets = []
|
|
512
|
+
# We do not want to create the estimated cash position if there is not trades in the trade proposal (shouldn't be possible anyway)
|
|
513
|
+
estimated_cash_position = self.get_estimated_target_cash(self.portfolio.currency)
|
|
514
|
+
|
|
480
515
|
for trade in self.trades.all():
|
|
481
|
-
|
|
482
|
-
|
|
516
|
+
with suppress(ValueError):
|
|
517
|
+
asset = trade.to_asset()
|
|
518
|
+
# we add the corresponding asset only if it is not the cache position (already included in estimated_cash_position)
|
|
519
|
+
if asset.underlying_quote != estimated_cash_position.underlying_quote:
|
|
520
|
+
assets.append(asset)
|
|
521
|
+
trade.status = Trade.Status.EXECUTED
|
|
522
|
+
trades.append(trade)
|
|
523
|
+
|
|
524
|
+
# if there is cash leftover, we create an extra asset position to hold the cash component
|
|
525
|
+
if estimated_cash_position.weighting and len(trades) > 0:
|
|
526
|
+
estimated_cash_position.pre_save()
|
|
527
|
+
assets.append(estimated_cash_position)
|
|
528
|
+
|
|
529
|
+
Trade.objects.bulk_update(trades, ["status"])
|
|
530
|
+
self.portfolio.bulk_create_positions(assets, evaluate_rebalancer=False)
|
|
483
531
|
if replay and self.portfolio.is_manageable:
|
|
484
532
|
replay_as_task.delay(self.id)
|
|
485
533
|
|
|
@@ -584,10 +632,22 @@ class TradeProposal(CloneMixin, RiskCheckMixin, WBModel):
|
|
|
584
632
|
def revert(self, **kwargs):
|
|
585
633
|
with suppress(KeyError):
|
|
586
634
|
del self.__dict__["validated_trading_service"]
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
635
|
+
trades = []
|
|
636
|
+
assets = []
|
|
637
|
+
for trade in self.trades.all():
|
|
638
|
+
trade.status = Trade.Status.DRAFT
|
|
639
|
+
trades.append(trade)
|
|
640
|
+
with suppress(AssetPosition.DoesNotExist):
|
|
641
|
+
asset = AssetPosition.unannotated_objects.get(
|
|
642
|
+
underlying_quote=trade.underlying_instrument,
|
|
643
|
+
portfolio=trade.portfolio,
|
|
644
|
+
date=trade.transaction_date,
|
|
645
|
+
is_estimated=False,
|
|
646
|
+
)
|
|
647
|
+
asset.set_weighting(asset.weighting - trade.weighting)
|
|
648
|
+
assets.append(asset)
|
|
649
|
+
Trade.objects.bulk_update(trades, ["status"])
|
|
650
|
+
self.portfolio.bulk_create_positions(assets, evaluate_rebalancer=False)
|
|
591
651
|
|
|
592
652
|
def can_revert(self):
|
|
593
653
|
errors = dict()
|