vectorbt 0.26.2__tar.gz → 0.27.0__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.
Files changed (114) hide show
  1. {vectorbt-0.26.2/vectorbt.egg-info → vectorbt-0.27.0}/PKG-INFO +3 -3
  2. {vectorbt-0.26.2 → vectorbt-0.27.0}/setup.py +2 -2
  3. {vectorbt-0.26.2 → vectorbt-0.27.0}/tests/test_indicators.py +6 -6
  4. {vectorbt-0.26.2 → vectorbt-0.27.0}/tests/test_portfolio.py +21 -21
  5. {vectorbt-0.26.2 → vectorbt-0.27.0}/tests/test_records.py +1 -1
  6. {vectorbt-0.26.2 → vectorbt-0.27.0}/tests/test_signals.py +8 -8
  7. {vectorbt-0.26.2 → vectorbt-0.27.0}/tests/test_utils.py +4 -4
  8. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/_settings.py +1 -1
  9. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/_version.py +1 -1
  10. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/base/array_wrapper.py +1 -1
  11. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/base/column_grouper.py +1 -1
  12. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/base/index_fns.py +1 -1
  13. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/data/base.py +1 -1
  14. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/data/custom.py +23 -19
  15. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/generic/accessors.py +2 -2
  16. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/generic/enums.py +15 -15
  17. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/generic/nb.py +36 -36
  18. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/indicators/factory.py +15 -15
  19. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/indicators/nb.py +1 -1
  20. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/labels/nb.py +6 -6
  21. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/portfolio/base.py +7 -7
  22. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/portfolio/enums.py +55 -55
  23. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/portfolio/nb.py +78 -78
  24. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/portfolio/trades.py +2 -2
  25. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/records/base.py +7 -7
  26. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/records/mapped_array.py +1 -1
  27. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/records/nb.py +16 -16
  28. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/returns/nb.py +23 -23
  29. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/root_accessors.py +1 -1
  30. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/signals/accessors.py +9 -9
  31. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/signals/factory.py +1 -1
  32. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/signals/generators.py +2 -2
  33. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/signals/nb.py +14 -14
  34. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/utils/array_.py +1 -1
  35. {vectorbt-0.26.2 → vectorbt-0.27.0/vectorbt.egg-info}/PKG-INFO +3 -3
  36. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt.egg-info/requires.txt +2 -2
  37. {vectorbt-0.26.2 → vectorbt-0.27.0}/LICENSE.md +0 -0
  38. {vectorbt-0.26.2 → vectorbt-0.27.0}/MANIFEST.in +0 -0
  39. {vectorbt-0.26.2 → vectorbt-0.27.0}/README.md +0 -0
  40. {vectorbt-0.26.2 → vectorbt-0.27.0}/setup.cfg +0 -0
  41. {vectorbt-0.26.2 → vectorbt-0.27.0}/tests/__init__.py +0 -0
  42. {vectorbt-0.26.2 → vectorbt-0.27.0}/tests/test_base.py +0 -0
  43. {vectorbt-0.26.2 → vectorbt-0.27.0}/tests/test_data.py +0 -0
  44. {vectorbt-0.26.2 → vectorbt-0.27.0}/tests/test_generic.py +0 -0
  45. {vectorbt-0.26.2 → vectorbt-0.27.0}/tests/test_labels.py +0 -0
  46. {vectorbt-0.26.2 → vectorbt-0.27.0}/tests/test_returns.py +0 -0
  47. {vectorbt-0.26.2 → vectorbt-0.27.0}/tests/test_settings.py +0 -0
  48. {vectorbt-0.26.2 → vectorbt-0.27.0}/tests/utils.py +0 -0
  49. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/__init__.py +0 -0
  50. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/_typing.py +0 -0
  51. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/base/__init__.py +0 -0
  52. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/base/accessors.py +0 -0
  53. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/base/combine_fns.py +0 -0
  54. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/base/indexing.py +0 -0
  55. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/base/reshape_fns.py +0 -0
  56. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/data/__init__.py +0 -0
  57. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/data/updater.py +0 -0
  58. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/generic/__init__.py +0 -0
  59. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/generic/decorators.py +0 -0
  60. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/generic/drawdowns.py +0 -0
  61. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/generic/plots_builder.py +0 -0
  62. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/generic/plotting.py +0 -0
  63. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/generic/ranges.py +0 -0
  64. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/generic/splitters.py +0 -0
  65. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/generic/stats_builder.py +0 -0
  66. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/indicators/__init__.py +0 -0
  67. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/indicators/basic.py +0 -0
  68. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/indicators/configs.py +0 -0
  69. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/labels/__init__.py +0 -0
  70. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/labels/enums.py +0 -0
  71. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/labels/generators.py +0 -0
  72. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/messaging/__init__.py +0 -0
  73. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/messaging/telegram.py +0 -0
  74. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/ohlcv_accessors.py +0 -0
  75. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/portfolio/__init__.py +0 -0
  76. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/portfolio/decorators.py +0 -0
  77. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/portfolio/logs.py +0 -0
  78. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/portfolio/orders.py +0 -0
  79. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/px_accessors.py +0 -0
  80. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/records/__init__.py +0 -0
  81. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/records/col_mapper.py +0 -0
  82. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/records/decorators.py +0 -0
  83. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/returns/__init__.py +0 -0
  84. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/returns/accessors.py +0 -0
  85. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/returns/metrics.py +0 -0
  86. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/returns/qs_adapter.py +0 -0
  87. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/signals/__init__.py +0 -0
  88. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/signals/enums.py +0 -0
  89. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/templates/dark.json +0 -0
  90. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/templates/light.json +0 -0
  91. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/templates/seaborn.json +0 -0
  92. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/utils/__init__.py +0 -0
  93. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/utils/attr_.py +0 -0
  94. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/utils/checks.py +0 -0
  95. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/utils/colors.py +0 -0
  96. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/utils/config.py +0 -0
  97. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/utils/datetime_.py +0 -0
  98. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/utils/decorators.py +0 -0
  99. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/utils/docs.py +0 -0
  100. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/utils/enum_.py +0 -0
  101. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/utils/figure.py +0 -0
  102. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/utils/image_.py +0 -0
  103. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/utils/mapping.py +0 -0
  104. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/utils/math_.py +0 -0
  105. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/utils/module_.py +0 -0
  106. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/utils/params.py +0 -0
  107. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/utils/random_.py +0 -0
  108. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/utils/requests_.py +0 -0
  109. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/utils/schedule_.py +0 -0
  110. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/utils/tags.py +0 -0
  111. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt/utils/template.py +0 -0
  112. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt.egg-info/SOURCES.txt +0 -0
  113. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt.egg-info/dependency_links.txt +0 -0
  114. {vectorbt-0.26.2 → vectorbt-0.27.0}/vectorbt.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: vectorbt
3
- Version: 0.26.2
3
+ Version: 0.27.0
4
4
  Summary: Python library for backtesting and analyzing trading strategies at scale
5
5
  Home-page: https://github.com/polakowo/vectorbt
6
6
  Author: Oleg Polakow
@@ -25,7 +25,7 @@ Classifier: Topic :: Scientific/Engineering :: Information Analysis
25
25
  Requires-Python: >=3.6
26
26
  Description-Content-Type: text/markdown
27
27
  License-File: LICENSE.md
28
- Requires-Dist: numpy<2.0.0,>=1.16.5
28
+ Requires-Dist: numpy>=1.16.5
29
29
  Requires-Dist: pandas
30
30
  Requires-Dist: scipy
31
31
  Requires-Dist: matplotlib
@@ -48,7 +48,7 @@ Provides-Extra: full
48
48
  Requires-Dist: yfinance>=0.2.22; extra == "full"
49
49
  Requires-Dist: python-binance; extra == "full"
50
50
  Requires-Dist: ccxt>=4.0.14; extra == "full"
51
- Requires-Dist: alpaca-trade-api>=1.4.3; extra == "full"
51
+ Requires-Dist: alpaca-py; extra == "full"
52
52
  Requires-Dist: ray>=1.4.1; extra == "full"
53
53
  Requires-Dist: ta; extra == "full"
54
54
  Requires-Dist: pandas_ta; extra == "full"
@@ -21,7 +21,7 @@ setup(
21
21
  'vectorbt': ['templates/*.json']
22
22
  },
23
23
  install_requires=[
24
- 'numpy>=1.16.5, <2.0.0',
24
+ 'numpy>=1.16.5',
25
25
  'pandas',
26
26
  'scipy',
27
27
  'matplotlib',
@@ -46,7 +46,7 @@ setup(
46
46
  'yfinance>=0.2.22',
47
47
  'python-binance',
48
48
  'ccxt>=4.0.14',
49
- 'alpaca-trade-api>=1.4.3',
49
+ 'alpaca-py',
50
50
  'ray>=1.4.1',
51
51
  'ta',
52
52
  'pandas_ta',
@@ -1020,9 +1020,9 @@ class TestFactory:
1020
1020
  (1, 'c')
1021
1021
  ], names=['custom_p', None])
1022
1022
  )
1023
- assert F.from_apply_func(apply_func).run(ts, [0, 1])._in_out.dtype == np.float_
1024
- assert F.from_apply_func(apply_func, in_output_settings={'in_out': {'dtype': np.int_}}) \
1025
- .run(ts, [0, 1])._in_out.dtype == np.int_
1023
+ assert F.from_apply_func(apply_func).run(ts, [0, 1])._in_out.dtype == np.float64
1024
+ assert F.from_apply_func(apply_func, in_output_settings={'in_out': {'dtype': np.int64}}) \
1025
+ .run(ts, [0, 1])._in_out.dtype == np.int64
1026
1026
  pd.testing.assert_frame_equal(
1027
1027
  F.from_apply_func(apply_func, in_out=-1).run(ts, [0, 1]).in_out,
1028
1028
  target
@@ -1113,12 +1113,12 @@ class TestFactory:
1113
1113
  ], names=['custom_p', None])
1114
1114
  )
1115
1115
  pd.testing.assert_frame_equal(
1116
- F.from_apply_func(apply_func, in_output_settings=dict(in_out=dict(dtype=np.int_)))
1116
+ F.from_apply_func(apply_func, in_output_settings=dict(in_out=dict(dtype=np.int64)))
1117
1117
  .run([0, 1], input_shape=ts.shape, input_index=ts.index, input_columns=ts.columns).in_out,
1118
1118
  target
1119
1119
  )
1120
1120
  pd.testing.assert_frame_equal(
1121
- F.from_apply_func(apply_func_nb, numba_loop=True, in_output_settings=dict(in_out=dict(dtype=np.int_)))
1121
+ F.from_apply_func(apply_func_nb, numba_loop=True, in_output_settings=dict(in_out=dict(dtype=np.int64)))
1122
1122
  .run([0, 1], input_shape=ts.shape, input_index=ts.index, input_columns=ts.columns).in_out,
1123
1123
  target
1124
1124
  )
@@ -2104,7 +2104,7 @@ class TestFactory:
2104
2104
  input_names=['ts'], output_names=['o1', 'o2'], in_output_names=['in_out'], param_names=['p1', 'p2'],
2105
2105
  attr_settings={
2106
2106
  'ts': {'dtype': None},
2107
- 'o1': {'dtype': np.float_},
2107
+ 'o1': {'dtype': np.float64},
2108
2108
  'o2': {'dtype': np.bool_},
2109
2109
  'in_out': {'dtype': TestEnum}
2110
2110
  }
@@ -3816,7 +3816,7 @@ class TestFromOrderFunc:
3816
3816
  order_size = np.copy(target_hold_value[c.i, c.from_col:c.to_col])
3817
3817
  order_size_type = np.full(c.group_len, SizeType.TargetValue)
3818
3818
  direction = np.full(c.group_len, Direction.Both)
3819
- order_value_out = np.empty(c.group_len, dtype=np.float_)
3819
+ order_value_out = np.empty(c.group_len, dtype=np.float64)
3820
3820
  c.last_val_price[c.from_col:c.to_col] = c.close[c.i, c.from_col:c.to_col]
3821
3821
  nb.sort_call_seq_nb(c, order_size, order_size_type, direction, order_value_out)
3822
3822
  return order_size, order_size_type, direction
@@ -4064,12 +4064,12 @@ class TestFromOrderFunc:
4064
4064
  [-1, -1, -1],
4065
4065
  [1, 1, 1]
4066
4066
  ])
4067
- value_arr1 = np.empty((size.shape[0], 2), dtype=np.float_)
4068
- value_arr2 = np.empty(size.shape, dtype=np.float_)
4069
- value_arr3 = np.empty(size.shape, dtype=np.float_)
4070
- return_arr1 = np.empty((size.shape[0], 2), dtype=np.float_)
4071
- return_arr2 = np.empty(size.shape, dtype=np.float_)
4072
- return_arr3 = np.empty(size.shape, dtype=np.float_)
4067
+ value_arr1 = np.empty((size.shape[0], 2), dtype=np.float64)
4068
+ value_arr2 = np.empty(size.shape, dtype=np.float64)
4069
+ value_arr3 = np.empty(size.shape, dtype=np.float64)
4070
+ return_arr1 = np.empty((size.shape[0], 2), dtype=np.float64)
4071
+ return_arr2 = np.empty(size.shape, dtype=np.float64)
4072
+ return_arr3 = np.empty(size.shape, dtype=np.float64)
4073
4073
  pos_record_arr1 = np.empty(size.shape, dtype=trade_dt)
4074
4074
  pos_record_arr2 = np.empty(size.shape, dtype=trade_dt)
4075
4075
  pos_record_arr3 = np.empty(size.shape, dtype=trade_dt)
@@ -4233,14 +4233,14 @@ class TestFromOrderFunc:
4233
4233
  ], dtype=trade_dt)
4234
4234
  )
4235
4235
 
4236
- cash_arr = np.empty((size.shape[0], 2), dtype=np.float_)
4237
- position_arr = np.empty(size.shape, dtype=np.float_)
4238
- val_price_arr = np.empty(size.shape, dtype=np.float_)
4239
- value_arr = np.empty((size.shape[0], 2), dtype=np.float_)
4240
- return_arr = np.empty((size.shape[0], 2), dtype=np.float_)
4241
- sim_order_cash_arr = np.empty(size.shape, dtype=np.float_)
4242
- sim_order_value_arr = np.empty(size.shape, dtype=np.float_)
4243
- sim_order_return_arr = np.empty(size.shape, dtype=np.float_)
4236
+ cash_arr = np.empty((size.shape[0], 2), dtype=np.float64)
4237
+ position_arr = np.empty(size.shape, dtype=np.float64)
4238
+ val_price_arr = np.empty(size.shape, dtype=np.float64)
4239
+ value_arr = np.empty((size.shape[0], 2), dtype=np.float64)
4240
+ return_arr = np.empty((size.shape[0], 2), dtype=np.float64)
4241
+ sim_order_cash_arr = np.empty(size.shape, dtype=np.float64)
4242
+ sim_order_value_arr = np.empty(size.shape, dtype=np.float64)
4243
+ sim_order_return_arr = np.empty(size.shape, dtype=np.float64)
4244
4244
 
4245
4245
  def post_order_func_nb(c):
4246
4246
  sim_order_cash_arr[c.i, c.col] = c.cash_now
@@ -4644,8 +4644,8 @@ class TestFromOrderFunc:
4644
4644
  [-5, 5, -10],
4645
4645
  [-5, 5, 10]
4646
4646
  ])
4647
- debt = np.empty(price_wide.shape, dtype=np.float_)
4648
- free_cash = np.empty(price_wide.shape, dtype=np.float_)
4647
+ debt = np.empty(price_wide.shape, dtype=np.float64)
4648
+ free_cash = np.empty(price_wide.shape, dtype=np.float64)
4649
4649
  pf = vbt.Portfolio.from_order_func(
4650
4650
  price_wide,
4651
4651
  order_func, size,
@@ -4680,8 +4680,8 @@ class TestFromOrderFunc:
4680
4680
  pf.cash(free=True).values
4681
4681
  )
4682
4682
 
4683
- debt = np.empty(price_wide.shape, dtype=np.float_)
4684
- free_cash = np.empty(price_wide.shape, dtype=np.float_)
4683
+ debt = np.empty(price_wide.shape, dtype=np.float64)
4684
+ free_cash = np.empty(price_wide.shape, dtype=np.float64)
4685
4685
  pf = vbt.Portfolio.from_order_func(
4686
4686
  price_wide.vbt.wrapper.wrap(price_wide.values[::-1]),
4687
4687
  order_func, size,
@@ -4716,8 +4716,8 @@ class TestFromOrderFunc:
4716
4716
  pf.cash(free=True).values
4717
4717
  )
4718
4718
 
4719
- debt = np.empty(price_wide.shape, dtype=np.float_)
4720
- free_cash = np.empty((price_wide.shape[0], 2), dtype=np.float_)
4719
+ debt = np.empty(price_wide.shape, dtype=np.float64)
4720
+ free_cash = np.empty((price_wide.shape[0], 2), dtype=np.float64)
4721
4721
  pf = vbt.Portfolio.from_order_func(
4722
4722
  price_wide,
4723
4723
  order_func, size,
@@ -2345,7 +2345,7 @@ close = pd.Series([1, 2, 3, 4, 5, 6, 7, 8], index=[
2345
2345
  datetime(2020, 1, 8)
2346
2346
  ]).vbt.tile(4, keys=['a', 'b', 'c', 'd'])
2347
2347
 
2348
- size = np.full(close.shape, np.nan, dtype=np.float_)
2348
+ size = np.full(close.shape, np.nan, dtype=np.float64)
2349
2349
  size[:, 0] = [1, 0.1, -1, -0.1, np.nan, 1, -1, 2]
2350
2350
  size[:, 1] = [-1, -0.1, 1, 0.1, np.nan, -1, 1, -2]
2351
2351
  size[:, 2] = [1, 0.1, -1, -0.1, np.nan, 1, -2, 2]
@@ -175,7 +175,7 @@ class TestAccessors:
175
175
  temp_int[0] = from_i
176
176
  return temp_int[:1]
177
177
 
178
- temp_int = np.empty((mask.shape[0],), dtype=np.int_)
178
+ temp_int = np.empty((mask.shape[0],), dtype=np.int64)
179
179
 
180
180
  en, ex = pd.Series.vbt.signals.generate_both(
181
181
  5, entry_func_nb, (temp_int,), exit_func_nb, (temp_int,),
@@ -321,7 +321,7 @@ class TestAccessors:
321
321
  temp_int[0] = from_i
322
322
  return temp_int[:1]
323
323
 
324
- temp_int = np.empty((mask.shape[0],), dtype=np.int_)
324
+ temp_int = np.empty((mask.shape[0],), dtype=np.int64)
325
325
 
326
326
  pd.testing.assert_series_equal(
327
327
  mask['a'].vbt.signals.generate_exits(choice_func_nb, temp_int),
@@ -768,7 +768,7 @@ class TestAccessors:
768
768
  a = np.full(n * 2, 0.)
769
769
  for i in range(10000):
770
770
  en, ex = pd.Series.vbt.signals.generate_random_both(1000, n, entry_wait=2, exit_wait=2)
771
- _a = np.empty((n * 2,), dtype=np.int_)
771
+ _a = np.empty((n * 2,), dtype=np.int64)
772
772
  _a[0::2] = np.flatnonzero(en)
773
773
  _a[1::2] = np.flatnonzero(ex)
774
774
  a += _a
@@ -2130,7 +2130,7 @@ class TestFactory:
2130
2130
  ),
2131
2131
  in_output_settings=dict(
2132
2132
  in_out2=dict(
2133
- dtype=np.float_
2133
+ dtype=np.float64
2134
2134
  )
2135
2135
  ),
2136
2136
  in_out2=np.nan,
@@ -2183,7 +2183,7 @@ class TestFactory:
2183
2183
  ),
2184
2184
  in_output_settings=dict(
2185
2185
  in_out2=dict(
2186
- dtype=np.float_
2186
+ dtype=np.float64
2187
2187
  )
2188
2188
  ),
2189
2189
  in_out2=np.nan,
@@ -2286,7 +2286,7 @@ class TestFactory:
2286
2286
  ),
2287
2287
  in_output_settings=dict(
2288
2288
  in_out2=dict(
2289
- dtype=np.float_
2289
+ dtype=np.float64
2290
2290
  )
2291
2291
  ),
2292
2292
  in_out2=np.nan,
@@ -2430,10 +2430,10 @@ class TestFactory:
2430
2430
  ),
2431
2431
  in_output_settings=dict(
2432
2432
  in_out1=dict(
2433
- dtype=np.float_
2433
+ dtype=np.float64
2434
2434
  ),
2435
2435
  in_out2=dict(
2436
- dtype=np.float_
2436
+ dtype=np.float64
2437
2437
  )
2438
2438
  ),
2439
2439
  in_out1=np.nan,
@@ -1861,11 +1861,11 @@ class TestChecks:
1861
1861
  checks.assert_instance_of(0, np.zeros(1))
1862
1862
 
1863
1863
  def test_assert_dtype(self):
1864
- checks.assert_dtype(np.zeros(1), np.float_)
1865
- checks.assert_dtype(pd.Series([1, 2, 3]), np.int_)
1866
- checks.assert_dtype(pd.DataFrame({'a': [1, 2], 'b': [3, 4]}), np.int_)
1864
+ checks.assert_dtype(np.zeros(1), np.float64)
1865
+ checks.assert_dtype(pd.Series([1, 2, 3]), np.int64)
1866
+ checks.assert_dtype(pd.DataFrame({'a': [1, 2], 'b': [3, 4]}), np.int64)
1867
1867
  with pytest.raises(Exception):
1868
- checks.assert_dtype(pd.DataFrame({'a': [1, 2], 'b': [3., 4.]}), np.int_)
1868
+ checks.assert_dtype(pd.DataFrame({'a': [1, 2], 'b': [3., 4.]}), np.int64)
1869
1869
 
1870
1870
  def test_assert_subdtype(self):
1871
1871
  checks.assert_subdtype([0], np.number)
@@ -165,7 +165,7 @@ settings = SettingsConfig(
165
165
  missing_columns='raise',
166
166
  alpaca=Config(
167
167
  dict(
168
- key_id=None,
168
+ api_key=None,
169
169
  secret_key=None
170
170
  )
171
171
  ),
@@ -1,4 +1,4 @@
1
1
  # Copyright (c) 2021 Oleg Polakow. All rights reserved.
2
2
  # This code is licensed under Apache 2.0 with Commons Clause license (see LICENSE.md for details)
3
3
 
4
- __version__ = "0.26.2"
4
+ __version__ = "0.27.0"
@@ -608,7 +608,7 @@ class ArrayWrapper(Configured, PandasIndexer):
608
608
 
609
609
  if to_index:
610
610
  if dtype is None:
611
- dtype = np.int_
611
+ dtype = np.int64
612
612
  if fillna is None:
613
613
  fillna = -1
614
614
 
@@ -71,7 +71,7 @@ def get_groups_and_index(index: tp.Index, group_by: tp.GroupByLike) -> tp.Tuple[
71
71
  @njit(cache=True)
72
72
  def get_group_lens_nb(groups: tp.Array1d) -> tp.Array1d:
73
73
  """Return count per group."""
74
- result = np.empty(groups.shape[0], dtype=np.int_)
74
+ result = np.empty(groups.shape[0], dtype=np.int64)
75
75
  j = 0
76
76
  last_group = -1
77
77
  group_len = 0
@@ -244,7 +244,7 @@ def drop_duplicate_levels(index: tp.Index, keep: tp.Optional[str] = None) -> tp.
244
244
  @njit(cache=True)
245
245
  def _align_index_to_nb(a: tp.Array1d, b: tp.Array1d) -> tp.Array1d:
246
246
  """Return indices required to align `a` to `b`."""
247
- idxs = np.empty(b.shape[0], dtype=np.int_)
247
+ idxs = np.empty(b.shape[0], dtype=np.int64)
248
248
  g = 0
249
249
  for i in range(b.shape[0]):
250
250
  for j in range(a.shape[0]):
@@ -92,7 +92,7 @@ Updating can be implemented by overriding the `Data.update_symbol` instance meth
92
92
  the same arguments as `Data.download_symbol`. In contrast to the download method, the update
93
93
  method is an instance method and can access the data downloaded earlier. It can also access the
94
94
  keyword arguments initially passed to the download method, accessible under `Data.download_kwargs`.
95
- Those arguments can be used as default arguments and overriden by arguments passed directly
95
+ Those arguments can be used as default arguments and overridden by arguments passed directly
96
96
  to the update method, using `vectorbt.utils.config.merge_dicts`.
97
97
 
98
98
  Let's define an update method that updates the latest data point and adds two news data points.
@@ -196,7 +196,7 @@ class YFData(Data):
196
196
  ... end='2021-04-12 09:35:00 -0400',
197
197
  ... interval='1m'
198
198
  ... )
199
- >>> yf_data.get())
199
+ >>> yf_data.get()
200
200
  Open High Low Close \\
201
201
  Datetime
202
202
  2021-04-12 13:30:00+00:00 685.080017 685.679993 684.765015 685.679993
@@ -759,7 +759,7 @@ class CCXTData(Data):
759
759
 
760
760
 
761
761
  class AlpacaData(Data):
762
- """`Data` for data coming from `alpaca-trade-api`.
762
+ """`Data` for data coming from `alpaca-py`.
763
763
 
764
764
  Sign up for Alpaca API keys under https://app.alpaca.markets/signup.
765
765
 
@@ -815,7 +815,7 @@ class AlpacaData(Data):
815
815
  end: tp.DatetimeLike = 'now UTC',
816
816
  adjustment: tp.Optional[str] = 'all',
817
817
  limit: int = 500,
818
- exchange: tp.Optional[str] = 'CBSE',
818
+ feed: tp.Optional[str] = None,
819
819
  **kwargs) -> tp.Frame:
820
820
  """Download the symbol.
821
821
 
@@ -839,17 +839,25 @@ class AlpacaData(Data):
839
839
 
840
840
  Allowed are `raw`, `split`, `dividend` or `all`.
841
841
  limit (int): The maximum number of returned items.
842
- exchange (str): For crypto symbols. Which exchange you wish to retrieve data from.
842
+ feed (str): The feed to pull market data from.
843
843
 
844
- Allowed are `FTX`, `ERSX`, `CBSE`
844
+ This is either "iex", "otc", or "sip". Feeds "sip" and "otc" are only available to
845
+ those with a subscription. Default is "iex" for free plans and "sip" for paid.
845
846
 
846
847
  For defaults, see `data.alpaca` in `vectorbt._settings.settings`.
847
848
  """
848
849
  from vectorbt._settings import settings
849
- from alpaca_trade_api.rest import TimeFrameUnit, TimeFrame, REST
850
+ from alpaca.data.timeframe import TimeFrame, TimeFrameUnit
851
+ from alpaca.data.requests import CryptoBarsRequest, StockBarsRequest
852
+ from alpaca.data.historical import CryptoHistoricalDataClient, StockHistoricalDataClient
850
853
 
851
854
  alpaca_cfg = settings['data']['alpaca']
852
855
 
856
+ if "/" in symbol:
857
+ REST = CryptoHistoricalDataClient
858
+ else:
859
+ REST = StockHistoricalDataClient
860
+
853
861
  client_kwargs = dict()
854
862
  for k in get_func_kwargs(REST):
855
863
  if k in kwargs:
@@ -878,27 +886,24 @@ class AlpacaData(Data):
878
886
  start_ts = to_tzaware_datetime(start, tz=get_utc_tz()).isoformat()
879
887
  end_ts = to_tzaware_datetime(end, tz=get_utc_tz()).isoformat()
880
888
 
881
- def _is_crypto_symbol(symbol):
882
- return len(symbol) == 6 and "USD" in symbol
883
-
884
- if _is_crypto_symbol(symbol):
885
- df = client.get_crypto_bars(
886
- symbol=symbol,
889
+ if "/" in symbol:
890
+ df = client.get_crypto_bars(CryptoBarsRequest(
891
+ symbol_or_symbols=symbol,
887
892
  timeframe=_timeframe,
888
893
  start=start_ts,
889
894
  end=end_ts,
890
895
  limit=limit,
891
- exchanges=exchange
892
- ).df
896
+ )).df
893
897
  else:
894
- df = client.get_bars(
895
- symbol=symbol,
898
+ df = client.get_stock_bars(StockBarsRequest(
899
+ symbol_or_symbols=symbol,
896
900
  timeframe=_timeframe,
897
901
  start=start_ts,
898
902
  end=end_ts,
899
903
  adjustment=adjustment,
900
- limit=limit
901
- ).df
904
+ limit=limit,
905
+ feed=feed,
906
+ )).df
902
907
 
903
908
  # filter for OHLCV
904
909
  # remove extra columns
@@ -911,7 +916,6 @@ class AlpacaData(Data):
911
916
  'low': 'Low',
912
917
  'close': 'Close',
913
918
  'volume': 'Volume',
914
- 'exchange': 'Exchange'
915
919
  }, inplace=True)
916
920
 
917
921
  df['Open'] = df['Open'].astype(float)
@@ -773,7 +773,7 @@ class GenericAccessor(BaseAccessor, StatsBuilderMixin, PlotsBuilderMixin, metacl
773
773
  name_or_index='reduce' if not returns_array else None,
774
774
  to_index=returns_idx and to_index,
775
775
  fillna=-1 if returns_idx else None,
776
- dtype=np.int_ if returns_idx else None
776
+ dtype=np.int64 if returns_idx else None
777
777
  ), wrap_kwargs)
778
778
  return self.wrapper.wrap_reduced(out, group_by=group_by, **wrap_kwargs)
779
779
 
@@ -865,7 +865,7 @@ class GenericAccessor(BaseAccessor, StatsBuilderMixin, PlotsBuilderMixin, metacl
865
865
 
866
866
  def count(self, group_by: tp.GroupByLike = None, wrap_kwargs: tp.KwargsLike = None) -> tp.MaybeSeries:
867
867
  """Return count of non-NaN elements."""
868
- wrap_kwargs = merge_dicts(dict(name_or_index='count', dtype=np.int_), wrap_kwargs)
868
+ wrap_kwargs = merge_dicts(dict(name_or_index='count', dtype=np.int64), wrap_kwargs)
869
869
  if self.wrapper.grouper.is_grouped(group_by=group_by):
870
870
  return self.reduce(nb.count_reduce_nb, group_by=group_by, flatten=True, wrap_kwargs=wrap_kwargs)
871
871
 
@@ -56,11 +56,11 @@ __pdoc__['DrawdownStatus'] = f"""Drawdown status.
56
56
  # ############# Records ############# #
57
57
 
58
58
  range_dt = np.dtype([
59
- ('id', np.int_),
60
- ('col', np.int_),
61
- ('start_idx', np.int_),
62
- ('end_idx', np.int_),
63
- ('status', np.int_)
59
+ ('id', np.int64),
60
+ ('col', np.int64),
61
+ ('start_idx', np.int64),
62
+ ('end_idx', np.int64),
63
+ ('status', np.int64)
64
64
  ], align=True)
65
65
  """_"""
66
66
 
@@ -72,16 +72,16 @@ __pdoc__['range_dt'] = f"""`np.dtype` of range records.
72
72
  """
73
73
 
74
74
  drawdown_dt = np.dtype([
75
- ('id', np.int_),
76
- ('col', np.int_),
77
- ('peak_idx', np.int_),
78
- ('start_idx', np.int_),
79
- ('valley_idx', np.int_),
80
- ('end_idx', np.int_),
81
- ('peak_val', np.float_),
82
- ('valley_val', np.float_),
83
- ('end_val', np.float_),
84
- ('status', np.int_),
75
+ ('id', np.int64),
76
+ ('col', np.int64),
77
+ ('peak_idx', np.int64),
78
+ ('start_idx', np.int64),
79
+ ('valley_idx', np.int64),
80
+ ('end_idx', np.int64),
81
+ ('peak_val', np.float64),
82
+ ('valley_val', np.float64),
83
+ ('end_val', np.float64),
84
+ ('status', np.int64),
85
85
  ], align=True)
86
86
  """_"""
87
87