Skip to main content

🌳 Canopy Trading Language

A powerful, expressive domain-specific language (DSL) for trading strategy development and backtesting.

⚠️ Alpha release (alpha) — The core DSL, parser, backtest engine, optimizers (Bayesian/Genetic/Grid), and metrics are working (264 unit tests passing). Data provider adapters (Yahoo Finance, CSV) are not yet implemented in this release — bring your own pandas.DataFrame of OHLC data for now. The REST API and web frontend mentioned below are experimental and require pip install canopy-lang[web]. API may change before 1.0.

Tests Docker Build codecov Python 3.11+ License: MIT

Quickstart (alpha, bring your own data)

The simplest way to run a backtest today — no data provider adapter needed. Bring a pandas.DataFrame (or the four pd.Series shown below) and go:

from canopy.domain.timeseries import TimeSeries
from canopy.domain.strategy import MACrossoverStrategy
from canopy.adapters.engines.simple_engine import SimpleBacktestEngine
from canopy.application.run_backtest import RunBacktestUseCase
import pandas as pd
import numpy as np

# Synthetic OHLC via random walk
dates = pd.date_range("2024-01-01", periods=252, freq="D")
np.random.seed(42)
close = 100 + np.cumsum(np.random.randn(252) * 2)
ts = TimeSeries(
    open=pd.Series(close - 0.5, index=dates),
    high=pd.Series(close + 1, index=dates),
    low=pd.Series(close - 1, index=dates),
    close=pd.Series(close, index=dates),
    volume=pd.Series([1_000_000] * 252, index=dates),
)

strategy = MACrossoverStrategy(name="SMA 10/30", fast_period=10, slow_period=30)
engine = SimpleBacktestEngine()
use_case = RunBacktestUseCase(engine)
backtest, metrics = use_case.execute(
    strategy, ts,
    initial_capital=10_000.0,
    commission=0.001,
    slippage=0.0,
)

print(f"Total Return:   {metrics.total_return:.2f}%")
print(f"Sharpe Ratio:   {metrics.sharpe_ratio:.2f}")
print(f"Max Drawdown:   {metrics.max_drawdown:.2f}%")
print(f"Total Trades:   {metrics.total_trades}")
print(f"Win Rate:       {metrics.win_rate:.2f}%")

Expected output (approximate):

Total Return:   -4.70%
Sharpe Ratio:   -0.01
Max Drawdown:   -16.22%
Total Trades:   5
Win Rate:       40.00%

A runnable copy lives at examples/quickstart_byod.py.

Note: The CLI commands like canopy backtest --symbol AAPL shown elsewhere in this README will be available when data provider adapters ship (tracked in issues). For now, the programmatic API above is the recommended path.

✨ Features

  • 📝 Intuitive DSL: Write trading strategies in a clear, expressive language
  • 📊 Technical Indicators: 15+ built-in indicators (SMA, EMA, RSI, MACD, Bollinger Bands, etc.)
  • 🔙 Fast Backtesting: Vectorized backtest engine for quick results
  • 📈 Performance Metrics: Comprehensive metrics (Sharpe, Sortino, drawdown, win rate, etc.)
  • 🌐 REST API: FastAPI-powered API for programmatic access
  • 💻 Web Interface: React-based frontend for visual strategy development
  • 🐳 Docker Ready: Complete Docker Compose setup for easy deployment
  • 🧪 Production Ready: Built with hexagonal architecture and TDD
  • 📚 Rich Examples: 10+ example strategies from basic to advanced

🚀 Quick Start

With Docker (Recommended)

# Clone the repository
git clone https://github.com/larancibia/canopy-lang.git
cd canopy

# Start all services
docker-compose up

# Access the services
# API: http://localhost:8000
# API Docs: http://localhost:8000/docs
# Web UI: http://localhost:5173

Local Development

# Run setup script
./scripts/setup.sh

# Start development servers
./scripts/run-dev.sh

Simple Example

Create a file my_strategy.canopy:

strategy "MA Crossover"

# Define moving averages
fast_ma = sma(close, 50)
slow_ma = sma(close, 200)

# Entry: Buy when fast crosses above slow
buy when crossover(fast_ma, slow_ma)

# Exit: Sell when fast crosses below slow
sell when crossunder(fast_ma, slow_ma)

# Visualize
plot(fast_ma, "Fast MA", color=blue)
plot(slow_ma, "Slow MA", color=red)

Run the backtest:

# CLI
canopy backtest my_strategy.canopy --symbol AAPL --start 2022-01-01 --end 2023-12-31

# Python API
from canopy import run_backtest

result = run_backtest(
    strategy_file="my_strategy.canopy",
    symbol="AAPL",
    start_date="2022-01-01",
    end_date="2023-12-31"
)

print(f"Total Return: {result.metrics.total_return:.2%}")
print(f"Sharpe Ratio: {result.metrics.sharpe_ratio:.2f}")

📚 Documentation

🎯 Example Strategies

Basic Strategies

Advanced Strategies

Portfolio Strategies

Python Examples

🏗️ Architecture

Canopy is built using Hexagonal Architecture (Ports and Adapters):

┌─────────────────────────────────────────┐
│           UI Layer                      │
│   CLI  │  Web API  │  Web Frontend     │
└─────────────┬───────────────────────────┘
              │
┌─────────────▼───────────────────────────┐
│      Application Layer (Use Cases)      │
│   Run Backtest  │  Fetch Data  │  ...   │
└─────────────┬───────────────────────────┘
              │
┌─────────────▼───────────────────────────┐
│     Domain Layer (Business Logic)       │
│  Strategy │ Indicator │ Signal │ ...    │
└─────────────┬───────────────────────────┘
              │
┌─────────────▼───────────────────────────┐
│       Ports (Interfaces)                │
│  IDataProvider  │  IBacktestEngine      │
└─────────────┬───────────────────────────┘
              │
┌─────────────▼───────────────────────────┐
│     Adapters (Implementations)          │
│  Yahoo │ CSV │ Simple Engine │ ...      │
└─────────────────────────────────────────┘

See ARCHITECTURE.md for details.

🛠️ Tech Stack

Backend

  • Python 3.11+ - Core language
  • FastAPI - REST API framework
  • Pandas & NumPy - Data processing
  • Pydantic - Data validation
  • yfinance - Market data

Frontend

  • React 18 - UI framework
  • Vite - Build tool
  • TailwindCSS - Styling
  • Recharts - Charting

Infrastructure

  • Docker & Docker Compose - Containerization
  • PostgreSQL - Database
  • Redis - Caching and job queue
  • GitHub Actions - CI/CD

🧪 Testing

# Run all tests
./scripts/test-all.sh

# Run unit tests only
poetry run pytest tests/unit -v

# Run integration tests
poetry run pytest tests/integration -v

# Run with coverage
poetry run pytest --cov=src/canopy --cov-report=html

📦 Installation

From Source

# Clone repository
git clone https://github.com/larancibia/canopy-lang.git
cd canopy

# Install with Poetry
poetry install

# Or with pip (when published)
pip install canopy-lang

Docker

# Pull images
docker pull ghcr.io/larancibia/canopy-lang/api:latest
docker pull ghcr.io/larancibia/canopy-lang/web:latest

# Run with Docker Compose
docker-compose up

🤝 Contributing

We welcome contributions! Please see our Development Guide.

# Setup development environment
./scripts/setup.sh

# Create a feature branch
git checkout -b feature/amazing-feature

# Make changes and run tests
./scripts/test-all.sh

# Commit and push
git commit -m "Add amazing feature"
git push origin feature/amazing-feature

📝 License

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

🌟 Roadmap

MVP (Current)

  • Core DSL parser
  • Basic indicators
  • Simple backtest engine
  • CLI interface
  • REST API
  • Web frontend
  • Docker deployment

v0.2.0 (Next)

  • Portfolio backtesting (multi-asset)
  • Walk-forward optimization
  • Real-time data feeds
  • More indicators (50+)
  • Custom indicator creation UI

v0.3.0 (Future)

  • Live trading integration
  • Machine learning integration
  • Options and futures support
  • Social trading features
  • Cloud hosting (SaaS)

📞 Support

🙏 Acknowledgments


Made with ❤️ by Luis Arancibia

⭐ Star us on GitHub if you find this project helpful!

Metadata

Release files for canopy-lang 0.0.5

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for canopy-lang 0.0.5
File Size Uploaded Provenance
canopy_lang-0.0.5.tar.gz 79.0 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for canopy-lang 0.0.5
File Interpreter ABI Platform
canopy_lang-0.0.5-py3-none-any.whl Python 3 none any Details

Total release size: 190.3 kB

Release files / canopy_lang-0.0.5.tar.gz

Download URL canopy_lang-0.0.5.tar.gz
Size 79.0 kB
Tags Source
SHA-256 checksum
How to use checksums
e1c86724d330b5be41b8a6f869bc0967b3bc34165969d998b4b1c411bc935215
BLAKE2b-256 checksum
How to use checksums
1f3fe6be962f4fa60012d8c75df96c7206c5131e5f46d5df9abdc6c658b11997
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.3

Release files / canopy_lang-0.0.5-py3-none-any.whl

Download URL canopy_lang-0.0.5-py3-none-any.whl
Size 111.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
d479dd48ac842d21ac75e01751aec8b2e829edebeed5330d873796d48f1347d2
BLAKE2b-256 checksum
How to use checksums
991af95b112dfeacaa3a332d7aa128b00500992a3bede79a9ed2c65b97a69274
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.3

Security for canopy-lang 0.0.5

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

0.0.5 This release

2 release files No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page