code: def min_var_portfolio(cov_mat, allow_short=False):
      
      if not isinstance(cov_mat, pd.DataFrame):
          raise ValueError("Covariance matrix is not a DataFrame")
  
      n = len(cov_mat)
  
      P = opt.matrix(cov_mat.values)
      q = opt.matrix(0.0, (n, 1))
  
      # Constraints Gx <= h
      if not allow_short:
          # x >= 0
          G = opt.matrix(-np.identity(n))
          h = opt.matrix(0.0, (n, 1))
      else:
          G = None
          h = None
  
      # Constraints Ax = b
      # sum(x) = 1
      A = opt.matrix(1.0, (1, n))
      b = opt.matrix(1.0)
  
      # Solve
      optsolvers.options['show_progress'] = False
      sol = optsolvers.qp(P, q, G, h, A, b)
  
      if sol['status'] != 'optimal':
          warnings.warn("Convergence problem")
  
      # Put weights into a labeled series
      weights = pd.Series(sol['x'], index=cov_mat.index)
      return weights
docs: Computes the minimum variance portfolio.
  
      Note: As the variance is not invariant with respect
      to leverage, it is not possible to construct non-trivial
      market neutral minimum variance portfolios. This is because
      the variance approaches zero with decreasing leverage,
      i.e. the market neutral portfolio with minimum variance
      is not invested at all.
      
      Parameters
      ----------
      cov_mat: pandas.DataFrame
          Covariance matrix of asset returns.
      allow_short: bool, optional
          If 'False' construct a long-only portfolio.
          If 'True' allow shorting, i.e. negative weights.
  
      Returns
      -------
      weights: pandas.Series
          Optimal asset weights.