Given a pandas DataFrame 'returns' of daily asset returns (index: dates; columns: tickers) and an annualized risk‑free rate r_f, implement a simulation‑based portfolio optimizer in Python:
-
Generate N random long‑only portfolios (weights ≥ 0, sum to
1), with an optional max‑weight constraint per asset and a random seed for reproducibility.
-
For each portfolio, compute annualized expected return, annualized volatility, and Sharpe ratio; handle missing values and differing asset histories robustly.
-
Identify the portfolio with the highest Sharpe and return: best weights, expected return, volatility, Sharpe; also return a DataFrame of all simulations sorted by Sharpe.
-
Use NumPy/Pandas vectorization (avoid Python loops where possible) and include clear function signatures, docstrings, and brief time/space complexity notes.