This directory contains a Python-based factor investing portfolio system. See the factor_portfolio directory for detailed documentation and implementation.
- Data Ingestion: Automated download and processing of S&P 500 stock data using yfinance
- Factor Models: Implementation of multiple factors:
- Value (P/E and P/B ratios)
- Momentum (trailing returns)
- Volatility (rolling standard deviation)
- Size (market capitalization)
- Alpha Modeling: Machine learning-based return prediction using Random Forest or Lasso regression
- Risk Modeling: Covariance estimation with shrinkage techniques
- Portfolio Optimization: Sharpe ratio maximization with constraints
- Backtesting: Rolling window backtesting framework with performance metrics
- Visualization: Interactive plots of returns, factor exposures, and portfolio weights
- Factor Portfolio Website
cd factor-portfolio- Install dependencies:
conda env create -f environment.ymlfactor_portfolio/
├── main.py # Main execution script
├── factors/ # Factor implementations
│ ├── base.py # Base Factor class
│ ├── value.py # Value factor
│ ├── momentum.py # Momentum factor
│ ├── volatility.py # Volatility factor
│ └── size.py # Size factor
├── models/ # Machine learning models
│ └── alpha_model.py # Alpha prediction model
├── optimization/ # Portfolio optimization
│ ├── portfolio_optimizer.py # Portfolio optimization
│ └── risk_model.py # Risk modeling
├── backtesting/ # Backtesting framework
│ └── backtester.py # Backtesting implementation
└── utils/ # Utility functions
├── data_preparation.py # Data processing
└── visualization.py # Plotting utilities
Run the main script:
python -m factor_portfolio.mainThe script will:
- Download S&P 500 data
- Compute factor scores
- Train the alpha model
- Run the backtest
- Display performance metrics
- Generate visualizations
The system calculates and displays:
- Annual Return
- Annual Volatility
- Sharpe Ratio
- Maximum Drawdown
- Create a new file in the
factorsdirectory - Inherit from the base
Factorclass - Implement the
computemethod
- Create a new file in the
modelsdirectory - Implement the required interface (fit/predict methods)
- Edit
portfolio_optimizer.pyto add new optimization strategies - Modify constraints in the
optimize_sharpemethod
- numpy>=1.21.0
- pandas>=1.3.0
- yfinance>=0.1.70
- scikit-learn>=0.24.2
- matplotlib>=3.4.2
- seaborn>=0.11.1
- cvxpy>=1.1.7
MIT License