Production-grade portfolio optimization and risk analysis system. Processes 24,500+ days of market data across 25+ equities and cryptocurrencies using modern portfolio theory.
Portfolio Optimization Engine
- Mean-variance optimization (maximize Sharpe ratio / minimize volatility)
- Ledoit-Wolf covariance shrinkage with matrix regularization
- Multi-solver support (ECOS/SCS/OSQP) with automatic fallback
- Numerical stability handling: eigenvalue analysis, positive semi-definite enforcement
Data Infrastructure
- DuckDB analytics database for high-performance time-series analysis
- Yahoo Finance API integration with automated validation
- Robust data pipeline with error handling and outlier detection
- Efficient column-oriented storage with SQL interface
Risk Analytics
- Sharpe ratio, volatility, maximum drawdown analysis
- Rolling performance windows (60-day metrics)
- Portfolio risk attribution
- Strategy comparison and benchmark analysis
Interactive Dashboard
- Real-time portfolio visualization with Plotly
- Multiple optimization strategies and asset classes
- Dynamic weight allocation display
- Performance tracking with cumulative returns
Python • pandas • NumPy • PyPortfolioOpt • DuckDB • Streamlit • Plotly • yfinance
# Setup
git clone https://github.com/leaalonzo/quant-portfolio-analytics-dev.git
cd quant-portfolio-analytics-dev
python3 -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
# Run pipeline
python -m utils.fetch_all_data # Fetch market data
python scripts/build_factors.py # Process data
python scripts/run_backtest.py # Run backtests
streamlit run app/app.py # Launch dashboard├── app/app.py # Streamlit dashboard
├── data/ # CSV & DuckDB files
├── scripts/
│ ├── build_factors.py # Data processing
│ └── run_backtest.py # Portfolio backtesting
├── utils/
│ ├── optimize.py # Portfolio optimization
│ ├── backtest.py # Portfolio construction
│ └── risk.py # Risk analytics
│ └── fetch_all_data.py # Fetch raw data from API
└── requirements.txt- Max Sharpe: Maximize risk-adjusted returns using PyPortfolioOpt
- Min Volatility: Minimize portfolio variance
- Covariance: Ledoit-Wolf shrinkage for robust estimation
- Constraints: Position limits (0-50% per asset)
# Covariance regularization
S = returns.cov() * 252
S = S + np.eye(len(S)) * 0.1 # 10% diagonal loading
# Matrix symmetry enforcement
S = (S + S.T) / 2
# Multi-solver fallback
solvers = ['ECOS', 'SCS', 'OSQP']
for solver in solvers:
try:
ef = EfficientFrontier(mu, S, solver=solver)
# Optimization succeeds
except:
# Try next solver- Infinity value replacement
- NaN handling (forward-fill → backward-fill → zero-fill)
- Extreme value clipping (-50% to +100% daily returns)
- Zero variance detection and removal
Robust Optimization
- Automatic solver selection and fallback mechanism
- Handles numerical instability in crypto data
- Equal-weight fallback when optimization fails
- Performance validation (detects invalid results)
Data Quality Management
- Dynamic NaN threshold (80% for equities, 50% for crypto)
- Asset-class specific data handling
- Comprehensive validation checks
- Diagnostic logging and error reporting
Portfolio Strategies
- Long-only and long-short portfolios
- Equal-weight and optimized allocations
- Multiple rebalancing approaches
- Strategy-specific asset selection
Equity Portfolio - Max Sharpe
├── Expected Return: 12.4%
├── Volatility: 15.8%
├── Sharpe Ratio: 0.66
└── Assets: 15 equities
Crypto Portfolio - Min Volatility
├── Expected Return: 28.7%
├── Volatility: 42.1%
├── Sharpe Ratio: 0.63
└── Assets: 7 cryptocurrencies
Data Collection → DuckDB Storage → Portfolio Backtesting → Optimization → Dashboard
↓ ↓ ↓ ↓ ↓
yfinance SQL DB Equal-weight PyPortfolioOpt Streamlit
Long/Short Ledoit-Wolf Plotly
Returns
- Cumulative returns
- Annualized returns
- Rolling performance
Risk
- Volatility (annualized)
- Maximum drawdown
- Downside deviation
Risk-Adjusted
- Sharpe ratio
- Sortino ratio
- Rolling Sharpe
Local
streamlit run app/app.pyDocker
docker build -t quant-portfolio .
docker run -p 8501:8501 quant-portfolioCloud: Streamlit Cloud, AWS, GCP
-- Portfolio performance
SELECT date, cumulative
FROM portfolio_results
WHERE asset_type = 'Equity';
-- Holdings analysis
SELECT tickers, COUNT(*) as appearances
FROM portfolio_holdings
GROUP BY tickers
ORDER BY appearances DESC;This is a personal educational project developed independently.
MIT License
⭐ Star this repo if you find it useful!