Skip to content

Weave data. Craft alpha. alphaweave backtesting framework

Notifications You must be signed in to change notification settings

eackermann/alphaweave

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

AlphaWeave

Weave data. Craft alpha.

Install (dev)

python -m pip install -e .[dev]

Run tests

pytest

Example

python examples/buy_and_hold.py

Overview

alphaweave is a backtesting framework for Python 3.11+ that provides:

  • Frame abstraction: Unified interface for Pandas and Polars DataFrames
  • Strategy API: Simple base class for implementing trading strategies
  • Vector Backtester: Bar-by-bar backtesting engine with realistic execution
  • Data loaders: CSV and Parquet file loaders with automatic column normalization
  • Corporate Actions: Support for stock splits and cash dividends
  • Technical Indicators: Built-in indicators (SMA, EMA, RSI, ROC, ATR)
  • Signals: Signal generation helpers (crossovers, comparisons)
  • Execution Models: Fees, slippage, and volume limit models
  • Risk Management: Risk limits and portfolio constraints
  • Analysis Tools: Walk-forward analysis, robustness testing, parameter sweeps
  • Advanced Metrics: Rolling Sharpe, drawdown, volatility; trade analytics; factor regression
  • Report Generation: HTML/Markdown reports with embedded plots and comprehensive analysis
  • Portfolio Optimization: Mean-variance, risk parity, minimum variance, target volatility optimizers

Quick Start

import alphaweave as aw
import pandas as pd

# Create sample data
df = pd.DataFrame({
    "datetime": pd.date_range("2020-01-01", periods=10, freq="D"),
    "open": [10+i for i in range(10)],
    "high": [11+i for i in range(10)],
    "low": [9+i for i in range(10)],
    "close": [10+i for i in range(10)],
    "volume": [100]*10,
})

frame = aw.core.frame.Frame.from_pandas(df)

class BuyAndHold(aw.strategy.base.Strategy):
    def init(self): 
        pass
    
    def next(self, i):
        self.order_target_percent("TEST", 1.0)

res = aw.engine.vector.VectorBacktester().run(
    BuyAndHold, 
    data={"TEST": frame}, 
    capital=1000
)

print(res.equity_series)

Features

Corporate Actions

alphaweave supports stock splits and cash dividends:

from alphaweave.data.corporate_actions import (
    build_corporate_actions_store,
    SplitAction,
    DividendAction,
)
from datetime import datetime

# Create corporate actions
splits = [
    SplitAction(symbol="AAPL", date=datetime(2020, 8, 31), ratio=4.0),  # 4-for-1 split
]
dividends = [
    DividendAction(symbol="AAPL", date=datetime(2023, 11, 16), amount=0.24),  # $0.24/share
]

store = build_corporate_actions_store(splits=splits, dividends=dividends)

# Use in backtest
result = aw.engine.vector.VectorBacktester().run(
    BuyAndHold,
    data={"AAPL": frame},
    capital=10000.0,
    corporate_actions=store  # Splits preserve equity, dividends add cash
)

Technical Indicators

Built-in indicators for strategy development:

class MyStrategy(aw.strategy.base.Strategy):
    def init(self):
        self.sma_period = 20
        self.rsi_period = 14
    
    def next(self, i):
        sma = self.sma("SYMBOL", self.sma_period)
        rsi = self.rsi("SYMBOL", self.rsi_period)
        close = self.close("SYMBOL")
        
        # Trading logic using indicators
        if close > sma and rsi < 70:
            self.order_target_percent("SYMBOL", 1.0)

Execution Models

Configure fees, slippage, and volume limits:

from alphaweave.execution.fees import FixedFees
from alphaweave.execution.slippage import PercentageSlippage

fees = FixedFees(commission=1.0)  # $1 per trade
slippage = PercentageSlippage(rate=0.001)  # 0.1% slippage

result = backtester.run(
    MyStrategy,
    data={"AAPL": frame},
    fees=fees,
    slippage=slippage
)

Advanced Metrics & Reporting

Analyze backtest results with comprehensive metrics and generate reports:

from alphaweave.results.report import generate_html_report
import pandas as pd

result = backtester.run(MyStrategy, data={"AAPL": frame})

# Rolling metrics
rolling_sharpe = result.rolling_sharpe("63D")  # 63-day rolling Sharpe
rolling_dd = result.rolling_drawdown("252D")    # 252-day rolling drawdown

# Trade analytics
summary = result.trade_summary()
print(f"Win Rate: {summary['win_rate']:.2%}")
print(f"Expectancy: ${summary['expectancy']:.2f}")

# Factor regression
factor_returns = pd.DataFrame({
    "SPY": spy_returns,
}, index=dates)
factor_result = result.factor_regression(factor_returns)
print(f"Alpha: {factor_result.alpha:.4f}")
print(f"Beta: {factor_result.betas['SPY']:.4f}")

# Generate HTML report
html = generate_html_report(
    result,
    title="My Strategy Backtest",
    factor_returns=factor_returns,
    include_plots=True,
)
with open("report.html", "w") as f:
    f.write(html)

Portfolio Optimization

Build optimized portfolios using standard optimizers:

from alphaweave.portfolio.optimizers import risk_parity, min_variance, target_volatility
from alphaweave.portfolio.risk import estimate_covariance
from alphaweave.portfolio.universe import top_n_by_score, normalize_scores_to_weights

class OptimizedPortfolio(Strategy):
    def init(self):
        self.assets = ["SPY", "TLT", "GLD", "QQQ"]
        self.lookback = 60
    
    def next(self, i):
        if not (self.schedule.every("1M") and self.schedule.at_close()):
            return
        
        # Get historical returns
        returns_df = self._get_recent_returns(self.assets, self.lookback)
        
        # Estimate covariance
        cov = estimate_covariance(returns_df, method="ewma")
        
        # Optimize: risk parity
        result = risk_parity(cov)
        
        # Apply weights
        for symbol, w in result.weights.items():
            self.order_target_percent(symbol, w)

Need cost-aware realism? Track prev_weights inside your strategy, build a TransactionCostModel, and pass the optional knobs (prev_weights, transaction_cost_model, turnover_constraint, rebalance_penalty) into mean_variance, min_variance, or risk_parity. See docs/sprint_16_cost_turnover.md plus the new examples under examples/cost_aware_* for a complete pattern that keeps the Strategy API untouched.

Monitoring & Dashboards

  • Plug an InMemoryMonitor into VectorBacktester/LiveEngine to capture BarSnapshots, trades, and custom metrics via Strategy.log_metric.
  • Wrap it with RunMonitor for convenient pandas access (equity_curve, drawdown_curve, exposures, turnover, costs).
  • Use alphaweave.monitoring.plots or generate_html_dashboard for a zero-dependency report; check examples/backtest_with_dashboard.py, examples/live_replay_with_dashboard.py, and examples/strategy_custom_metrics_logging.py.

Live Runner & Brokers

  • alphaweave.live.broker defines a lightweight broker protocol; adapters live under alphaweave.live.adapters.* (mock, paper, IBKR, Alpaca, Binance skeletons).
  • LiveConfig + LiveRunner wire datafeed, broker, strategy, and monitoring with a few lines of config—see examples/live_mock_runner.py, examples/live_paper_runner.py, and examples/live_config_template.yaml.
  • LiveState persistence + Strategy.get_state/set_state hooks provide checkpoints for replay/paper/live workflows.

Documentation

  • API.md: Complete API reference
  • context.md: Comprehensive codebase context and architecture
  • Examples: See examples/ directory for strategy examples

License

See LICENSE file for details.

About

Weave data. Craft alpha. alphaweave backtesting framework

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages