A modern, modular quantitative trading platform built with Python, featuring machine learning strategies, professional backtesting, and live trading capabilities.
- π€ Strategy Framework: Multiple quantitative strategies including ML-based stock selection
- π Risk Management: Comprehensive risk controls and position limits
- π° Live Trading: Alpaca integration with paper and live trading support
- π§ Modular Design: Clean, extensible architecture following best practices
finrl-trading/
βββ src/
β βββ config/ # Centralized configuration management
β β βββ settings.py # Pydantic-based settings with environment variables
β βββ data/ # Data acquisition and processing
β β βββ data_fetcher.py # Multi-source data integration (Yahoo/FMP/WRDS)
β β βββ data_processor.py # Data cleaning and feature engineering
β β βββ data_store.py # SQLite-based data persistence
β βββ backtest/ # Backtesting system
β β βββ backtest_engine.py # Professional backtesting engine powered by bt library
β βββ strategies/ # Trading strategies
β β βββ base_strategy.py # Abstract strategy framework
β β βββ ml_strategy.py # ML-based stock selection
β βββ trading/ # Live trading execution
β β βββ alpaca_manager.py # Alpaca API integration
β β βββ trade_executor.py # Order execution and risk management
β β βββ performance_analyzer.py # Performance analysis
β βββ main.py # CLI entry point
βββ examples/ # Examples and tutorials
β βββ FinRL_Full_Workflow.ipynb # Complete workflow tutorial (recommended)
β βββ README.md # Examples documentation
βββ data/ # Runtime data storage (gitignored)
βββ logs/ # Application logs (gitignored)
βββ requirements.txt # Python dependencies
βββ setup.py # Package installation
- Python 3.11+
- Alpaca Account (for live trading)
- Data Source APIs:
- FMP API Key
-
Clone the repository
git clone https://github.com/your-username/FinRL-Trading.git cd FinRL-Trading -
Install dependencies
pip install -r requirements.txt
-
Configure environment variables
# Copy configuration template cp .env.example .env # Edit .env file with your API keys # Windows: notepad .env # Linux/Mac: nano .env
-
Run example tutorial
# Launch Jupyter Notebook (recommended starting point) jupyter notebook examples/FinRL_Full_Workflow.ipynb
The project includes a comprehensive interactive tutorial covering the entire workflow from data acquisition to live trading:
# View examples documentation
cat examples/README.md
# Run complete workflow tutorial (recommended)
jupyter notebook examples/FinRL_Full_Workflow.ipynbTutorial Contents:
- β S&P 500 components data acquisition
- β Fundamental and historical price data fetching
- β Machine learning stock selection strategy implementation
- β Professional backtesting (with VOO/QQQ benchmark comparison)
- β Alpaca Paper Trading execution
from src.data.data_fetcher import get_data_manager
# Initialize data manager (automatically selects best available source)
manager = get_data_manager()
# Check current data source
info = manager.get_source_info()
print(f"Current data source: {info['current_source']}")
print(f"Available sources: {info['available_sources']}")
# Get S&P 500 components
components = manager.get_sp500_components()
# Fetch fundamental data
tickers = ['AAPL', 'MSFT', 'GOOGL']
fundamentals = manager.get_fundamental_data(
tickers, '2020-01-01', '2023-12-31'
)
# Fetch historical price data
prices = manager.get_price_data(
tickers, '2020-01-01', '2023-12-31'
)from src.strategies.ml_strategy import MLStockSelectorStrategy
from src.strategies.base_strategy import StrategyConfig
# Create ML-based stock selection strategy
config = StrategyConfig(
name="ML Stock Selector",
parameters={
'model_type': 'random_forest',
'top_n': 30,
'sector_neutral': True
},
risk_limits={'max_weight': 0.1}
)
strategy = MLStockSelectorStrategy(config)
# Generate portfolio weights
data = {
'fundamentals': fundamentals,
'prices': prices
}
result = strategy.generate_weights(data)
print(result.weights.head())from src.backtest.backtest_engine import BacktestEngine, BacktestConfig
# Configure backtest parameters
backtest_config = BacktestConfig(
start_date='2020-01-01',
end_date='2023-12-31',
initial_capital=1000000,
rebalance_freq='Q', # Quarterly rebalancing
transaction_cost=0.001, # 0.1% transaction cost
benchmark_tickers=['VOO', 'QQQ'] # Benchmark comparison
)
# Run backtest
engine = BacktestEngine(backtest_config)
result = engine.run_backtest(
strategy_name="ML Stock Selector",
weight_signals=ml_weights,
price_data=prices
)
# View backtest results
print(f"Total Return: {result.metrics['total_return']:.2%}")
print(f"Annualized Return: {result.annualized_return:.2%}")
print(f"Sharpe Ratio: {result.metrics['sharpe_ratio']:.2f}")
print(f"Max Drawdown: {result.metrics['max_drawdown']:.2%}")
# Generate visualization report
engine.plot_results(result)from src.trading.alpaca_manager import create_alpaca_account_from_env, AlpacaManager
from src.trading.trade_executor import TradeExecutor, ExecutionConfig
# Connect to Alpaca
account = create_alpaca_account_from_env()
alpaca_manager = AlpacaManager([account])
# Configure execution settings
exec_config = ExecutionConfig(
max_order_value=100000,
risk_checks_enabled=True
)
executor = TradeExecutor(alpaca_manager, exec_config)
# Execute portfolio rebalance
target_weights = {'AAPL': 0.3, 'MSFT': 0.3, 'GOOGL': 0.4}
result = executor.execute_portfolio_rebalance(target_weights)
print(f"Orders placed: {len(result.orders_placed)}")
print(f"Execution success: {result.success}")- Multi-Source Data Manager (
data_fetcher.py): Intelligent data source selection and management- Yahoo Finance: Free financial data (default)
- FMP (Financial Modeling Prep): High-quality paid data (requires API Key)
- WRDS: Academic database (requires credentials)
- Data Processor (
data_processor.py): Feature engineering, data cleaning, and quality checks - Data Storage (
data_store.py): SQLite-based data persistence with caching and version control
- Base Strategy (
base_strategy.py): Abstract framework for custom strategies - ML Strategy (
ml_strategy.py): Random Forest-based stock selection
Implemented Strategies:
- Equal Weight Strategy
- Market Cap Weighted Strategy
- ML-based Stock Selection
- Sector Neutral ML Strategy
- Professional Backtesting Engine (
backtest_engine.py): Powered bybtlibrary- Comprehensive performance and risk analysis
- Multiple benchmark comparison (SPY, VOO, QQQ, etc.)
- Transaction cost simulation
- Visualization report generation
- Alpaca Integration (
alpaca_manager.py): Alpaca API client with multi-account support - Trade Executor (
trade_executor.py): Order management and risk controls - Performance Analyzer (
performance_analyzer.py): Real-time position tracking and P&L calculation
- Pydantic Settings (
settings.py): Type-safe configuration with environment variables - Multi-environment Support: Development, testing, production configurations
- Centralized Management: All settings in one place
The platform uses Pydantic-based settings with environment variable support:
Create a .env file and configure the following variables:
# Application
ENVIRONMENT=development
APP_NAME="FinRL Trading"
# Alpaca API (Required for live trading)
APCA_API_KEY=your_alpaca_key
APCA_API_SECRET=your_alpaca_secret
APCA_BASE_URL=https://paper-api.alpaca.markets # Paper Trading
# Data Sources (Optional, prioritized: FMP > WRDS > Yahoo)
FMP_API_KEY=your_fmp_api_key # Financial Modeling Prep
# Risk Management
TRADING_MAX_ORDER_VALUE=100000 # Maximum order value
TRADING_MAX_PORTFOLIO_TURNOVER=0.5 # Maximum portfolio turnover
STRATEGY_MAX_WEIGHT_PER_STOCK=0.1 # Maximum weight per stock
# Data Management
DATA_CACHE_TTL_HOURS=24 # Cache TTL in hours
DATA_MAX_CACHE_SIZE_MB=1000 # Maximum cache size in MBfrom src.config.settings import get_config
config = get_config()
print(f"Environment: {config.environment}")
print(f"Database: {config.database.url}")
print(f"Risk Limits: {config.trading.max_order_value}")The backtesting engine provides comprehensive quantitative analysis:
- Total Return: Cumulative portfolio performance
- Annualized Return: Time-weighted annual performance
- Alpha: Excess return over benchmark
- Volatility: Standard deviation of returns
- Sharpe Ratio: Risk-adjusted returns (Return Γ· Volatility)
- Sortino Ratio: Downside risk-adjusted returns
- Maximum Drawdown: Peak-to-trough decline
- Calmar Ratio: Return Γ· Maximum Drawdown
- Skewness & Kurtosis: Return distribution characteristics
- Information Ratio: Active return Γ· Tracking error
- Beta: Portfolio sensitivity to market
- Tracking Error: Standard deviation of active returns
We welcome contributions! Please follow these guidelines:
- Fork the repository
- Create a feature branch
git checkout -b feature/your-feature-name
- Install development dependencies
pip install -r requirements.txt pip install pytest black flake8 mypy
- Make your changes with proper testing
- Commit and push
git commit -m "Add: your feature description" git push origin feature/your-feature-name - Open a Pull Request
- Type Hints: Use modern Python typing
- Documentation: Add docstrings to all public functions
- Testing: Write tests for new features
- Style: Follow PEP 8 with Black formatting
from src.strategies.base_strategy import BaseStrategy, StrategyConfig, StrategyResult
class MyCustomStrategy(BaseStrategy):
def generate_weights(self, data, **kwargs) -> StrategyResult:
# Your strategy logic here
pass- β Modular strategy framework
- β ML-based stock selection strategies
- β Professional backtesting system (powered by bt library)
- β Alpaca live trading integration
- β Multi-source data support (Yahoo/FMP/WRDS)
- β Comprehensive risk management system
- β Performance analysis and reporting
- π Deep reinforcement learning strategies
- π Alternative data integration
- π Multi-asset support (crypto, futures)
- π Advanced portfolio optimization algorithms
- π Real-time alerting system
- π Web visualization interface
- π Docker containerization
This project is licensed under the Apache License 2.0 - see the LICENSE file for details.
This software is for educational and research purposes only.
Always consult with qualified financial professionals before making investment decisions. Past performance does not guarantee future results.
- Machine Learning for Stock Recommendation - Machine learning approaches to stock selection
- FinRL: Deep Reinforcement Learning Framework - Deep RL framework for quantitative trading
- Portfolio Allocation with Deep Reinforcement Learning - Portfolio optimization research
- FinRL - Deep reinforcement learning framework for quantitative trading
- Alpaca-py - Alpaca trading API
- bt - Flexible backtesting framework for Python
- Yahoo Finance - Free financial data
- Financial Modeling Prep - Professional financial data API
- WRDS (Wharton Research Data Services) - Academic financial database
- Alpaca Markets - Brokerage API and market data
Built with β€οΈ for the quantitative finance community
