Skip to main content

EETC Utils

PyPI version Python 3.12+ License: MIT

A Python library providing reusable utilities for financial analysis and algorithmic trading. Built by East Empire Trading Company for quantitative finance and trading strategy development.

Features

Finance Utilities

  • Quantitative Finance Functions: Kelly Criterion position sizing, DCF valuation, compound interest
  • GARCH Models: Advanced volatility forecasting using ARCH library integration
  • OHLC Data Manipulation: Convert daily data to weekly timeframes, performance calculations

Options Trading

  • Black-Scholes Pricing: Calculate option prices for calls and puts
  • Greeks Calculations: Gamma exposure (GEX) and other option Greeks
  • Volatility Analysis: Convert option IV to underlying IV, standard distribution functions
  • Strike Range Tools: Find strike prices within percentage ranges

API Clients

  • EETC Data Hub Client: Fetch price data, fundamentals, macroeconomic indicators, and order history
  • EETC Notifications Client: Send trade updates and notifications to Telegram channels
  • Claude Client: Simple wrapper around the Anthropic SDK for single- and multi-turn text completions

Strategy Framework

  • Live Trading: Abstract base classes for implementing live/paper trading strategies
  • Execution Engine: Production-ready engine for running trading strategies
  • Backtesting Framework: Complete backtesting suite with broker simulation, performance metrics, and result persistence

Installation

pip install eetc-utils

Quick Start

Finance Utilities

from eetc_utils.finance import (
    calculate_optimal_leverage_kelly,
    intrinsic_value_using_dcf,
    garch_annualized_volatility,
    convert_daily_ohlc_data_to_weekly
)
import pandas as pd

# Calculate optimal leverage using Kelly Criterion
price_df = pd.DataFrame({
    'date': pd.date_range('2020-01-01', periods=200),
    'close': [100 + i * 0.5 for i in range(200)]
})

leverage = calculate_optimal_leverage_kelly(
    df=price_df,
    position_type="LONG",
    regime_start_date="2020-01-01",
    fractional_kelly_multiplier=0.5,
    use_garch=False
)

# DCF valuation
intrinsic_value = intrinsic_value_using_dcf(
    cash_flow=1000000000,
    growth_years=10,
    shares=100000000,
    growth_rate=1.15,
    beta=1.2
)

# Forecast volatility using GARCH
volatility = garch_annualized_volatility(price_df)

# Convert daily OHLC to weekly
weekly_df = convert_daily_ohlc_data_to_weekly(price_df)

Options Trading

from eetc_utils.options import (
    calculate_option_price_black_scholes,
    find_strikes_in_range,
    GEX,
    calculate_underlying_iv_from_option_iv
)

# Calculate Black-Scholes option price
call_price = calculate_option_price_black_scholes(
    right="C",
    und_price=100.0,
    strike=105.0,
    rate=0.05,
    tte=0.5,
    implied_vol=0.25,
    pv_dividend=0.0
)

# Find strike prices within a range
strikes = find_strikes_in_range(
    range_length_perc=0.1,
    price=100.0
)

# Calculate Gamma Exposure
gex = GEX(oi=1000, gamma=0.05)

# Convert option IV to underlying IV
underlying_iv = calculate_underlying_iv_from_option_iv(
    option_implied_vol=0.20,
    t=30/365
)

EETC Data Hub Client

from eetc_utils.clients.eetc_data import EETCDataClient
import os

# Initialize client (requires EETC_API_KEY environment variable)
client = EETCDataClient(api_key=os.getenv("EETC_API_KEY"))

# Fetch price data
price_data = client.get_price_data(symbol="AAPL", start_date="2024-01-01")

# Get fundamentals
fundamentals = client.get_fundamentals(symbol="AAPL")

# Fetch macroeconomic indicators
macro_data = client.get_macro_indicators(indicator="GDP", country="US")

EETC Notifications Manager Client

from eetc_utils.clients.eetc_notifications import EETCNotificationsClient
import os

# Initialize client (requires EETC_API_KEY environment variable)
client = EETCNotificationsClient(api_key=os.getenv("EETC_API_KEY"))

# Send trade update via Telegram
client.send_trade_update_to_telegram(msg="Shorted TSLA x100 at 1312.69.")

Claude Client

from eetc_utils.clients.claude import ClaudeClient
import os

# Initialize client (requires ANTHROPIC_API_KEY environment variable)
client = ClaudeClient(api_key=os.getenv("ANTHROPIC_API_KEY"))

# Send a single-turn prompt
response = client.send_message("What is the capital of France?")

# Send a multi-turn prompt with a system prompt and prior history
response = client.send_message(
    "What's my name?",
    system="You are a helpful assistant.",
    messages=[
        {"role": "user", "content": "My name is Alice."},
        {"role": "assistant", "content": "Nice to meet you, Alice."},
    ],
)

Backtesting Framework

from eetc_utils.strategy.backtesting.strategy import Strategy
from eetc_utils.strategy.backtesting.engine import BacktestEngine
import pandas as pd

class MyStrategy(Strategy):
    def on_start(self, context):
        self.position = 0

    def on_data(self, bar, context):
        # Simple moving average crossover
        if len(self.data) < 20:
            return

        sma_short = self.data['close'].tail(5).mean()
        sma_long = self.data['close'].tail(20).mean()

        if sma_short > sma_long and self.position == 0:
            context['place_order']('buy', quantity=100)
            self.position = 100
        elif sma_short < sma_long and self.position > 0:
            context['place_order']('sell', quantity=100)
            self.position = 0

    def on_stop(self, context):
        pass

# Load historical data
data = pd.read_csv("AAPL_historical.csv")

# Run backtest
engine = BacktestEngine(
    strategy=MyStrategy(),
    data=data,
    symbol="AAPL",
    initial_capital=100000,
    commission=0.001
)

results = engine.run()
print(f"Total Return: {results['total_return']:.2%}")
print(f"Sharpe Ratio: {results['sharpe_ratio']:.2f}")
print(f"Max Drawdown: {results['max_drawdown']:.2%}")

Documentation

Module Structure

src/eetc_utils/
├── finance.py              # Quantitative finance utilities
├── options.py              # Options pricing and Greeks
├── clients/
│   ├── eetc_data.py       # EETC Data Hub API client
│   ├── eetc_notifications.py  # Notifications client
│   └── claude.py          # Claude API client
└── strategy/
    ├── strategy.py         # Live trading strategy base class
    ├── engine.py          # Live trading execution engine
    └── backtesting/
        ├── strategy.py    # Backtesting strategy base class
        ├── engine.py      # Backtesting engine
        ├── broker_sim.py  # Broker simulator
        └── metrics.py     # Performance metrics

Key Functions & Classes

Finance Module (finance.py)

  • calculate_optimal_leverage_kelly(): Calculate optimal leverage using Kelly Criterion
  • calculate_position_size_kelly(): Calculate position size based on Kelly Criterion
  • intrinsic_value_using_dcf(): Discounted cash flow valuation
  • garch_annualized_volatility(): GARCH-based volatility forecasting
  • convert_daily_ohlc_data_to_weekly(): Convert daily OHLC data to weekly timeframes
  • performance_over_time(): Calculate percentage performance between dates
  • compound_interest(): Calculate compound interest
  • beta_to_discount_rate(): Map beta to discount rate for DCF

Options Module (options.py)

  • calculate_option_price_black_scholes(): Black-Scholes option pricing for calls and puts
  • find_strikes_in_range(): Find strike prices within a percentage range
  • GEX(): Calculate Gamma Exposure for option contracts
  • calculate_underlying_iv_from_option_iv(): Convert option IV to underlying IV
  • PDF(): Standard normal probability density function
  • CND(): Cumulative normal distribution
  • D1(), D2(): Black-Scholes d1 and d2 calculations

API Clients

  • EETCDataClient: HTTP client for fetching market data and fundamentals
    • get_price_data(): Fetch historical price data
    • get_fundamentals(): Get company fundamentals
    • get_macro_indicators(): Fetch macroeconomic indicators
    • get_order_history(): Retrieve order history
  • EETCNotificationsClient: Send trading notifications via Telegram
    • send_trade_update_to_telegram(): Send trade notifications
  • ClaudeClient: Simple wrapper around the Anthropic SDK
    • send_message(): Send a single- or multi-turn text prompt to Claude

Strategy Framework

  • Live Trading: Strategy (ABC) for implementing live strategies
  • Backtesting: Simplified Strategy class with on_start(), on_data(), on_stop() lifecycle
  • Engines: Orchestrate strategy execution (live or backtest)
  • BrokerSim: Simulate order execution with configurable slippage and commission
  • Metrics: Calculate Sharpe ratio, max drawdown, and other performance statistics

Development

Prerequisites

  • Python 3.12+
  • uv (for dependency management, packaging, and publishing)

Setup

# Install system dependencies
sudo apt-get install build-essential

# Install Python dependencies
make install_python_requirements

Code Formatting

make reformat_code  # Uses black for consistent code style

Testing

# Run all tests
python -m pytest tests/

# Run specific test file
python -m pytest tests/test_financials.py

# Run with coverage
python -m pytest tests/ --cov=src/eetc_utils

Publishing to PyPI

Prerequisites

Create a .pypirc file in the project root with your PyPI API tokens:

[distutils]
index-servers =
  pypi
  testpypi

[testpypi]
repository = https://test.pypi.org/legacy/
username = __token__
password = pypi-YOUR_TEST_PYPI_TOKEN_HERE

[pypi]
repository = https://upload.pypi.org/legacy/
username = __token__
password = pypi-YOUR_PRODUCTION_PYPI_TOKEN_HERE

Note: The .pypirc file is already in .gitignore and will not be committed to version control.

To generate API tokens:

Publishing Steps

  1. Update version in pyproject.toml:

    • Increment version field in the [project] section
    • Update dependencies in [project.dependencies] (or [dependency-groups] for dev tools) if needed
  2. Build the package:

    uv build
    
  3. Test on PyPI Test:

    make publish_package_on_pypi_test
    
  4. Publish to production PyPI:

    make publish_package_on_pypi
    

The Makefile commands automatically read credentials from .pypirc and pass them to uv publish via the UV_PUBLISH_TOKEN environment variable.

Configuration

Environment Variables

  • EETC_API_KEY: API key for EETC Data Hub client (required for data access)
  • ANTHROPIC_API_KEY: API key for Claude client (required for Claude API access)

Contributing

Contributions are welcome! Please ensure:

  • Code follows the project's style guide (enforced by black)
  • All tests pass before submitting PR
  • New features include appropriate tests
  • Documentation is updated for API changes

License

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

Authors

Support

For questions, issues, or feature requests, please open an issue on GitHub.

Metadata

Release files for eetc-utils 1.9.0

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

Source distribution (sdist)

Source distribution for eetc-utils 1.9.0
File Size Uploaded
eetc_utils-1.9.0.tar.gz 19.9 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for eetc-utils 1.9.0
File Interpreter ABI Platform
eetc_utils-1.9.0-py3-none-any.whl Python 3 none any Details

Total release size: 45.6 kB

Release files / eetc_utils-1.9.0.tar.gz

Download URL eetc_utils-1.9.0.tar.gz
Size 19.9 kB
Tags Source
SHA-256 checksum
How to use checksums
5772ef3328aa883c892c4caea66b22ce2512dd4342fad74d76dc67d073c1a61a
BLAKE2b-256 checksum
How to use checksums
88fd588bf619062ab3a7e71d6f3ba9ad35c0ffb70b1e5d5f7cf0887eaffe3d4e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.11.6 {"installer":{"name":"uv","version":"0.11.6","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Release files / eetc_utils-1.9.0-py3-none-any.whl

Download URL eetc_utils-1.9.0-py3-none-any.whl
Size 25.6 kB
Tags Python 3
SHA-256 checksum
How to use checksums
72acdf52848df5c972ac971b3ff98b2b2c449a9f74f362da857ba52b8f29be94
BLAKE2b-256 checksum
How to use checksums
0809ef1c70ebfbb23755f0af4556f63b3e0ddeb0b8d055d8ed15bb4f27da5107
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.11.6 {"installer":{"name":"uv","version":"0.11.6","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Release history Release notifications | RSS feed

2.0.0

2 release files

This release

1.9.0 This release

2 release files

1.8.0

2 release files

1.7.0

2 release files

1.6.0

2 release files

1.5.0

2 release files

1.4.0

2 release files

1.3.1

2 release files

1.3.0

2 release files

1.2.0

2 release files

1.1.0

2 release files

1.0.2

2 release files

1.0.1

2 release files

1.0.0

2 release files

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