portfolio-lib


Nameportfolio-lib JSON
Version 1.0.2 PyPI version JSON
download
home_pagehttps://porttfolio.com/
SummaryLightweight Python backtesting library for algorithmic trading strategies
upload_time2025-09-06 09:08:55
maintainerNone
docs_urlNone
authorRahul Ashok, Pritham Devaprasad, Siddarth S, and Anish R
requires_python>=3.8
licenseMIT
keywords backtesting trading finance algorithmic-trading quantitative-finance portfolio technical-analysis stocks crypto forex investment strategy lightweight performance analytics risk-management
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # Portfolio-lib šŸ“ˆ

**Ultra-Lightweight Python Backtesting Library for Algorithmic Trading**

[![Python Version](https://img.shields.io/badge/python-3.8%2B-blue)](https://python.org)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
[![Package Size](https://img.shields.io/badge/size-%3C500KB-green)](https://pypi.org/project/portfolio-lib/)

**Authors:** Rahul Ashok, Pritham Devaprasad, Siddarth S, and Anish R

Portfolio-lib is a comprehensive, ultra-lightweight backtesting framework designed for developing and testing quantitative trading strategies. With minimal dependencies and maximum performance, it provides everything you need for professional algorithmic trading research.

## šŸš€ Key Features

### ⚔ **Ultra-Lightweight Architecture**
- **< 500KB total package size** - minimal memory footprint
- Only essential dependencies: pandas, numpy, yfinance, scipy, matplotlib
- Optimized for speed and efficiency

### šŸ“Š **Comprehensive Technical Analysis**
- **81+ Technical Indicators** built-in
- SMA, EMA, RSI, MACD, Bollinger Bands, Stochastic, ADX, and more
- Custom indicator support with easy extensibility

### šŸ”„ **Advanced Backtesting Engine**
- Event-driven backtesting architecture
- Multi-asset portfolio simulation
- Commission and slippage modeling
- Real-time strategy execution

### šŸ“ˆ **Professional Analytics**
- Advanced performance metrics (Sharpe, Sortino, Calmar ratios)
- Risk management tools (VaR, CVaR, Maximum Drawdown)
- Comprehensive trade analysis and reporting
- Visual performance charts and equity curves

### 🌐 **Data Integration**
- **yfinance integration** for real market data
- Support for stocks, ETFs, forex, and cryptocurrencies
- Custom data source support
- Historical and real-time data handling

## šŸ“¦ Installation

```bash
pip install portfolio-lib
```

### Requirements
- Python 3.8+
- pandas >= 1.5.0
- numpy >= 1.21.0
- yfinance >= 0.2.0
- scipy >= 1.9.0
- matplotlib >= 3.5.0

## šŸŽÆ Quick Start

### Basic SMA Crossover Strategy

```python
from portfolio_lib import BaseStrategy, Backtest, YFinanceDataFeed

class SMAStrategy(BaseStrategy):
    def __init__(self):
        super().__init__()
        self.symbols = ['AAPL', 'MSFT']
        self.start_date = '2020-01-01'
        self.end_date = '2023-12-31'
        self.fast_period = 10
        self.slow_period = 30
        
    def init_indicators(self):
        print(f"SMA Strategy initialized for {self.symbols}")
    
    def next(self):
        for symbol in self.symbols:
            prices = self.data[symbol]['Close']
            
            if len(prices) < self.slow_period:
                continue
                
            fast_sma = prices.rolling(self.fast_period).mean().iloc[-1]
            slow_sma = prices.rolling(self.slow_period).mean().iloc[-1]
            
            position = self.position(symbol)
            
            # Buy signal: fast SMA crosses above slow SMA
            if fast_sma > slow_sma and position is None:
                self.buy(symbol, 0.5)  # 50% of portfolio
                
            # Sell signal: fast SMA crosses below slow SMA  
            elif fast_sma < slow_sma and position is not None:
                self.sell(symbol)

# Run backtest
strategy = SMAStrategy()
backtest = Backtest(strategy, initial_cash=100000)
data_feed = YFinanceDataFeed(strategy.symbols)
backtest.add_data_source(data_feed)

results = backtest.run(strategy.start_date, strategy.end_date)
print(results.summary())
```

### RSI Mean Reversion Strategy

```python
from portfolio_lib import BaseStrategy, TechnicalIndicators

class RSIStrategy(BaseStrategy):
    def __init__(self):
        super().__init__()
        self.symbols = ['TSLA', 'NVDA']
        self.start_date = '2021-01-01'
        self.end_date = '2023-12-31'
        self.rsi_period = 14
        self.oversold = 30
        self.overbought = 70
        
    def next(self):
        for symbol in self.symbols:
            prices = self.data[symbol]['Close']
            
            if len(prices) < self.rsi_period + 1:
                continue
                
            rsi = TechnicalIndicators.rsi(prices, self.rsi_period)
            position = self.position(symbol)
            
            # Buy when oversold
            if rsi < self.oversold and position is None:
                self.buy(symbol, 0.3)
                
            # Sell when overbought
            elif rsi > self.overbought and position is not None:
                self.sell(symbol)
```

## šŸ“š Core Components

### šŸ”§ **BaseStrategy**
Base class for all trading strategies with built-in portfolio management:

```python
class MyStrategy(BaseStrategy):
    def init_indicators(self):
        # Initialize your indicators here
        pass
        
    def next(self):
        # Your strategy logic for each bar
        # Access data: self.data[symbol]['Close']
        # Place orders: self.buy(symbol, size) / self.sell(symbol)
        # Check positions: self.position(symbol)
        pass
```

### šŸ’° **Portfolio Management**
Automatic portfolio tracking with position management:

```python
# Portfolio automatically tracks:
# - Cash balance
# - Active positions  
# - Trade history
# - Equity curve
# - Performance metrics

portfolio = results.portfolio
print(f"Total Equity: ${portfolio.total_equity:,.2f}")
print(f"Cash: ${portfolio.cash:,.2f}")
print(f"Positions: {len(portfolio.positions)}")
```

### šŸ“Š **Technical Indicators**
81+ built-in technical indicators:

```python
from portfolio_lib import TechnicalIndicators

# Moving averages
sma = TechnicalIndicators.sma(prices, period=20)
ema = TechnicalIndicators.ema(prices, period=20)
wma = TechnicalIndicators.wma(prices, period=20)

# Oscillators
rsi = TechnicalIndicators.rsi(prices, period=14)
stoch = TechnicalIndicators.stochastic(high, low, close)
williams_r = TechnicalIndicators.williams_r(high, low, close)

# Trend indicators
macd = TechnicalIndicators.macd(prices)
adx = TechnicalIndicators.adx(high, low, close)
aroon = TechnicalIndicators.aroon(high, low)

# Volatility indicators
bb = TechnicalIndicators.bollinger_bands(prices)
atr = TechnicalIndicators.atr(high, low, close)
```

### šŸ“ˆ **Performance Analytics**
Comprehensive performance and risk metrics:

```python
metrics = results.metrics

# Returns and performance
print(f"Total Return: {metrics.total_return:.2f}%")
print(f"Annualized Return: {metrics.annualized_return:.2f}%")
print(f"Volatility: {metrics.volatility:.2f}%")

# Risk metrics
print(f"Sharpe Ratio: {metrics.sharpe_ratio:.2f}")
print(f"Sortino Ratio: {metrics.sortino_ratio:.2f}")
print(f"Maximum Drawdown: {metrics.max_drawdown:.2f}%")

# Trading metrics
print(f"Win Rate: {metrics.win_rate:.2f}%")
print(f"Profit Factor: {metrics.profit_factor:.2f}")
print(f"Total Trades: {len(metrics.trades)}")
```

## šŸŽ›ļø **Built-in Strategies**

Portfolio-lib includes professionally implemented strategies ready to use:

```python
from portfolio_lib import (
    SMAStrategy, EMAStrategy, RSIStrategy, MACDStrategy,
    BollingerBandsStrategy, MeanReversionStrategy, MomentumStrategy
)

# Use built-in strategies directly
strategy = RSIStrategy(symbols=['AAPL'], rsi_period=14)
backtest = Backtest(strategy, initial_cash=100000)
```

## šŸ› ļø **Advanced Features**

### Multi-Asset Portfolio
```python
class DiversifiedStrategy(BaseStrategy):
    def __init__(self):
        super().__init__()
        self.stocks = ['AAPL', 'MSFT', 'GOOGL']
        self.etfs = ['SPY', 'QQQ', 'IWM']
        self.symbols = self.stocks + self.etfs
```

### Risk Management
```python
from portfolio_lib import RiskMetrics

# Portfolio risk analysis
risk = RiskMetrics(portfolio)
var_95 = risk.value_at_risk(confidence=0.95)
cvar_95 = risk.conditional_var(confidence=0.95)
```

### Custom Data Sources
```python
class CustomDataFeed(DataFeed):
    def fetch_data(self, symbols, start_date, end_date):
        # Implement your custom data fetching logic
        return data_dict
```

## šŸ“Š **Performance Metrics**

Portfolio-lib calculates 20+ professional metrics:

| **Returns** | **Risk** | **Trading** |
|-------------|----------|-------------|
| Total Return | Sharpe Ratio | Win Rate |
| Annualized Return | Sortino Ratio | Profit Factor |
| CAGR | Calmar Ratio | Total Trades |
| Alpha | Maximum Drawdown | Average Trade |
| Beta | Volatility | Best/Worst Trade |

## šŸ”§ **Configuration**

### Strategy Parameters
```python
class ConfigurableStrategy(BaseStrategy):
    def __init__(self, fast_ma=10, slow_ma=30, position_size=0.5):
        super().__init__()
        self.fast_ma = fast_ma
        self.slow_ma = slow_ma  
        self.position_size = position_size
```

### Backtest Settings
```python
backtest = Backtest(
    strategy=strategy,
    initial_cash=100000,
    commission=0.001,  # 0.1% commission
    slippage=0.0005    # 0.05% slippage
)
```

## šŸš€ **Why Portfolio-lib?**

### **šŸƒā€ā™‚ļø Speed & Efficiency**
- **Ultra-lightweight**: < 500KB package size
- **Minimal dependencies**: Only essential libraries
- **Optimized algorithms**: Maximum performance per operation
- **Memory efficient**: Minimal RAM usage

### **šŸ” Professional Features**
- **81+ technical indicators** with professional implementations
- **Advanced risk metrics** including VaR, CVaR, drawdown analysis
- **Multi-asset support** for stocks, ETFs, forex, crypto
- **Real market data** integration via yfinance

### **šŸ›”ļø Production Ready**
- **Thoroughly tested** with comprehensive unit tests
- **Well documented** with clear examples and API reference
- **Active maintenance** by experienced quant developers
- **Community support** and regular updates

### **šŸ“ˆ Research Focused**
- **Academic rigor** with proper statistical implementations
- **Publication ready** results and charts
- **Extensible architecture** for custom strategies
- **Professional reporting** with detailed analytics

## šŸ“‹ **Examples & Tutorials**

### Complete Example: Momentum Strategy

```python
import pandas as pd
from portfolio_lib import BaseStrategy, Backtest, YFinanceDataFeed, TechnicalIndicators

class MomentumStrategy(BaseStrategy):
    def __init__(self):
        super().__init__()
        self.symbols = ['AAPL', 'MSFT', 'GOOGL', 'AMZN']
        self.start_date = '2020-01-01'
        self.end_date = '2023-12-31'
        self.lookback = 20
        self.top_n = 2
        
    def init_indicators(self):
        print("Momentum Strategy: Buy top performing stocks")
        
    def next(self):
        if len(self.data[self.symbols[0]]) < self.lookback:
            return
            
        # Calculate momentum for each symbol
        momentum_scores = {}
        for symbol in self.symbols:
            prices = self.data[symbol]['Close']
            momentum = (prices.iloc[-1] / prices.iloc[-self.lookback] - 1) * 100
            momentum_scores[symbol] = momentum
            
        # Sort by momentum
        sorted_symbols = sorted(momentum_scores.items(), 
                              key=lambda x: x[1], reverse=True)
        
        # Close positions not in top N
        for symbol in self.symbols:
            position = self.position(symbol)
            if position and symbol not in [s[0] for s in sorted_symbols[:self.top_n]]:
                self.sell(symbol)
                
        # Open positions in top N
        for symbol, score in sorted_symbols[:self.top_n]:
            position = self.position(symbol)
            if not position:
                self.buy(symbol, 1.0 / self.top_n)

# Run the strategy
strategy = MomentumStrategy()
backtest = Backtest(strategy, initial_cash=100000)
data_feed = YFinanceDataFeed(strategy.symbols)
backtest.add_data_source(data_feed)

results = backtest.run(strategy.start_date, strategy.end_date)

# Display comprehensive results
print("šŸš€ MOMENTUM STRATEGY RESULTS")
print("=" * 40)
print(results.summary())

# Additional analysis
print("\\nšŸ“Š DETAILED METRICS")
print(f"Number of trades: {len(results.portfolio.trades)}")
print(f"Average position size: {100/strategy.top_n:.1f}%")
print(f"Portfolio volatility: {results.metrics.volatility:.2f}%")
print(f"Best trade return: {max([t.net_value for t in results.portfolio.trades]):,.2f}")
```

## šŸ¤ **Contributing**

Portfolio-lib is developed by **Rahul Ashok, Pritham Devaprasad, Siddarth S, and Anish R**. 

We welcome contributions! Please see our contributing guidelines for details on:
- Code standards and style
- Testing requirements
- Documentation guidelines
- Issue reporting

## šŸ“„ **License**

This project is licensed under the MIT License - see the LICENSE file for details.

## šŸ™‹ā€ā™€ļø **Support**


- **Email**: abcrahul111@gmail.com

## 🌟 **Star History**

If you find Portfolio-lib useful, please give it a star! ⭐

---

**Built with ā¤ļø by Rahul Ashok, Pritham Devaprasad, Siddarth S, and Anish R**

*Portfolio-lib: Where lightweight meets powerful in algorithmic trading.*

            

Raw data

            {
    "_id": null,
    "home_page": "https://porttfolio.com/",
    "name": "portfolio-lib",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.8",
    "maintainer_email": null,
    "keywords": "backtesting, trading, finance, algorithmic-trading, quantitative-finance, portfolio, technical-analysis, stocks, crypto, forex, investment, strategy, lightweight, performance, analytics, risk-management",
    "author": "Rahul Ashok, Pritham Devaprasad, Siddarth S, and Anish R",
    "author_email": "Rahul Ashok <contact@portfolio-lib.com>, Pritham Devaprasad <contact@portfolio-lib.com>, Siddarth S <contact@portfolio-lib.com>, Anish R <contact@portfolio-lib.com>",
    "download_url": "https://files.pythonhosted.org/packages/ef/0c/8927c72742fc9f64a5fdaed4b0d823cd48fe78f6ddac9d13c1021e7893f5/portfolio_lib-1.0.2.tar.gz",
    "platform": null,
    "description": "# Portfolio-lib \ud83d\udcc8\n\n**Ultra-Lightweight Python Backtesting Library for Algorithmic Trading**\n\n[![Python Version](https://img.shields.io/badge/python-3.8%2B-blue)](https://python.org)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![Package Size](https://img.shields.io/badge/size-%3C500KB-green)](https://pypi.org/project/portfolio-lib/)\n\n**Authors:** Rahul Ashok, Pritham Devaprasad, Siddarth S, and Anish R\n\nPortfolio-lib is a comprehensive, ultra-lightweight backtesting framework designed for developing and testing quantitative trading strategies. With minimal dependencies and maximum performance, it provides everything you need for professional algorithmic trading research.\n\n## \ud83d\ude80 Key Features\n\n### \u26a1 **Ultra-Lightweight Architecture**\n- **< 500KB total package size** - minimal memory footprint\n- Only essential dependencies: pandas, numpy, yfinance, scipy, matplotlib\n- Optimized for speed and efficiency\n\n### \ud83d\udcca **Comprehensive Technical Analysis**\n- **81+ Technical Indicators** built-in\n- SMA, EMA, RSI, MACD, Bollinger Bands, Stochastic, ADX, and more\n- Custom indicator support with easy extensibility\n\n### \ud83d\udd04 **Advanced Backtesting Engine**\n- Event-driven backtesting architecture\n- Multi-asset portfolio simulation\n- Commission and slippage modeling\n- Real-time strategy execution\n\n### \ud83d\udcc8 **Professional Analytics**\n- Advanced performance metrics (Sharpe, Sortino, Calmar ratios)\n- Risk management tools (VaR, CVaR, Maximum Drawdown)\n- Comprehensive trade analysis and reporting\n- Visual performance charts and equity curves\n\n### \ud83c\udf10 **Data Integration**\n- **yfinance integration** for real market data\n- Support for stocks, ETFs, forex, and cryptocurrencies\n- Custom data source support\n- Historical and real-time data handling\n\n## \ud83d\udce6 Installation\n\n```bash\npip install portfolio-lib\n```\n\n### Requirements\n- Python 3.8+\n- pandas >= 1.5.0\n- numpy >= 1.21.0\n- yfinance >= 0.2.0\n- scipy >= 1.9.0\n- matplotlib >= 3.5.0\n\n## \ud83c\udfaf Quick Start\n\n### Basic SMA Crossover Strategy\n\n```python\nfrom portfolio_lib import BaseStrategy, Backtest, YFinanceDataFeed\n\nclass SMAStrategy(BaseStrategy):\n    def __init__(self):\n        super().__init__()\n        self.symbols = ['AAPL', 'MSFT']\n        self.start_date = '2020-01-01'\n        self.end_date = '2023-12-31'\n        self.fast_period = 10\n        self.slow_period = 30\n        \n    def init_indicators(self):\n        print(f\"SMA Strategy initialized for {self.symbols}\")\n    \n    def next(self):\n        for symbol in self.symbols:\n            prices = self.data[symbol]['Close']\n            \n            if len(prices) < self.slow_period:\n                continue\n                \n            fast_sma = prices.rolling(self.fast_period).mean().iloc[-1]\n            slow_sma = prices.rolling(self.slow_period).mean().iloc[-1]\n            \n            position = self.position(symbol)\n            \n            # Buy signal: fast SMA crosses above slow SMA\n            if fast_sma > slow_sma and position is None:\n                self.buy(symbol, 0.5)  # 50% of portfolio\n                \n            # Sell signal: fast SMA crosses below slow SMA  \n            elif fast_sma < slow_sma and position is not None:\n                self.sell(symbol)\n\n# Run backtest\nstrategy = SMAStrategy()\nbacktest = Backtest(strategy, initial_cash=100000)\ndata_feed = YFinanceDataFeed(strategy.symbols)\nbacktest.add_data_source(data_feed)\n\nresults = backtest.run(strategy.start_date, strategy.end_date)\nprint(results.summary())\n```\n\n### RSI Mean Reversion Strategy\n\n```python\nfrom portfolio_lib import BaseStrategy, TechnicalIndicators\n\nclass RSIStrategy(BaseStrategy):\n    def __init__(self):\n        super().__init__()\n        self.symbols = ['TSLA', 'NVDA']\n        self.start_date = '2021-01-01'\n        self.end_date = '2023-12-31'\n        self.rsi_period = 14\n        self.oversold = 30\n        self.overbought = 70\n        \n    def next(self):\n        for symbol in self.symbols:\n            prices = self.data[symbol]['Close']\n            \n            if len(prices) < self.rsi_period + 1:\n                continue\n                \n            rsi = TechnicalIndicators.rsi(prices, self.rsi_period)\n            position = self.position(symbol)\n            \n            # Buy when oversold\n            if rsi < self.oversold and position is None:\n                self.buy(symbol, 0.3)\n                \n            # Sell when overbought\n            elif rsi > self.overbought and position is not None:\n                self.sell(symbol)\n```\n\n## \ud83d\udcda Core Components\n\n### \ud83d\udd27 **BaseStrategy**\nBase class for all trading strategies with built-in portfolio management:\n\n```python\nclass MyStrategy(BaseStrategy):\n    def init_indicators(self):\n        # Initialize your indicators here\n        pass\n        \n    def next(self):\n        # Your strategy logic for each bar\n        # Access data: self.data[symbol]['Close']\n        # Place orders: self.buy(symbol, size) / self.sell(symbol)\n        # Check positions: self.position(symbol)\n        pass\n```\n\n### \ud83d\udcb0 **Portfolio Management**\nAutomatic portfolio tracking with position management:\n\n```python\n# Portfolio automatically tracks:\n# - Cash balance\n# - Active positions  \n# - Trade history\n# - Equity curve\n# - Performance metrics\n\nportfolio = results.portfolio\nprint(f\"Total Equity: ${portfolio.total_equity:,.2f}\")\nprint(f\"Cash: ${portfolio.cash:,.2f}\")\nprint(f\"Positions: {len(portfolio.positions)}\")\n```\n\n### \ud83d\udcca **Technical Indicators**\n81+ built-in technical indicators:\n\n```python\nfrom portfolio_lib import TechnicalIndicators\n\n# Moving averages\nsma = TechnicalIndicators.sma(prices, period=20)\nema = TechnicalIndicators.ema(prices, period=20)\nwma = TechnicalIndicators.wma(prices, period=20)\n\n# Oscillators\nrsi = TechnicalIndicators.rsi(prices, period=14)\nstoch = TechnicalIndicators.stochastic(high, low, close)\nwilliams_r = TechnicalIndicators.williams_r(high, low, close)\n\n# Trend indicators\nmacd = TechnicalIndicators.macd(prices)\nadx = TechnicalIndicators.adx(high, low, close)\naroon = TechnicalIndicators.aroon(high, low)\n\n# Volatility indicators\nbb = TechnicalIndicators.bollinger_bands(prices)\natr = TechnicalIndicators.atr(high, low, close)\n```\n\n### \ud83d\udcc8 **Performance Analytics**\nComprehensive performance and risk metrics:\n\n```python\nmetrics = results.metrics\n\n# Returns and performance\nprint(f\"Total Return: {metrics.total_return:.2f}%\")\nprint(f\"Annualized Return: {metrics.annualized_return:.2f}%\")\nprint(f\"Volatility: {metrics.volatility:.2f}%\")\n\n# Risk metrics\nprint(f\"Sharpe Ratio: {metrics.sharpe_ratio:.2f}\")\nprint(f\"Sortino Ratio: {metrics.sortino_ratio:.2f}\")\nprint(f\"Maximum Drawdown: {metrics.max_drawdown:.2f}%\")\n\n# Trading metrics\nprint(f\"Win Rate: {metrics.win_rate:.2f}%\")\nprint(f\"Profit Factor: {metrics.profit_factor:.2f}\")\nprint(f\"Total Trades: {len(metrics.trades)}\")\n```\n\n## \ud83c\udf9b\ufe0f **Built-in Strategies**\n\nPortfolio-lib includes professionally implemented strategies ready to use:\n\n```python\nfrom portfolio_lib import (\n    SMAStrategy, EMAStrategy, RSIStrategy, MACDStrategy,\n    BollingerBandsStrategy, MeanReversionStrategy, MomentumStrategy\n)\n\n# Use built-in strategies directly\nstrategy = RSIStrategy(symbols=['AAPL'], rsi_period=14)\nbacktest = Backtest(strategy, initial_cash=100000)\n```\n\n## \ud83d\udee0\ufe0f **Advanced Features**\n\n### Multi-Asset Portfolio\n```python\nclass DiversifiedStrategy(BaseStrategy):\n    def __init__(self):\n        super().__init__()\n        self.stocks = ['AAPL', 'MSFT', 'GOOGL']\n        self.etfs = ['SPY', 'QQQ', 'IWM']\n        self.symbols = self.stocks + self.etfs\n```\n\n### Risk Management\n```python\nfrom portfolio_lib import RiskMetrics\n\n# Portfolio risk analysis\nrisk = RiskMetrics(portfolio)\nvar_95 = risk.value_at_risk(confidence=0.95)\ncvar_95 = risk.conditional_var(confidence=0.95)\n```\n\n### Custom Data Sources\n```python\nclass CustomDataFeed(DataFeed):\n    def fetch_data(self, symbols, start_date, end_date):\n        # Implement your custom data fetching logic\n        return data_dict\n```\n\n## \ud83d\udcca **Performance Metrics**\n\nPortfolio-lib calculates 20+ professional metrics:\n\n| **Returns** | **Risk** | **Trading** |\n|-------------|----------|-------------|\n| Total Return | Sharpe Ratio | Win Rate |\n| Annualized Return | Sortino Ratio | Profit Factor |\n| CAGR | Calmar Ratio | Total Trades |\n| Alpha | Maximum Drawdown | Average Trade |\n| Beta | Volatility | Best/Worst Trade |\n\n## \ud83d\udd27 **Configuration**\n\n### Strategy Parameters\n```python\nclass ConfigurableStrategy(BaseStrategy):\n    def __init__(self, fast_ma=10, slow_ma=30, position_size=0.5):\n        super().__init__()\n        self.fast_ma = fast_ma\n        self.slow_ma = slow_ma  \n        self.position_size = position_size\n```\n\n### Backtest Settings\n```python\nbacktest = Backtest(\n    strategy=strategy,\n    initial_cash=100000,\n    commission=0.001,  # 0.1% commission\n    slippage=0.0005    # 0.05% slippage\n)\n```\n\n## \ud83d\ude80 **Why Portfolio-lib?**\n\n### **\ud83c\udfc3\u200d\u2642\ufe0f Speed & Efficiency**\n- **Ultra-lightweight**: < 500KB package size\n- **Minimal dependencies**: Only essential libraries\n- **Optimized algorithms**: Maximum performance per operation\n- **Memory efficient**: Minimal RAM usage\n\n### **\ud83d\udd0d Professional Features**\n- **81+ technical indicators** with professional implementations\n- **Advanced risk metrics** including VaR, CVaR, drawdown analysis\n- **Multi-asset support** for stocks, ETFs, forex, crypto\n- **Real market data** integration via yfinance\n\n### **\ud83d\udee1\ufe0f Production Ready**\n- **Thoroughly tested** with comprehensive unit tests\n- **Well documented** with clear examples and API reference\n- **Active maintenance** by experienced quant developers\n- **Community support** and regular updates\n\n### **\ud83d\udcc8 Research Focused**\n- **Academic rigor** with proper statistical implementations\n- **Publication ready** results and charts\n- **Extensible architecture** for custom strategies\n- **Professional reporting** with detailed analytics\n\n## \ud83d\udccb **Examples & Tutorials**\n\n### Complete Example: Momentum Strategy\n\n```python\nimport pandas as pd\nfrom portfolio_lib import BaseStrategy, Backtest, YFinanceDataFeed, TechnicalIndicators\n\nclass MomentumStrategy(BaseStrategy):\n    def __init__(self):\n        super().__init__()\n        self.symbols = ['AAPL', 'MSFT', 'GOOGL', 'AMZN']\n        self.start_date = '2020-01-01'\n        self.end_date = '2023-12-31'\n        self.lookback = 20\n        self.top_n = 2\n        \n    def init_indicators(self):\n        print(\"Momentum Strategy: Buy top performing stocks\")\n        \n    def next(self):\n        if len(self.data[self.symbols[0]]) < self.lookback:\n            return\n            \n        # Calculate momentum for each symbol\n        momentum_scores = {}\n        for symbol in self.symbols:\n            prices = self.data[symbol]['Close']\n            momentum = (prices.iloc[-1] / prices.iloc[-self.lookback] - 1) * 100\n            momentum_scores[symbol] = momentum\n            \n        # Sort by momentum\n        sorted_symbols = sorted(momentum_scores.items(), \n                              key=lambda x: x[1], reverse=True)\n        \n        # Close positions not in top N\n        for symbol in self.symbols:\n            position = self.position(symbol)\n            if position and symbol not in [s[0] for s in sorted_symbols[:self.top_n]]:\n                self.sell(symbol)\n                \n        # Open positions in top N\n        for symbol, score in sorted_symbols[:self.top_n]:\n            position = self.position(symbol)\n            if not position:\n                self.buy(symbol, 1.0 / self.top_n)\n\n# Run the strategy\nstrategy = MomentumStrategy()\nbacktest = Backtest(strategy, initial_cash=100000)\ndata_feed = YFinanceDataFeed(strategy.symbols)\nbacktest.add_data_source(data_feed)\n\nresults = backtest.run(strategy.start_date, strategy.end_date)\n\n# Display comprehensive results\nprint(\"\ud83d\ude80 MOMENTUM STRATEGY RESULTS\")\nprint(\"=\" * 40)\nprint(results.summary())\n\n# Additional analysis\nprint(\"\\\\n\ud83d\udcca DETAILED METRICS\")\nprint(f\"Number of trades: {len(results.portfolio.trades)}\")\nprint(f\"Average position size: {100/strategy.top_n:.1f}%\")\nprint(f\"Portfolio volatility: {results.metrics.volatility:.2f}%\")\nprint(f\"Best trade return: {max([t.net_value for t in results.portfolio.trades]):,.2f}\")\n```\n\n## \ud83e\udd1d **Contributing**\n\nPortfolio-lib is developed by **Rahul Ashok, Pritham Devaprasad, Siddarth S, and Anish R**. \n\nWe welcome contributions! Please see our contributing guidelines for details on:\n- Code standards and style\n- Testing requirements\n- Documentation guidelines\n- Issue reporting\n\n## \ud83d\udcc4 **License**\n\nThis project is licensed under the MIT License - see the LICENSE file for details.\n\n## \ud83d\ude4b\u200d\u2640\ufe0f **Support**\n\n\n- **Email**: abcrahul111@gmail.com\n\n## \ud83c\udf1f **Star History**\n\nIf you find Portfolio-lib useful, please give it a star! \u2b50\n\n---\n\n**Built with \u2764\ufe0f by Rahul Ashok, Pritham Devaprasad, Siddarth S, and Anish R**\n\n*Portfolio-lib: Where lightweight meets powerful in algorithmic trading.*\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "Lightweight Python backtesting library for algorithmic trading strategies",
    "version": "1.0.2",
    "project_urls": {
        "Bug Reports": "https://github.com/neuralninja110/portfolio-lib/issues",
        "Documentation": "https://neuralninja110.github.io/Portfolio-lib/",
        "Homepage": "https://porttfolio.com/",
        "Repository": "https://github.com/neuralninja110/portfolio-lib"
    },
    "split_keywords": [
        "backtesting",
        " trading",
        " finance",
        " algorithmic-trading",
        " quantitative-finance",
        " portfolio",
        " technical-analysis",
        " stocks",
        " crypto",
        " forex",
        " investment",
        " strategy",
        " lightweight",
        " performance",
        " analytics",
        " risk-management"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "19ddf4fdc9fecc75e89d6b8cf027767cbe3f77ad85c9aa03d2d2413c88b22c0f",
                "md5": "3043535d99aec7596feb44d8ba5a3151",
                "sha256": "5afa5e0c0ebb3a104400091f58f828810f400661dfb68358de32e4ae19b46c24"
            },
            "downloads": -1,
            "filename": "portfolio_lib-1.0.2-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "3043535d99aec7596feb44d8ba5a3151",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.8",
            "size": 30582,
            "upload_time": "2025-09-06T09:08:54",
            "upload_time_iso_8601": "2025-09-06T09:08:54.018147Z",
            "url": "https://files.pythonhosted.org/packages/19/dd/f4fdc9fecc75e89d6b8cf027767cbe3f77ad85c9aa03d2d2413c88b22c0f/portfolio_lib-1.0.2-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "ef0c8927c72742fc9f64a5fdaed4b0d823cd48fe78f6ddac9d13c1021e7893f5",
                "md5": "d5425c03bd5f25914eeed42abb052448",
                "sha256": "1754add16503172df71a303f23b365717a053b11a4920b6a5a1513783ff3b09d"
            },
            "downloads": -1,
            "filename": "portfolio_lib-1.0.2.tar.gz",
            "has_sig": false,
            "md5_digest": "d5425c03bd5f25914eeed42abb052448",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.8",
            "size": 36756,
            "upload_time": "2025-09-06T09:08:55",
            "upload_time_iso_8601": "2025-09-06T09:08:55.806351Z",
            "url": "https://files.pythonhosted.org/packages/ef/0c/8927c72742fc9f64a5fdaed4b0d823cd48fe78f6ddac9d13c1021e7893f5/portfolio_lib-1.0.2.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-09-06 09:08:55",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "neuralninja110",
    "github_project": "portfolio-lib",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "portfolio-lib"
}
        
Elapsed time: 0.58498s