wbfdm 1.54.20__tar.gz → 1.54.22__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 wbfdm might be problematic. Click here for more details.
- {wbfdm-1.54.20 → wbfdm-1.54.22}/PKG-INFO +1 -1
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/qa/dataloaders/market_data.py +1 -1
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/models/instruments/instruments.py +6 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/models/instruments/querysets.py +83 -2
- wbfdm-1.54.22/wbfdm/tests/models/test_queryset.py +89 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/.gitignore +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/pyproject.toml +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/__init__.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/admin/__init__.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/admin/classifications.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/admin/esg.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/admin/exchanges.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/admin/instrument_lists.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/admin/instrument_prices.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/admin/instrument_requests.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/admin/instruments.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/admin/instruments_relationships.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/admin/options.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/analysis/__init__.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/analysis/esg/__init__.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/analysis/esg/enums.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/analysis/esg/esg_analysis.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/analysis/esg/utils.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/analysis/financial_analysis/__init__.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/analysis/financial_analysis/change_point_detection.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/analysis/financial_analysis/financial_metric_analysis.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/analysis/financial_analysis/financial_ratio_analysis.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/analysis/financial_analysis/financial_statistics_analysis.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/analysis/financial_analysis/statement_with_estimates.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/analysis/financial_analysis/utils.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/analysis/technical_analysis/__init__.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/analysis/technical_analysis/technical_analysis.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/analysis/technical_analysis/traces.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/analysis/utils.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/apps.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/backends/dto.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/__init__.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/dsws/__init__.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/dsws/client.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/dsws/dataloaders/market_data.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/internal/__init__.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/internal/dataloaders/__init__.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/internal/dataloaders/market_data.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/metric/__init__.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/metric/admin/__init__.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/metric/admin/instruments.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/metric/admin/metrics.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/metric/apps.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/metric/backends/__init__.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/metric/backends/base.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/metric/backends/performances.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/metric/backends/statistics.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/metric/backends/utils.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/metric/decorators.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/metric/dispatch.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/metric/dto.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/metric/exceptions.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/metric/factories.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/metric/filters.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/metric/migrations/0001_initial.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/metric/migrations/0002_remove_instrumentmetric_unique_instrument_metric_and_more.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/metric/migrations/__init__.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/metric/models.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/metric/orchestrators.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/metric/registry.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/metric/serializers.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/metric/tasks.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/metric/tests/__init__.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/metric/tests/backends/__init__.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/metric/tests/backends/test_performances.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/metric/tests/backends/test_statistics.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/metric/tests/conftest.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/metric/tests/test_dto.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/metric/tests/test_models.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/metric/tests/test_tasks.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/metric/tests/test_viewsets.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/metric/urls.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/metric/viewsets/__init__.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/metric/viewsets/configs/__init__.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/metric/viewsets/configs/display.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/metric/viewsets/configs/menus.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/metric/viewsets/configs/utils.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/metric/viewsets/mixins.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/metric/viewsets/viewsets.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/msci/__init__.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/msci/client.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/msci/dataloaders/__init__.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/msci/dataloaders/esg.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/msci/dataloaders/esg_controversies.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/msci/sync.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/msci/tests/__init__.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/msci/tests/conftest.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/msci/tests/test_client.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/qa/__init__.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/qa/apps.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/qa/database_routers.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/qa/dataloaders/__init__.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/qa/dataloaders/adjustments.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/qa/dataloaders/corporate_actions.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/qa/dataloaders/financials.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/qa/dataloaders/officers.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/qa/dataloaders/reporting_dates.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/qa/dataloaders/statements.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/qa/dataloaders/utils.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/qa/jinja2/qa/sql/companies.sql +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/qa/jinja2/qa/sql/ibes/base_estimates.sql +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/qa/jinja2/qa/sql/ibes/calendarized.sql +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/qa/jinja2/qa/sql/ibes/complete.sql +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/qa/jinja2/qa/sql/ibes/estimates.sql +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/qa/jinja2/qa/sql/ibes/financials.sql +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/qa/jinja2/qa/sql/instruments.sql +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/qa/jinja2/qa/sql/quotes.sql +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/qa/sync/exchanges.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/qa/sync/instruments.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/qa/sync/utils.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/qa/tasks.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/dataloaders/__init__.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/dataloaders/cache.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/dataloaders/protocols.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/dataloaders/proxies.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/dataloaders/types.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/dynamic_preferences_registry.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/enums.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/factories/__init__.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/factories/classifications.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/factories/controversies.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/factories/exchanges.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/factories/instrument_list.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/factories/instrument_prices.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/factories/instruments.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/factories/instruments_relationships.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/factories/options.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/figures/__init__.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/figures/financials/__init__.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/figures/financials/financial_analysis_charts.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/figures/financials/financials_charts.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/filters/__init__.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/filters/classifications.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/filters/exchanges.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/filters/financials.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/filters/financials_analysis.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/filters/instrument_prices.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/filters/instruments.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/filters/utils.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/__init__.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/backends/__init__.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/backends/cbinsights/__init__.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/backends/cbinsights/deals.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/backends/cbinsights/equities.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/backends/cbinsights/mixin.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/backends/cbinsights/utils/__init__.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/backends/cbinsights/utils/classifications.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/backends/cbinsights/utils/client.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/backends/refinitiv/__init__.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/backends/refinitiv/daily_fundamental.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/backends/refinitiv/fiscal_period.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/backends/refinitiv/forecast.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/backends/refinitiv/fundamental.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/backends/refinitiv/geographic_segment.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/backends/refinitiv/instrument.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/backends/refinitiv/instrument_price.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/backends/refinitiv/mixin.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/backends/refinitiv/utils/__init__.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/backends/refinitiv/utils/controller.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/handlers/__init__.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/handlers/instrument.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/handlers/instrument_list.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/handlers/instrument_price.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/handlers/option.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/handlers/private_equities.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/parsers/__init__.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/parsers/cbinsights/__init__.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/parsers/cbinsights/deals.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/parsers/cbinsights/equities.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/parsers/cbinsights/fundamentals.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/parsers/refinitiv/__init__.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/parsers/refinitiv/daily_fundamental.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/parsers/refinitiv/forecast.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/parsers/refinitiv/fundamental.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/parsers/refinitiv/geographic_segment.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/parsers/refinitiv/instrument.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/parsers/refinitiv/instrument_price.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/parsers/refinitiv/utils.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/resources/__init__.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/resources/classification.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/resources/instrument_prices.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/resources/instruments.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/jinja2.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/locale/de/LC_MESSAGES/django.mo +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/locale/de/LC_MESSAGES/django.po +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/locale/en/LC_MESSAGES/django.mo +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/locale/en/LC_MESSAGES/django.po +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/locale/fr/LC_MESSAGES/django.mo +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/locale/fr/LC_MESSAGES/django.po +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/management/__init__.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/migrations/0001_initial.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/migrations/0002_rename_statements_instrumentlookup_financials_and_more.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/migrations/0003_instrument_estimate_backend_and_more.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/migrations/0004_rename_financials_instrumentlookup_statements_and_more.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/migrations/0005_instrument_corporate_action_backend.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/migrations/0006_instrument_officer_backend.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/migrations/0007_instrument_country_instrument_currency_and_more.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/migrations/0008_controversy.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/migrations/0009_alter_controversy_flag_alter_controversy_initiated_and_more.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/migrations/0010_classification_classificationgroup_deal_exchange_and_more.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/migrations/0011_delete_instrumentlookup_instrument_corporate_actions_and_more.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/migrations/0012_instrumentprice_created_instrumentprice_modified.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/migrations/0013_instrument_is_investable_universe_and_more.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/migrations/0014_alter_controversy_instrument.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/migrations/0015_instrument_instrument_investible_index.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/migrations/0016_instrumenttype_name_repr.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/migrations/0017_instrument_instrument_security_index.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/migrations/0018_instrument_instrument_level_index.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/migrations/0019_alter_controversy_source.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/migrations/0020_optionaggregate_option_and_more.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/migrations/0021_delete_instrumentdailystatistics.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/migrations/0022_instrument_cusip_option_open_interest_20d_and_more.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/migrations/0023_instrument_unique_ric_instrument_unique_rmc_and_more.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/migrations/0024_option_open_interest_10d_option_volume_10d_and_more.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/migrations/0025_instrument_is_primary_and_more.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/migrations/0026_instrument_is_cash_equivalent.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/migrations/0027_remove_instrument_unique_ric_and_more.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/migrations/0028_instrumentprice_annualized_daily_volatility.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/migrations/0029_alter_instrumentprice_volume.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/migrations/0030_alter_relatedinstrumentthroughmodel_related_type.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/migrations/0031_exchange_apply_round_lot_size_and_more.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/migrations/__init__.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/models/__init__.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/models/esg/__init__.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/models/esg/controversies.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/models/exchanges/__init__.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/models/exchanges/exchanges.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/models/fields.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/models/fk_fields.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/models/indicators.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/models/instruments/__init__.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/models/instruments/classifications.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/models/instruments/instrument_lists.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/models/instruments/instrument_prices.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/models/instruments/instrument_relationships.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/models/instruments/instrument_requests.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/models/instruments/llm/__init__.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/models/instruments/llm/create_instrument_news_relationships.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/models/instruments/mixin/__init__.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/models/instruments/mixin/financials_computed.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/models/instruments/mixin/financials_serializer_fields.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/models/instruments/mixin/instruments.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/models/instruments/options.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/models/instruments/private_equities.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/models/instruments/utils.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/preferences.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/serializers/__init__.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/serializers/esg.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/serializers/exchanges.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/serializers/instruments/__init__.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/serializers/instruments/classifications.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/serializers/instruments/instrument_lists.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/serializers/instruments/instrument_prices.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/serializers/instruments/instrument_relationships.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/serializers/instruments/instrument_requests.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/serializers/instruments/instruments.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/serializers/instruments/mixins.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/serializers/officers.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/signals.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/sync/__init__.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/sync/abstract.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/sync/runner.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/tasks.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/tests/__init__.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/tests/analysis/__init__.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/tests/analysis/financial_analysis/__init__.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/tests/analysis/financial_analysis/test_statement_with_estimates.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/tests/analysis/financial_analysis/test_utils.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/tests/analysis/test_esg.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/tests/conftest.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/tests/dataloaders/__init__.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/tests/dataloaders/test_cache.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/tests/models/__init__.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/tests/models/test_classifications.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/tests/models/test_exchanges.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/tests/models/test_instrument_list.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/tests/models/test_instrument_prices.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/tests/models/test_instruments.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/tests/models/test_merge.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/tests/models/test_options.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/tests/test_tasks.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/tests/tests.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/urls.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/utils.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/__init__.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/__init__.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/buttons/__init__.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/buttons/classifications.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/buttons/exchanges.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/buttons/instrument_prices.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/buttons/instruments.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/display/__init__.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/display/classifications.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/display/esg.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/display/exchanges.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/display/financial_summary.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/display/instrument_lists.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/display/instrument_prices.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/display/instrument_requests.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/display/instruments.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/display/instruments_relationships.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/display/monthly_performances.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/display/officers.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/display/prices.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/display/statement_with_estimates.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/display/statements.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/endpoints/__init__.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/endpoints/classifications.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/endpoints/esg.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/endpoints/exchanges.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/endpoints/financials_analysis.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/endpoints/instrument_lists.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/endpoints/instrument_prices.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/endpoints/instrument_requests.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/endpoints/instruments.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/endpoints/instruments_relationships.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/endpoints/statements.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/menus/__init__.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/menus/classifications.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/menus/exchanges.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/menus/instrument_lists.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/menus/instruments.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/menus/instruments_relationships.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/titles/__init__.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/titles/classifications.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/titles/esg.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/titles/exchanges.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/titles/financial_ratio_analysis.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/titles/financials_analysis.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/titles/instrument_prices.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/titles/instrument_requests.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/titles/instruments.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/titles/instruments_relationships.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/titles/market_data.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/titles/prices.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/titles/statement_with_estimates.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/esg.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/exchanges.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/financial_analysis/__init__.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/financial_analysis/financial_metric_analysis.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/financial_analysis/financial_ratio_analysis.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/financial_analysis/financial_summary.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/financial_analysis/statement_with_estimates.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/instruments/__init__.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/instruments/classifications.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/instruments/financials_analysis.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/instruments/instrument_lists.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/instruments/instrument_prices.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/instruments/instrument_requests.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/instruments/instruments.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/instruments/instruments_relationships.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/instruments/utils.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/market_data.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/mixins.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/officers.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/prices.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/statements/__init__.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/statements/statements.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/technical_analysis/__init__.py +0 -0
- {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/technical_analysis/monthly_performances.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: wbfdm
|
|
3
|
-
Version: 1.54.
|
|
3
|
+
Version: 1.54.22
|
|
4
4
|
Summary: The workbench module ensures rapid access to diverse financial data (market, fundamental, forecasts, ESG), with features for storing instruments, classifying them, and conducting financial analysis.
|
|
5
5
|
Author-email: Christopher Wittlinger <c.wittlinger@stainly.com>
|
|
6
6
|
Requires-Dist: roman==4.*
|
|
@@ -189,7 +189,7 @@ class DatastreamMarketDataDataloader(MarketDataProtocol, Dataloader):
|
|
|
189
189
|
|
|
190
190
|
if MarketData.SHARES_OUTSTANDING in values:
|
|
191
191
|
row["outstanding_shares"] = (row["market_capitalization"] / row["close"]) if row["close"] else None
|
|
192
|
-
|
|
192
|
+
row["fx_rate"] = row.get("fx_rate", 1.0)
|
|
193
193
|
yield row
|
|
194
194
|
|
|
195
195
|
cursor.execute(MSSQLQuery.drop_table(mapping).get_sql())
|
|
@@ -139,6 +139,12 @@ class InstrumentManager(TreeManager):
|
|
|
139
139
|
def filter_active_at_date(self, val_date: date):
|
|
140
140
|
return self.get_queryset().filter_active_at_date(val_date)
|
|
141
141
|
|
|
142
|
+
def get_instrument_prices_from_market_data(self, **kwargs):
|
|
143
|
+
return self.get_queryset().get_instrument_prices_from_market_data(**kwargs)
|
|
144
|
+
|
|
145
|
+
def get_returns_df(self, **kwargs) -> tuple[dict[date, dict[int, float]], pd.DataFrame]:
|
|
146
|
+
return self.get_queryset().get_returns_df(**kwargs)
|
|
147
|
+
|
|
142
148
|
|
|
143
149
|
class SecurityInstrumentManager(InstrumentManager):
|
|
144
150
|
def get_queryset(self) -> InstrumentQuerySet:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import logging
|
|
2
2
|
from contextlib import suppress
|
|
3
|
-
from datetime import date
|
|
3
|
+
from datetime import date, timedelta
|
|
4
4
|
from decimal import Decimal
|
|
5
5
|
|
|
6
6
|
import numpy as np
|
|
@@ -9,6 +9,7 @@ from django.core.exceptions import MultipleObjectsReturned, ValidationError
|
|
|
9
9
|
from django.core.validators import DecimalValidator
|
|
10
10
|
from django.db.models import (
|
|
11
11
|
AutoField,
|
|
12
|
+
Case,
|
|
12
13
|
Exists,
|
|
13
14
|
ExpressionWrapper,
|
|
14
15
|
F,
|
|
@@ -16,9 +17,12 @@ from django.db.models import (
|
|
|
16
17
|
Q,
|
|
17
18
|
QuerySet,
|
|
18
19
|
Subquery,
|
|
20
|
+
Value,
|
|
21
|
+
When,
|
|
19
22
|
)
|
|
20
23
|
from django.db.models.functions import Coalesce
|
|
21
|
-
from
|
|
24
|
+
from skfolio.preprocessing import prices_to_returns
|
|
25
|
+
from wbcore.contrib.currency.models import Currency, CurrencyFXRates
|
|
22
26
|
|
|
23
27
|
from wbfdm.enums import MarketData
|
|
24
28
|
|
|
@@ -177,3 +181,80 @@ class InstrumentQuerySet(QuerySet):
|
|
|
177
181
|
yield from filter(
|
|
178
182
|
lambda x: x, map(lambda row: _dict_to_object(instrument, row), dff.to_dict("records"))
|
|
179
183
|
)
|
|
184
|
+
|
|
185
|
+
def get_returns_df(
|
|
186
|
+
self, from_date: date, to_date: date, to_currency: Currency | None = None, use_dl: bool = False
|
|
187
|
+
) -> tuple[dict[date, dict[int, float]], pd.DataFrame]:
|
|
188
|
+
"""
|
|
189
|
+
Utility methods to get instrument returns for a given date range
|
|
190
|
+
|
|
191
|
+
Args:
|
|
192
|
+
from_date: date range lower bound
|
|
193
|
+
to_date: date range upper bound
|
|
194
|
+
to_currency: currency to use for returns
|
|
195
|
+
use_dl: whether to get data straight from the dataloader or use the internal table
|
|
196
|
+
|
|
197
|
+
Returns:
|
|
198
|
+
Return a tuple of the raw prices and the returns dataframe
|
|
199
|
+
"""
|
|
200
|
+
padded_from_date = from_date - timedelta(days=15)
|
|
201
|
+
padded_to_date = to_date + timedelta(days=3)
|
|
202
|
+
logger.info(
|
|
203
|
+
f"Loading returns from {from_date:%Y-%m-%d} (padded to {padded_from_date:%Y-%m-%d}) to {to_date:%Y-%m-%d} (padded to {padded_to_date:%Y-%m-%d})"
|
|
204
|
+
)
|
|
205
|
+
|
|
206
|
+
if use_dl:
|
|
207
|
+
kwargs = dict(
|
|
208
|
+
from_date=padded_from_date, to_date=padded_to_date, values=[MarketData.CLOSE], apply_fx_rate=False
|
|
209
|
+
)
|
|
210
|
+
if to_currency:
|
|
211
|
+
kwargs["target_currency"] = to_currency.key
|
|
212
|
+
df = pd.DataFrame(self.dl.market_data(**kwargs))
|
|
213
|
+
if df.empty:
|
|
214
|
+
df = pd.DataFrame(columns=["instrument_id", "fx_rate", "close", "valuation_date"])
|
|
215
|
+
else:
|
|
216
|
+
df = df[["instrument_id", "fx_rate", "close", "valuation_date"]]
|
|
217
|
+
else:
|
|
218
|
+
from wbfdm.models import InstrumentPrice
|
|
219
|
+
|
|
220
|
+
if to_currency:
|
|
221
|
+
fx_rate = Coalesce(
|
|
222
|
+
CurrencyFXRates.get_fx_rates_subquery_for_two_currencies(
|
|
223
|
+
"date", "instrument__currency", to_currency
|
|
224
|
+
),
|
|
225
|
+
Decimal("1"),
|
|
226
|
+
)
|
|
227
|
+
else:
|
|
228
|
+
fx_rate = Value(Decimal("1"))
|
|
229
|
+
# annotate fx rate only if the price is not calculated, in that case we assume the instrument is not tradable and we set a forex of None (to be fast forward filled)
|
|
230
|
+
prices = InstrumentPrice.objects.filter(
|
|
231
|
+
instrument__in=self, date__gte=padded_from_date, date__lte=padded_to_date
|
|
232
|
+
).annotate(fx_rate=Case(When(calculated=False, then=fx_rate), default=None))
|
|
233
|
+
df = pd.DataFrame(
|
|
234
|
+
prices.filter_only_valid_prices().values_list("instrument", "fx_rate", "net_value", "date"),
|
|
235
|
+
columns=["instrument_id", "fx_rate", "close", "valuation_date"],
|
|
236
|
+
)
|
|
237
|
+
df = (
|
|
238
|
+
df.pivot_table(index="valuation_date", columns="instrument_id", values=["fx_rate", "close"], dropna=False)
|
|
239
|
+
.astype(float)
|
|
240
|
+
.sort_index()
|
|
241
|
+
)
|
|
242
|
+
if not df.empty:
|
|
243
|
+
ts = pd.bdate_range(df.index.min(), df.index.max(), freq="B")
|
|
244
|
+
df = df.reindex(ts)
|
|
245
|
+
df = df.ffill()
|
|
246
|
+
df.index = pd.to_datetime(df.index)
|
|
247
|
+
df = df[
|
|
248
|
+
(df.index <= pd.Timestamp(to_date)) & (df.index >= pd.Timestamp(from_date))
|
|
249
|
+
] # ensure the returned df corresponds to requested date range
|
|
250
|
+
prices_df = df["close"]
|
|
251
|
+
|
|
252
|
+
if "fx_rate" in df.columns:
|
|
253
|
+
fx_rate_df = df["fx_rate"].fillna(1.0)
|
|
254
|
+
else:
|
|
255
|
+
fx_rate_df = pd.DataFrame(np.ones(prices_df.shape), index=prices_df.index, columns=prices_df.columns)
|
|
256
|
+
returns = prices_to_returns(fx_rate_df * prices_df, drop_inceptions_nan=False, fill_nan=True)
|
|
257
|
+
return {ts.date(): row for ts, row in prices_df.to_dict("index").items()}, returns.replace(
|
|
258
|
+
[np.inf, -np.inf, np.nan], 0
|
|
259
|
+
)
|
|
260
|
+
return {}, pd.DataFrame()
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
from datetime import date
|
|
2
|
+
from decimal import Decimal
|
|
3
|
+
|
|
4
|
+
import pandas as pd
|
|
5
|
+
import pytest
|
|
6
|
+
|
|
7
|
+
from wbfdm.models import Instrument
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
@pytest.mark.django_db
|
|
11
|
+
class TestInstrumentQueryset:
|
|
12
|
+
def test_get_returns(self, instrument_factory, instrument_price_factory):
|
|
13
|
+
v1 = date(2024, 12, 31)
|
|
14
|
+
v2 = date(2025, 1, 1)
|
|
15
|
+
v3 = date(2025, 1, 2)
|
|
16
|
+
v4 = date(2025, 1, 3)
|
|
17
|
+
|
|
18
|
+
i1 = instrument_factory.create()
|
|
19
|
+
i2 = instrument_factory.create()
|
|
20
|
+
|
|
21
|
+
i11 = instrument_price_factory.create(date=v1, instrument=i1)
|
|
22
|
+
i12 = instrument_price_factory.create(date=v2, instrument=i1)
|
|
23
|
+
i14 = instrument_price_factory.create(date=v4, instrument=i1)
|
|
24
|
+
i21 = instrument_price_factory.create(date=v1, instrument=i2)
|
|
25
|
+
i11.refresh_from_db()
|
|
26
|
+
i12.refresh_from_db()
|
|
27
|
+
i14.refresh_from_db()
|
|
28
|
+
prices, returns = Instrument.objects.filter(id__in=[i1.id, i2.id]).get_returns_df(from_date=v1, to_date=v4)
|
|
29
|
+
|
|
30
|
+
expected_returns = pd.DataFrame(
|
|
31
|
+
[[i12.net_value / i11.net_value - 1, 0.0], [0.0, 0.0], [i14.net_value / i12.net_value - 1, 0.0]],
|
|
32
|
+
index=[v2, v3, v4],
|
|
33
|
+
columns=[i1.id, i2.id],
|
|
34
|
+
dtype="float64",
|
|
35
|
+
)
|
|
36
|
+
expected_returns.index = pd.to_datetime(expected_returns.index)
|
|
37
|
+
pd.testing.assert_frame_equal(returns, expected_returns, check_names=False, check_freq=False, atol=1e-6)
|
|
38
|
+
assert prices[v1][i1.id] == float(i11.net_value)
|
|
39
|
+
assert prices[v2][i1.id] == float(i12.net_value)
|
|
40
|
+
assert prices[v3][i1.id] == float(i12.net_value)
|
|
41
|
+
assert prices[v4][i1.id] == float(i14.net_value)
|
|
42
|
+
# test that the returned price are ffill
|
|
43
|
+
assert prices[v1][i2.id] == float(i21.net_value)
|
|
44
|
+
assert prices[v2][i2.id] == float(i21.net_value)
|
|
45
|
+
assert prices[v3][i2.id] == float(i21.net_value)
|
|
46
|
+
assert prices[v4][i2.id] == float(i21.net_value)
|
|
47
|
+
|
|
48
|
+
def test_get_returns_fix_forex_on_holiday(
|
|
49
|
+
self, instrument, instrument_price_factory, currency_fx_rates_factory, currency_factory
|
|
50
|
+
):
|
|
51
|
+
v1 = date(2024, 12, 31)
|
|
52
|
+
v2 = date(2025, 1, 1)
|
|
53
|
+
v3 = date(2025, 1, 2)
|
|
54
|
+
|
|
55
|
+
target_currency = currency_factory.create()
|
|
56
|
+
fx_target1 = currency_fx_rates_factory.create(currency=target_currency, date=v1)
|
|
57
|
+
fx_target2 = currency_fx_rates_factory.create(currency=target_currency, date=v2) # noqa
|
|
58
|
+
fx_target3 = currency_fx_rates_factory.create(currency=target_currency, date=v3)
|
|
59
|
+
|
|
60
|
+
fx1 = currency_fx_rates_factory.create(currency=instrument.currency, date=v1)
|
|
61
|
+
fx2 = currency_fx_rates_factory.create(currency=instrument.currency, date=v2) # noqa
|
|
62
|
+
fx3 = currency_fx_rates_factory.create(currency=instrument.currency, date=v3)
|
|
63
|
+
|
|
64
|
+
i1 = instrument_price_factory.create(net_value=Decimal("100"), date=v1, instrument=instrument)
|
|
65
|
+
i2 = instrument_price_factory.create(net_value=Decimal("100"), date=v2, instrument=instrument, calculated=True)
|
|
66
|
+
i3 = instrument_price_factory.create(net_value=Decimal("200"), date=v3, instrument=instrument)
|
|
67
|
+
|
|
68
|
+
prices, returns = Instrument.objects.filter(id__in=[instrument.id]).get_returns_df(
|
|
69
|
+
from_date=v1, to_date=v3, to_currency=target_currency
|
|
70
|
+
)
|
|
71
|
+
returns.index = pd.to_datetime(returns.index)
|
|
72
|
+
assert prices[v1][instrument.id] == float(i1.net_value)
|
|
73
|
+
assert prices[v2][instrument.id] == float(i2.net_value)
|
|
74
|
+
assert prices[v3][instrument.id] == float(i3.net_value)
|
|
75
|
+
|
|
76
|
+
assert returns.loc[pd.Timestamp(v2), instrument.id] == pytest.approx(
|
|
77
|
+
float(
|
|
78
|
+
(i2.net_value * fx_target1.value / fx1.value) / (i1.net_value * fx_target1.value / fx1.value)
|
|
79
|
+
- Decimal("1")
|
|
80
|
+
),
|
|
81
|
+
abs=10e-8,
|
|
82
|
+
) # as v2 as a calculated price, the forex won't apply to it
|
|
83
|
+
assert returns.loc[pd.Timestamp(v3), instrument.id] == pytest.approx(
|
|
84
|
+
float(
|
|
85
|
+
(i3.net_value * fx_target3.value / fx3.value) / (i2.net_value * fx_target1.value / fx1.value)
|
|
86
|
+
- Decimal("1")
|
|
87
|
+
),
|
|
88
|
+
abs=10e-8,
|
|
89
|
+
)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/analysis/financial_analysis/financial_metric_analysis.py
RENAMED
|
File without changes
|
{wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/analysis/financial_analysis/financial_ratio_analysis.py
RENAMED
|
File without changes
|
{wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/analysis/financial_analysis/financial_statistics_analysis.py
RENAMED
|
File without changes
|
{wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/analysis/financial_analysis/statement_with_estimates.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/backends/cbinsights/utils/classifications.py
RENAMED
|
File without changes
|