code: def run(self, data_portal=None):
          
          # HACK: I don't think we really want to support passing a data portal
          # this late in the long term, but this is needed for now for backwards
          # compat downstream.
          if data_portal is not None:
              self.data_portal = data_portal
              self.asset_finder = data_portal.asset_finder
          elif self.data_portal is None:
              raise RuntimeError(
                  "No data portal in TradingAlgorithm.run().\n"
                  "Either pass a DataPortal to TradingAlgorithm() or to run()."
              )
          else:
              assert self.asset_finder is not None, \
                  "Have data portal without asset_finder."
  
          # Create zipline and loop through simulated_trading.
          # Each iteration returns a perf dictionary
          try:
              perfs = []
              for perf in self.get_generator():
                  perfs.append(perf)
  
              # convert perf dict to pandas dataframe
              daily_stats = self._create_daily_stats(perfs)
  
              self.analyze(daily_stats)
          finally:
              self.data_portal = None
              self.metrics_tracker = None
  
          return daily_stats
docs: Run the algorithm.