phase 14-15: docker build validation and helm deployment

This commit is contained in:
Celes Renata
2026-04-11 11:59:45 -07:00
parent 7394d241c9
commit ce10afa034
179 changed files with 32559 additions and 576 deletions
+23
View File
@@ -0,0 +1,23 @@
# Lakehouse Views
Example SQL views for Trino over MinIO-backed analytical fact tables.
These views are designed to be created in the `lakehouse.stonks` schema and
can be used directly in Superset dashboards or ad hoc Trino queries.
## Views
- `prediction_accuracy` — Joins predicted signals with realized market moves to score prediction quality
- `paper_trade_scorecard` — Aggregates paper trading performance by symbol with win rates and PnL
- `paper_trade_detail` — Per-order paper trade detail with fill prices and realized outcomes
- `signal_hit_rate` — Daily signal accuracy summary across all symbols
## Usage
Connect to Trino and run each `.sql` file to create the view:
```bash
trino --catalog lakehouse --schema stonks < lakehouse/views/prediction_accuracy.sql
```
Or paste into the Superset SQL Lab to explore interactively.
+47
View File
@@ -0,0 +1,47 @@
-- View: paper_trade_detail
-- Per-order paper trade detail joining orders, fills, and the originating
-- recommendation's prediction outcome. Useful for drill-down from the scorecard.
-- Requirements: 10.1, 10.3, 10.4
-- Design ref: Section 9.2 (evidence-to-outcome drill-down)
CREATE OR REPLACE VIEW lakehouse.stonks.paper_trade_detail AS
SELECT
o.order_id,
o.recommendation_id,
o.ticker,
o.side,
o.order_type,
o.quantity,
o.limit_price,
o.status AS order_status,
o.submitted_at,
f.fill_id,
f.fill_price,
f.fill_quantity,
f.commission,
f.filled_at,
-- Slippage: difference between limit and fill price (buys positive = worse)
CASE
WHEN o.limit_price IS NOT NULL AND o.limit_price > 0 THEN
(f.fill_price - o.limit_price) / o.limit_price * 100
ELSE NULL
END AS slippage_pct,
-- Link back to prediction outcome
pvo.predicted_action,
pvo.predicted_confidence,
pvo.actual_move_pct,
pvo.outcome AS prediction_outcome,
o.broker_account,
o.dt
FROM
lakehouse.stonks.trade_orders o
LEFT JOIN
lakehouse.stonks.trade_fills f
ON o.order_id = f.order_id
AND o.dt = f.dt
LEFT JOIN
lakehouse.stonks.prediction_vs_outcome pvo
ON o.recommendation_id = pvo.recommendation_id
AND o.dt = pvo.dt
WHERE
o.execution_mode = 'paper';
+42
View File
@@ -0,0 +1,42 @@
-- View: paper_trade_scorecard
-- Aggregates paper trading performance per symbol with win rates, PnL, and
-- average fill quality. Filters to paper execution mode only.
-- Requirements: 10.1, 10.2, 10.3
-- Design ref: Section 9.2 (paper trading PnL scorecard)
CREATE OR REPLACE VIEW lakehouse.stonks.paper_trade_scorecard AS
SELECT
pnl.ticker,
pnl.broker_account,
COUNT(DISTINCT pnl.dt) AS trading_days,
SUM(pnl.realized_pnl) AS total_realized_pnl,
SUM(pnl.unrealized_pnl) AS total_unrealized_pnl,
SUM(pnl.net_pnl) AS total_net_pnl,
SUM(pnl.fees) AS total_fees,
AVG(pnl.net_pnl) AS avg_daily_pnl,
-- Win rate: fraction of days with positive net PnL
CAST(
COUNT(CASE WHEN pnl.net_pnl > 0 THEN 1 END) AS DOUBLE
) / NULLIF(COUNT(*), 0) AS win_rate,
-- Worst and best single-day PnL
MIN(pnl.net_pnl) AS worst_day_pnl,
MAX(pnl.net_pnl) AS best_day_pnl,
-- Order counts from trade_orders
COUNT(DISTINCT o.order_id) AS total_orders,
COUNT(DISTINCT CASE WHEN o.status = 'filled' THEN o.order_id END)
AS filled_orders,
MIN(pnl.dt) AS first_trade_date,
MAX(pnl.dt) AS last_trade_date
FROM
lakehouse.stonks.pnl_daily pnl
LEFT JOIN
lakehouse.stonks.trade_orders o
ON pnl.ticker = o.ticker
AND pnl.broker_account = o.broker_account
AND pnl.dt = o.dt
AND o.execution_mode = 'paper'
WHERE
pnl.execution_mode = 'paper'
GROUP BY
pnl.ticker,
pnl.broker_account;
+44
View File
@@ -0,0 +1,44 @@
-- View: prediction_accuracy
-- Joins prediction_vs_outcome with trade_signals and market_bars to provide
-- a comprehensive prediction accuracy scorecard.
-- Requirements: 10.1, 10.2, 10.3, 10.4
-- Design ref: Section 9.2 (prediction confidence vs realized move)
CREATE OR REPLACE VIEW lakehouse.stonks.prediction_accuracy AS
SELECT
pvo.recommendation_id,
pvo.ticker,
pvo.predicted_action,
pvo.predicted_confidence,
pvo.actual_move_pct,
pvo.outcome,
pvo.horizon_days,
pvo.predicted_at,
pvo.evaluated_at,
pvo.model_version,
ts.trend_direction,
ts.trend_strength,
ts.contradiction_score,
ts.dominant_catalysts,
-- Confidence bucket for dashboard grouping
CASE
WHEN pvo.predicted_confidence >= 0.8 THEN 'high'
WHEN pvo.predicted_confidence >= 0.5 THEN 'medium'
ELSE 'low'
END AS confidence_bucket,
-- Direction correctness: did the predicted action match the actual move?
CASE
WHEN pvo.predicted_action = 'buy' AND pvo.actual_move_pct > 0 THEN true
WHEN pvo.predicted_action = 'sell' AND pvo.actual_move_pct < 0 THEN true
WHEN pvo.predicted_action IN ('hold', 'watch') THEN NULL
ELSE false
END AS direction_correct,
-- Magnitude of prediction error
ABS(pvo.actual_move_pct) AS abs_move_pct,
pvo.dt
FROM
lakehouse.stonks.prediction_vs_outcome pvo
LEFT JOIN
lakehouse.stonks.trade_signals ts
ON pvo.recommendation_id = ts.recommendation_id
AND pvo.dt = ts.dt;
+31
View File
@@ -0,0 +1,31 @@
-- View: signal_hit_rate
-- Daily summary of signal accuracy across all symbols and model versions.
-- Designed for the Superset prediction accuracy dashboard.
-- Requirements: 10.1, 10.2, 10.3
-- Design ref: Section 9.2 (prediction confidence vs realized move)
CREATE OR REPLACE VIEW lakehouse.stonks.signal_hit_rate AS
SELECT
pvo.dt,
pvo.model_version,
COUNT(*) AS total_predictions,
COUNT(CASE WHEN pvo.outcome = 'correct' THEN 1 END) AS correct_predictions,
COUNT(CASE WHEN pvo.outcome = 'incorrect' THEN 1 END) AS incorrect_predictions,
COUNT(CASE WHEN pvo.outcome = 'neutral' THEN 1 END) AS neutral_predictions,
-- Hit rate
CAST(
COUNT(CASE WHEN pvo.outcome = 'correct' THEN 1 END) AS DOUBLE
) / NULLIF(COUNT(*), 0) AS hit_rate,
-- Average confidence of correct vs incorrect
AVG(CASE WHEN pvo.outcome = 'correct' THEN pvo.predicted_confidence END)
AS avg_confidence_correct,
AVG(CASE WHEN pvo.outcome = 'incorrect' THEN pvo.predicted_confidence END)
AS avg_confidence_incorrect,
-- Average realized move magnitude
AVG(ABS(pvo.actual_move_pct)) AS avg_abs_move_pct,
AVG(pvo.actual_move_pct) AS avg_move_pct
FROM
lakehouse.stonks.prediction_vs_outcome pvo
GROUP BY
pvo.dt,
pvo.model_version;