vectorbt 0.26.2__tar.gz → 0.27.1__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.
- {vectorbt-0.26.2 → vectorbt-0.27.1}/LICENSE.md +1 -1
- {vectorbt-0.26.2/vectorbt.egg-info → vectorbt-0.27.1}/PKG-INFO +13 -3
- {vectorbt-0.26.2 → vectorbt-0.27.1}/setup.py +13 -2
- {vectorbt-0.26.2 → vectorbt-0.27.1}/tests/test_indicators.py +6 -6
- {vectorbt-0.26.2 → vectorbt-0.27.1}/tests/test_portfolio.py +21 -21
- {vectorbt-0.26.2 → vectorbt-0.27.1}/tests/test_records.py +1 -1
- {vectorbt-0.26.2 → vectorbt-0.27.1}/tests/test_signals.py +8 -8
- {vectorbt-0.26.2 → vectorbt-0.27.1}/tests/test_utils.py +4 -4
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/_settings.py +1 -1
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/_version.py +1 -1
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/base/array_wrapper.py +1 -1
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/base/column_grouper.py +1 -1
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/base/index_fns.py +1 -1
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/data/base.py +1 -1
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/data/custom.py +23 -19
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/generic/accessors.py +2 -2
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/generic/enums.py +15 -15
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/generic/nb.py +36 -36
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/indicators/factory.py +15 -15
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/indicators/nb.py +1 -1
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/labels/nb.py +6 -6
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/portfolio/base.py +7 -7
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/portfolio/enums.py +55 -55
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/portfolio/nb.py +78 -78
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/portfolio/trades.py +2 -2
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/records/base.py +7 -7
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/records/mapped_array.py +1 -1
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/records/nb.py +16 -16
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/returns/nb.py +23 -23
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/root_accessors.py +1 -1
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/signals/accessors.py +9 -9
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/signals/factory.py +1 -1
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/signals/generators.py +2 -2
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/signals/nb.py +14 -14
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/utils/array_.py +1 -1
- {vectorbt-0.26.2 → vectorbt-0.27.1/vectorbt.egg-info}/PKG-INFO +13 -3
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt.egg-info/requires.txt +13 -2
- {vectorbt-0.26.2 → vectorbt-0.27.1}/MANIFEST.in +0 -0
- {vectorbt-0.26.2 → vectorbt-0.27.1}/README.md +0 -0
- {vectorbt-0.26.2 → vectorbt-0.27.1}/setup.cfg +0 -0
- {vectorbt-0.26.2 → vectorbt-0.27.1}/tests/__init__.py +0 -0
- {vectorbt-0.26.2 → vectorbt-0.27.1}/tests/test_base.py +0 -0
- {vectorbt-0.26.2 → vectorbt-0.27.1}/tests/test_data.py +0 -0
- {vectorbt-0.26.2 → vectorbt-0.27.1}/tests/test_generic.py +0 -0
- {vectorbt-0.26.2 → vectorbt-0.27.1}/tests/test_labels.py +0 -0
- {vectorbt-0.26.2 → vectorbt-0.27.1}/tests/test_returns.py +0 -0
- {vectorbt-0.26.2 → vectorbt-0.27.1}/tests/test_settings.py +0 -0
- {vectorbt-0.26.2 → vectorbt-0.27.1}/tests/utils.py +0 -0
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/__init__.py +0 -0
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/_typing.py +0 -0
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/base/__init__.py +0 -0
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/base/accessors.py +0 -0
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/base/combine_fns.py +0 -0
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/base/indexing.py +0 -0
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/base/reshape_fns.py +0 -0
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/data/__init__.py +0 -0
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/data/updater.py +0 -0
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/generic/__init__.py +0 -0
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/generic/decorators.py +0 -0
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/generic/drawdowns.py +0 -0
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/generic/plots_builder.py +0 -0
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/generic/plotting.py +0 -0
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/generic/ranges.py +0 -0
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/generic/splitters.py +0 -0
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/generic/stats_builder.py +0 -0
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/indicators/__init__.py +0 -0
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/indicators/basic.py +0 -0
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/indicators/configs.py +0 -0
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/labels/__init__.py +0 -0
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/labels/enums.py +0 -0
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/labels/generators.py +0 -0
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/messaging/__init__.py +0 -0
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/messaging/telegram.py +0 -0
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/ohlcv_accessors.py +0 -0
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/portfolio/__init__.py +0 -0
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/portfolio/decorators.py +0 -0
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/portfolio/logs.py +0 -0
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/portfolio/orders.py +0 -0
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/px_accessors.py +0 -0
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/records/__init__.py +0 -0
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/records/col_mapper.py +0 -0
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/records/decorators.py +0 -0
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/returns/__init__.py +0 -0
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/returns/accessors.py +0 -0
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/returns/metrics.py +0 -0
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/returns/qs_adapter.py +0 -0
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/signals/__init__.py +0 -0
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/signals/enums.py +0 -0
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/templates/dark.json +0 -0
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/templates/light.json +0 -0
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/templates/seaborn.json +0 -0
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/utils/__init__.py +0 -0
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/utils/attr_.py +0 -0
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/utils/checks.py +0 -0
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/utils/colors.py +0 -0
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/utils/config.py +0 -0
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/utils/datetime_.py +0 -0
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/utils/decorators.py +0 -0
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/utils/docs.py +0 -0
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/utils/enum_.py +0 -0
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/utils/figure.py +0 -0
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/utils/image_.py +0 -0
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/utils/mapping.py +0 -0
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/utils/math_.py +0 -0
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/utils/module_.py +0 -0
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/utils/params.py +0 -0
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/utils/random_.py +0 -0
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/utils/requests_.py +0 -0
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/utils/schedule_.py +0 -0
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/utils/tags.py +0 -0
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt/utils/template.py +0 -0
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt.egg-info/SOURCES.txt +0 -0
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt.egg-info/dependency_links.txt +0 -0
- {vectorbt-0.26.2 → vectorbt-0.27.1}/vectorbt.egg-info/top_level.txt +0 -0
|
@@ -200,7 +200,7 @@ Licensor: Oleg Polakow
|
|
|
200
200
|
same "printed page" as the copyright notice for easier
|
|
201
201
|
identification within third-party archives.
|
|
202
202
|
|
|
203
|
-
Copyright
|
|
203
|
+
Copyright 2025 Oleg Polakow
|
|
204
204
|
|
|
205
205
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
206
206
|
you may not use this file except in compliance with the License.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: vectorbt
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.27.1
|
|
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
|
|
28
|
+
Requires-Dist: numpy>=1.16.5
|
|
29
29
|
Requires-Dist: pandas
|
|
30
30
|
Requires-Dist: scipy
|
|
31
31
|
Requires-Dist: matplotlib
|
|
@@ -48,13 +48,23 @@ 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-
|
|
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"
|
|
55
55
|
Requires-Dist: TA-Lib; extra == "full"
|
|
56
56
|
Requires-Dist: python-telegram-bot<20.0,>=13.4; extra == "full"
|
|
57
57
|
Requires-Dist: quantstats>=0.0.37; extra == "full"
|
|
58
|
+
Provides-Extra: full-no-talib
|
|
59
|
+
Requires-Dist: yfinance>=0.2.22; extra == "full-no-talib"
|
|
60
|
+
Requires-Dist: python-binance; extra == "full-no-talib"
|
|
61
|
+
Requires-Dist: ccxt>=4.0.14; extra == "full-no-talib"
|
|
62
|
+
Requires-Dist: alpaca-py; extra == "full-no-talib"
|
|
63
|
+
Requires-Dist: ray>=1.4.1; extra == "full-no-talib"
|
|
64
|
+
Requires-Dist: ta; extra == "full-no-talib"
|
|
65
|
+
Requires-Dist: pandas_ta; extra == "full-no-talib"
|
|
66
|
+
Requires-Dist: python-telegram-bot<20.0,>=13.4; extra == "full-no-talib"
|
|
67
|
+
Requires-Dist: quantstats>=0.0.37; extra == "full-no-talib"
|
|
58
68
|
Provides-Extra: cov
|
|
59
69
|
Requires-Dist: pytest; extra == "cov"
|
|
60
70
|
Requires-Dist: pytest-cov; extra == "cov"
|
|
@@ -21,7 +21,7 @@ setup(
|
|
|
21
21
|
'vectorbt': ['templates/*.json']
|
|
22
22
|
},
|
|
23
23
|
install_requires=[
|
|
24
|
-
'numpy>=1.16.5
|
|
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-
|
|
49
|
+
'alpaca-py',
|
|
50
50
|
'ray>=1.4.1',
|
|
51
51
|
'ta',
|
|
52
52
|
'pandas_ta',
|
|
@@ -54,6 +54,17 @@ setup(
|
|
|
54
54
|
'python-telegram-bot>=13.4,<20.0', # LGPLv3
|
|
55
55
|
'quantstats>=0.0.37'
|
|
56
56
|
],
|
|
57
|
+
'full-no-talib': [
|
|
58
|
+
'yfinance>=0.2.22',
|
|
59
|
+
'python-binance',
|
|
60
|
+
'ccxt>=4.0.14',
|
|
61
|
+
'alpaca-py',
|
|
62
|
+
'ray>=1.4.1',
|
|
63
|
+
'ta',
|
|
64
|
+
'pandas_ta',
|
|
65
|
+
'python-telegram-bot>=13.4,<20.0', # LGPLv3
|
|
66
|
+
'quantstats>=0.0.37'
|
|
67
|
+
],
|
|
57
68
|
'cov': [
|
|
58
69
|
'pytest',
|
|
59
70
|
'pytest-cov',
|
|
@@ -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.
|
|
1024
|
-
assert F.from_apply_func(apply_func, in_output_settings={'in_out': {'dtype': np.
|
|
1025
|
-
.run(ts, [0, 1])._in_out.dtype == np.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
4068
|
-
value_arr2 = np.empty(size.shape, dtype=np.
|
|
4069
|
-
value_arr3 = np.empty(size.shape, dtype=np.
|
|
4070
|
-
return_arr1 = np.empty((size.shape[0], 2), dtype=np.
|
|
4071
|
-
return_arr2 = np.empty(size.shape, dtype=np.
|
|
4072
|
-
return_arr3 = np.empty(size.shape, dtype=np.
|
|
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.
|
|
4237
|
-
position_arr = np.empty(size.shape, dtype=np.
|
|
4238
|
-
val_price_arr = np.empty(size.shape, dtype=np.
|
|
4239
|
-
value_arr = np.empty((size.shape[0], 2), dtype=np.
|
|
4240
|
-
return_arr = np.empty((size.shape[0], 2), dtype=np.
|
|
4241
|
-
sim_order_cash_arr = np.empty(size.shape, dtype=np.
|
|
4242
|
-
sim_order_value_arr = np.empty(size.shape, dtype=np.
|
|
4243
|
-
sim_order_return_arr = np.empty(size.shape, dtype=np.
|
|
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.
|
|
4648
|
-
free_cash = np.empty(price_wide.shape, dtype=np.
|
|
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.
|
|
4684
|
-
free_cash = np.empty(price_wide.shape, dtype=np.
|
|
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.
|
|
4720
|
-
free_cash = np.empty((price_wide.shape[0], 2), dtype=np.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
2433
|
+
dtype=np.float64
|
|
2434
2434
|
),
|
|
2435
2435
|
in_out2=dict(
|
|
2436
|
-
dtype=np.
|
|
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.
|
|
1865
|
-
checks.assert_dtype(pd.Series([1, 2, 3]), np.
|
|
1866
|
-
checks.assert_dtype(pd.DataFrame({'a': [1, 2], 'b': [3, 4]}), np.
|
|
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.
|
|
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)
|
|
@@ -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.
|
|
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.
|
|
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
|
|
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-
|
|
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
|
-
|
|
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
|
-
|
|
842
|
+
feed (str): The feed to pull market data from.
|
|
843
843
|
|
|
844
|
-
|
|
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
|
|
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
|
-
|
|
882
|
-
|
|
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
|
-
|
|
892
|
-
).df
|
|
896
|
+
)).df
|
|
893
897
|
else:
|
|
894
|
-
df = client.
|
|
895
|
-
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
60
|
-
('col', np.
|
|
61
|
-
('start_idx', np.
|
|
62
|
-
('end_idx', np.
|
|
63
|
-
('status', np.
|
|
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.
|
|
76
|
-
('col', np.
|
|
77
|
-
('peak_idx', np.
|
|
78
|
-
('start_idx', np.
|
|
79
|
-
('valley_idx', np.
|
|
80
|
-
('end_idx', np.
|
|
81
|
-
('peak_val', np.
|
|
82
|
-
('valley_val', np.
|
|
83
|
-
('end_val', np.
|
|
84
|
-
('status', np.
|
|
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
|
|