/
newRunner.py
146 lines (118 loc) · 3.46 KB
/
newRunner.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
import myownq
import dataParser
import copy
#bucket ranges for different metrics
buckets = dict()
for i in range(55):
#buckets[i] = [0,-50,-40,-30,-20,-10,10,20,30,40,50,10000000]
# buckets[i] = [0,10000000]
buckets[i] = [0,-10,-6,-3,-2,-1,-0.5,0,0.5,1,1.5,2,2.5,3,6,10,10000000]
#take data and put it into buckets defined somewhere else
class state():
def __init__(self, values):
data = values[0]
newPrice = values[2]
self.data = data
self.curPrice = values[1]
self.newPrice = newPrice
stateDef = []
#print data
#print values
#place values into buckets
for i in range(0, len(data)):
bucketRanges = buckets[i]
dataVal = data[i]
if (dataVal == None):
stateDef += [0]
else:
for j in range(1,len(bucketRanges)):
if (data[i] < bucketRanges[j]):
stateDef += [j]
break
self.stateDef = tuple(stateDef)
#print (self.stateDef)
def getScore(self):
if (self.newPrice == None or self.curPrice == None):
return 0.0
priceChange = float(self.newPrice - self.curPrice)
return priceChange
#-1 = predict lower price, 1 = predict higher price
def getLegalActions(self):
return [-1,1]
def getDef(self):
return self.stateDef
agent = myownq.qAgent()
#The function that runs the inner Q-learning
def run():
initialized = False
# open data row by row to avoid memory overflow
fname = 'data_cleaned.csv'
with open(fname, 'r+') as f:
# this reads in one line at a time from stdin
date_previous = None
ticker_previous = None
observation = {}
observationPrevious = {}
isFirstObservation = True
lineo = 0
for i, line in enumerate(f):
#print line
fList = line.split(",")
date = fList[0]
value = float(fList[1])
ticker = str(fList[2])
fundamental = str(fList[3])
if (date_previous == None):
date_previous = date
elif (date_previous != date):
if (not isFirstObservation):
#break
observedData = dataParser.getObservation(observationPrevious, observation)
curState = state(observedData)
action = agent.getAction(curState)
priceChange = curState.getScore()
reward = action * priceChange
agent.update(reward, curState, action)
#print observation
#print observationPrevious
print agent.getPercentCorrect()
print agent.getTotalRewards()
else:
isFirstObservation = False
observationPrevious = copy.deepcopy(observation)
observation = {}
date_previous = date
if (ticker_previous == None):
ticker_previous = ticker
elif (ticker_previous != ticker):
isFirstObservation = True
ticker_previous = ticker
observation[fundamental] = value
#print observation
#print observationPrevious
# if lineo == 100000:
# break
# if ticker_previous == None:
# ticker_previous = ticker
# date_previous = date
# if date == date_previous:
# observation[fundamental] = value
# if date != date_previous:
# lineo += 1
# #print observation
# observedData = dataParser.getObservation(observationPrevious, observation)
# observationPrevious = observation
# observation = {}
# observation[fundamental] = value
# date_previous = date
# curState = state(observedData)
# action = agent.getAction(curState)
# priceChange = curState.getScore()
# reward = action * priceChange
# agent.update(reward, curState, action)
# print "hi"
# print agent.getPercentCorrect()
# print agent.getTotalRewards()
# if (i%200000 == 0):
# agent.finish()
run()