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 run_optuna(self):
      sampler = optuna.samplers.TPESampler(seed=42)
      study = optuna.create_study(
          study_name=f"{self.model_name}_study",
          direction="maximize",
          sampler=sampler,
          pruner=optuna.pruners.HyperbandPruner(),
      )
  
      study.optimize(
          self.objective,
          n_trials=self.n_trials,
          catch=(ValueError,),
          callbacks=[self.logging_callback],
      )
  
      joblib.dump(study, f"{self.model_name}_study.pkl")
      return study
  
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 5 for calling the TuneSB3Optuna obj's underlying member method code with example usage: obj.run_optuna() and returns: study