A clean, reproducible pipeline to compare portfolio weighting strategies (EW, IV, ERC, GMV, MSR) with multiple covariance estimators (sample, constant correlation, shrinkage). It fetches data via yfinance, generates plots/tables, and compiles a LaTeX report.
- Multiple Portfolio Strategies: EW (Equal Weight), IV (Inverse Volatility), ERC (Equal Risk Contribution), GMV (Global Minimum Variance), MSR (Maximum Sharpe Ratio)
- Covariance Estimation Methods: Sample, Constant Correlation, Shrinkage, and Lower Bound estimators
- Automated Report Generation: Fetches market data, generates tables and plots, compiles LaTeX PDF
- Backtesting & Analysis: Wealth evolution, drawdown analysis, risk contributions, CAPM regression
- Asset Management: Easy cleanup of generated files
portfolio_opt/ # Python package
├─ __init__.py
├─ data_loader.py # Download prices and compute returns via yfinance
├─ portfolio.py # Portfolio class and plotting functions
├─ kit.py # Utilities (risk metrics, covariances, stats)
└─ table_analyse.py # Table analysis utilities
scripts/
├─ generate_report.py # Entrypoint to build results and compile LaTeX
└─ clean.py # Cleanup script to remove generated files
data/
└─ FF/ # Fama-French CSVs (e.g., FF_Monthly_Data.csv)
notebooks/
└─ FF_Data.ipynb
main.tex # LaTeX report (inputs from results/ and config/)
requirements.txt
Generated folders (ignored by Git):
results/: LaTeX tablesconfig/: figures (PDF)
- Python 3.9+
- LaTeX distribution (for PDF compilation):
pdflatex
- Create a virtual environment:
python3 -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate- Install dependencies:
pip install -r requirements.txt- pandas: Data manipulation and analysis
- numpy: Numerical computations
- matplotlib: Plotting and visualization
- seaborn: Statistical visualizations
- yfinance: Yahoo Finance API for market data
- statsmodels: Statistical modeling
- scipy: Scientific computing
- Fama-French Data: Ensure
data/FF/FF_Monthly_Data.csvexists (Fama-French monthly factors). Adjust path inportfolio_opt/portfolio.pyif you use a different filename. - Market Data: Downloaded automatically via
yfinanceAPI
From the project root:
python scripts/generate_report.pyThis will:
- Download market data via
yfinance - Generate figures into
config/and tables intoresults/ - Try to compile
main.texusingpdflatex(fallback path included). If it fails, runpdflatex main.texmanually.
To remove all generated files (tables, plots, LaTeX auxiliaries):
python scripts/clean.pyThis removes:
- All files in
results/directory - All files in
config/directory - LaTeX auxiliary files (
.aux,.log,.out) - Compiled PDF (
main.pdf)
The project implements several portfolio optimization strategies:
- EW (Equal Weight): Equal allocation across all assets
- IV (Inverse Volatility): Weight inversely proportional to volatility
- ERC (Equal Risk Contribution): Optimal diversification by equalizing risk contributions
- GMV (Global Minimum Variance): Minimizes portfolio variance
- MSR (Maximum Sharpe Ratio): Maximizes risk-adjusted returns
Each strategy is tested with different covariance estimators:
- Sample: Standard historical covariance
- Constant Correlation: Assumes constant pairwise correlations
- Shrinkage: Ledoit-Wolf shrinkage estimator
- Lower Bound: Constrained optimization variant
- Outputs are ignored by Git via
.gitignore. - The script enforces running from project root so relative paths resolve correctly.
- Default tickers: SPY, QQQ, EFA, EEM, TLT, IEF, LQD, GLD (can be modified in
generate_report.py)
MIT