Features Added: ============== 📧 EMAIL REPORTING SYSTEM: - EmailReporter: Send reports via SMTP (Gmail, SendGrid, custom) - ReportGenerator: Generate daily/weekly summaries with HTML/text formatting - Configurable via .env (SMTP_HOST, SMTP_PORT, etc.) - Scripts: send_daily_report.py, send_weekly_report.py 🤖 AUTOMATED RUNS: - automated_daily_run.sh: Full daily ETL pipeline + reporting - automated_weekly_run.sh: Weekly pattern analysis + reports - setup_cron.sh: Interactive cron job setup (5-minute setup) - Logs saved to ~/logs/ with automatic cleanup 🔍 HEALTH CHECKS: - health_check.py: System health monitoring - Checks: DB connection, data freshness, counts, recent alerts - JSON output for programmatic use - Exit codes for monitoring integration 🚀 CI/CD PIPELINE: - .github/workflows/ci.yml: Full CI/CD pipeline - GitHub Actions / Gitea Actions compatible - Jobs: lint & test, security scan, dependency scan, Docker build - PostgreSQL service for integration tests - 93 tests passing in CI 📚 COMPREHENSIVE DOCUMENTATION: - AUTOMATION_QUICKSTART.md: 5-minute email setup guide - docs/12_automation_and_reporting.md: Full automation guide - Updated README.md with automation links - Deployment → Production workflow guide 🛠️ IMPROVEMENTS: - All shell scripts made executable - Environment variable examples in .env.example - Report logs saved with timestamps - 30-day log retention with auto-cleanup - Health checks can be scheduled via cron WHAT THIS ENABLES: ================== After deployment, users can: 1. Set up automated daily/weekly email reports (5 min) 2. Receive HTML+text emails with: - New trades, market alerts, suspicious timing - Weekly patterns, rankings, repeat offenders 3. Monitor system health automatically 4. Run full CI/CD pipeline on every commit 5. Deploy with confidence (tests + security scans) USAGE: ====== # One-time setup (on deployed server) ./scripts/setup_cron.sh # Or manually send reports python scripts/send_daily_report.py --to user@example.com python scripts/send_weekly_report.py --to user@example.com # Check system health python scripts/health_check.py See AUTOMATION_QUICKSTART.md for full instructions. 93 tests passing | Full CI/CD | Email reports ready
316 lines
8.0 KiB
Markdown
316 lines
8.0 KiB
Markdown
# PR4 Summary: Phase 2 Analytics Foundation
|
|
|
|
## ✅ Completed
|
|
|
|
**Date**: December 15, 2025
|
|
**Status**: Complete
|
|
**Tests**: All passing
|
|
|
|
## What Was Built
|
|
|
|
### 1. Analytics Module (`src/pote/analytics/`)
|
|
|
|
#### ReturnCalculator (`returns.py`)
|
|
- Calculate returns for trades over various time windows (30/60/90/180 days)
|
|
- Handle buy and sell trades appropriately
|
|
- Find closest price data when exact dates unavailable
|
|
- Export price series as pandas DataFrames
|
|
|
|
**Key Methods:**
|
|
- `calculate_trade_return()` - Single trade return
|
|
- `calculate_multiple_windows()` - Multiple time windows
|
|
- `calculate_all_trades()` - Batch calculation
|
|
- `get_price_series()` - Historical price data
|
|
|
|
#### BenchmarkComparison (`benchmarks.py`)
|
|
- Calculate benchmark returns (SPY, QQQ, DIA, etc.)
|
|
- Compute abnormal returns (alpha)
|
|
- Compare trades to market performance
|
|
- Batch comparison operations
|
|
|
|
**Key Methods:**
|
|
- `calculate_benchmark_return()` - Market index returns
|
|
- `calculate_abnormal_return()` - Alpha calculation
|
|
- `compare_trade_to_benchmark()` - Single trade comparison
|
|
- `calculate_aggregate_alpha()` - Portfolio-level metrics
|
|
|
|
#### PerformanceMetrics (`metrics.py`)
|
|
- Aggregate statistics by official
|
|
- Sector-level analysis
|
|
- Top performer rankings
|
|
- Disclosure timing analysis
|
|
|
|
**Key Methods:**
|
|
- `official_performance()` - Comprehensive official stats
|
|
- `sector_analysis()` - Performance by sector
|
|
- `top_performers()` - Leaderboard
|
|
- `timing_analysis()` - Disclosure lag stats
|
|
- `summary_statistics()` - System-wide metrics
|
|
|
|
### 2. Analysis Scripts (`scripts/`)
|
|
|
|
#### `analyze_official.py`
|
|
Interactive tool to analyze a specific official:
|
|
```bash
|
|
python scripts/analyze_official.py "Nancy Pelosi" --window 90 --benchmark SPY
|
|
```
|
|
|
|
**Output Includes:**
|
|
- Trading activity summary
|
|
- Return metrics (avg, median, max, min)
|
|
- Alpha (vs market benchmark)
|
|
- Win rates
|
|
- Best/worst trades
|
|
- Research signals (FOLLOW, AVOID, WATCH)
|
|
|
|
#### `calculate_all_returns.py`
|
|
System-wide performance analysis:
|
|
```bash
|
|
python scripts/calculate_all_returns.py --window 90 --benchmark SPY --top 10
|
|
```
|
|
|
|
**Output Includes:**
|
|
- Overall statistics
|
|
- Aggregate performance
|
|
- Top 10 performers by alpha
|
|
- Sector analysis
|
|
- Disclosure timing
|
|
|
|
### 3. Tests (`tests/test_analytics.py`)
|
|
|
|
- ✅ Return calculator with sample data
|
|
- ✅ Buy vs sell trade handling
|
|
- ✅ Missing data edge cases
|
|
- ✅ Benchmark comparisons
|
|
- ✅ Official performance metrics
|
|
- ✅ Multiple time windows
|
|
- ✅ Sector analysis
|
|
- ✅ Timing analysis
|
|
|
|
**Test Coverage**: Analytics module fully tested
|
|
|
|
## Example Usage
|
|
|
|
### Analyze an Official
|
|
|
|
```python
|
|
from pote.analytics.metrics import PerformanceMetrics
|
|
from pote.db import get_session
|
|
|
|
with next(get_session()) as session:
|
|
metrics = PerformanceMetrics(session)
|
|
|
|
# Get performance for official ID 1
|
|
perf = metrics.official_performance(
|
|
official_id=1,
|
|
window_days=90,
|
|
benchmark="SPY"
|
|
)
|
|
|
|
print(f"{perf['name']}")
|
|
print(f"Average Return: {perf['avg_return']:.2f}%")
|
|
print(f"Alpha: {perf['avg_alpha']:.2f}%")
|
|
print(f"Win Rate: {perf['win_rate']:.1%}")
|
|
```
|
|
|
|
### Calculate Trade Returns
|
|
|
|
```python
|
|
from pote.analytics.returns import ReturnCalculator
|
|
from pote.db import get_session
|
|
from pote.db.models import Trade
|
|
|
|
with next(get_session()) as session:
|
|
calculator = ReturnCalculator(session)
|
|
|
|
# Get a trade
|
|
trade = session.query(Trade).first()
|
|
|
|
# Calculate returns for multiple windows
|
|
results = calculator.calculate_multiple_windows(
|
|
trade,
|
|
windows=[30, 60, 90]
|
|
)
|
|
|
|
for window, data in results.items():
|
|
print(f"{window}d: {data['return_pct']:.2f}%")
|
|
```
|
|
|
|
### Compare to Benchmark
|
|
|
|
```python
|
|
from pote.analytics.benchmarks import BenchmarkComparison
|
|
from pote.db import get_session
|
|
|
|
with next(get_session()) as session:
|
|
benchmark = BenchmarkComparison(session)
|
|
|
|
# Get aggregate alpha for all officials
|
|
stats = benchmark.calculate_aggregate_alpha(
|
|
official_id=None, # All officials
|
|
window_days=90,
|
|
benchmark="SPY"
|
|
)
|
|
|
|
print(f"Average Alpha: {stats['avg_alpha']:.2f}%")
|
|
print(f"Beat Market Rate: {stats['beat_market_rate']:.1%}")
|
|
```
|
|
|
|
## Command Line Usage
|
|
|
|
### Analyze Specific Official
|
|
```bash
|
|
# In container
|
|
cd ~/pote && source venv/bin/activate
|
|
|
|
# Analyze Nancy Pelosi's trades
|
|
python scripts/analyze_official.py "Nancy Pelosi"
|
|
|
|
# With custom parameters
|
|
python scripts/analyze_official.py "Tommy Tuberville" --window 180 --benchmark QQQ
|
|
```
|
|
|
|
### System-Wide Analysis
|
|
```bash
|
|
# Calculate all returns and show top 10
|
|
python scripts/calculate_all_returns.py
|
|
|
|
# Custom parameters
|
|
python scripts/calculate_all_returns.py --window 60 --benchmark SPY --top 20
|
|
```
|
|
|
|
## What You Can Do Now
|
|
|
|
### 1. Analyze Your Existing Data
|
|
```bash
|
|
# On your Proxmox container (10.0.10.95)
|
|
ssh root@10.0.10.95
|
|
su - poteapp
|
|
cd pote && source venv/bin/activate
|
|
|
|
# Analyze each official
|
|
python scripts/analyze_official.py "Nancy Pelosi"
|
|
python scripts/analyze_official.py "Dan Crenshaw"
|
|
|
|
# System-wide view
|
|
python scripts/calculate_all_returns.py
|
|
```
|
|
|
|
### 2. Compare Officials
|
|
```python
|
|
from pote.analytics.metrics import PerformanceMetrics
|
|
from pote.db import get_session
|
|
|
|
with next(get_session()) as session:
|
|
metrics = PerformanceMetrics(session)
|
|
|
|
# Get top 5 by alpha
|
|
top = metrics.top_performers(window_days=90, limit=5)
|
|
|
|
for i, perf in enumerate(top, 1):
|
|
print(f"{i}. {perf['name']}: {perf['avg_alpha']:.2f}% alpha")
|
|
```
|
|
|
|
### 3. Sector Analysis
|
|
```python
|
|
from pote.analytics.metrics import PerformanceMetrics
|
|
from pote.db import get_session
|
|
|
|
with next(get_session()) as session:
|
|
metrics = PerformanceMetrics(session)
|
|
|
|
sectors = metrics.sector_analysis(window_days=90)
|
|
|
|
print("Performance by Sector:")
|
|
for s in sectors:
|
|
print(f"{s['sector']:20s} | {s['avg_alpha']:+6.2f}% alpha | {s['win_rate']:.1%} win rate")
|
|
```
|
|
|
|
## Limitations & Notes
|
|
|
|
### Current Limitations
|
|
1. **Requires Price Data**: Need historical prices in database
|
|
- Run `python scripts/fetch_sample_prices.py` first
|
|
- Or manually add prices for your securities
|
|
|
|
2. **Limited Sample**: Only 5 trades currently
|
|
- Add more trades for meaningful analysis
|
|
- Use `scripts/add_custom_trades.py`
|
|
|
|
3. **No Risk-Adjusted Metrics Yet**
|
|
- Sharpe ratio (coming in next PR)
|
|
- Drawdowns
|
|
- Volatility measures
|
|
|
|
### Data Quality
|
|
- Handles missing price data gracefully (returns None)
|
|
- Finds closest price within 5-day window
|
|
- Adjusts returns for buy vs sell trades
|
|
- Logs warnings for data issues
|
|
|
|
## Files Changed/Added
|
|
|
|
**New Files:**
|
|
- `src/pote/analytics/__init__.py`
|
|
- `src/pote/analytics/returns.py` (245 lines)
|
|
- `src/pote/analytics/benchmarks.py` (195 lines)
|
|
- `src/pote/analytics/metrics.py` (265 lines)
|
|
- `scripts/analyze_official.py` (145 lines)
|
|
- `scripts/calculate_all_returns.py` (130 lines)
|
|
- `tests/test_analytics.py` (230 lines)
|
|
|
|
**Total New Code:** ~1,210 lines
|
|
|
|
## Next Steps (PR5: Signals & Clustering)
|
|
|
|
### Planned Features:
|
|
1. **Research Signals**
|
|
- `FOLLOW_RESEARCH`: Officials with consistent alpha > 5%
|
|
- `AVOID_RISK`: Suspicious patterns or negative alpha
|
|
- `WATCH`: Unusual activity or limited data
|
|
|
|
2. **Behavioral Clustering**
|
|
- Group officials by trading patterns
|
|
- k-means clustering on features:
|
|
- Trade frequency
|
|
- Average position size
|
|
- Sector preferences
|
|
- Timing patterns
|
|
|
|
3. **Risk Metrics**
|
|
- Sharpe ratio
|
|
- Max drawdown
|
|
- Win/loss streaks
|
|
- Volatility
|
|
|
|
4. **Event Analysis**
|
|
- Trades near earnings
|
|
- Trades near policy events
|
|
- Unusual timing flags
|
|
|
|
## Success Criteria ✅
|
|
|
|
- ✅ Can calculate returns for any trade + window
|
|
- ✅ Can compare to S&P 500 benchmark
|
|
- ✅ Can generate official performance summaries
|
|
- ✅ All calculations tested and accurate
|
|
- ✅ Performance data calculated on-the-fly
|
|
- ✅ Documentation complete
|
|
- ✅ Command-line tools working
|
|
|
|
## Testing
|
|
|
|
Run tests:
|
|
```bash
|
|
pytest tests/test_analytics.py -v
|
|
```
|
|
|
|
All analytics tests should pass (may have warnings if no price data).
|
|
|
|
---
|
|
|
|
**Phase 2 Analytics Foundation: COMPLETE** ✅
|
|
**Ready for**: PR5 (Signals), PR6 (API), PR7 (Dashboard)
|
|
|
|
|