class_docstr: Hyperparameter tuning of SB3 agents using Optuna
  
  Attributes
  ----------
    env_train: Training environment for SB3
    model_name: str
    env_trade: testing environment
    logging_callback: callback for tuning
    total_timesteps: int
    n_trials: number of hyperparameter configurations
  
  Note:
    The default sampler and pruner are used are
    Tree Parzen Estimator and Hyperband Scheduler
    respectively.
code: def objective(self, trial: optuna.Trial):
      hyperparameters = self.default_sample_hyperparameters(trial)
      policy_kwargs = hyperparameters["policy_kwargs"]
      del hyperparameters["policy_kwargs"]
      model = self.agent.get_model(
          self.model_name,
          policy_kwargs=policy_kwargs,
          model_kwargs=hyperparameters,
      )
      trained_model = self.agent.train_model(
          model=model,
          tb_log_name=self.model_name,
          total_timesteps=self.total_timesteps,
      )
      trained_model.save(
          f"./{config.TRAINED_MODEL_DIR}/{self.model_name}_{trial.number}.pth"
      )
      df_account_value, _ = DRLAgent.DRL_prediction(
          model=trained_model, environment=self.env_trade
      )
      sharpe = self.calculate_sharpe(df_account_value)
  
      return sharpe
  
imports: from __future__ import annotations
  import datetime
  import joblib
  import optuna
  import pandas
  from stable_baselines3 import A2C
  from stable_baselines3 import DDPG
  from stable_baselines3 import PPO
  from stable_baselines3 import SAC
  from stable_baselines3 import TD3
  import finrl.agents.stablebaselines3.hyperparams_opt
  from finrl import config
  from finrl.agents.stablebaselines3.models import DRLAgent
  from finrl.main import check_and_make_directories
  from finrl.plot import backtest_stats
label_desc: Use image node_id 4 for calling the TuneSB3Optuna obj's underlying member method code with example usage: obj.objective(trial) and returns: sharpe