class_docstr: A single stock trading environment for OpenAI gym
  
  Attributes
  ----------
      df: DataFrame
          input data
      stock_dim : int
          number of unique stocks
      hmax : int
          maximum number of shares to trade
      initial_amount : int
          start money
      transaction_cost_pct: float
          transaction cost percentage per trade
      reward_scaling: float
          scaling factor for reward, good for training
      state_space: int
          the dimension of input features
      action_space: int
          equals stock dimension
      tech_indicator_list: list
          a list of technical indicator names
      turbulence_threshold: int
          a threshold to control risk aversion
      day: int
          an increment number to control date
  
  Methods
  -------
  _sell_stock()
      perform sell action based on the sign of the action
  _buy_stock()
      perform buy action based on the sign of the action
  step()
      at each step the agent will return actions, then
      we will calculate the reward, and return the next observation.
  reset()
      reset the environment
  render()
      use render to return other functions
  save_asset_memory()
      return account value at each time step
  save_action_memory()
      return actions/positions at each time step
class_docstr_tok: ["A","single","stock","trading","environment","for","OpenAI","gym","Attributes","--","--","--","--","--","df",":","DataFrame","input","data","stock_dim",":","int","number","of","unique","stocks","hmax",":","int","maximum","number","of","shares","to","trade","initial_amount",":","int","start","money","transaction_cost_pct",":","float","transaction","cost","percentage","per","trade","reward_scaling",":","float","scaling","factor","for","reward",",","good","for","training","state_space",":","int","the","dimension","of","input","features","action_space",":","int","equals","stock","dimension","tech_indicator_list",":","list","a","list","of","technical","indicator","names","turbulence_threshold",":","int","a","threshold","to","control","risk","aversion","day",":","int","an","increment","number","to","control","date","Methods","--","--","--","-","_sell_stock","(",")","perform","sell","action","based","on","the","sign","of","the","action","_buy_stock","(",")","perform","buy","action","based","on","the","sign","of","the","action","step","(",")","at","each","step","the","agent","will","return","actions",",","then","we","will","calculate","the","reward",",","and","return","the","next","observation",".","reset","(",")","reset","the","environment","render","(",")","use","render","to","return","other","functions","save_asset_memory","(",")","return","account","value","at","each","time","step","save_action_memory","(",")","return","actions\/positions","at","each","time","step"]
code: def get_sb_env(self):
      e = DummyVecEnv([lambda: self])
      obs = e.reset()
      return e, obs
  
file_path: FinRL/finrl/meta/env_portfolio_allocation/env_portfolio.py
imports: from __future__ import annotations
  import gymnasium
  import matplotlib
  import matplotlib.pyplot
  import numpy
  import pandas
  from gymnasium import spaces
  from gymnasium.utils import seeding
  from stable_baselines3.common.vec_env import DummyVecEnv
label_desc: Use image node_id 9 for calling the StockPortfolioEnv obj's underlying member method code with example usage: obj.get_sb_env() and returns: e,  obs