Eksperimen Trading Saham Menggunakan Deep Reinforcement Learning – 2

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.

Sharing is caring:

Leave a Comment