# Portfolio-lib š
**Ultra-Lightweight Python Backtesting Library for Algorithmic Trading**
[](https://python.org)
[](https://opensource.org/licenses/MIT)
[](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[](https://python.org)\n[](https://opensource.org/licenses/MIT)\n[](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"
}