Qubx 0.1.86__cp311-cp311-manylinux_2_35_x86_64.whl → 0.1.88__cp311-cp311-manylinux_2_35_x86_64.whl
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 Qubx might be problematic. Click here for more details.
- qubx/core/series.cpython-311-x86_64-linux-gnu.so +0 -0
- qubx/core/utils.cpython-311-x86_64-linux-gnu.so +0 -0
- qubx/ta/indicators.cpython-311-x86_64-linux-gnu.so +0 -0
- qubx/ta/indicators.pyx +85 -55
- {qubx-0.1.86.dist-info → qubx-0.1.88.dist-info}/METADATA +1 -1
- {qubx-0.1.86.dist-info → qubx-0.1.88.dist-info}/RECORD +7 -7
- {qubx-0.1.86.dist-info → qubx-0.1.88.dist-info}/WHEEL +0 -0
|
Binary file
|
|
Binary file
|
|
Binary file
|
qubx/ta/indicators.pyx
CHANGED
|
@@ -274,7 +274,8 @@ cdef class Pewma(Indicator):
|
|
|
274
274
|
cdef double alpha, beta
|
|
275
275
|
cdef int T
|
|
276
276
|
|
|
277
|
-
cdef double _mean,
|
|
277
|
+
cdef double _mean, _vstd, _var
|
|
278
|
+
cdef double mean, vstd, var
|
|
278
279
|
cdef long _i
|
|
279
280
|
|
|
280
281
|
def __init__(self, str name, TimeSeries series, double alpha, double beta, int T):
|
|
@@ -287,34 +288,51 @@ cdef class Pewma(Indicator):
|
|
|
287
288
|
self.std = TimeSeries('std', series.timeframe, series.max_series_length)
|
|
288
289
|
super().__init__(name, series)
|
|
289
290
|
|
|
291
|
+
def _store(self):
|
|
292
|
+
self.mean = self._mean
|
|
293
|
+
self.vstd = self._vstd
|
|
294
|
+
self.var = self._var
|
|
295
|
+
|
|
296
|
+
def _restore(self):
|
|
297
|
+
self._mean = self.mean
|
|
298
|
+
self._vstd = self.vstd
|
|
299
|
+
self._var = self.var
|
|
300
|
+
|
|
301
|
+
def _get_alpha(self, p_t):
|
|
302
|
+
if self._i - 1 > self.T:
|
|
303
|
+
return self.alpha * (1.0 - self.beta * p_t)
|
|
304
|
+
return 1.0 - 1.0 / self._i
|
|
305
|
+
|
|
290
306
|
cpdef double calculate(self, long long time, double x, short new_item_started):
|
|
291
|
-
cdef double diff,
|
|
307
|
+
cdef double diff, p_t, a_t, incr
|
|
292
308
|
|
|
293
|
-
if self.
|
|
309
|
+
if len(self.series) <= 1:
|
|
294
310
|
self._mean = x
|
|
295
|
-
self.
|
|
311
|
+
self._vstd = 0.0
|
|
296
312
|
self._var = 0.0
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
diff = x - self._mean
|
|
301
|
-
# prob of observing diff
|
|
302
|
-
p = norm_pdf(diff / self._std) if self._std != 0.0 else 0.0
|
|
303
|
-
|
|
304
|
-
# weight to give to this point
|
|
305
|
-
a_t = self.alpha * (1 - self.beta * p) if self._i > self.T else (1.0 - 1.0 / self._i)
|
|
306
|
-
incr = (1.0 - a_t) * diff
|
|
307
|
-
v = a_t * (self._var + diff * incr)
|
|
308
|
-
self.std.update(time, np.sqrt(v))
|
|
313
|
+
self._store()
|
|
314
|
+
self.std.update(time, self.vstd)
|
|
315
|
+
return self.mean
|
|
309
316
|
|
|
310
317
|
if new_item_started:
|
|
311
|
-
self._mean += incr
|
|
312
318
|
self._i += 1
|
|
313
|
-
self.
|
|
314
|
-
|
|
315
|
-
self.
|
|
319
|
+
self._restore()
|
|
320
|
+
else:
|
|
321
|
+
self._store()
|
|
322
|
+
|
|
323
|
+
diff = x - self.mean
|
|
324
|
+
# prob of observing diff
|
|
325
|
+
p_t = norm_pdf(diff / self.vstd) if self.vstd != 0.0 else 0.0
|
|
326
|
+
|
|
327
|
+
# weight to give to this point
|
|
328
|
+
a_t = self._get_alpha(p_t)
|
|
329
|
+
incr = (1.0 - a_t) * diff
|
|
330
|
+
self.mean += incr
|
|
331
|
+
self.var = a_t * (self.var + diff * incr)
|
|
332
|
+
self.vstd = np.sqrt(self.var)
|
|
333
|
+
self.std.update(time, self.vstd)
|
|
316
334
|
|
|
317
|
-
return self.
|
|
335
|
+
return self.mean
|
|
318
336
|
|
|
319
337
|
|
|
320
338
|
def pewma(series:TimeSeries, alpha: float, beta: float, T:int=30):
|
|
@@ -326,14 +344,13 @@ def pewma(series:TimeSeries, alpha: float, beta: float, T:int=30):
|
|
|
326
344
|
|
|
327
345
|
|
|
328
346
|
cdef class PewmaOutliersDetector(Indicator):
|
|
329
|
-
cdef public TimeSeries upper
|
|
330
|
-
cdef public TimeSeries lower
|
|
331
|
-
cdef public TimeSeries outliers
|
|
347
|
+
cdef public TimeSeries upper, lower, outliers, std
|
|
332
348
|
cdef double alpha, beta, threshold
|
|
333
349
|
cdef int T
|
|
334
350
|
|
|
335
351
|
cdef long _i
|
|
336
|
-
cdef double
|
|
352
|
+
cdef double mean, vstd, variance
|
|
353
|
+
cdef double _mean, _vstd, _variance, _z_thr
|
|
337
354
|
|
|
338
355
|
def __init__(self, str name, TimeSeries series, double alpha, double beta, int T, double threshold):
|
|
339
356
|
self.alpha = alpha
|
|
@@ -344,44 +361,43 @@ cdef class PewmaOutliersDetector(Indicator):
|
|
|
344
361
|
# - series
|
|
345
362
|
self.upper = TimeSeries('uba', series.timeframe, series.max_series_length)
|
|
346
363
|
self.lower = TimeSeries('lba', series.timeframe, series.max_series_length)
|
|
364
|
+
self.std = TimeSeries('std', series.timeframe, series.max_series_length)
|
|
347
365
|
self.outliers = TimeSeries('outliers', series.timeframe, series.max_series_length)
|
|
348
366
|
|
|
349
367
|
# - local variables
|
|
350
368
|
self._i = 0
|
|
351
369
|
self._z_thr = ndtri(1 - threshold / 2)
|
|
352
370
|
|
|
353
|
-
self._mean = 0.0
|
|
354
|
-
self._variance = 0.0
|
|
355
|
-
self._std = 0.0
|
|
356
371
|
super().__init__(name, series)
|
|
357
372
|
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
373
|
+
def _store(self):
|
|
374
|
+
self.mean = self._mean
|
|
375
|
+
self.vstd = self._vstd
|
|
376
|
+
self.variance = self._variance
|
|
361
377
|
|
|
362
|
-
|
|
363
|
-
|
|
378
|
+
def _restore(self):
|
|
379
|
+
self._mean = self.mean
|
|
380
|
+
self._vstd = self.vstd
|
|
381
|
+
self._variance = self.variance
|
|
364
382
|
|
|
365
|
-
|
|
383
|
+
cdef double _get_alpha(self, double p_t):
|
|
384
|
+
if self._i + 1 >= self.T:
|
|
385
|
+
return self.alpha * (1.0 - self.beta * p_t)
|
|
386
|
+
return 1.0 - 1.0 / (self._i + 1.0)
|
|
366
387
|
|
|
367
388
|
cdef double _get_mean(self, double x, double alpha_t):
|
|
368
|
-
return alpha_t * self.
|
|
389
|
+
return alpha_t * self.mean + (1.0 - alpha_t) * x
|
|
369
390
|
|
|
370
391
|
cdef double _get_variance(self, double x, double alpha_t):
|
|
371
|
-
return alpha_t * self.
|
|
392
|
+
return alpha_t * self.variance + (1.0 - alpha_t) * np.square(x)
|
|
372
393
|
|
|
373
394
|
cdef double _get_std(self, double variance, double mean):
|
|
374
395
|
return np.sqrt(max(variance - np.square(mean), 0.0))
|
|
375
396
|
|
|
376
397
|
cdef double _get_p(self, double x):
|
|
377
|
-
cdef double z_t = 0.0
|
|
378
|
-
cdef double p_t
|
|
379
|
-
|
|
380
|
-
if self._i != 1:
|
|
381
|
-
z_t = ((x - self._mean) / self._std) if (self._std != 0 and not np.isnan(x)) else 0.0
|
|
382
|
-
|
|
398
|
+
cdef double z_t = ((x - self.mean) / self.vstd) if (self.vstd != 0 and not np.isnan(x)) else 0.0
|
|
383
399
|
# if self.dist == 'normal':
|
|
384
|
-
p_t = norm_pdf(z_t)
|
|
400
|
+
# p_t = norm_pdf(z_t)
|
|
385
401
|
# elif self.dist == 'cauchy':
|
|
386
402
|
# p_t = (1 / (np.pi * (1 + np.square(z_t))))
|
|
387
403
|
# elif self.dist == 'student_t':
|
|
@@ -389,31 +405,45 @@ cdef class PewmaOutliersDetector(Indicator):
|
|
|
389
405
|
# (np.sqrt(self.count - 1) * np.sqrt(np.pi) * np.exp(np.math.lgamma(0.5 * (self.count - 1))))
|
|
390
406
|
# else:
|
|
391
407
|
# raise ValueError('Invalid distribution type')
|
|
392
|
-
return
|
|
408
|
+
return norm_pdf(z_t)
|
|
393
409
|
|
|
394
410
|
cpdef double calculate(self, long long time, double x, short new_item_started):
|
|
411
|
+
# - first bar - just use it as initial value
|
|
412
|
+
if len(self.series) <= 1:
|
|
413
|
+
self._mean = x
|
|
414
|
+
self._variance = x ** 2
|
|
415
|
+
self._vstd = 0.0
|
|
416
|
+
self._store()
|
|
417
|
+
self.std.update(time, self.vstd)
|
|
418
|
+
self.upper.update(time, x)
|
|
419
|
+
self.lower.update(time, x)
|
|
420
|
+
return self._mean
|
|
421
|
+
|
|
422
|
+
# - new bar is started use n-1 values for calculate innovations
|
|
423
|
+
if new_item_started:
|
|
424
|
+
self._i += 1
|
|
425
|
+
self._restore()
|
|
426
|
+
else:
|
|
427
|
+
self._store()
|
|
428
|
+
|
|
395
429
|
cdef double p_t = self._get_p(x)
|
|
396
430
|
cdef double alpha_t = self._get_alpha(p_t)
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
cdef double ub = mean + self._z_thr *
|
|
401
|
-
cdef double lb = mean - self._z_thr *
|
|
431
|
+
self.mean = self._get_mean(x, alpha_t)
|
|
432
|
+
self.variance = self._get_variance(x, alpha_t)
|
|
433
|
+
self.vstd = self._get_std(self.variance, self.mean)
|
|
434
|
+
cdef double ub = self.mean + self._z_thr * self.vstd
|
|
435
|
+
cdef double lb = self.mean - self._z_thr * self.vstd
|
|
402
436
|
|
|
403
437
|
self.upper.update(time, ub)
|
|
404
438
|
self.lower.update(time, lb)
|
|
405
|
-
|
|
406
|
-
self._mean = mean
|
|
407
|
-
self._i += 1
|
|
408
|
-
self._variance = variance
|
|
409
|
-
self._std = std
|
|
439
|
+
self.std.update(time, self.vstd)
|
|
410
440
|
|
|
411
441
|
# - check if it's outlier
|
|
412
442
|
if p_t < self.threshold:
|
|
413
443
|
self.outliers.update(time, x)
|
|
414
444
|
else:
|
|
415
445
|
self.outliers.update(time, np.nan)
|
|
416
|
-
return mean
|
|
446
|
+
return self.mean
|
|
417
447
|
|
|
418
448
|
|
|
419
449
|
def pewma_outliers_detector(series:TimeSeries, alpha: float, beta: float, T:int=30, threshold=0.05):
|
|
@@ -6,11 +6,11 @@ qubx/core/basics.py,sha256=2u7WV5KX-RbTmzoKfi1yT4HNLDPfQcFMCUZ1pVsM_VE,14777
|
|
|
6
6
|
qubx/core/helpers.py,sha256=gPE78dO718NBY0-JbfqNGCzIvr4BVatFntNIy2RUrEY,11559
|
|
7
7
|
qubx/core/loggers.py,sha256=HpgavBZegoDv9ssihtqX0pitXKULVAPHUpoE_volJw0,11910
|
|
8
8
|
qubx/core/lookups.py,sha256=4aEC7b2AyEXFqHHGDenex3Z1FZGrpDSb8IwzBZrSqIA,13688
|
|
9
|
-
qubx/core/series.cpython-311-x86_64-linux-gnu.so,sha256=
|
|
9
|
+
qubx/core/series.cpython-311-x86_64-linux-gnu.so,sha256=A3tw0ZuTSxk-kthr1yU9tGGRNwPjTH0m6sdUG5Difn0,736872
|
|
10
10
|
qubx/core/series.pxd,sha256=YC1w11gzn1eq6kBrLTufLlECsKd0YWLu70k_CuAMksg,2916
|
|
11
11
|
qubx/core/series.pyx,sha256=zO1M9MtVgzQyy0oVhO9HOWaIqT2HwcqhR-MdxpEk-HI,29401
|
|
12
12
|
qubx/core/strategy.py,sha256=Fs4fFyHaEGYuz7mBeQHBWFu3Ipg0yFzcxXhskgsPxJE,30330
|
|
13
|
-
qubx/core/utils.cpython-311-x86_64-linux-gnu.so,sha256=
|
|
13
|
+
qubx/core/utils.cpython-311-x86_64-linux-gnu.so,sha256=O0DhQLUfGRcxtf8HDWPNgNGNvYuo8RCKw6liyM46mtA,74248
|
|
14
14
|
qubx/core/utils.pyx,sha256=csSIwI_lwvCd8CTbsp9Q0XiRCtGAHEuF62afHOJzCGQ,1382
|
|
15
15
|
qubx/data/readers.py,sha256=YQvVbjyHsWDL54bVOzm78sTAF1ORYGT1eW4tVpnv5uA,32481
|
|
16
16
|
qubx/impl/ccxt_connector.py,sha256=NqF-tgxfTATnmVqKUonNXCAzECrDU8YrgqM3Nq06fw8,9150
|
|
@@ -23,8 +23,8 @@ qubx/pandaz/__init__.py,sha256=Iw5uzicYGSC3FEKZ-W1O5-7cXq_P0kH11-EcXV0zZhs,175
|
|
|
23
23
|
qubx/pandaz/ta.py,sha256=O17JPtee8MLyBoS8zdm32qsQcBJNtAPUpgFj3SMUKsA,85060
|
|
24
24
|
qubx/pandaz/utils.py,sha256=FyLKQy8spkqxhBij_nPFC_ZzI_L3-IgB9O53MqWKmq0,19109
|
|
25
25
|
qubx/ta/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
26
|
-
qubx/ta/indicators.cpython-311-x86_64-linux-gnu.so,sha256=
|
|
27
|
-
qubx/ta/indicators.pyx,sha256=
|
|
26
|
+
qubx/ta/indicators.cpython-311-x86_64-linux-gnu.so,sha256=HRaZHGW_uRMzu9cuqS1CPgLbL4_uDHrxF82Zg9GcLsc,518504
|
|
27
|
+
qubx/ta/indicators.pyx,sha256=iKSUz5sW6qd6yaYwmHfMyp3i98GH8mwgTHpk10PGJHM,22314
|
|
28
28
|
qubx/trackers/__init__.py,sha256=1y_yvIy0OQwBqfhAW_EY33NxFzFSWvI0qNAPU6zchYc,60
|
|
29
29
|
qubx/trackers/rebalancers.py,sha256=QCzANCooZBi2VMCBjjCPMq_Dt1h1zrBelATnfmVve74,5522
|
|
30
30
|
qubx/utils/__init__.py,sha256=XJFje4jP69pnPTp7fpTUmqwXz9PKzGYtJf8-kBofum0,273
|
|
@@ -34,6 +34,6 @@ qubx/utils/marketdata/binance.py,sha256=36dl4rxOAGTeY3uoONmiPanj8BkP0oBdDiH-URJJ
|
|
|
34
34
|
qubx/utils/misc.py,sha256=hmG_c7nneLiJ-xgyeOQucckPRemNAQ0Hsr7OqDdhbhU,9868
|
|
35
35
|
qubx/utils/runner.py,sha256=OY7SoRfxHwzn0rKTGB_lbg5zNASEL_49hQXWqs-LiMk,9306
|
|
36
36
|
qubx/utils/time.py,sha256=_DjCdQditzZwMy_8rvPdWyw5tjw__2p24LMPgXdZ8i0,4911
|
|
37
|
-
qubx-0.1.
|
|
38
|
-
qubx-0.1.
|
|
39
|
-
qubx-0.1.
|
|
37
|
+
qubx-0.1.88.dist-info/METADATA,sha256=2ON3hgyJnqhDBQ5u_5ylo1RVvS83PZq4kvoxPIqwKbY,2524
|
|
38
|
+
qubx-0.1.88.dist-info/WHEEL,sha256=MLOa6LysROdjgj4FVxsHitAnIh8Be2D_c9ZSBHKrz2M,110
|
|
39
|
+
qubx-0.1.88.dist-info/RECORD,,
|
|
File without changes
|