Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
wiseplat
GitHub Repository: wiseplat/python-code
Path: blob/master/ invest-robot-contest_NeuroInvest-main/NeuroInvest/training.py
5931 views
1
from config import predictPeriod, scanInterval, predictionIntervals
2
from kalman import Kalman
3
4
from pandas import DataFrame
5
from sklearn import neural_network
6
from sklearn.preprocessing import MinMaxScaler
7
from joblib import dump, load
8
from os import path
9
10
class Training:
11
__model = None
12
__scalerInput = MinMaxScaler()
13
__scalerOutput = MinMaxScaler()
14
15
def __init__(self, filename):
16
self.__loadModel(filename)
17
18
def train(self, history):
19
times, tradeY = zip(*history.items())
20
smoothData = Kalman(history).getSmoothData()
21
22
inputData = []
23
outputData = []
24
countTimes = len(times)
25
countPredicts = len(predictionIntervals)
26
countDatum = predictPeriod / scanInterval
27
28
for timeIndex, timestamp in enumerate(times):
29
datum = [smoothData[timeIndex]]
30
dataIndex = timeIndex + 1
31
while dataIndex < countTimes and len(datum) <= countDatum:
32
datum.append(smoothData[dataIndex])
33
dataIndex += 1
34
35
predictCounter = 0
36
37
if dataIndex < countTimes:
38
startPredictTimestamp = times[dataIndex]
39
predict = []
40
41
while dataIndex < countTimes and predictCounter < countPredicts:
42
if times[dataIndex] >= startPredictTimestamp + predictionIntervals[predictCounter]:
43
predict.append(smoothData[dataIndex])
44
predictCounter += 1
45
46
dataIndex += 1
47
48
if predictCounter != countPredicts:
49
if predictCounter > 0:
50
for index in range(predictCounter, countPredicts):
51
predict.append(predict[-1])
52
53
else:
54
for index in range(0, countPredicts):
55
predict.append(datum[-1])
56
57
if len(datum) == 0:
58
continue
59
60
if len(datum) < countDatum:
61
for index in range(len(datum), countDatum):
62
datum.append(datum[-1])
63
64
inputData.append(datum)
65
outputData.append(predict)
66
67
if len(inputData) == 0 or len(inputData) != len(outputData):
68
print("Have not data for training")
69
70
else:
71
self.__scalerInput.fit(inputData)
72
self.__scalerOutput.fit(outputData)
73
74
inputData = DataFrame(self.__scalerInput.transform(inputData), dtype = float)
75
outputData = DataFrame(self.__scalerOutput.transform(outputData), dtype = float)
76
77
try:
78
self.__model = neural_network.MLPRegressor(solver = "lbfgs", activation = 'logistic', max_iter = 1000000)
79
80
self.__model.fit(inputData, outputData)
81
82
print("Learn score = ", self.__model.score(inputData, outputData))
83
84
#print(outputData[:3], self.__model.predict(inputData[:3]))
85
except Exception as message:
86
self.__model = None
87
print("ERROR WHEN CREATE TRADE MODEL: " + str(message))
88
89
def tradePredict(self, dayValues, nowTime):
90
countInputValues = len(dayValues)
91
92
try:
93
countExpectedValues = self.__scalerInput.n_features_in_
94
if self.__model is not None and countInputValues > 0:
95
if countInputValues > countExpectedValues:
96
dayValues = dayValues[countInputValues - countExpectedValues:]
97
elif countInputValues < countExpectedValues:
98
for i in range(0, countExpectedValues - countInputValues):
99
dayValues.insert(0, dayValues[0])
100
101
inputData = DataFrame(self.__scalerInput.transform([dayValues]), dtype = float)
102
103
outputData = self.__model.predict(inputData)
104
outputData = self.__scalerOutput.inverse_transform(outputData)
105
106
result = {}
107
108
if len(outputData) > 0:
109
for index, time in enumerate(predictionIntervals):
110
result[nowTime + time] = outputData[0][index]
111
112
return result
113
except:
114
pass
115
116
return None
117
118
119
def saveModel(self, filename):
120
if self.__model is not None:
121
with open(filename + ".model", 'wb') as saveFile:
122
dump(self.__model, saveFile)
123
124
with open(filename + ".input", 'wb') as saveFile:
125
dump(self.__scalerInput, saveFile)
126
127
with open(filename + ".output", 'wb') as saveFile:
128
dump(self.__scalerOutput, saveFile)
129
130
131
def __loadModel(self, filename):
132
if path.isfile(filename + ".model"):
133
with open(filename + ".model", 'rb') as loadFile:
134
self.__model = load(loadFile)
135
136
if path.isfile(filename + ".input"):
137
with open(filename + ".input", 'rb') as loadFile:
138
self.__scalerInput = load(loadFile)
139
140
if path.isfile(filename + ".output"):
141
with open(filename + ".output", 'rb') as loadFile:
142
self.__scalerOutput = load(loadFile)
143
144
145
146