institutional-trader/PHASE1_DATA_SOURCES.md

165 lines
5.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Phase 1 Data Sources
This document explains where each Phase 1 feature gets its data from.
## Data Flow Overview
```
PostgreSQL Database
OptionsFlow_monthly table (raw options flow data)
OptionsFlowProcessor (normalizes, calculates badges, aggregates)
PriceContextService (adds price context, VWAP)
AlertService (matches alerts)
Phase 1 Services (Signal Tier, Price Reaction, Checklist)
Final Output
```
## 1. Initial Data Source
**Location:** `backend/python_service/main.py` (lines 115-123)
```python
SELECT *
FROM "OptionsFlow_monthly"
WHERE "Premium" IS NOT NULL
AND TRIM("Premium"::text) <> ''
AND "StockEtf" = 'STOCK'
AND "Symbol" NOT IN ('TSLA', 'NVDA')
```
**What it provides:**
- Raw options flow records from the `OptionsFlow_monthly` table
- All columns from the table (Symbol, Premium, Strike, Expiration, etc.)
## 2. Signal Tier Classification
**Service:** `backend/python_service/services/signal_tier_classifier.py`
**Data Sources:**
- **Badges:** From `OptionsFlowProcessor` (calculated from flow data)
- `badge_round`: 🟢 or 🔴 (from direction and net premium)
- `badge_more`: 💎⭐ (from premium thresholds, volume/OI ratios)
- **Premium:** From processed flow data
- `premium_num`: Total premium for the signal
- `bull_total`, `bear_total`: Bullish vs bearish premium
- `prem_cb_itm`, `prem_ps_itm`, `prem_cs_itm`, `prem_pb_itm`: ITM premium breakdown
- **Direction:** From `OptionsFlowProcessor`
- `direction`: 'BULL' or 'BEAR'
- **Volume/OI:** From raw flow data
- `vol_num`: Volume
- `oi_num`: Open Interest
**Database Tables Used:**
-`OptionsFlow_monthly` (via OptionsFlowProcessor)
- ❌ No direct database queries
## 3. Price Reaction Tracking
**Service:** `backend/python_service/services/price_reaction_tracker.py`
**Data Sources:**
- **Signal Time:** From processed flow data
- `flow_ts_utc`: Timestamp of the signal
- `symbol_norm`: Normalized symbol
- **Price at Signal:** From `PriceContextService`
- `u_close`: Price at the time of the signal
**Database Tables Used:**
-`prices_intraday_1m` (queried directly)
- Gets price at 5m, 15m, 30m after signal time
- Query: `SELECT close FROM prices_intraday_1m WHERE symbol = $1 AND ts <= $2 ORDER BY ts DESC LIMIT 1`
**Calculation:**
```python
reaction_5m = ((price_5m - price_at_signal) / price_at_signal) * 100
flow_led_to_move = abs(reaction_5m) > 0.5 # 0.5% threshold
```
## 4. Trade Checklist
**Service:** `backend/python_service/services/trade_checklist.py`
**Data Sources:**
- **Badges:** From `OptionsFlowProcessor`
- `badge_round`: 🟢 or 🔴
- `badge_more`: 💎⭐
- **VWAP:** From `PriceContextService`
- `vwap_at_signal`: VWAP at the time of the signal
- `price_vs_vwap_pct`: Percentage distance from VWAP
- **Index Alignment:** From processed flow data (if available)
- `index_aligned`: Boolean indicating if index confirms
**Database Tables Used:**
-`prices_intraday_1m` (via PriceContextService for VWAP calculation)
-`prices_daily` (via PriceContextService for prior close)
**Checklist Items:**
1. ✅ Has direction (🟢 or 🔴)
2. ✅ Has diamond (💎)
3. ✅ Has star (⭐)
4. ✅ Price respects VWAP (within ±2%)
5. ✅ Index confirms (if available)
## 5. VWAP Calculation
**Service:** `backend/python_service/services/price_context.py`
**Data Sources:**
- **RTH Open:** From `prices_intraday_1m`
- Gets first bar at 9:30 AM CST for the trading day
- **Price Data:** From `prices_intraday_1m`
- Gets all 1-minute bars from RTH open to signal time
- Calculates: `VWAP = Σ(price × volume) / Σ(volume)`
**Database Tables Used:**
-`prices_intraday_1m` (queried directly)
- Query for RTH open: `SELECT open FROM prices_intraday_1m WHERE symbol = $1 AND date = $2 AND time >= '09:30:00' ORDER BY ts ASC LIMIT 1`
- Query for VWAP: `SELECT close, volume FROM prices_intraday_1m WHERE symbol = $1 AND ts >= $2 AND ts <= $3 ORDER BY ts ASC`
## Summary Table
| Phase 1 Feature | Primary Data Source | Database Tables | Direct DB Queries? |
|----------------|---------------------|-----------------|-------------------|
| **Signal Tier** | OptionsFlowProcessor (badges, premium) | OptionsFlow_monthly (via processor) | ❌ No |
| **Price Reaction** | prices_intraday_1m | prices_intraday_1m | ✅ Yes |
| **Trade Checklist** | OptionsFlowProcessor (badges) + PriceContextService (VWAP) | OptionsFlow_monthly, prices_intraday_1m | ✅ Yes (via PriceContextService) |
| **VWAP** | prices_intraday_1m | prices_intraday_1m | ✅ Yes |
## Key Dependencies
1. **OptionsFlowProcessor** must run first to calculate badges and normalize data
2. **PriceContextService** must run before Phase 1 to provide VWAP and price context
3. **Price Reaction** requires `prices_intraday_1m` to have data for the signal time + 5/15/30 minutes
4. **VWAP** requires `prices_intraday_1m` to have data from RTH open (9:30 AM CST) to signal time
## Common Issues
### "Not calculated" for all fields
- **Cause:** Python service not running, or data coming from SQL fallback
- **Solution:** Ensure Python service is running at `http://localhost:8010`
### Price Reaction shows "Not calculated"
- **Cause:**
- Historical data (future dates have no price data)
- Missing price data in `prices_intraday_1m` for the time period
- Signal time is invalid
- **Solution:** Check that `prices_intraday_1m` has data for the signal date and time
### VWAP shows "Not calculated"
- **Cause:**
- Signal occurred before RTH open (9:30 AM CST)
- Missing price data in `prices_intraday_1m` for the trading day
- Historical/future dates
- **Solution:** VWAP is only available during RTH hours (9:30 AM - 4:00 PM CST)
### Signal Tier shows "Not calculated"
- **Cause:** Python service not running (this should always work if service is running)
- **Solution:** Check Python service logs for errors in `SignalTierClassifier`