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

লেখক:ভাল, তৈরিঃ 2019-06-27 10:58:40, আপডেটঃ 2023-10-30 20:30:00

img

আসুন আমরা এআই-র শক্তিশালী শেখার মাধ্যমে একটি ডিজিটাল মুদ্রা ট্রেডিং রোবট তৈরি করি।

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

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

img

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

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

আমি মনে করি যে, আমরা যদি আমাদের জীবনকে সহজ করে তুলতে পারি, তাহলে আমাদের জীবনকে আরও সহজ করে তুলতে পারব।

তাই আমরা শুধু স্বয়ংক্রিয়ভাবে লেনদেন করতে শিখবো না... আমাদের জন্য রোবটকে লেনদেন করতে হবে।

পরিকল্পনা

img

1.为我们的机器人创建gym环境以供其进行机器学习

2.渲染一个简单而优雅的可视化环境

3.训练我们的机器人,使其学习一个可获利的交易策略

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

প্রবেশ করুন

在本教程中,我们将使用Zielak生成的Kaggle数据集。如果您想下载源代码,我的Github仓库中会提供,同时也有.csv数据文件。好的,让我们开始吧。

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

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 ইত্যাদি) হিসাবে প্রদর্শিত হয়। যখন ক্রয় কর্ম নির্বাচন করা হয়, আমরা কিনতে পরিমাণ * self.balance worth of BTC;; বিক্রয় কর্মের জন্য, আমরা sell amount * self.btc_held worth of BTC;; অবশ্যই, রাখা কর্ম পরিমাণ উপেক্ষা এবং কিছুই না।

আমাদের observation_space 0 থেকে 1 এর মধ্যে ধারাবাহিকভাবে floating point সেট হিসাবে সংজ্ঞায়িত করা হয়, যার আকৃতি হল ((10, lookback_window_size + 1)); + 1 বর্তমান সময়সীমার গণনা করার জন্য ব্যবহৃত হয়। উইন্ডোর প্রতিটি সময়সীমার জন্য, আমরা OHCLV মান পর্যবেক্ষণ করব। আমাদের নেট মূল্য BTC কেনা বা বিক্রি করা পরিমাণের সমান এবং আমরা এই BTC তে ব্যয় বা প্রাপ্ত মোট ডলার।

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

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_SESSION এর মধ্যে একটি র্যান্ডম সংখ্যা হিসাবে সেট করব, যা আমরা প্রোগ্রামের শীর্ষে সংজ্ঞায়িত করব।

MAX_TRADING_SESSION = 100000 # ~2个月

পরবর্তী, যদি আমরা ক্রমাগত ক্রমাগত ক্রমাগত ক্রমাগত করতে চাই, তাহলে আমাদের পুরো ক্রমাগত ক্রমাগত করতে হবে, অন্যথায় আমরা ফ্রেম_স্টার্টকে স্বয়ং.ডিএফ এর একটি র্যান্ডম পয়েন্ট হিসাবে সেট করব এবং একটি নতুন ডেটা ক্রমাগত ক্রমাগত ক্রমাগত সক্রিয়_ডিএফ তৈরি করব, যা কেবলমাত্র স্বয়ং.ডিএফ এর একটি টুকরো এবং এটি 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% নির্দিষ্ট কার্যকারিতা। এর অর্থ হল যে আমাদের রোবটটি 10 টির মধ্যে 10 টির মধ্যে যে কোনও একটির সাথে 10 টির মধ্যে একটিতে সম্মুখীন হতে পারে, মোট 1030 টি পরিস্থিতিতে।

এখন আমাদের এলোমেলো স্লিপিংয়ের পরিবেশে ফিরে যাই; সময়সীমা ১০ হলে, আমাদের রোবটটি ডেটা আউটপুটগুলির মধ্যে যে কোনও len (df) সময়সীমার মধ্যে থাকতে পারে। প্রতিটি সময়সীমার পরে একই পছন্দ করা অনুমান করা হয়, যার অর্থ এই যে রোবটটি একই ১০টি সময়সীমার মধ্যে যে কোনও len (df) এর ৩০ সেকেন্ডের মধ্যে একটি একক অবস্থা অনুভব করতে পারে।

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

রোবট চোখের মাধ্যমে দেখা

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

img

ওপেনসিভি ভিজ্যুয়ালাইজেশন পরিবেশের দৃষ্টিভঙ্গি

চিত্রের প্রতিটি লাইন আমাদের observation_space-এর একটি লাইনকে প্রতিনিধিত্ব করে; প্রথম চারটি রেখার অনুরূপ ফ্রিকোয়েন্সির লাল লাইনটি 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, {}

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

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

最后,在同一方法中,我们会将交易附加到self.trades并更新我们的净值和账户历史。

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)

আমাদের রোবটগুলি এখন নতুন পরিবেশ শুরু করতে পারে, ধীরে ধীরে পরিবেশটি শেষ করতে পারে এবং পরিবেশকে প্রভাবিত করার জন্য পদক্ষেপ নিতে পারে।

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

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

我们将从我上一篇文章中获取StockTradingGraph.py中的代码,并重新设计它以适应比特币环境。你可以从我的Github中获取代码。

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

from datetime import datetime

প্রথমে, আমরা 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]])

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

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)

ওহ! আমরা এখন আমাদের রোবটকে বিটকয়েন বিনিময় করতে দেখতে পাচ্ছি।

img

Matplotlib দিয়ে আমাদের রোবট ট্রেডিং ভিজ্যুয়ালাইজ করুন

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

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

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

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

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

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.learn一样简单。

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

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

img

ওহ, দেখে মনে হচ্ছে আমাদের রোবটগুলি খুব লাভজনক! আমাদের সেরা রোবটগুলি এমনকি 200,000 টি পদক্ষেপে 1000x ভারসাম্য অর্জন করতে পারে, বাকি গড় কমপক্ষে 30 গুণ বৃদ্ধি করে!

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

img

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

আসুন আমরা আমাদের রোবটগুলোকে পরীক্ষামূলক পরিবেশে পরীক্ষা করি (নতুন ডেটা ব্যবহার করে যা তারা আগে কখনো দেখেনি) এবং দেখি তারা কেমন করে।

img

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

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

reward = self.net_worth - prev_net_worth

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

img

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

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

উপসংহার

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

1.使用OpenAI的gym从零开始创建比特币交易环境。

2.使用Matplotlib构建该环境的可视化。

3.使用简单的交叉验证对我们的机器人进行训练和测试。

4.略微调整我们的机器人以实现盈利

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


সম্পর্কিত

আরো