Melanjutkan dari modul sebelumnya, pada modul ini kita akan membuat fungsi dari class AI_Trader untuk membuat model.
Model dibuat dengan Fully connected network. Input ada informasi harga end days pada hari sebelumnya.
Arsitektur yang digunakan adalah eksperimental, model memiliki 3 hidden layer, dimana layer pertama menggunakan 32 neuron, layer kedua menggunakan 64 neuron dan layer ketiga menggunakan 128 neuron.
Untuk output layer, jumlah neuron sesuai dengan variable action_space, dengan activation function linear, karena kita menggunakan data continous number.
Kemudian langkah selanjutnya adalah compile model. Karena fungsi yang dilakukan adalah regression, digunakan loss function mse, atau mean squared error. Optimizer yang digunakan adalah Adam.
def model_builder(self):
model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Dense(units=32, activation='relu', input_dim=self.state_size))
model.add(tf.keras.layers.Dense(units=64, activation='relu'))
model.add(tf.keras.layers.Dense(units=128, activation='relu'))
model.add(tf.keras.layers.Dense(units=self.action_space, activation='linear'))
model.compile(loss='mse', optimizer=tf.keras.optimizers.Adam(learning_rate=0.001))
return model
Selanjutnya kita membuat fungsi trading, dengan input state dan output adalah action yang dilakukan.
Berdasarkan state, kita akan menentukan action yang akan dilakukan.
Jika nilai random <= dari nilai variable episilon, maka action adalah random.
Jika tidak, maka dijalankan fungsi predict dari model. Digunakan fungsi np.argmax untuk memilih action dengan probabilitas tertinggi.
def trade(self, state):
if random.random() <= self.epsilon:
return random.randrange(self.action_space)
actions = self.model.predict(state)
return np.argmax(actions[0])
Selanjutnya adalah membuat fungsi training yang menerima parameter batch_size.
Pertama, load data dari variable memory berdasarkan ukuran batch_size kedalam variable batch.
Kemudian lakukan loop berdasarkan batch, dimana dalam loop terdapat proses perhitungan reward, target dan melakukan model training dengan perintah model.fit().
Perhatikan reward = reward + self.gamma * np.amax(self.model.predict(next_state)[0]) adalah formulai perhitungan discounted total reward dari Reinforcement Learning.
Pada training, digunakan epoch=1 karena proses training sering dilakukan, parameter verbose=0 untuk mematikan console loging saat proses training.
Setelah proses diatas selesai, terakhir, kita hitung nilai epsilon.
def batch_train(self, batch_size):
batch = []
for i in range(len(self.memory) - batch_size + 1, len(self.memory)):
batch.append(self.memory[i])
for state, action, reward, next_state, done in batch:
reward = reward
if not done:
reward = reward + self.gamma * np.amax(self.model.predict(next_state)[0])
target = self.model.predict(state)
target[0][action] = reward
self.model.fit(state, target, epochs=1, verbose=0)
if self.epsilon > self.epsilon_final:
self.epsilon *= self.epsilon_decay
Berikut hasil akhir class AI_Trader
class AI_Trader():
def __init__(self, state_size, action_space=3, model_name="AITrader"): #Stay, Buy, Sell
self.state_size = state_size
self.action_space = action_space
self.memory = deque(maxlen=2000)
self.inventory = []
self.model_name = model_name
self.gamma = 0.95
self.epsilon = 1.0
self.epsilon_final = 0.01
self.epsilon_decay = 0.995
self.model = self.model_builder()
def model_builder(self):
model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Dense(units=32, activation='relu', input_dim=self.state_size))
model.add(tf.keras.layers.Dense(units=64, activation='relu'))
model.add(tf.keras.layers.Dense(units=128, activation='relu'))
model.add(tf.keras.layers.Dense(units=self.action_space, activation='linear'))
model.compile(loss='mse', optimizer=tf.keras.optimizers.Adam(learning_rate=0.001))
return model
def trade(self, state):
if random.random() <= self.epsilon:
return random.randrange(self.action_space)
actions = self.model.predict(state)
return np.argmax(actions[0])
def batch_train(self, batch_size):
batch = []
for i in range(len(self.memory) - batch_size + 1, len(self.memory)):
batch.append(self.memory[i])
for state, action, reward, next_state, done in batch:
reward = reward
if not done:
reward = reward + self.gamma * np.amax(self.model.predict(next_state)[0])
target = self.model.predict(state)
target[0][action] = reward
self.model.fit(state, target, epochs=1, verbose=0)
if self.epsilon > self.epsilon_final:
self.epsilon *= self.epsilon_decay
Pada modul selanjutnya kita akan membuat fungsi helper untuk project ini.