code: def calc_bootstrap(func, returns, *args, **kwargs):
      
  
      n_samples = kwargs.pop('n_samples', 1000)
      out = np.empty(n_samples)
  
      factor_returns = kwargs.pop('factor_returns', None)
  
      for i in range(n_samples):
          idx = np.random.randint(len(returns), size=len(returns))
          returns_i = returns.iloc[idx].reset_index(drop=True)
          if factor_returns is not None:
              factor_returns_i = factor_returns.iloc[idx].reset_index(drop=True)
              out[i] = func(returns_i, factor_returns_i,
                            *args, **kwargs)
          else:
              out[i] = func(returns_i,
                            *args, **kwargs)
  
      return out
docs: Performs a bootstrap analysis on a user-defined function returning
      a summary statistic.
  
      Parameters
      ----------
      func : function
          Function that either takes a single array (commonly returns)
          or two arrays (commonly returns and factor returns) and
          returns a single value (commonly a summary
          statistic). Additional args and kwargs are passed as well.
      returns : pd.Series
          Daily returns of the strategy, noncumulative.
           - See full explanation in tears.create_full_tear_sheet.
      factor_returns : pd.Series, optional
          Daily noncumulative returns of the benchmark factor to which betas are
          computed. Usually a benchmark such as market returns.
           - This is in the same style as returns.
      n_samples : int, optional
          Number of bootstrap samples to draw. Default is 1000.
          Increasing this will lead to more stable / accurate estimates.
  
      Returns
      -------
      numpy.ndarray
          Bootstrapped sampling distribution of passed in func.