PageRenderTime 25ms CodeModel.GetById 13ms RepoModel.GetById 1ms app.codeStats 0ms

/tests/pipeline/test_buyback_auth.py

https://gitlab.com/lbennett/zipline
Python | 227 lines | 184 code | 26 blank | 17 comment | 4 complexity | ec73c78bd1ad5df1c05c7656725ab9b2 MD5 | raw file
  1. """
  2. Tests for the reference loader for Buyback Authorizations.
  3. """
  4. import blaze as bz
  5. from blaze.compute.core import swap_resources_into_scope
  6. import pandas as pd
  7. from six import iteritems
  8. from zipline.pipeline.common import(
  9. BUYBACK_ANNOUNCEMENT_FIELD_NAME,
  10. CASH_FIELD_NAME,
  11. DAYS_SINCE_PREV,
  12. PREVIOUS_BUYBACK_ANNOUNCEMENT,
  13. PREVIOUS_BUYBACK_CASH,
  14. PREVIOUS_BUYBACK_SHARE_COUNT,
  15. SHARE_COUNT_FIELD_NAME,
  16. SID_FIELD_NAME,
  17. TS_FIELD_NAME
  18. )
  19. from zipline.pipeline.data import (
  20. CashBuybackAuthorizations,
  21. ShareBuybackAuthorizations
  22. )
  23. from zipline.pipeline.factors.events import (
  24. BusinessDaysSinceCashBuybackAuth,
  25. BusinessDaysSinceShareBuybackAuth
  26. )
  27. from zipline.pipeline.loaders.buyback_auth import (
  28. CashBuybackAuthorizationsLoader,
  29. ShareBuybackAuthorizationsLoader
  30. )
  31. from zipline.pipeline.loaders.blaze import (
  32. BlazeCashBuybackAuthorizationsLoader,
  33. BlazeShareBuybackAuthorizationsLoader,
  34. )
  35. from zipline.pipeline.loaders.utils import (
  36. zip_with_floats,
  37. zip_with_dates
  38. )
  39. from zipline.testing.fixtures import (
  40. WithPipelineEventDataLoader, ZiplineTestCase
  41. )
  42. date_intervals = [
  43. [['2014-01-01', '2014-01-04'], ['2014-01-05', '2014-01-09'],
  44. ['2014-01-10', '2014-01-31']]
  45. ]
  46. buyback_authorizations_cases = [
  47. pd.DataFrame({
  48. SHARE_COUNT_FIELD_NAME: [1, 15],
  49. CASH_FIELD_NAME: [10, 20],
  50. TS_FIELD_NAME: pd.to_datetime(['2014-01-05', '2014-01-10']),
  51. BUYBACK_ANNOUNCEMENT_FIELD_NAME: pd.to_datetime(['2014-01-04',
  52. '2014-01-09'])
  53. }),
  54. pd.DataFrame(
  55. columns=[SHARE_COUNT_FIELD_NAME,
  56. CASH_FIELD_NAME,
  57. BUYBACK_ANNOUNCEMENT_FIELD_NAME,
  58. TS_FIELD_NAME],
  59. dtype='datetime64[ns]'
  60. ),
  61. ]
  62. class CashBuybackAuthLoaderTestCase(WithPipelineEventDataLoader,
  63. ZiplineTestCase):
  64. """
  65. Test for cash buyback authorizations dataset.
  66. """
  67. pipeline_columns = {
  68. PREVIOUS_BUYBACK_CASH:
  69. CashBuybackAuthorizations.cash_amount.latest,
  70. PREVIOUS_BUYBACK_ANNOUNCEMENT:
  71. CashBuybackAuthorizations.announcement_date.latest,
  72. DAYS_SINCE_PREV:
  73. BusinessDaysSinceCashBuybackAuth(),
  74. }
  75. @classmethod
  76. def get_sids(cls):
  77. return range(2)
  78. @classmethod
  79. def get_dataset(cls):
  80. return {sid:
  81. frame.drop(SHARE_COUNT_FIELD_NAME, axis=1)
  82. for sid, frame
  83. in enumerate(buyback_authorizations_cases)}
  84. loader_type = CashBuybackAuthorizationsLoader
  85. def setup(self, dates):
  86. cols = {
  87. PREVIOUS_BUYBACK_CASH: self.get_sids_to_frames(zip_with_floats,
  88. [['NaN', 10, 20]],
  89. date_intervals,
  90. dates),
  91. PREVIOUS_BUYBACK_ANNOUNCEMENT: self.get_sids_to_frames(
  92. zip_with_dates,
  93. [['NaT', '2014-01-04', '2014-01-09']],
  94. date_intervals,
  95. dates),
  96. }
  97. cols[DAYS_SINCE_PREV] = self._compute_busday_offsets(
  98. cols[PREVIOUS_BUYBACK_ANNOUNCEMENT]
  99. )
  100. return cols
  101. class ShareBuybackAuthLoaderTestCase(WithPipelineEventDataLoader,
  102. ZiplineTestCase):
  103. """
  104. Test for share buyback authorizations dataset.
  105. """
  106. pipeline_columns = {
  107. PREVIOUS_BUYBACK_SHARE_COUNT:
  108. ShareBuybackAuthorizations.share_count.latest,
  109. PREVIOUS_BUYBACK_ANNOUNCEMENT:
  110. ShareBuybackAuthorizations.announcement_date.latest,
  111. DAYS_SINCE_PREV:
  112. BusinessDaysSinceShareBuybackAuth(),
  113. }
  114. @classmethod
  115. def get_sids(cls):
  116. return range(2)
  117. @classmethod
  118. def get_dataset(cls):
  119. return {sid:
  120. frame.drop(CASH_FIELD_NAME, axis=1)
  121. for sid, frame
  122. in enumerate(buyback_authorizations_cases)}
  123. loader_type = ShareBuybackAuthorizationsLoader
  124. def setup(self, dates):
  125. cols = {PREVIOUS_BUYBACK_SHARE_COUNT:
  126. self.get_sids_to_frames(zip_with_floats,
  127. [['NaN', 1, 15]],
  128. date_intervals,
  129. dates,),
  130. PREVIOUS_BUYBACK_ANNOUNCEMENT:
  131. self.get_sids_to_frames(zip_with_dates,
  132. [['NaT', '2014-01-04', '2014-01-09']],
  133. date_intervals,
  134. dates,),
  135. }
  136. cols[DAYS_SINCE_PREV] = self._compute_busday_offsets(
  137. cols[PREVIOUS_BUYBACK_ANNOUNCEMENT]
  138. )
  139. return cols
  140. class BlazeCashBuybackAuthLoaderTestCase(CashBuybackAuthLoaderTestCase):
  141. """ Test case for loading via blaze.
  142. """
  143. loader_type = BlazeCashBuybackAuthorizationsLoader
  144. def pipeline_event_loader_args(self, dates):
  145. _, mapping = super(
  146. BlazeCashBuybackAuthLoaderTestCase,
  147. self,
  148. ).pipeline_event_loader_args(dates)
  149. return (bz.data(pd.concat(
  150. pd.DataFrame({
  151. BUYBACK_ANNOUNCEMENT_FIELD_NAME:
  152. frame[BUYBACK_ANNOUNCEMENT_FIELD_NAME],
  153. CASH_FIELD_NAME:
  154. frame[CASH_FIELD_NAME],
  155. TS_FIELD_NAME:
  156. frame[TS_FIELD_NAME],
  157. SID_FIELD_NAME: sid,
  158. })
  159. for sid, frame in iteritems(mapping)
  160. ).reset_index(drop=True)),)
  161. class BlazeShareBuybackAuthLoaderTestCase(ShareBuybackAuthLoaderTestCase):
  162. """ Test case for loading via blaze.
  163. """
  164. loader_type = BlazeShareBuybackAuthorizationsLoader
  165. def pipeline_event_loader_args(self, dates):
  166. _, mapping = super(
  167. BlazeShareBuybackAuthLoaderTestCase,
  168. self,
  169. ).pipeline_event_loader_args(dates)
  170. return (bz.data(pd.concat(
  171. pd.DataFrame({
  172. BUYBACK_ANNOUNCEMENT_FIELD_NAME:
  173. frame[BUYBACK_ANNOUNCEMENT_FIELD_NAME],
  174. SHARE_COUNT_FIELD_NAME:
  175. frame[SHARE_COUNT_FIELD_NAME],
  176. TS_FIELD_NAME:
  177. frame[TS_FIELD_NAME],
  178. SID_FIELD_NAME: sid,
  179. })
  180. for sid, frame in iteritems(mapping)
  181. ).reset_index(drop=True)),)
  182. class BlazeShareBuybackAuthLoaderNotInteractiveTestCase(
  183. BlazeShareBuybackAuthLoaderTestCase):
  184. """Test case for passing a non-interactive symbol and a dict of resources.
  185. """
  186. def pipeline_event_loader_args(self, dates):
  187. (bound_expr,) = super(
  188. BlazeShareBuybackAuthLoaderNotInteractiveTestCase,
  189. self,
  190. ).pipeline_event_loader_args(dates)
  191. return swap_resources_into_scope(bound_expr, {})
  192. class BlazeCashBuybackAuthLoaderNotInteractiveTestCase(
  193. BlazeCashBuybackAuthLoaderTestCase):
  194. """Test case for passing a non-interactive symbol and a dict of resources.
  195. """
  196. def pipeline_event_loader_args(self, dates):
  197. (bound_expr,) = super(
  198. BlazeCashBuybackAuthLoaderNotInteractiveTestCase,
  199. self,
  200. ).pipeline_event_loader_args(dates)
  201. return swap_resources_into_scope(bound_expr, {})