EETC Utils
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 Criterioncalculate_position_size_kelly(): Calculate position size based on Kelly Criterionintrinsic_value_using_dcf(): Discounted cash flow valuationgarch_annualized_volatility(): GARCH-based volatility forecastingconvert_daily_ohlc_data_to_weekly(): Convert daily OHLC data to weekly timeframesperformance_over_time(): Calculate percentage performance between datescompound_interest(): Calculate compound interestbeta_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 putsfind_strikes_in_range(): Find strike prices within a percentage rangeGEX(): Calculate Gamma Exposure for option contractscalculate_underlying_iv_from_option_iv(): Convert option IV to underlying IVPDF(): Standard normal probability density functionCND(): Cumulative normal distributionD1(),D2(): Black-Scholes d1 and d2 calculations
API Clients
- EETCDataClient: HTTP client for fetching market data and fundamentals
get_price_data(): Fetch historical price dataget_fundamentals(): Get company fundamentalsget_macro_indicators(): Fetch macroeconomic indicatorsget_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
Strategyclass withon_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:
- TestPyPI: https://test.pypi.org/manage/account/token/
- Production PyPI: https://pypi.org/manage/account/token/
Publishing Steps
-
Update version in
pyproject.toml:- Increment
versionfield in[tool.poetry]section - Update dependencies in
[tool.poetry.dependencies]if needed
- Increment
-
Build the package:
python -m build
-
Test on PyPI Test:
make publish_package_on_pypi_test -
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)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
- East Empire Trading Company - eastempiretradingcompany2019@gmail.com
- Stefan Delic - einfach.jung1@gmail.com
- Milos Dovedan - dovedanmilosh@gmail.com
Links
- Homepage: https://github.com/east-empire-trading-company/eetc-utils
- PyPI: https://pypi.org/project/eetc-utils/
- Bug Tracker: https://github.com/east-empire-trading-company/eetc-utils/issues
Support
For questions, issues, or feature requests, please open an issue on GitHub.
Metadata
Release files for eetc-utils 1.6.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| eetc_utils-1.6.0.tar.gz | 22.6 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| eetc_utils-1.6.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 46.5 kB
Release files / eetc_utils-1.6.0.tar.gz
| Download URL | eetc_utils-1.6.0.tar.gz |
|---|---|
| Size | 22.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
c095e18ef5fa8a20419e3f1ba79a7688dc65f118fd11e013fb08386c5c61c938
|
|
BLAKE2b-256 checksum How to use checksums |
156883fbaab2262a1c3f035086dc30eabd59d04b1d83ee3ac62eb9184ece4602
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
poetry/2.2.1 CPython/3.12.3 Linux/6.8.0-139-generic
|
Release files / eetc_utils-1.6.0-py3-none-any.whl
| Download URL | eetc_utils-1.6.0-py3-none-any.whl |
|---|---|
| Size | 24.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
7bf5e9b22e8f942a9f4798933cd0f7c1f0a84cccfee637bdb42861dd5a4ebf81
|
|
BLAKE2b-256 checksum How to use checksums |
3b1bde7f5254c39548942279d06f374d33a85fb8f8a73b3e282edfc931067c53
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
poetry/2.2.1 CPython/3.12.3 Linux/6.8.0-139-generic
|