রিসোর্স লোড হচ্ছে... লোডিং...

একটি বিটকয়েন ট্রেডিং রোবট তৈরি করুন যা অর্থ হারাবে না

লেখক:এফএমজেড-লিডিয়া, তৈরিঃ 2023-02-01 11:52:21, আপডেটঃ 2023-09-18 19:40:25

img

একটি বিটকয়েন ট্রেডিং রোবট তৈরি করুন যা অর্থ হারাবে না

আসুন আমরা একটি ডিজিটাল মুদ্রা ট্রেডিং রোবট তৈরির জন্য এআইতে রিইনফোর্সমেন্ট লার্নিং ব্যবহার করি।

এই নিবন্ধে, আমরা একটি বিটকয়েন ট্রেডিং রোবট তৈরি করতে শিখতে একটি বর্ধিত লার্নিং ফ্রেম নম্বর তৈরি এবং প্রয়োগ করব। এই টিউটোরিয়ালে, আমরা ওপেনএআই এর জিম এবং স্ট্যাবল-বেসলাইন লাইব্রেরি থেকে পিপিও রোবট ব্যবহার করব, যা ওপেনএআই বেসলাইন লাইব্রেরির একটি শাখা।

গত কয়েক বছরে ওপেনএআই এবং ডিপমাইন্ড দ্বারা গভীর শিক্ষার গবেষকদের জন্য প্রদত্ত ওপেন সোর্স সফটওয়্যারের জন্য আপনাকে অনেক ধন্যবাদ। যদি আপনি আলফা গো, ওপেনএআই ফাইভ, আলফাস্টার এবং অন্যান্য প্রযুক্তির সাথে তাদের আশ্চর্যজনক অর্জনগুলি না দেখে থাকেন তবে আপনি গত বছর বিচ্ছিন্নতায় বাস করেছেন, তবে আপনার সেগুলি পরীক্ষা করা উচিত।

img

আলফাস্টার প্রশিক্ষণ:https://deepmind.com/blog/alphastar-mastering-real-time-strategy-game-starcraft-ii/

যদিও আমরা কোন চিত্তাকর্ষক কিছু তৈরি করব না, তবুও প্রতিদিনের লেনদেনে বিটকয়েন রোবট ট্রেড করা সহজ নয়। তবে টেডি রুজভেল্ট একবার বলেছিলেন,

খুব সহজ কিছুতে কোন মূল্য নেই।

সুতরাং, আমাদের শুধু নিজেদেরকে ট্রেড করতে শিখতে হবে না, বরং আমাদের জন্য রোবটকে ট্রেড করতে দেওয়া উচিত।

পরিকল্পনা

img

  1. মেশিন লার্নিং করার জন্য আমাদের রোবটের জন্য একটি জিম পরিবেশ তৈরি করুন

  2. একটি সহজ এবং মার্জিত চাক্ষুষ পরিবেশ তৈরি করুন

  3. আমাদের রোবটকে লাভজনক ট্রেডিং কৌশল শিখতে প্রশিক্ষণ দিন

আপনি যদি স্ক্র্যাচ থেকে জিম পরিবেশগুলি কীভাবে তৈরি করবেন বা কীভাবে কেবল এই পরিবেশগুলির ভিজ্যুয়ালাইজেশন রেন্ডার করবেন তা জানেন না তবে চালিয়ে যাওয়ার আগে, দয়া করে এই ধরণের একটি নিবন্ধ গুগল করতে দ্বিধা করবেন না। এই দুটি ক্রিয়া এমনকি সবচেয়ে জুনিয়র প্রোগ্রামারদের জন্যও কঠিন হবে না।

শুরু করা

এই টিউটোরিয়ালে, আমরা Zielak দ্বারা উত্পন্ন Kaggle ডেটাসেট ব্যবহার করব। যদি আপনি সোর্স কোড ডাউনলোড করতে চান, এটি আমার Github সংগ্রহস্থলে.csv ডেটা ফাইলের সাথে সরবরাহ করা হবে। ঠিক আছে, আসুন শুরু করা যাক।

প্রথমে, আসুন প্রয়োজনীয় সব লাইব্রেরি আমদানি করি। আপনার অনুপস্থিত লাইব্রেরি ইনস্টল করতে pip ব্যবহার করুন।

import gym
import pandas as pd
import numpy as np
from gym import spaces
from sklearn import preprocessing

পরবর্তী, আসুন পরিবেশের জন্য আমাদের ক্লাস তৈরি করি। আমাদের একটি পান্ডা ডেটা ফ্রেম নম্বর এবং একটি ঐচ্ছিক initial_balance এবং একটি lookback_window_size পাস করতে হবে, যা প্রতিটি পদক্ষেপে রোবট দ্বারা পর্যবেক্ষণ করা অতীতের সময় পদক্ষেপের সংখ্যা নির্দেশ করবে। আমরা প্রতিটি লেনদেনের কমিশনকে 0.075% এ ডিফল্ট করি, অর্থাৎ বিটমেক্সের বর্তমান বিনিময় হার, এবং ডিফল্ট সিরিয়াল প্যারামিটারটি মিথ্যাতে, যার অর্থ আমাদের ডেটা ফ্রেম নম্বরটি ডিফল্টরূপে এলোমেলো টুকরো দ্বারা অতিক্রম করা হবে।

আমরা ডাটাতে dropna (() এবং reset_index (() কল করি, প্রথমে NaN মান সহ সারিটি মুছুন, এবং তারপরে ফ্রেম নম্বরটির সূচকটি পুনরায় সেট করুন, কারণ আমরা ডেটা মুছে ফেলেছি।

class BitcoinTradingEnv(gym.Env):
  """A Bitcoin trading environment for OpenAI gym"""
  metadata = {'render.modes': ['live', 'file', 'none']}
  scaler = preprocessing.MinMaxScaler()
  viewer = None
def __init__(self, df, lookback_window_size=50, 
                         commission=0.00075,  
                         initial_balance=10000
                         serial=False):
    super(BitcoinTradingEnv, self).__init__()
self.df = df.dropna().reset_index()
    self.lookback_window_size = lookback_window_size
    self.initial_balance = initial_balance
    self.commission = commission
    self.serial = serial
# Actions of the format Buy 1/10, Sell 3/10, Hold, etc.
    self.action_space = spaces.MultiDiscrete([3, 10])
# Observes the OHCLV values, net worth, and trade history
    self.observation_space = spaces.Box(low=0, high=1, shape=(10, lookback_window_size + 1), dtype=np.float16)

আমাদের action_space এখানে 3 টি অপশন (ক্রয়, বিক্রয় বা ধরে রাখা) এর একটি গ্রুপ এবং 10 টি পরিমাণের অন্য একটি গ্রুপ হিসাবে প্রতিনিধিত্ব করা হয় (1/10, 2/10, 3/10, ইত্যাদি) । যখন আমরা কিনতে বেছে নেব, আমরা BTC এর পরিমাণ * self.balance শব্দ কিনব। বিক্রির জন্য, আমরা BTC এর পরিমাণ * self.btc_held মূল্য বিক্রি করব। অবশ্যই, ধরে রাখা পরিমাণ উপেক্ষা করবে এবং কিছুই করবে না।

আমাদের পর্যবেক্ষণ_স্পেসটি 0 এবং 1 এর মধ্যে সেট করা একটি অবিচ্ছিন্ন ভাসমান বিন্দু হিসাবে সংজ্ঞায়িত করা হয়েছে, এবং এর আকৃতি হল (10, lookback_window_size+1) । + 1 বর্তমান সময় পদক্ষেপ গণনা করতে ব্যবহৃত হয়। উইন্ডোতে প্রতিটি সময় পদক্ষেপের জন্য, আমরা OHCLV মানটি পর্যবেক্ষণ করব। আমাদের নেট মূল্য আমরা কিনে বা বিক্রি করি এমন বিটিসির সংখ্যার সমান এবং এই বিটিসিগুলিতে আমরা ব্যয় করি বা গ্রহণ করি এমন মোট ডলারের পরিমাণ।

পরবর্তী, আমরা পরিবেশ শুরু করার জন্য রিসেট পদ্ধতি লিখতে হবে।

def reset(self):
  self.balance = self.initial_balance
  self.net_worth = self.initial_balance
  self.btc_held = 0
self._reset_session()
self.account_history = np.repeat([
    [self.net_worth],
    [0],
    [0],
    [0],
    [0]
  ], self.lookback_window_size + 1, axis=1)
self.trades = []
return self._next_observation()

এখানে আমরা self._reset_session এবং self._next_observation ব্যবহার করি, যা আমরা এখনো সংজ্ঞায়িত করি নি। আসুন প্রথমে সেগুলি সংজ্ঞায়িত করি।

ট্রেড সেশন

img

আমাদের পরিবেশের একটি গুরুত্বপূর্ণ অংশ হল ট্রেডিং সেশনের ধারণা। যদি আমরা এই রোবটটিকে বাজারের বাইরে স্থাপন করি, তাহলে আমরা একেবারে কয়েক মাসের বেশি সময় ধরে এটি চালাতে পারি না। এই কারণে, আমরা self.df এ ধারাবাহিক ফ্রেমের সংখ্যা সীমাবদ্ধ করব, যা আমাদের রোবট এক সময়ে দেখতে পারে এমন ফ্রেমের সংখ্যা।

আমাদের _reset_session পদ্ধতিতে, আমরা প্রথমে current_step কে 0 এ রিসেট করি। এরপরে, আমরা steps_left কে 1 থেকে MAX_TRADING_SESSIONS এর মধ্যে একটি র্যান্ডম সংখ্যায় সেট করব, যা আমরা প্রোগ্রামের শীর্ষে সংজ্ঞায়িত করব।

MAX_TRADING_SESSION = 100000 # ~2 months

পরবর্তী, যদি আমরা ক্রমাগত ফ্রেমের সংখ্যা অতিক্রম করতে চাই, তাহলে আমাদের এটিকে পুরো ফ্রেম সংখ্যা অতিক্রম করতে সেট করতে হবে, অন্যথায় আমরা frame_start কে self.df এর একটি এলোমেলো বিন্দুতে সেট করব এবং active_df নামে একটি নতুন ডেটা ফ্রেম তৈরি করব, যা কেবল self.df এর একটি অংশ এবং frame_start থেকে frame_start + steps_left এ চলে যাবে।

def _reset_session(self):
  self.current_step = 0
if self.serial:
    self.steps_left = len(self.df) - self.lookback_window_size - 1
    self.frame_start = self.lookback_window_size
  else:
    self.steps_left = np.random.randint(1, MAX_TRADING_SESSION)
    self.frame_start = np.random.randint(self.lookback_window_size, len(self.df) - self.steps_left)
self.active_df = self.df[self.frame_start - self.lookback_window_size:self.frame_start + self.steps_left]

এলোমেলো স্লাইসে ডেটা ফ্রেমের সংখ্যা অতিক্রম করার একটি গুরুত্বপূর্ণ পার্শ্ব প্রতিক্রিয়া হ'ল আমাদের রোবটের দীর্ঘমেয়াদী প্রশিক্ষণে ব্যবহারের জন্য আরও অনন্য ডেটা থাকবে। উদাহরণস্বরূপ, যদি আমরা কেবলমাত্র সিরিয়াল উপায়ে ডেটা ফ্রেমের সংখ্যা অতিক্রম করি (যেমন, ০ থেকে লেন ((ডিএফ))), আমাদের কেবলমাত্র ডেটা ফ্রেমের সংখ্যা হিসাবে অনেকগুলি অনন্য ডেটা পয়েন্ট থাকবে। আমাদের পর্যবেক্ষণ স্থানটি প্রতিটি সময় ধাপে কেবলমাত্র একটি স্বতন্ত্র সংখ্যা ব্যবহার করতে পারে।

যাইহোক, ডেটা সেটের স্লাইসগুলি এলোমেলোভাবে অতিক্রম করে, আমরা প্রাথমিক ডেটা সেটের প্রতিটি সময় পদক্ষেপের জন্য ট্রেডিং ফলাফলগুলির একটি আরও অর্থপূর্ণ সেট তৈরি করতে পারি, অর্থাৎ, আরও অনন্য ডেটা সেট তৈরি করতে ট্রেডিং আচরণ এবং মূল্য আচরণের সংমিশ্রণটি আগে দেখা গেছে। ব্যাখ্যা করার জন্য আমাকে একটি উদাহরণ দিতে দিন।

যখন সিরিয়াল পরিবেশটি পুনরায় সেট করার পরে সময় পদক্ষেপটি 10 হয়, তখন আমাদের রোবট সর্বদা একই সময়ে ডেটা সেটে চলবে, এবং প্রতিটি সময় পদক্ষেপের পরে তিনটি বিকল্প রয়েছেঃ কিনুন, বিক্রয় বা ধরে রাখুন। তিনটি বিকল্পের জন্য, আপনার আরও একটি বিকল্প প্রয়োজনঃ 10%, 20%,... বা নির্দিষ্ট বাস্তবায়ন পরিমাণের 100%। এর অর্থ হ'ল আমাদের রোবট যে কোনও 103, মোট 1030 টি ক্ষেত্রে 10 টির মধ্যে একটির সাথে দেখা করতে পারে।

এখন আমাদের এলোমেলো স্লাইসিং পরিবেশে ফিরে আসুন। যখন সময় পদক্ষেপটি 10 হয়, তখন আমাদের রোবটটি ডেটা ফ্রেমের সংখ্যার মধ্যে যে কোনও len(df) সময় পদক্ষেপের মধ্যে থাকতে পারে। অনুমান করা হচ্ছে যে প্রতিটি সময় পদক্ষেপের পরে একই পছন্দ করা হয়, এর অর্থ হ'ল রোবট একই 10 টি সময় পদক্ষেপের মধ্যে যে কোনও len(df) এর 30 তম শক্তিতে অনন্য অবস্থা অনুভব করতে পারে।

যদিও এটি বড় ডেটা সেটগুলিতে যথেষ্ট গোলমাল আনতে পারে, তবে আমি বিশ্বাস করি যে রোবটগুলিকে আমাদের সীমিত ডেটা থেকে আরও শিখতে দেওয়া উচিত। আমরা এখনও আমাদের পরীক্ষার ডেটাগুলি সিরিয়াল উপায়ে ক্রস করব যাতে সর্বাধিক তাজা এবং দৃশ্যত রিয়েল-টাইম ডেটা পাওয়া যায়, যাতে অ্যালগরিদমের কার্যকারিতার মাধ্যমে আরও সঠিক বোঝার জন্য।

রোবটের চোখ দিয়ে দেখা

কার্যকর চাক্ষুষ পরিবেশ পর্যবেক্ষণের মাধ্যমে, আমাদের রোবট যে ধরনের ফাংশন ব্যবহার করবে তা বোঝার জন্য এটি প্রায়শই সহায়ক। উদাহরণস্বরূপ, এখানে ওপেনসিভি ব্যবহার করে প্রদত্ত পর্যবেক্ষণযোগ্য স্থানটির দৃশ্যমানতা রয়েছে।

ওপেনসিভি ভিজ্যুয়ালাইজেশন পরিবেশের পর্যবেক্ষণ

চিত্রের প্রতিটি রেখা আমাদের পর্যবেক্ষণ_স্পেসে একটি সারি উপস্থাপন করে। অনুরূপ ফ্রিকোয়েন্সি সহ লাল রেখাগুলির প্রথম চারটি লাইন OHCL ডেটা উপস্থাপন করে এবং নীচের কমলা এবং হলুদ বিন্দুগুলি সরাসরি ট্রেডিং ভলিউমকে উপস্থাপন করে। নীচের ক্রমবর্ধমান নীল বারটি রোবটের নেট মূল্যকে উপস্থাপন করে, যখন নীচের হালকা বারটি রোবটের লেনদেনকে উপস্থাপন করে।

আপনি যদি সাবধানে পর্যবেক্ষণ করেন তবে আপনি নিজেরাই একটি মোমবাতি মানচিত্র তৈরি করতে পারেন। ট্রেডিং ভলিউম বারের নীচে একটি মর্স কোড ইন্টারফেস রয়েছে, যা ট্রেডিং ইতিহাস প্রদর্শন করে। দেখে মনে হচ্ছে আমাদের রোবটটি আমাদের পর্যবেক্ষণ_স্পেসের ডেটা থেকে পর্যাপ্ত পরিমাণে শিখতে সক্ষম হবে, তাই চলুন চালিয়ে যাই। এখানে আমরা _next_observation পদ্ধতিটি সংজ্ঞায়িত করব, আমরা পর্যবেক্ষণ করা ডেটা 0 থেকে 1 পর্যন্ত স্কেল করব।

  • এখন পর্যন্ত রোবটের দ্বারা পর্যবেক্ষণ করা তথ্যগুলিকে কেবলমাত্র বিস্তৃত করা গুরুত্বপূর্ণ যাতে অগ্রণী বিচ্যুতি রোধ করা যায়।
def _next_observation(self):
  end = self.current_step + self.lookback_window_size + 1
obs = np.array([
    self.active_df['Open'].values[self.current_step:end],  
    self.active_df['High'].values[self.current_step:end],
    self.active_df['Low'].values[self.current_step:end],
    self.active_df['Close'].values[self.current_step:end],
    self.active_df['Volume_(BTC)'].values[self.current_step:end],])
scaled_history = self.scaler.fit_transform(self.account_history)
obs = np.append(obs, scaled_history[:, -(self.lookback_window_size + 1):], axis=0)
return obs

পদক্ষেপ নিন

আমরা আমাদের পর্যবেক্ষণ স্থান প্রতিষ্ঠা করেছি, এবং এখন আমাদের সিঁড়ি ফাংশন লিখতে সময় এসেছে, এবং তারপরে রোবটের নির্ধারিত পদক্ষেপ গ্রহণ করুন। যখনই self.steps_left == 0 আমাদের বর্তমান ট্রেডিং সেশনের জন্য, আমরা আমাদের বিটিসি বিক্রি করব এবং _reset_session ((()) কল করব। অন্যথায়, আমরা বর্তমান নেট মূল্যের পুরষ্কার সেট করব। যদি আমাদের তহবিল শেষ হয়ে যায় তবে আমরা সত্যে সেট করব।

def step(self, action):
  current_price = self._get_current_price() + 0.01
  self._take_action(action, current_price)
  self.steps_left -= 1
  self.current_step += 1
if self.steps_left == 0:
    self.balance += self.btc_held * current_price
    self.btc_held = 0
    self._reset_session()
obs = self._next_observation()
  reward = self.net_worth
  done = self.net_worth <= 0
return obs, reward, done, {}

ট্রেডিং অ্যাকশন গ্রহণ করা বর্তমান_মূল্য পাওয়ার মতোই সহজ, কার্যকর করা পদক্ষেপগুলি এবং কিনতে বা বিক্রি করার পরিমাণ নির্ধারণ করা। আসুন দ্রুত _take_action লিখুন যাতে আমরা আমাদের পরিবেশ পরীক্ষা করতে পারি।

def _take_action(self, action, current_price):
  action_type = action[0]
  amount = action[1] / 10
btc_bought = 0
  btc_sold = 0
  cost = 0
  sales = 0
if action_type < 1:
    btc_bought = self.balance / current_price * amount
    cost = btc_bought * current_price * (1 + self.commission)
    self.btc_held += btc_bought
    self.balance -= cost
elif action_type < 2:
    btc_sold = self.btc_held * amount
    sales = btc_sold * current_price  * (1 - self.commission)
    self.btc_held -= btc_sold
    self.balance += sales

অবশেষে, একই পদ্ধতিতে, আমরা লেনদেনটি স্বয়ং ট্রেডগুলিতে সংযুক্ত করব এবং আমাদের নেট মূল্য এবং অ্যাকাউন্টের ইতিহাস আপডেট করব।

if btc_sold > 0 or btc_bought > 0:
    self.trades.append({
      'step': self.frame_start+self.current_step,
      'amount': btc_sold if btc_sold > 0 else btc_bought,
      'total': sales if btc_sold > 0 else cost,
      'type': "sell" if btc_sold > 0 else "buy"
    })
self.net_worth = self.balance + self.btc_held * current_price
  self.account_history = np.append(self.account_history, [
    [self.net_worth],
    [btc_bought],
    [cost],
    [btc_sold],
    [sales]
  ], axis=1)

আমাদের রোবট এখনই একটি নতুন পরিবেশ শুরু করতে পারে, পরিবেশকে ধীরে ধীরে সম্পূর্ণ করতে পারে এবং পরিবেশকে প্রভাবিত করে এমন পদক্ষেপ নিতে পারে।

আমাদের রোবট ট্রেড দেখুন

আমাদের রেন্ডারিং পদ্ধতিটি মুদ্রণ (self.net_word) কল করার মতো সহজ হতে পারে, তবে এটি যথেষ্ট আকর্ষণীয় নয়। পরিবর্তে, আমরা একটি সাধারণ মোমবাতি চার্ট আঁকব, যা ট্রেডিং ভলিউম কলাম এবং আমাদের নেট মূল্যের একটি পৃথক চার্ট ধারণ করে।

আমরা কোডটা নিয়ে আসবোStockTrackingGraph.pyআমার শেষ নিবন্ধ থেকে এবং বিটকয়েন পরিবেশে অভিযোজিত করার জন্য এটি পুনরায় ডিজাইন. আপনি আমার Github থেকে কোড পেতে পারেন.

আমাদের প্রথম পরিবর্তনটি self.df ['Date '] কে self.df [Timestamp] এ আপডেট করা এবং date2num এ সমস্ত কল মুছে ফেলা, কারণ আমাদের তারিখটি ইতিমধ্যে ইউনিক্স টাইমস্ট্যাম্প ফর্ম্যাটে রয়েছে। এরপরে, আমাদের রেন্ডারিং পদ্ধতিতে, আমরা সংখ্যাগুলির পরিবর্তে মানব-পঠনযোগ্য তারিখগুলি মুদ্রণ করতে তারিখের ট্যাগ আপডেট করব।

from datetime import datetime

প্রথমে, তারিখ-সময় লাইব্রেরি আমদানি করুন, এবং তারপর আমরা প্রতিটি টাইমস্ট্যাম্প এবং strftime থেকে ইউটিসি স্ট্রিং পেতে utcfromtimestampmethod ব্যবহার করব যাতে এটি একটি স্ট্রিং হিসাবে ফরম্যাট করা হয়ঃ Y-m-d H:M বিন্যাস।

date_labels = np.array([datetime.utcfromtimestamp(x).strftime('%Y-%m-%d %H:%M') for x in self.df['Timestamp'].values[step_range]])

অবশেষে, আমরা আমাদের ডেটাসেটের সাথে মেলে self. df['Volume '] থেকে self. df[Volume_ (BTC) ] পরিবর্তন করব। এগুলি সম্পন্ন করার পরে, আমরা প্রস্তুত। আমাদের BitcoinTradingEnv-এ ফিরে, আমরা এখন চার্টটি প্রদর্শন করার জন্য রেন্ডারিং পদ্ধতি লিখতে পারি।

def render(self, mode='human', **kwargs):
  if mode == 'human':
    if self.viewer == None:
      self.viewer = BitcoinTradingGraph(self.df,
                                        kwargs.get('title', None))
self.viewer.render(self.frame_start + self.current_step,
                       self.net_worth,
                       self.trades,
                       window_size=self.lookback_window_size)

আমরা এখন আমাদের রোবটগুলোকে বিটকয়েন ট্রেড করতে দেখতে পারি।

ম্যাটপ্লটলিবের সাথে আমাদের রোবট ট্রেডিং কল্পনা করুন

সবুজ ফ্যান্টম লেবেল বিটিসি কেনার প্রতিনিধিত্ব করে, এবং লাল ফ্যান্টম লেবেল বিক্রয়ের প্রতিনিধিত্ব করে। উপরের ডান কোণে সাদা লেবেলটি রোবটের বর্তমান নেট মূল্য, এবং নীচের ডান কোণে লেবেলটি বিটকয়েনের বর্তমান মূল্য। এটি সহজ এবং মার্জিত। এখন, আমাদের রোবটগুলিকে প্রশিক্ষণের সময় এসেছে এবং দেখুন আমরা কত টাকা করতে পারি!

প্রশিক্ষণ সময়

পূর্ববর্তী নিবন্ধে আমি যে সমালোচনা পেয়েছি তার মধ্যে একটি ছিল ক্রস-ভ্যালিডেশনের অভাব এবং ডেটাকে প্রশিক্ষণ সেট এবং পরীক্ষার সেটগুলিতে বিভক্ত করতে ব্যর্থতা। এর উদ্দেশ্য হ'ল নতুন ডেটাতে চূড়ান্ত মডেলের নির্ভুলতা যা আগে কখনও দেখা যায়নি তা পরীক্ষা করা। যদিও এটি সেই নিবন্ধের ফোকাস নয়, এটি সত্যিই খুব গুরুত্বপূর্ণ। কারণ আমরা সময় সিরিজের ডেটা ব্যবহার করি, ক্রস ভ্যালিডেশনে আমাদের অনেক পছন্দ নেই।

উদাহরণস্বরূপ, ক্রস-ভ্যালিডেশনের একটি সাধারণ ফর্মকে কে-ফোল্ড ভ্যালিডেশন বলা হয়। এই ভ্যালিডেশনে, আপনি ডেটাগুলিকে কে সমান গ্রুপে বিভক্ত করেন, একের পর এক, পৃথকভাবে, পরীক্ষার গ্রুপ হিসাবে এবং বাকি ডেটাগুলি প্রশিক্ষণ গ্রুপ হিসাবে ব্যবহার করেন। তবে, সময় সিরিজের ডেটাগুলি সময়ের উপর অত্যন্ত নির্ভরশীল, যার অর্থ পরবর্তী ডেটা পূর্ববর্তী ডেটাগুলির উপর অত্যন্ত নির্ভরশীল। সুতরাং কে-ফোল্ড কাজ করবে না, কারণ আমাদের রোবট ট্রেডিংয়ের আগে ভবিষ্যতের ডেটা থেকে শিখবে, যা একটি অন্যায় সুবিধা।

সময় সিরিজের ডেটাতে প্রয়োগ করা হলে, একই ত্রুটি বেশিরভাগ অন্যান্য ক্রস-ভ্যালিডেশন কৌশলগুলিতে প্রযোজ্য। অতএব, আমাদের কেবলমাত্র সম্পূর্ণ ডেটা ফ্রেম নম্বরটির একটি অংশকে ফ্রেম নম্বর থেকে কিছু স্বতঃস্ফূর্ত সূচকগুলিতে প্রশিক্ষণ সেট হিসাবে ব্যবহার করতে হবে এবং বাকি ডেটাগুলি পরীক্ষা সেট হিসাবে ব্যবহার করতে হবে।

slice_point = int(len(df) - 100000)
train_df = df[:slice_point]
test_df = df[slice_point:]

পরবর্তী, যেহেতু আমাদের পরিবেশ শুধুমাত্র একক সংখ্যক ডেটা ফ্রেম পরিচালনা করার জন্য সেট আপ করা হয়েছে, আমরা দুটি পরিবেশ তৈরি করব, একটি প্রশিক্ষণ তথ্যের জন্য এবং অন্যটি পরীক্ষার তথ্যের জন্য।

train_env = DummyVecEnv([lambda: BitcoinTradingEnv(train_df, commission=0, serial=False)])
test_env = DummyVecEnv([lambda: BitcoinTradingEnv(test_df, commission=0, serial=True)])

এখন, আমাদের মডেলকে প্রশিক্ষণ দেওয়া আমাদের পরিবেশ ব্যবহার করে একটি রোবট তৈরি করা এবং মডেল.লার্ণ কল করার মতোই সহজ।

model = PPO2(MlpPolicy,
             train_env,
             verbose=1, 
             tensorboard_log="./tensorboard/")
model.learn(total_timesteps=50000)

এখানে, আমরা টেনসর প্লেট ব্যবহার করি, যাতে আমরা আমাদের টেনসর ফ্লো চার্টগুলি সহজেই ভিজ্যুয়ালাইজ করতে পারি এবং আমাদের রোবট সম্পর্কে কিছু পরিমাণগত সূচক দেখতে পারি। উদাহরণস্বরূপ, নিম্নলিখিতটি 200,000 টিরও বেশি সময় পদক্ষেপের সাথে অনেক রোবটের ছাড়কৃত পুরষ্কার চার্টঃ

img

ওয়াও, দেখে মনে হচ্ছে আমাদের রোবটটি খুব লাভজনক! আমাদের সেরা রোবট ২০০,০০০ ধাপে এমনকি ১০০০ গুণ ভারসাম্য অর্জন করতে পারে, এবং বাকিগুলি গড়ে কমপক্ষে ৩০ গুণ বৃদ্ধি পাবে!

এই সময়ে, আমি বুঝতে পেরেছিলাম যে পরিবেশের মধ্যে একটি ভুল ছিল... বাগ ঠিক করার পর, এটি নতুন পুরস্কার চার্টঃ

img

আপনি যেমন দেখতে পাচ্ছেন, আমাদের কিছু রোবট ভাল করছে, অন্যরা দেউলিয়া হচ্ছে। তবে, ভাল পারফরম্যান্সের রোবটগুলি প্রাথমিক ব্যালেন্সের 10 গুণ বা এমনকি সর্বাধিক 60 গুণ পর্যন্ত পৌঁছতে পারে। আমাকে স্বীকার করতে হবে যে সমস্ত লাভজনক মেশিনগুলি কমিশন ছাড়াই প্রশিক্ষিত এবং পরীক্ষিত হয়, তাই আমাদের রোবটগুলির জন্য কোনও আসল অর্থ উপার্জন করা অবাস্তব। তবে কমপক্ষে আমরা উপায় খুঁজে পেয়েছি!

আসুন আমরা আমাদের রোবটগুলোকে পরীক্ষার পরিবেশে পরীক্ষা করি (নতুন তথ্য ব্যবহার করে যা তারা আগে কখনো দেখেনি) যাতে তারা কেমন আচরণ করবে তা দেখা যায়।

img

আমাদের ভাল প্রশিক্ষিত রোবটগুলো নতুন পরীক্ষার তথ্যের বিনিময়ে দেউলিয়া হয়ে যাবে।

স্পষ্টতই, আমাদের এখনও অনেক কাজ করতে হবে। বর্তমান পিপিও 2 রোবটের পরিবর্তে স্থিতিশীল বেসলাইন সহ এ 2 সি ব্যবহারের জন্য কেবলমাত্র মডেলগুলি স্যুইচ করে আমরা এই ডেটা সেটে আমাদের পারফরম্যান্সকে ব্যাপকভাবে উন্নত করতে পারি। অবশেষে, শন ও'গরম্যানের পরামর্শ অনুসারে, আমরা আমাদের পুরষ্কার ফাংশনটি সামান্য আপডেট করতে পারি, যাতে আমরা কেবলমাত্র উচ্চ নেট মূল্য অর্জন করার পরিবর্তে নেট মূল্যের সাথে পুরষ্কার যুক্ত করতে পারি এবং সেখানে থাকতে পারি।

reward = self.net_worth - prev_net_worth

এই দুটি পরিবর্তন এককভাবে পরীক্ষার ডেটা সেটের পারফরম্যান্সকে ব্যাপকভাবে উন্নত করতে পারে, এবং আপনি নীচে দেখতে পাচ্ছেন, আমরা অবশেষে নতুন ডেটা থেকে লাভ করতে সক্ষম হয়েছি যা প্রশিক্ষণ সেটে পাওয়া যায়নি।

img

কিন্তু আমরা আরও ভালো করতে পারি। এই ফলাফলগুলি উন্নত করার জন্য, আমাদের সুপার প্যারামিটারগুলি অপ্টিমাইজ করতে হবে এবং আমাদের রোবটগুলিকে আরও দীর্ঘ সময়ের জন্য প্রশিক্ষণ দিতে হবে। এখন সময় এসেছে জিপিইউ কাজ শুরু করার এবং সমস্ত সিলিন্ডারে গুলি করার!

এখন পর্যন্ত, এই নিবন্ধটি কিছুটা দীর্ঘ হয়েছে, এবং আমাদের এখনও অনেক বিবরণ বিবেচনা করতে হবে, তাই আমরা এখানে বিশ্রাম নেওয়ার পরিকল্পনা করছি। পরবর্তী নিবন্ধে, আমরা আমাদের সমস্যা স্থান জন্য সেরা হাইপারপ্যারামিটার পার্টিশন এবং CUDA ব্যবহার করে GPU প্রশিক্ষণ / পরীক্ষার জন্য প্রস্তুত করার জন্য বেয়েসিয়ান অপ্টিমাইজেশান ব্যবহার করব।

সিদ্ধান্ত

এই নিবন্ধে, আমরা শূন্য থেকে একটি লাভজনক বিটকয়েন ট্রেডিং রোবট তৈরি করতে রিইনফোর্সমেন্ট লার্নিং ব্যবহার শুরু করি। আমরা নিম্নলিখিত কাজগুলি সম্পন্ন করতে পারিঃ

  1. ওপেনএআই এর জিম ব্যবহার করে স্ক্র্যাচ থেকে একটি বিটকয়েন ট্রেডিং পরিবেশ তৈরি করুন।

  2. পরিবেশের ভিজ্যুয়ালাইজেশন তৈরি করতে Matplotlib ব্যবহার করুন।

  3. আমাদের রোবটকে প্রশিক্ষণ ও পরীক্ষার জন্য সহজ ক্রস-ভ্যালিডেশন ব্যবহার করুন।

  4. আমাদের রোবটগুলোকে কিছুটা সামঞ্জস্য করে মুনাফা অর্জন করতে হবে।

যদিও আমাদের ট্রেডিং রোবটটি আমরা যেমন আশা করেছিলাম তেমন লাভজনক ছিল না, আমরা ইতিমধ্যে সঠিক দিকে এগিয়ে চলেছি। পরের বার, আমরা নিশ্চিত করব যে আমাদের রোবটগুলি ধারাবাহিকভাবে বাজারকে পরাজিত করতে পারে। আমরা দেখতে পাব যে আমাদের ট্রেডিং রোবটগুলি কীভাবে রিয়েল-টাইম ডেটা প্রক্রিয়া করে। দয়া করে আমার পরবর্তী নিবন্ধটি অনুসরণ করুন এবং ভিভা বিটকয়েন!


সম্পর্কিত

আরো