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.

Files changed (365) hide show
  1. {wbfdm-1.54.20 → wbfdm-1.54.22}/PKG-INFO +1 -1
  2. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/qa/dataloaders/market_data.py +1 -1
  3. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/models/instruments/instruments.py +6 -0
  4. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/models/instruments/querysets.py +83 -2
  5. wbfdm-1.54.22/wbfdm/tests/models/test_queryset.py +89 -0
  6. {wbfdm-1.54.20 → wbfdm-1.54.22}/.gitignore +0 -0
  7. {wbfdm-1.54.20 → wbfdm-1.54.22}/pyproject.toml +0 -0
  8. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/__init__.py +0 -0
  9. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/admin/__init__.py +0 -0
  10. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/admin/classifications.py +0 -0
  11. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/admin/esg.py +0 -0
  12. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/admin/exchanges.py +0 -0
  13. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/admin/instrument_lists.py +0 -0
  14. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/admin/instrument_prices.py +0 -0
  15. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/admin/instrument_requests.py +0 -0
  16. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/admin/instruments.py +0 -0
  17. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/admin/instruments_relationships.py +0 -0
  18. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/admin/options.py +0 -0
  19. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/analysis/__init__.py +0 -0
  20. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/analysis/esg/__init__.py +0 -0
  21. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/analysis/esg/enums.py +0 -0
  22. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/analysis/esg/esg_analysis.py +0 -0
  23. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/analysis/esg/utils.py +0 -0
  24. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/analysis/financial_analysis/__init__.py +0 -0
  25. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/analysis/financial_analysis/change_point_detection.py +0 -0
  26. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/analysis/financial_analysis/financial_metric_analysis.py +0 -0
  27. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/analysis/financial_analysis/financial_ratio_analysis.py +0 -0
  28. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/analysis/financial_analysis/financial_statistics_analysis.py +0 -0
  29. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/analysis/financial_analysis/statement_with_estimates.py +0 -0
  30. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/analysis/financial_analysis/utils.py +0 -0
  31. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/analysis/technical_analysis/__init__.py +0 -0
  32. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/analysis/technical_analysis/technical_analysis.py +0 -0
  33. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/analysis/technical_analysis/traces.py +0 -0
  34. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/analysis/utils.py +0 -0
  35. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/apps.py +0 -0
  36. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/backends/dto.py +0 -0
  37. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/__init__.py +0 -0
  38. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/dsws/__init__.py +0 -0
  39. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/dsws/client.py +0 -0
  40. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/dsws/dataloaders/market_data.py +0 -0
  41. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/internal/__init__.py +0 -0
  42. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/internal/dataloaders/__init__.py +0 -0
  43. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/internal/dataloaders/market_data.py +0 -0
  44. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/metric/__init__.py +0 -0
  45. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/metric/admin/__init__.py +0 -0
  46. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/metric/admin/instruments.py +0 -0
  47. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/metric/admin/metrics.py +0 -0
  48. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/metric/apps.py +0 -0
  49. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/metric/backends/__init__.py +0 -0
  50. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/metric/backends/base.py +0 -0
  51. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/metric/backends/performances.py +0 -0
  52. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/metric/backends/statistics.py +0 -0
  53. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/metric/backends/utils.py +0 -0
  54. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/metric/decorators.py +0 -0
  55. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/metric/dispatch.py +0 -0
  56. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/metric/dto.py +0 -0
  57. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/metric/exceptions.py +0 -0
  58. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/metric/factories.py +0 -0
  59. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/metric/filters.py +0 -0
  60. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/metric/migrations/0001_initial.py +0 -0
  61. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/metric/migrations/0002_remove_instrumentmetric_unique_instrument_metric_and_more.py +0 -0
  62. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/metric/migrations/__init__.py +0 -0
  63. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/metric/models.py +0 -0
  64. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/metric/orchestrators.py +0 -0
  65. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/metric/registry.py +0 -0
  66. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/metric/serializers.py +0 -0
  67. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/metric/tasks.py +0 -0
  68. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/metric/tests/__init__.py +0 -0
  69. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/metric/tests/backends/__init__.py +0 -0
  70. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/metric/tests/backends/test_performances.py +0 -0
  71. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/metric/tests/backends/test_statistics.py +0 -0
  72. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/metric/tests/conftest.py +0 -0
  73. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/metric/tests/test_dto.py +0 -0
  74. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/metric/tests/test_models.py +0 -0
  75. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/metric/tests/test_tasks.py +0 -0
  76. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/metric/tests/test_viewsets.py +0 -0
  77. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/metric/urls.py +0 -0
  78. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/metric/viewsets/__init__.py +0 -0
  79. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/metric/viewsets/configs/__init__.py +0 -0
  80. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/metric/viewsets/configs/display.py +0 -0
  81. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/metric/viewsets/configs/menus.py +0 -0
  82. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/metric/viewsets/configs/utils.py +0 -0
  83. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/metric/viewsets/mixins.py +0 -0
  84. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/metric/viewsets/viewsets.py +0 -0
  85. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/msci/__init__.py +0 -0
  86. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/msci/client.py +0 -0
  87. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/msci/dataloaders/__init__.py +0 -0
  88. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/msci/dataloaders/esg.py +0 -0
  89. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/msci/dataloaders/esg_controversies.py +0 -0
  90. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/msci/sync.py +0 -0
  91. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/msci/tests/__init__.py +0 -0
  92. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/msci/tests/conftest.py +0 -0
  93. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/msci/tests/test_client.py +0 -0
  94. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/qa/__init__.py +0 -0
  95. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/qa/apps.py +0 -0
  96. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/qa/database_routers.py +0 -0
  97. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/qa/dataloaders/__init__.py +0 -0
  98. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/qa/dataloaders/adjustments.py +0 -0
  99. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/qa/dataloaders/corporate_actions.py +0 -0
  100. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/qa/dataloaders/financials.py +0 -0
  101. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/qa/dataloaders/officers.py +0 -0
  102. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/qa/dataloaders/reporting_dates.py +0 -0
  103. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/qa/dataloaders/statements.py +0 -0
  104. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/qa/dataloaders/utils.py +0 -0
  105. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/qa/jinja2/qa/sql/companies.sql +0 -0
  106. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/qa/jinja2/qa/sql/ibes/base_estimates.sql +0 -0
  107. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/qa/jinja2/qa/sql/ibes/calendarized.sql +0 -0
  108. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/qa/jinja2/qa/sql/ibes/complete.sql +0 -0
  109. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/qa/jinja2/qa/sql/ibes/estimates.sql +0 -0
  110. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/qa/jinja2/qa/sql/ibes/financials.sql +0 -0
  111. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/qa/jinja2/qa/sql/instruments.sql +0 -0
  112. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/qa/jinja2/qa/sql/quotes.sql +0 -0
  113. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/qa/sync/exchanges.py +0 -0
  114. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/qa/sync/instruments.py +0 -0
  115. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/qa/sync/utils.py +0 -0
  116. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/contrib/qa/tasks.py +0 -0
  117. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/dataloaders/__init__.py +0 -0
  118. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/dataloaders/cache.py +0 -0
  119. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/dataloaders/protocols.py +0 -0
  120. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/dataloaders/proxies.py +0 -0
  121. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/dataloaders/types.py +0 -0
  122. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/dynamic_preferences_registry.py +0 -0
  123. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/enums.py +0 -0
  124. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/factories/__init__.py +0 -0
  125. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/factories/classifications.py +0 -0
  126. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/factories/controversies.py +0 -0
  127. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/factories/exchanges.py +0 -0
  128. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/factories/instrument_list.py +0 -0
  129. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/factories/instrument_prices.py +0 -0
  130. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/factories/instruments.py +0 -0
  131. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/factories/instruments_relationships.py +0 -0
  132. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/factories/options.py +0 -0
  133. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/figures/__init__.py +0 -0
  134. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/figures/financials/__init__.py +0 -0
  135. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/figures/financials/financial_analysis_charts.py +0 -0
  136. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/figures/financials/financials_charts.py +0 -0
  137. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/filters/__init__.py +0 -0
  138. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/filters/classifications.py +0 -0
  139. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/filters/exchanges.py +0 -0
  140. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/filters/financials.py +0 -0
  141. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/filters/financials_analysis.py +0 -0
  142. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/filters/instrument_prices.py +0 -0
  143. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/filters/instruments.py +0 -0
  144. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/filters/utils.py +0 -0
  145. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/__init__.py +0 -0
  146. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/backends/__init__.py +0 -0
  147. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/backends/cbinsights/__init__.py +0 -0
  148. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/backends/cbinsights/deals.py +0 -0
  149. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/backends/cbinsights/equities.py +0 -0
  150. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/backends/cbinsights/mixin.py +0 -0
  151. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/backends/cbinsights/utils/__init__.py +0 -0
  152. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/backends/cbinsights/utils/classifications.py +0 -0
  153. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/backends/cbinsights/utils/client.py +0 -0
  154. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/backends/refinitiv/__init__.py +0 -0
  155. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/backends/refinitiv/daily_fundamental.py +0 -0
  156. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/backends/refinitiv/fiscal_period.py +0 -0
  157. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/backends/refinitiv/forecast.py +0 -0
  158. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/backends/refinitiv/fundamental.py +0 -0
  159. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/backends/refinitiv/geographic_segment.py +0 -0
  160. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/backends/refinitiv/instrument.py +0 -0
  161. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/backends/refinitiv/instrument_price.py +0 -0
  162. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/backends/refinitiv/mixin.py +0 -0
  163. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/backends/refinitiv/utils/__init__.py +0 -0
  164. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/backends/refinitiv/utils/controller.py +0 -0
  165. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/handlers/__init__.py +0 -0
  166. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/handlers/instrument.py +0 -0
  167. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/handlers/instrument_list.py +0 -0
  168. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/handlers/instrument_price.py +0 -0
  169. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/handlers/option.py +0 -0
  170. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/handlers/private_equities.py +0 -0
  171. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/parsers/__init__.py +0 -0
  172. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/parsers/cbinsights/__init__.py +0 -0
  173. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/parsers/cbinsights/deals.py +0 -0
  174. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/parsers/cbinsights/equities.py +0 -0
  175. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/parsers/cbinsights/fundamentals.py +0 -0
  176. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/parsers/refinitiv/__init__.py +0 -0
  177. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/parsers/refinitiv/daily_fundamental.py +0 -0
  178. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/parsers/refinitiv/forecast.py +0 -0
  179. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/parsers/refinitiv/fundamental.py +0 -0
  180. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/parsers/refinitiv/geographic_segment.py +0 -0
  181. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/parsers/refinitiv/instrument.py +0 -0
  182. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/parsers/refinitiv/instrument_price.py +0 -0
  183. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/parsers/refinitiv/utils.py +0 -0
  184. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/resources/__init__.py +0 -0
  185. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/resources/classification.py +0 -0
  186. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/resources/instrument_prices.py +0 -0
  187. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/import_export/resources/instruments.py +0 -0
  188. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/jinja2.py +0 -0
  189. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/locale/de/LC_MESSAGES/django.mo +0 -0
  190. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/locale/de/LC_MESSAGES/django.po +0 -0
  191. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/locale/en/LC_MESSAGES/django.mo +0 -0
  192. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/locale/en/LC_MESSAGES/django.po +0 -0
  193. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/locale/fr/LC_MESSAGES/django.mo +0 -0
  194. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/locale/fr/LC_MESSAGES/django.po +0 -0
  195. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/management/__init__.py +0 -0
  196. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/migrations/0001_initial.py +0 -0
  197. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/migrations/0002_rename_statements_instrumentlookup_financials_and_more.py +0 -0
  198. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/migrations/0003_instrument_estimate_backend_and_more.py +0 -0
  199. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/migrations/0004_rename_financials_instrumentlookup_statements_and_more.py +0 -0
  200. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/migrations/0005_instrument_corporate_action_backend.py +0 -0
  201. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/migrations/0006_instrument_officer_backend.py +0 -0
  202. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/migrations/0007_instrument_country_instrument_currency_and_more.py +0 -0
  203. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/migrations/0008_controversy.py +0 -0
  204. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/migrations/0009_alter_controversy_flag_alter_controversy_initiated_and_more.py +0 -0
  205. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/migrations/0010_classification_classificationgroup_deal_exchange_and_more.py +0 -0
  206. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/migrations/0011_delete_instrumentlookup_instrument_corporate_actions_and_more.py +0 -0
  207. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/migrations/0012_instrumentprice_created_instrumentprice_modified.py +0 -0
  208. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/migrations/0013_instrument_is_investable_universe_and_more.py +0 -0
  209. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/migrations/0014_alter_controversy_instrument.py +0 -0
  210. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/migrations/0015_instrument_instrument_investible_index.py +0 -0
  211. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/migrations/0016_instrumenttype_name_repr.py +0 -0
  212. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/migrations/0017_instrument_instrument_security_index.py +0 -0
  213. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/migrations/0018_instrument_instrument_level_index.py +0 -0
  214. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/migrations/0019_alter_controversy_source.py +0 -0
  215. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/migrations/0020_optionaggregate_option_and_more.py +0 -0
  216. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/migrations/0021_delete_instrumentdailystatistics.py +0 -0
  217. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/migrations/0022_instrument_cusip_option_open_interest_20d_and_more.py +0 -0
  218. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/migrations/0023_instrument_unique_ric_instrument_unique_rmc_and_more.py +0 -0
  219. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/migrations/0024_option_open_interest_10d_option_volume_10d_and_more.py +0 -0
  220. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/migrations/0025_instrument_is_primary_and_more.py +0 -0
  221. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/migrations/0026_instrument_is_cash_equivalent.py +0 -0
  222. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/migrations/0027_remove_instrument_unique_ric_and_more.py +0 -0
  223. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/migrations/0028_instrumentprice_annualized_daily_volatility.py +0 -0
  224. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/migrations/0029_alter_instrumentprice_volume.py +0 -0
  225. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/migrations/0030_alter_relatedinstrumentthroughmodel_related_type.py +0 -0
  226. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/migrations/0031_exchange_apply_round_lot_size_and_more.py +0 -0
  227. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/migrations/__init__.py +0 -0
  228. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/models/__init__.py +0 -0
  229. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/models/esg/__init__.py +0 -0
  230. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/models/esg/controversies.py +0 -0
  231. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/models/exchanges/__init__.py +0 -0
  232. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/models/exchanges/exchanges.py +0 -0
  233. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/models/fields.py +0 -0
  234. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/models/fk_fields.py +0 -0
  235. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/models/indicators.py +0 -0
  236. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/models/instruments/__init__.py +0 -0
  237. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/models/instruments/classifications.py +0 -0
  238. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/models/instruments/instrument_lists.py +0 -0
  239. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/models/instruments/instrument_prices.py +0 -0
  240. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/models/instruments/instrument_relationships.py +0 -0
  241. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/models/instruments/instrument_requests.py +0 -0
  242. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/models/instruments/llm/__init__.py +0 -0
  243. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/models/instruments/llm/create_instrument_news_relationships.py +0 -0
  244. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/models/instruments/mixin/__init__.py +0 -0
  245. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/models/instruments/mixin/financials_computed.py +0 -0
  246. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/models/instruments/mixin/financials_serializer_fields.py +0 -0
  247. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/models/instruments/mixin/instruments.py +0 -0
  248. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/models/instruments/options.py +0 -0
  249. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/models/instruments/private_equities.py +0 -0
  250. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/models/instruments/utils.py +0 -0
  251. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/preferences.py +0 -0
  252. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/serializers/__init__.py +0 -0
  253. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/serializers/esg.py +0 -0
  254. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/serializers/exchanges.py +0 -0
  255. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/serializers/instruments/__init__.py +0 -0
  256. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/serializers/instruments/classifications.py +0 -0
  257. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/serializers/instruments/instrument_lists.py +0 -0
  258. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/serializers/instruments/instrument_prices.py +0 -0
  259. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/serializers/instruments/instrument_relationships.py +0 -0
  260. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/serializers/instruments/instrument_requests.py +0 -0
  261. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/serializers/instruments/instruments.py +0 -0
  262. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/serializers/instruments/mixins.py +0 -0
  263. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/serializers/officers.py +0 -0
  264. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/signals.py +0 -0
  265. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/sync/__init__.py +0 -0
  266. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/sync/abstract.py +0 -0
  267. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/sync/runner.py +0 -0
  268. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/tasks.py +0 -0
  269. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/tests/__init__.py +0 -0
  270. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/tests/analysis/__init__.py +0 -0
  271. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/tests/analysis/financial_analysis/__init__.py +0 -0
  272. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/tests/analysis/financial_analysis/test_statement_with_estimates.py +0 -0
  273. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/tests/analysis/financial_analysis/test_utils.py +0 -0
  274. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/tests/analysis/test_esg.py +0 -0
  275. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/tests/conftest.py +0 -0
  276. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/tests/dataloaders/__init__.py +0 -0
  277. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/tests/dataloaders/test_cache.py +0 -0
  278. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/tests/models/__init__.py +0 -0
  279. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/tests/models/test_classifications.py +0 -0
  280. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/tests/models/test_exchanges.py +0 -0
  281. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/tests/models/test_instrument_list.py +0 -0
  282. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/tests/models/test_instrument_prices.py +0 -0
  283. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/tests/models/test_instruments.py +0 -0
  284. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/tests/models/test_merge.py +0 -0
  285. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/tests/models/test_options.py +0 -0
  286. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/tests/test_tasks.py +0 -0
  287. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/tests/tests.py +0 -0
  288. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/urls.py +0 -0
  289. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/utils.py +0 -0
  290. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/__init__.py +0 -0
  291. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/__init__.py +0 -0
  292. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/buttons/__init__.py +0 -0
  293. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/buttons/classifications.py +0 -0
  294. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/buttons/exchanges.py +0 -0
  295. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/buttons/instrument_prices.py +0 -0
  296. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/buttons/instruments.py +0 -0
  297. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/display/__init__.py +0 -0
  298. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/display/classifications.py +0 -0
  299. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/display/esg.py +0 -0
  300. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/display/exchanges.py +0 -0
  301. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/display/financial_summary.py +0 -0
  302. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/display/instrument_lists.py +0 -0
  303. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/display/instrument_prices.py +0 -0
  304. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/display/instrument_requests.py +0 -0
  305. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/display/instruments.py +0 -0
  306. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/display/instruments_relationships.py +0 -0
  307. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/display/monthly_performances.py +0 -0
  308. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/display/officers.py +0 -0
  309. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/display/prices.py +0 -0
  310. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/display/statement_with_estimates.py +0 -0
  311. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/display/statements.py +0 -0
  312. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/endpoints/__init__.py +0 -0
  313. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/endpoints/classifications.py +0 -0
  314. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/endpoints/esg.py +0 -0
  315. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/endpoints/exchanges.py +0 -0
  316. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/endpoints/financials_analysis.py +0 -0
  317. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/endpoints/instrument_lists.py +0 -0
  318. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/endpoints/instrument_prices.py +0 -0
  319. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/endpoints/instrument_requests.py +0 -0
  320. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/endpoints/instruments.py +0 -0
  321. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/endpoints/instruments_relationships.py +0 -0
  322. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/endpoints/statements.py +0 -0
  323. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/menus/__init__.py +0 -0
  324. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/menus/classifications.py +0 -0
  325. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/menus/exchanges.py +0 -0
  326. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/menus/instrument_lists.py +0 -0
  327. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/menus/instruments.py +0 -0
  328. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/menus/instruments_relationships.py +0 -0
  329. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/titles/__init__.py +0 -0
  330. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/titles/classifications.py +0 -0
  331. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/titles/esg.py +0 -0
  332. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/titles/exchanges.py +0 -0
  333. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/titles/financial_ratio_analysis.py +0 -0
  334. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/titles/financials_analysis.py +0 -0
  335. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/titles/instrument_prices.py +0 -0
  336. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/titles/instrument_requests.py +0 -0
  337. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/titles/instruments.py +0 -0
  338. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/titles/instruments_relationships.py +0 -0
  339. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/titles/market_data.py +0 -0
  340. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/titles/prices.py +0 -0
  341. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/configs/titles/statement_with_estimates.py +0 -0
  342. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/esg.py +0 -0
  343. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/exchanges.py +0 -0
  344. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/financial_analysis/__init__.py +0 -0
  345. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/financial_analysis/financial_metric_analysis.py +0 -0
  346. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/financial_analysis/financial_ratio_analysis.py +0 -0
  347. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/financial_analysis/financial_summary.py +0 -0
  348. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/financial_analysis/statement_with_estimates.py +0 -0
  349. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/instruments/__init__.py +0 -0
  350. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/instruments/classifications.py +0 -0
  351. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/instruments/financials_analysis.py +0 -0
  352. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/instruments/instrument_lists.py +0 -0
  353. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/instruments/instrument_prices.py +0 -0
  354. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/instruments/instrument_requests.py +0 -0
  355. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/instruments/instruments.py +0 -0
  356. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/instruments/instruments_relationships.py +0 -0
  357. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/instruments/utils.py +0 -0
  358. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/market_data.py +0 -0
  359. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/mixins.py +0 -0
  360. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/officers.py +0 -0
  361. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/prices.py +0 -0
  362. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/statements/__init__.py +0 -0
  363. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/statements/statements.py +0 -0
  364. {wbfdm-1.54.20 → wbfdm-1.54.22}/wbfdm/viewsets/technical_analysis/__init__.py +0 -0
  365. {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.20
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 wbcore.contrib.currency.models import CurrencyFXRates
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