portfolio_lib package
Submodules
portfolio_lib.core module
Portfolio-lib - Lightweight Python Backtesting Library A comprehensive backtesting framework for algorithmic trading strategies
- class portfolio_lib.core.BaseStrategy[source]
Bases:
objectBase strategy class
- class portfolio_lib.core.Backtest(strategy: BaseStrategy, initial_cash: float = 100000.0)[source]
Bases:
objectMain backtesting engine
- __init__(strategy: BaseStrategy, initial_cash: float = 100000.0)[source]
- run(start_date: str = '2020-01-01', end_date: str = None) BacktestResults[source]
Run the backtest
- class portfolio_lib.core.YFinanceDataFeed(symbols: List[str])[source]
Bases:
DataFeedYahoo Finance data feed
- class portfolio_lib.core.TechnicalIndicators[source]
Bases:
objectConvenience class for technical indicator calculations
- class portfolio_lib.core.indicators[source]
Bases:
object- class MACD(fast_period: int = 12, slow_period: int = 26, signal_period: int = 9)
Bases:
objectMoving Average Convergence Divergence
- class BollingerBands(period: int = 20, std_dev: float = 2.0)
Bases:
objectBollinger Bands indicator
- class KAMA(period: int = 10, fast_sc: int = 2, slow_sc: int = 30)
Bases:
BaseIndicatorKaufman Adaptive Moving Average
- class ParabolicSAR(af_start: float = 0.02, af_increment: float = 0.02, af_max: float = 0.2)
Bases:
objectParabolic Stop and Reverse
- class AlmaIndicator(period: int = 9, offset: float = 0.85, sigma: float = 6)
Bases:
BaseIndicatorArnaud Legoux Moving Average (ALMA)
- class UltimateOscillator(period1: int = 7, period2: int = 14, period3: int = 28)
Bases:
objectUltimate Oscillator
- class AwesomeOscillator(fast_period: int = 5, slow_period: int = 34)
Bases:
objectAwesome Oscillator
- class KnowSureThing(roc1: int = 10, roc2: int = 15, roc3: int = 20, roc4: int = 30, sma1: int = 10, sma2: int = 10, sma3: int = 10, sma4: int = 15, signal: int = 9)
Bases:
objectKnow Sure Thing (KST)
- class PercentagePriceOscillator(fast_period: int = 12, slow_period: int = 26, signal_period: int = 9)
Bases:
objectPercentage Price Oscillator (PPO)
- class SchaffTrendCycle(cycle_period: int = 10, fast_period: int = 23, slow_period: int = 50)
Bases:
objectSchaff Trend Cycle
- class AbsolutePriceOscillator(fast_period: int = 12, slow_period: int = 26)
Bases:
objectAbsolute Price Oscillator (APO)
- class CooppockCurve(wma_period: int = 10, roc1_period: int = 14, roc2_period: int = 11)
Bases:
objectCoppock Curve
- class StochasticMomentumIndex(k_period: int = 10, d_period: int = 3)
Bases:
objectStochastic Momentum Index
- class KeltnerBands(period: int = 20, multiplier: float = 1.5)
Bases:
objectKeltner Bands (alternative implementation)
- class VolumeOscillator(fast_period: int = 5, slow_period: int = 10)
Bases:
objectVolume Oscillator
- class portfolio_lib.core.Position(symbol: str, quantity: float, entry_price: float, timestamp: datetime = None)[source]
Bases:
objectRepresents a trading position
- class portfolio_lib.core.Trade(symbol: str, quantity: float, price: float, timestamp: datetime, action: str = None, side: str = None, commission: float = 0.0)[source]
Bases:
objectRepresents a completed trade
- class portfolio_lib.core.Portfolio(initial_cash: float = 100000.0)[source]
Bases:
objectPortfolio management class
- class portfolio_lib.core.PerformanceMetrics(equity_curve: List[float], timestamps: List[datetime], trades: List[Trade], initial_cash: float)[source]
Bases:
objectCalculate performance metrics
portfolio_lib.indicators module
Technical Analysis Indicators Library Comprehensive collection of technical indicators for quantitative analysis
- class portfolio_lib.indicators.TechnicalIndicators[source]
Bases:
objectCollection of technical analysis indicators
- static sma(data: List[float] | ndarray | Series, period: int) ndarray[source]
Simple Moving Average
- static ema(data: List[float] | ndarray | Series, period: int) ndarray[source]
Exponential Moving Average
- static rsi(data: List[float] | ndarray | Series, period: int = 14) ndarray[source]
Relative Strength Index
- static macd(data: List[float] | ndarray | Series, fast_period: int = 12, slow_period: int = 26, signal_period: int = 9) Tuple[ndarray, ndarray, ndarray][source]
MACD (Moving Average Convergence Divergence)
- static bollinger_bands(data: List[float] | ndarray | Series, period: int = 20, std_dev: float = 2.0) Tuple[ndarray, ndarray, ndarray][source]
Bollinger Bands
- static stochastic_oscillator(high: ndarray, low: ndarray, close: ndarray, k_period: int = 14, d_period: int = 3) Tuple[ndarray, ndarray][source]
Stochastic Oscillator
- static williams_r(high: ndarray, low: ndarray, close: ndarray, period: int = 14) ndarray[source]
Williams %R
- static momentum(data: List[float] | ndarray | Series, period: int = 10) ndarray[source]
Momentum Indicator
- static atr(high: ndarray, low: ndarray, close: ndarray, period: int = 14) ndarray[source]
Average True Range
- static adx(high: ndarray, low: ndarray, close: ndarray, period: int = 14) Tuple[ndarray, ndarray, ndarray][source]
Average Directional Index
- static cci(high: ndarray, low: ndarray, close: ndarray, period: int = 20) ndarray[source]
Commodity Channel Index
- static mfi(high: ndarray, low: ndarray, close: ndarray, volume: ndarray, period: int = 14) ndarray[source]
Money Flow Index
- static ichimoku(high: ndarray, low: ndarray, close: ndarray, tenkan_period: int = 9, kijun_period: int = 26, senkou_b_period: int = 52) dict[source]
Ichimoku Cloud
- static parabolic_sar(high: ndarray, low: ndarray, af_start: float = 0.02, af_max: float = 0.2) ndarray[source]
Parabolic SAR
- static klinger_oscillator(high: ndarray, low: ndarray, close: ndarray, volume: ndarray, fast_period: int = 34, slow_period: int = 55, signal_period: int = 13) Tuple[ndarray, ndarray][source]
Klinger Oscillator - measures the difference between money flow volume and cumulative volume
- static price_channel(high: ndarray, low: ndarray, period: int = 20) Tuple[ndarray, ndarray, ndarray][source]
Price Channel - highest high and lowest low over a period
- static donchian_channel(high: ndarray, low: ndarray, period: int = 20) Tuple[ndarray, ndarray, ndarray][source]
Donchian Channel - same as price channel but different name/usage
- static elder_force_index(close: ndarray, volume: ndarray, period: int = 13) ndarray[source]
Elder’s Force Index - volume and price change momentum
- static ease_of_movement(high: ndarray, low: ndarray, volume: ndarray, period: int = 14) ndarray[source]
Ease of Movement - price movement relative to volume
- static mass_index(high: ndarray, low: ndarray, period: int = 25, ema_period: int = 9) ndarray[source]
Mass Index - volatility indicator based on range expansion
- static negative_volume_index(close: ndarray, volume: ndarray) ndarray[source]
Negative Volume Index - cumulative indicator for down volume days
- static positive_volume_index(close: ndarray, volume: ndarray) ndarray[source]
Positive Volume Index - cumulative indicator for up volume days
- static price_volume_trend(close: ndarray, volume: ndarray) ndarray[source]
Price Volume Trend - volume-weighted momentum indicator
- static volume_accumulation(close: ndarray, volume: ndarray) ndarray[source]
Volume Accumulation - simplified A/D line using close only
- static williams_ad(high: ndarray, low: ndarray, close: ndarray, volume: ndarray) ndarray[source]
Williams Accumulation/Distribution
- static coppock_curve(close: ndarray, roc1_period: int = 14, roc2_period: int = 11, wma_period: int = 10) ndarray[source]
Coppock Curve - long-term momentum indicator
- static know_sure_thing(close: ndarray, roc1_period: int = 10, roc1_ma: int = 10, roc2_period: int = 15, roc2_ma: int = 10, roc3_period: int = 20, roc3_ma: int = 10, roc4_period: int = 30, roc4_ma: int = 15, signal_period: int = 9) Tuple[ndarray, ndarray][source]
Know Sure Thing (KST) - momentum oscillator
- static price_oscillator(close: ndarray, fast_period: int = 12, slow_period: int = 26) ndarray[source]
Price Oscillator - percentage difference between two moving averages
- static ultimate_oscillator(high: ndarray, low: ndarray, close: ndarray, period1: int = 7, period2: int = 14, period3: int = 28) ndarray[source]
Ultimate Oscillator - momentum oscillator using three timeframes
- static triple_ema(data: List[float] | ndarray | Series, period: int) ndarray[source]
Triple Exponential Moving Average (TEMA)
- static relative_vigor_index(open_price: ndarray, high: ndarray, low: ndarray, close: ndarray, period: int = 10) Tuple[ndarray, ndarray][source]
Relative Vigor Index - momentum indicator comparing closing to opening
- static schaff_trend_cycle(close: ndarray, fast_period: int = 23, slow_period: int = 50, cycle_period: int = 10) ndarray[source]
Schaff Trend Cycle - combines MACD with Stochastic
- static stochastic_rsi(close: ndarray, period: int = 14, stoch_period: int = 14, k_period: int = 3, d_period: int = 3) Tuple[ndarray, ndarray][source]
Stochastic RSI - Stochastic applied to RSI
- static vortex_indicator(high: ndarray, low: ndarray, close: ndarray, period: int = 14) Tuple[ndarray, ndarray][source]
Vortex Indicator - trend indicator based on vortex movement
- static supertrend(data: DataFrame, period: int = 10, multiplier: float = 3.0) Tuple[ndarray, ndarray][source]
SuperTrend indicator
- static keltner_channels(data: DataFrame, period: int = 20, multiplier: float = 2.0) Tuple[ndarray, ndarray, ndarray][source]
Keltner Channels
- static donchian_channels(data: DataFrame, period: int = 20) Tuple[ndarray, ndarray, ndarray][source]
Donchian Channels
- static aroon(data: DataFrame, period: int = 14) Tuple[ndarray, ndarray][source]
Aroon Up and Aroon Down
- static chande_momentum_oscillator(close: ndarray, period: int = 14) ndarray[source]
Chande Momentum Oscillator (CMO)
- static detrended_price_oscillator(close: ndarray, period: int = 14) ndarray[source]
Detrended Price Oscillator (DPO)
- static trix(close: ndarray, period: int = 14) ndarray[source]
TRIX - Rate of change of triple smoothed EMA
- static williams_accumulation_distribution(data: DataFrame) ndarray[source]
Williams Accumulation/Distribution Line
portfolio_lib.portfolio module
Portfolio Management and Risk Analytics Module Comprehensive portfolio management with advanced risk metrics
- class portfolio_lib.portfolio.AdvancedPortfolioAnalytics(returns: ndarray, benchmark_returns: ndarray | None = None)[source]
Bases:
objectAdvanced portfolio analytics and risk management
- calculate_cvar(confidence_level: float = 0.05) float[source]
Calculate Conditional Value at Risk (Expected Shortfall)
- calculate_maximum_drawdown(equity_curve: ndarray) Tuple[float, int, int][source]
Calculate maximum drawdown and duration
- calculate_ulcer_index(equity_curve: ndarray) float[source]
Calculate Ulcer Index - measure of downside risk
- calculate_modigliani_ratio(risk_free_rate: float = 0.0) float[source]
Calculate Modigliani-Modigliani Ratio
- calculate_kappa_ratio(order: int = 3, threshold: float = 0.0) float[source]
Calculate Kappa Ratio (generalized downside risk measure)
- calculate_comprehensive_risk_metrics(equity_curve: ndarray) RiskMetrics[source]
Calculate comprehensive risk metrics
- class portfolio_lib.portfolio.PositionSizing[source]
Bases:
objectPosition sizing and risk management
- static kelly_criterion(win_rate: float, avg_win: float, avg_loss: float) float[source]
Calculate Kelly Criterion optimal position size
- static fixed_fractional(account_equity: float, risk_per_trade: float, stop_loss_pct: float) float[source]
Calculate position size using fixed fractional method
- class portfolio_lib.portfolio.PerformanceAttribution(portfolio_returns: ndarray, benchmark_returns: ndarray, weights: ndarray, asset_returns: ndarray)[source]
Bases:
objectPerformance attribution analysis
- __init__(portfolio_returns: ndarray, benchmark_returns: ndarray, weights: ndarray, asset_returns: ndarray)[source]
Module contents
Portfolio-lib - Lightweight Python Backtesting Library
A comprehensive backtesting framework for algorithmic trading strategies.
Authors: Rahul Ashok, Pritham Devaprasad, Siddarth S, and Anish R
This library provides a lightweight, high-performance backtesting engine for developing and testing quantitative trading strategies.
Key Features: - Ultra-lightweight architecture (< 500KB) - 129 technical indicators - Event-driven backtesting engine - Multi-asset portfolio simulation - Comprehensive performance analytics - Risk management tools - yfinance data integration
- Basic Usage:
>>> from portfolio_lib import BaseStrategy, Backtest, YFinanceDataFeed >>> >>> class MyStrategy(BaseStrategy): ... def next(self): ... # Your strategy logic here ... pass >>> >>> strategy = MyStrategy() >>> backtest = Backtest(strategy, initial_cash=100000) >>> data_feed = YFinanceDataFeed(['AAPL']) >>> backtest.add_data_source(data_feed) >>> results = backtest.run('2020-01-01', '2023-12-31') >>> print(results.summary())
- class portfolio_lib.Position(symbol: str, quantity: float, entry_price: float, timestamp: datetime = None)[source]
Bases:
objectRepresents a trading position
- class portfolio_lib.Trade(symbol: str, quantity: float, price: float, timestamp: datetime, action: str = None, side: str = None, commission: float = 0.0)[source]
Bases:
objectRepresents a completed trade
- class portfolio_lib.Portfolio(initial_cash: float = 100000.0)[source]
Bases:
objectPortfolio management class
- class portfolio_lib.YFinanceDataFeed(symbols: List[str])[source]
Bases:
DataFeedYahoo Finance data feed
- class portfolio_lib.Backtest(strategy: BaseStrategy, initial_cash: float = 100000.0)[source]
Bases:
objectMain backtesting engine
- __init__(strategy: BaseStrategy, initial_cash: float = 100000.0)[source]
- run(start_date: str = '2020-01-01', end_date: str = None) BacktestResults[source]
Run the backtest
- class portfolio_lib.BacktestResults(portfolio: Portfolio, metrics: PerformanceMetrics)[source]
Bases:
objectBacktest results container
- __init__(portfolio: Portfolio, metrics: PerformanceMetrics)[source]
- class portfolio_lib.PerformanceMetrics(equity_curve: List[float], timestamps: List[datetime], trades: List[Trade], initial_cash: float)[source]
Bases:
objectCalculate performance metrics
- class portfolio_lib.TechnicalIndicators[source]
Bases:
objectConvenience class for technical indicator calculations
- static bollinger_bands(data: Series, period: int = 20, std_dev: float = 2)[source]
Bollinger Bands - returns (upper, middle, lower)
- portfolio_lib.AdditionalIndicators
alias of
TechnicalIndicators
- class portfolio_lib.RiskMetrics(var_95: float, var_99: float, cvar_95: float, cvar_99: float, skewness: float, kurtosis: float, maximum_drawdown: float, calmar_ratio: float, sterling_ratio: float, burke_ratio: float)[source]
Bases:
objectRisk metrics container
- class portfolio_lib.AdvancedPortfolioAnalytics(returns: ndarray, benchmark_returns: ndarray | None = None)[source]
Bases:
objectAdvanced portfolio analytics and risk management
- calculate_comprehensive_risk_metrics(equity_curve: ndarray) RiskMetrics[source]
Calculate comprehensive risk metrics
- calculate_cvar(confidence_level: float = 0.05) float[source]
Calculate Conditional Value at Risk (Expected Shortfall)
- calculate_kappa_ratio(order: int = 3, threshold: float = 0.0) float[source]
Calculate Kappa Ratio (generalized downside risk measure)
- calculate_maximum_drawdown(equity_curve: ndarray) Tuple[float, int, int][source]
Calculate maximum drawdown and duration
- calculate_modigliani_ratio(risk_free_rate: float = 0.0) float[source]
Calculate Modigliani-Modigliani Ratio
- class portfolio_lib.PositionSizing[source]
Bases:
objectPosition sizing and risk management
- static fixed_fractional(account_equity: float, risk_per_trade: float, stop_loss_pct: float) float[source]
Calculate position size using fixed fractional method
- static kelly_criterion(win_rate: float, avg_win: float, avg_loss: float) float[source]
Calculate Kelly Criterion optimal position size
- class portfolio_lib.PerformanceAttribution(portfolio_returns: ndarray, benchmark_returns: ndarray, weights: ndarray, asset_returns: ndarray)[source]
Bases:
objectPerformance attribution analysis
- __init__(portfolio_returns: ndarray, benchmark_returns: ndarray, weights: ndarray, asset_returns: ndarray)[source]