195 lines
7.1 KiB
Python
195 lines
7.1 KiB
Python
import pandas as pd
|
|
import datetime
|
|
import numpy as np
|
|
|
|
import market_trade.core.CoreTraidMath as CoreTraidMath
|
|
import market_trade.core.CoreDraw as CoreDraw
|
|
from tqdm import tqdm
|
|
|
|
from market_trade.core.indicators import *
|
|
|
|
|
|
class coreSignalTrande():
|
|
def __init__(self,
|
|
data=pd.DataFrame(),
|
|
dataType='candel',
|
|
mode='online',
|
|
batchSize=None,
|
|
indParams=None,
|
|
signalParams=None,
|
|
# needFig=False,
|
|
# showOnlyIndex=False,
|
|
# drawFig=False,
|
|
# equalityGap=0
|
|
):
|
|
|
|
self.data = data.reset_index(drop=True)
|
|
self.onlineData = data.reset_index(drop=True)
|
|
self.dataType = dataType
|
|
self.mode = mode
|
|
self.ans = None
|
|
self.softAnalizList = np.asarray([])
|
|
self.hardAnalizList = np.asarray([])
|
|
self.analizMetrics = {}
|
|
self.indParams = indParams
|
|
self.signalParams = signalParams
|
|
self.batchSize = batchSize
|
|
# self.needFig=needFig
|
|
# self.showOnlyIndex=showOnlyIndex
|
|
# self.drawFig=drawFig
|
|
# self.equalityGap=equalityGap
|
|
|
|
# Роутер получения ответа
|
|
def getAns(self, data):
|
|
# ans='Error: unknown Mode!'
|
|
ans = None
|
|
print("Start processing...")
|
|
if self.mode == 'online':
|
|
ans = self.getOnlineAns(data.reset_index(drop=True))
|
|
elif self.mode == 'retro':
|
|
ans = self.getRetroAns(data)
|
|
elif self.mode == 'retroFast':
|
|
ans = self.getRetroFastAns(data)
|
|
print("Processing DONE!")
|
|
return ans
|
|
|
|
# Ретро режим, где расширяется окно добавлением новых элементов
|
|
def getRetroAns(self, data):
|
|
ans = np.asarray([])
|
|
for i in tqdm(range(self.batchSize, len(data) - 1)):
|
|
# self.onlineData=self.data[0:i]
|
|
window_data = data[0:i]
|
|
window_data.reset_index(drop=True)
|
|
ans = np.append(ans, (self.getOnlineAns(window_data)))
|
|
self.ans = ans
|
|
self.getAnaliz()
|
|
self.getMetrix()
|
|
return ans
|
|
|
|
# Ретро режим, где двигается окно
|
|
def getRetroFastAns(self, data):
|
|
# print('d - ',data)
|
|
ans = np.asarray([])
|
|
for i in tqdm(range(len(data) - 1 - self.batchSize)):
|
|
# self.onlineData=self.data[i:i+self.batchSize]
|
|
window_data = data[i:i + self.batchSize]
|
|
# print('win - ',window_data)
|
|
window_data.reset_index(drop=True)
|
|
# print('win - ',window_data)
|
|
ans = np.append(ans, (self.getOnlineAns(window_data)))
|
|
self.ans = ans
|
|
self.getAnaliz()
|
|
self.getMetrix()
|
|
return ans
|
|
|
|
# Метод, который будет переопределять каждый дочерний класс
|
|
def getOnlineAns(self):
|
|
return 'Error'
|
|
|
|
def getAnaliz(self):
|
|
print("Start analiz...")
|
|
for i in (range(len(self.ans))):
|
|
sourceValue = self.data[self.signalParams['source']][i + self.batchSize]
|
|
targetValue = self.data[self.signalParams['target']][i + self.batchSize + 1]
|
|
if (targetValue) > sourceValue:
|
|
if self.ans[i] == 1:
|
|
self.softAnalizList = np.append(self.softAnalizList, 1)
|
|
self.hardAnalizList = np.append(self.hardAnalizList, 1)
|
|
elif self.ans[i] == -1:
|
|
self.softAnalizList = np.append(self.softAnalizList, -1)
|
|
self.hardAnalizList = np.append(self.hardAnalizList, -1)
|
|
else:
|
|
self.softAnalizList = np.append(self.softAnalizList, 0)
|
|
self.hardAnalizList = np.append(self.hardAnalizList, -1)
|
|
|
|
elif (targetValue) < sourceValue:
|
|
if self.ans[i] == 1:
|
|
self.softAnalizList = np.append(self.softAnalizList, -1)
|
|
self.hardAnalizList = np.append(self.hardAnalizList, -1)
|
|
elif self.ans[i] == -1:
|
|
self.softAnalizList = np.append(self.softAnalizList, 1)
|
|
self.hardAnalizList = np.append(self.hardAnalizList, 1)
|
|
else:
|
|
self.softAnalizList = np.append(self.softAnalizList, 0)
|
|
self.hardAnalizList = np.append(self.hardAnalizList, -1)
|
|
else:
|
|
if self.ans[i] == 1:
|
|
self.softAnalizList = np.append(self.softAnalizList, -1)
|
|
self.hardAnalizList = np.append(self.hardAnalizList, -1)
|
|
elif self.ans[i] == -1:
|
|
self.softAnalizList = np.append(self.softAnalizList, -1)
|
|
self.hardAnalizList = np.append(self.hardAnalizList, -1)
|
|
else:
|
|
self.softAnalizList = np.append(self.softAnalizList, 0)
|
|
self.hardAnalizList = np.append(self.hardAnalizList, 1)
|
|
print("Analiz DONE!")
|
|
return 0
|
|
|
|
def getMeteixDict(self, d):
|
|
'''
|
|
1 - (сбывшиеся + несбывшиеся) \ (сбывшиеся + несбывшиеся +0)
|
|
2 - (сбывшиеся - несбывшиеся) \ (сбывшиеся + несбывшиеся +0)
|
|
'''
|
|
return {
|
|
|
|
'1': (d['1'] + d['-1']) / (d['1'] + d['-1'] + d['0']),
|
|
'2': (d['1'] - d['-1']) / (d['1'] + d['-1'] + d['0']),
|
|
|
|
}
|
|
|
|
def getMetrix(self):
|
|
|
|
softAnalizCount = {'-1': 0, '0': 0, '1': 0}
|
|
hardAnalizCount = {'-1': 0, '0': 0, '1': 0}
|
|
for i in range(len(self.softAnalizList)):
|
|
softAnalizCount[str(int(self.softAnalizList[i]))] += 1
|
|
hardAnalizCount[str(int(self.hardAnalizList[i]))] += 1
|
|
self.analizMetrics = {'softAnaliz': self.getMeteixDict(softAnalizCount),
|
|
'hardAnaliz': self.getMeteixDict(hardAnalizCount)
|
|
}
|
|
|
|
|
|
class signal_BB(coreSignalTrande):
|
|
|
|
def __init__(self,
|
|
data=pd.DataFrame(),
|
|
dataType='candel',
|
|
mode='online',
|
|
batchSize=None,
|
|
indParams=None,
|
|
signalParams=None,
|
|
):
|
|
super().__init__(
|
|
data=data,
|
|
dataType=dataType,
|
|
mode=mode,
|
|
batchSize=batchSize,
|
|
indParams=indParams,
|
|
signalParams=signalParams,
|
|
)
|
|
|
|
if self.indParams == None:
|
|
indParams = {'MeanType': 'SMA', 'window': 15, 'valueType': 'low', 'kDev': 2}
|
|
else:
|
|
indParams = self.indParams
|
|
self.BB = ind_BB(
|
|
data=data,
|
|
options=indParams,
|
|
)
|
|
|
|
def getOnlineAns(self, data):
|
|
ans = 0
|
|
# print(data)
|
|
|
|
self.BB.getAns(data)
|
|
# print(BB)
|
|
lastValue = data[self.signalParams['source']].to_list()[-1]
|
|
if lastValue > self.BB.ans['pSTD'][-1]:
|
|
ans = -1
|
|
elif lastValue < self.BB.ans['mSTD'][-1]:
|
|
ans = +1
|
|
else:
|
|
ans = 0
|
|
|
|
return ans
|