Upload 2 files
Browse files- runtime.py +50 -60
- test_seeding.py +17 -0
runtime.py
CHANGED
|
@@ -1399,9 +1399,9 @@ def load_live_accuracy() -> dict[str, Any]:
|
|
| 1399 |
except Exception:
|
| 1400 |
pass
|
| 1401 |
return {
|
| 1402 |
-
"tomorrow": {"entries": [], "accuracy": None, "total": 0, "correct_count": 0},
|
| 1403 |
-
"t5": {"entries": [], "accuracy": None, "total": 0, "correct_count": 0},
|
| 1404 |
-
"tplus1": {"entries": [], "accuracy": None, "total": 0, "correct_count": 0},
|
| 1405 |
}
|
| 1406 |
|
| 1407 |
|
|
@@ -1411,18 +1411,14 @@ def save_live_accuracy(data: dict[str, Any]) -> None:
|
|
| 1411 |
|
| 1412 |
|
| 1413 |
def seed_live_accuracy_from_backtest() -> dict[str, Any]:
|
| 1414 |
-
"""Seed the live accuracy ledger from backtest test predictions.
|
| 1415 |
-
|
| 1416 |
-
This creates the baseline entries from the test set so that
|
| 1417 |
-
accuracy starts at the backtest level and moves smoothly.
|
| 1418 |
-
"""
|
| 1419 |
ledger = {
|
| 1420 |
-
"tomorrow": {"entries": [], "accuracy": None, "total": 0, "correct_count": 0, "live_count": 0},
|
| 1421 |
-
"t5": {"entries": [], "accuracy": None, "total": 0, "correct_count": 0, "live_count": 0},
|
| 1422 |
-
"tplus1": {"entries": [], "accuracy": None, "total": 0, "correct_count": 0, "live_count": 0},
|
| 1423 |
}
|
| 1424 |
-
|
| 1425 |
-
#
|
| 1426 |
t5_test = load_test_predictions()
|
| 1427 |
if not t5_test.empty and "correct" in t5_test.columns:
|
| 1428 |
for _, row in t5_test.iterrows():
|
|
@@ -1430,13 +1426,13 @@ def seed_live_accuracy_from_backtest() -> dict[str, Any]:
|
|
| 1430 |
pred = str(row.get("prediction", "")).upper()
|
| 1431 |
correct = bool(row.get("correct"))
|
| 1432 |
actual = pred if correct else ("DOWN" if pred == "UP" else "UP")
|
| 1433 |
-
|
| 1434 |
-
"
|
| 1435 |
-
|
| 1436 |
-
|
| 1437 |
-
|
| 1438 |
|
| 1439 |
-
#
|
| 1440 |
tom_test = load_tomorrow_test_predictions()
|
| 1441 |
if not tom_test.empty:
|
| 1442 |
if "pred" in tom_test.columns and "prediction" not in tom_test.columns:
|
|
@@ -1452,44 +1448,31 @@ def seed_live_accuracy_from_backtest() -> dict[str, Any]:
|
|
| 1452 |
pred = str(row.get("prediction", "")).upper()
|
| 1453 |
correct = bool(row.get("correct"))
|
| 1454 |
actual = pred if correct else ("DOWN" if pred == "UP" else "UP")
|
| 1455 |
-
|
| 1456 |
-
"
|
| 1457 |
-
|
| 1458 |
-
|
| 1459 |
-
|
| 1460 |
|
| 1461 |
-
#
|
| 1462 |
t1_test = load_tplus1_test_predictions()
|
| 1463 |
if not t1_test.empty:
|
| 1464 |
-
|
| 1465 |
-
|
| 1466 |
-
|
| 1467 |
-
|
| 1468 |
-
|
| 1469 |
-
|
| 1470 |
-
|
|
|
|
|
|
|
| 1471 |
correct = bool(row.get("correct"))
|
| 1472 |
actual = pred if correct else ("DOWN" if pred == "UP" else "UP")
|
| 1473 |
-
|
| 1474 |
-
|
| 1475 |
-
|
| 1476 |
-
|
| 1477 |
-
|
| 1478 |
-
continue
|
| 1479 |
-
ledger["tplus1"]["entries"].append({
|
| 1480 |
-
"date": day, "prediction": pred,
|
| 1481 |
-
"actual": actual, "correct": correct,
|
| 1482 |
-
"source": "backtest",
|
| 1483 |
-
})
|
| 1484 |
-
|
| 1485 |
-
for model_id in ("t5", "tomorrow", "tplus1"):
|
| 1486 |
-
entries = ledger[model_id]["entries"]
|
| 1487 |
-
total = len(entries)
|
| 1488 |
-
correct = sum(1 for e in entries if e.get("correct"))
|
| 1489 |
-
ledger[model_id]["total"] = total
|
| 1490 |
-
ledger[model_id]["correct_count"] = correct
|
| 1491 |
-
ledger[model_id]["accuracy"] = correct / total if total > 0 else None
|
| 1492 |
-
ledger[model_id]["live_count"] = 0
|
| 1493 |
|
| 1494 |
save_live_accuracy(ledger)
|
| 1495 |
return ledger
|
|
@@ -1505,10 +1488,10 @@ def update_live_accuracy(session_date: date) -> dict[str, Any]:
|
|
| 1505 |
"""
|
| 1506 |
ledger = load_live_accuracy()
|
| 1507 |
|
| 1508 |
-
# If ledger is empty
|
| 1509 |
-
if not any(ledger[m]
|
| 1510 |
ledger = seed_live_accuracy_from_backtest()
|
| 1511 |
-
|
| 1512 |
daily = pd.read_parquet(NIFTY_1D_PATH)
|
| 1513 |
daily["_date"] = pd.to_datetime(daily["date"], errors="coerce").dt.normalize()
|
| 1514 |
today_rows = daily[daily["_date"].dt.date == session_date]
|
|
@@ -1535,7 +1518,7 @@ def update_live_accuracy(session_date: date) -> dict[str, Any]:
|
|
| 1535 |
"prediction": pred,
|
| 1536 |
"actual": actual_close_gt_open,
|
| 1537 |
"correct": pred == actual_close_gt_open,
|
| 1538 |
-
"source": "live"
|
| 1539 |
})
|
| 1540 |
except Exception:
|
| 1541 |
pass
|
|
@@ -1553,7 +1536,7 @@ def update_live_accuracy(session_date: date) -> dict[str, Any]:
|
|
| 1553 |
"prediction": pred,
|
| 1554 |
"actual": actual_close_gt_open,
|
| 1555 |
"correct": pred == actual_close_gt_open,
|
| 1556 |
-
"source": "live"
|
| 1557 |
})
|
| 1558 |
except Exception:
|
| 1559 |
pass
|
|
@@ -1587,7 +1570,7 @@ def update_live_accuracy(session_date: date) -> dict[str, Any]:
|
|
| 1587 |
"prediction": pred,
|
| 1588 |
"actual": t1_actual,
|
| 1589 |
"correct": pred == t1_actual,
|
| 1590 |
-
"source": "live"
|
| 1591 |
})
|
| 1592 |
except Exception:
|
| 1593 |
pass
|
|
@@ -1596,12 +1579,19 @@ def update_live_accuracy(session_date: date) -> dict[str, Any]:
|
|
| 1596 |
for model_id in ("t5", "tomorrow", "tplus1"):
|
| 1597 |
entries = ledger[model_id]["entries"]
|
| 1598 |
total = len(entries)
|
| 1599 |
-
live_count = sum(1 for e in entries if e.get("source") == "live")
|
| 1600 |
correct = sum(1 for e in entries if e.get("correct"))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1601 |
ledger[model_id]["total"] = total
|
| 1602 |
-
ledger[model_id]["live_count"] = live_count
|
| 1603 |
ledger[model_id]["correct_count"] = correct
|
| 1604 |
ledger[model_id]["accuracy"] = correct / total if total > 0 else None
|
|
|
|
|
|
|
| 1605 |
|
| 1606 |
save_live_accuracy(ledger)
|
| 1607 |
clear_dashboard_payload_cache()
|
|
|
|
| 1399 |
except Exception:
|
| 1400 |
pass
|
| 1401 |
return {
|
| 1402 |
+
"tomorrow": {"entries": [], "accuracy": None, "total": 0, "correct_count": 0, "backtest_count": 0, "live_count": 0},
|
| 1403 |
+
"t5": {"entries": [], "accuracy": None, "total": 0, "correct_count": 0, "backtest_count": 0, "live_count": 0},
|
| 1404 |
+
"tplus1": {"entries": [], "accuracy": None, "total": 0, "correct_count": 0, "backtest_count": 0, "live_count": 0},
|
| 1405 |
}
|
| 1406 |
|
| 1407 |
|
|
|
|
| 1411 |
|
| 1412 |
|
| 1413 |
def seed_live_accuracy_from_backtest() -> dict[str, Any]:
|
| 1414 |
+
"""Seed the live accuracy ledger from backtest test predictions."""
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1415 |
ledger = {
|
| 1416 |
+
"tomorrow": {"entries": [], "accuracy": None, "total": 0, "correct_count": 0, "backtest_count": 0, "live_count": 0},
|
| 1417 |
+
"t5": {"entries": [], "accuracy": None, "total": 0, "correct_count": 0, "backtest_count": 0, "live_count": 0},
|
| 1418 |
+
"tplus1": {"entries": [], "accuracy": None, "total": 0, "correct_count": 0, "backtest_count": 0, "live_count": 0},
|
| 1419 |
}
|
| 1420 |
+
|
| 1421 |
+
# T+5
|
| 1422 |
t5_test = load_test_predictions()
|
| 1423 |
if not t5_test.empty and "correct" in t5_test.columns:
|
| 1424 |
for _, row in t5_test.iterrows():
|
|
|
|
| 1426 |
pred = str(row.get("prediction", "")).upper()
|
| 1427 |
correct = bool(row.get("correct"))
|
| 1428 |
actual = pred if correct else ("DOWN" if pred == "UP" else "UP")
|
| 1429 |
+
if pred in ("UP", "DOWN"):
|
| 1430 |
+
ledger["t5"]["entries"].append({
|
| 1431 |
+
"date": day, "prediction": pred, "actual": actual, "correct": correct, "source": "backtest"
|
| 1432 |
+
})
|
| 1433 |
+
ledger["t5"]["backtest_count"] = len(ledger["t5"]["entries"])
|
| 1434 |
|
| 1435 |
+
# Tomorrow
|
| 1436 |
tom_test = load_tomorrow_test_predictions()
|
| 1437 |
if not tom_test.empty:
|
| 1438 |
if "pred" in tom_test.columns and "prediction" not in tom_test.columns:
|
|
|
|
| 1448 |
pred = str(row.get("prediction", "")).upper()
|
| 1449 |
correct = bool(row.get("correct"))
|
| 1450 |
actual = pred if correct else ("DOWN" if pred == "UP" else "UP")
|
| 1451 |
+
if pred in ("UP", "DOWN"):
|
| 1452 |
+
ledger["tomorrow"]["entries"].append({
|
| 1453 |
+
"date": day, "prediction": pred, "actual": actual, "correct": correct, "source": "backtest"
|
| 1454 |
+
})
|
| 1455 |
+
ledger["tomorrow"]["backtest_count"] = len(ledger["tomorrow"]["entries"])
|
| 1456 |
|
| 1457 |
+
# T+1
|
| 1458 |
t1_test = load_tplus1_test_predictions()
|
| 1459 |
if not t1_test.empty:
|
| 1460 |
+
if "correct" not in t1_test.columns and {"target", "prediction"}.issubset(t1_test.columns):
|
| 1461 |
+
t1_test["correct"] = t1_test["prediction"].str.upper() == np.where(pd.to_numeric(t1_test["target"], errors="coerce") == 1, "UP", "DOWN")
|
| 1462 |
+
if "correct" in t1_test.columns:
|
| 1463 |
+
for _, row in t1_test.iterrows():
|
| 1464 |
+
target_date = row.get("target_date")
|
| 1465 |
+
if pd.isna(target_date):
|
| 1466 |
+
continue
|
| 1467 |
+
day = pd.to_datetime(target_date).date().isoformat()
|
| 1468 |
+
pred = str(row.get("prediction", "")).upper()
|
| 1469 |
correct = bool(row.get("correct"))
|
| 1470 |
actual = pred if correct else ("DOWN" if pred == "UP" else "UP")
|
| 1471 |
+
if pred in ("UP", "DOWN"):
|
| 1472 |
+
ledger["tplus1"]["entries"].append({
|
| 1473 |
+
"date": day, "prediction": pred, "actual": actual, "correct": correct, "source": "backtest"
|
| 1474 |
+
})
|
| 1475 |
+
ledger["tplus1"]["backtest_count"] = len(ledger["tplus1"]["entries"])
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1476 |
|
| 1477 |
save_live_accuracy(ledger)
|
| 1478 |
return ledger
|
|
|
|
| 1488 |
"""
|
| 1489 |
ledger = load_live_accuracy()
|
| 1490 |
|
| 1491 |
+
# If ledger is empty (or unseeded), seed from backtest first
|
| 1492 |
+
if not any(ledger[m]["entries"] for m in ("t5", "tomorrow", "tplus1")):
|
| 1493 |
ledger = seed_live_accuracy_from_backtest()
|
| 1494 |
+
|
| 1495 |
daily = pd.read_parquet(NIFTY_1D_PATH)
|
| 1496 |
daily["_date"] = pd.to_datetime(daily["date"], errors="coerce").dt.normalize()
|
| 1497 |
today_rows = daily[daily["_date"].dt.date == session_date]
|
|
|
|
| 1518 |
"prediction": pred,
|
| 1519 |
"actual": actual_close_gt_open,
|
| 1520 |
"correct": pred == actual_close_gt_open,
|
| 1521 |
+
"source": "live"
|
| 1522 |
})
|
| 1523 |
except Exception:
|
| 1524 |
pass
|
|
|
|
| 1536 |
"prediction": pred,
|
| 1537 |
"actual": actual_close_gt_open,
|
| 1538 |
"correct": pred == actual_close_gt_open,
|
| 1539 |
+
"source": "live"
|
| 1540 |
})
|
| 1541 |
except Exception:
|
| 1542 |
pass
|
|
|
|
| 1570 |
"prediction": pred,
|
| 1571 |
"actual": t1_actual,
|
| 1572 |
"correct": pred == t1_actual,
|
| 1573 |
+
"source": "live"
|
| 1574 |
})
|
| 1575 |
except Exception:
|
| 1576 |
pass
|
|
|
|
| 1579 |
for model_id in ("t5", "tomorrow", "tplus1"):
|
| 1580 |
entries = ledger[model_id]["entries"]
|
| 1581 |
total = len(entries)
|
|
|
|
| 1582 |
correct = sum(1 for e in entries if e.get("correct"))
|
| 1583 |
+
backtest_count = sum(1 for e in entries if e.get("source") == "backtest")
|
| 1584 |
+
live_count = sum(1 for e in entries if e.get("source") == "live")
|
| 1585 |
+
|
| 1586 |
+
# If we have entries but no source is set, assume they need re-seeding
|
| 1587 |
+
if backtest_count == 0 and live_count == 0 and total > 0:
|
| 1588 |
+
pass # The user can delete the file to force a re-seed. Or we just keep them.
|
| 1589 |
+
|
| 1590 |
ledger[model_id]["total"] = total
|
|
|
|
| 1591 |
ledger[model_id]["correct_count"] = correct
|
| 1592 |
ledger[model_id]["accuracy"] = correct / total if total > 0 else None
|
| 1593 |
+
ledger[model_id]["backtest_count"] = backtest_count
|
| 1594 |
+
ledger[model_id]["live_count"] = live_count
|
| 1595 |
|
| 1596 |
save_live_accuracy(ledger)
|
| 1597 |
clear_dashboard_payload_cache()
|
test_seeding.py
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import sys
|
| 2 |
+
from pathlib import Path
|
| 3 |
+
|
| 4 |
+
# Add backend to path
|
| 5 |
+
backend_path = Path(__file__).parent / 'backend'
|
| 6 |
+
sys.path.insert(0, str(backend_path))
|
| 7 |
+
|
| 8 |
+
from nifty_backend.runtime import seed_live_accuracy_from_backtest
|
| 9 |
+
|
| 10 |
+
print("Seeding live accuracy...")
|
| 11 |
+
ledger = seed_live_accuracy_from_backtest()
|
| 12 |
+
for model in ('t5', 'tomorrow', 'tplus1'):
|
| 13 |
+
entries = ledger[model]['entries']
|
| 14 |
+
total = len(entries)
|
| 15 |
+
correct = sum(1 for e in entries if e.get('correct'))
|
| 16 |
+
accuracy = correct / total if total > 0 else 0
|
| 17 |
+
print(f"{model}: entries={total}, backtest_count={ledger[model]['backtest_count']}, correct={correct}, accuracy={accuracy:.3f}")
|