wbfdm 1.46.8__tar.gz → 1.46.10__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 (357) hide show
  1. {wbfdm-1.46.8 → wbfdm-1.46.10}/PKG-INFO +1 -1
  2. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/models/instruments/instrument_prices.py +8 -4
  3. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/models/instruments/instruments.py +2 -5
  4. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/models/instruments/mixin/instruments.py +2 -91
  5. wbfdm-1.46.10/wbfdm/models/instruments/querysets.py +156 -0
  6. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/tasks.py +12 -8
  7. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/tests/models/test_instruments.py +2 -0
  8. wbfdm-1.46.8/wbfdm/models/instruments/querysets.py +0 -73
  9. {wbfdm-1.46.8 → wbfdm-1.46.10}/.gitignore +0 -0
  10. {wbfdm-1.46.8 → wbfdm-1.46.10}/pyproject.toml +0 -0
  11. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/__init__.py +0 -0
  12. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/admin/__init__.py +0 -0
  13. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/admin/classifications.py +0 -0
  14. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/admin/esg.py +0 -0
  15. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/admin/exchanges.py +0 -0
  16. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/admin/instrument_lists.py +0 -0
  17. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/admin/instrument_prices.py +0 -0
  18. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/admin/instrument_requests.py +0 -0
  19. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/admin/instruments.py +0 -0
  20. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/admin/instruments_relationships.py +0 -0
  21. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/admin/options.py +0 -0
  22. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/analysis/__init__.py +0 -0
  23. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/analysis/esg/__init__.py +0 -0
  24. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/analysis/esg/enums.py +0 -0
  25. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/analysis/esg/esg_analysis.py +0 -0
  26. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/analysis/esg/utils.py +0 -0
  27. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/analysis/financial_analysis/__init__.py +0 -0
  28. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/analysis/financial_analysis/financial_metric_analysis.py +0 -0
  29. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/analysis/financial_analysis/financial_ratio_analysis.py +0 -0
  30. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/analysis/financial_analysis/financial_statistics_analysis.py +0 -0
  31. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/analysis/financial_analysis/statement_with_estimates.py +0 -0
  32. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/analysis/financial_analysis/utils.py +0 -0
  33. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/analysis/technical_analysis/__init__.py +0 -0
  34. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/analysis/technical_analysis/technical_analysis.py +0 -0
  35. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/analysis/technical_analysis/traces.py +0 -0
  36. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/analysis/utils.py +0 -0
  37. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/apps.py +0 -0
  38. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/backends/dto.py +0 -0
  39. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/contrib/__init__.py +0 -0
  40. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/contrib/dsws/__init__.py +0 -0
  41. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/contrib/dsws/client.py +0 -0
  42. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/contrib/dsws/dataloaders/market_data.py +0 -0
  43. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/contrib/internal/__init__.py +0 -0
  44. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/contrib/internal/dataloaders/__init__.py +0 -0
  45. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/contrib/internal/dataloaders/market_data.py +0 -0
  46. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/contrib/metric/__init__.py +0 -0
  47. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/contrib/metric/admin/__init__.py +0 -0
  48. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/contrib/metric/admin/instruments.py +0 -0
  49. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/contrib/metric/admin/metrics.py +0 -0
  50. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/contrib/metric/apps.py +0 -0
  51. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/contrib/metric/backends/__init__.py +0 -0
  52. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/contrib/metric/backends/base.py +0 -0
  53. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/contrib/metric/backends/performances.py +0 -0
  54. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/contrib/metric/backends/statistics.py +0 -0
  55. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/contrib/metric/decorators.py +0 -0
  56. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/contrib/metric/dispatch.py +0 -0
  57. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/contrib/metric/dto.py +0 -0
  58. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/contrib/metric/exceptions.py +0 -0
  59. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/contrib/metric/factories.py +0 -0
  60. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/contrib/metric/filters.py +0 -0
  61. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/contrib/metric/migrations/0001_initial.py +0 -0
  62. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/contrib/metric/migrations/0002_remove_instrumentmetric_unique_instrument_metric_and_more.py +0 -0
  63. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/contrib/metric/migrations/__init__.py +0 -0
  64. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/contrib/metric/models.py +0 -0
  65. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/contrib/metric/orchestrators.py +0 -0
  66. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/contrib/metric/registry.py +0 -0
  67. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/contrib/metric/serializers.py +0 -0
  68. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/contrib/metric/tasks.py +0 -0
  69. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/contrib/metric/tests/__init__.py +0 -0
  70. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/contrib/metric/tests/backends/__init__.py +0 -0
  71. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/contrib/metric/tests/backends/test_performances.py +0 -0
  72. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/contrib/metric/tests/backends/test_statistics.py +0 -0
  73. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/contrib/metric/tests/conftest.py +0 -0
  74. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/contrib/metric/tests/test_dto.py +0 -0
  75. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/contrib/metric/tests/test_models.py +0 -0
  76. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/contrib/metric/tests/test_tasks.py +0 -0
  77. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/contrib/metric/tests/test_viewsets.py +0 -0
  78. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/contrib/metric/urls.py +0 -0
  79. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/contrib/metric/viewsets/__init__.py +0 -0
  80. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/contrib/metric/viewsets/configs/__init__.py +0 -0
  81. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/contrib/metric/viewsets/configs/display.py +0 -0
  82. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/contrib/metric/viewsets/configs/menus.py +0 -0
  83. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/contrib/metric/viewsets/configs/utils.py +0 -0
  84. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/contrib/metric/viewsets/mixins.py +0 -0
  85. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/contrib/metric/viewsets/viewsets.py +0 -0
  86. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/contrib/msci/__init__.py +0 -0
  87. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/contrib/msci/client.py +0 -0
  88. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/contrib/msci/dataloaders/__init__.py +0 -0
  89. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/contrib/msci/dataloaders/esg.py +0 -0
  90. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/contrib/msci/dataloaders/esg_controversies.py +0 -0
  91. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/contrib/msci/sync.py +0 -0
  92. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/contrib/msci/tests/__init__.py +0 -0
  93. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/contrib/msci/tests/conftest.py +0 -0
  94. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/contrib/msci/tests/test_client.py +0 -0
  95. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/contrib/qa/__init__.py +0 -0
  96. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/contrib/qa/apps.py +0 -0
  97. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/contrib/qa/database_routers.py +0 -0
  98. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/contrib/qa/dataloaders/__init__.py +0 -0
  99. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/contrib/qa/dataloaders/adjustments.py +0 -0
  100. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/contrib/qa/dataloaders/corporate_actions.py +0 -0
  101. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/contrib/qa/dataloaders/financials.py +0 -0
  102. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/contrib/qa/dataloaders/market_data.py +0 -0
  103. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/contrib/qa/dataloaders/officers.py +0 -0
  104. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/contrib/qa/dataloaders/reporting_dates.py +0 -0
  105. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/contrib/qa/dataloaders/statements.py +0 -0
  106. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/contrib/qa/dataloaders/utils.py +0 -0
  107. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/contrib/qa/jinja2/qa/sql/companies.sql +0 -0
  108. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/contrib/qa/jinja2/qa/sql/ibes/base_estimates.sql +0 -0
  109. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/contrib/qa/jinja2/qa/sql/ibes/calendarized.sql +0 -0
  110. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/contrib/qa/jinja2/qa/sql/ibes/complete.sql +0 -0
  111. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/contrib/qa/jinja2/qa/sql/ibes/estimates.sql +0 -0
  112. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/contrib/qa/jinja2/qa/sql/ibes/financials.sql +0 -0
  113. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/contrib/qa/jinja2/qa/sql/instruments.sql +0 -0
  114. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/contrib/qa/jinja2/qa/sql/quotes.sql +0 -0
  115. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/contrib/qa/sync/exchanges.py +0 -0
  116. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/contrib/qa/sync/instruments.py +0 -0
  117. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/contrib/qa/sync/utils.py +0 -0
  118. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/contrib/qa/tasks.py +0 -0
  119. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/dataloaders/__init__.py +0 -0
  120. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/dataloaders/cache.py +0 -0
  121. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/dataloaders/protocols.py +0 -0
  122. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/dataloaders/proxies.py +0 -0
  123. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/dataloaders/types.py +0 -0
  124. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/dynamic_preferences_registry.py +0 -0
  125. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/enums.py +0 -0
  126. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/factories/__init__.py +0 -0
  127. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/factories/classifications.py +0 -0
  128. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/factories/controversies.py +0 -0
  129. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/factories/exchanges.py +0 -0
  130. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/factories/instrument_list.py +0 -0
  131. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/factories/instrument_prices.py +0 -0
  132. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/factories/instruments.py +0 -0
  133. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/factories/instruments_relationships.py +0 -0
  134. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/factories/options.py +0 -0
  135. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/figures/__init__.py +0 -0
  136. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/figures/financials/__init__.py +0 -0
  137. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/figures/financials/financial_analysis_charts.py +0 -0
  138. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/figures/financials/financials_charts.py +0 -0
  139. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/filters/__init__.py +0 -0
  140. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/filters/classifications.py +0 -0
  141. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/filters/exchanges.py +0 -0
  142. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/filters/financials.py +0 -0
  143. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/filters/financials_analysis.py +0 -0
  144. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/filters/instrument_prices.py +0 -0
  145. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/filters/instruments.py +0 -0
  146. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/filters/utils.py +0 -0
  147. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/import_export/__init__.py +0 -0
  148. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/import_export/backends/__init__.py +0 -0
  149. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/import_export/backends/cbinsights/__init__.py +0 -0
  150. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/import_export/backends/cbinsights/deals.py +0 -0
  151. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/import_export/backends/cbinsights/equities.py +0 -0
  152. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/import_export/backends/cbinsights/mixin.py +0 -0
  153. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/import_export/backends/cbinsights/utils/__init__.py +0 -0
  154. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/import_export/backends/cbinsights/utils/classifications.py +0 -0
  155. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/import_export/backends/cbinsights/utils/client.py +0 -0
  156. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/import_export/backends/refinitiv/__init__.py +0 -0
  157. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/import_export/backends/refinitiv/daily_fundamental.py +0 -0
  158. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/import_export/backends/refinitiv/fiscal_period.py +0 -0
  159. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/import_export/backends/refinitiv/forecast.py +0 -0
  160. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/import_export/backends/refinitiv/fundamental.py +0 -0
  161. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/import_export/backends/refinitiv/geographic_segment.py +0 -0
  162. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/import_export/backends/refinitiv/instrument.py +0 -0
  163. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/import_export/backends/refinitiv/instrument_price.py +0 -0
  164. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/import_export/backends/refinitiv/mixin.py +0 -0
  165. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/import_export/backends/refinitiv/utils/__init__.py +0 -0
  166. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/import_export/backends/refinitiv/utils/controller.py +0 -0
  167. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/import_export/handlers/__init__.py +0 -0
  168. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/import_export/handlers/instrument.py +0 -0
  169. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/import_export/handlers/instrument_list.py +0 -0
  170. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/import_export/handlers/instrument_price.py +0 -0
  171. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/import_export/handlers/option.py +0 -0
  172. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/import_export/handlers/private_equities.py +0 -0
  173. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/import_export/parsers/__init__.py +0 -0
  174. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/import_export/parsers/cbinsights/__init__.py +0 -0
  175. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/import_export/parsers/cbinsights/deals.py +0 -0
  176. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/import_export/parsers/cbinsights/equities.py +0 -0
  177. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/import_export/parsers/cbinsights/fundamentals.py +0 -0
  178. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/import_export/parsers/refinitiv/__init__.py +0 -0
  179. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/import_export/parsers/refinitiv/daily_fundamental.py +0 -0
  180. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/import_export/parsers/refinitiv/forecast.py +0 -0
  181. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/import_export/parsers/refinitiv/fundamental.py +0 -0
  182. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/import_export/parsers/refinitiv/geographic_segment.py +0 -0
  183. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/import_export/parsers/refinitiv/instrument.py +0 -0
  184. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/import_export/parsers/refinitiv/instrument_price.py +0 -0
  185. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/import_export/parsers/refinitiv/utils.py +0 -0
  186. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/import_export/resources/__init__.py +0 -0
  187. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/import_export/resources/classification.py +0 -0
  188. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/import_export/resources/instrument_prices.py +0 -0
  189. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/import_export/resources/instruments.py +0 -0
  190. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/jinja2.py +0 -0
  191. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/management/__init__.py +0 -0
  192. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/menu.py +0 -0
  193. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/migrations/0001_initial.py +0 -0
  194. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/migrations/0002_rename_statements_instrumentlookup_financials_and_more.py +0 -0
  195. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/migrations/0003_instrument_estimate_backend_and_more.py +0 -0
  196. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/migrations/0004_rename_financials_instrumentlookup_statements_and_more.py +0 -0
  197. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/migrations/0005_instrument_corporate_action_backend.py +0 -0
  198. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/migrations/0006_instrument_officer_backend.py +0 -0
  199. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/migrations/0007_instrument_country_instrument_currency_and_more.py +0 -0
  200. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/migrations/0008_controversy.py +0 -0
  201. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/migrations/0009_alter_controversy_flag_alter_controversy_initiated_and_more.py +0 -0
  202. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/migrations/0010_classification_classificationgroup_deal_exchange_and_more.py +0 -0
  203. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/migrations/0011_delete_instrumentlookup_instrument_corporate_actions_and_more.py +0 -0
  204. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/migrations/0012_instrumentprice_created_instrumentprice_modified.py +0 -0
  205. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/migrations/0013_instrument_is_investable_universe_and_more.py +0 -0
  206. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/migrations/0014_alter_controversy_instrument.py +0 -0
  207. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/migrations/0015_instrument_instrument_investible_index.py +0 -0
  208. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/migrations/0016_instrumenttype_name_repr.py +0 -0
  209. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/migrations/0017_instrument_instrument_security_index.py +0 -0
  210. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/migrations/0018_instrument_instrument_level_index.py +0 -0
  211. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/migrations/0019_alter_controversy_source.py +0 -0
  212. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/migrations/0020_optionaggregate_option_and_more.py +0 -0
  213. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/migrations/0021_delete_instrumentdailystatistics.py +0 -0
  214. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/migrations/0022_instrument_cusip_option_open_interest_20d_and_more.py +0 -0
  215. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/migrations/0023_instrument_unique_ric_instrument_unique_rmc_and_more.py +0 -0
  216. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/migrations/0024_option_open_interest_10d_option_volume_10d_and_more.py +0 -0
  217. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/migrations/0025_instrument_is_primary_and_more.py +0 -0
  218. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/migrations/0026_instrument_is_cash_equivalent.py +0 -0
  219. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/migrations/0027_remove_instrument_unique_ric_and_more.py +0 -0
  220. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/migrations/0028_instrumentprice_annualized_daily_volatility.py +0 -0
  221. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/migrations/0029_alter_instrumentprice_volume.py +0 -0
  222. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/migrations/0030_alter_relatedinstrumentthroughmodel_related_type.py +0 -0
  223. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/migrations/__init__.py +0 -0
  224. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/models/__init__.py +0 -0
  225. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/models/esg/__init__.py +0 -0
  226. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/models/esg/controversies.py +0 -0
  227. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/models/exchanges/__init__.py +0 -0
  228. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/models/exchanges/exchanges.py +0 -0
  229. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/models/fields.py +0 -0
  230. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/models/fk_fields.py +0 -0
  231. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/models/indicators.py +0 -0
  232. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/models/instruments/__init__.py +0 -0
  233. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/models/instruments/classifications.py +0 -0
  234. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/models/instruments/instrument_lists.py +0 -0
  235. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/models/instruments/instrument_relationships.py +0 -0
  236. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/models/instruments/instrument_requests.py +0 -0
  237. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/models/instruments/llm/__init__.py +0 -0
  238. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/models/instruments/llm/create_instrument_news_relationships.py +0 -0
  239. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/models/instruments/mixin/__init__.py +0 -0
  240. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/models/instruments/mixin/financials_computed.py +0 -0
  241. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/models/instruments/mixin/financials_serializer_fields.py +0 -0
  242. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/models/instruments/options.py +0 -0
  243. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/models/instruments/private_equities.py +0 -0
  244. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/models/instruments/utils.py +0 -0
  245. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/preferences.py +0 -0
  246. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/serializers/__init__.py +0 -0
  247. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/serializers/esg.py +0 -0
  248. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/serializers/exchanges.py +0 -0
  249. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/serializers/instruments/__init__.py +0 -0
  250. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/serializers/instruments/classifications.py +0 -0
  251. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/serializers/instruments/instrument_lists.py +0 -0
  252. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/serializers/instruments/instrument_prices.py +0 -0
  253. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/serializers/instruments/instrument_relationships.py +0 -0
  254. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/serializers/instruments/instrument_requests.py +0 -0
  255. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/serializers/instruments/instruments.py +0 -0
  256. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/serializers/instruments/mixins.py +0 -0
  257. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/serializers/officers.py +0 -0
  258. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/signals.py +0 -0
  259. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/sync/__init__.py +0 -0
  260. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/sync/abstract.py +0 -0
  261. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/sync/runner.py +0 -0
  262. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/tests/__init__.py +0 -0
  263. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/tests/analysis/__init__.py +0 -0
  264. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/tests/analysis/financial_analysis/__init__.py +0 -0
  265. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/tests/analysis/financial_analysis/test_statement_with_estimates.py +0 -0
  266. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/tests/analysis/financial_analysis/test_utils.py +0 -0
  267. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/tests/analysis/test_esg.py +0 -0
  268. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/tests/conftest.py +0 -0
  269. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/tests/dataloaders/__init__.py +0 -0
  270. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/tests/dataloaders/test_cache.py +0 -0
  271. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/tests/models/__init__.py +0 -0
  272. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/tests/models/test_classifications.py +0 -0
  273. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/tests/models/test_exchanges.py +0 -0
  274. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/tests/models/test_instrument_list.py +0 -0
  275. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/tests/models/test_instrument_prices.py +0 -0
  276. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/tests/models/test_merge.py +0 -0
  277. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/tests/models/test_options.py +0 -0
  278. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/tests/test_tasks.py +0 -0
  279. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/tests/tests.py +0 -0
  280. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/urls.py +0 -0
  281. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/utils.py +0 -0
  282. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/viewsets/__init__.py +0 -0
  283. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/viewsets/configs/__init__.py +0 -0
  284. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/viewsets/configs/buttons/__init__.py +0 -0
  285. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/viewsets/configs/buttons/classifications.py +0 -0
  286. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/viewsets/configs/buttons/exchanges.py +0 -0
  287. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/viewsets/configs/buttons/instrument_prices.py +0 -0
  288. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/viewsets/configs/buttons/instruments.py +0 -0
  289. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/viewsets/configs/display/__init__.py +0 -0
  290. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/viewsets/configs/display/classifications.py +0 -0
  291. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/viewsets/configs/display/esg.py +0 -0
  292. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/viewsets/configs/display/exchanges.py +0 -0
  293. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/viewsets/configs/display/financial_summary.py +0 -0
  294. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/viewsets/configs/display/instrument_lists.py +0 -0
  295. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/viewsets/configs/display/instrument_prices.py +0 -0
  296. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/viewsets/configs/display/instrument_requests.py +0 -0
  297. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/viewsets/configs/display/instruments.py +0 -0
  298. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/viewsets/configs/display/instruments_relationships.py +0 -0
  299. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/viewsets/configs/display/monthly_performances.py +0 -0
  300. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/viewsets/configs/display/officers.py +0 -0
  301. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/viewsets/configs/display/prices.py +0 -0
  302. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/viewsets/configs/display/statement_with_estimates.py +0 -0
  303. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/viewsets/configs/display/statements.py +0 -0
  304. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/viewsets/configs/endpoints/__init__.py +0 -0
  305. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/viewsets/configs/endpoints/classifications.py +0 -0
  306. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/viewsets/configs/endpoints/esg.py +0 -0
  307. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/viewsets/configs/endpoints/exchanges.py +0 -0
  308. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/viewsets/configs/endpoints/financials_analysis.py +0 -0
  309. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/viewsets/configs/endpoints/instrument_lists.py +0 -0
  310. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/viewsets/configs/endpoints/instrument_prices.py +0 -0
  311. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/viewsets/configs/endpoints/instrument_requests.py +0 -0
  312. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/viewsets/configs/endpoints/instruments.py +0 -0
  313. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/viewsets/configs/endpoints/instruments_relationships.py +0 -0
  314. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/viewsets/configs/endpoints/statements.py +0 -0
  315. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/viewsets/configs/menus/__init__.py +0 -0
  316. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/viewsets/configs/menus/classifications.py +0 -0
  317. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/viewsets/configs/menus/exchanges.py +0 -0
  318. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/viewsets/configs/menus/instrument_lists.py +0 -0
  319. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/viewsets/configs/menus/instruments.py +0 -0
  320. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/viewsets/configs/menus/instruments_relationships.py +0 -0
  321. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/viewsets/configs/titles/__init__.py +0 -0
  322. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/viewsets/configs/titles/classifications.py +0 -0
  323. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/viewsets/configs/titles/esg.py +0 -0
  324. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/viewsets/configs/titles/exchanges.py +0 -0
  325. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/viewsets/configs/titles/financial_ratio_analysis.py +0 -0
  326. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/viewsets/configs/titles/financials_analysis.py +0 -0
  327. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/viewsets/configs/titles/instrument_prices.py +0 -0
  328. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/viewsets/configs/titles/instrument_requests.py +0 -0
  329. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/viewsets/configs/titles/instruments.py +0 -0
  330. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/viewsets/configs/titles/instruments_relationships.py +0 -0
  331. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/viewsets/configs/titles/market_data.py +0 -0
  332. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/viewsets/configs/titles/prices.py +0 -0
  333. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/viewsets/configs/titles/statement_with_estimates.py +0 -0
  334. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/viewsets/esg.py +0 -0
  335. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/viewsets/exchanges.py +0 -0
  336. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/viewsets/financial_analysis/__init__.py +0 -0
  337. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/viewsets/financial_analysis/financial_metric_analysis.py +0 -0
  338. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/viewsets/financial_analysis/financial_ratio_analysis.py +0 -0
  339. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/viewsets/financial_analysis/financial_summary.py +0 -0
  340. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/viewsets/financial_analysis/statement_with_estimates.py +0 -0
  341. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/viewsets/instruments/__init__.py +0 -0
  342. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/viewsets/instruments/classifications.py +0 -0
  343. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/viewsets/instruments/financials_analysis.py +0 -0
  344. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/viewsets/instruments/instrument_lists.py +0 -0
  345. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/viewsets/instruments/instrument_prices.py +0 -0
  346. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/viewsets/instruments/instrument_requests.py +0 -0
  347. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/viewsets/instruments/instruments.py +0 -0
  348. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/viewsets/instruments/instruments_relationships.py +0 -0
  349. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/viewsets/instruments/utils.py +0 -0
  350. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/viewsets/market_data.py +0 -0
  351. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/viewsets/mixins.py +0 -0
  352. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/viewsets/officers.py +0 -0
  353. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/viewsets/prices.py +0 -0
  354. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/viewsets/statements/__init__.py +0 -0
  355. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/viewsets/statements/statements.py +0 -0
  356. {wbfdm-1.46.8 → wbfdm-1.46.10}/wbfdm/viewsets/technical_analysis/__init__.py +0 -0
  357. {wbfdm-1.46.8 → wbfdm-1.46.10}/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.46.8
3
+ Version: 1.46.10
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.*
@@ -408,16 +408,17 @@ class InstrumentPrice(
408
408
  )
409
409
 
410
410
  def compute_and_update_statistics(self, min_period: int = 20):
411
- prices_df = (
411
+ df = (
412
412
  pd.DataFrame(
413
413
  InstrumentPrice.objects.filter_only_valid_prices()
414
414
  .filter(instrument=self.instrument, date__lte=self.date)
415
- .values_list("date", "net_value"),
416
- columns=["date", "net_value"],
415
+ .values_list("date", "net_value", "volume"),
416
+ columns=["date", "net_value", "volume"],
417
417
  )
418
418
  .set_index("date")
419
- .sort_index()["net_value"]
419
+ .sort_index()
420
420
  )
421
+ prices_df = df["net_value"]
421
422
  if not prices_df.empty and prices_df.shape[0] >= min_period:
422
423
  financial_statistics = FinancialStatistics(prices_df)
423
424
  min_date = prices_df.index.min()
@@ -451,6 +452,9 @@ class InstrumentPrice(
451
452
  self.correlation = correlation
452
453
 
453
454
  self.annualized_daily_volatility = financial_statistics.get_annualized_daily_volatility()
455
+ if not (volume_df := df["volume"]).empty:
456
+ self.volume_50d = volume_df.tail(50).mean()
457
+ self.volume_200d = volume_df.tail(200).mean()
454
458
 
455
459
  @classmethod
456
460
  def subquery_closest_value(
@@ -844,7 +844,7 @@ class Instrument(ComplexToStringMixin, TagModelMixin, ImportMixin, InstrumentPMS
844
844
  def technical_benchmark_analysis(self, from_date: date | None = None, to_date: date | None = None):
845
845
  return TechnicalAnalysis.init_close_from_instrument(self, from_date, to_date)
846
846
 
847
- def get_price_objects(self, start: date | None = None, end: date | None = None, clear: bool = False):
847
+ def import_prices(self, start: date | None = None, end: date | None = None, **kwargs):
848
848
  if not self.is_leaf_node():
849
849
  raise ValueError("Cannot import price on a non-leaf node")
850
850
  if not start:
@@ -861,11 +861,8 @@ class Instrument(ComplexToStringMixin, TagModelMixin, ImportMixin, InstrumentPMS
861
861
  # we detect when was the last date price imported before start and switch the start date from there
862
862
  with suppress(ObjectDoesNotExist):
863
863
  start = self.prices.filter(date__lte=start).latest("date").date
864
- yield from self._get_price_objects(start, end, clear=clear)
865
-
866
- def import_prices(self, start: date | None = None, end: date | None = None, clear: bool = False):
867
864
  # Import instrument prices
868
- objs = list(self.get_price_objects(start=start, end=end, clear=clear))
865
+ objs = list(self.__class__.objects.filter(id=self.id).get_instrument_prices_from_market_data(start, end))
869
866
  self.bulk_save_instrument_prices(objs)
870
867
  # compute daily statistics & performances
871
868
  self.update_last_valuation_date()
@@ -1,15 +1,12 @@
1
1
  import calendar
2
- import math
3
2
  from collections import defaultdict
4
- from contextlib import suppress
5
- from datetime import date, timedelta
3
+ from datetime import date
6
4
  from decimal import Decimal
7
- from typing import Dict, Iterable, Optional
5
+ from typing import Dict, Optional
8
6
 
9
7
  import numpy as np
10
8
  import pandas as pd
11
9
  from pandas.tseries.offsets import BDay
12
- from wbcore.contrib.currency.models import CurrencyFXRates
13
10
 
14
11
  from wbfdm.analysis.financial_analysis.financial_statistics_analysis import (
15
12
  FinancialStatistics,
@@ -199,91 +196,6 @@ class InstrumentPMSMixin:
199
196
 
200
197
  return df
201
198
 
202
- def _get_price_objects(self, from_date: date, to_date: date, clear: bool = False) -> Iterable[InstrumentPrice]:
203
- df = pd.DataFrame(
204
- self.__class__.objects.filter(id=self.id).dl.market_data(
205
- from_date=from_date
206
- - timedelta(
207
- days=90
208
- ), # we make sure to at least import the last 80 days to be sure to be able to compute the volume 50d
209
- to_date=to_date,
210
- values=[MarketData.CLOSE, MarketData.VOLUME, MarketData.MARKET_CAPITALIZATION],
211
- )
212
- )
213
- if not df.empty:
214
- df["calculated"] = False
215
- df = df.set_index("valuation_date").sort_index()
216
-
217
- # # if market cap is not found, maybe we have better chance on the primary exhange
218
- if not df.market_capitalization.notnull().any() and self.parent and (company := self.parent.get_root()):
219
- with suppress(KeyError):
220
- df["market_capitalization"] = pd.DataFrame(
221
- self.__class__.objects.filter(id=company.id).dl.market_data(
222
- from_date=from_date,
223
- to_date=to_date,
224
- values=[MarketData.MARKET_CAPITALIZATION],
225
- )
226
- ).set_index("valuation_date")["market_capitalization"]
227
-
228
- ts = pd.date_range(df.index.min(), df.index.max(), freq="B")
229
- # fill forward missing data
230
- df = df.reindex(ts)
231
- df[["close", "market_capitalization"]] = df[["close", "market_capitalization"]].astype(float).ffill()
232
- df.volume = df.volume.astype(float).fillna(0)
233
- df.calculated = df.calculated.astype(bool).fillna(
234
- True
235
- ) # we do not ffill calculated but set the to True to mark them as "estimated"/"not real"
236
- df["volume_50d"] = df["volume"].rolling(50).mean()
237
- df = df[df.index.date >= from_date] # we import only from the requested from_date
238
- df = df.reset_index().dropna(subset=["index", "close"])
239
- df = df.replace([np.inf, -np.inf, np.nan], None)
240
-
241
- for row in df.to_dict("records"):
242
- if (_date := row.get("index")) and (close := row.get("close", None)):
243
- # we make sure data does not exist 10 digits (for db constraint)
244
- if int(math.log10(close)) + 1 < 10:
245
- try:
246
- try:
247
- p = InstrumentPrice.objects.get(instrument=self, date=_date, calculated=False)
248
- except InstrumentPrice.DoesNotExist:
249
- p = InstrumentPrice.objects.get(instrument=self, date=_date, calculated=True)
250
-
251
- # update only if net value is different with existing instrument price
252
- if (
253
- round(p.net_value, 2) != round(close, 2)
254
- or (p.market_capitalization != row.get("market_capitalization"))
255
- or (p.volume != row.get("volume"))
256
- or (p.calculated != row.get("calculated"))
257
- or clear
258
- ):
259
- p.net_value = close
260
- p.gross_value = close
261
- p.calculated = row["calculated"]
262
- p.volume = row.get("volume", p.volume)
263
- p.volume_50d = row.get("volume_50d", p.volume_50d)
264
- p.market_capitalization = row.get("market_capitalization", p.market_capitalization)
265
- p.market_capitalization_consolidated = p.market_capitalization
266
- p.set_dynamic_field(False)
267
- p.id = None
268
- yield p
269
- except InstrumentPrice.DoesNotExist:
270
- with suppress(CurrencyFXRates.DoesNotExist):
271
- p = InstrumentPrice(
272
- currency_fx_rate_to_usd=CurrencyFXRates.objects.get( # we need to get the currency rate because we bulk create the object, and thus save is not called
273
- date=_date, currency=self.currency
274
- ),
275
- instrument=self,
276
- date=_date,
277
- calculated=row["calculated"],
278
- net_value=close,
279
- gross_value=close,
280
- volume=row.get("volume", None),
281
- market_capitalization=row.get("market_capitalization", None),
282
- volume_50d=row.get("volume_50d", None),
283
- )
284
- p.set_dynamic_field(False)
285
- yield p
286
-
287
199
  @classmethod
288
200
  def bulk_save_instrument_prices(cls, objs):
289
201
  InstrumentPrice.objects.bulk_create(
@@ -297,7 +209,6 @@ class InstrumentPMSMixin:
297
209
  "market_capitalization",
298
210
  "market_capitalization_consolidated",
299
211
  "calculated",
300
- "volume_50d",
301
212
  ],
302
213
  batch_size=1000,
303
214
  )
@@ -0,0 +1,156 @@
1
+ import math
2
+ from contextlib import suppress
3
+ from datetime import date
4
+
5
+ import numpy as np
6
+ import pandas as pd
7
+ from django.db.models import (
8
+ AutoField,
9
+ Exists,
10
+ ExpressionWrapper,
11
+ F,
12
+ OuterRef,
13
+ QuerySet,
14
+ Subquery,
15
+ )
16
+ from django.db.models.functions import Coalesce
17
+ from wbcore.contrib.currency.models import CurrencyFXRates
18
+
19
+ from wbfdm.enums import MarketData
20
+
21
+
22
+ class InstrumentQuerySet(QuerySet):
23
+ def annotate_classification_for_group(
24
+ self, classification_group, classification_height: int = 0, **kwargs
25
+ ) -> QuerySet:
26
+ return classification_group.annotate_queryset(
27
+ self, classification_height, "", annotation_label="ancestor_classifications", **kwargs
28
+ )
29
+
30
+ def annotate_base_data(self):
31
+ base_qs = InstrumentQuerySet(self.model, using=self._db)
32
+ return self.annotate(
33
+ is_investable=~Exists(base_qs.filter(parent=OuterRef("pk"))),
34
+ root=Subquery(base_qs.filter(tree_id=OuterRef("tree_id"), level=0).values("id")[:1]),
35
+ primary_security=ExpressionWrapper(
36
+ Coalesce(
37
+ Subquery(
38
+ base_qs.filter(
39
+ parent=OuterRef("pk"),
40
+ is_primary=True,
41
+ is_security=True,
42
+ ).values("id")[:1]
43
+ ),
44
+ F("id"),
45
+ ),
46
+ output_field=AutoField(),
47
+ ),
48
+ primary_quote=ExpressionWrapper(
49
+ Coalesce(
50
+ Subquery(
51
+ base_qs.filter(
52
+ parent=OuterRef("primary_security"),
53
+ is_primary=True,
54
+ ).values("id")[:1]
55
+ ),
56
+ F("primary_security"),
57
+ ),
58
+ output_field=AutoField(),
59
+ ),
60
+ )
61
+
62
+ def annotate_all(self):
63
+ return self.annotate_base_data()
64
+
65
+ @property
66
+ def dl(self):
67
+ """Provides access to the dataloader proxy for the entities in the QuerySet.
68
+
69
+ This method allows for easy retrieval of the DataloaderProxy instance
70
+ associated with the QuerySet. It enables the utilization of dataloader
71
+ functionalities directly from the QuerySet, facilitating data fetching and
72
+ processing tasks.
73
+
74
+ Returns:
75
+ DataloaderProxy: An instance of DataloaderProxy associated with the
76
+ entities in the QuerySet.
77
+ """
78
+ return self.model.dl_proxy(self)
79
+
80
+ def get_instrument_prices_from_market_data(self, from_date: date, to_date: date):
81
+ from wbfdm.models import InstrumentPrice
82
+
83
+ def _dict_to_object(instrument, row):
84
+ if (
85
+ (price_date := row.get("date"))
86
+ and (close := row.get("close", None))
87
+ and int(math.log10(close)) + 1 < 10
88
+ ):
89
+ try:
90
+ try:
91
+ p = InstrumentPrice.objects.get(instrument=instrument, date=price_date, calculated=False)
92
+ except InstrumentPrice.DoesNotExist:
93
+ p = InstrumentPrice.objects.get(instrument=instrument, date=price_date, calculated=True)
94
+ p.net_value = close
95
+ p.gross_value = close
96
+ p.calculated = row["calculated"]
97
+ p.volume = row.get("volume", p.volume)
98
+ p.market_capitalization = row.get("market_capitalization", p.market_capitalization)
99
+ p.market_capitalization_consolidated = p.market_capitalization
100
+ p.set_dynamic_field(False)
101
+ p.id = None
102
+ return p
103
+ except InstrumentPrice.DoesNotExist:
104
+ with suppress(CurrencyFXRates.DoesNotExist):
105
+ p = InstrumentPrice(
106
+ currency_fx_rate_to_usd=CurrencyFXRates.objects.get(
107
+ # we need to get the currency rate because we bulk create the object, and thus save is not called
108
+ date=price_date,
109
+ currency=instrument.currency,
110
+ ),
111
+ instrument=instrument,
112
+ date=price_date,
113
+ calculated=row["calculated"],
114
+ net_value=close,
115
+ gross_value=close,
116
+ volume=row.get("volume", None),
117
+ market_capitalization=row.get("market_capitalization", None),
118
+ )
119
+ p.set_dynamic_field(False)
120
+ return p
121
+
122
+ df = pd.DataFrame(
123
+ self.dl.market_data(
124
+ from_date=from_date,
125
+ to_date=to_date,
126
+ values=[MarketData.CLOSE, MarketData.VOLUME, MarketData.MARKET_CAPITALIZATION],
127
+ )
128
+ )
129
+ if not df.empty:
130
+ df["valuation_date"] = pd.to_datetime(df["valuation_date"])
131
+ df = df.rename(columns={"valuation_date": "date"}).set_index(["instrument_id", "date"]).sort_index()
132
+ df = df.drop(columns=df.columns.difference(["calculated", "close", "market_capitalization", "volume"]))
133
+ df["calculated"] = False
134
+ idx = pd.MultiIndex.from_product(
135
+ [
136
+ df.index.levels[0],
137
+ pd.date_range(
138
+ df.index.get_level_values("date").min(), df.index.get_level_values("date").max(), freq="B"
139
+ ),
140
+ ],
141
+ names=["instrument_id", "date"],
142
+ )
143
+ df = df.reindex(idx)
144
+ df[["close", "market_capitalization"]] = df[["close", "market_capitalization"]].astype(float).ffill()
145
+ df.volume = df.volume.astype(float).fillna(0)
146
+ df.calculated = df.calculated.astype(bool).fillna(
147
+ True
148
+ ) # we do not ffill calculated but set the to True to mark them as "estimated"/"not real"
149
+ df = df.reset_index("date").dropna(subset=["close"])
150
+ df = df.replace([np.inf, -np.inf, np.nan], None)
151
+
152
+ for instrument_id, dff in df.groupby(level=0):
153
+ instrument = self.get(id=instrument_id)
154
+ yield from filter(
155
+ lambda x: x, map(lambda row: _dict_to_object(instrument, row), dff.to_dict("records"))
156
+ )
@@ -19,7 +19,10 @@ from .signals import investable_universe_updated
19
19
 
20
20
  @shared_task(queue="portfolio")
21
21
  def update_of_investable_universe_data(
22
- start: date | None = None, end: date | None = None, clear: bool = False, with_background_tasks: bool = True
22
+ start: date | None = None,
23
+ end: date | None = None,
24
+ with_background_tasks: bool = True,
25
+ instrument_ids: list[int] | None = None,
23
26
  ):
24
27
  """
25
28
  Update the investable universe data on a daily basis.
@@ -27,6 +30,8 @@ def update_of_investable_universe_data(
27
30
  Parameters:
28
31
  - start (date | None): The start date for updating data. If None, defaults to three business days before 'end'.
29
32
  - end (date | None): The end date for updating data. If None, defaults to the current date.
33
+ - with_background_tasks (bool | True): If true, will trigger the post import background tasks automatically.
34
+ - instrument_ids (list[int] | None): if specified, narrow down the instrument queryset with this list ids
30
35
 
31
36
  Notes:
32
37
  - The function resets the investable universe by marking all instruments as not in the investable universe.
@@ -51,12 +56,9 @@ def update_of_investable_universe_data(
51
56
  Q(is_managed=True)
52
57
  | Q(dl_parameters__market_data__path="wbfdm.contrib.internal.dataloaders.market_data.MarketDataDataloader")
53
58
  ) # we exclude product and index managed to avoid circular import
54
- prices = []
55
- for instrument in tqdm(instruments, total=instruments.count()):
56
- try:
57
- prices.extend(list(instrument.get_price_objects(start=start, end=end, clear=clear)))
58
- except Exception as e:
59
- print(f"Connection error while processing instrument {instrument}: {str(e)}") # noqa
59
+ if instrument_ids:
60
+ instruments = instruments.filter(id__in=instrument_ids)
61
+ prices = list(instruments.get_instrument_prices_from_market_data(start, end))
60
62
  Instrument.bulk_save_instrument_prices(prices)
61
63
  investable_universe_updated.send(sender=Instrument, end_date=end)
62
64
  if with_background_tasks:
@@ -105,5 +107,7 @@ def daily_update_instrument_price_statistics(from_date: date = None, to_date: da
105
107
  p.compute_and_update_statistics()
106
108
  objs.append(p)
107
109
  InstrumentPrice.objects.bulk_update(
108
- objs, fields=["sharpe_ratio", "correlation", "beta", "annualized_daily_volatility"], batch_size=1000
110
+ objs,
111
+ fields=["sharpe_ratio", "correlation", "beta", "annualized_daily_volatility", "volume_50d", "volume_200d"],
112
+ batch_size=1000,
109
113
  )
@@ -157,12 +157,14 @@ class TestInstrumentModel:
157
157
  "close": 1,
158
158
  "volume": 1,
159
159
  "market_capitalization": 1,
160
+ "instrument_id": instrument.id,
160
161
  },
161
162
  {
162
163
  "valuation_date": to_date,
163
164
  "close": 2,
164
165
  "volume": 2,
165
166
  "market_capitalization": 2,
167
+ "instrument_id": instrument.id,
166
168
  },
167
169
  ]
168
170
  instrument.import_prices(from_date, to_date + timedelta(days=1))
@@ -1,73 +0,0 @@
1
- from django.db.models import (
2
- AutoField,
3
- Exists,
4
- ExpressionWrapper,
5
- F,
6
- OuterRef,
7
- QuerySet,
8
- Subquery,
9
- )
10
- from django.db.models.functions import Coalesce
11
-
12
-
13
- class InstrumentQuerySet(QuerySet):
14
- def annotate_classification_for_group(
15
- self, classification_group, classification_height: int = 0, **kwargs
16
- ) -> QuerySet:
17
- return classification_group.annotate_queryset(
18
- self, classification_height, "", annotation_label="ancestor_classifications", **kwargs
19
- )
20
-
21
- def annotate_base_data(self):
22
- base_qs = InstrumentQuerySet(self.model, using=self._db)
23
- return self.annotate(
24
- is_investable=~Exists(base_qs.filter(parent=OuterRef("pk"))),
25
- root=Subquery(base_qs.filter(tree_id=OuterRef("tree_id"), level=0).values("id")[:1]),
26
- primary_security=ExpressionWrapper(
27
- Coalesce(
28
- Subquery(
29
- base_qs.filter(
30
- parent=OuterRef("pk"),
31
- is_primary=True,
32
- is_security=True,
33
- ).values(
34
- "id"
35
- )[:1]
36
- ),
37
- F("id"),
38
- ),
39
- output_field=AutoField(),
40
- ),
41
- primary_quote=ExpressionWrapper(
42
- Coalesce(
43
- Subquery(
44
- base_qs.filter(
45
- parent=OuterRef("primary_security"),
46
- is_primary=True,
47
- ).values(
48
- "id"
49
- )[:1]
50
- ),
51
- F("primary_security"),
52
- ),
53
- output_field=AutoField(),
54
- ),
55
- )
56
-
57
- def annotate_all(self):
58
- return self.annotate_base_data()
59
-
60
- @property
61
- def dl(self):
62
- """Provides access to the dataloader proxy for the entities in the QuerySet.
63
-
64
- This method allows for easy retrieval of the DataloaderProxy instance
65
- associated with the QuerySet. It enables the utilization of dataloader
66
- functionalities directly from the QuerySet, facilitating data fetching and
67
- processing tasks.
68
-
69
- Returns:
70
- DataloaderProxy: An instance of DataloaderProxy associated with the
71
- entities in the QuerySet.
72
- """
73
- return self.model.dl_proxy(self)
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