Jitendra12421 commited on
Commit
0353a43
·
verified ·
1 Parent(s): 331db2a

Upload 2 files

Browse files
Files changed (2) hide show
  1. runtime.py +50 -60
  2. 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
- # Seed T+5
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
- ledger["t5"]["entries"].append({
1434
- "date": day, "prediction": pred,
1435
- "actual": actual, "correct": correct,
1436
- "source": "backtest",
1437
- })
1438
 
1439
- # Seed Tomorrow
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
- ledger["tomorrow"]["entries"].append({
1456
- "date": day, "prediction": pred,
1457
- "actual": actual, "correct": correct,
1458
- "source": "backtest",
1459
- })
1460
 
1461
- # Seed T+1
1462
  t1_test = load_tplus1_test_predictions()
1463
  if not t1_test.empty:
1464
- for _, row in t1_test.iterrows():
1465
- target_date = row.get("target_date")
1466
- if pd.isna(target_date):
1467
- continue
1468
- day = pd.to_datetime(target_date).date().isoformat()
1469
- pred = str(row.get("prediction", "")).upper()
1470
- if "correct" in t1_test.columns:
 
 
1471
  correct = bool(row.get("correct"))
1472
  actual = pred if correct else ("DOWN" if pred == "UP" else "UP")
1473
- elif {"target", "prediction"}.issubset(t1_test.columns):
1474
- target_val = pd.to_numeric(row.get("target"), errors="coerce")
1475
- actual = "UP" if target_val == 1 else "DOWN"
1476
- correct = pred == actual
1477
- else:
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/unseeded, seed from backtest first
1509
- if not any(ledger[m].get("entries") for m in ("t5", "tomorrow", "tplus1")):
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}")