This module provides comprehensive tools for quantitative factor analysis, including factor calculation, screening, backtesting, stock selection, and optimization.
The quantitative factor analysis module consists of five main components:
- FactorCalculator - Calculate various quantitative factors
- FactorScreener - Screen and filter stocks based on factors
- FactorBacktest - Backtest factor performance
- StockSelector - Implement stock selection strategies
- FactorOptimizer - Optimize factor weights and parameters
pip install -r requirements.txtfrom data_service.factors import FactorCalculator, FactorScreener, FactorBacktest
# Initialize components
factor_calculator = FactorCalculator()
factor_screener = FactorScreener()
factor_backtest = FactorBacktest()
# Calculate factors
factors = factor_calculator.calculate_all_factors(symbol, prices, volumes, financial_data)
# Screen stocks
screener = factor_screener.create_momentum_screener()
results = screener.screen_stocks(factor_data)
# Backtest factor
backtest_result = factor_backtest.run_factor_backtest(factor_data, price_data)Calculates various quantitative factors from market data.
-
Momentum Factors
- Price momentum (20d, 60d, 252d)
- Volume momentum
- Relative strength vs market
-
Value Factors
- P/E ratio
- P/B ratio
- P/S ratio
- Dividend yield
- EV/EBITDA
-
Quality Factors
- ROE (Return on Equity)
- ROA (Return on Assets)
- Debt to Equity ratio
- Current ratio
- Gross margin
- Operating margin
-
Size Factors
- Market cap
- Enterprise value
-
Volatility Factors
- Price volatility
- Beta
- Sharpe ratio
- Maximum drawdown
- Value at Risk (VaR)
-
Technical Factors
- RSI
- MACD
- Moving averages
- Bollinger Bands
from data_service.factors import FactorCalculator
calculator = FactorCalculator()
# Calculate momentum factors
momentum_factors = calculator.calculate_price_momentum(prices, periods=[20, 60, 252])
# Calculate value factors
value_factors = calculator.calculate_value_factors(financial_data)
# Calculate all factors
all_factors = calculator.calculate_all_factors(
symbol, prices, volumes, financial_data, market_data
)Screens and filters stocks based on factor criteria.
-
Value Screener
- Low P/E ratio
- Low P/B ratio
- High dividend yield
-
Momentum Screener
- High price momentum
- High volume momentum
- RSI in optimal range
-
Quality Screener
- High ROE
- Low debt to equity
- High current ratio
-
Multi-Factor Screener
- Combines multiple factors with weights
from data_service.factors import FactorScreener
screener = FactorScreener()
# Create value screener
value_screener = screener.create_value_screener(
max_pe=20.0, max_pb=3.0, min_dividend_yield=2.0
)
# Create momentum screener
momentum_screener = screener.create_momentum_screener(
min_momentum=10.0, min_volume_momentum=5.0
)
# Screen stocks
results = screener.screen_stocks(factor_data)
# Add custom filters
screener.add_market_cap_filter(min_market_cap=1000000000) # $1B
screener.add_volatility_filter(max_volatility=30.0)Backtests factor performance and calculates metrics.
-
Return Metrics
- Total return
- Annualized return
- Sharpe ratio
- Win rate
- Maximum drawdown
-
Information Coefficient (IC)
- IC mean and standard deviation
- IC Information Ratio
- Rank IC metrics
from data_service.factors import FactorBacktest
backtest = FactorBacktest()
# Run single factor backtest
result = backtest.run_factor_backtest(
factor_data, price_data, rebalance_frequency='monthly'
)
# Run multi-factor backtest
factor_weights = {'momentum': 0.6, 'value': 0.4}
result = backtest.run_multi_factor_backtest(
factor_data, price_data, factor_weights
)
# Generate performance report
report = backtest.generate_performance_report(result)
print(report)
# Plot performance
backtest.plot_factor_performance(result, "factor_performance.png")Implements various stock selection strategies.
-
Top N Selection
- Select top N stocks by factor value
-
Equal Weight Selection
- Equal weights for selected stocks
-
Factor Weighted Selection
- Weights proportional to factor values
-
Risk Parity Selection
- Equal risk contribution
from data_service.factors import StockSelector
selector = StockSelector(max_positions=50)
# Select top N stocks
result = selector.select_stocks(
factor_data, price_data,
selection_method='top_n',
n=20,
factor_name='momentum_20d'
)
# Update portfolio
portfolio_update = selector.update_portfolio(result, current_prices)
# Get portfolio metrics
metrics = selector.calculate_portfolio_metrics(price_data)Optimizes factor weights and parameters.
-
Scipy Optimization
- SLSQP method for constrained optimization
-
Genetic Algorithm
- Differential evolution for global optimization
-
Grid Search
- Exhaustive search over parameter grid
-
Cross-Validation
- Time-series cross-validation
from data_service.factors import FactorOptimizer
optimizer = FactorOptimizer()
# Optimize factor weights
result = optimizer.optimize_factor_weights(
factor_data, price_data,
objective_function='sharpe_ratio',
method='scipy'
)
# Grid search optimization
result = optimizer.grid_search_optimization(
factor_data, price_data, factor_names
)
# Generate optimization report
report = optimizer.generate_optimization_report(result)import pandas as pd
from data_service.factors import *
# 1. Calculate factors
calculator = FactorCalculator()
factor_data = []
for symbol in symbols:
factors = calculator.calculate_all_factors(symbol, prices, volumes, financial_data)
factor_data.append(factors)
# 2. Screen stocks
screener = FactorScreener()
momentum_screener = screener.create_momentum_screener()
screening_results = momentum_screener.screen_stocks(factor_data)
# 3. Backtest factor
backtest = FactorBacktest()
backtest_result = backtest.run_factor_backtest(factor_data, price_data)
# 4. Select stocks
selector = StockSelector()
selection_result = selector.select_stocks(
factor_data, price_data, selection_method='top_n', n=20
)
# 5. Optimize weights
optimizer = FactorOptimizer()
optimization_result = optimizer.optimize_factor_weights(
factor_data, price_data, objective_function='sharpe_ratio'
)
# 6. Generate reports
print(backtest.generate_performance_report(backtest_result))
print(optimizer.generate_optimization_report(optimization_result))Price Data:
price_data = pd.DataFrame({
'symbol': ['AAPL', 'GOOGL', ...],
'date': ['2023-01-01', '2023-01-01', ...],
'close': [150.0, 2800.0, ...],
'volume': [1000000, 500000, ...]
})Factor Data:
factor_data = pd.DataFrame({
'symbol': ['AAPL', 'GOOGL', ...],
'date': ['2023-01-01', '2023-01-01', ...],
'factor_name': ['momentum_20d', 'pe_ratio', ...],
'factor_value': [0.05, 25.0, ...]
})Financial Data:
financial_data = {
'price': 150.0,
'eps': 6.0,
'book_value_per_share': 25.0,
'revenue_per_share': 50.0,
'dividend_per_share': 0.88,
'net_income': 1000000000,
'shareholders_equity': 5000000000,
'total_assets': 10000000000,
'total_debt': 2000000000,
'current_assets': 3000000000,
'current_liabilities': 1500000000
}- Data Size: The module can handle large datasets but performance may degrade with very large universes
- Memory Usage: Factor calculations can be memory-intensive for large datasets
- Optimization: Use vectorized operations where possible for better performance
- pandas
- numpy
- scipy
- matplotlib
- seaborn
- Fork the repository
- Create a feature branch
- Make your changes
- Add tests
- Submit a pull request
This project is licensed under the MIT License.