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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
43d84f58e11c93b08064ef7cc7a9a5521dd8e8fae497599faf504d2e9a64ca9d
|
|
| MD5 |
9d94e303f56af4ec8ca75eb6afab2843
|
|
| BLAKE2b-256 |
22a884aa475b71c9f9954a17cfbf0e16158953a8dc7d87d81db0e0c2aba4c9df
|
File details
Details for the file stacking_sats_pipeline-0.0.1-py3-none-any.whl.
File metadata
- Download URL: stacking_sats_pipeline-0.0.1-py3-none-any.whl
- Upload date:
- Size: 29.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.11.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a6e35ffe90def00a7fd5bc603c5357c7143112d4544dcfeb3700d7ca33a50e97
|
|
| MD5 |
d57c162a0149faeec51a2333a23c40ec
|
|
| BLAKE2b-256 |
064b534db2d2d6c8d24078ca03b9f437389e0959a751f28fb957c899b7db0a4a
|