Skip to main content

EETC Utils Library

Project description

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

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.")

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
└── 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

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+
  • Poetry (for dependency management)

Setup

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

# Install Python dependencies
make update_and_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 [tool.poetry] section
    • Update dependencies in [tool.poetry.dependencies] if needed
  2. Build the package:

    python -m 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 configure Poetry before publishing.

Configuration

Environment Variables

  • EETC_API_KEY: API key for EETC Data Hub client (required for data 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

Links

Support

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

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

eetc_utils-1.3.1.tar.gz (20.7 kB view details)

Uploaded Source

Built Distribution

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

eetc_utils-1.3.1-py3-none-any.whl (22.0 kB view details)

Uploaded Python 3

File details

Details for the file eetc_utils-1.3.1.tar.gz.

File metadata

  • Download URL: eetc_utils-1.3.1.tar.gz
  • Upload date:
  • Size: 20.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/2.2.1 CPython/3.12.3 Linux/6.8.0-90-generic

File hashes

Hashes for eetc_utils-1.3.1.tar.gz
Algorithm Hash digest
SHA256 26fcbbe5a50b1c5b56965c8fc91efae7545cebc27ec737be419c00281128fc39
MD5 96b8cb1a4b1c3f560d0a6ef2ceb7138c
BLAKE2b-256 1b850bd6951393f36d02c40657da2b4837340611d7230f2be67064049316af9b

See more details on using hashes here.

File details

Details for the file eetc_utils-1.3.1-py3-none-any.whl.

File metadata

  • Download URL: eetc_utils-1.3.1-py3-none-any.whl
  • Upload date:
  • Size: 22.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/2.2.1 CPython/3.12.3 Linux/6.8.0-90-generic

File hashes

Hashes for eetc_utils-1.3.1-py3-none-any.whl
Algorithm Hash digest
SHA256 e11e2181eed35a4543b9fe0b15d141c4dd63797b11c4433414256f33800c23f3
MD5 308ccf0449baf18a7a819e506c8070b3
BLAKE2b-256 7805f5ca0c8829055361e291dca9c28c7922e4d9e68423a20b7d9150ec63306a

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