Skip to main content

Hypertrial's Stacking Sats Library - Optimized Bitcoin DCA

Project description

Stacking Sats Pipeline

A Bitcoin DCA strategy backtesting framework for testing strategies against historical price data.

Quick Start

Library Interface

from stacking_sats_pipeline import backtest, strategy

# Simple function approach
def my_strategy(df):
    """Calculate weights based on price data"""
    # Your strategy logic here
    return weights

results = backtest(my_strategy)
results.summary()
results.plot()

# Or use decorator approach
@strategy(name="My Strategy", auto_backtest=True)
def my_strategy(df):
    return weights

Note: Data is now loaded directly into memory from CoinMetrics (no CSV files needed). For legacy file-based loading, use load_data(use_memory=False).

Interactive Tutorial

pip install marimo
marimo edit tutorials/examples.py

Command Line

pip install -r requirements.txt
python main.py --strategy path/to/your_strategy.py

Usage Examples

Basic Strategy

def simple_ma_strategy(df):
    """Buy more when price is below 200-day moving average"""
    df = df.copy()
    past_price = df["PriceUSD"].shift(1)
    df["ma200"] = past_price.rolling(window=200, min_periods=1).mean()
    
    base_weight = 1.0 / len(df)
    weights = pd.Series(base_weight, index=df.index)
    
    # Buy 50% more when below MA
    below_ma = df["PriceUSD"] < df["ma200"]
    weights[below_ma] *= 1.5
    
    return weights / weights.sum()

results = backtest(simple_ma_strategy)

Quick Comparison

strategy1_perf = quick_backtest(strategy1)
strategy2_perf = quick_backtest(strategy2)

Custom Parameters

results = backtest(
    my_strategy,
    start_date="2021-01-01",
    end_date="2023-12-31",
    cycle_years=2
)

Strategy Requirements

Your strategy function must:

def your_strategy(df: pd.DataFrame) -> pd.Series:
    """
    Args:
        df: DataFrame with 'PriceUSD' column and datetime index
        
    Returns:
        pd.Series with weights that sum to 1.0 per cycle
    """
    # Your logic here
    return weights

Validation Rules:

  • Weights sum to 1.0 within each cycle
  • All weights positive (≥ 1e-5)
  • No forward-looking data
  • Return pandas Series indexed by date

Testing

The project includes a comprehensive test suite covering all major functionality:

# Install development dependencies
pip install -e ".[dev]"

# Run all tests
pytest

# Run specific test categories
pytest -m "not integration"  # Skip integration tests
pytest -m integration        # Run only integration tests

# Run tests with coverage
pytest --cov=stacking_sats_pipeline

# Run specific test files
pytest tests/test_backtest.py
pytest tests/test_strategy.py

For detailed testing documentation, see TESTS.md.

Command Line Options

# Basic usage
python main.py --strategy your_strategy.py

# Skip plots
python main.py --strategy your_strategy.py --no-plot

# Run simulation
python main.py --strategy your_strategy.py --simulate --budget 1000000

# Historical weight calculator (coinmetrics data only)
python -m weights.weight_calculator 1000 2020-01-01 2023-12-31 --save

Project Structure

├── main.py              # Pipeline orchestrator
├── tutorials/examples.py # Interactive notebook
├── backtest/            # Validation & simulation
├── data/                # Price data pipeline (in-memory loading)
├── plot/                # Visualization
├── strategy/            # Strategy templates
└── weights/             # Historical allocation calculator

Output

The pipeline provides:

  • Validation Report: Strategy compliance
  • Performance Metrics: SPD (Sats Per Dollar) statistics
  • Comparative Analysis: vs Uniform DCA and Static DCA
  • Visualizations: Weight distribution plots

Example Output

============================================================
COMPREHENSIVE STRATEGY VALIDATION
============================================================
✅ ALL VALIDATION CHECKS PASSED

Your Strategy Performance:
Dynamic SPD: mean=4510.21, median=2804.03
Dynamic SPD Percentile: mean=39.35%, median=43.80%

Mean Excess vs Uniform DCA: -0.40%
Mean Excess vs Static DCA: 9.35%

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

stacking_sats_pipeline-0.0.1.tar.gz (37.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

stacking_sats_pipeline-0.0.1-py3-none-any.whl (29.5 kB view details)

Uploaded Python 3

File details

Details for the file stacking_sats_pipeline-0.0.1.tar.gz.

File metadata

  • Download URL: stacking_sats_pipeline-0.0.1.tar.gz
  • Upload date:
  • Size: 37.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.11.12

File hashes

Hashes for stacking_sats_pipeline-0.0.1.tar.gz
Algorithm Hash digest
SHA256 43d84f58e11c93b08064ef7cc7a9a5521dd8e8fae497599faf504d2e9a64ca9d
MD5 9d94e303f56af4ec8ca75eb6afab2843
BLAKE2b-256 22a884aa475b71c9f9954a17cfbf0e16158953a8dc7d87d81db0e0c2aba4c9df

See more details on using hashes here.

File details

Details for the file stacking_sats_pipeline-0.0.1-py3-none-any.whl.

File metadata

File hashes

Hashes for stacking_sats_pipeline-0.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 a6e35ffe90def00a7fd5bc603c5357c7143112d4544dcfeb3700d7ca33a50e97
MD5 d57c162a0149faeec51a2333a23c40ec
BLAKE2b-256 064b534db2d2d6c8d24078ca03b9f437389e0959a751f28fb957c899b7db0a4a

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page