phase 14-15: docker build validation and helm deployment
This commit is contained in:
@@ -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.
|
||||
@@ -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';
|
||||
@@ -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;
|
||||
@@ -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;
|
||||
@@ -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;
|
||||
Reference in New Issue
Block a user