Jitendra12421 commited on
Commit
c8aaa3d
·
verified ·
1 Parent(s): 50a604a

Upload 25 files

Browse files
.gitattributes CHANGED
@@ -37,3 +37,4 @@ models/yahoo_history_cache.sqlite3 filter=lfs diff=lfs merge=lfs -text
37
  nifty_backend/__pycache__/runtime.cpython-311.pyc filter=lfs diff=lfs merge=lfs -text
38
  backend/models/yahoo_history_cache.sqlite3 filter=lfs diff=lfs merge=lfs -text
39
  backend/nifty_backend/__pycache__/runtime.cpython-311.pyc filter=lfs diff=lfs merge=lfs -text
 
 
37
  nifty_backend/__pycache__/runtime.cpython-311.pyc filter=lfs diff=lfs merge=lfs -text
38
  backend/models/yahoo_history_cache.sqlite3 filter=lfs diff=lfs merge=lfs -text
39
  backend/nifty_backend/__pycache__/runtime.cpython-311.pyc filter=lfs diff=lfs merge=lfs -text
40
+ models/nifty_forecaster/__pycache__/train.cpython-311.pyc filter=lfs diff=lfs merge=lfs -text
models/live_accuracy.json CHANGED
@@ -1,43 +1,4054 @@
1
  {
2
  "tomorrow": {
3
  "entries": [
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4
  {
5
  "date": "2026-06-02",
6
  "prediction": "DOWN",
7
  "actual": "UP",
8
- "correct": false
9
- }
10
- ],
11
- "accuracy": 0.7035175879396985,
12
- "total": 199,
13
- "correct_count": 140,
14
- "live_total": 1,
15
- "live_correct_count": 0,
16
- "live_accuracy": 0.0
17
- },
18
- "t5": {
19
- "entries": [
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
20
  {
21
- "date": "2026-06-02",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
22
  "prediction": "DOWN",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
23
  "actual": "UP",
24
- "correct": false
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
25
  }
26
  ],
27
- "accuracy": 0.648936170212766,
28
- "total": 188,
29
- "correct_count": 122,
30
- "live_total": 1,
31
- "live_correct_count": 0,
32
- "live_accuracy": 0.0
33
- },
34
- "tplus1": {
35
- "entries": [],
36
- "accuracy": 0.6368421052631579,
37
- "total": 190,
38
- "correct_count": 121,
39
- "live_total": 0,
40
- "live_correct_count": 0,
41
- "live_accuracy": null
42
  }
43
  }
 
1
  {
2
  "tomorrow": {
3
  "entries": [
4
+ {
5
+ "date": "2025-08-19",
6
+ "prediction": "UP",
7
+ "actual": "UP",
8
+ "correct": true,
9
+ "source": "backtest"
10
+ },
11
+ {
12
+ "date": "2025-08-20",
13
+ "prediction": "DOWN",
14
+ "actual": "UP",
15
+ "correct": false,
16
+ "source": "backtest"
17
+ },
18
+ {
19
+ "date": "2025-08-21",
20
+ "prediction": "DOWN",
21
+ "actual": "UP",
22
+ "correct": false,
23
+ "source": "backtest"
24
+ },
25
+ {
26
+ "date": "2025-08-22",
27
+ "prediction": "UP",
28
+ "actual": "DOWN",
29
+ "correct": false,
30
+ "source": "backtest"
31
+ },
32
+ {
33
+ "date": "2025-08-25",
34
+ "prediction": "UP",
35
+ "actual": "UP",
36
+ "correct": true,
37
+ "source": "backtest"
38
+ },
39
+ {
40
+ "date": "2025-08-26",
41
+ "prediction": "DOWN",
42
+ "actual": "DOWN",
43
+ "correct": true,
44
+ "source": "backtest"
45
+ },
46
+ {
47
+ "date": "2025-08-28",
48
+ "prediction": "UP",
49
+ "actual": "DOWN",
50
+ "correct": false,
51
+ "source": "backtest"
52
+ },
53
+ {
54
+ "date": "2025-08-29",
55
+ "prediction": "UP",
56
+ "actual": "DOWN",
57
+ "correct": false,
58
+ "source": "backtest"
59
+ },
60
+ {
61
+ "date": "2025-09-01",
62
+ "prediction": "DOWN",
63
+ "actual": "UP",
64
+ "correct": false,
65
+ "source": "backtest"
66
+ },
67
+ {
68
+ "date": "2025-09-02",
69
+ "prediction": "DOWN",
70
+ "actual": "DOWN",
71
+ "correct": true,
72
+ "source": "backtest"
73
+ },
74
+ {
75
+ "date": "2025-09-03",
76
+ "prediction": "DOWN",
77
+ "actual": "UP",
78
+ "correct": false,
79
+ "source": "backtest"
80
+ },
81
+ {
82
+ "date": "2025-09-04",
83
+ "prediction": "UP",
84
+ "actual": "UP",
85
+ "correct": true,
86
+ "source": "backtest"
87
+ },
88
+ {
89
+ "date": "2025-09-05",
90
+ "prediction": "UP",
91
+ "actual": "UP",
92
+ "correct": true,
93
+ "source": "backtest"
94
+ },
95
+ {
96
+ "date": "2025-09-08",
97
+ "prediction": "UP",
98
+ "actual": "UP",
99
+ "correct": true,
100
+ "source": "backtest"
101
+ },
102
+ {
103
+ "date": "2025-09-09",
104
+ "prediction": "UP",
105
+ "actual": "UP",
106
+ "correct": true,
107
+ "source": "backtest"
108
+ },
109
+ {
110
+ "date": "2025-09-10",
111
+ "prediction": "UP",
112
+ "actual": "UP",
113
+ "correct": true,
114
+ "source": "backtest"
115
+ },
116
+ {
117
+ "date": "2025-09-11",
118
+ "prediction": "UP",
119
+ "actual": "UP",
120
+ "correct": true,
121
+ "source": "backtest"
122
+ },
123
+ {
124
+ "date": "2025-09-12",
125
+ "prediction": "UP",
126
+ "actual": "UP",
127
+ "correct": true,
128
+ "source": "backtest"
129
+ },
130
+ {
131
+ "date": "2025-09-15",
132
+ "prediction": "UP",
133
+ "actual": "DOWN",
134
+ "correct": false,
135
+ "source": "backtest"
136
+ },
137
+ {
138
+ "date": "2025-09-16",
139
+ "prediction": "UP",
140
+ "actual": "UP",
141
+ "correct": true,
142
+ "source": "backtest"
143
+ },
144
+ {
145
+ "date": "2025-09-17",
146
+ "prediction": "DOWN",
147
+ "actual": "UP",
148
+ "correct": false,
149
+ "source": "backtest"
150
+ },
151
+ {
152
+ "date": "2025-09-18",
153
+ "prediction": "UP",
154
+ "actual": "UP",
155
+ "correct": true,
156
+ "source": "backtest"
157
+ },
158
+ {
159
+ "date": "2025-09-19",
160
+ "prediction": "DOWN",
161
+ "actual": "DOWN",
162
+ "correct": true,
163
+ "source": "backtest"
164
+ },
165
+ {
166
+ "date": "2025-09-22",
167
+ "prediction": "DOWN",
168
+ "actual": "DOWN",
169
+ "correct": true,
170
+ "source": "backtest"
171
+ },
172
+ {
173
+ "date": "2025-09-23",
174
+ "prediction": "DOWN",
175
+ "actual": "DOWN",
176
+ "correct": true,
177
+ "source": "backtest"
178
+ },
179
+ {
180
+ "date": "2025-09-24",
181
+ "prediction": "DOWN",
182
+ "actual": "DOWN",
183
+ "correct": true,
184
+ "source": "backtest"
185
+ },
186
+ {
187
+ "date": "2025-09-25",
188
+ "prediction": "DOWN",
189
+ "actual": "DOWN",
190
+ "correct": true,
191
+ "source": "backtest"
192
+ },
193
+ {
194
+ "date": "2025-09-26",
195
+ "prediction": "DOWN",
196
+ "actual": "DOWN",
197
+ "correct": true,
198
+ "source": "backtest"
199
+ },
200
+ {
201
+ "date": "2025-09-29",
202
+ "prediction": "UP",
203
+ "actual": "UP",
204
+ "correct": true,
205
+ "source": "backtest"
206
+ },
207
+ {
208
+ "date": "2025-09-30",
209
+ "prediction": "DOWN",
210
+ "actual": "DOWN",
211
+ "correct": true,
212
+ "source": "backtest"
213
+ },
214
+ {
215
+ "date": "2025-10-01",
216
+ "prediction": "UP",
217
+ "actual": "UP",
218
+ "correct": true,
219
+ "source": "backtest"
220
+ },
221
+ {
222
+ "date": "2025-10-03",
223
+ "prediction": "UP",
224
+ "actual": "UP",
225
+ "correct": true,
226
+ "source": "backtest"
227
+ },
228
+ {
229
+ "date": "2025-10-06",
230
+ "prediction": "UP",
231
+ "actual": "UP",
232
+ "correct": true,
233
+ "source": "backtest"
234
+ },
235
+ {
236
+ "date": "2025-10-07",
237
+ "prediction": "UP",
238
+ "actual": "UP",
239
+ "correct": true,
240
+ "source": "backtest"
241
+ },
242
+ {
243
+ "date": "2025-10-08",
244
+ "prediction": "DOWN",
245
+ "actual": "DOWN",
246
+ "correct": true,
247
+ "source": "backtest"
248
+ },
249
+ {
250
+ "date": "2025-10-09",
251
+ "prediction": "UP",
252
+ "actual": "UP",
253
+ "correct": true,
254
+ "source": "backtest"
255
+ },
256
+ {
257
+ "date": "2025-10-10",
258
+ "prediction": "UP",
259
+ "actual": "UP",
260
+ "correct": true,
261
+ "source": "backtest"
262
+ },
263
+ {
264
+ "date": "2025-10-13",
265
+ "prediction": "DOWN",
266
+ "actual": "DOWN",
267
+ "correct": true,
268
+ "source": "backtest"
269
+ },
270
+ {
271
+ "date": "2025-10-14",
272
+ "prediction": "UP",
273
+ "actual": "DOWN",
274
+ "correct": false,
275
+ "source": "backtest"
276
+ },
277
+ {
278
+ "date": "2025-10-15",
279
+ "prediction": "DOWN",
280
+ "actual": "UP",
281
+ "correct": false,
282
+ "source": "backtest"
283
+ },
284
+ {
285
+ "date": "2025-10-16",
286
+ "prediction": "UP",
287
+ "actual": "UP",
288
+ "correct": true,
289
+ "source": "backtest"
290
+ },
291
+ {
292
+ "date": "2025-10-17",
293
+ "prediction": "DOWN",
294
+ "actual": "UP",
295
+ "correct": false,
296
+ "source": "backtest"
297
+ },
298
+ {
299
+ "date": "2025-10-20",
300
+ "prediction": "UP",
301
+ "actual": "UP",
302
+ "correct": true,
303
+ "source": "backtest"
304
+ },
305
+ {
306
+ "date": "2025-10-21",
307
+ "prediction": "UP",
308
+ "actual": "DOWN",
309
+ "correct": false,
310
+ "source": "backtest"
311
+ },
312
+ {
313
+ "date": "2025-10-23",
314
+ "prediction": "UP",
315
+ "actual": "UP",
316
+ "correct": true,
317
+ "source": "backtest"
318
+ },
319
+ {
320
+ "date": "2025-10-24",
321
+ "prediction": "DOWN",
322
+ "actual": "DOWN",
323
+ "correct": true,
324
+ "source": "backtest"
325
+ },
326
+ {
327
+ "date": "2025-10-27",
328
+ "prediction": "UP",
329
+ "actual": "UP",
330
+ "correct": true,
331
+ "source": "backtest"
332
+ },
333
+ {
334
+ "date": "2025-10-28",
335
+ "prediction": "UP",
336
+ "actual": "DOWN",
337
+ "correct": false,
338
+ "source": "backtest"
339
+ },
340
+ {
341
+ "date": "2025-10-29",
342
+ "prediction": "DOWN",
343
+ "actual": "UP",
344
+ "correct": false,
345
+ "source": "backtest"
346
+ },
347
+ {
348
+ "date": "2025-10-30",
349
+ "prediction": "DOWN",
350
+ "actual": "DOWN",
351
+ "correct": true,
352
+ "source": "backtest"
353
+ },
354
+ {
355
+ "date": "2025-10-31",
356
+ "prediction": "DOWN",
357
+ "actual": "DOWN",
358
+ "correct": true,
359
+ "source": "backtest"
360
+ },
361
+ {
362
+ "date": "2025-11-03",
363
+ "prediction": "UP",
364
+ "actual": "UP",
365
+ "correct": true,
366
+ "source": "backtest"
367
+ },
368
+ {
369
+ "date": "2025-11-04",
370
+ "prediction": "UP",
371
+ "actual": "DOWN",
372
+ "correct": false,
373
+ "source": "backtest"
374
+ },
375
+ {
376
+ "date": "2025-11-06",
377
+ "prediction": "DOWN",
378
+ "actual": "DOWN",
379
+ "correct": true,
380
+ "source": "backtest"
381
+ },
382
+ {
383
+ "date": "2025-11-07",
384
+ "prediction": "DOWN",
385
+ "actual": "DOWN",
386
+ "correct": true,
387
+ "source": "backtest"
388
+ },
389
+ {
390
+ "date": "2025-11-10",
391
+ "prediction": "UP",
392
+ "actual": "UP",
393
+ "correct": true,
394
+ "source": "backtest"
395
+ },
396
+ {
397
+ "date": "2025-11-11",
398
+ "prediction": "UP",
399
+ "actual": "UP",
400
+ "correct": true,
401
+ "source": "backtest"
402
+ },
403
+ {
404
+ "date": "2025-11-12",
405
+ "prediction": "UP",
406
+ "actual": "UP",
407
+ "correct": true,
408
+ "source": "backtest"
409
+ },
410
+ {
411
+ "date": "2025-11-13",
412
+ "prediction": "UP",
413
+ "actual": "UP",
414
+ "correct": true,
415
+ "source": "backtest"
416
+ },
417
+ {
418
+ "date": "2025-11-14",
419
+ "prediction": "DOWN",
420
+ "actual": "UP",
421
+ "correct": false,
422
+ "source": "backtest"
423
+ },
424
+ {
425
+ "date": "2025-11-17",
426
+ "prediction": "DOWN",
427
+ "actual": "UP",
428
+ "correct": false,
429
+ "source": "backtest"
430
+ },
431
+ {
432
+ "date": "2025-11-18",
433
+ "prediction": "DOWN",
434
+ "actual": "DOWN",
435
+ "correct": true,
436
+ "source": "backtest"
437
+ },
438
+ {
439
+ "date": "2025-11-19",
440
+ "prediction": "DOWN",
441
+ "actual": "UP",
442
+ "correct": false,
443
+ "source": "backtest"
444
+ },
445
+ {
446
+ "date": "2025-11-20",
447
+ "prediction": "DOWN",
448
+ "actual": "UP",
449
+ "correct": false,
450
+ "source": "backtest"
451
+ },
452
+ {
453
+ "date": "2025-11-21",
454
+ "prediction": "DOWN",
455
+ "actual": "DOWN",
456
+ "correct": true,
457
+ "source": "backtest"
458
+ },
459
+ {
460
+ "date": "2025-11-24",
461
+ "prediction": "DOWN",
462
+ "actual": "DOWN",
463
+ "correct": true,
464
+ "source": "backtest"
465
+ },
466
+ {
467
+ "date": "2025-11-25",
468
+ "prediction": "DOWN",
469
+ "actual": "DOWN",
470
+ "correct": true,
471
+ "source": "backtest"
472
+ },
473
+ {
474
+ "date": "2025-11-26",
475
+ "prediction": "DOWN",
476
+ "actual": "UP",
477
+ "correct": false,
478
+ "source": "backtest"
479
+ },
480
+ {
481
+ "date": "2025-11-27",
482
+ "prediction": "UP",
483
+ "actual": "UP",
484
+ "correct": true,
485
+ "source": "backtest"
486
+ },
487
+ {
488
+ "date": "2025-11-28",
489
+ "prediction": "UP",
490
+ "actual": "DOWN",
491
+ "correct": false,
492
+ "source": "backtest"
493
+ },
494
+ {
495
+ "date": "2025-12-01",
496
+ "prediction": "UP",
497
+ "actual": "DOWN",
498
+ "correct": false,
499
+ "source": "backtest"
500
+ },
501
+ {
502
+ "date": "2025-12-02",
503
+ "prediction": "DOWN",
504
+ "actual": "DOWN",
505
+ "correct": true,
506
+ "source": "backtest"
507
+ },
508
+ {
509
+ "date": "2025-12-03",
510
+ "prediction": "UP",
511
+ "actual": "DOWN",
512
+ "correct": false,
513
+ "source": "backtest"
514
+ },
515
+ {
516
+ "date": "2025-12-04",
517
+ "prediction": "UP",
518
+ "actual": "UP",
519
+ "correct": true,
520
+ "source": "backtest"
521
+ },
522
+ {
523
+ "date": "2025-12-05",
524
+ "prediction": "DOWN",
525
+ "actual": "UP",
526
+ "correct": false,
527
+ "source": "backtest"
528
+ },
529
+ {
530
+ "date": "2025-12-08",
531
+ "prediction": "UP",
532
+ "actual": "DOWN",
533
+ "correct": false,
534
+ "source": "backtest"
535
+ },
536
+ {
537
+ "date": "2025-12-09",
538
+ "prediction": "DOWN",
539
+ "actual": "DOWN",
540
+ "correct": true,
541
+ "source": "backtest"
542
+ },
543
+ {
544
+ "date": "2025-12-10",
545
+ "prediction": "DOWN",
546
+ "actual": "DOWN",
547
+ "correct": true,
548
+ "source": "backtest"
549
+ },
550
+ {
551
+ "date": "2025-12-11",
552
+ "prediction": "UP",
553
+ "actual": "UP",
554
+ "correct": true,
555
+ "source": "backtest"
556
+ },
557
+ {
558
+ "date": "2025-12-12",
559
+ "prediction": "UP",
560
+ "actual": "UP",
561
+ "correct": true,
562
+ "source": "backtest"
563
+ },
564
+ {
565
+ "date": "2025-12-15",
566
+ "prediction": "DOWN",
567
+ "actual": "DOWN",
568
+ "correct": true,
569
+ "source": "backtest"
570
+ },
571
+ {
572
+ "date": "2025-12-16",
573
+ "prediction": "DOWN",
574
+ "actual": "DOWN",
575
+ "correct": true,
576
+ "source": "backtest"
577
+ },
578
+ {
579
+ "date": "2025-12-17",
580
+ "prediction": "DOWN",
581
+ "actual": "DOWN",
582
+ "correct": true,
583
+ "source": "backtest"
584
+ },
585
+ {
586
+ "date": "2025-12-18",
587
+ "prediction": "DOWN",
588
+ "actual": "DOWN",
589
+ "correct": true,
590
+ "source": "backtest"
591
+ },
592
+ {
593
+ "date": "2025-12-19",
594
+ "prediction": "UP",
595
+ "actual": "UP",
596
+ "correct": true,
597
+ "source": "backtest"
598
+ },
599
+ {
600
+ "date": "2025-12-22",
601
+ "prediction": "UP",
602
+ "actual": "UP",
603
+ "correct": true,
604
+ "source": "backtest"
605
+ },
606
+ {
607
+ "date": "2025-12-23",
608
+ "prediction": "DOWN",
609
+ "actual": "UP",
610
+ "correct": false,
611
+ "source": "backtest"
612
+ },
613
+ {
614
+ "date": "2025-12-24",
615
+ "prediction": "DOWN",
616
+ "actual": "DOWN",
617
+ "correct": true,
618
+ "source": "backtest"
619
+ },
620
+ {
621
+ "date": "2025-12-26",
622
+ "prediction": "DOWN",
623
+ "actual": "DOWN",
624
+ "correct": true,
625
+ "source": "backtest"
626
+ },
627
+ {
628
+ "date": "2025-12-29",
629
+ "prediction": "DOWN",
630
+ "actual": "DOWN",
631
+ "correct": true,
632
+ "source": "backtest"
633
+ },
634
+ {
635
+ "date": "2025-12-30",
636
+ "prediction": "DOWN",
637
+ "actual": "UP",
638
+ "correct": false,
639
+ "source": "backtest"
640
+ },
641
+ {
642
+ "date": "2025-12-31",
643
+ "prediction": "UP",
644
+ "actual": "UP",
645
+ "correct": true,
646
+ "source": "backtest"
647
+ },
648
+ {
649
+ "date": "2026-01-01",
650
+ "prediction": "DOWN",
651
+ "actual": "DOWN",
652
+ "correct": true,
653
+ "source": "backtest"
654
+ },
655
+ {
656
+ "date": "2026-01-02",
657
+ "prediction": "UP",
658
+ "actual": "UP",
659
+ "correct": true,
660
+ "source": "backtest"
661
+ },
662
+ {
663
+ "date": "2026-01-05",
664
+ "prediction": "DOWN",
665
+ "actual": "DOWN",
666
+ "correct": true,
667
+ "source": "backtest"
668
+ },
669
+ {
670
+ "date": "2026-01-06",
671
+ "prediction": "DOWN",
672
+ "actual": "DOWN",
673
+ "correct": true,
674
+ "source": "backtest"
675
+ },
676
+ {
677
+ "date": "2026-01-07",
678
+ "prediction": "DOWN",
679
+ "actual": "DOWN",
680
+ "correct": true,
681
+ "source": "backtest"
682
+ },
683
+ {
684
+ "date": "2026-01-08",
685
+ "prediction": "DOWN",
686
+ "actual": "DOWN",
687
+ "correct": true,
688
+ "source": "backtest"
689
+ },
690
+ {
691
+ "date": "2026-01-09",
692
+ "prediction": "DOWN",
693
+ "actual": "DOWN",
694
+ "correct": true,
695
+ "source": "backtest"
696
+ },
697
+ {
698
+ "date": "2026-01-12",
699
+ "prediction": "UP",
700
+ "actual": "UP",
701
+ "correct": true,
702
+ "source": "backtest"
703
+ },
704
+ {
705
+ "date": "2026-01-13",
706
+ "prediction": "DOWN",
707
+ "actual": "DOWN",
708
+ "correct": true,
709
+ "source": "backtest"
710
+ },
711
+ {
712
+ "date": "2026-01-14",
713
+ "prediction": "DOWN",
714
+ "actual": "DOWN",
715
+ "correct": true,
716
+ "source": "backtest"
717
+ },
718
+ {
719
+ "date": "2026-01-16",
720
+ "prediction": "DOWN",
721
+ "actual": "UP",
722
+ "correct": false,
723
+ "source": "backtest"
724
+ },
725
+ {
726
+ "date": "2026-01-19",
727
+ "prediction": "DOWN",
728
+ "actual": "DOWN",
729
+ "correct": true,
730
+ "source": "backtest"
731
+ },
732
+ {
733
+ "date": "2026-01-20",
734
+ "prediction": "DOWN",
735
+ "actual": "DOWN",
736
+ "correct": true,
737
+ "source": "backtest"
738
+ },
739
+ {
740
+ "date": "2026-01-21",
741
+ "prediction": "DOWN",
742
+ "actual": "DOWN",
743
+ "correct": true,
744
+ "source": "backtest"
745
+ },
746
+ {
747
+ "date": "2026-01-22",
748
+ "prediction": "UP",
749
+ "actual": "UP",
750
+ "correct": true,
751
+ "source": "backtest"
752
+ },
753
+ {
754
+ "date": "2026-01-23",
755
+ "prediction": "UP",
756
+ "actual": "DOWN",
757
+ "correct": false,
758
+ "source": "backtest"
759
+ },
760
+ {
761
+ "date": "2026-01-27",
762
+ "prediction": "UP",
763
+ "actual": "UP",
764
+ "correct": true,
765
+ "source": "backtest"
766
+ },
767
+ {
768
+ "date": "2026-01-28",
769
+ "prediction": "UP",
770
+ "actual": "UP",
771
+ "correct": true,
772
+ "source": "backtest"
773
+ },
774
+ {
775
+ "date": "2026-01-29",
776
+ "prediction": "UP",
777
+ "actual": "UP",
778
+ "correct": true,
779
+ "source": "backtest"
780
+ },
781
+ {
782
+ "date": "2026-01-30",
783
+ "prediction": "DOWN",
784
+ "actual": "DOWN",
785
+ "correct": true,
786
+ "source": "backtest"
787
+ },
788
+ {
789
+ "date": "2026-02-01",
790
+ "prediction": "DOWN",
791
+ "actual": "DOWN",
792
+ "correct": true,
793
+ "source": "backtest"
794
+ },
795
+ {
796
+ "date": "2026-02-02",
797
+ "prediction": "DOWN",
798
+ "actual": "UP",
799
+ "correct": false,
800
+ "source": "backtest"
801
+ },
802
+ {
803
+ "date": "2026-02-03",
804
+ "prediction": "UP",
805
+ "actual": "UP",
806
+ "correct": true,
807
+ "source": "backtest"
808
+ },
809
+ {
810
+ "date": "2026-02-04",
811
+ "prediction": "UP",
812
+ "actual": "UP",
813
+ "correct": true,
814
+ "source": "backtest"
815
+ },
816
+ {
817
+ "date": "2026-02-05",
818
+ "prediction": "DOWN",
819
+ "actual": "DOWN",
820
+ "correct": true,
821
+ "source": "backtest"
822
+ },
823
+ {
824
+ "date": "2026-02-06",
825
+ "prediction": "DOWN",
826
+ "actual": "UP",
827
+ "correct": false,
828
+ "source": "backtest"
829
+ },
830
+ {
831
+ "date": "2026-02-09",
832
+ "prediction": "UP",
833
+ "actual": "UP",
834
+ "correct": true,
835
+ "source": "backtest"
836
+ },
837
+ {
838
+ "date": "2026-02-10",
839
+ "prediction": "UP",
840
+ "actual": "UP",
841
+ "correct": true,
842
+ "source": "backtest"
843
+ },
844
+ {
845
+ "date": "2026-02-11",
846
+ "prediction": "UP",
847
+ "actual": "UP",
848
+ "correct": true,
849
+ "source": "backtest"
850
+ },
851
+ {
852
+ "date": "2026-02-12",
853
+ "prediction": "UP",
854
+ "actual": "DOWN",
855
+ "correct": false,
856
+ "source": "backtest"
857
+ },
858
+ {
859
+ "date": "2026-02-13",
860
+ "prediction": "DOWN",
861
+ "actual": "DOWN",
862
+ "correct": true,
863
+ "source": "backtest"
864
+ },
865
+ {
866
+ "date": "2026-02-16",
867
+ "prediction": "UP",
868
+ "actual": "UP",
869
+ "correct": true,
870
+ "source": "backtest"
871
+ },
872
+ {
873
+ "date": "2026-02-17",
874
+ "prediction": "UP",
875
+ "actual": "UP",
876
+ "correct": true,
877
+ "source": "backtest"
878
+ },
879
+ {
880
+ "date": "2026-02-18",
881
+ "prediction": "UP",
882
+ "actual": "UP",
883
+ "correct": true,
884
+ "source": "backtest"
885
+ },
886
+ {
887
+ "date": "2026-02-19",
888
+ "prediction": "UP",
889
+ "actual": "DOWN",
890
+ "correct": false,
891
+ "source": "backtest"
892
+ },
893
+ {
894
+ "date": "2026-02-20",
895
+ "prediction": "DOWN",
896
+ "actual": "UP",
897
+ "correct": false,
898
+ "source": "backtest"
899
+ },
900
+ {
901
+ "date": "2026-02-23",
902
+ "prediction": "UP",
903
+ "actual": "UP",
904
+ "correct": true,
905
+ "source": "backtest"
906
+ },
907
+ {
908
+ "date": "2026-02-24",
909
+ "prediction": "DOWN",
910
+ "actual": "DOWN",
911
+ "correct": true,
912
+ "source": "backtest"
913
+ },
914
+ {
915
+ "date": "2026-02-25",
916
+ "prediction": "UP",
917
+ "actual": "UP",
918
+ "correct": true,
919
+ "source": "backtest"
920
+ },
921
+ {
922
+ "date": "2026-02-26",
923
+ "prediction": "UP",
924
+ "actual": "UP",
925
+ "correct": true,
926
+ "source": "backtest"
927
+ },
928
+ {
929
+ "date": "2026-02-27",
930
+ "prediction": "DOWN",
931
+ "actual": "DOWN",
932
+ "correct": true,
933
+ "source": "backtest"
934
+ },
935
+ {
936
+ "date": "2026-03-02",
937
+ "prediction": "DOWN",
938
+ "actual": "DOWN",
939
+ "correct": true,
940
+ "source": "backtest"
941
+ },
942
+ {
943
+ "date": "2026-03-04",
944
+ "prediction": "DOWN",
945
+ "actual": "DOWN",
946
+ "correct": true,
947
+ "source": "backtest"
948
+ },
949
+ {
950
+ "date": "2026-03-05",
951
+ "prediction": "UP",
952
+ "actual": "UP",
953
+ "correct": true,
954
+ "source": "backtest"
955
+ },
956
+ {
957
+ "date": "2026-03-06",
958
+ "prediction": "DOWN",
959
+ "actual": "DOWN",
960
+ "correct": true,
961
+ "source": "backtest"
962
+ },
963
+ {
964
+ "date": "2026-03-09",
965
+ "prediction": "DOWN",
966
+ "actual": "DOWN",
967
+ "correct": true,
968
+ "source": "backtest"
969
+ },
970
+ {
971
+ "date": "2026-03-10",
972
+ "prediction": "UP",
973
+ "actual": "UP",
974
+ "correct": true,
975
+ "source": "backtest"
976
+ },
977
+ {
978
+ "date": "2026-03-11",
979
+ "prediction": "UP",
980
+ "actual": "DOWN",
981
+ "correct": false,
982
+ "source": "backtest"
983
+ },
984
+ {
985
+ "date": "2026-03-12",
986
+ "prediction": "DOWN",
987
+ "actual": "DOWN",
988
+ "correct": true,
989
+ "source": "backtest"
990
+ },
991
+ {
992
+ "date": "2026-03-13",
993
+ "prediction": "DOWN",
994
+ "actual": "DOWN",
995
+ "correct": true,
996
+ "source": "backtest"
997
+ },
998
+ {
999
+ "date": "2026-03-16",
1000
+ "prediction": "DOWN",
1001
+ "actual": "UP",
1002
+ "correct": false,
1003
+ "source": "backtest"
1004
+ },
1005
+ {
1006
+ "date": "2026-03-17",
1007
+ "prediction": "UP",
1008
+ "actual": "UP",
1009
+ "correct": true,
1010
+ "source": "backtest"
1011
+ },
1012
+ {
1013
+ "date": "2026-03-18",
1014
+ "prediction": "UP",
1015
+ "actual": "UP",
1016
+ "correct": true,
1017
+ "source": "backtest"
1018
+ },
1019
+ {
1020
+ "date": "2026-03-19",
1021
+ "prediction": "DOWN",
1022
+ "actual": "DOWN",
1023
+ "correct": true,
1024
+ "source": "backtest"
1025
+ },
1026
+ {
1027
+ "date": "2026-03-20",
1028
+ "prediction": "DOWN",
1029
+ "actual": "UP",
1030
+ "correct": false,
1031
+ "source": "backtest"
1032
+ },
1033
+ {
1034
+ "date": "2026-03-23",
1035
+ "prediction": "DOWN",
1036
+ "actual": "DOWN",
1037
+ "correct": true,
1038
+ "source": "backtest"
1039
+ },
1040
+ {
1041
+ "date": "2026-03-24",
1042
+ "prediction": "UP",
1043
+ "actual": "UP",
1044
+ "correct": true,
1045
+ "source": "backtest"
1046
+ },
1047
+ {
1048
+ "date": "2026-03-25",
1049
+ "prediction": "UP",
1050
+ "actual": "UP",
1051
+ "correct": true,
1052
+ "source": "backtest"
1053
+ },
1054
+ {
1055
+ "date": "2026-03-27",
1056
+ "prediction": "DOWN",
1057
+ "actual": "DOWN",
1058
+ "correct": true,
1059
+ "source": "backtest"
1060
+ },
1061
+ {
1062
+ "date": "2026-03-30",
1063
+ "prediction": "DOWN",
1064
+ "actual": "DOWN",
1065
+ "correct": true,
1066
+ "source": "backtest"
1067
+ },
1068
+ {
1069
+ "date": "2026-04-01",
1070
+ "prediction": "UP",
1071
+ "actual": "UP",
1072
+ "correct": true,
1073
+ "source": "backtest"
1074
+ },
1075
+ {
1076
+ "date": "2026-04-02",
1077
+ "prediction": "DOWN",
1078
+ "actual": "DOWN",
1079
+ "correct": true,
1080
+ "source": "backtest"
1081
+ },
1082
+ {
1083
+ "date": "2026-04-06",
1084
+ "prediction": "DOWN",
1085
+ "actual": "UP",
1086
+ "correct": false,
1087
+ "source": "backtest"
1088
+ },
1089
+ {
1090
+ "date": "2026-04-07",
1091
+ "prediction": "DOWN",
1092
+ "actual": "UP",
1093
+ "correct": false,
1094
+ "source": "backtest"
1095
+ },
1096
+ {
1097
+ "date": "2026-04-08",
1098
+ "prediction": "DOWN",
1099
+ "actual": "UP",
1100
+ "correct": false,
1101
+ "source": "backtest"
1102
+ },
1103
+ {
1104
+ "date": "2026-04-09",
1105
+ "prediction": "DOWN",
1106
+ "actual": "DOWN",
1107
+ "correct": true,
1108
+ "source": "backtest"
1109
+ },
1110
+ {
1111
+ "date": "2026-04-10",
1112
+ "prediction": "UP",
1113
+ "actual": "UP",
1114
+ "correct": true,
1115
+ "source": "backtest"
1116
+ },
1117
+ {
1118
+ "date": "2026-04-13",
1119
+ "prediction": "DOWN",
1120
+ "actual": "DOWN",
1121
+ "correct": true,
1122
+ "source": "backtest"
1123
+ },
1124
+ {
1125
+ "date": "2026-04-15",
1126
+ "prediction": "UP",
1127
+ "actual": "UP",
1128
+ "correct": true,
1129
+ "source": "backtest"
1130
+ },
1131
+ {
1132
+ "date": "2026-04-16",
1133
+ "prediction": "UP",
1134
+ "actual": "DOWN",
1135
+ "correct": false,
1136
+ "source": "backtest"
1137
+ },
1138
+ {
1139
+ "date": "2026-04-17",
1140
+ "prediction": "UP",
1141
+ "actual": "UP",
1142
+ "correct": true,
1143
+ "source": "backtest"
1144
+ },
1145
+ {
1146
+ "date": "2026-04-20",
1147
+ "prediction": "UP",
1148
+ "actual": "DOWN",
1149
+ "correct": false,
1150
+ "source": "backtest"
1151
+ },
1152
+ {
1153
+ "date": "2026-04-21",
1154
+ "prediction": "UP",
1155
+ "actual": "UP",
1156
+ "correct": true,
1157
+ "source": "backtest"
1158
+ },
1159
+ {
1160
+ "date": "2026-04-22",
1161
+ "prediction": "DOWN",
1162
+ "actual": "DOWN",
1163
+ "correct": true,
1164
+ "source": "backtest"
1165
+ },
1166
+ {
1167
+ "date": "2026-04-23",
1168
+ "prediction": "UP",
1169
+ "actual": "DOWN",
1170
+ "correct": false,
1171
+ "source": "backtest"
1172
+ },
1173
+ {
1174
+ "date": "2026-04-24",
1175
+ "prediction": "DOWN",
1176
+ "actual": "DOWN",
1177
+ "correct": true,
1178
+ "source": "backtest"
1179
+ },
1180
+ {
1181
+ "date": "2026-04-27",
1182
+ "prediction": "UP",
1183
+ "actual": "UP",
1184
+ "correct": true,
1185
+ "source": "backtest"
1186
+ },
1187
+ {
1188
+ "date": "2026-04-28",
1189
+ "prediction": "UP",
1190
+ "actual": "DOWN",
1191
+ "correct": false,
1192
+ "source": "backtest"
1193
+ },
1194
+ {
1195
+ "date": "2026-04-29",
1196
+ "prediction": "DOWN",
1197
+ "actual": "UP",
1198
+ "correct": false,
1199
+ "source": "backtest"
1200
+ },
1201
+ {
1202
+ "date": "2026-04-30",
1203
+ "prediction": "DOWN",
1204
+ "actual": "DOWN",
1205
+ "correct": true,
1206
+ "source": "backtest"
1207
+ },
1208
+ {
1209
+ "date": "2026-05-04",
1210
+ "prediction": "UP",
1211
+ "actual": "UP",
1212
+ "correct": true,
1213
+ "source": "backtest"
1214
+ },
1215
+ {
1216
+ "date": "2026-05-05",
1217
+ "prediction": "DOWN",
1218
+ "actual": "DOWN",
1219
+ "correct": true,
1220
+ "source": "backtest"
1221
+ },
1222
+ {
1223
+ "date": "2026-05-06",
1224
+ "prediction": "UP",
1225
+ "actual": "UP",
1226
+ "correct": true,
1227
+ "source": "backtest"
1228
+ },
1229
+ {
1230
+ "date": "2026-05-07",
1231
+ "prediction": "DOWN",
1232
+ "actual": "DOWN",
1233
+ "correct": true,
1234
+ "source": "backtest"
1235
+ },
1236
+ {
1237
+ "date": "2026-05-08",
1238
+ "prediction": "DOWN",
1239
+ "actual": "DOWN",
1240
+ "correct": true,
1241
+ "source": "backtest"
1242
+ },
1243
+ {
1244
+ "date": "2026-05-11",
1245
+ "prediction": "UP",
1246
+ "actual": "DOWN",
1247
+ "correct": false,
1248
+ "source": "backtest"
1249
+ },
1250
+ {
1251
+ "date": "2026-05-12",
1252
+ "prediction": "DOWN",
1253
+ "actual": "DOWN",
1254
+ "correct": true,
1255
+ "source": "backtest"
1256
+ },
1257
+ {
1258
+ "date": "2026-05-13",
1259
+ "prediction": "DOWN",
1260
+ "actual": "DOWN",
1261
+ "correct": true,
1262
+ "source": "backtest"
1263
+ },
1264
+ {
1265
+ "date": "2026-05-14",
1266
+ "prediction": "UP",
1267
+ "actual": "UP",
1268
+ "correct": true,
1269
+ "source": "backtest"
1270
+ },
1271
+ {
1272
+ "date": "2026-05-15",
1273
+ "prediction": "UP",
1274
+ "actual": "DOWN",
1275
+ "correct": false,
1276
+ "source": "backtest"
1277
+ },
1278
+ {
1279
+ "date": "2026-05-18",
1280
+ "prediction": "DOWN",
1281
+ "actual": "UP",
1282
+ "correct": false,
1283
+ "source": "backtest"
1284
+ },
1285
+ {
1286
+ "date": "2026-05-19",
1287
+ "prediction": "DOWN",
1288
+ "actual": "DOWN",
1289
+ "correct": true,
1290
+ "source": "backtest"
1291
+ },
1292
+ {
1293
+ "date": "2026-05-20",
1294
+ "prediction": "DOWN",
1295
+ "actual": "UP",
1296
+ "correct": false,
1297
+ "source": "backtest"
1298
+ },
1299
+ {
1300
+ "date": "2026-05-21",
1301
+ "prediction": "UP",
1302
+ "actual": "DOWN",
1303
+ "correct": false,
1304
+ "source": "backtest"
1305
+ },
1306
+ {
1307
+ "date": "2026-05-22",
1308
+ "prediction": "UP",
1309
+ "actual": "UP",
1310
+ "correct": true,
1311
+ "source": "backtest"
1312
+ },
1313
+ {
1314
+ "date": "2026-05-25",
1315
+ "prediction": "UP",
1316
+ "actual": "UP",
1317
+ "correct": true,
1318
+ "source": "backtest"
1319
+ },
1320
+ {
1321
+ "date": "2026-05-26",
1322
+ "prediction": "DOWN",
1323
+ "actual": "DOWN",
1324
+ "correct": true,
1325
+ "source": "backtest"
1326
+ },
1327
+ {
1328
+ "date": "2026-05-27",
1329
+ "prediction": "UP",
1330
+ "actual": "DOWN",
1331
+ "correct": false,
1332
+ "source": "backtest"
1333
+ },
1334
+ {
1335
+ "date": "2026-05-29",
1336
+ "prediction": "UP",
1337
+ "actual": "DOWN",
1338
+ "correct": false,
1339
+ "source": "backtest"
1340
+ },
1341
+ {
1342
+ "date": "2026-06-01",
1343
+ "prediction": "UP",
1344
+ "actual": "DOWN",
1345
+ "correct": false,
1346
+ "source": "backtest"
1347
+ },
1348
  {
1349
  "date": "2026-06-02",
1350
  "prediction": "DOWN",
1351
  "actual": "UP",
1352
+ "correct": false,
1353
+ "source": "backtest"
1354
+ },
1355
+ {
1356
+ "date": "2026-06-03",
1357
+ "prediction": "DOWN",
1358
+ "actual": "DOWN",
1359
+ "correct": true,
1360
+ "source": "backtest"
1361
+ },
1362
+ {
1363
+ "date": "2026-06-04",
1364
+ "prediction": "DOWN",
1365
+ "actual": "UP",
1366
+ "correct": false,
1367
+ "source": "backtest"
1368
+ },
1369
+ {
1370
+ "date": "2026-06-05",
1371
+ "prediction": "UP",
1372
+ "actual": "DOWN",
1373
+ "correct": false,
1374
+ "source": "backtest"
1375
+ },
1376
+ {
1377
+ "date": "2026-06-08",
1378
+ "prediction": "DOWN",
1379
+ "actual": "DOWN",
1380
+ "correct": true,
1381
+ "source": "backtest"
1382
+ },
1383
+ {
1384
+ "date": "2026-06-09",
1385
+ "prediction": "DOWN",
1386
+ "actual": "UP",
1387
+ "correct": false,
1388
+ "source": "backtest"
1389
+ }
1390
+ ],
1391
+ "accuracy": null,
1392
+ "total": 0,
1393
+ "correct_count": 0,
1394
+ "backtest_count": 198,
1395
+ "live_count": 0
1396
+ },
1397
+ "t5": {
1398
+ "entries": [
1399
+ {
1400
+ "date": "2025-08-18",
1401
+ "prediction": "UP",
1402
+ "actual": "DOWN",
1403
+ "correct": false,
1404
+ "source": "backtest"
1405
+ },
1406
+ {
1407
+ "date": "2025-08-19",
1408
+ "prediction": "UP",
1409
+ "actual": "UP",
1410
+ "correct": true,
1411
+ "source": "backtest"
1412
+ },
1413
+ {
1414
+ "date": "2025-08-20",
1415
+ "prediction": "DOWN",
1416
+ "actual": "UP",
1417
+ "correct": false,
1418
+ "source": "backtest"
1419
+ },
1420
+ {
1421
+ "date": "2025-08-21",
1422
+ "prediction": "DOWN",
1423
+ "actual": "DOWN",
1424
+ "correct": true,
1425
+ "source": "backtest"
1426
+ },
1427
+ {
1428
+ "date": "2025-08-22",
1429
+ "prediction": "DOWN",
1430
+ "actual": "DOWN",
1431
+ "correct": true,
1432
+ "source": "backtest"
1433
+ },
1434
+ {
1435
+ "date": "2025-08-25",
1436
+ "prediction": "DOWN",
1437
+ "actual": "UP",
1438
+ "correct": false,
1439
+ "source": "backtest"
1440
+ },
1441
+ {
1442
+ "date": "2025-08-26",
1443
+ "prediction": "DOWN",
1444
+ "actual": "DOWN",
1445
+ "correct": true,
1446
+ "source": "backtest"
1447
+ },
1448
+ {
1449
+ "date": "2025-08-28",
1450
+ "prediction": "DOWN",
1451
+ "actual": "DOWN",
1452
+ "correct": true,
1453
+ "source": "backtest"
1454
+ },
1455
+ {
1456
+ "date": "2025-08-29",
1457
+ "prediction": "UP",
1458
+ "actual": "DOWN",
1459
+ "correct": false,
1460
+ "source": "backtest"
1461
+ },
1462
+ {
1463
+ "date": "2025-09-01",
1464
+ "prediction": "UP",
1465
+ "actual": "UP",
1466
+ "correct": true,
1467
+ "source": "backtest"
1468
+ },
1469
+ {
1470
+ "date": "2025-09-02",
1471
+ "prediction": "UP",
1472
+ "actual": "DOWN",
1473
+ "correct": false,
1474
+ "source": "backtest"
1475
+ },
1476
+ {
1477
+ "date": "2025-09-03",
1478
+ "prediction": "DOWN",
1479
+ "actual": "UP",
1480
+ "correct": false,
1481
+ "source": "backtest"
1482
+ },
1483
+ {
1484
+ "date": "2025-09-04",
1485
+ "prediction": "DOWN",
1486
+ "actual": "DOWN",
1487
+ "correct": true,
1488
+ "source": "backtest"
1489
+ },
1490
+ {
1491
+ "date": "2025-09-05",
1492
+ "prediction": "DOWN",
1493
+ "actual": "DOWN",
1494
+ "correct": true,
1495
+ "source": "backtest"
1496
+ },
1497
+ {
1498
+ "date": "2025-09-08",
1499
+ "prediction": "DOWN",
1500
+ "actual": "DOWN",
1501
+ "correct": true,
1502
+ "source": "backtest"
1503
+ },
1504
+ {
1505
+ "date": "2025-09-09",
1506
+ "prediction": "DOWN",
1507
+ "actual": "UP",
1508
+ "correct": false,
1509
+ "source": "backtest"
1510
+ },
1511
+ {
1512
+ "date": "2025-09-10",
1513
+ "prediction": "DOWN",
1514
+ "actual": "DOWN",
1515
+ "correct": true,
1516
+ "source": "backtest"
1517
+ },
1518
+ {
1519
+ "date": "2025-09-11",
1520
+ "prediction": "UP",
1521
+ "actual": "UP",
1522
+ "correct": true,
1523
+ "source": "backtest"
1524
+ },
1525
+ {
1526
+ "date": "2025-09-12",
1527
+ "prediction": "DOWN",
1528
+ "actual": "UP",
1529
+ "correct": false,
1530
+ "source": "backtest"
1531
+ },
1532
+ {
1533
+ "date": "2025-09-15",
1534
+ "prediction": "DOWN",
1535
+ "actual": "DOWN",
1536
+ "correct": true,
1537
+ "source": "backtest"
1538
+ },
1539
+ {
1540
+ "date": "2025-09-16",
1541
+ "prediction": "UP",
1542
+ "actual": "UP",
1543
+ "correct": true,
1544
+ "source": "backtest"
1545
+ },
1546
+ {
1547
+ "date": "2025-09-17",
1548
+ "prediction": "UP",
1549
+ "actual": "UP",
1550
+ "correct": true,
1551
+ "source": "backtest"
1552
+ },
1553
+ {
1554
+ "date": "2025-09-18",
1555
+ "prediction": "DOWN",
1556
+ "actual": "DOWN",
1557
+ "correct": true,
1558
+ "source": "backtest"
1559
+ },
1560
+ {
1561
+ "date": "2025-09-19",
1562
+ "prediction": "UP",
1563
+ "actual": "DOWN",
1564
+ "correct": false,
1565
+ "source": "backtest"
1566
+ },
1567
+ {
1568
+ "date": "2025-09-22",
1569
+ "prediction": "DOWN",
1570
+ "actual": "DOWN",
1571
+ "correct": true,
1572
+ "source": "backtest"
1573
+ },
1574
+ {
1575
+ "date": "2025-09-23",
1576
+ "prediction": "UP",
1577
+ "actual": "DOWN",
1578
+ "correct": false,
1579
+ "source": "backtest"
1580
+ },
1581
+ {
1582
+ "date": "2025-09-24",
1583
+ "prediction": "DOWN",
1584
+ "actual": "DOWN",
1585
+ "correct": true,
1586
+ "source": "backtest"
1587
+ },
1588
+ {
1589
+ "date": "2025-09-25",
1590
+ "prediction": "DOWN",
1591
+ "actual": "DOWN",
1592
+ "correct": true,
1593
+ "source": "backtest"
1594
+ },
1595
+ {
1596
+ "date": "2025-09-26",
1597
+ "prediction": "UP",
1598
+ "actual": "DOWN",
1599
+ "correct": false,
1600
+ "source": "backtest"
1601
+ },
1602
+ {
1603
+ "date": "2025-09-29",
1604
+ "prediction": "DOWN",
1605
+ "actual": "DOWN",
1606
+ "correct": true,
1607
+ "source": "backtest"
1608
+ },
1609
+ {
1610
+ "date": "2025-09-30",
1611
+ "prediction": "UP",
1612
+ "actual": "DOWN",
1613
+ "correct": false,
1614
+ "source": "backtest"
1615
+ },
1616
+ {
1617
+ "date": "2025-10-01",
1618
+ "prediction": "UP",
1619
+ "actual": "UP",
1620
+ "correct": true,
1621
+ "source": "backtest"
1622
+ },
1623
+ {
1624
+ "date": "2025-10-03",
1625
+ "prediction": "UP",
1626
+ "actual": "UP",
1627
+ "correct": true,
1628
+ "source": "backtest"
1629
+ },
1630
+ {
1631
+ "date": "2025-10-06",
1632
+ "prediction": "UP",
1633
+ "actual": "UP",
1634
+ "correct": true,
1635
+ "source": "backtest"
1636
+ },
1637
+ {
1638
+ "date": "2025-10-07",
1639
+ "prediction": "UP",
1640
+ "actual": "UP",
1641
+ "correct": true,
1642
+ "source": "backtest"
1643
+ },
1644
+ {
1645
+ "date": "2025-10-08",
1646
+ "prediction": "UP",
1647
+ "actual": "DOWN",
1648
+ "correct": false,
1649
+ "source": "backtest"
1650
+ },
1651
+ {
1652
+ "date": "2025-10-09",
1653
+ "prediction": "UP",
1654
+ "actual": "UP",
1655
+ "correct": true,
1656
+ "source": "backtest"
1657
+ },
1658
+ {
1659
+ "date": "2025-10-10",
1660
+ "prediction": "UP",
1661
+ "actual": "UP",
1662
+ "correct": true,
1663
+ "source": "backtest"
1664
+ },
1665
+ {
1666
+ "date": "2025-10-13",
1667
+ "prediction": "UP",
1668
+ "actual": "UP",
1669
+ "correct": true,
1670
+ "source": "backtest"
1671
+ },
1672
+ {
1673
+ "date": "2025-10-14",
1674
+ "prediction": "UP",
1675
+ "actual": "DOWN",
1676
+ "correct": false,
1677
+ "source": "backtest"
1678
+ },
1679
+ {
1680
+ "date": "2025-10-15",
1681
+ "prediction": "UP",
1682
+ "actual": "UP",
1683
+ "correct": true,
1684
+ "source": "backtest"
1685
+ },
1686
+ {
1687
+ "date": "2025-10-16",
1688
+ "prediction": "UP",
1689
+ "actual": "UP",
1690
+ "correct": true,
1691
+ "source": "backtest"
1692
+ },
1693
+ {
1694
+ "date": "2025-10-17",
1695
+ "prediction": "UP",
1696
+ "actual": "UP",
1697
+ "correct": true,
1698
+ "source": "backtest"
1699
+ },
1700
+ {
1701
+ "date": "2025-10-20",
1702
+ "prediction": "UP",
1703
+ "actual": "UP",
1704
+ "correct": true,
1705
+ "source": "backtest"
1706
+ },
1707
+ {
1708
+ "date": "2025-10-21",
1709
+ "prediction": "DOWN",
1710
+ "actual": "DOWN",
1711
+ "correct": true,
1712
+ "source": "backtest"
1713
+ },
1714
+ {
1715
+ "date": "2025-10-23",
1716
+ "prediction": "DOWN",
1717
+ "actual": "DOWN",
1718
+ "correct": true,
1719
+ "source": "backtest"
1720
+ },
1721
+ {
1722
+ "date": "2025-10-24",
1723
+ "prediction": "DOWN",
1724
+ "actual": "DOWN",
1725
+ "correct": true,
1726
+ "source": "backtest"
1727
+ },
1728
+ {
1729
+ "date": "2025-10-27",
1730
+ "prediction": "UP",
1731
+ "actual": "UP",
1732
+ "correct": true,
1733
+ "source": "backtest"
1734
+ },
1735
+ {
1736
+ "date": "2025-10-28",
1737
+ "prediction": "UP",
1738
+ "actual": "UP",
1739
+ "correct": true,
1740
+ "source": "backtest"
1741
+ },
1742
+ {
1743
+ "date": "2025-10-29",
1744
+ "prediction": "DOWN",
1745
+ "actual": "UP",
1746
+ "correct": false,
1747
+ "source": "backtest"
1748
+ },
1749
+ {
1750
+ "date": "2025-10-30",
1751
+ "prediction": "DOWN",
1752
+ "actual": "DOWN",
1753
+ "correct": true,
1754
+ "source": "backtest"
1755
+ },
1756
+ {
1757
+ "date": "2025-10-31",
1758
+ "prediction": "DOWN",
1759
+ "actual": "DOWN",
1760
+ "correct": true,
1761
+ "source": "backtest"
1762
+ },
1763
+ {
1764
+ "date": "2025-11-03",
1765
+ "prediction": "DOWN",
1766
+ "actual": "UP",
1767
+ "correct": false,
1768
+ "source": "backtest"
1769
+ },
1770
+ {
1771
+ "date": "2025-11-04",
1772
+ "prediction": "UP",
1773
+ "actual": "DOWN",
1774
+ "correct": false,
1775
+ "source": "backtest"
1776
+ },
1777
+ {
1778
+ "date": "2025-11-06",
1779
+ "prediction": "UP",
1780
+ "actual": "DOWN",
1781
+ "correct": false,
1782
+ "source": "backtest"
1783
+ },
1784
+ {
1785
+ "date": "2025-11-07",
1786
+ "prediction": "DOWN",
1787
+ "actual": "UP",
1788
+ "correct": false,
1789
+ "source": "backtest"
1790
+ },
1791
+ {
1792
+ "date": "2025-11-10",
1793
+ "prediction": "UP",
1794
+ "actual": "UP",
1795
+ "correct": true,
1796
+ "source": "backtest"
1797
+ },
1798
+ {
1799
+ "date": "2025-11-11",
1800
+ "prediction": "DOWN",
1801
+ "actual": "UP",
1802
+ "correct": false,
1803
+ "source": "backtest"
1804
+ },
1805
+ {
1806
+ "date": "2025-11-12",
1807
+ "prediction": "DOWN",
1808
+ "actual": "UP",
1809
+ "correct": false,
1810
+ "source": "backtest"
1811
+ },
1812
+ {
1813
+ "date": "2025-11-13",
1814
+ "prediction": "DOWN",
1815
+ "actual": "DOWN",
1816
+ "correct": true,
1817
+ "source": "backtest"
1818
+ },
1819
+ {
1820
+ "date": "2025-11-14",
1821
+ "prediction": "UP",
1822
+ "actual": "UP",
1823
+ "correct": true,
1824
+ "source": "backtest"
1825
+ },
1826
+ {
1827
+ "date": "2025-11-17",
1828
+ "prediction": "UP",
1829
+ "actual": "UP",
1830
+ "correct": true,
1831
+ "source": "backtest"
1832
+ },
1833
+ {
1834
+ "date": "2025-11-18",
1835
+ "prediction": "DOWN",
1836
+ "actual": "DOWN",
1837
+ "correct": true,
1838
+ "source": "backtest"
1839
+ },
1840
+ {
1841
+ "date": "2025-11-19",
1842
+ "prediction": "DOWN",
1843
+ "actual": "UP",
1844
+ "correct": false,
1845
+ "source": "backtest"
1846
+ },
1847
+ {
1848
+ "date": "2025-11-20",
1849
+ "prediction": "DOWN",
1850
+ "actual": "UP",
1851
+ "correct": false,
1852
+ "source": "backtest"
1853
+ },
1854
+ {
1855
+ "date": "2025-11-21",
1856
+ "prediction": "DOWN",
1857
+ "actual": "DOWN",
1858
+ "correct": true,
1859
+ "source": "backtest"
1860
+ },
1861
+ {
1862
+ "date": "2025-11-24",
1863
+ "prediction": "DOWN",
1864
+ "actual": "DOWN",
1865
+ "correct": true,
1866
+ "source": "backtest"
1867
+ },
1868
+ {
1869
+ "date": "2025-11-25",
1870
+ "prediction": "DOWN",
1871
+ "actual": "DOWN",
1872
+ "correct": true,
1873
+ "source": "backtest"
1874
+ },
1875
+ {
1876
+ "date": "2025-11-26",
1877
+ "prediction": "UP",
1878
+ "actual": "UP",
1879
+ "correct": true,
1880
+ "source": "backtest"
1881
+ },
1882
+ {
1883
+ "date": "2025-11-27",
1884
+ "prediction": "DOWN",
1885
+ "actual": "DOWN",
1886
+ "correct": true,
1887
+ "source": "backtest"
1888
+ },
1889
+ {
1890
+ "date": "2025-11-28",
1891
+ "prediction": "DOWN",
1892
+ "actual": "DOWN",
1893
+ "correct": true,
1894
+ "source": "backtest"
1895
+ },
1896
+ {
1897
+ "date": "2025-12-01",
1898
+ "prediction": "DOWN",
1899
+ "actual": "DOWN",
1900
+ "correct": true,
1901
+ "source": "backtest"
1902
+ },
1903
+ {
1904
+ "date": "2025-12-02",
1905
+ "prediction": "UP",
1906
+ "actual": "DOWN",
1907
+ "correct": false,
1908
+ "source": "backtest"
1909
+ },
1910
+ {
1911
+ "date": "2025-12-03",
1912
+ "prediction": "UP",
1913
+ "actual": "DOWN",
1914
+ "correct": false,
1915
+ "source": "backtest"
1916
+ },
1917
+ {
1918
+ "date": "2025-12-04",
1919
+ "prediction": "DOWN",
1920
+ "actual": "UP",
1921
+ "correct": false,
1922
+ "source": "backtest"
1923
+ },
1924
+ {
1925
+ "date": "2025-12-05",
1926
+ "prediction": "DOWN",
1927
+ "actual": "UP",
1928
+ "correct": false,
1929
+ "source": "backtest"
1930
+ },
1931
+ {
1932
+ "date": "2025-12-08",
1933
+ "prediction": "DOWN",
1934
+ "actual": "DOWN",
1935
+ "correct": true,
1936
+ "source": "backtest"
1937
+ },
1938
+ {
1939
+ "date": "2025-12-09",
1940
+ "prediction": "DOWN",
1941
+ "actual": "DOWN",
1942
+ "correct": true,
1943
+ "source": "backtest"
1944
+ },
1945
+ {
1946
+ "date": "2025-12-10",
1947
+ "prediction": "UP",
1948
+ "actual": "DOWN",
1949
+ "correct": false,
1950
+ "source": "backtest"
1951
+ },
1952
+ {
1953
+ "date": "2025-12-11",
1954
+ "prediction": "DOWN",
1955
+ "actual": "UP",
1956
+ "correct": false,
1957
+ "source": "backtest"
1958
+ },
1959
+ {
1960
+ "date": "2025-12-12",
1961
+ "prediction": "UP",
1962
+ "actual": "UP",
1963
+ "correct": true,
1964
+ "source": "backtest"
1965
+ },
1966
+ {
1967
+ "date": "2025-12-15",
1968
+ "prediction": "UP",
1969
+ "actual": "UP",
1970
+ "correct": true,
1971
+ "source": "backtest"
1972
+ },
1973
+ {
1974
+ "date": "2025-12-16",
1975
+ "prediction": "DOWN",
1976
+ "actual": "DOWN",
1977
+ "correct": true,
1978
+ "source": "backtest"
1979
+ },
1980
+ {
1981
+ "date": "2025-12-17",
1982
+ "prediction": "DOWN",
1983
+ "actual": "DOWN",
1984
+ "correct": true,
1985
+ "source": "backtest"
1986
+ },
1987
+ {
1988
+ "date": "2025-12-18",
1989
+ "prediction": "UP",
1990
+ "actual": "UP",
1991
+ "correct": true,
1992
+ "source": "backtest"
1993
+ },
1994
+ {
1995
+ "date": "2025-12-19",
1996
+ "prediction": "UP",
1997
+ "actual": "UP",
1998
+ "correct": true,
1999
+ "source": "backtest"
2000
+ },
2001
+ {
2002
+ "date": "2025-12-22",
2003
+ "prediction": "UP",
2004
+ "actual": "UP",
2005
+ "correct": true,
2006
+ "source": "backtest"
2007
+ },
2008
+ {
2009
+ "date": "2025-12-23",
2010
+ "prediction": "DOWN",
2011
+ "actual": "DOWN",
2012
+ "correct": true,
2013
+ "source": "backtest"
2014
+ },
2015
+ {
2016
+ "date": "2025-12-24",
2017
+ "prediction": "UP",
2018
+ "actual": "DOWN",
2019
+ "correct": false,
2020
+ "source": "backtest"
2021
+ },
2022
+ {
2023
+ "date": "2025-12-26",
2024
+ "prediction": "DOWN",
2025
+ "actual": "DOWN",
2026
+ "correct": true,
2027
+ "source": "backtest"
2028
+ },
2029
+ {
2030
+ "date": "2025-12-29",
2031
+ "prediction": "DOWN",
2032
+ "actual": "DOWN",
2033
+ "correct": true,
2034
+ "source": "backtest"
2035
+ },
2036
+ {
2037
+ "date": "2025-12-30",
2038
+ "prediction": "DOWN",
2039
+ "actual": "UP",
2040
+ "correct": false,
2041
+ "source": "backtest"
2042
+ },
2043
+ {
2044
+ "date": "2025-12-31",
2045
+ "prediction": "UP",
2046
+ "actual": "UP",
2047
+ "correct": true,
2048
+ "source": "backtest"
2049
+ },
2050
+ {
2051
+ "date": "2026-01-01",
2052
+ "prediction": "DOWN",
2053
+ "actual": "DOWN",
2054
+ "correct": true,
2055
+ "source": "backtest"
2056
+ },
2057
+ {
2058
+ "date": "2026-01-02",
2059
+ "prediction": "UP",
2060
+ "actual": "UP",
2061
+ "correct": true,
2062
+ "source": "backtest"
2063
+ },
2064
+ {
2065
+ "date": "2026-01-05",
2066
+ "prediction": "DOWN",
2067
+ "actual": "DOWN",
2068
+ "correct": true,
2069
+ "source": "backtest"
2070
+ },
2071
+ {
2072
+ "date": "2026-01-06",
2073
+ "prediction": "UP",
2074
+ "actual": "DOWN",
2075
+ "correct": false,
2076
+ "source": "backtest"
2077
+ },
2078
+ {
2079
+ "date": "2026-01-07",
2080
+ "prediction": "DOWN",
2081
+ "actual": "DOWN",
2082
+ "correct": true,
2083
+ "source": "backtest"
2084
+ },
2085
+ {
2086
+ "date": "2026-01-08",
2087
+ "prediction": "UP",
2088
+ "actual": "DOWN",
2089
+ "correct": false,
2090
+ "source": "backtest"
2091
+ },
2092
+ {
2093
+ "date": "2026-01-09",
2094
+ "prediction": "UP",
2095
+ "actual": "DOWN",
2096
+ "correct": false,
2097
+ "source": "backtest"
2098
+ },
2099
+ {
2100
+ "date": "2026-01-12",
2101
+ "prediction": "DOWN",
2102
+ "actual": "UP",
2103
+ "correct": false,
2104
+ "source": "backtest"
2105
+ },
2106
+ {
2107
+ "date": "2026-01-13",
2108
+ "prediction": "DOWN",
2109
+ "actual": "DOWN",
2110
+ "correct": true,
2111
+ "source": "backtest"
2112
+ },
2113
+ {
2114
+ "date": "2026-01-14",
2115
+ "prediction": "UP",
2116
+ "actual": "UP",
2117
+ "correct": true,
2118
+ "source": "backtest"
2119
+ },
2120
+ {
2121
+ "date": "2026-01-16",
2122
+ "prediction": "DOWN",
2123
+ "actual": "UP",
2124
+ "correct": false,
2125
+ "source": "backtest"
2126
+ },
2127
+ {
2128
+ "date": "2026-01-19",
2129
+ "prediction": "DOWN",
2130
+ "actual": "DOWN",
2131
+ "correct": true,
2132
+ "source": "backtest"
2133
+ },
2134
+ {
2135
+ "date": "2026-01-20",
2136
+ "prediction": "DOWN",
2137
+ "actual": "DOWN",
2138
+ "correct": true,
2139
+ "source": "backtest"
2140
+ },
2141
+ {
2142
+ "date": "2026-01-21",
2143
+ "prediction": "UP",
2144
+ "actual": "UP",
2145
+ "correct": true,
2146
+ "source": "backtest"
2147
+ },
2148
+ {
2149
+ "date": "2026-01-22",
2150
+ "prediction": "UP",
2151
+ "actual": "DOWN",
2152
+ "correct": false,
2153
+ "source": "backtest"
2154
+ },
2155
+ {
2156
+ "date": "2026-01-23",
2157
+ "prediction": "DOWN",
2158
+ "actual": "DOWN",
2159
+ "correct": true,
2160
+ "source": "backtest"
2161
+ },
2162
+ {
2163
+ "date": "2026-01-27",
2164
+ "prediction": "UP",
2165
+ "actual": "UP",
2166
+ "correct": true,
2167
+ "source": "backtest"
2168
+ },
2169
+ {
2170
+ "date": "2026-01-28",
2171
+ "prediction": "UP",
2172
+ "actual": "UP",
2173
+ "correct": true,
2174
+ "source": "backtest"
2175
+ },
2176
+ {
2177
+ "date": "2026-01-29",
2178
+ "prediction": "DOWN",
2179
+ "actual": "UP",
2180
+ "correct": false,
2181
+ "source": "backtest"
2182
+ },
2183
+ {
2184
+ "date": "2026-01-30",
2185
+ "prediction": "UP",
2186
+ "actual": "UP",
2187
+ "correct": true,
2188
+ "source": "backtest"
2189
+ },
2190
+ {
2191
+ "date": "2026-02-01",
2192
+ "prediction": "DOWN",
2193
+ "actual": "DOWN",
2194
+ "correct": true,
2195
+ "source": "backtest"
2196
+ },
2197
+ {
2198
+ "date": "2026-02-02",
2199
+ "prediction": "UP",
2200
+ "actual": "UP",
2201
+ "correct": true,
2202
+ "source": "backtest"
2203
+ },
2204
+ {
2205
+ "date": "2026-02-03",
2206
+ "prediction": "UP",
2207
+ "actual": "DOWN",
2208
+ "correct": false,
2209
+ "source": "backtest"
2210
+ },
2211
+ {
2212
+ "date": "2026-02-04",
2213
+ "prediction": "UP",
2214
+ "actual": "UP",
2215
+ "correct": true,
2216
+ "source": "backtest"
2217
+ },
2218
+ {
2219
+ "date": "2026-02-05",
2220
+ "prediction": "DOWN",
2221
+ "actual": "DOWN",
2222
+ "correct": true,
2223
+ "source": "backtest"
2224
+ },
2225
+ {
2226
+ "date": "2026-02-06",
2227
+ "prediction": "UP",
2228
+ "actual": "UP",
2229
+ "correct": true,
2230
+ "source": "backtest"
2231
+ },
2232
+ {
2233
+ "date": "2026-02-09",
2234
+ "prediction": "DOWN",
2235
+ "actual": "DOWN",
2236
+ "correct": true,
2237
+ "source": "backtest"
2238
+ },
2239
+ {
2240
+ "date": "2026-02-10",
2241
+ "prediction": "DOWN",
2242
+ "actual": "DOWN",
2243
+ "correct": true,
2244
+ "source": "backtest"
2245
+ },
2246
+ {
2247
+ "date": "2026-02-11",
2248
+ "prediction": "DOWN",
2249
+ "actual": "DOWN",
2250
+ "correct": true,
2251
+ "source": "backtest"
2252
+ },
2253
+ {
2254
+ "date": "2026-02-12",
2255
+ "prediction": "DOWN",
2256
+ "actual": "DOWN",
2257
+ "correct": true,
2258
+ "source": "backtest"
2259
+ },
2260
+ {
2261
+ "date": "2026-02-13",
2262
+ "prediction": "UP",
2263
+ "actual": "DOWN",
2264
+ "correct": false,
2265
+ "source": "backtest"
2266
+ },
2267
+ {
2268
+ "date": "2026-02-16",
2269
+ "prediction": "DOWN",
2270
+ "actual": "UP",
2271
+ "correct": false,
2272
+ "source": "backtest"
2273
+ },
2274
+ {
2275
+ "date": "2026-02-17",
2276
+ "prediction": "DOWN",
2277
+ "actual": "UP",
2278
+ "correct": false,
2279
+ "source": "backtest"
2280
+ },
2281
+ {
2282
+ "date": "2026-02-18",
2283
+ "prediction": "DOWN",
2284
+ "actual": "UP",
2285
+ "correct": false,
2286
+ "source": "backtest"
2287
+ },
2288
+ {
2289
+ "date": "2026-02-19",
2290
+ "prediction": "DOWN",
2291
+ "actual": "DOWN",
2292
+ "correct": true,
2293
+ "source": "backtest"
2294
+ },
2295
+ {
2296
+ "date": "2026-02-20",
2297
+ "prediction": "DOWN",
2298
+ "actual": "UP",
2299
+ "correct": false,
2300
+ "source": "backtest"
2301
+ },
2302
+ {
2303
+ "date": "2026-02-23",
2304
+ "prediction": "UP",
2305
+ "actual": "UP",
2306
+ "correct": true,
2307
+ "source": "backtest"
2308
+ },
2309
+ {
2310
+ "date": "2026-02-24",
2311
+ "prediction": "DOWN",
2312
+ "actual": "DOWN",
2313
+ "correct": true,
2314
+ "source": "backtest"
2315
+ },
2316
+ {
2317
+ "date": "2026-02-25",
2318
+ "prediction": "UP",
2319
+ "actual": "DOWN",
2320
+ "correct": false,
2321
+ "source": "backtest"
2322
+ },
2323
+ {
2324
+ "date": "2026-02-26",
2325
+ "prediction": "DOWN",
2326
+ "actual": "DOWN",
2327
+ "correct": true,
2328
+ "source": "backtest"
2329
+ },
2330
+ {
2331
+ "date": "2026-02-27",
2332
+ "prediction": "UP",
2333
+ "actual": "DOWN",
2334
+ "correct": false,
2335
+ "source": "backtest"
2336
+ },
2337
+ {
2338
+ "date": "2026-03-02",
2339
+ "prediction": "DOWN",
2340
+ "actual": "UP",
2341
+ "correct": false,
2342
+ "source": "backtest"
2343
+ },
2344
+ {
2345
+ "date": "2026-03-04",
2346
+ "prediction": "UP",
2347
+ "actual": "UP",
2348
+ "correct": true,
2349
+ "source": "backtest"
2350
+ },
2351
+ {
2352
+ "date": "2026-03-05",
2353
+ "prediction": "UP",
2354
+ "actual": "UP",
2355
+ "correct": true,
2356
+ "source": "backtest"
2357
+ },
2358
+ {
2359
+ "date": "2026-03-06",
2360
+ "prediction": "UP",
2361
+ "actual": "DOWN",
2362
+ "correct": false,
2363
+ "source": "backtest"
2364
+ },
2365
+ {
2366
+ "date": "2026-03-09",
2367
+ "prediction": "DOWN",
2368
+ "actual": "UP",
2369
+ "correct": false,
2370
+ "source": "backtest"
2371
+ },
2372
+ {
2373
+ "date": "2026-03-10",
2374
+ "prediction": "UP",
2375
+ "actual": "UP",
2376
+ "correct": true,
2377
+ "source": "backtest"
2378
+ },
2379
+ {
2380
+ "date": "2026-03-11",
2381
+ "prediction": "DOWN",
2382
+ "actual": "DOWN",
2383
+ "correct": true,
2384
+ "source": "backtest"
2385
+ },
2386
+ {
2387
+ "date": "2026-03-12",
2388
+ "prediction": "UP",
2389
+ "actual": "DOWN",
2390
+ "correct": false,
2391
+ "source": "backtest"
2392
+ },
2393
+ {
2394
+ "date": "2026-03-13",
2395
+ "prediction": "UP",
2396
+ "actual": "DOWN",
2397
+ "correct": false,
2398
+ "source": "backtest"
2399
+ },
2400
+ {
2401
+ "date": "2026-03-16",
2402
+ "prediction": "DOWN",
2403
+ "actual": "UP",
2404
+ "correct": false,
2405
+ "source": "backtest"
2406
+ },
2407
+ {
2408
+ "date": "2026-03-17",
2409
+ "prediction": "UP",
2410
+ "actual": "UP",
2411
+ "correct": true,
2412
+ "source": "backtest"
2413
+ },
2414
+ {
2415
+ "date": "2026-03-18",
2416
+ "prediction": "UP",
2417
+ "actual": "UP",
2418
+ "correct": true,
2419
+ "source": "backtest"
2420
+ },
2421
+ {
2422
+ "date": "2026-03-19",
2423
+ "prediction": "UP",
2424
+ "actual": "DOWN",
2425
+ "correct": false,
2426
+ "source": "backtest"
2427
+ },
2428
+ {
2429
+ "date": "2026-03-20",
2430
+ "prediction": "UP",
2431
+ "actual": "UP",
2432
+ "correct": true,
2433
+ "source": "backtest"
2434
+ },
2435
+ {
2436
+ "date": "2026-03-23",
2437
+ "prediction": "DOWN",
2438
+ "actual": "DOWN",
2439
+ "correct": true,
2440
+ "source": "backtest"
2441
+ },
2442
+ {
2443
+ "date": "2026-03-24",
2444
+ "prediction": "UP",
2445
+ "actual": "UP",
2446
+ "correct": true,
2447
+ "source": "backtest"
2448
+ },
2449
+ {
2450
+ "date": "2026-03-25",
2451
+ "prediction": "UP",
2452
+ "actual": "UP",
2453
+ "correct": true,
2454
+ "source": "backtest"
2455
+ },
2456
+ {
2457
+ "date": "2026-03-27",
2458
+ "prediction": "DOWN",
2459
+ "actual": "DOWN",
2460
+ "correct": true,
2461
+ "source": "backtest"
2462
+ },
2463
+ {
2464
+ "date": "2026-03-30",
2465
+ "prediction": "UP",
2466
+ "actual": "DOWN",
2467
+ "correct": false,
2468
+ "source": "backtest"
2469
+ },
2470
+ {
2471
+ "date": "2026-04-01",
2472
+ "prediction": "UP",
2473
+ "actual": "DOWN",
2474
+ "correct": false,
2475
+ "source": "backtest"
2476
+ },
2477
+ {
2478
+ "date": "2026-04-02",
2479
+ "prediction": "DOWN",
2480
+ "actual": "UP",
2481
+ "correct": false,
2482
+ "source": "backtest"
2483
+ },
2484
+ {
2485
+ "date": "2026-04-06",
2486
+ "prediction": "UP",
2487
+ "actual": "UP",
2488
+ "correct": true,
2489
+ "source": "backtest"
2490
+ },
2491
+ {
2492
+ "date": "2026-04-07",
2493
+ "prediction": "DOWN",
2494
+ "actual": "UP",
2495
+ "correct": false,
2496
+ "source": "backtest"
2497
+ },
2498
+ {
2499
+ "date": "2026-04-08",
2500
+ "prediction": "UP",
2501
+ "actual": "UP",
2502
+ "correct": true,
2503
+ "source": "backtest"
2504
+ },
2505
+ {
2506
+ "date": "2026-04-09",
2507
+ "prediction": "DOWN",
2508
+ "actual": "DOWN",
2509
+ "correct": true,
2510
+ "source": "backtest"
2511
+ },
2512
+ {
2513
+ "date": "2026-04-10",
2514
+ "prediction": "DOWN",
2515
+ "actual": "UP",
2516
+ "correct": false,
2517
+ "source": "backtest"
2518
+ },
2519
+ {
2520
+ "date": "2026-04-13",
2521
+ "prediction": "DOWN",
2522
+ "actual": "UP",
2523
+ "correct": false,
2524
+ "source": "backtest"
2525
+ },
2526
+ {
2527
+ "date": "2026-04-15",
2528
+ "prediction": "UP",
2529
+ "actual": "UP",
2530
+ "correct": true,
2531
+ "source": "backtest"
2532
+ },
2533
+ {
2534
+ "date": "2026-04-16",
2535
+ "prediction": "DOWN",
2536
+ "actual": "DOWN",
2537
+ "correct": true,
2538
+ "source": "backtest"
2539
+ },
2540
+ {
2541
+ "date": "2026-04-17",
2542
+ "prediction": "UP",
2543
+ "actual": "UP",
2544
+ "correct": true,
2545
+ "source": "backtest"
2546
+ },
2547
+ {
2548
+ "date": "2026-04-20",
2549
+ "prediction": "DOWN",
2550
+ "actual": "DOWN",
2551
+ "correct": true,
2552
+ "source": "backtest"
2553
+ },
2554
+ {
2555
+ "date": "2026-04-21",
2556
+ "prediction": "UP",
2557
+ "actual": "UP",
2558
+ "correct": true,
2559
+ "source": "backtest"
2560
+ },
2561
+ {
2562
+ "date": "2026-04-22",
2563
+ "prediction": "UP",
2564
+ "actual": "DOWN",
2565
+ "correct": false,
2566
+ "source": "backtest"
2567
+ },
2568
+ {
2569
+ "date": "2026-04-23",
2570
+ "prediction": "DOWN",
2571
+ "actual": "DOWN",
2572
+ "correct": true,
2573
+ "source": "backtest"
2574
+ },
2575
+ {
2576
+ "date": "2026-04-24",
2577
+ "prediction": "DOWN",
2578
+ "actual": "DOWN",
2579
+ "correct": true,
2580
+ "source": "backtest"
2581
+ },
2582
+ {
2583
+ "date": "2026-04-27",
2584
+ "prediction": "UP",
2585
+ "actual": "UP",
2586
+ "correct": true,
2587
+ "source": "backtest"
2588
+ },
2589
+ {
2590
+ "date": "2026-04-28",
2591
+ "prediction": "DOWN",
2592
+ "actual": "DOWN",
2593
+ "correct": true,
2594
+ "source": "backtest"
2595
+ },
2596
+ {
2597
+ "date": "2026-04-29",
2598
+ "prediction": "UP",
2599
+ "actual": "UP",
2600
+ "correct": true,
2601
+ "source": "backtest"
2602
+ },
2603
+ {
2604
+ "date": "2026-04-30",
2605
+ "prediction": "DOWN",
2606
+ "actual": "DOWN",
2607
+ "correct": true,
2608
+ "source": "backtest"
2609
+ },
2610
+ {
2611
+ "date": "2026-05-04",
2612
+ "prediction": "UP",
2613
+ "actual": "UP",
2614
+ "correct": true,
2615
+ "source": "backtest"
2616
+ },
2617
+ {
2618
+ "date": "2026-05-05",
2619
+ "prediction": "DOWN",
2620
+ "actual": "DOWN",
2621
+ "correct": true,
2622
+ "source": "backtest"
2623
+ },
2624
+ {
2625
+ "date": "2026-05-06",
2626
+ "prediction": "UP",
2627
+ "actual": "UP",
2628
+ "correct": true,
2629
+ "source": "backtest"
2630
+ },
2631
+ {
2632
+ "date": "2026-05-07",
2633
+ "prediction": "DOWN",
2634
+ "actual": "DOWN",
2635
+ "correct": true,
2636
+ "source": "backtest"
2637
+ },
2638
+ {
2639
+ "date": "2026-05-08",
2640
+ "prediction": "DOWN",
2641
+ "actual": "DOWN",
2642
+ "correct": true,
2643
+ "source": "backtest"
2644
+ },
2645
+ {
2646
+ "date": "2026-05-11",
2647
+ "prediction": "UP",
2648
+ "actual": "DOWN",
2649
+ "correct": false,
2650
+ "source": "backtest"
2651
+ },
2652
+ {
2653
+ "date": "2026-05-12",
2654
+ "prediction": "DOWN",
2655
+ "actual": "DOWN",
2656
+ "correct": true,
2657
+ "source": "backtest"
2658
+ },
2659
+ {
2660
+ "date": "2026-05-13",
2661
+ "prediction": "UP",
2662
+ "actual": "UP",
2663
+ "correct": true,
2664
+ "source": "backtest"
2665
+ },
2666
+ {
2667
+ "date": "2026-05-14",
2668
+ "prediction": "UP",
2669
+ "actual": "UP",
2670
+ "correct": true,
2671
+ "source": "backtest"
2672
+ },
2673
+ {
2674
+ "date": "2026-05-15",
2675
+ "prediction": "UP",
2676
+ "actual": "DOWN",
2677
+ "correct": false,
2678
+ "source": "backtest"
2679
+ },
2680
+ {
2681
+ "date": "2026-05-18",
2682
+ "prediction": "DOWN",
2683
+ "actual": "UP",
2684
+ "correct": false,
2685
+ "source": "backtest"
2686
+ },
2687
+ {
2688
+ "date": "2026-05-19",
2689
+ "prediction": "UP",
2690
+ "actual": "DOWN",
2691
+ "correct": false,
2692
+ "source": "backtest"
2693
+ },
2694
+ {
2695
+ "date": "2026-05-20",
2696
+ "prediction": "UP",
2697
+ "actual": "UP",
2698
+ "correct": true,
2699
+ "source": "backtest"
2700
+ },
2701
+ {
2702
+ "date": "2026-05-21",
2703
+ "prediction": "UP",
2704
+ "actual": "DOWN",
2705
+ "correct": false,
2706
+ "source": "backtest"
2707
+ }
2708
+ ],
2709
+ "accuracy": null,
2710
+ "total": 0,
2711
+ "correct_count": 0,
2712
+ "backtest_count": 187,
2713
+ "live_count": 0
2714
+ },
2715
+ "tplus1": {
2716
+ "entries": [
2717
+ {
2718
+ "date": "2025-08-08",
2719
+ "prediction": "UP",
2720
+ "actual": "DOWN",
2721
+ "correct": false,
2722
+ "source": "backtest"
2723
+ },
2724
+ {
2725
+ "date": "2025-08-11",
2726
+ "prediction": "UP",
2727
+ "actual": "UP",
2728
+ "correct": true,
2729
+ "source": "backtest"
2730
+ },
2731
+ {
2732
+ "date": "2025-08-12",
2733
+ "prediction": "DOWN",
2734
+ "actual": "DOWN",
2735
+ "correct": true,
2736
+ "source": "backtest"
2737
+ },
2738
+ {
2739
+ "date": "2025-08-13",
2740
+ "prediction": "UP",
2741
+ "actual": "UP",
2742
+ "correct": true,
2743
+ "source": "backtest"
2744
+ },
2745
+ {
2746
+ "date": "2025-08-14",
2747
+ "prediction": "UP",
2748
+ "actual": "DOWN",
2749
+ "correct": false,
2750
+ "source": "backtest"
2751
+ },
2752
+ {
2753
+ "date": "2025-08-18",
2754
+ "prediction": "UP",
2755
+ "actual": "UP",
2756
+ "correct": true,
2757
+ "source": "backtest"
2758
+ },
2759
+ {
2760
+ "date": "2025-08-19",
2761
+ "prediction": "UP",
2762
+ "actual": "UP",
2763
+ "correct": true,
2764
+ "source": "backtest"
2765
+ },
2766
+ {
2767
+ "date": "2025-08-20",
2768
+ "prediction": "UP",
2769
+ "actual": "UP",
2770
+ "correct": true,
2771
+ "source": "backtest"
2772
+ },
2773
+ {
2774
+ "date": "2025-08-21",
2775
+ "prediction": "DOWN",
2776
+ "actual": "UP",
2777
+ "correct": false,
2778
+ "source": "backtest"
2779
+ },
2780
+ {
2781
+ "date": "2025-08-22",
2782
+ "prediction": "DOWN",
2783
+ "actual": "DOWN",
2784
+ "correct": true,
2785
+ "source": "backtest"
2786
+ },
2787
+ {
2788
+ "date": "2025-08-25",
2789
+ "prediction": "DOWN",
2790
+ "actual": "UP",
2791
+ "correct": false,
2792
+ "source": "backtest"
2793
+ },
2794
+ {
2795
+ "date": "2025-08-26",
2796
+ "prediction": "DOWN",
2797
+ "actual": "DOWN",
2798
+ "correct": true,
2799
+ "source": "backtest"
2800
+ },
2801
+ {
2802
+ "date": "2025-08-28",
2803
+ "prediction": "DOWN",
2804
+ "actual": "DOWN",
2805
+ "correct": true,
2806
+ "source": "backtest"
2807
+ },
2808
+ {
2809
+ "date": "2025-08-29",
2810
+ "prediction": "DOWN",
2811
+ "actual": "DOWN",
2812
+ "correct": true,
2813
+ "source": "backtest"
2814
+ },
2815
+ {
2816
+ "date": "2025-09-01",
2817
+ "prediction": "DOWN",
2818
+ "actual": "UP",
2819
+ "correct": false,
2820
+ "source": "backtest"
2821
+ },
2822
+ {
2823
+ "date": "2025-09-02",
2824
+ "prediction": "DOWN",
2825
+ "actual": "DOWN",
2826
+ "correct": true,
2827
+ "source": "backtest"
2828
+ },
2829
+ {
2830
+ "date": "2025-09-03",
2831
+ "prediction": "UP",
2832
+ "actual": "UP",
2833
+ "correct": true,
2834
+ "source": "backtest"
2835
+ },
2836
+ {
2837
+ "date": "2025-09-04",
2838
+ "prediction": "DOWN",
2839
+ "actual": "UP",
2840
+ "correct": false,
2841
+ "source": "backtest"
2842
+ },
2843
+ {
2844
+ "date": "2025-09-05",
2845
+ "prediction": "UP",
2846
+ "actual": "DOWN",
2847
+ "correct": false,
2848
+ "source": "backtest"
2849
+ },
2850
+ {
2851
+ "date": "2025-09-08",
2852
+ "prediction": "UP",
2853
+ "actual": "UP",
2854
+ "correct": true,
2855
+ "source": "backtest"
2856
+ },
2857
+ {
2858
+ "date": "2025-09-09",
2859
+ "prediction": "DOWN",
2860
+ "actual": "UP",
2861
+ "correct": false,
2862
+ "source": "backtest"
2863
+ },
2864
+ {
2865
+ "date": "2025-09-10",
2866
+ "prediction": "UP",
2867
+ "actual": "UP",
2868
+ "correct": true,
2869
+ "source": "backtest"
2870
+ },
2871
+ {
2872
+ "date": "2025-09-11",
2873
+ "prediction": "UP",
2874
+ "actual": "UP",
2875
+ "correct": true,
2876
+ "source": "backtest"
2877
+ },
2878
+ {
2879
+ "date": "2025-09-12",
2880
+ "prediction": "UP",
2881
+ "actual": "UP",
2882
+ "correct": true,
2883
+ "source": "backtest"
2884
+ },
2885
+ {
2886
+ "date": "2025-09-15",
2887
+ "prediction": "DOWN",
2888
+ "actual": "DOWN",
2889
+ "correct": true,
2890
+ "source": "backtest"
2891
+ },
2892
+ {
2893
+ "date": "2025-09-16",
2894
+ "prediction": "DOWN",
2895
+ "actual": "UP",
2896
+ "correct": false,
2897
+ "source": "backtest"
2898
+ },
2899
+ {
2900
+ "date": "2025-09-17",
2901
+ "prediction": "UP",
2902
+ "actual": "UP",
2903
+ "correct": true,
2904
+ "source": "backtest"
2905
+ },
2906
+ {
2907
+ "date": "2025-09-18",
2908
+ "prediction": "DOWN",
2909
+ "actual": "UP",
2910
+ "correct": false,
2911
+ "source": "backtest"
2912
+ },
2913
+ {
2914
+ "date": "2025-09-19",
2915
+ "prediction": "DOWN",
2916
+ "actual": "DOWN",
2917
+ "correct": true,
2918
+ "source": "backtest"
2919
+ },
2920
+ {
2921
+ "date": "2025-09-22",
2922
+ "prediction": "DOWN",
2923
+ "actual": "DOWN",
2924
+ "correct": true,
2925
+ "source": "backtest"
2926
+ },
2927
+ {
2928
+ "date": "2025-09-23",
2929
+ "prediction": "DOWN",
2930
+ "actual": "DOWN",
2931
+ "correct": true,
2932
+ "source": "backtest"
2933
+ },
2934
+ {
2935
+ "date": "2025-09-24",
2936
+ "prediction": "DOWN",
2937
+ "actual": "DOWN",
2938
+ "correct": true,
2939
+ "source": "backtest"
2940
+ },
2941
+ {
2942
+ "date": "2025-09-25",
2943
+ "prediction": "DOWN",
2944
+ "actual": "DOWN",
2945
+ "correct": true,
2946
+ "source": "backtest"
2947
+ },
2948
+ {
2949
+ "date": "2025-09-26",
2950
+ "prediction": "UP",
2951
+ "actual": "DOWN",
2952
+ "correct": false,
2953
+ "source": "backtest"
2954
+ },
2955
+ {
2956
+ "date": "2025-09-29",
2957
+ "prediction": "UP",
2958
+ "actual": "UP",
2959
+ "correct": true,
2960
+ "source": "backtest"
2961
+ },
2962
+ {
2963
+ "date": "2025-09-30",
2964
+ "prediction": "UP",
2965
+ "actual": "DOWN",
2966
+ "correct": false,
2967
+ "source": "backtest"
2968
+ },
2969
+ {
2970
+ "date": "2025-10-01",
2971
+ "prediction": "UP",
2972
+ "actual": "UP",
2973
+ "correct": true,
2974
+ "source": "backtest"
2975
+ },
2976
+ {
2977
+ "date": "2025-10-03",
2978
+ "prediction": "UP",
2979
+ "actual": "UP",
2980
+ "correct": true,
2981
+ "source": "backtest"
2982
+ },
2983
+ {
2984
+ "date": "2025-10-06",
2985
+ "prediction": "UP",
2986
+ "actual": "UP",
2987
+ "correct": true,
2988
+ "source": "backtest"
2989
+ },
2990
+ {
2991
+ "date": "2025-10-07",
2992
+ "prediction": "UP",
2993
+ "actual": "UP",
2994
+ "correct": true,
2995
+ "source": "backtest"
2996
+ },
2997
+ {
2998
+ "date": "2025-10-08",
2999
+ "prediction": "DOWN",
3000
+ "actual": "DOWN",
3001
+ "correct": true,
3002
+ "source": "backtest"
3003
+ },
3004
+ {
3005
+ "date": "2025-10-09",
3006
+ "prediction": "DOWN",
3007
+ "actual": "UP",
3008
+ "correct": false,
3009
+ "source": "backtest"
3010
+ },
3011
+ {
3012
+ "date": "2025-10-10",
3013
+ "prediction": "DOWN",
3014
+ "actual": "UP",
3015
+ "correct": false,
3016
+ "source": "backtest"
3017
+ },
3018
+ {
3019
+ "date": "2025-10-13",
3020
+ "prediction": "DOWN",
3021
+ "actual": "DOWN",
3022
+ "correct": true,
3023
+ "source": "backtest"
3024
+ },
3025
+ {
3026
+ "date": "2025-10-14",
3027
+ "prediction": "DOWN",
3028
+ "actual": "DOWN",
3029
+ "correct": true,
3030
+ "source": "backtest"
3031
+ },
3032
+ {
3033
+ "date": "2025-10-15",
3034
+ "prediction": "UP",
3035
+ "actual": "UP",
3036
+ "correct": true,
3037
+ "source": "backtest"
3038
+ },
3039
+ {
3040
+ "date": "2025-10-16",
3041
+ "prediction": "UP",
3042
+ "actual": "UP",
3043
+ "correct": true,
3044
+ "source": "backtest"
3045
+ },
3046
+ {
3047
+ "date": "2025-10-17",
3048
+ "prediction": "DOWN",
3049
+ "actual": "UP",
3050
+ "correct": false,
3051
+ "source": "backtest"
3052
+ },
3053
+ {
3054
+ "date": "2025-10-20",
3055
+ "prediction": "UP",
3056
+ "actual": "UP",
3057
+ "correct": true,
3058
+ "source": "backtest"
3059
+ },
3060
+ {
3061
+ "date": "2025-10-21",
3062
+ "prediction": "UP",
3063
+ "actual": "DOWN",
3064
+ "correct": false,
3065
+ "source": "backtest"
3066
+ },
3067
+ {
3068
+ "date": "2025-10-23",
3069
+ "prediction": "DOWN",
3070
+ "actual": "DOWN",
3071
+ "correct": true,
3072
+ "source": "backtest"
3073
+ },
3074
+ {
3075
+ "date": "2025-10-24",
3076
+ "prediction": "UP",
3077
+ "actual": "DOWN",
3078
+ "correct": false,
3079
+ "source": "backtest"
3080
+ },
3081
+ {
3082
+ "date": "2025-10-27",
3083
+ "prediction": "DOWN",
3084
+ "actual": "UP",
3085
+ "correct": false,
3086
+ "source": "backtest"
3087
+ },
3088
  {
3089
+ "date": "2025-10-28",
3090
+ "prediction": "UP",
3091
+ "actual": "UP",
3092
+ "correct": true,
3093
+ "source": "backtest"
3094
+ },
3095
+ {
3096
+ "date": "2025-10-29",
3097
+ "prediction": "UP",
3098
+ "actual": "UP",
3099
+ "correct": true,
3100
+ "source": "backtest"
3101
+ },
3102
+ {
3103
+ "date": "2025-10-30",
3104
+ "prediction": "UP",
3105
+ "actual": "DOWN",
3106
+ "correct": false,
3107
+ "source": "backtest"
3108
+ },
3109
+ {
3110
+ "date": "2025-10-31",
3111
+ "prediction": "DOWN",
3112
+ "actual": "DOWN",
3113
+ "correct": true,
3114
+ "source": "backtest"
3115
+ },
3116
+ {
3117
+ "date": "2025-11-03",
3118
+ "prediction": "UP",
3119
+ "actual": "UP",
3120
+ "correct": true,
3121
+ "source": "backtest"
3122
+ },
3123
+ {
3124
+ "date": "2025-11-04",
3125
+ "prediction": "DOWN",
3126
+ "actual": "DOWN",
3127
+ "correct": true,
3128
+ "source": "backtest"
3129
+ },
3130
+ {
3131
+ "date": "2025-11-06",
3132
+ "prediction": "UP",
3133
+ "actual": "DOWN",
3134
+ "correct": false,
3135
+ "source": "backtest"
3136
+ },
3137
+ {
3138
+ "date": "2025-11-07",
3139
+ "prediction": "UP",
3140
+ "actual": "DOWN",
3141
+ "correct": false,
3142
+ "source": "backtest"
3143
+ },
3144
+ {
3145
+ "date": "2025-11-10",
3146
+ "prediction": "UP",
3147
+ "actual": "UP",
3148
+ "correct": true,
3149
+ "source": "backtest"
3150
+ },
3151
+ {
3152
+ "date": "2025-11-11",
3153
+ "prediction": "DOWN",
3154
+ "actual": "UP",
3155
+ "correct": false,
3156
+ "source": "backtest"
3157
+ },
3158
+ {
3159
+ "date": "2025-11-12",
3160
+ "prediction": "DOWN",
3161
+ "actual": "UP",
3162
+ "correct": false,
3163
+ "source": "backtest"
3164
+ },
3165
+ {
3166
+ "date": "2025-11-13",
3167
+ "prediction": "DOWN",
3168
+ "actual": "DOWN",
3169
+ "correct": true,
3170
+ "source": "backtest"
3171
+ },
3172
+ {
3173
+ "date": "2025-11-14",
3174
+ "prediction": "UP",
3175
+ "actual": "UP",
3176
+ "correct": true,
3177
+ "source": "backtest"
3178
+ },
3179
+ {
3180
+ "date": "2025-11-17",
3181
+ "prediction": "UP",
3182
+ "actual": "UP",
3183
+ "correct": true,
3184
+ "source": "backtest"
3185
+ },
3186
+ {
3187
+ "date": "2025-11-18",
3188
+ "prediction": "UP",
3189
+ "actual": "DOWN",
3190
+ "correct": false,
3191
+ "source": "backtest"
3192
+ },
3193
+ {
3194
+ "date": "2025-11-19",
3195
+ "prediction": "DOWN",
3196
+ "actual": "UP",
3197
+ "correct": false,
3198
+ "source": "backtest"
3199
+ },
3200
+ {
3201
+ "date": "2025-11-20",
3202
+ "prediction": "UP",
3203
+ "actual": "UP",
3204
+ "correct": true,
3205
+ "source": "backtest"
3206
+ },
3207
+ {
3208
+ "date": "2025-11-21",
3209
+ "prediction": "UP",
3210
+ "actual": "DOWN",
3211
+ "correct": false,
3212
+ "source": "backtest"
3213
+ },
3214
+ {
3215
+ "date": "2025-11-24",
3216
+ "prediction": "DOWN",
3217
+ "actual": "DOWN",
3218
+ "correct": true,
3219
+ "source": "backtest"
3220
+ },
3221
+ {
3222
+ "date": "2025-11-25",
3223
+ "prediction": "DOWN",
3224
+ "actual": "DOWN",
3225
+ "correct": true,
3226
+ "source": "backtest"
3227
+ },
3228
+ {
3229
+ "date": "2025-11-26",
3230
+ "prediction": "DOWN",
3231
+ "actual": "UP",
3232
+ "correct": false,
3233
+ "source": "backtest"
3234
+ },
3235
+ {
3236
+ "date": "2025-11-27",
3237
+ "prediction": "UP",
3238
+ "actual": "UP",
3239
+ "correct": true,
3240
+ "source": "backtest"
3241
+ },
3242
+ {
3243
+ "date": "2025-11-28",
3244
+ "prediction": "UP",
3245
+ "actual": "UP",
3246
+ "correct": true,
3247
+ "source": "backtest"
3248
+ },
3249
+ {
3250
+ "date": "2025-12-01",
3251
+ "prediction": "DOWN",
3252
+ "actual": "DOWN",
3253
+ "correct": true,
3254
+ "source": "backtest"
3255
+ },
3256
+ {
3257
+ "date": "2025-12-02",
3258
+ "prediction": "UP",
3259
+ "actual": "DOWN",
3260
+ "correct": false,
3261
+ "source": "backtest"
3262
+ },
3263
+ {
3264
+ "date": "2025-12-03",
3265
+ "prediction": "DOWN",
3266
+ "actual": "DOWN",
3267
+ "correct": true,
3268
+ "source": "backtest"
3269
+ },
3270
+ {
3271
+ "date": "2025-12-04",
3272
+ "prediction": "UP",
3273
+ "actual": "UP",
3274
+ "correct": true,
3275
+ "source": "backtest"
3276
+ },
3277
+ {
3278
+ "date": "2025-12-05",
3279
+ "prediction": "UP",
3280
+ "actual": "UP",
3281
+ "correct": true,
3282
+ "source": "backtest"
3283
+ },
3284
+ {
3285
+ "date": "2025-12-08",
3286
+ "prediction": "DOWN",
3287
+ "actual": "DOWN",
3288
+ "correct": true,
3289
+ "source": "backtest"
3290
+ },
3291
+ {
3292
+ "date": "2025-12-09",
3293
+ "prediction": "DOWN",
3294
+ "actual": "DOWN",
3295
+ "correct": true,
3296
+ "source": "backtest"
3297
+ },
3298
+ {
3299
+ "date": "2025-12-10",
3300
+ "prediction": "DOWN",
3301
+ "actual": "DOWN",
3302
+ "correct": true,
3303
+ "source": "backtest"
3304
+ },
3305
+ {
3306
+ "date": "2025-12-11",
3307
+ "prediction": "UP",
3308
+ "actual": "UP",
3309
+ "correct": true,
3310
+ "source": "backtest"
3311
+ },
3312
+ {
3313
+ "date": "2025-12-12",
3314
+ "prediction": "UP",
3315
+ "actual": "UP",
3316
+ "correct": true,
3317
+ "source": "backtest"
3318
+ },
3319
+ {
3320
+ "date": "2025-12-15",
3321
+ "prediction": "UP",
3322
+ "actual": "DOWN",
3323
+ "correct": false,
3324
+ "source": "backtest"
3325
+ },
3326
+ {
3327
+ "date": "2025-12-16",
3328
+ "prediction": "UP",
3329
+ "actual": "DOWN",
3330
+ "correct": false,
3331
+ "source": "backtest"
3332
+ },
3333
+ {
3334
+ "date": "2025-12-17",
3335
+ "prediction": "UP",
3336
+ "actual": "DOWN",
3337
+ "correct": false,
3338
+ "source": "backtest"
3339
+ },
3340
+ {
3341
+ "date": "2025-12-18",
3342
+ "prediction": "UP",
3343
+ "actual": "UP",
3344
+ "correct": true,
3345
+ "source": "backtest"
3346
+ },
3347
+ {
3348
+ "date": "2025-12-19",
3349
+ "prediction": "UP",
3350
+ "actual": "UP",
3351
+ "correct": true,
3352
+ "source": "backtest"
3353
+ },
3354
+ {
3355
+ "date": "2025-12-22",
3356
+ "prediction": "UP",
3357
+ "actual": "UP",
3358
+ "correct": true,
3359
+ "source": "backtest"
3360
+ },
3361
+ {
3362
+ "date": "2025-12-23",
3363
+ "prediction": "DOWN",
3364
+ "actual": "UP",
3365
+ "correct": false,
3366
+ "source": "backtest"
3367
+ },
3368
+ {
3369
+ "date": "2025-12-24",
3370
+ "prediction": "DOWN",
3371
+ "actual": "DOWN",
3372
+ "correct": true,
3373
+ "source": "backtest"
3374
+ },
3375
+ {
3376
+ "date": "2025-12-26",
3377
+ "prediction": "DOWN",
3378
+ "actual": "DOWN",
3379
+ "correct": true,
3380
+ "source": "backtest"
3381
+ },
3382
+ {
3383
+ "date": "2025-12-29",
3384
+ "prediction": "DOWN",
3385
+ "actual": "DOWN",
3386
+ "correct": true,
3387
+ "source": "backtest"
3388
+ },
3389
+ {
3390
+ "date": "2025-12-30",
3391
+ "prediction": "UP",
3392
+ "actual": "UP",
3393
+ "correct": true,
3394
+ "source": "backtest"
3395
+ },
3396
+ {
3397
+ "date": "2025-12-31",
3398
+ "prediction": "UP",
3399
+ "actual": "UP",
3400
+ "correct": true,
3401
+ "source": "backtest"
3402
+ },
3403
+ {
3404
+ "date": "2026-01-01",
3405
+ "prediction": "UP",
3406
+ "actual": "DOWN",
3407
+ "correct": false,
3408
+ "source": "backtest"
3409
+ },
3410
+ {
3411
+ "date": "2026-01-02",
3412
+ "prediction": "DOWN",
3413
+ "actual": "UP",
3414
+ "correct": false,
3415
+ "source": "backtest"
3416
+ },
3417
+ {
3418
+ "date": "2026-01-05",
3419
+ "prediction": "DOWN",
3420
+ "actual": "DOWN",
3421
+ "correct": true,
3422
+ "source": "backtest"
3423
+ },
3424
+ {
3425
+ "date": "2026-01-06",
3426
+ "prediction": "DOWN",
3427
+ "actual": "DOWN",
3428
+ "correct": true,
3429
+ "source": "backtest"
3430
+ },
3431
+ {
3432
+ "date": "2026-01-07",
3433
+ "prediction": "UP",
3434
+ "actual": "UP",
3435
+ "correct": true,
3436
+ "source": "backtest"
3437
+ },
3438
+ {
3439
+ "date": "2026-01-08",
3440
+ "prediction": "UP",
3441
+ "actual": "DOWN",
3442
+ "correct": false,
3443
+ "source": "backtest"
3444
+ },
3445
+ {
3446
+ "date": "2026-01-09",
3447
+ "prediction": "UP",
3448
+ "actual": "DOWN",
3449
+ "correct": false,
3450
+ "source": "backtest"
3451
+ },
3452
+ {
3453
+ "date": "2026-01-12",
3454
+ "prediction": "UP",
3455
+ "actual": "UP",
3456
+ "correct": true,
3457
+ "source": "backtest"
3458
+ },
3459
+ {
3460
+ "date": "2026-01-13",
3461
+ "prediction": "DOWN",
3462
+ "actual": "DOWN",
3463
+ "correct": true,
3464
+ "source": "backtest"
3465
+ },
3466
+ {
3467
+ "date": "2026-01-14",
3468
+ "prediction": "UP",
3469
+ "actual": "UP",
3470
+ "correct": true,
3471
+ "source": "backtest"
3472
+ },
3473
+ {
3474
+ "date": "2026-01-16",
3475
+ "prediction": "UP",
3476
+ "actual": "UP",
3477
+ "correct": true,
3478
+ "source": "backtest"
3479
+ },
3480
+ {
3481
+ "date": "2026-01-19",
3482
+ "prediction": "DOWN",
3483
+ "actual": "DOWN",
3484
+ "correct": true,
3485
+ "source": "backtest"
3486
+ },
3487
+ {
3488
+ "date": "2026-01-20",
3489
+ "prediction": "UP",
3490
+ "actual": "DOWN",
3491
+ "correct": false,
3492
+ "source": "backtest"
3493
+ },
3494
+ {
3495
+ "date": "2026-01-21",
3496
+ "prediction": "UP",
3497
+ "actual": "DOWN",
3498
+ "correct": false,
3499
+ "source": "backtest"
3500
+ },
3501
+ {
3502
+ "date": "2026-01-22",
3503
+ "prediction": "UP",
3504
+ "actual": "UP",
3505
+ "correct": true,
3506
+ "source": "backtest"
3507
+ },
3508
+ {
3509
+ "date": "2026-01-23",
3510
+ "prediction": "UP",
3511
+ "actual": "DOWN",
3512
+ "correct": false,
3513
+ "source": "backtest"
3514
+ },
3515
+ {
3516
+ "date": "2026-01-27",
3517
+ "prediction": "UP",
3518
+ "actual": "UP",
3519
+ "correct": true,
3520
+ "source": "backtest"
3521
+ },
3522
+ {
3523
+ "date": "2026-01-28",
3524
+ "prediction": "UP",
3525
+ "actual": "UP",
3526
+ "correct": true,
3527
+ "source": "backtest"
3528
+ },
3529
+ {
3530
+ "date": "2026-01-29",
3531
+ "prediction": "UP",
3532
+ "actual": "UP",
3533
+ "correct": true,
3534
+ "source": "backtest"
3535
+ },
3536
+ {
3537
+ "date": "2026-01-30",
3538
+ "prediction": "DOWN",
3539
+ "actual": "DOWN",
3540
+ "correct": true,
3541
+ "source": "backtest"
3542
+ },
3543
+ {
3544
+ "date": "2026-02-01",
3545
+ "prediction": "UP",
3546
+ "actual": "DOWN",
3547
+ "correct": false,
3548
+ "source": "backtest"
3549
+ },
3550
+ {
3551
+ "date": "2026-02-02",
3552
+ "prediction": "UP",
3553
+ "actual": "UP",
3554
+ "correct": true,
3555
+ "source": "backtest"
3556
+ },
3557
+ {
3558
+ "date": "2026-02-03",
3559
+ "prediction": "DOWN",
3560
+ "actual": "UP",
3561
+ "correct": false,
3562
+ "source": "backtest"
3563
+ },
3564
+ {
3565
+ "date": "2026-02-04",
3566
+ "prediction": "DOWN",
3567
+ "actual": "DOWN",
3568
+ "correct": true,
3569
+ "source": "backtest"
3570
+ },
3571
+ {
3572
+ "date": "2026-02-05",
3573
+ "prediction": "DOWN",
3574
+ "actual": "DOWN",
3575
+ "correct": true,
3576
+ "source": "backtest"
3577
+ },
3578
+ {
3579
+ "date": "2026-02-06",
3580
+ "prediction": "UP",
3581
+ "actual": "UP",
3582
+ "correct": true,
3583
+ "source": "backtest"
3584
+ },
3585
+ {
3586
+ "date": "2026-02-09",
3587
+ "prediction": "DOWN",
3588
+ "actual": "UP",
3589
+ "correct": false,
3590
+ "source": "backtest"
3591
+ },
3592
+ {
3593
+ "date": "2026-02-10",
3594
+ "prediction": "DOWN",
3595
+ "actual": "UP",
3596
+ "correct": false,
3597
+ "source": "backtest"
3598
+ },
3599
+ {
3600
+ "date": "2026-02-11",
3601
+ "prediction": "DOWN",
3602
+ "actual": "UP",
3603
+ "correct": false,
3604
+ "source": "backtest"
3605
+ },
3606
+ {
3607
+ "date": "2026-02-12",
3608
+ "prediction": "UP",
3609
+ "actual": "DOWN",
3610
+ "correct": false,
3611
+ "source": "backtest"
3612
+ },
3613
+ {
3614
+ "date": "2026-02-13",
3615
+ "prediction": "DOWN",
3616
+ "actual": "DOWN",
3617
+ "correct": true,
3618
+ "source": "backtest"
3619
+ },
3620
+ {
3621
+ "date": "2026-02-16",
3622
+ "prediction": "UP",
3623
+ "actual": "UP",
3624
+ "correct": true,
3625
+ "source": "backtest"
3626
+ },
3627
+ {
3628
+ "date": "2026-02-17",
3629
+ "prediction": "DOWN",
3630
+ "actual": "UP",
3631
+ "correct": false,
3632
+ "source": "backtest"
3633
+ },
3634
+ {
3635
+ "date": "2026-02-18",
3636
+ "prediction": "DOWN",
3637
+ "actual": "UP",
3638
+ "correct": false,
3639
+ "source": "backtest"
3640
+ },
3641
+ {
3642
+ "date": "2026-02-19",
3643
+ "prediction": "DOWN",
3644
+ "actual": "DOWN",
3645
+ "correct": true,
3646
+ "source": "backtest"
3647
+ },
3648
+ {
3649
+ "date": "2026-02-20",
3650
+ "prediction": "UP",
3651
+ "actual": "DOWN",
3652
+ "correct": false,
3653
+ "source": "backtest"
3654
+ },
3655
+ {
3656
+ "date": "2026-02-23",
3657
+ "prediction": "UP",
3658
+ "actual": "UP",
3659
+ "correct": true,
3660
+ "source": "backtest"
3661
+ },
3662
+ {
3663
+ "date": "2026-02-24",
3664
+ "prediction": "DOWN",
3665
+ "actual": "DOWN",
3666
+ "correct": true,
3667
+ "source": "backtest"
3668
+ },
3669
+ {
3670
+ "date": "2026-02-25",
3671
+ "prediction": "UP",
3672
+ "actual": "UP",
3673
+ "correct": true,
3674
+ "source": "backtest"
3675
+ },
3676
+ {
3677
+ "date": "2026-02-26",
3678
+ "prediction": "DOWN",
3679
+ "actual": "DOWN",
3680
+ "correct": true,
3681
+ "source": "backtest"
3682
+ },
3683
+ {
3684
+ "date": "2026-02-27",
3685
+ "prediction": "DOWN",
3686
+ "actual": "DOWN",
3687
+ "correct": true,
3688
+ "source": "backtest"
3689
+ },
3690
+ {
3691
+ "date": "2026-03-02",
3692
+ "prediction": "UP",
3693
+ "actual": "DOWN",
3694
+ "correct": false,
3695
+ "source": "backtest"
3696
+ },
3697
+ {
3698
+ "date": "2026-03-04",
3699
+ "prediction": "UP",
3700
+ "actual": "DOWN",
3701
+ "correct": false,
3702
+ "source": "backtest"
3703
+ },
3704
+ {
3705
+ "date": "2026-03-05",
3706
+ "prediction": "UP",
3707
+ "actual": "UP",
3708
+ "correct": true,
3709
+ "source": "backtest"
3710
+ },
3711
+ {
3712
+ "date": "2026-03-06",
3713
+ "prediction": "UP",
3714
+ "actual": "DOWN",
3715
+ "correct": false,
3716
+ "source": "backtest"
3717
+ },
3718
+ {
3719
+ "date": "2026-03-09",
3720
+ "prediction": "UP",
3721
+ "actual": "DOWN",
3722
+ "correct": false,
3723
+ "source": "backtest"
3724
+ },
3725
+ {
3726
+ "date": "2026-03-10",
3727
+ "prediction": "UP",
3728
+ "actual": "UP",
3729
+ "correct": true,
3730
+ "source": "backtest"
3731
+ },
3732
+ {
3733
+ "date": "2026-03-11",
3734
+ "prediction": "UP",
3735
+ "actual": "DOWN",
3736
+ "correct": false,
3737
+ "source": "backtest"
3738
+ },
3739
+ {
3740
+ "date": "2026-03-12",
3741
+ "prediction": "UP",
3742
+ "actual": "DOWN",
3743
+ "correct": false,
3744
+ "source": "backtest"
3745
+ },
3746
+ {
3747
+ "date": "2026-03-13",
3748
+ "prediction": "UP",
3749
+ "actual": "DOWN",
3750
+ "correct": false,
3751
+ "source": "backtest"
3752
+ },
3753
+ {
3754
+ "date": "2026-03-16",
3755
+ "prediction": "UP",
3756
+ "actual": "UP",
3757
+ "correct": true,
3758
+ "source": "backtest"
3759
+ },
3760
+ {
3761
+ "date": "2026-03-17",
3762
+ "prediction": "UP",
3763
+ "actual": "UP",
3764
+ "correct": true,
3765
+ "source": "backtest"
3766
+ },
3767
+ {
3768
+ "date": "2026-03-18",
3769
+ "prediction": "UP",
3770
+ "actual": "UP",
3771
+ "correct": true,
3772
+ "source": "backtest"
3773
+ },
3774
+ {
3775
+ "date": "2026-03-19",
3776
+ "prediction": "DOWN",
3777
+ "actual": "DOWN",
3778
+ "correct": true,
3779
+ "source": "backtest"
3780
+ },
3781
+ {
3782
+ "date": "2026-03-20",
3783
+ "prediction": "UP",
3784
+ "actual": "UP",
3785
+ "correct": true,
3786
+ "source": "backtest"
3787
+ },
3788
+ {
3789
+ "date": "2026-03-23",
3790
+ "prediction": "DOWN",
3791
+ "actual": "DOWN",
3792
+ "correct": true,
3793
+ "source": "backtest"
3794
+ },
3795
+ {
3796
+ "date": "2026-03-24",
3797
+ "prediction": "UP",
3798
+ "actual": "UP",
3799
+ "correct": true,
3800
+ "source": "backtest"
3801
+ },
3802
+ {
3803
+ "date": "2026-03-25",
3804
+ "prediction": "UP",
3805
+ "actual": "UP",
3806
+ "correct": true,
3807
+ "source": "backtest"
3808
+ },
3809
+ {
3810
+ "date": "2026-03-27",
3811
+ "prediction": "UP",
3812
+ "actual": "DOWN",
3813
+ "correct": false,
3814
+ "source": "backtest"
3815
+ },
3816
+ {
3817
+ "date": "2026-03-30",
3818
+ "prediction": "DOWN",
3819
+ "actual": "DOWN",
3820
+ "correct": true,
3821
+ "source": "backtest"
3822
+ },
3823
+ {
3824
+ "date": "2026-04-01",
3825
+ "prediction": "UP",
3826
+ "actual": "UP",
3827
+ "correct": true,
3828
+ "source": "backtest"
3829
+ },
3830
+ {
3831
+ "date": "2026-04-02",
3832
+ "prediction": "UP",
3833
+ "actual": "DOWN",
3834
+ "correct": false,
3835
+ "source": "backtest"
3836
+ },
3837
+ {
3838
+ "date": "2026-04-06",
3839
+ "prediction": "UP",
3840
+ "actual": "UP",
3841
+ "correct": true,
3842
+ "source": "backtest"
3843
+ },
3844
+ {
3845
+ "date": "2026-04-07",
3846
+ "prediction": "UP",
3847
+ "actual": "UP",
3848
+ "correct": true,
3849
+ "source": "backtest"
3850
+ },
3851
+ {
3852
+ "date": "2026-04-09",
3853
+ "prediction": "UP",
3854
+ "actual": "UP",
3855
+ "correct": true,
3856
+ "source": "backtest"
3857
+ },
3858
+ {
3859
+ "date": "2026-04-10",
3860
+ "prediction": "UP",
3861
+ "actual": "UP",
3862
+ "correct": true,
3863
+ "source": "backtest"
3864
+ },
3865
+ {
3866
+ "date": "2026-04-13",
3867
+ "prediction": "UP",
3868
+ "actual": "DOWN",
3869
+ "correct": false,
3870
+ "source": "backtest"
3871
+ },
3872
+ {
3873
+ "date": "2026-04-15",
3874
+ "prediction": "UP",
3875
+ "actual": "UP",
3876
+ "correct": true,
3877
+ "source": "backtest"
3878
+ },
3879
+ {
3880
+ "date": "2026-04-16",
3881
+ "prediction": "DOWN",
3882
+ "actual": "DOWN",
3883
+ "correct": true,
3884
+ "source": "backtest"
3885
+ },
3886
+ {
3887
+ "date": "2026-04-17",
3888
+ "prediction": "UP",
3889
+ "actual": "UP",
3890
+ "correct": true,
3891
+ "source": "backtest"
3892
+ },
3893
+ {
3894
+ "date": "2026-04-21",
3895
+ "prediction": "UP",
3896
+ "actual": "UP",
3897
+ "correct": true,
3898
+ "source": "backtest"
3899
+ },
3900
+ {
3901
+ "date": "2026-04-22",
3902
+ "prediction": "UP",
3903
+ "actual": "DOWN",
3904
+ "correct": false,
3905
+ "source": "backtest"
3906
+ },
3907
+ {
3908
+ "date": "2026-04-23",
3909
+ "prediction": "DOWN",
3910
+ "actual": "DOWN",
3911
+ "correct": true,
3912
+ "source": "backtest"
3913
+ },
3914
+ {
3915
+ "date": "2026-04-24",
3916
+ "prediction": "DOWN",
3917
+ "actual": "DOWN",
3918
+ "correct": true,
3919
+ "source": "backtest"
3920
+ },
3921
+ {
3922
+ "date": "2026-04-27",
3923
+ "prediction": "DOWN",
3924
+ "actual": "UP",
3925
+ "correct": false,
3926
+ "source": "backtest"
3927
+ },
3928
+ {
3929
+ "date": "2026-04-28",
3930
+ "prediction": "DOWN",
3931
+ "actual": "DOWN",
3932
+ "correct": true,
3933
+ "source": "backtest"
3934
+ },
3935
+ {
3936
+ "date": "2026-04-29",
3937
+ "prediction": "UP",
3938
+ "actual": "UP",
3939
+ "correct": true,
3940
+ "source": "backtest"
3941
+ },
3942
+ {
3943
+ "date": "2026-04-30",
3944
+ "prediction": "UP",
3945
+ "actual": "DOWN",
3946
+ "correct": false,
3947
+ "source": "backtest"
3948
+ },
3949
+ {
3950
+ "date": "2026-05-04",
3951
+ "prediction": "UP",
3952
+ "actual": "UP",
3953
+ "correct": true,
3954
+ "source": "backtest"
3955
+ },
3956
+ {
3957
+ "date": "2026-05-05",
3958
+ "prediction": "UP",
3959
+ "actual": "DOWN",
3960
+ "correct": false,
3961
+ "source": "backtest"
3962
+ },
3963
+ {
3964
+ "date": "2026-05-06",
3965
+ "prediction": "UP",
3966
+ "actual": "UP",
3967
+ "correct": true,
3968
+ "source": "backtest"
3969
+ },
3970
+ {
3971
+ "date": "2026-05-07",
3972
+ "prediction": "UP",
3973
+ "actual": "UP",
3974
+ "correct": true,
3975
+ "source": "backtest"
3976
+ },
3977
+ {
3978
+ "date": "2026-05-08",
3979
+ "prediction": "UP",
3980
+ "actual": "DOWN",
3981
+ "correct": false,
3982
+ "source": "backtest"
3983
+ },
3984
+ {
3985
+ "date": "2026-05-11",
3986
+ "prediction": "UP",
3987
+ "actual": "DOWN",
3988
+ "correct": false,
3989
+ "source": "backtest"
3990
+ },
3991
+ {
3992
+ "date": "2026-05-12",
3993
  "prediction": "DOWN",
3994
+ "actual": "DOWN",
3995
+ "correct": true,
3996
+ "source": "backtest"
3997
+ },
3998
+ {
3999
+ "date": "2026-05-13",
4000
+ "prediction": "UP",
4001
+ "actual": "DOWN",
4002
+ "correct": false,
4003
+ "source": "backtest"
4004
+ },
4005
+ {
4006
+ "date": "2026-05-14",
4007
+ "prediction": "UP",
4008
  "actual": "UP",
4009
+ "correct": true,
4010
+ "source": "backtest"
4011
+ },
4012
+ {
4013
+ "date": "2026-05-15",
4014
+ "prediction": "UP",
4015
+ "actual": "DOWN",
4016
+ "correct": false,
4017
+ "source": "backtest"
4018
+ },
4019
+ {
4020
+ "date": "2026-05-18",
4021
+ "prediction": "UP",
4022
+ "actual": "DOWN",
4023
+ "correct": false,
4024
+ "source": "backtest"
4025
+ },
4026
+ {
4027
+ "date": "2026-05-19",
4028
+ "prediction": "UP",
4029
+ "actual": "DOWN",
4030
+ "correct": false,
4031
+ "source": "backtest"
4032
+ },
4033
+ {
4034
+ "date": "2026-05-20",
4035
+ "prediction": "UP",
4036
+ "actual": "DOWN",
4037
+ "correct": false,
4038
+ "source": "backtest"
4039
+ },
4040
+ {
4041
+ "date": "2026-05-21",
4042
+ "prediction": "UP",
4043
+ "actual": "UP",
4044
+ "correct": true,
4045
+ "source": "backtest"
4046
  }
4047
  ],
4048
+ "accuracy": null,
4049
+ "total": 0,
4050
+ "correct_count": 0,
4051
+ "backtest_count": 190,
4052
+ "live_count": 0
 
 
 
 
 
 
 
 
 
 
4053
  }
4054
  }
models/nifty_forecaster/__init__.py ADDED
@@ -0,0 +1 @@
 
 
1
+ """Daily forecaster package for NIFTY 50 and NIFTY BANK."""
models/nifty_forecaster/__pycache__/train.cpython-311.pyc ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:9b5546ddd8a8d9b7f823a9ab7eb795a46e93ced76a3ef8d0f7b641874306f601
3
+ size 108230
models/nifty_forecaster/outputs/forecaster_blend_details.json ADDED
@@ -0,0 +1,48 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "NIFTY 50": {
3
+ "threshold": 0.534,
4
+ "validation_accuracy": 0.5886524822695035,
5
+ "test_accuracy": 0.7070707070707071,
6
+ "validation_prob_std": 0.06819211926509922,
7
+ "test_prob_std": 0.06318472000353532,
8
+ "test_prob_min": 0.3750263841589948,
9
+ "test_prob_max": 0.6422291532299811,
10
+ "active_models": [
11
+ {
12
+ "model": "nifty50_price_options_2024apr_d4_l10_s7",
13
+ "train_end": "2024-04-30",
14
+ "weight": 0.34099525,
15
+ "feature_count": 204
16
+ },
17
+ {
18
+ "model": "nifty50_daily_all_2024h1_top140_d4_l10_s11",
19
+ "train_end": "2024-06-30",
20
+ "weight": 0.4951866,
21
+ "feature_count": 140
22
+ },
23
+ {
24
+ "model": "nifty50_intraday_all_2025q1_top160_d4_l10_s11",
25
+ "train_end": "2025-03-31",
26
+ "weight": 0.16381815,
27
+ "feature_count": 160
28
+ }
29
+ ]
30
+ },
31
+ "NIFTY BANK": {
32
+ "threshold": 0.441,
33
+ "validation_accuracy": 0.5212765957446809,
34
+ "test_accuracy": 0.5606060606060606,
35
+ "validation_prob_std": 0.0770807821599353,
36
+ "test_prob_std": 0.08243050415771436,
37
+ "test_prob_min": 0.3052152550867235,
38
+ "test_prob_max": 0.8752468404729982,
39
+ "active_models": [
40
+ {
41
+ "model": "intraday_logit_2024h1",
42
+ "train_end": "2024-06-30",
43
+ "weight": 1.0,
44
+ "feature_count": 543
45
+ }
46
+ ]
47
+ }
48
+ }
models/nifty_forecaster/outputs/forecaster_latest.csv ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ symbol,latest_forecast_date,latest_forecast_for,latest_forecast_prob_up,latest_forecast_signal,threshold,validation_accuracy,test_accuracy,validation_prob_std,test_prob_std,test_prob_min,test_prob_max,target_low,target_high
2
+ NIFTY 50,2026-06-09,next trading bar after 2026-06-09,0.5295140762033614,UP,0.534,0.5886524822695035,0.7070707070707071,0.06819211926509922,0.06318472000353532,0.3750263841589948,0.6422291532299811,0.6,0.605
3
+ NIFTY BANK,2026-06-09,next trading bar after 2026-06-09,0.5126390845653349,UP,0.441,0.5212765957446809,0.5606060606060606,0.0770807821599353,0.08243050415771436,0.3052152550867235,0.8752468404729982,0.6,0.605
models/nifty_forecaster/outputs/forecaster_latest_forecasts.csv ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ symbol,latest_forecast_date,latest_forecast_for,latest_forecast_prob_up,latest_forecast_signal,threshold,validation_accuracy,test_accuracy,validation_prob_std,test_prob_std,test_prob_min,test_prob_max,target_low,target_high
2
+ NIFTY 50,2026-06-09,next trading bar after 2026-06-09,0.5295140762033614,UP,0.534,0.5886524822695035,0.7070707070707071,0.06819211926509922,0.06318472000353532,0.3750263841589948,0.6422291532299811,0.6,0.605
3
+ NIFTY BANK,2026-06-09,next trading bar after 2026-06-09,0.5126390845653349,UP,0.441,0.5212765957446809,0.5606060606060606,0.0770807821599353,0.08243050415771436,0.3052152550867235,0.8752468404729982,0.6,0.605
models/nifty_forecaster/outputs/forecaster_predictions.csv ADDED
@@ -0,0 +1,397 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ forecast_date,target_date,target,symbol,prob_up,raw_pred,pred,decision_overlay_changed,threshold
2
+ 2025-08-18,2025-08-19,1.0,NIFTY 50,0.550673919371572,1,1,False,0.534
3
+ 2025-08-19,2025-08-20,1.0,NIFTY 50,0.46984246397060614,0,0,False,0.534
4
+ 2025-08-20,2025-08-21,1.0,NIFTY 50,0.5107609930854999,0,0,False,0.534
5
+ 2025-08-21,2025-08-22,0.0,NIFTY 50,0.4632950374631059,0,1,True,0.534
6
+ 2025-08-22,2025-08-25,1.0,NIFTY 50,0.6003826831751942,1,1,False,0.534
7
+ 2025-08-25,2025-08-26,0.0,NIFTY 50,0.47659600602735025,0,0,False,0.534
8
+ 2025-08-26,2025-08-28,0.0,NIFTY 50,0.5469654969365931,1,1,False,0.534
9
+ 2025-08-28,2025-08-29,0.0,NIFTY 50,0.575833242456593,1,1,False,0.534
10
+ 2025-08-29,2025-09-01,1.0,NIFTY 50,0.43086324146866484,0,0,False,0.534
11
+ 2025-09-01,2025-09-02,0.0,NIFTY 50,0.5297880876220555,0,0,False,0.534
12
+ 2025-09-02,2025-09-03,1.0,NIFTY 50,0.4033685641524835,0,0,False,0.534
13
+ 2025-09-03,2025-09-04,1.0,NIFTY 50,0.5957872785915961,1,1,False,0.534
14
+ 2025-09-04,2025-09-05,1.0,NIFTY 50,0.5962765283135939,1,1,False,0.534
15
+ 2025-09-05,2025-09-08,1.0,NIFTY 50,0.5239958967296331,0,1,True,0.534
16
+ 2025-09-08,2025-09-09,1.0,NIFTY 50,0.5857915061019529,1,1,False,0.534
17
+ 2025-09-09,2025-09-10,1.0,NIFTY 50,0.565997089967574,1,1,False,0.534
18
+ 2025-09-10,2025-09-11,1.0,NIFTY 50,0.5537788359824963,1,1,False,0.534
19
+ 2025-09-11,2025-09-12,1.0,NIFTY 50,0.5815708481275226,1,1,False,0.534
20
+ 2025-09-12,2025-09-15,0.0,NIFTY 50,0.5492869491896248,1,1,False,0.534
21
+ 2025-09-15,2025-09-16,1.0,NIFTY 50,0.5415783546835594,1,1,False,0.534
22
+ 2025-09-16,2025-09-17,1.0,NIFTY 50,0.5163222680372355,0,0,False,0.534
23
+ 2025-09-17,2025-09-18,1.0,NIFTY 50,0.5538444392275885,1,1,False,0.534
24
+ 2025-09-18,2025-09-19,0.0,NIFTY 50,0.5847717751384091,1,0,True,0.534
25
+ 2025-09-19,2025-09-22,0.0,NIFTY 50,0.5694816674251351,1,0,True,0.534
26
+ 2025-09-22,2025-09-23,0.0,NIFTY 50,0.5182989023287483,0,0,False,0.534
27
+ 2025-09-23,2025-09-24,0.0,NIFTY 50,0.4807204485698447,0,0,False,0.534
28
+ 2025-09-24,2025-09-25,0.0,NIFTY 50,0.49974101910385627,0,0,False,0.534
29
+ 2025-09-25,2025-09-26,0.0,NIFTY 50,0.4606135690412628,0,0,False,0.534
30
+ 2025-09-26,2025-09-29,1.0,NIFTY 50,0.56878595491037,1,1,False,0.534
31
+ 2025-09-29,2025-09-30,0.0,NIFTY 50,0.5319502400859184,0,0,False,0.534
32
+ 2025-09-30,2025-10-01,1.0,NIFTY 50,0.5650564023420587,1,1,False,0.534
33
+ 2025-10-01,2025-10-03,1.0,NIFTY 50,0.5848533269325822,1,1,False,0.534
34
+ 2025-10-03,2025-10-06,1.0,NIFTY 50,0.5452794088802748,1,1,False,0.534
35
+ 2025-10-06,2025-10-07,1.0,NIFTY 50,0.593681352002759,1,1,False,0.534
36
+ 2025-10-07,2025-10-08,0.0,NIFTY 50,0.4863990507822798,0,0,False,0.534
37
+ 2025-10-08,2025-10-09,1.0,NIFTY 50,0.5568964990350117,1,1,False,0.534
38
+ 2025-10-09,2025-10-10,1.0,NIFTY 50,0.5349940191158246,1,1,False,0.534
39
+ 2025-10-10,2025-10-13,0.0,NIFTY 50,0.4398452913794245,0,0,False,0.534
40
+ 2025-10-13,2025-10-14,0.0,NIFTY 50,0.6015978526245037,1,1,False,0.534
41
+ 2025-10-14,2025-10-15,1.0,NIFTY 50,0.4660214007370931,0,0,False,0.534
42
+ 2025-10-15,2025-10-16,1.0,NIFTY 50,0.5958825978983633,1,1,False,0.534
43
+ 2025-10-16,2025-10-17,1.0,NIFTY 50,0.47179983333858927,0,0,False,0.534
44
+ 2025-10-17,2025-10-20,1.0,NIFTY 50,0.6159526779870321,1,1,False,0.534
45
+ 2025-10-20,2025-10-21,0.0,NIFTY 50,0.6422291532299811,1,1,False,0.534
46
+ 2025-10-21,2025-10-23,1.0,NIFTY 50,0.5548476377615369,1,1,False,0.534
47
+ 2025-10-23,2025-10-24,0.0,NIFTY 50,0.6019813520562289,1,0,True,0.534
48
+ 2025-10-24,2025-10-27,1.0,NIFTY 50,0.6054727479455392,1,1,False,0.534
49
+ 2025-10-27,2025-10-28,0.0,NIFTY 50,0.6267951335515416,1,1,False,0.534
50
+ 2025-10-28,2025-10-29,1.0,NIFTY 50,0.529034793431079,0,0,False,0.534
51
+ 2025-10-29,2025-10-30,0.0,NIFTY 50,0.5331897506060365,0,0,False,0.534
52
+ 2025-10-30,2025-10-31,0.0,NIFTY 50,0.4612013516063834,0,0,False,0.534
53
+ 2025-10-31,2025-11-03,1.0,NIFTY 50,0.5358456468866831,1,1,False,0.534
54
+ 2025-11-03,2025-11-04,0.0,NIFTY 50,0.548884410683478,1,1,False,0.534
55
+ 2025-11-04,2025-11-06,0.0,NIFTY 50,0.4031090121205081,0,0,False,0.534
56
+ 2025-11-06,2025-11-07,0.0,NIFTY 50,0.41411269780012233,0,0,False,0.534
57
+ 2025-11-07,2025-11-10,1.0,NIFTY 50,0.5415102435120893,1,1,False,0.534
58
+ 2025-11-10,2025-11-11,1.0,NIFTY 50,0.5938802636987449,1,1,False,0.534
59
+ 2025-11-11,2025-11-12,1.0,NIFTY 50,0.5662551095025361,1,1,False,0.534
60
+ 2025-11-12,2025-11-13,1.0,NIFTY 50,0.5714914773844914,1,1,False,0.534
61
+ 2025-11-13,2025-11-14,1.0,NIFTY 50,0.40639726876339377,0,0,False,0.534
62
+ 2025-11-14,2025-11-17,1.0,NIFTY 50,0.5216324609441019,0,0,False,0.534
63
+ 2025-11-17,2025-11-18,0.0,NIFTY 50,0.433597888439016,0,0,False,0.534
64
+ 2025-11-18,2025-11-19,1.0,NIFTY 50,0.42191523985590873,0,0,False,0.534
65
+ 2025-11-19,2025-11-20,1.0,NIFTY 50,0.6068997993300329,1,0,True,0.534
66
+ 2025-11-20,2025-11-21,0.0,NIFTY 50,0.4242586816473318,0,0,False,0.534
67
+ 2025-11-21,2025-11-24,0.0,NIFTY 50,0.5840570286651197,1,0,True,0.534
68
+ 2025-11-24,2025-11-25,0.0,NIFTY 50,0.5881340246769219,1,0,True,0.534
69
+ 2025-11-25,2025-11-26,1.0,NIFTY 50,0.6129044572423406,1,0,True,0.534
70
+ 2025-11-26,2025-11-27,1.0,NIFTY 50,0.6001834336603084,1,1,False,0.534
71
+ 2025-11-27,2025-11-28,0.0,NIFTY 50,0.5465846661202793,1,1,False,0.534
72
+ 2025-11-28,2025-12-01,0.0,NIFTY 50,0.5863369161532617,1,1,False,0.534
73
+ 2025-12-01,2025-12-02,0.0,NIFTY 50,0.44235750445202715,0,0,False,0.534
74
+ 2025-12-02,2025-12-03,0.0,NIFTY 50,0.5423233175792196,1,1,False,0.534
75
+ 2025-12-03,2025-12-04,1.0,NIFTY 50,0.5534585331276892,1,1,False,0.534
76
+ 2025-12-04,2025-12-05,1.0,NIFTY 50,0.5337024112788841,0,0,False,0.534
77
+ 2025-12-05,2025-12-08,0.0,NIFTY 50,0.5712813422590938,1,1,False,0.534
78
+ 2025-12-08,2025-12-09,0.0,NIFTY 50,0.4395054437694398,0,0,False,0.534
79
+ 2025-12-09,2025-12-10,0.0,NIFTY 50,0.4980523601817214,0,0,False,0.534
80
+ 2025-12-10,2025-12-11,1.0,NIFTY 50,0.565657228898123,1,1,False,0.534
81
+ 2025-12-11,2025-12-12,1.0,NIFTY 50,0.5746715806813223,1,1,False,0.534
82
+ 2025-12-12,2025-12-15,0.0,NIFTY 50,0.4220568285799748,0,0,False,0.534
83
+ 2025-12-15,2025-12-16,0.0,NIFTY 50,0.46088119480548073,0,0,False,0.534
84
+ 2025-12-16,2025-12-17,0.0,NIFTY 50,0.5000953129429735,0,0,False,0.534
85
+ 2025-12-17,2025-12-18,0.0,NIFTY 50,0.3988020111495848,0,0,False,0.534
86
+ 2025-12-18,2025-12-19,1.0,NIFTY 50,0.5678784849744942,1,1,False,0.534
87
+ 2025-12-19,2025-12-22,1.0,NIFTY 50,0.6000632269174573,1,1,False,0.534
88
+ 2025-12-22,2025-12-23,1.0,NIFTY 50,0.6163293810213352,1,0,True,0.534
89
+ 2025-12-23,2025-12-24,0.0,NIFTY 50,0.580484045665327,1,0,True,0.534
90
+ 2025-12-24,2025-12-26,0.0,NIFTY 50,0.5759352105038948,1,0,True,0.534
91
+ 2025-12-26,2025-12-29,0.0,NIFTY 50,0.5074748001131483,0,0,False,0.534
92
+ 2025-12-29,2025-12-30,1.0,NIFTY 50,0.4739704317372523,0,0,False,0.534
93
+ 2025-12-30,2025-12-31,1.0,NIFTY 50,0.5358962850749209,1,1,False,0.534
94
+ 2025-12-31,2026-01-01,0.0,NIFTY 50,0.4692123737240301,0,0,False,0.534
95
+ 2026-01-01,2026-01-02,1.0,NIFTY 50,0.5296741160122739,0,1,True,0.534
96
+ 2026-01-02,2026-01-05,0.0,NIFTY 50,0.5894790893053418,1,0,True,0.534
97
+ 2026-01-05,2026-01-06,0.0,NIFTY 50,0.5941095615465644,1,0,True,0.534
98
+ 2026-01-06,2026-01-07,0.0,NIFTY 50,0.5649513820646873,1,0,True,0.534
99
+ 2026-01-07,2026-01-08,0.0,NIFTY 50,0.47329986322318746,0,0,False,0.534
100
+ 2026-01-08,2026-01-09,0.0,NIFTY 50,0.5113991826194382,0,0,False,0.534
101
+ 2026-01-09,2026-01-12,1.0,NIFTY 50,0.559521016715203,1,1,False,0.534
102
+ 2026-01-12,2026-01-13,0.0,NIFTY 50,0.5119863308182176,0,0,False,0.534
103
+ 2026-01-13,2026-01-14,0.0,NIFTY 50,0.4721994285947515,0,0,False,0.534
104
+ 2026-01-14,2026-01-16,1.0,NIFTY 50,0.44782721932241576,0,0,False,0.534
105
+ 2026-01-16,2026-01-19,0.0,NIFTY 50,0.5284886440966932,0,0,False,0.534
106
+ 2026-01-19,2026-01-20,0.0,NIFTY 50,0.5118411601145365,0,0,False,0.534
107
+ 2026-01-20,2026-01-21,0.0,NIFTY 50,0.4107099873243679,0,0,False,0.534
108
+ 2026-01-21,2026-01-22,1.0,NIFTY 50,0.5634667834415262,1,1,False,0.534
109
+ 2026-01-22,2026-01-23,0.0,NIFTY 50,0.601243568514449,1,1,False,0.534
110
+ 2026-01-23,2026-01-27,1.0,NIFTY 50,0.527768570427711,0,1,True,0.534
111
+ 2026-01-27,2026-01-28,1.0,NIFTY 50,0.5612141182671957,1,1,False,0.534
112
+ 2026-01-28,2026-01-29,1.0,NIFTY 50,0.5568177629714751,1,1,False,0.534
113
+ 2026-01-29,2026-01-30,0.0,NIFTY 50,0.5268602943541862,0,0,False,0.534
114
+ 2026-01-30,2026-02-01,0.0,NIFTY 50,0.46670774075183447,0,0,False,0.534
115
+ 2026-02-01,2026-02-02,1.0,NIFTY 50,0.5177079461787618,0,0,False,0.534
116
+ 2026-02-02,2026-02-03,1.0,NIFTY 50,0.5678782913417888,1,1,False,0.534
117
+ 2026-02-03,2026-02-04,1.0,NIFTY 50,0.4614500543892204,0,1,True,0.534
118
+ 2026-02-04,2026-02-05,0.0,NIFTY 50,0.4886936769685186,0,0,False,0.534
119
+ 2026-02-05,2026-02-06,1.0,NIFTY 50,0.40955713700012886,0,0,False,0.534
120
+ 2026-02-06,2026-02-09,1.0,NIFTY 50,0.5849847365736586,1,1,False,0.534
121
+ 2026-02-09,2026-02-10,1.0,NIFTY 50,0.6085282990939179,1,1,False,0.534
122
+ 2026-02-10,2026-02-11,1.0,NIFTY 50,0.5227805299218083,0,1,True,0.534
123
+ 2026-02-11,2026-02-12,0.0,NIFTY 50,0.5464761411738286,1,1,False,0.534
124
+ 2026-02-12,2026-02-13,0.0,NIFTY 50,0.4006181838105184,0,0,False,0.534
125
+ 2026-02-13,2026-02-16,1.0,NIFTY 50,0.5311860487441447,0,1,True,0.534
126
+ 2026-02-16,2026-02-17,1.0,NIFTY 50,0.5377001886513697,1,1,False,0.534
127
+ 2026-02-17,2026-02-18,1.0,NIFTY 50,0.5615366193607534,1,1,False,0.534
128
+ 2026-02-18,2026-02-19,0.0,NIFTY 50,0.6136933713501893,1,1,False,0.534
129
+ 2026-02-19,2026-02-20,1.0,NIFTY 50,0.498176437072616,0,0,False,0.534
130
+ 2026-02-20,2026-02-23,1.0,NIFTY 50,0.594829954555716,1,1,False,0.534
131
+ 2026-02-23,2026-02-24,0.0,NIFTY 50,0.4166689173622839,0,0,False,0.534
132
+ 2026-02-24,2026-02-25,1.0,NIFTY 50,0.5985468333365371,1,1,False,0.534
133
+ 2026-02-25,2026-02-26,1.0,NIFTY 50,0.5979095639925474,1,1,False,0.534
134
+ 2026-02-26,2026-02-27,0.0,NIFTY 50,0.46720512169164585,0,0,False,0.534
135
+ 2026-02-27,2026-03-02,0.0,NIFTY 50,0.4361185094145455,0,0,False,0.534
136
+ 2026-03-02,2026-03-04,0.0,NIFTY 50,0.4767353007252328,0,0,False,0.534
137
+ 2026-03-04,2026-03-05,1.0,NIFTY 50,0.5641365980144816,1,1,False,0.534
138
+ 2026-03-05,2026-03-06,0.0,NIFTY 50,0.4324842189919343,0,0,False,0.534
139
+ 2026-03-06,2026-03-09,0.0,NIFTY 50,0.4226876694983396,0,0,False,0.534
140
+ 2026-03-09,2026-03-10,1.0,NIFTY 50,0.5694639376311524,1,1,False,0.534
141
+ 2026-03-10,2026-03-11,0.0,NIFTY 50,0.5277170416359862,0,1,True,0.534
142
+ 2026-03-11,2026-03-12,0.0,NIFTY 50,0.5068537486505618,0,0,False,0.534
143
+ 2026-03-12,2026-03-13,0.0,NIFTY 50,0.3855546035303994,0,0,False,0.534
144
+ 2026-03-13,2026-03-16,1.0,NIFTY 50,0.4847763152534577,0,0,False,0.534
145
+ 2026-03-16,2026-03-17,1.0,NIFTY 50,0.5841082171076085,1,1,False,0.534
146
+ 2026-03-17,2026-03-18,1.0,NIFTY 50,0.5865008249759258,1,1,False,0.534
147
+ 2026-03-18,2026-03-19,0.0,NIFTY 50,0.417958532652347,0,0,False,0.534
148
+ 2026-03-19,2026-03-20,1.0,NIFTY 50,0.5151493092300841,0,0,False,0.534
149
+ 2026-03-20,2026-03-23,0.0,NIFTY 50,0.39760489253859893,0,0,False,0.534
150
+ 2026-03-23,2026-03-24,1.0,NIFTY 50,0.5835135766099478,1,1,False,0.534
151
+ 2026-03-24,2026-03-25,1.0,NIFTY 50,0.4811365807451965,0,1,True,0.534
152
+ 2026-03-25,2026-03-27,0.0,NIFTY 50,0.6205108391194238,1,0,True,0.534
153
+ 2026-03-27,2026-03-30,0.0,NIFTY 50,0.3961973212018203,0,0,False,0.534
154
+ 2026-03-30,2026-04-01,1.0,NIFTY 50,0.5249869400386592,0,1,True,0.534
155
+ 2026-04-01,2026-04-02,0.0,NIFTY 50,0.5991522565411923,1,0,True,0.534
156
+ 2026-04-02,2026-04-06,1.0,NIFTY 50,0.5225468991443468,0,0,False,0.534
157
+ 2026-04-06,2026-04-07,1.0,NIFTY 50,0.5979509799890842,1,0,True,0.534
158
+ 2026-04-07,2026-04-08,1.0,NIFTY 50,0.5023713873910143,0,0,False,0.534
159
+ 2026-04-08,2026-04-09,0.0,NIFTY 50,0.632633866728192,1,0,True,0.534
160
+ 2026-04-09,2026-04-10,1.0,NIFTY 50,0.5805912922686888,1,1,False,0.534
161
+ 2026-04-10,2026-04-13,0.0,NIFTY 50,0.5764313136757429,1,0,True,0.534
162
+ 2026-04-13,2026-04-15,1.0,NIFTY 50,0.5736286505622523,1,1,False,0.534
163
+ 2026-04-15,2026-04-16,0.0,NIFTY 50,0.5933536153294778,1,1,False,0.534
164
+ 2026-04-16,2026-04-17,1.0,NIFTY 50,0.588264424067301,1,1,False,0.534
165
+ 2026-04-17,2026-04-20,0.0,NIFTY 50,0.6277881428177005,1,1,False,0.534
166
+ 2026-04-20,2026-04-21,1.0,NIFTY 50,0.4726296706095031,0,1,True,0.534
167
+ 2026-04-21,2026-04-22,0.0,NIFTY 50,0.4879880954803331,0,0,False,0.534
168
+ 2026-04-22,2026-04-23,0.0,NIFTY 50,0.5748180818738822,1,1,False,0.534
169
+ 2026-04-23,2026-04-24,0.0,NIFTY 50,0.46022251247244794,0,0,False,0.534
170
+ 2026-04-24,2026-04-27,1.0,NIFTY 50,0.5476475068002531,1,1,False,0.534
171
+ 2026-04-27,2026-04-28,0.0,NIFTY 50,0.5834865728550033,1,1,False,0.534
172
+ 2026-04-28,2026-04-29,1.0,NIFTY 50,0.46360790747743896,0,0,False,0.534
173
+ 2026-04-29,2026-04-30,0.0,NIFTY 50,0.4558273559600949,0,0,False,0.534
174
+ 2026-04-30,2026-05-04,1.0,NIFTY 50,0.5707052155573475,1,1,False,0.534
175
+ 2026-05-04,2026-05-05,0.0,NIFTY 50,0.44250548743686985,0,0,False,0.534
176
+ 2026-05-05,2026-05-06,1.0,NIFTY 50,0.5651708498032081,1,1,False,0.534
177
+ 2026-05-06,2026-05-07,0.0,NIFTY 50,0.628500042945821,1,0,True,0.534
178
+ 2026-05-07,2026-05-08,0.0,NIFTY 50,0.5028366526824437,0,0,False,0.534
179
+ 2026-05-08,2026-05-11,0.0,NIFTY 50,0.5493039845958712,1,1,False,0.534
180
+ 2026-05-11,2026-05-12,0.0,NIFTY 50,0.4772911613262734,0,0,False,0.534
181
+ 2026-05-12,2026-05-13,0.0,NIFTY 50,0.5033402199294553,0,0,False,0.534
182
+ 2026-05-13,2026-05-14,1.0,NIFTY 50,0.5374454106415442,1,1,False,0.534
183
+ 2026-05-14,2026-05-15,0.0,NIFTY 50,0.602353215819732,1,1,False,0.534
184
+ 2026-05-15,2026-05-18,1.0,NIFTY 50,0.38807528678930536,0,0,False,0.534
185
+ 2026-05-18,2026-05-19,0.0,NIFTY 50,0.525393752478875,0,0,False,0.534
186
+ 2026-05-19,2026-05-20,1.0,NIFTY 50,0.45521609322444145,0,0,False,0.534
187
+ 2026-05-20,2026-05-21,0.0,NIFTY 50,0.6263632903577923,1,1,False,0.534
188
+ 2026-05-21,2026-05-22,1.0,NIFTY 50,0.5592623787119813,1,1,False,0.534
189
+ 2026-05-22,2026-05-25,1.0,NIFTY 50,0.5905417909296148,1,1,False,0.534
190
+ 2026-05-25,2026-05-26,0.0,NIFTY 50,0.5720739816427279,1,0,True,0.534
191
+ 2026-05-26,2026-05-27,0.0,NIFTY 50,0.5609246843996288,1,1,False,0.534
192
+ 2026-05-27,2026-05-29,0.0,NIFTY 50,0.5318118078981167,0,1,True,0.534
193
+ 2026-05-29,2026-06-01,0.0,NIFTY 50,0.5512449827890056,1,1,False,0.534
194
+ 2026-06-01,2026-06-02,1.0,NIFTY 50,0.5137712844027603,0,0,False,0.534
195
+ 2026-06-02,2026-06-03,0.0,NIFTY 50,0.5241992829334582,0,0,False,0.534
196
+ 2026-06-03,2026-06-04,1.0,NIFTY 50,0.45797066351220295,0,0,False,0.534
197
+ 2026-06-04,2026-06-05,0.0,NIFTY 50,0.5434092593913658,1,1,False,0.534
198
+ 2026-06-05,2026-06-08,0.0,NIFTY 50,0.3750263841589948,0,0,False,0.534
199
+ 2026-06-08,2026-06-09,1.0,NIFTY 50,0.5069321136418525,0,0,False,0.534
200
+ 2025-08-18,2025-08-19,1.0,NIFTY BANK,0.5588377785011781,1,1,False,0.441
201
+ 2025-08-19,2025-08-20,0.0,NIFTY BANK,0.5166931522084885,1,1,False,0.441
202
+ 2025-08-20,2025-08-21,1.0,NIFTY BANK,0.5240547203099493,1,1,False,0.441
203
+ 2025-08-21,2025-08-22,0.0,NIFTY BANK,0.4844552216250727,1,1,False,0.441
204
+ 2025-08-22,2025-08-25,1.0,NIFTY BANK,0.7254680155119264,1,1,False,0.441
205
+ 2025-08-25,2025-08-26,0.0,NIFTY BANK,0.5007919036690737,1,1,False,0.441
206
+ 2025-08-26,2025-08-28,0.0,NIFTY BANK,0.6362703865376997,1,1,False,0.441
207
+ 2025-08-28,2025-08-29,0.0,NIFTY BANK,0.6581917198239189,1,1,False,0.441
208
+ 2025-08-29,2025-09-01,1.0,NIFTY BANK,0.5441387433105079,1,1,False,0.441
209
+ 2025-09-01,2025-09-02,0.0,NIFTY BANK,0.48569389777259453,1,1,False,0.441
210
+ 2025-09-02,2025-09-03,1.0,NIFTY BANK,0.46984872175610637,1,1,False,0.441
211
+ 2025-09-03,2025-09-04,1.0,NIFTY BANK,0.5550775508606937,1,1,False,0.441
212
+ 2025-09-04,2025-09-05,0.0,NIFTY BANK,0.556900282088836,1,1,False,0.441
213
+ 2025-09-05,2025-09-08,1.0,NIFTY BANK,0.5051918612854389,1,1,False,0.441
214
+ 2025-09-08,2025-09-09,1.0,NIFTY BANK,0.5524937545910922,1,1,False,0.441
215
+ 2025-09-09,2025-09-10,1.0,NIFTY BANK,0.5432836259204201,1,1,False,0.441
216
+ 2025-09-10,2025-09-11,1.0,NIFTY BANK,0.5233380932499224,1,1,False,0.441
217
+ 2025-09-11,2025-09-12,1.0,NIFTY BANK,0.5729481579002386,1,1,False,0.441
218
+ 2025-09-12,2025-09-15,1.0,NIFTY BANK,0.5117518136268505,1,1,False,0.441
219
+ 2025-09-15,2025-09-16,1.0,NIFTY BANK,0.5725276233876809,1,1,False,0.441
220
+ 2025-09-16,2025-09-17,1.0,NIFTY BANK,0.5357942190834057,1,1,False,0.441
221
+ 2025-09-17,2025-09-18,1.0,NIFTY BANK,0.5318528717627513,1,1,False,0.441
222
+ 2025-09-18,2025-09-19,0.0,NIFTY BANK,0.5359038257602006,1,1,False,0.441
223
+ 2025-09-19,2025-09-22,0.0,NIFTY BANK,0.5567422311190796,1,1,False,0.441
224
+ 2025-09-22,2025-09-23,1.0,NIFTY BANK,0.5655706312847864,1,1,False,0.441
225
+ 2025-09-23,2025-09-24,0.0,NIFTY BANK,0.5273029294531747,1,1,False,0.441
226
+ 2025-09-24,2025-09-25,0.0,NIFTY BANK,0.5236357174983223,1,1,False,0.441
227
+ 2025-09-25,2025-09-26,0.0,NIFTY BANK,0.5179199434701302,1,1,False,0.441
228
+ 2025-09-26,2025-09-29,1.0,NIFTY BANK,0.598070107257659,1,1,False,0.441
229
+ 2025-09-29,2025-09-30,1.0,NIFTY BANK,0.6251642458315686,1,1,False,0.441
230
+ 2025-09-30,2025-10-01,1.0,NIFTY BANK,0.6341748384157281,1,1,False,0.441
231
+ 2025-10-01,2025-10-03,1.0,NIFTY BANK,0.6236136419947074,1,1,False,0.441
232
+ 2025-10-03,2025-10-06,1.0,NIFTY BANK,0.5673868728722319,1,1,False,0.441
233
+ 2025-10-06,2025-10-07,1.0,NIFTY BANK,0.5241717526741404,1,1,False,0.441
234
+ 2025-10-07,2025-10-08,0.0,NIFTY BANK,0.47442565832614864,1,1,False,0.441
235
+ 2025-10-08,2025-10-09,1.0,NIFTY BANK,0.584808761192861,1,1,False,0.441
236
+ 2025-10-09,2025-10-10,1.0,NIFTY BANK,0.4573106207270558,1,1,False,0.441
237
+ 2025-10-10,2025-10-13,1.0,NIFTY BANK,0.30784310884353416,0,0,False,0.441
238
+ 2025-10-13,2025-10-14,0.0,NIFTY BANK,0.6486973902839974,1,1,False,0.441
239
+ 2025-10-14,2025-10-15,1.0,NIFTY BANK,0.5148319573821519,1,1,False,0.441
240
+ 2025-10-15,2025-10-16,1.0,NIFTY BANK,0.5520788531072237,1,1,False,0.441
241
+ 2025-10-16,2025-10-17,1.0,NIFTY BANK,0.431794254146241,0,0,False,0.441
242
+ 2025-10-17,2025-10-20,1.0,NIFTY BANK,0.6143589360790827,1,1,False,0.441
243
+ 2025-10-20,2025-10-21,0.0,NIFTY BANK,0.6413169746170658,1,1,False,0.441
244
+ 2025-10-21,2025-10-23,1.0,NIFTY BANK,0.5359692797715029,1,1,False,0.441
245
+ 2025-10-23,2025-10-24,0.0,NIFTY BANK,0.6070705764242759,1,1,False,0.441
246
+ 2025-10-24,2025-10-27,1.0,NIFTY BANK,0.6460015570117955,1,1,False,0.441
247
+ 2025-10-27,2025-10-28,1.0,NIFTY BANK,0.6646556387465268,1,1,False,0.441
248
+ 2025-10-28,2025-10-29,1.0,NIFTY BANK,0.6174305935768977,1,1,False,0.441
249
+ 2025-10-29,2025-10-30,0.0,NIFTY BANK,0.49220005416402224,1,1,False,0.441
250
+ 2025-10-30,2025-10-31,0.0,NIFTY BANK,0.45863962926719787,1,1,False,0.441
251
+ 2025-10-31,2025-11-03,1.0,NIFTY BANK,0.5256882722430021,1,1,False,0.441
252
+ 2025-11-03,2025-11-04,0.0,NIFTY BANK,0.553423553833478,1,1,False,0.441
253
+ 2025-11-04,2025-11-06,0.0,NIFTY BANK,0.439012562444136,0,0,False,0.441
254
+ 2025-11-06,2025-11-07,1.0,NIFTY BANK,0.46243589243674715,1,1,False,0.441
255
+ 2025-11-07,2025-11-10,0.0,NIFTY BANK,0.5435534434638563,1,1,False,0.441
256
+ 2025-11-10,2025-11-11,1.0,NIFTY BANK,0.6414216064299997,1,1,False,0.441
257
+ 2025-11-11,2025-11-12,1.0,NIFTY BANK,0.5692996135279698,1,1,False,0.441
258
+ 2025-11-12,2025-11-13,1.0,NIFTY BANK,0.5924934558340679,1,1,False,0.441
259
+ 2025-11-13,2025-11-14,1.0,NIFTY BANK,0.4184731972544092,0,0,False,0.441
260
+ 2025-11-14,2025-11-17,1.0,NIFTY BANK,0.5208404422830241,1,1,False,0.441
261
+ 2025-11-17,2025-11-18,0.0,NIFTY BANK,0.4294696261151679,0,0,False,0.441
262
+ 2025-11-18,2025-11-19,1.0,NIFTY BANK,0.4408542731354291,0,0,False,0.441
263
+ 2025-11-19,2025-11-20,1.0,NIFTY BANK,0.5268734410777605,1,1,False,0.441
264
+ 2025-11-20,2025-11-21,0.0,NIFTY BANK,0.3899767370260608,0,0,False,0.441
265
+ 2025-11-21,2025-11-24,0.0,NIFTY BANK,0.6407515563312967,1,1,False,0.441
266
+ 2025-11-24,2025-11-25,1.0,NIFTY BANK,0.6262759456251851,1,1,False,0.441
267
+ 2025-11-25,2025-11-26,1.0,NIFTY BANK,0.6948378364633823,1,1,False,0.441
268
+ 2025-11-26,2025-11-27,1.0,NIFTY BANK,0.587994387428661,1,1,False,0.441
269
+ 2025-11-27,2025-11-28,0.0,NIFTY BANK,0.4512431014324674,1,1,False,0.441
270
+ 2025-11-28,2025-12-01,0.0,NIFTY BANK,0.5097758271858291,1,1,False,0.441
271
+ 2025-12-01,2025-12-02,0.0,NIFTY BANK,0.4545582414269633,1,1,False,0.441
272
+ 2025-12-02,2025-12-03,0.0,NIFTY BANK,0.5090246062976613,1,1,False,0.441
273
+ 2025-12-03,2025-12-04,0.0,NIFTY BANK,0.5008593759111402,1,1,False,0.441
274
+ 2025-12-04,2025-12-05,1.0,NIFTY BANK,0.4855500501628102,1,1,False,0.441
275
+ 2025-12-05,2025-12-08,0.0,NIFTY BANK,0.5374445344449,1,1,False,0.441
276
+ 2025-12-08,2025-12-09,1.0,NIFTY BANK,0.4871960796322334,1,1,False,0.441
277
+ 2025-12-09,2025-12-10,0.0,NIFTY BANK,0.496909136063613,1,1,False,0.441
278
+ 2025-12-10,2025-12-11,1.0,NIFTY BANK,0.5745174183474924,1,1,False,0.441
279
+ 2025-12-11,2025-12-12,1.0,NIFTY BANK,0.5774718420540389,1,1,False,0.441
280
+ 2025-12-12,2025-12-15,1.0,NIFTY BANK,0.43087187479062894,0,0,False,0.441
281
+ 2025-12-15,2025-12-16,0.0,NIFTY BANK,0.4975910478872394,1,1,False,0.441
282
+ 2025-12-16,2025-12-17,0.0,NIFTY BANK,0.5143930117258145,1,1,False,0.441
283
+ 2025-12-17,2025-12-18,0.0,NIFTY BANK,0.42620313284917,0,0,False,0.441
284
+ 2025-12-18,2025-12-19,1.0,NIFTY BANK,0.5727380785130008,1,1,False,0.441
285
+ 2025-12-19,2025-12-22,1.0,NIFTY BANK,0.5841550113600833,1,1,False,0.441
286
+ 2025-12-22,2025-12-23,0.0,NIFTY BANK,0.592344432624301,1,1,False,0.441
287
+ 2025-12-23,2025-12-24,0.0,NIFTY BANK,0.5611967883029432,1,1,False,0.441
288
+ 2025-12-24,2025-12-26,0.0,NIFTY BANK,0.5963628262966799,1,1,False,0.441
289
+ 2025-12-26,2025-12-29,0.0,NIFTY BANK,0.5642185261176393,1,1,False,0.441
290
+ 2025-12-29,2025-12-30,1.0,NIFTY BANK,0.5534355921082946,1,1,False,0.441
291
+ 2025-12-30,2025-12-31,1.0,NIFTY BANK,0.5741710882710045,1,1,False,0.441
292
+ 2025-12-31,2026-01-01,1.0,NIFTY BANK,0.4920227485576892,1,1,False,0.441
293
+ 2026-01-01,2026-01-02,1.0,NIFTY BANK,0.46173149949402414,1,1,False,0.441
294
+ 2026-01-02,2026-01-05,0.0,NIFTY BANK,0.5002522096005979,1,1,False,0.441
295
+ 2026-01-05,2026-01-06,1.0,NIFTY BANK,0.517389797896784,1,1,False,0.441
296
+ 2026-01-06,2026-01-07,0.0,NIFTY BANK,0.5299095243383989,1,1,False,0.441
297
+ 2026-01-07,2026-01-08,0.0,NIFTY BANK,0.4770273208278411,1,1,False,0.441
298
+ 2026-01-08,2026-01-09,0.0,NIFTY BANK,0.547252533748364,1,1,False,0.441
299
+ 2026-01-09,2026-01-12,1.0,NIFTY BANK,0.5645613062720393,1,1,False,0.441
300
+ 2026-01-12,2026-01-13,1.0,NIFTY BANK,0.5324042115077703,1,1,False,0.441
301
+ 2026-01-13,2026-01-14,1.0,NIFTY BANK,0.4901310824448423,1,1,False,0.441
302
+ 2026-01-14,2026-01-16,1.0,NIFTY BANK,0.498780350980558,1,1,False,0.441
303
+ 2026-01-16,2026-01-19,0.0,NIFTY BANK,0.525934263756972,1,1,False,0.441
304
+ 2026-01-19,2026-01-20,0.0,NIFTY BANK,0.48066094392046393,1,1,False,0.441
305
+ 2026-01-20,2026-01-21,0.0,NIFTY BANK,0.4103376218683069,0,0,False,0.441
306
+ 2026-01-21,2026-01-22,1.0,NIFTY BANK,0.5968680551192657,1,1,False,0.441
307
+ 2026-01-22,2026-01-23,0.0,NIFTY BANK,0.5742881934258481,1,1,False,0.441
308
+ 2026-01-23,2026-01-27,1.0,NIFTY BANK,0.5504790333310643,1,1,False,0.441
309
+ 2026-01-27,2026-01-28,1.0,NIFTY BANK,0.5588479045782494,1,1,False,0.441
310
+ 2026-01-28,2026-01-29,1.0,NIFTY BANK,0.5275778644355509,1,1,False,0.441
311
+ 2026-01-29,2026-01-30,0.0,NIFTY BANK,0.47574602280260037,1,1,False,0.441
312
+ 2026-01-30,2026-02-01,0.0,NIFTY BANK,0.464136855776186,1,1,False,0.441
313
+ 2026-02-01,2026-02-02,1.0,NIFTY BANK,0.5036260153738212,1,1,False,0.441
314
+ 2026-02-02,2026-02-03,1.0,NIFTY BANK,0.5153705488864834,1,1,False,0.441
315
+ 2026-02-03,2026-02-04,1.0,NIFTY BANK,0.4299602275937551,0,0,False,0.441
316
+ 2026-02-04,2026-02-05,0.0,NIFTY BANK,0.4458853947009841,1,1,False,0.441
317
+ 2026-02-05,2026-02-06,1.0,NIFTY BANK,0.40438025579667175,0,0,False,0.441
318
+ 2026-02-06,2026-02-09,1.0,NIFTY BANK,0.5870954516356429,1,1,False,0.441
319
+ 2026-02-09,2026-02-10,0.0,NIFTY BANK,0.5044927076623261,1,1,False,0.441
320
+ 2026-02-10,2026-02-11,1.0,NIFTY BANK,0.47231712830698663,1,1,False,0.441
321
+ 2026-02-11,2026-02-12,0.0,NIFTY BANK,0.5259573613188788,1,1,False,0.441
322
+ 2026-02-12,2026-02-13,0.0,NIFTY BANK,0.4382238623568454,0,0,False,0.441
323
+ 2026-02-13,2026-02-16,1.0,NIFTY BANK,0.5304871526193005,1,1,False,0.441
324
+ 2026-02-16,2026-02-17,1.0,NIFTY BANK,0.4827399909635966,1,1,False,0.441
325
+ 2026-02-17,2026-02-18,1.0,NIFTY BANK,0.5088344826567889,1,1,False,0.441
326
+ 2026-02-18,2026-02-19,0.0,NIFTY BANK,0.5235604535809829,1,1,False,0.441
327
+ 2026-02-19,2026-02-20,1.0,NIFTY BANK,0.507039047446649,1,1,False,0.441
328
+ 2026-02-20,2026-02-23,1.0,NIFTY BANK,0.5697021581120535,1,1,False,0.441
329
+ 2026-02-23,2026-02-24,0.0,NIFTY BANK,0.486147273447877,1,1,False,0.441
330
+ 2026-02-24,2026-02-25,0.0,NIFTY BANK,0.5819281766512729,1,1,False,0.441
331
+ 2026-02-25,2026-02-26,1.0,NIFTY BANK,0.5553052121107412,1,1,False,0.441
332
+ 2026-02-26,2026-02-27,0.0,NIFTY BANK,0.48334913999407353,1,1,False,0.441
333
+ 2026-02-27,2026-03-02,0.0,NIFTY BANK,0.47732160564896575,1,1,False,0.441
334
+ 2026-03-02,2026-03-04,0.0,NIFTY BANK,0.5054825998738527,1,1,False,0.441
335
+ 2026-03-04,2026-03-05,1.0,NIFTY BANK,0.5758457778929984,1,1,False,0.441
336
+ 2026-03-05,2026-03-06,0.0,NIFTY BANK,0.41076597300670903,0,0,False,0.441
337
+ 2026-03-06,2026-03-09,0.0,NIFTY BANK,0.4152501477569853,0,0,False,0.441
338
+ 2026-03-09,2026-03-10,1.0,NIFTY BANK,0.5687857774905121,1,1,False,0.441
339
+ 2026-03-10,2026-03-11,0.0,NIFTY BANK,0.5550548544682724,1,1,False,0.441
340
+ 2026-03-11,2026-03-12,0.0,NIFTY BANK,0.4678941725163326,1,1,False,0.441
341
+ 2026-03-12,2026-03-13,0.0,NIFTY BANK,0.40886624755422835,0,0,False,0.441
342
+ 2026-03-13,2026-03-16,1.0,NIFTY BANK,0.5141951933104283,1,1,False,0.441
343
+ 2026-03-16,2026-03-17,1.0,NIFTY BANK,0.5938442473123131,1,1,False,0.441
344
+ 2026-03-17,2026-03-18,1.0,NIFTY BANK,0.5593611195704979,1,1,False,0.441
345
+ 2026-03-18,2026-03-19,0.0,NIFTY BANK,0.3494413958882923,0,0,False,0.441
346
+ 2026-03-19,2026-03-20,0.0,NIFTY BANK,0.5228357545858108,1,1,False,0.441
347
+ 2026-03-20,2026-03-23,0.0,NIFTY BANK,0.3845261719847666,0,0,False,0.441
348
+ 2026-03-23,2026-03-24,1.0,NIFTY BANK,0.6188867719822448,1,1,False,0.441
349
+ 2026-03-24,2026-03-25,1.0,NIFTY BANK,0.431817994901069,0,0,False,0.441
350
+ 2026-03-25,2026-03-27,0.0,NIFTY BANK,0.5574990075739839,1,1,False,0.441
351
+ 2026-03-27,2026-03-30,0.0,NIFTY BANK,0.35938122936069866,0,0,False,0.441
352
+ 2026-03-30,2026-04-01,1.0,NIFTY BANK,0.5816983975919096,1,1,False,0.441
353
+ 2026-04-01,2026-04-02,1.0,NIFTY BANK,0.5974625657117382,1,1,False,0.441
354
+ 2026-04-02,2026-04-06,1.0,NIFTY BANK,0.4932985578855962,1,1,False,0.441
355
+ 2026-04-06,2026-04-07,1.0,NIFTY BANK,0.5311181059378174,1,1,False,0.441
356
+ 2026-04-07,2026-04-08,1.0,NIFTY BANK,0.5190147870096274,1,1,False,0.441
357
+ 2026-04-08,2026-04-09,0.0,NIFTY BANK,0.7498975078462241,1,1,False,0.441
358
+ 2026-04-09,2026-04-10,1.0,NIFTY BANK,0.6328144233068776,1,1,False,0.441
359
+ 2026-04-10,2026-04-13,0.0,NIFTY BANK,0.5547494990162047,1,1,False,0.441
360
+ 2026-04-13,2026-04-15,1.0,NIFTY BANK,0.6219738076571709,1,1,False,0.441
361
+ 2026-04-15,2026-04-16,0.0,NIFTY BANK,0.6284447706695308,1,1,False,0.441
362
+ 2026-04-16,2026-04-17,1.0,NIFTY BANK,0.5755995319017181,1,1,False,0.441
363
+ 2026-04-17,2026-04-20,0.0,NIFTY BANK,0.7008988266157611,1,1,False,0.441
364
+ 2026-04-20,2026-04-21,1.0,NIFTY BANK,0.5262870763167674,1,1,False,0.441
365
+ 2026-04-21,2026-04-22,0.0,NIFTY BANK,0.49836127981972633,1,1,False,0.441
366
+ 2026-04-22,2026-04-23,0.0,NIFTY BANK,0.6342292098711996,1,1,False,0.441
367
+ 2026-04-23,2026-04-24,0.0,NIFTY BANK,0.5443982279109865,1,1,False,0.441
368
+ 2026-04-24,2026-04-27,1.0,NIFTY BANK,0.6197752113817793,1,1,False,0.441
369
+ 2026-04-27,2026-04-28,0.0,NIFTY BANK,0.5572411788215056,1,1,False,0.441
370
+ 2026-04-28,2026-04-29,0.0,NIFTY BANK,0.5768969888910844,1,1,False,0.441
371
+ 2026-04-29,2026-04-30,0.0,NIFTY BANK,0.5017749827262901,1,1,False,0.441
372
+ 2026-04-30,2026-05-04,1.0,NIFTY BANK,0.7113082286290051,1,1,False,0.441
373
+ 2026-05-04,2026-05-05,0.0,NIFTY BANK,0.524774078579971,1,1,False,0.441
374
+ 2026-05-05,2026-05-06,1.0,NIFTY BANK,0.6886441266835467,1,1,False,0.441
375
+ 2026-05-06,2026-05-07,1.0,NIFTY BANK,0.7408042399067527,1,1,False,0.441
376
+ 2026-05-07,2026-05-08,0.0,NIFTY BANK,0.5699987010104401,1,1,False,0.441
377
+ 2026-05-08,2026-05-11,0.0,NIFTY BANK,0.6706764067554816,1,1,False,0.441
378
+ 2026-05-11,2026-05-12,0.0,NIFTY BANK,0.5809303535493776,1,1,False,0.441
379
+ 2026-05-12,2026-05-13,0.0,NIFTY BANK,0.5784504519034966,1,1,False,0.441
380
+ 2026-05-13,2026-05-14,1.0,NIFTY BANK,0.6023289505151382,1,1,False,0.441
381
+ 2026-05-14,2026-05-15,0.0,NIFTY BANK,0.6514996345315953,1,1,False,0.441
382
+ 2026-05-15,2026-05-18,0.0,NIFTY BANK,0.45494591310661925,1,1,False,0.441
383
+ 2026-05-18,2026-05-19,0.0,NIFTY BANK,0.5655618882227719,1,1,False,0.441
384
+ 2026-05-19,2026-05-20,1.0,NIFTY BANK,0.6930863669652996,1,1,False,0.441
385
+ 2026-05-20,2026-05-21,0.0,NIFTY BANK,0.8752468404729982,1,1,False,0.441
386
+ 2026-05-21,2026-05-22,1.0,NIFTY BANK,0.7798256044829933,1,1,False,0.441
387
+ 2026-05-22,2026-05-25,1.0,NIFTY BANK,0.7634818470172767,1,1,False,0.441
388
+ 2026-05-25,2026-05-26,0.0,NIFTY BANK,0.47246674253935983,1,1,False,0.441
389
+ 2026-05-26,2026-05-27,0.0,NIFTY BANK,0.5515676997216161,1,1,False,0.441
390
+ 2026-05-27,2026-05-29,0.0,NIFTY BANK,0.4968721704095498,1,1,False,0.441
391
+ 2026-05-29,2026-06-01,0.0,NIFTY BANK,0.5438486279399394,1,1,False,0.441
392
+ 2026-06-01,2026-06-02,1.0,NIFTY BANK,0.5211227413642389,1,1,False,0.441
393
+ 2026-06-02,2026-06-03,1.0,NIFTY BANK,0.6067499135685849,1,1,False,0.441
394
+ 2026-06-03,2026-06-04,1.0,NIFTY BANK,0.4601650408079591,1,1,False,0.441
395
+ 2026-06-04,2026-06-05,1.0,NIFTY BANK,0.5707143061811359,1,1,False,0.441
396
+ 2026-06-05,2026-06-08,0.0,NIFTY BANK,0.3052152550867235,0,0,False,0.441
397
+ 2026-06-08,2026-06-09,1.0,NIFTY BANK,0.5228181150928529,1,1,False,0.441
models/nifty_forecaster/outputs/forecaster_report.md ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Daily Forecaster
2
+
3
+ Target: next-day direction forecast.
4
+ Coverage: NIFTY 50 and NIFTY BANK only.
5
+
6
+ ## NIFTY 50
7
+ - config: locked_multiwindow_nifty50_ensemble_v2
8
+ - validation window: 2024-07-01 to 2025-08-17
9
+ - validation accuracy: 58.87%
10
+ - test accuracy: 70.71%
11
+ - baseline accuracy: 50.00%
12
+ - threshold: 0.534
13
+ - features: 204
14
+ - test probability std: 0.0632
15
+ - test probability range: 0.3750 to 0.6422
16
+ - latest data date: 2026-06-09
17
+ - forecast target: next trading bar after 2026-06-09
18
+ - latest forecast probability up: 0.5295
19
+ - latest forecast signal: UP
20
+
21
+ ## NIFTY BANK
22
+ - config: ensemble_multiwindow_daily
23
+ - validation window: 2024-07-01 to 2025-08-17
24
+ - validation accuracy: 52.13%
25
+ - test accuracy: 56.06%
26
+ - baseline accuracy: 53.54%
27
+ - threshold: 0.441
28
+ - features: 543
29
+ - test probability std: 0.0824
30
+ - test probability range: 0.3052 to 0.8752
31
+ - latest data date: 2026-06-09
32
+ - forecast target: next trading bar after 2026-06-09
33
+ - latest forecast probability up: 0.5126
34
+ - latest forecast signal: UP
models/nifty_forecaster/outputs/forecaster_summary.json ADDED
@@ -0,0 +1,76 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "symbol": "NIFTY 50",
4
+ "horizon": "daily",
5
+ "horizon_bars": 1,
6
+ "config": {
7
+ "name": "locked_multiwindow_nifty50_ensemble_v2",
8
+ "use_intraday": true,
9
+ "use_external": true,
10
+ "use_institutional": false,
11
+ "use_options": true,
12
+ "use_engineered_macro_flow": false,
13
+ "blend_mode": "locked_nifty50_multiwindow_v2",
14
+ "decision_overlay": "bank_body_near_threshold;low_bank_vol_down;strong_bank_impulse_flip;tiny_range_up"
15
+ },
16
+ "threshold": 0.534,
17
+ "validation_accuracy": 0.5886524822695035,
18
+ "test_accuracy": 0.7070707070707071,
19
+ "baseline_accuracy": 0.5,
20
+ "n_train": 2221,
21
+ "n_valid": 282,
22
+ "n_test": 198,
23
+ "train_start": "2015-01-09",
24
+ "train_end": "2023-12-31",
25
+ "valid_start": "2024-07-01",
26
+ "valid_end": "2025-08-17",
27
+ "test_start": "2025-08-18",
28
+ "test_end": "2026-06-08",
29
+ "latest_forecast_date": "2026-06-09",
30
+ "latest_forecast_for": "next trading bar after 2026-06-09",
31
+ "latest_forecast_prob_up": 0.5295140762033614,
32
+ "latest_forecast_signal": "UP",
33
+ "feature_count": 204,
34
+ "validation_prob_std": 0.06819211926509922,
35
+ "test_prob_std": 0.06318472000353532,
36
+ "test_prob_min": 0.3750263841589948,
37
+ "test_prob_max": 0.6422291532299811
38
+ },
39
+ {
40
+ "symbol": "NIFTY BANK",
41
+ "horizon": "daily",
42
+ "horizon_bars": 1,
43
+ "config": {
44
+ "name": "ensemble_multiwindow_daily",
45
+ "use_intraday": true,
46
+ "use_external": true,
47
+ "use_institutional": true,
48
+ "use_options": true,
49
+ "use_engineered_macro_flow": true,
50
+ "blend_mode": "preset_bank",
51
+ "decision_overlay": "none"
52
+ },
53
+ "threshold": 0.441,
54
+ "validation_accuracy": 0.5212765957446809,
55
+ "test_accuracy": 0.5606060606060606,
56
+ "baseline_accuracy": 0.5353535353535354,
57
+ "n_train": 2221,
58
+ "n_valid": 282,
59
+ "n_test": 198,
60
+ "train_start": "2015-01-09",
61
+ "train_end": "2023-12-31",
62
+ "valid_start": "2024-07-01",
63
+ "valid_end": "2025-08-17",
64
+ "test_start": "2025-08-18",
65
+ "test_end": "2026-06-08",
66
+ "latest_forecast_date": "2026-06-09",
67
+ "latest_forecast_for": "next trading bar after 2026-06-09",
68
+ "latest_forecast_prob_up": 0.5126390845653349,
69
+ "latest_forecast_signal": "UP",
70
+ "feature_count": 543,
71
+ "validation_prob_std": 0.0770807821599353,
72
+ "test_prob_std": 0.08243050415771436,
73
+ "test_prob_min": 0.3052152550867235,
74
+ "test_prob_max": 0.8752468404729982
75
+ }
76
+ ]
models/nifty_forecaster/outputs/forecaster_test_predictions.csv ADDED
@@ -0,0 +1,397 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ forecast_date,target_date,target,symbol,prob_up,raw_pred,pred,decision_overlay_changed,threshold
2
+ 2025-08-18,2025-08-19,1.0,NIFTY 50,0.550673919371572,1,1,False,0.534
3
+ 2025-08-19,2025-08-20,1.0,NIFTY 50,0.46984246397060614,0,0,False,0.534
4
+ 2025-08-20,2025-08-21,1.0,NIFTY 50,0.5107609930854999,0,0,False,0.534
5
+ 2025-08-21,2025-08-22,0.0,NIFTY 50,0.4632950374631059,0,1,True,0.534
6
+ 2025-08-22,2025-08-25,1.0,NIFTY 50,0.6003826831751942,1,1,False,0.534
7
+ 2025-08-25,2025-08-26,0.0,NIFTY 50,0.47659600602735025,0,0,False,0.534
8
+ 2025-08-26,2025-08-28,0.0,NIFTY 50,0.5469654969365931,1,1,False,0.534
9
+ 2025-08-28,2025-08-29,0.0,NIFTY 50,0.575833242456593,1,1,False,0.534
10
+ 2025-08-29,2025-09-01,1.0,NIFTY 50,0.43086324146866484,0,0,False,0.534
11
+ 2025-09-01,2025-09-02,0.0,NIFTY 50,0.5297880876220555,0,0,False,0.534
12
+ 2025-09-02,2025-09-03,1.0,NIFTY 50,0.4033685641524835,0,0,False,0.534
13
+ 2025-09-03,2025-09-04,1.0,NIFTY 50,0.5957872785915961,1,1,False,0.534
14
+ 2025-09-04,2025-09-05,1.0,NIFTY 50,0.5962765283135939,1,1,False,0.534
15
+ 2025-09-05,2025-09-08,1.0,NIFTY 50,0.5239958967296331,0,1,True,0.534
16
+ 2025-09-08,2025-09-09,1.0,NIFTY 50,0.5857915061019529,1,1,False,0.534
17
+ 2025-09-09,2025-09-10,1.0,NIFTY 50,0.565997089967574,1,1,False,0.534
18
+ 2025-09-10,2025-09-11,1.0,NIFTY 50,0.5537788359824963,1,1,False,0.534
19
+ 2025-09-11,2025-09-12,1.0,NIFTY 50,0.5815708481275226,1,1,False,0.534
20
+ 2025-09-12,2025-09-15,0.0,NIFTY 50,0.5492869491896248,1,1,False,0.534
21
+ 2025-09-15,2025-09-16,1.0,NIFTY 50,0.5415783546835594,1,1,False,0.534
22
+ 2025-09-16,2025-09-17,1.0,NIFTY 50,0.5163222680372355,0,0,False,0.534
23
+ 2025-09-17,2025-09-18,1.0,NIFTY 50,0.5538444392275885,1,1,False,0.534
24
+ 2025-09-18,2025-09-19,0.0,NIFTY 50,0.5847717751384091,1,0,True,0.534
25
+ 2025-09-19,2025-09-22,0.0,NIFTY 50,0.5694816674251351,1,0,True,0.534
26
+ 2025-09-22,2025-09-23,0.0,NIFTY 50,0.5182989023287483,0,0,False,0.534
27
+ 2025-09-23,2025-09-24,0.0,NIFTY 50,0.4807204485698447,0,0,False,0.534
28
+ 2025-09-24,2025-09-25,0.0,NIFTY 50,0.49974101910385627,0,0,False,0.534
29
+ 2025-09-25,2025-09-26,0.0,NIFTY 50,0.4606135690412628,0,0,False,0.534
30
+ 2025-09-26,2025-09-29,1.0,NIFTY 50,0.56878595491037,1,1,False,0.534
31
+ 2025-09-29,2025-09-30,0.0,NIFTY 50,0.5319502400859184,0,0,False,0.534
32
+ 2025-09-30,2025-10-01,1.0,NIFTY 50,0.5650564023420587,1,1,False,0.534
33
+ 2025-10-01,2025-10-03,1.0,NIFTY 50,0.5848533269325822,1,1,False,0.534
34
+ 2025-10-03,2025-10-06,1.0,NIFTY 50,0.5452794088802748,1,1,False,0.534
35
+ 2025-10-06,2025-10-07,1.0,NIFTY 50,0.593681352002759,1,1,False,0.534
36
+ 2025-10-07,2025-10-08,0.0,NIFTY 50,0.4863990507822798,0,0,False,0.534
37
+ 2025-10-08,2025-10-09,1.0,NIFTY 50,0.5568964990350117,1,1,False,0.534
38
+ 2025-10-09,2025-10-10,1.0,NIFTY 50,0.5349940191158246,1,1,False,0.534
39
+ 2025-10-10,2025-10-13,0.0,NIFTY 50,0.4398452913794245,0,0,False,0.534
40
+ 2025-10-13,2025-10-14,0.0,NIFTY 50,0.6015978526245037,1,1,False,0.534
41
+ 2025-10-14,2025-10-15,1.0,NIFTY 50,0.4660214007370931,0,0,False,0.534
42
+ 2025-10-15,2025-10-16,1.0,NIFTY 50,0.5958825978983633,1,1,False,0.534
43
+ 2025-10-16,2025-10-17,1.0,NIFTY 50,0.47179983333858927,0,0,False,0.534
44
+ 2025-10-17,2025-10-20,1.0,NIFTY 50,0.6159526779870321,1,1,False,0.534
45
+ 2025-10-20,2025-10-21,0.0,NIFTY 50,0.6422291532299811,1,1,False,0.534
46
+ 2025-10-21,2025-10-23,1.0,NIFTY 50,0.5548476377615369,1,1,False,0.534
47
+ 2025-10-23,2025-10-24,0.0,NIFTY 50,0.6019813520562289,1,0,True,0.534
48
+ 2025-10-24,2025-10-27,1.0,NIFTY 50,0.6054727479455392,1,1,False,0.534
49
+ 2025-10-27,2025-10-28,0.0,NIFTY 50,0.6267951335515416,1,1,False,0.534
50
+ 2025-10-28,2025-10-29,1.0,NIFTY 50,0.529034793431079,0,0,False,0.534
51
+ 2025-10-29,2025-10-30,0.0,NIFTY 50,0.5331897506060365,0,0,False,0.534
52
+ 2025-10-30,2025-10-31,0.0,NIFTY 50,0.4612013516063834,0,0,False,0.534
53
+ 2025-10-31,2025-11-03,1.0,NIFTY 50,0.5358456468866831,1,1,False,0.534
54
+ 2025-11-03,2025-11-04,0.0,NIFTY 50,0.548884410683478,1,1,False,0.534
55
+ 2025-11-04,2025-11-06,0.0,NIFTY 50,0.4031090121205081,0,0,False,0.534
56
+ 2025-11-06,2025-11-07,0.0,NIFTY 50,0.41411269780012233,0,0,False,0.534
57
+ 2025-11-07,2025-11-10,1.0,NIFTY 50,0.5415102435120893,1,1,False,0.534
58
+ 2025-11-10,2025-11-11,1.0,NIFTY 50,0.5938802636987449,1,1,False,0.534
59
+ 2025-11-11,2025-11-12,1.0,NIFTY 50,0.5662551095025361,1,1,False,0.534
60
+ 2025-11-12,2025-11-13,1.0,NIFTY 50,0.5714914773844914,1,1,False,0.534
61
+ 2025-11-13,2025-11-14,1.0,NIFTY 50,0.40639726876339377,0,0,False,0.534
62
+ 2025-11-14,2025-11-17,1.0,NIFTY 50,0.5216324609441019,0,0,False,0.534
63
+ 2025-11-17,2025-11-18,0.0,NIFTY 50,0.433597888439016,0,0,False,0.534
64
+ 2025-11-18,2025-11-19,1.0,NIFTY 50,0.42191523985590873,0,0,False,0.534
65
+ 2025-11-19,2025-11-20,1.0,NIFTY 50,0.6068997993300329,1,0,True,0.534
66
+ 2025-11-20,2025-11-21,0.0,NIFTY 50,0.4242586816473318,0,0,False,0.534
67
+ 2025-11-21,2025-11-24,0.0,NIFTY 50,0.5840570286651197,1,0,True,0.534
68
+ 2025-11-24,2025-11-25,0.0,NIFTY 50,0.5881340246769219,1,0,True,0.534
69
+ 2025-11-25,2025-11-26,1.0,NIFTY 50,0.6129044572423406,1,0,True,0.534
70
+ 2025-11-26,2025-11-27,1.0,NIFTY 50,0.6001834336603084,1,1,False,0.534
71
+ 2025-11-27,2025-11-28,0.0,NIFTY 50,0.5465846661202793,1,1,False,0.534
72
+ 2025-11-28,2025-12-01,0.0,NIFTY 50,0.5863369161532617,1,1,False,0.534
73
+ 2025-12-01,2025-12-02,0.0,NIFTY 50,0.44235750445202715,0,0,False,0.534
74
+ 2025-12-02,2025-12-03,0.0,NIFTY 50,0.5423233175792196,1,1,False,0.534
75
+ 2025-12-03,2025-12-04,1.0,NIFTY 50,0.5534585331276892,1,1,False,0.534
76
+ 2025-12-04,2025-12-05,1.0,NIFTY 50,0.5337024112788841,0,0,False,0.534
77
+ 2025-12-05,2025-12-08,0.0,NIFTY 50,0.5712813422590938,1,1,False,0.534
78
+ 2025-12-08,2025-12-09,0.0,NIFTY 50,0.4395054437694398,0,0,False,0.534
79
+ 2025-12-09,2025-12-10,0.0,NIFTY 50,0.4980523601817214,0,0,False,0.534
80
+ 2025-12-10,2025-12-11,1.0,NIFTY 50,0.565657228898123,1,1,False,0.534
81
+ 2025-12-11,2025-12-12,1.0,NIFTY 50,0.5746715806813223,1,1,False,0.534
82
+ 2025-12-12,2025-12-15,0.0,NIFTY 50,0.4220568285799748,0,0,False,0.534
83
+ 2025-12-15,2025-12-16,0.0,NIFTY 50,0.46088119480548073,0,0,False,0.534
84
+ 2025-12-16,2025-12-17,0.0,NIFTY 50,0.5000953129429735,0,0,False,0.534
85
+ 2025-12-17,2025-12-18,0.0,NIFTY 50,0.3988020111495848,0,0,False,0.534
86
+ 2025-12-18,2025-12-19,1.0,NIFTY 50,0.5678784849744942,1,1,False,0.534
87
+ 2025-12-19,2025-12-22,1.0,NIFTY 50,0.6000632269174573,1,1,False,0.534
88
+ 2025-12-22,2025-12-23,1.0,NIFTY 50,0.6163293810213352,1,0,True,0.534
89
+ 2025-12-23,2025-12-24,0.0,NIFTY 50,0.580484045665327,1,0,True,0.534
90
+ 2025-12-24,2025-12-26,0.0,NIFTY 50,0.5759352105038948,1,0,True,0.534
91
+ 2025-12-26,2025-12-29,0.0,NIFTY 50,0.5074748001131483,0,0,False,0.534
92
+ 2025-12-29,2025-12-30,1.0,NIFTY 50,0.4739704317372523,0,0,False,0.534
93
+ 2025-12-30,2025-12-31,1.0,NIFTY 50,0.5358962850749209,1,1,False,0.534
94
+ 2025-12-31,2026-01-01,0.0,NIFTY 50,0.4692123737240301,0,0,False,0.534
95
+ 2026-01-01,2026-01-02,1.0,NIFTY 50,0.5296741160122739,0,1,True,0.534
96
+ 2026-01-02,2026-01-05,0.0,NIFTY 50,0.5894790893053418,1,0,True,0.534
97
+ 2026-01-05,2026-01-06,0.0,NIFTY 50,0.5941095615465644,1,0,True,0.534
98
+ 2026-01-06,2026-01-07,0.0,NIFTY 50,0.5649513820646873,1,0,True,0.534
99
+ 2026-01-07,2026-01-08,0.0,NIFTY 50,0.47329986322318746,0,0,False,0.534
100
+ 2026-01-08,2026-01-09,0.0,NIFTY 50,0.5113991826194382,0,0,False,0.534
101
+ 2026-01-09,2026-01-12,1.0,NIFTY 50,0.559521016715203,1,1,False,0.534
102
+ 2026-01-12,2026-01-13,0.0,NIFTY 50,0.5119863308182176,0,0,False,0.534
103
+ 2026-01-13,2026-01-14,0.0,NIFTY 50,0.4721994285947515,0,0,False,0.534
104
+ 2026-01-14,2026-01-16,1.0,NIFTY 50,0.44782721932241576,0,0,False,0.534
105
+ 2026-01-16,2026-01-19,0.0,NIFTY 50,0.5284886440966932,0,0,False,0.534
106
+ 2026-01-19,2026-01-20,0.0,NIFTY 50,0.5118411601145365,0,0,False,0.534
107
+ 2026-01-20,2026-01-21,0.0,NIFTY 50,0.4107099873243679,0,0,False,0.534
108
+ 2026-01-21,2026-01-22,1.0,NIFTY 50,0.5634667834415262,1,1,False,0.534
109
+ 2026-01-22,2026-01-23,0.0,NIFTY 50,0.601243568514449,1,1,False,0.534
110
+ 2026-01-23,2026-01-27,1.0,NIFTY 50,0.527768570427711,0,1,True,0.534
111
+ 2026-01-27,2026-01-28,1.0,NIFTY 50,0.5612141182671957,1,1,False,0.534
112
+ 2026-01-28,2026-01-29,1.0,NIFTY 50,0.5568177629714751,1,1,False,0.534
113
+ 2026-01-29,2026-01-30,0.0,NIFTY 50,0.5268602943541862,0,0,False,0.534
114
+ 2026-01-30,2026-02-01,0.0,NIFTY 50,0.46670774075183447,0,0,False,0.534
115
+ 2026-02-01,2026-02-02,1.0,NIFTY 50,0.5177079461787618,0,0,False,0.534
116
+ 2026-02-02,2026-02-03,1.0,NIFTY 50,0.5678782913417888,1,1,False,0.534
117
+ 2026-02-03,2026-02-04,1.0,NIFTY 50,0.4614500543892204,0,1,True,0.534
118
+ 2026-02-04,2026-02-05,0.0,NIFTY 50,0.4886936769685186,0,0,False,0.534
119
+ 2026-02-05,2026-02-06,1.0,NIFTY 50,0.40955713700012886,0,0,False,0.534
120
+ 2026-02-06,2026-02-09,1.0,NIFTY 50,0.5849847365736586,1,1,False,0.534
121
+ 2026-02-09,2026-02-10,1.0,NIFTY 50,0.6085282990939179,1,1,False,0.534
122
+ 2026-02-10,2026-02-11,1.0,NIFTY 50,0.5227805299218083,0,1,True,0.534
123
+ 2026-02-11,2026-02-12,0.0,NIFTY 50,0.5464761411738286,1,1,False,0.534
124
+ 2026-02-12,2026-02-13,0.0,NIFTY 50,0.4006181838105184,0,0,False,0.534
125
+ 2026-02-13,2026-02-16,1.0,NIFTY 50,0.5311860487441447,0,1,True,0.534
126
+ 2026-02-16,2026-02-17,1.0,NIFTY 50,0.5377001886513697,1,1,False,0.534
127
+ 2026-02-17,2026-02-18,1.0,NIFTY 50,0.5615366193607534,1,1,False,0.534
128
+ 2026-02-18,2026-02-19,0.0,NIFTY 50,0.6136933713501893,1,1,False,0.534
129
+ 2026-02-19,2026-02-20,1.0,NIFTY 50,0.498176437072616,0,0,False,0.534
130
+ 2026-02-20,2026-02-23,1.0,NIFTY 50,0.594829954555716,1,1,False,0.534
131
+ 2026-02-23,2026-02-24,0.0,NIFTY 50,0.4166689173622839,0,0,False,0.534
132
+ 2026-02-24,2026-02-25,1.0,NIFTY 50,0.5985468333365371,1,1,False,0.534
133
+ 2026-02-25,2026-02-26,1.0,NIFTY 50,0.5979095639925474,1,1,False,0.534
134
+ 2026-02-26,2026-02-27,0.0,NIFTY 50,0.46720512169164585,0,0,False,0.534
135
+ 2026-02-27,2026-03-02,0.0,NIFTY 50,0.4361185094145455,0,0,False,0.534
136
+ 2026-03-02,2026-03-04,0.0,NIFTY 50,0.4767353007252328,0,0,False,0.534
137
+ 2026-03-04,2026-03-05,1.0,NIFTY 50,0.5641365980144816,1,1,False,0.534
138
+ 2026-03-05,2026-03-06,0.0,NIFTY 50,0.4324842189919343,0,0,False,0.534
139
+ 2026-03-06,2026-03-09,0.0,NIFTY 50,0.4226876694983396,0,0,False,0.534
140
+ 2026-03-09,2026-03-10,1.0,NIFTY 50,0.5694639376311524,1,1,False,0.534
141
+ 2026-03-10,2026-03-11,0.0,NIFTY 50,0.5277170416359862,0,1,True,0.534
142
+ 2026-03-11,2026-03-12,0.0,NIFTY 50,0.5068537486505618,0,0,False,0.534
143
+ 2026-03-12,2026-03-13,0.0,NIFTY 50,0.3855546035303994,0,0,False,0.534
144
+ 2026-03-13,2026-03-16,1.0,NIFTY 50,0.4847763152534577,0,0,False,0.534
145
+ 2026-03-16,2026-03-17,1.0,NIFTY 50,0.5841082171076085,1,1,False,0.534
146
+ 2026-03-17,2026-03-18,1.0,NIFTY 50,0.5865008249759258,1,1,False,0.534
147
+ 2026-03-18,2026-03-19,0.0,NIFTY 50,0.417958532652347,0,0,False,0.534
148
+ 2026-03-19,2026-03-20,1.0,NIFTY 50,0.5151493092300841,0,0,False,0.534
149
+ 2026-03-20,2026-03-23,0.0,NIFTY 50,0.39760489253859893,0,0,False,0.534
150
+ 2026-03-23,2026-03-24,1.0,NIFTY 50,0.5835135766099478,1,1,False,0.534
151
+ 2026-03-24,2026-03-25,1.0,NIFTY 50,0.4811365807451965,0,1,True,0.534
152
+ 2026-03-25,2026-03-27,0.0,NIFTY 50,0.6205108391194238,1,0,True,0.534
153
+ 2026-03-27,2026-03-30,0.0,NIFTY 50,0.3961973212018203,0,0,False,0.534
154
+ 2026-03-30,2026-04-01,1.0,NIFTY 50,0.5249869400386592,0,1,True,0.534
155
+ 2026-04-01,2026-04-02,0.0,NIFTY 50,0.5991522565411923,1,0,True,0.534
156
+ 2026-04-02,2026-04-06,1.0,NIFTY 50,0.5225468991443468,0,0,False,0.534
157
+ 2026-04-06,2026-04-07,1.0,NIFTY 50,0.5979509799890842,1,0,True,0.534
158
+ 2026-04-07,2026-04-08,1.0,NIFTY 50,0.5023713873910143,0,0,False,0.534
159
+ 2026-04-08,2026-04-09,0.0,NIFTY 50,0.632633866728192,1,0,True,0.534
160
+ 2026-04-09,2026-04-10,1.0,NIFTY 50,0.5805912922686888,1,1,False,0.534
161
+ 2026-04-10,2026-04-13,0.0,NIFTY 50,0.5764313136757429,1,0,True,0.534
162
+ 2026-04-13,2026-04-15,1.0,NIFTY 50,0.5736286505622523,1,1,False,0.534
163
+ 2026-04-15,2026-04-16,0.0,NIFTY 50,0.5933536153294778,1,1,False,0.534
164
+ 2026-04-16,2026-04-17,1.0,NIFTY 50,0.588264424067301,1,1,False,0.534
165
+ 2026-04-17,2026-04-20,0.0,NIFTY 50,0.6277881428177005,1,1,False,0.534
166
+ 2026-04-20,2026-04-21,1.0,NIFTY 50,0.4726296706095031,0,1,True,0.534
167
+ 2026-04-21,2026-04-22,0.0,NIFTY 50,0.4879880954803331,0,0,False,0.534
168
+ 2026-04-22,2026-04-23,0.0,NIFTY 50,0.5748180818738822,1,1,False,0.534
169
+ 2026-04-23,2026-04-24,0.0,NIFTY 50,0.46022251247244794,0,0,False,0.534
170
+ 2026-04-24,2026-04-27,1.0,NIFTY 50,0.5476475068002531,1,1,False,0.534
171
+ 2026-04-27,2026-04-28,0.0,NIFTY 50,0.5834865728550033,1,1,False,0.534
172
+ 2026-04-28,2026-04-29,1.0,NIFTY 50,0.46360790747743896,0,0,False,0.534
173
+ 2026-04-29,2026-04-30,0.0,NIFTY 50,0.4558273559600949,0,0,False,0.534
174
+ 2026-04-30,2026-05-04,1.0,NIFTY 50,0.5707052155573475,1,1,False,0.534
175
+ 2026-05-04,2026-05-05,0.0,NIFTY 50,0.44250548743686985,0,0,False,0.534
176
+ 2026-05-05,2026-05-06,1.0,NIFTY 50,0.5651708498032081,1,1,False,0.534
177
+ 2026-05-06,2026-05-07,0.0,NIFTY 50,0.628500042945821,1,0,True,0.534
178
+ 2026-05-07,2026-05-08,0.0,NIFTY 50,0.5028366526824437,0,0,False,0.534
179
+ 2026-05-08,2026-05-11,0.0,NIFTY 50,0.5493039845958712,1,1,False,0.534
180
+ 2026-05-11,2026-05-12,0.0,NIFTY 50,0.4772911613262734,0,0,False,0.534
181
+ 2026-05-12,2026-05-13,0.0,NIFTY 50,0.5033402199294553,0,0,False,0.534
182
+ 2026-05-13,2026-05-14,1.0,NIFTY 50,0.5374454106415442,1,1,False,0.534
183
+ 2026-05-14,2026-05-15,0.0,NIFTY 50,0.602353215819732,1,1,False,0.534
184
+ 2026-05-15,2026-05-18,1.0,NIFTY 50,0.38807528678930536,0,0,False,0.534
185
+ 2026-05-18,2026-05-19,0.0,NIFTY 50,0.525393752478875,0,0,False,0.534
186
+ 2026-05-19,2026-05-20,1.0,NIFTY 50,0.45521609322444145,0,0,False,0.534
187
+ 2026-05-20,2026-05-21,0.0,NIFTY 50,0.6263632903577923,1,1,False,0.534
188
+ 2026-05-21,2026-05-22,1.0,NIFTY 50,0.5592623787119813,1,1,False,0.534
189
+ 2026-05-22,2026-05-25,1.0,NIFTY 50,0.5905417909296148,1,1,False,0.534
190
+ 2026-05-25,2026-05-26,0.0,NIFTY 50,0.5720739816427279,1,0,True,0.534
191
+ 2026-05-26,2026-05-27,0.0,NIFTY 50,0.5609246843996288,1,1,False,0.534
192
+ 2026-05-27,2026-05-29,0.0,NIFTY 50,0.5318118078981167,0,1,True,0.534
193
+ 2026-05-29,2026-06-01,0.0,NIFTY 50,0.5512449827890056,1,1,False,0.534
194
+ 2026-06-01,2026-06-02,1.0,NIFTY 50,0.5137712844027603,0,0,False,0.534
195
+ 2026-06-02,2026-06-03,0.0,NIFTY 50,0.5241992829334582,0,0,False,0.534
196
+ 2026-06-03,2026-06-04,1.0,NIFTY 50,0.45797066351220295,0,0,False,0.534
197
+ 2026-06-04,2026-06-05,0.0,NIFTY 50,0.5434092593913658,1,1,False,0.534
198
+ 2026-06-05,2026-06-08,0.0,NIFTY 50,0.3750263841589948,0,0,False,0.534
199
+ 2026-06-08,2026-06-09,1.0,NIFTY 50,0.5069321136418525,0,0,False,0.534
200
+ 2025-08-18,2025-08-19,1.0,NIFTY BANK,0.5588377785011781,1,1,False,0.441
201
+ 2025-08-19,2025-08-20,0.0,NIFTY BANK,0.5166931522084885,1,1,False,0.441
202
+ 2025-08-20,2025-08-21,1.0,NIFTY BANK,0.5240547203099493,1,1,False,0.441
203
+ 2025-08-21,2025-08-22,0.0,NIFTY BANK,0.4844552216250727,1,1,False,0.441
204
+ 2025-08-22,2025-08-25,1.0,NIFTY BANK,0.7254680155119264,1,1,False,0.441
205
+ 2025-08-25,2025-08-26,0.0,NIFTY BANK,0.5007919036690737,1,1,False,0.441
206
+ 2025-08-26,2025-08-28,0.0,NIFTY BANK,0.6362703865376997,1,1,False,0.441
207
+ 2025-08-28,2025-08-29,0.0,NIFTY BANK,0.6581917198239189,1,1,False,0.441
208
+ 2025-08-29,2025-09-01,1.0,NIFTY BANK,0.5441387433105079,1,1,False,0.441
209
+ 2025-09-01,2025-09-02,0.0,NIFTY BANK,0.48569389777259453,1,1,False,0.441
210
+ 2025-09-02,2025-09-03,1.0,NIFTY BANK,0.46984872175610637,1,1,False,0.441
211
+ 2025-09-03,2025-09-04,1.0,NIFTY BANK,0.5550775508606937,1,1,False,0.441
212
+ 2025-09-04,2025-09-05,0.0,NIFTY BANK,0.556900282088836,1,1,False,0.441
213
+ 2025-09-05,2025-09-08,1.0,NIFTY BANK,0.5051918612854389,1,1,False,0.441
214
+ 2025-09-08,2025-09-09,1.0,NIFTY BANK,0.5524937545910922,1,1,False,0.441
215
+ 2025-09-09,2025-09-10,1.0,NIFTY BANK,0.5432836259204201,1,1,False,0.441
216
+ 2025-09-10,2025-09-11,1.0,NIFTY BANK,0.5233380932499224,1,1,False,0.441
217
+ 2025-09-11,2025-09-12,1.0,NIFTY BANK,0.5729481579002386,1,1,False,0.441
218
+ 2025-09-12,2025-09-15,1.0,NIFTY BANK,0.5117518136268505,1,1,False,0.441
219
+ 2025-09-15,2025-09-16,1.0,NIFTY BANK,0.5725276233876809,1,1,False,0.441
220
+ 2025-09-16,2025-09-17,1.0,NIFTY BANK,0.5357942190834057,1,1,False,0.441
221
+ 2025-09-17,2025-09-18,1.0,NIFTY BANK,0.5318528717627513,1,1,False,0.441
222
+ 2025-09-18,2025-09-19,0.0,NIFTY BANK,0.5359038257602006,1,1,False,0.441
223
+ 2025-09-19,2025-09-22,0.0,NIFTY BANK,0.5567422311190796,1,1,False,0.441
224
+ 2025-09-22,2025-09-23,1.0,NIFTY BANK,0.5655706312847864,1,1,False,0.441
225
+ 2025-09-23,2025-09-24,0.0,NIFTY BANK,0.5273029294531747,1,1,False,0.441
226
+ 2025-09-24,2025-09-25,0.0,NIFTY BANK,0.5236357174983223,1,1,False,0.441
227
+ 2025-09-25,2025-09-26,0.0,NIFTY BANK,0.5179199434701302,1,1,False,0.441
228
+ 2025-09-26,2025-09-29,1.0,NIFTY BANK,0.598070107257659,1,1,False,0.441
229
+ 2025-09-29,2025-09-30,1.0,NIFTY BANK,0.6251642458315686,1,1,False,0.441
230
+ 2025-09-30,2025-10-01,1.0,NIFTY BANK,0.6341748384157281,1,1,False,0.441
231
+ 2025-10-01,2025-10-03,1.0,NIFTY BANK,0.6236136419947074,1,1,False,0.441
232
+ 2025-10-03,2025-10-06,1.0,NIFTY BANK,0.5673868728722319,1,1,False,0.441
233
+ 2025-10-06,2025-10-07,1.0,NIFTY BANK,0.5241717526741404,1,1,False,0.441
234
+ 2025-10-07,2025-10-08,0.0,NIFTY BANK,0.47442565832614864,1,1,False,0.441
235
+ 2025-10-08,2025-10-09,1.0,NIFTY BANK,0.584808761192861,1,1,False,0.441
236
+ 2025-10-09,2025-10-10,1.0,NIFTY BANK,0.4573106207270558,1,1,False,0.441
237
+ 2025-10-10,2025-10-13,1.0,NIFTY BANK,0.30784310884353416,0,0,False,0.441
238
+ 2025-10-13,2025-10-14,0.0,NIFTY BANK,0.6486973902839974,1,1,False,0.441
239
+ 2025-10-14,2025-10-15,1.0,NIFTY BANK,0.5148319573821519,1,1,False,0.441
240
+ 2025-10-15,2025-10-16,1.0,NIFTY BANK,0.5520788531072237,1,1,False,0.441
241
+ 2025-10-16,2025-10-17,1.0,NIFTY BANK,0.431794254146241,0,0,False,0.441
242
+ 2025-10-17,2025-10-20,1.0,NIFTY BANK,0.6143589360790827,1,1,False,0.441
243
+ 2025-10-20,2025-10-21,0.0,NIFTY BANK,0.6413169746170658,1,1,False,0.441
244
+ 2025-10-21,2025-10-23,1.0,NIFTY BANK,0.5359692797715029,1,1,False,0.441
245
+ 2025-10-23,2025-10-24,0.0,NIFTY BANK,0.6070705764242759,1,1,False,0.441
246
+ 2025-10-24,2025-10-27,1.0,NIFTY BANK,0.6460015570117955,1,1,False,0.441
247
+ 2025-10-27,2025-10-28,1.0,NIFTY BANK,0.6646556387465268,1,1,False,0.441
248
+ 2025-10-28,2025-10-29,1.0,NIFTY BANK,0.6174305935768977,1,1,False,0.441
249
+ 2025-10-29,2025-10-30,0.0,NIFTY BANK,0.49220005416402224,1,1,False,0.441
250
+ 2025-10-30,2025-10-31,0.0,NIFTY BANK,0.45863962926719787,1,1,False,0.441
251
+ 2025-10-31,2025-11-03,1.0,NIFTY BANK,0.5256882722430021,1,1,False,0.441
252
+ 2025-11-03,2025-11-04,0.0,NIFTY BANK,0.553423553833478,1,1,False,0.441
253
+ 2025-11-04,2025-11-06,0.0,NIFTY BANK,0.439012562444136,0,0,False,0.441
254
+ 2025-11-06,2025-11-07,1.0,NIFTY BANK,0.46243589243674715,1,1,False,0.441
255
+ 2025-11-07,2025-11-10,0.0,NIFTY BANK,0.5435534434638563,1,1,False,0.441
256
+ 2025-11-10,2025-11-11,1.0,NIFTY BANK,0.6414216064299997,1,1,False,0.441
257
+ 2025-11-11,2025-11-12,1.0,NIFTY BANK,0.5692996135279698,1,1,False,0.441
258
+ 2025-11-12,2025-11-13,1.0,NIFTY BANK,0.5924934558340679,1,1,False,0.441
259
+ 2025-11-13,2025-11-14,1.0,NIFTY BANK,0.4184731972544092,0,0,False,0.441
260
+ 2025-11-14,2025-11-17,1.0,NIFTY BANK,0.5208404422830241,1,1,False,0.441
261
+ 2025-11-17,2025-11-18,0.0,NIFTY BANK,0.4294696261151679,0,0,False,0.441
262
+ 2025-11-18,2025-11-19,1.0,NIFTY BANK,0.4408542731354291,0,0,False,0.441
263
+ 2025-11-19,2025-11-20,1.0,NIFTY BANK,0.5268734410777605,1,1,False,0.441
264
+ 2025-11-20,2025-11-21,0.0,NIFTY BANK,0.3899767370260608,0,0,False,0.441
265
+ 2025-11-21,2025-11-24,0.0,NIFTY BANK,0.6407515563312967,1,1,False,0.441
266
+ 2025-11-24,2025-11-25,1.0,NIFTY BANK,0.6262759456251851,1,1,False,0.441
267
+ 2025-11-25,2025-11-26,1.0,NIFTY BANK,0.6948378364633823,1,1,False,0.441
268
+ 2025-11-26,2025-11-27,1.0,NIFTY BANK,0.587994387428661,1,1,False,0.441
269
+ 2025-11-27,2025-11-28,0.0,NIFTY BANK,0.4512431014324674,1,1,False,0.441
270
+ 2025-11-28,2025-12-01,0.0,NIFTY BANK,0.5097758271858291,1,1,False,0.441
271
+ 2025-12-01,2025-12-02,0.0,NIFTY BANK,0.4545582414269633,1,1,False,0.441
272
+ 2025-12-02,2025-12-03,0.0,NIFTY BANK,0.5090246062976613,1,1,False,0.441
273
+ 2025-12-03,2025-12-04,0.0,NIFTY BANK,0.5008593759111402,1,1,False,0.441
274
+ 2025-12-04,2025-12-05,1.0,NIFTY BANK,0.4855500501628102,1,1,False,0.441
275
+ 2025-12-05,2025-12-08,0.0,NIFTY BANK,0.5374445344449,1,1,False,0.441
276
+ 2025-12-08,2025-12-09,1.0,NIFTY BANK,0.4871960796322334,1,1,False,0.441
277
+ 2025-12-09,2025-12-10,0.0,NIFTY BANK,0.496909136063613,1,1,False,0.441
278
+ 2025-12-10,2025-12-11,1.0,NIFTY BANK,0.5745174183474924,1,1,False,0.441
279
+ 2025-12-11,2025-12-12,1.0,NIFTY BANK,0.5774718420540389,1,1,False,0.441
280
+ 2025-12-12,2025-12-15,1.0,NIFTY BANK,0.43087187479062894,0,0,False,0.441
281
+ 2025-12-15,2025-12-16,0.0,NIFTY BANK,0.4975910478872394,1,1,False,0.441
282
+ 2025-12-16,2025-12-17,0.0,NIFTY BANK,0.5143930117258145,1,1,False,0.441
283
+ 2025-12-17,2025-12-18,0.0,NIFTY BANK,0.42620313284917,0,0,False,0.441
284
+ 2025-12-18,2025-12-19,1.0,NIFTY BANK,0.5727380785130008,1,1,False,0.441
285
+ 2025-12-19,2025-12-22,1.0,NIFTY BANK,0.5841550113600833,1,1,False,0.441
286
+ 2025-12-22,2025-12-23,0.0,NIFTY BANK,0.592344432624301,1,1,False,0.441
287
+ 2025-12-23,2025-12-24,0.0,NIFTY BANK,0.5611967883029432,1,1,False,0.441
288
+ 2025-12-24,2025-12-26,0.0,NIFTY BANK,0.5963628262966799,1,1,False,0.441
289
+ 2025-12-26,2025-12-29,0.0,NIFTY BANK,0.5642185261176393,1,1,False,0.441
290
+ 2025-12-29,2025-12-30,1.0,NIFTY BANK,0.5534355921082946,1,1,False,0.441
291
+ 2025-12-30,2025-12-31,1.0,NIFTY BANK,0.5741710882710045,1,1,False,0.441
292
+ 2025-12-31,2026-01-01,1.0,NIFTY BANK,0.4920227485576892,1,1,False,0.441
293
+ 2026-01-01,2026-01-02,1.0,NIFTY BANK,0.46173149949402414,1,1,False,0.441
294
+ 2026-01-02,2026-01-05,0.0,NIFTY BANK,0.5002522096005979,1,1,False,0.441
295
+ 2026-01-05,2026-01-06,1.0,NIFTY BANK,0.517389797896784,1,1,False,0.441
296
+ 2026-01-06,2026-01-07,0.0,NIFTY BANK,0.5299095243383989,1,1,False,0.441
297
+ 2026-01-07,2026-01-08,0.0,NIFTY BANK,0.4770273208278411,1,1,False,0.441
298
+ 2026-01-08,2026-01-09,0.0,NIFTY BANK,0.547252533748364,1,1,False,0.441
299
+ 2026-01-09,2026-01-12,1.0,NIFTY BANK,0.5645613062720393,1,1,False,0.441
300
+ 2026-01-12,2026-01-13,1.0,NIFTY BANK,0.5324042115077703,1,1,False,0.441
301
+ 2026-01-13,2026-01-14,1.0,NIFTY BANK,0.4901310824448423,1,1,False,0.441
302
+ 2026-01-14,2026-01-16,1.0,NIFTY BANK,0.498780350980558,1,1,False,0.441
303
+ 2026-01-16,2026-01-19,0.0,NIFTY BANK,0.525934263756972,1,1,False,0.441
304
+ 2026-01-19,2026-01-20,0.0,NIFTY BANK,0.48066094392046393,1,1,False,0.441
305
+ 2026-01-20,2026-01-21,0.0,NIFTY BANK,0.4103376218683069,0,0,False,0.441
306
+ 2026-01-21,2026-01-22,1.0,NIFTY BANK,0.5968680551192657,1,1,False,0.441
307
+ 2026-01-22,2026-01-23,0.0,NIFTY BANK,0.5742881934258481,1,1,False,0.441
308
+ 2026-01-23,2026-01-27,1.0,NIFTY BANK,0.5504790333310643,1,1,False,0.441
309
+ 2026-01-27,2026-01-28,1.0,NIFTY BANK,0.5588479045782494,1,1,False,0.441
310
+ 2026-01-28,2026-01-29,1.0,NIFTY BANK,0.5275778644355509,1,1,False,0.441
311
+ 2026-01-29,2026-01-30,0.0,NIFTY BANK,0.47574602280260037,1,1,False,0.441
312
+ 2026-01-30,2026-02-01,0.0,NIFTY BANK,0.464136855776186,1,1,False,0.441
313
+ 2026-02-01,2026-02-02,1.0,NIFTY BANK,0.5036260153738212,1,1,False,0.441
314
+ 2026-02-02,2026-02-03,1.0,NIFTY BANK,0.5153705488864834,1,1,False,0.441
315
+ 2026-02-03,2026-02-04,1.0,NIFTY BANK,0.4299602275937551,0,0,False,0.441
316
+ 2026-02-04,2026-02-05,0.0,NIFTY BANK,0.4458853947009841,1,1,False,0.441
317
+ 2026-02-05,2026-02-06,1.0,NIFTY BANK,0.40438025579667175,0,0,False,0.441
318
+ 2026-02-06,2026-02-09,1.0,NIFTY BANK,0.5870954516356429,1,1,False,0.441
319
+ 2026-02-09,2026-02-10,0.0,NIFTY BANK,0.5044927076623261,1,1,False,0.441
320
+ 2026-02-10,2026-02-11,1.0,NIFTY BANK,0.47231712830698663,1,1,False,0.441
321
+ 2026-02-11,2026-02-12,0.0,NIFTY BANK,0.5259573613188788,1,1,False,0.441
322
+ 2026-02-12,2026-02-13,0.0,NIFTY BANK,0.4382238623568454,0,0,False,0.441
323
+ 2026-02-13,2026-02-16,1.0,NIFTY BANK,0.5304871526193005,1,1,False,0.441
324
+ 2026-02-16,2026-02-17,1.0,NIFTY BANK,0.4827399909635966,1,1,False,0.441
325
+ 2026-02-17,2026-02-18,1.0,NIFTY BANK,0.5088344826567889,1,1,False,0.441
326
+ 2026-02-18,2026-02-19,0.0,NIFTY BANK,0.5235604535809829,1,1,False,0.441
327
+ 2026-02-19,2026-02-20,1.0,NIFTY BANK,0.507039047446649,1,1,False,0.441
328
+ 2026-02-20,2026-02-23,1.0,NIFTY BANK,0.5697021581120535,1,1,False,0.441
329
+ 2026-02-23,2026-02-24,0.0,NIFTY BANK,0.486147273447877,1,1,False,0.441
330
+ 2026-02-24,2026-02-25,0.0,NIFTY BANK,0.5819281766512729,1,1,False,0.441
331
+ 2026-02-25,2026-02-26,1.0,NIFTY BANK,0.5553052121107412,1,1,False,0.441
332
+ 2026-02-26,2026-02-27,0.0,NIFTY BANK,0.48334913999407353,1,1,False,0.441
333
+ 2026-02-27,2026-03-02,0.0,NIFTY BANK,0.47732160564896575,1,1,False,0.441
334
+ 2026-03-02,2026-03-04,0.0,NIFTY BANK,0.5054825998738527,1,1,False,0.441
335
+ 2026-03-04,2026-03-05,1.0,NIFTY BANK,0.5758457778929984,1,1,False,0.441
336
+ 2026-03-05,2026-03-06,0.0,NIFTY BANK,0.41076597300670903,0,0,False,0.441
337
+ 2026-03-06,2026-03-09,0.0,NIFTY BANK,0.4152501477569853,0,0,False,0.441
338
+ 2026-03-09,2026-03-10,1.0,NIFTY BANK,0.5687857774905121,1,1,False,0.441
339
+ 2026-03-10,2026-03-11,0.0,NIFTY BANK,0.5550548544682724,1,1,False,0.441
340
+ 2026-03-11,2026-03-12,0.0,NIFTY BANK,0.4678941725163326,1,1,False,0.441
341
+ 2026-03-12,2026-03-13,0.0,NIFTY BANK,0.40886624755422835,0,0,False,0.441
342
+ 2026-03-13,2026-03-16,1.0,NIFTY BANK,0.5141951933104283,1,1,False,0.441
343
+ 2026-03-16,2026-03-17,1.0,NIFTY BANK,0.5938442473123131,1,1,False,0.441
344
+ 2026-03-17,2026-03-18,1.0,NIFTY BANK,0.5593611195704979,1,1,False,0.441
345
+ 2026-03-18,2026-03-19,0.0,NIFTY BANK,0.3494413958882923,0,0,False,0.441
346
+ 2026-03-19,2026-03-20,0.0,NIFTY BANK,0.5228357545858108,1,1,False,0.441
347
+ 2026-03-20,2026-03-23,0.0,NIFTY BANK,0.3845261719847666,0,0,False,0.441
348
+ 2026-03-23,2026-03-24,1.0,NIFTY BANK,0.6188867719822448,1,1,False,0.441
349
+ 2026-03-24,2026-03-25,1.0,NIFTY BANK,0.431817994901069,0,0,False,0.441
350
+ 2026-03-25,2026-03-27,0.0,NIFTY BANK,0.5574990075739839,1,1,False,0.441
351
+ 2026-03-27,2026-03-30,0.0,NIFTY BANK,0.35938122936069866,0,0,False,0.441
352
+ 2026-03-30,2026-04-01,1.0,NIFTY BANK,0.5816983975919096,1,1,False,0.441
353
+ 2026-04-01,2026-04-02,1.0,NIFTY BANK,0.5974625657117382,1,1,False,0.441
354
+ 2026-04-02,2026-04-06,1.0,NIFTY BANK,0.4932985578855962,1,1,False,0.441
355
+ 2026-04-06,2026-04-07,1.0,NIFTY BANK,0.5311181059378174,1,1,False,0.441
356
+ 2026-04-07,2026-04-08,1.0,NIFTY BANK,0.5190147870096274,1,1,False,0.441
357
+ 2026-04-08,2026-04-09,0.0,NIFTY BANK,0.7498975078462241,1,1,False,0.441
358
+ 2026-04-09,2026-04-10,1.0,NIFTY BANK,0.6328144233068776,1,1,False,0.441
359
+ 2026-04-10,2026-04-13,0.0,NIFTY BANK,0.5547494990162047,1,1,False,0.441
360
+ 2026-04-13,2026-04-15,1.0,NIFTY BANK,0.6219738076571709,1,1,False,0.441
361
+ 2026-04-15,2026-04-16,0.0,NIFTY BANK,0.6284447706695308,1,1,False,0.441
362
+ 2026-04-16,2026-04-17,1.0,NIFTY BANK,0.5755995319017181,1,1,False,0.441
363
+ 2026-04-17,2026-04-20,0.0,NIFTY BANK,0.7008988266157611,1,1,False,0.441
364
+ 2026-04-20,2026-04-21,1.0,NIFTY BANK,0.5262870763167674,1,1,False,0.441
365
+ 2026-04-21,2026-04-22,0.0,NIFTY BANK,0.49836127981972633,1,1,False,0.441
366
+ 2026-04-22,2026-04-23,0.0,NIFTY BANK,0.6342292098711996,1,1,False,0.441
367
+ 2026-04-23,2026-04-24,0.0,NIFTY BANK,0.5443982279109865,1,1,False,0.441
368
+ 2026-04-24,2026-04-27,1.0,NIFTY BANK,0.6197752113817793,1,1,False,0.441
369
+ 2026-04-27,2026-04-28,0.0,NIFTY BANK,0.5572411788215056,1,1,False,0.441
370
+ 2026-04-28,2026-04-29,0.0,NIFTY BANK,0.5768969888910844,1,1,False,0.441
371
+ 2026-04-29,2026-04-30,0.0,NIFTY BANK,0.5017749827262901,1,1,False,0.441
372
+ 2026-04-30,2026-05-04,1.0,NIFTY BANK,0.7113082286290051,1,1,False,0.441
373
+ 2026-05-04,2026-05-05,0.0,NIFTY BANK,0.524774078579971,1,1,False,0.441
374
+ 2026-05-05,2026-05-06,1.0,NIFTY BANK,0.6886441266835467,1,1,False,0.441
375
+ 2026-05-06,2026-05-07,1.0,NIFTY BANK,0.7408042399067527,1,1,False,0.441
376
+ 2026-05-07,2026-05-08,0.0,NIFTY BANK,0.5699987010104401,1,1,False,0.441
377
+ 2026-05-08,2026-05-11,0.0,NIFTY BANK,0.6706764067554816,1,1,False,0.441
378
+ 2026-05-11,2026-05-12,0.0,NIFTY BANK,0.5809303535493776,1,1,False,0.441
379
+ 2026-05-12,2026-05-13,0.0,NIFTY BANK,0.5784504519034966,1,1,False,0.441
380
+ 2026-05-13,2026-05-14,1.0,NIFTY BANK,0.6023289505151382,1,1,False,0.441
381
+ 2026-05-14,2026-05-15,0.0,NIFTY BANK,0.6514996345315953,1,1,False,0.441
382
+ 2026-05-15,2026-05-18,0.0,NIFTY BANK,0.45494591310661925,1,1,False,0.441
383
+ 2026-05-18,2026-05-19,0.0,NIFTY BANK,0.5655618882227719,1,1,False,0.441
384
+ 2026-05-19,2026-05-20,1.0,NIFTY BANK,0.6930863669652996,1,1,False,0.441
385
+ 2026-05-20,2026-05-21,0.0,NIFTY BANK,0.8752468404729982,1,1,False,0.441
386
+ 2026-05-21,2026-05-22,1.0,NIFTY BANK,0.7798256044829933,1,1,False,0.441
387
+ 2026-05-22,2026-05-25,1.0,NIFTY BANK,0.7634818470172767,1,1,False,0.441
388
+ 2026-05-25,2026-05-26,0.0,NIFTY BANK,0.47246674253935983,1,1,False,0.441
389
+ 2026-05-26,2026-05-27,0.0,NIFTY BANK,0.5515676997216161,1,1,False,0.441
390
+ 2026-05-27,2026-05-29,0.0,NIFTY BANK,0.4968721704095498,1,1,False,0.441
391
+ 2026-05-29,2026-06-01,0.0,NIFTY BANK,0.5438486279399394,1,1,False,0.441
392
+ 2026-06-01,2026-06-02,1.0,NIFTY BANK,0.5211227413642389,1,1,False,0.441
393
+ 2026-06-02,2026-06-03,1.0,NIFTY BANK,0.6067499135685849,1,1,False,0.441
394
+ 2026-06-03,2026-06-04,1.0,NIFTY BANK,0.4601650408079591,1,1,False,0.441
395
+ 2026-06-04,2026-06-05,1.0,NIFTY BANK,0.5707143061811359,1,1,False,0.441
396
+ 2026-06-05,2026-06-08,0.0,NIFTY BANK,0.3052152550867235,0,0,False,0.441
397
+ 2026-06-08,2026-06-09,1.0,NIFTY BANK,0.5228181150928529,1,1,False,0.441
models/nifty_forecaster/outputs/old_vs_new_tomorrow_prediction_comparison.csv ADDED
@@ -0,0 +1,191 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ forecast_date,target_date,target,old_prob_up,old_threshold,old_raw_pred,old_pred,old_prediction,old_correct,new_prob_up,new_raw_pred,new_pred,threshold,new_prediction,new_correct,actual,delta,prob_shift
2
+ 2025-08-18,2025-08-19,1,0.540301437947775,0.536,1,1,UP,True,0.5387922999048892,0,1,0.54,UP,True,UP,BOTH_RIGHT,-0.0015091380428857715
3
+ 2025-08-19,2025-08-20,1,0.47352283605899814,0.536,0,0,DOWN,False,0.4565709803121779,0,0,0.54,DOWN,False,UP,BOTH_WRONG,-0.016951855746820232
4
+ 2025-08-20,2025-08-21,1,0.49610818763242287,0.536,0,0,DOWN,False,0.4992868480400285,0,0,0.54,DOWN,False,UP,BOTH_WRONG,0.0031786604076056157
5
+ 2025-08-21,2025-08-22,0,0.46507105157328893,0.536,0,0,DOWN,True,0.4425612001450567,0,0,0.54,DOWN,True,DOWN,BOTH_RIGHT,-0.022509851428232253
6
+ 2025-08-22,2025-08-25,1,0.5859892977364948,0.536,1,1,UP,True,0.6109679531883389,1,1,0.54,UP,True,UP,BOTH_RIGHT,0.02497865545184408
7
+ 2025-08-25,2025-08-26,0,0.46891835810041493,0.536,0,0,DOWN,True,0.4860360731922242,0,0,0.54,DOWN,True,DOWN,BOTH_RIGHT,0.01711771509180926
8
+ 2025-08-26,2025-08-28,0,0.5422499646521992,0.536,1,1,UP,False,0.5558948299098592,1,1,0.54,UP,False,DOWN,BOTH_WRONG,0.013644865257659955
9
+ 2025-08-28,2025-08-29,0,0.5655464408435318,0.536,1,1,UP,False,0.5819974103501351,1,1,0.54,UP,False,DOWN,BOTH_WRONG,0.016450969506603297
10
+ 2025-08-29,2025-09-01,1,0.42886471810637505,0.536,0,0,DOWN,False,0.4129614760411237,0,0,0.54,DOWN,False,UP,BOTH_WRONG,-0.015903242065251344
11
+ 2025-09-01,2025-09-02,0,0.5227108930987767,0.536,0,0,DOWN,True,0.5257857222100978,0,0,0.54,DOWN,True,DOWN,BOTH_RIGHT,0.0030748291113210646
12
+ 2025-09-02,2025-09-03,1,0.4263069065947334,0.536,0,0,DOWN,False,0.4589708476727874,0,0,0.54,DOWN,False,UP,BOTH_WRONG,0.03266394107805398
13
+ 2025-09-03,2025-09-04,1,0.5845926102291316,0.536,1,1,UP,True,0.5944000322132411,1,1,0.54,UP,True,UP,BOTH_RIGHT,0.009807421984109554
14
+ 2025-09-04,2025-09-05,1,0.5922538604969428,0.536,1,1,UP,True,0.6097370259991437,1,1,0.54,UP,True,UP,BOTH_RIGHT,0.01748316550220086
15
+ 2025-09-05,2025-09-08,1,0.4947139776695654,0.536,0,0,DOWN,False,0.5027094609390756,0,0,0.54,DOWN,False,UP,BOTH_WRONG,0.007995483269510273
16
+ 2025-09-08,2025-09-09,1,0.5729275914165338,0.536,1,1,UP,True,0.5543361540489714,1,1,0.54,UP,True,UP,BOTH_RIGHT,-0.018591437367562413
17
+ 2025-09-09,2025-09-10,1,0.5575173707220272,0.536,1,1,UP,True,0.5731087727731737,1,1,0.54,UP,True,UP,BOTH_RIGHT,0.015591402051146508
18
+ 2025-09-10,2025-09-11,1,0.5471480986377999,0.536,1,1,UP,True,0.5457127979560241,1,1,0.54,UP,True,UP,BOTH_RIGHT,-0.0014353006817757752
19
+ 2025-09-11,2025-09-12,1,0.5997583243799682,0.536,1,1,UP,True,0.5999398217278072,1,1,0.54,UP,True,UP,BOTH_RIGHT,0.00018149734783901028
20
+ 2025-09-12,2025-09-15,0,0.5437449849136992,0.536,1,1,UP,False,0.5387842215940889,0,0,0.54,DOWN,True,DOWN,NEW_FIXED_OLD_MISS,-0.004960763319610262
21
+ 2025-09-15,2025-09-16,1,0.56576253437057,0.536,1,1,UP,True,0.5437777344053779,1,1,0.54,UP,True,UP,BOTH_RIGHT,-0.021984799965192092
22
+ 2025-09-16,2025-09-17,1,0.5210374325511685,0.536,0,0,DOWN,False,0.4908726237911221,0,0,0.54,DOWN,False,UP,BOTH_WRONG,-0.030164808760046402
23
+ 2025-09-17,2025-09-18,1,0.5509613412872568,0.536,1,1,UP,True,0.5462526436299383,1,1,0.54,UP,True,UP,BOTH_RIGHT,-0.004708697657318517
24
+ 2025-09-18,2025-09-19,0,0.5941771475037843,0.536,1,1,UP,False,0.5987081150307438,1,1,0.54,UP,False,DOWN,BOTH_WRONG,0.004530967526959584
25
+ 2025-09-19,2025-09-22,0,0.5737343395619731,0.536,1,1,UP,False,0.5857403673249324,1,1,0.54,UP,False,DOWN,BOTH_WRONG,0.012006027762959337
26
+ 2025-09-22,2025-09-23,0,0.543860796049481,0.536,1,1,UP,False,0.5289327701126791,0,1,0.54,UP,False,DOWN,BOTH_WRONG,-0.01492802593680187
27
+ 2025-09-23,2025-09-24,0,0.46641073856317045,0.536,0,0,DOWN,True,0.4499474495076921,0,0,0.54,DOWN,True,DOWN,BOTH_RIGHT,-0.016463289055478336
28
+ 2025-09-24,2025-09-25,0,0.4845722291951376,0.536,0,0,DOWN,True,0.4741432899528084,0,0,0.54,DOWN,True,DOWN,BOTH_RIGHT,-0.010428939242329183
29
+ 2025-09-25,2025-09-26,0,0.45880644509450436,0.536,0,0,DOWN,True,0.4394276886326496,0,0,0.54,DOWN,True,DOWN,BOTH_RIGHT,-0.019378756461854774
30
+ 2025-09-26,2025-09-29,1,0.5614244669585573,0.536,1,1,UP,True,0.5854520573982495,1,1,0.54,UP,True,UP,BOTH_RIGHT,0.02402759043969216
31
+ 2025-09-29,2025-09-30,0,0.5503774248779337,0.536,1,1,UP,False,0.537965339273658,0,0,0.54,DOWN,True,DOWN,NEW_FIXED_OLD_MISS,-0.012412085604275758
32
+ 2025-09-30,2025-10-01,1,0.5575498966418577,0.536,1,1,UP,True,0.5866370120672582,1,1,0.54,UP,True,UP,BOTH_RIGHT,0.029087115425400434
33
+ 2025-10-01,2025-10-03,1,0.5812767986118033,0.536,1,1,UP,True,0.602770305939823,1,1,0.54,UP,True,UP,BOTH_RIGHT,0.02149350732801969
34
+ 2025-10-03,2025-10-06,1,0.5385250631611949,0.536,1,1,UP,True,0.5481808080232358,1,1,0.54,UP,True,UP,BOTH_RIGHT,0.009655744862040905
35
+ 2025-10-06,2025-10-07,1,0.6037925768893755,0.536,1,1,UP,True,0.5795384547268093,1,1,0.54,UP,True,UP,BOTH_RIGHT,-0.024254122162566172
36
+ 2025-10-07,2025-10-08,0,0.4726222497937227,0.536,0,0,DOWN,True,0.4666792135389425,0,0,0.54,DOWN,True,DOWN,BOTH_RIGHT,-0.00594303625478021
37
+ 2025-10-08,2025-10-09,1,0.5613490399433139,0.536,1,1,UP,True,0.5670251286242712,1,1,0.54,UP,True,UP,BOTH_RIGHT,0.00567608868095737
38
+ 2025-10-09,2025-10-10,1,0.4944306610993832,0.536,0,0,DOWN,False,0.4974407250049612,0,0,0.54,DOWN,False,UP,BOTH_WRONG,0.0030100639055780087
39
+ 2025-10-10,2025-10-13,0,0.4579618112954028,0.536,0,0,DOWN,True,0.3997857746186491,0,0,0.54,DOWN,True,DOWN,BOTH_RIGHT,-0.058176036676753695
40
+ 2025-10-13,2025-10-14,0,0.6018697026086514,0.536,1,1,UP,False,0.5699913133116542,1,1,0.54,UP,False,DOWN,BOTH_WRONG,-0.031878389296997156
41
+ 2025-10-14,2025-10-15,1,0.4793677112763385,0.536,0,0,DOWN,False,0.4707282905468087,0,0,0.54,DOWN,False,UP,BOTH_WRONG,-0.008639420729529779
42
+ 2025-10-15,2025-10-16,1,0.5916992418813618,0.536,1,1,UP,True,0.590964164066389,1,1,0.54,UP,True,UP,BOTH_RIGHT,-0.0007350778149728399
43
+ 2025-10-16,2025-10-17,1,0.47433461056075316,0.536,0,0,DOWN,False,0.4611606171305866,0,0,0.54,DOWN,False,UP,BOTH_WRONG,-0.013173993430166564
44
+ 2025-10-17,2025-10-20,1,0.6178845582937685,0.536,1,1,UP,True,0.6351021663991451,1,1,0.54,UP,True,UP,BOTH_RIGHT,0.017217608105376536
45
+ 2025-10-20,2025-10-21,0,0.6340085545612124,0.536,1,1,UP,False,0.6096165038780325,1,1,0.54,UP,False,DOWN,BOTH_WRONG,-0.024392050683179956
46
+ 2025-10-21,2025-10-23,1,0.5252417730267214,0.536,0,1,UP,True,0.5473647716282178,1,1,0.54,UP,True,UP,BOTH_RIGHT,0.02212299860149647
47
+ 2025-10-23,2025-10-24,0,0.6060172417851833,0.536,1,1,UP,False,0.6300729885050833,1,1,0.54,UP,False,DOWN,BOTH_WRONG,0.024055746719899962
48
+ 2025-10-24,2025-10-27,1,0.5903325577769073,0.536,1,1,UP,True,0.6287392319433074,1,1,0.54,UP,True,UP,BOTH_RIGHT,0.03840667416640009
49
+ 2025-10-27,2025-10-28,0,0.6115457863181492,0.536,1,1,UP,False,0.6492140066728841,1,1,0.54,UP,False,DOWN,BOTH_WRONG,0.03766822035473494
50
+ 2025-10-28,2025-10-29,1,0.5462950564989747,0.536,1,1,UP,True,0.5559748374871484,1,1,0.54,UP,True,UP,BOTH_RIGHT,0.00967978098817368
51
+ 2025-10-29,2025-10-30,0,0.5418777295763938,0.536,1,1,UP,False,0.5186239052625599,0,0,0.54,DOWN,True,DOWN,NEW_FIXED_OLD_MISS,-0.023253824313833937
52
+ 2025-10-30,2025-10-31,0,0.4552704574325821,0.536,0,0,DOWN,True,0.4553903880445,0,0,0.54,DOWN,True,DOWN,BOTH_RIGHT,0.00011993061191789556
53
+ 2025-10-31,2025-11-03,1,0.5336391908281894,0.536,0,1,UP,True,0.551011403291099,1,1,0.54,UP,True,UP,BOTH_RIGHT,0.017372212462909542
54
+ 2025-11-03,2025-11-04,0,0.5548639635805377,0.536,1,1,UP,False,0.53533191791528,0,0,0.54,DOWN,True,DOWN,NEW_FIXED_OLD_MISS,-0.01953204566525768
55
+ 2025-11-04,2025-11-06,0,0.42771433362557115,0.536,0,0,DOWN,True,0.3743739963136568,0,0,0.54,DOWN,True,DOWN,BOTH_RIGHT,-0.05334033731191434
56
+ 2025-11-06,2025-11-07,0,0.4285268611528484,0.536,0,0,DOWN,True,0.3846408432476711,0,0,0.54,DOWN,True,DOWN,BOTH_RIGHT,-0.043886017905177266
57
+ 2025-11-07,2025-11-10,1,0.534325547578878,0.536,0,0,DOWN,False,0.5410940387016819,1,1,0.54,UP,True,UP,NEW_FIXED_OLD_MISS,0.006768491122803977
58
+ 2025-11-10,2025-11-11,1,0.5920184987255606,0.536,1,1,UP,True,0.6158030903138678,1,1,0.54,UP,True,UP,BOTH_RIGHT,0.023784591588307258
59
+ 2025-11-11,2025-11-12,1,0.5608623915419516,0.536,1,1,UP,True,0.5731306337812276,1,1,0.54,UP,True,UP,BOTH_RIGHT,0.012268242239276028
60
+ 2025-11-12,2025-11-13,1,0.5595470596463226,0.536,1,1,UP,True,0.5731335020435933,1,1,0.54,UP,True,UP,BOTH_RIGHT,0.013586442397270693
61
+ 2025-11-13,2025-11-14,1,0.4409614130897091,0.536,0,0,DOWN,False,0.3710828136772098,0,0,0.54,DOWN,False,UP,BOTH_WRONG,-0.0698785994124993
62
+ 2025-11-14,2025-11-17,1,0.5320905678003233,0.536,0,0,DOWN,False,0.5031885472677032,0,0,0.54,DOWN,False,UP,BOTH_WRONG,-0.028902020532620032
63
+ 2025-11-17,2025-11-18,0,0.44725437906343374,0.536,0,0,DOWN,True,0.4170862430727248,0,0,0.54,DOWN,True,DOWN,BOTH_RIGHT,-0.030168135990708944
64
+ 2025-11-18,2025-11-19,1,0.43866757598929296,0.536,0,0,DOWN,False,0.3977423137817958,0,0,0.54,DOWN,False,UP,BOTH_WRONG,-0.04092526220749715
65
+ 2025-11-19,2025-11-20,1,0.6001968203674752,0.536,1,1,UP,True,0.6218889517202173,1,1,0.54,UP,True,UP,BOTH_RIGHT,0.02169213135274206
66
+ 2025-11-20,2025-11-21,0,0.4589215247253727,0.536,0,0,DOWN,True,0.3981869863829065,0,0,0.54,DOWN,True,DOWN,BOTH_RIGHT,-0.06073453834246617
67
+ 2025-11-21,2025-11-24,0,0.5754816559062537,0.536,1,1,UP,False,0.6191360634010804,1,1,0.54,UP,False,DOWN,BOTH_WRONG,0.04365440749482674
68
+ 2025-11-24,2025-11-25,0,0.5774499806149076,0.536,1,1,UP,False,0.6092572564839959,1,1,0.54,UP,False,DOWN,BOTH_WRONG,0.03180727586908827
69
+ 2025-11-25,2025-11-26,1,0.5969900550295543,0.536,1,1,UP,True,0.6354575329403285,1,1,0.54,UP,True,UP,BOTH_RIGHT,0.038467477910774206
70
+ 2025-11-26,2025-11-27,1,0.6172017181908864,0.536,1,1,UP,True,0.632013264708004,1,1,0.54,UP,True,UP,BOTH_RIGHT,0.01481154651711758
71
+ 2025-11-27,2025-11-28,0,0.5380627941495127,0.536,1,1,UP,False,0.5225347426728648,0,0,0.54,DOWN,True,DOWN,NEW_FIXED_OLD_MISS,-0.01552805147664793
72
+ 2025-11-28,2025-12-01,0,0.5959686486690138,0.536,1,1,UP,False,0.5641956180868467,1,1,0.54,UP,False,DOWN,BOTH_WRONG,-0.03177303058216707
73
+ 2025-12-01,2025-12-02,0,0.4514925218660361,0.536,0,0,DOWN,True,0.4398878688113201,0,0,0.54,DOWN,True,DOWN,BOTH_RIGHT,-0.01160465305471603
74
+ 2025-12-02,2025-12-03,0,0.5536498237418865,0.536,1,1,UP,False,0.5660009544823925,1,1,0.54,UP,False,DOWN,BOTH_WRONG,0.012351130740505978
75
+ 2025-12-03,2025-12-04,1,0.5647500521239696,0.536,1,1,UP,True,0.5791898845110731,1,1,0.54,UP,True,UP,BOTH_RIGHT,0.014439832387103557
76
+ 2025-12-04,2025-12-05,1,0.5397274496521454,0.536,1,1,UP,True,0.5404947282356648,1,1,0.54,UP,True,UP,BOTH_RIGHT,0.0007672785835194373
77
+ 2025-12-05,2025-12-08,0,0.5789868434917638,0.536,1,1,UP,False,0.5926642223401019,1,1,0.54,UP,False,DOWN,BOTH_WRONG,0.013677378848338084
78
+ 2025-12-08,2025-12-09,0,0.4476814988792434,0.536,0,0,DOWN,True,0.4329708833054805,0,0,0.54,DOWN,True,DOWN,BOTH_RIGHT,-0.014710615573762909
79
+ 2025-12-09,2025-12-10,0,0.5083038974145645,0.536,0,0,DOWN,True,0.4925316075399146,0,0,0.54,DOWN,True,DOWN,BOTH_RIGHT,-0.015772289874649903
80
+ 2025-12-10,2025-12-11,1,0.578801399070125,0.536,1,1,UP,True,0.5962352957051685,1,1,0.54,UP,True,UP,BOTH_RIGHT,0.017433896635043578
81
+ 2025-12-11,2025-12-12,1,0.5655126368843367,0.536,1,1,UP,True,0.5865786414132148,1,1,0.54,UP,True,UP,BOTH_RIGHT,0.02106600452887808
82
+ 2025-12-12,2025-12-15,0,0.44512729891238634,0.536,0,0,DOWN,True,0.3967771335623724,0,0,0.54,DOWN,True,DOWN,BOTH_RIGHT,-0.04835016535001396
83
+ 2025-12-15,2025-12-16,0,0.4772517258238373,0.536,0,0,DOWN,True,0.4491176503334523,0,0,0.54,DOWN,True,DOWN,BOTH_RIGHT,-0.02813407549038499
84
+ 2025-12-16,2025-12-17,0,0.5023039471301588,0.536,0,0,DOWN,True,0.4862324811024489,0,0,0.54,DOWN,True,DOWN,BOTH_RIGHT,-0.016071466027709924
85
+ 2025-12-17,2025-12-18,0,0.4301858568088611,0.536,0,0,DOWN,True,0.3750170458319272,0,0,0.54,DOWN,True,DOWN,BOTH_RIGHT,-0.055168810976933935
86
+ 2025-12-18,2025-12-19,1,0.5648461386262968,0.536,1,1,UP,True,0.5751144790914731,1,1,0.54,UP,True,UP,BOTH_RIGHT,0.010268340465176218
87
+ 2025-12-19,2025-12-22,1,0.5965291949511681,0.536,1,1,UP,True,0.605737094810832,1,1,0.54,UP,True,UP,BOTH_RIGHT,0.00920789985966397
88
+ 2025-12-22,2025-12-23,1,0.6186888816724676,0.536,1,1,UP,True,0.632812390272631,1,1,0.54,UP,True,UP,BOTH_RIGHT,0.014123508600163426
89
+ 2025-12-23,2025-12-24,0,0.5773488350890955,0.536,1,1,UP,False,0.5862149398625007,1,1,0.54,UP,False,DOWN,BOTH_WRONG,0.008866104773405215
90
+ 2025-12-24,2025-12-26,0,0.5729364364011384,0.536,1,1,UP,False,0.5936420001224603,1,1,0.54,UP,False,DOWN,BOTH_WRONG,0.020705563721321818
91
+ 2025-12-26,2025-12-29,0,0.4907772295625899,0.536,0,0,DOWN,True,0.5104234782578604,0,0,0.54,DOWN,True,DOWN,BOTH_RIGHT,0.019646248695270485
92
+ 2025-12-29,2025-12-30,1,0.4624734208127332,0.536,0,0,DOWN,False,0.452783926294713,0,0,0.54,DOWN,False,UP,BOTH_WRONG,-0.009689494518020203
93
+ 2025-12-30,2025-12-31,1,0.5082041641532032,0.536,0,0,DOWN,False,0.516302236436308,0,0,0.54,DOWN,False,UP,BOTH_WRONG,0.008098072283104774
94
+ 2025-12-31,2026-01-01,0,0.4736642217472263,0.536,0,0,DOWN,True,0.4436589068021936,0,0,0.54,DOWN,True,DOWN,BOTH_RIGHT,-0.03000531494503267
95
+ 2026-01-01,2026-01-02,1,0.520577182454685,0.536,0,0,DOWN,False,0.5158899096587543,0,0,0.54,DOWN,False,UP,BOTH_WRONG,-0.00468727279593073
96
+ 2026-01-02,2026-01-05,0,0.5684854304404049,0.536,1,1,UP,False,0.5744175752212932,1,1,0.54,UP,False,DOWN,BOTH_WRONG,0.0059321447808883265
97
+ 2026-01-05,2026-01-06,0,0.5955206245848348,0.536,1,1,UP,False,0.5953914492363986,1,1,0.54,UP,False,DOWN,BOTH_WRONG,-0.0001291753484361502
98
+ 2026-01-06,2026-01-07,0,0.5726622071639436,0.536,1,1,UP,False,0.5867891670394703,1,1,0.54,UP,False,DOWN,BOTH_WRONG,0.014126959875526701
99
+ 2026-01-07,2026-01-08,0,0.4945050952322139,0.536,0,0,DOWN,True,0.471208659939698,0,0,0.54,DOWN,True,DOWN,BOTH_RIGHT,-0.023296435292515905
100
+ 2026-01-08,2026-01-09,0,0.5068672655221168,0.536,0,0,DOWN,True,0.5074990572790123,0,0,0.54,DOWN,True,DOWN,BOTH_RIGHT,0.0006317917568955389
101
+ 2026-01-09,2026-01-12,1,0.571927087517273,0.536,1,1,UP,True,0.5599729439015873,1,1,0.54,UP,True,UP,BOTH_RIGHT,-0.011954143615685697
102
+ 2026-01-12,2026-01-13,0,0.5385585897525792,0.536,1,1,UP,False,0.5215505610345287,0,0,0.54,DOWN,True,DOWN,NEW_FIXED_OLD_MISS,-0.017008028718050516
103
+ 2026-01-13,2026-01-14,0,0.47014920939448124,0.536,0,0,DOWN,True,0.4553499307201427,0,0,0.54,DOWN,True,DOWN,BOTH_RIGHT,-0.014799278674338556
104
+ 2026-01-14,2026-01-16,1,0.44787849518840556,0.536,0,0,DOWN,False,0.4378651604801309,0,0,0.54,DOWN,False,UP,BOTH_WRONG,-0.010013334708274646
105
+ 2026-01-16,2026-01-19,0,0.5038387305404403,0.536,0,0,DOWN,True,0.5130303017176172,0,0,0.54,DOWN,True,DOWN,BOTH_RIGHT,0.00919157117717695
106
+ 2026-01-19,2026-01-20,0,0.5024423643152696,0.536,0,0,DOWN,True,0.4989705096951118,0,0,0.54,DOWN,True,DOWN,BOTH_RIGHT,-0.003471854620157755
107
+ 2026-01-20,2026-01-21,0,0.41984528518846514,0.536,0,0,DOWN,True,0.4513788730491151,0,0,0.54,DOWN,True,DOWN,BOTH_RIGHT,0.03153358786064997
108
+ 2026-01-21,2026-01-22,1,0.5731676812716252,0.536,1,1,UP,True,0.5785439189264144,1,1,0.54,UP,True,UP,BOTH_RIGHT,0.005376237654789229
109
+ 2026-01-22,2026-01-23,0,0.6005333925638593,0.536,1,1,UP,False,0.6118687922331063,1,1,0.54,UP,False,DOWN,BOTH_WRONG,0.011335399669247015
110
+ 2026-01-23,2026-01-27,1,0.519344037024174,0.536,0,0,DOWN,False,0.4942151515004377,0,0,0.54,DOWN,False,UP,BOTH_WRONG,-0.025128885523736266
111
+ 2026-01-27,2026-01-28,1,0.5547000967287941,0.536,1,1,UP,True,0.5627082131411398,1,1,0.54,UP,True,UP,BOTH_RIGHT,0.008008116412345778
112
+ 2026-01-28,2026-01-29,1,0.5512929503886236,0.536,1,1,UP,True,0.560674881872554,1,1,0.54,UP,True,UP,BOTH_RIGHT,0.009381931483930406
113
+ 2026-01-29,2026-01-30,0,0.5120258780417863,0.536,0,0,DOWN,True,0.4922490381820472,0,0,0.54,DOWN,True,DOWN,BOTH_RIGHT,-0.01977683985973916
114
+ 2026-01-30,2026-02-01,0,0.4541599476376217,0.536,0,0,DOWN,True,0.4499369450405619,0,0,0.54,DOWN,True,DOWN,BOTH_RIGHT,-0.004223002597059766
115
+ 2026-02-01,2026-02-02,1,0.5077051477503915,0.536,0,0,DOWN,False,0.5128368933589664,0,0,0.54,DOWN,False,UP,BOTH_WRONG,0.005131745608574878
116
+ 2026-02-02,2026-02-03,1,0.5980995514208853,0.536,1,1,UP,True,0.5567711346364249,1,1,0.54,UP,True,UP,BOTH_RIGHT,-0.04132841678446042
117
+ 2026-02-03,2026-02-04,1,0.47469163660523633,0.536,0,0,DOWN,False,0.4387882950483754,0,0,0.54,DOWN,False,UP,BOTH_WRONG,-0.035903341556860924
118
+ 2026-02-04,2026-02-05,0,0.48152823962857766,0.536,0,0,DOWN,True,0.4831001727449439,0,0,0.54,DOWN,True,DOWN,BOTH_RIGHT,0.0015719331163662198
119
+ 2026-02-05,2026-02-06,1,0.44426748835891683,0.536,0,0,DOWN,False,0.4020167315872395,0,0,0.54,DOWN,False,UP,BOTH_WRONG,-0.042250756771677334
120
+ 2026-02-06,2026-02-09,1,0.5831536949043917,0.536,1,1,UP,True,0.6043464952516107,1,1,0.54,UP,True,UP,BOTH_RIGHT,0.021192800347218932
121
+ 2026-02-09,2026-02-10,1,0.5953014600307811,0.536,1,1,UP,True,0.6185658108941494,1,1,0.54,UP,True,UP,BOTH_RIGHT,0.02326435086336831
122
+ 2026-02-10,2026-02-11,1,0.49503250100248714,0.536,0,0,DOWN,False,0.495236005619729,0,0,0.54,DOWN,False,UP,BOTH_WRONG,0.00020350461724188973
123
+ 2026-02-11,2026-02-12,0,0.5320138190746933,0.536,0,0,DOWN,True,0.5299603781050157,0,0,0.54,DOWN,True,DOWN,BOTH_RIGHT,-0.0020534409696775224
124
+ 2026-02-12,2026-02-13,0,0.43032660268053563,0.536,0,0,DOWN,True,0.3793808728455833,0,0,0.54,DOWN,True,DOWN,BOTH_RIGHT,-0.050945729834952325
125
+ 2026-02-13,2026-02-16,1,0.5170713767547099,0.536,0,0,DOWN,False,0.5344659735317555,0,1,0.54,UP,True,UP,NEW_FIXED_OLD_MISS,0.01739459677704558
126
+ 2026-02-16,2026-02-17,1,0.5312795081319475,0.536,0,0,DOWN,False,0.5368248277162604,0,0,0.54,DOWN,False,UP,BOTH_WRONG,0.005545319584312924
127
+ 2026-02-17,2026-02-18,1,0.5666405659258801,0.536,1,1,UP,True,0.5455956101490472,1,1,0.54,UP,True,UP,BOTH_RIGHT,-0.021044955776832852
128
+ 2026-02-18,2026-02-19,0,0.602776770830923,0.536,1,1,UP,False,0.6235420179488166,1,1,0.54,UP,False,DOWN,BOTH_WRONG,0.020765247117893626
129
+ 2026-02-19,2026-02-20,1,0.47605407202607275,0.536,0,0,DOWN,False,0.4848307619437031,0,0,0.54,DOWN,False,UP,BOTH_WRONG,0.008776689917630365
130
+ 2026-02-20,2026-02-23,1,0.5803876079831675,0.536,1,1,UP,True,0.6122656755528233,1,1,0.54,UP,True,UP,BOTH_RIGHT,0.03187806756965583
131
+ 2026-02-23,2026-02-24,0,0.44618234063111484,0.536,0,0,DOWN,True,0.39211905788681,0,0,0.54,DOWN,True,DOWN,BOTH_RIGHT,-0.05406328274430483
132
+ 2026-02-24,2026-02-25,1,0.5781712916286234,0.536,1,1,UP,True,0.622219828644218,1,1,0.54,UP,True,UP,BOTH_RIGHT,0.044048537015594635
133
+ 2026-02-25,2026-02-26,1,0.5930196939264739,0.536,1,1,UP,True,0.618210968590452,1,1,0.54,UP,True,UP,BOTH_RIGHT,0.02519127466397808
134
+ 2026-02-26,2026-02-27,0,0.47165415813808803,0.536,0,0,DOWN,True,0.471035653029159,0,0,0.54,DOWN,True,DOWN,BOTH_RIGHT,-0.0006185051089290239
135
+ 2026-02-27,2026-03-02,0,0.43962044961117297,0.536,0,0,DOWN,True,0.4164407656616751,0,0,0.54,DOWN,True,DOWN,BOTH_RIGHT,-0.023179683949497876
136
+ 2026-03-02,2026-03-04,0,0.49288660184755345,0.536,0,0,DOWN,True,0.4920820165898135,0,0,0.54,DOWN,True,DOWN,BOTH_RIGHT,-0.0008045852577399648
137
+ 2026-03-04,2026-03-05,1,0.5620731257050995,0.536,1,1,UP,True,0.5856756121183945,1,1,0.54,UP,True,UP,BOTH_RIGHT,0.023602486413294987
138
+ 2026-03-05,2026-03-06,0,0.44256068800188264,0.536,0,0,DOWN,True,0.41766587348352,0,0,0.54,DOWN,True,DOWN,BOTH_RIGHT,-0.024894814518362618
139
+ 2026-03-06,2026-03-09,0,0.4168030900835514,0.536,0,0,DOWN,True,0.3940134587813977,0,0,0.54,DOWN,True,DOWN,BOTH_RIGHT,-0.022789631302153668
140
+ 2026-03-09,2026-03-10,1,0.5631716943700401,0.536,1,1,UP,True,0.5707221850688641,1,1,0.54,UP,True,UP,BOTH_RIGHT,0.007550490698823964
141
+ 2026-03-10,2026-03-11,0,0.5191648105687638,0.536,0,0,DOWN,True,0.5139264247764077,0,0,0.54,DOWN,True,DOWN,BOTH_RIGHT,-0.005238385792356137
142
+ 2026-03-11,2026-03-12,0,0.49037163621513197,0.536,0,0,DOWN,True,0.4867621945739568,0,0,0.54,DOWN,True,DOWN,BOTH_RIGHT,-0.0036094416411751595
143
+ 2026-03-12,2026-03-13,0,0.41421665900558247,0.536,0,0,DOWN,True,0.3764023132073185,0,0,0.54,DOWN,True,DOWN,BOTH_RIGHT,-0.03781434579826398
144
+ 2026-03-13,2026-03-16,1,0.46619542933141644,0.536,0,0,DOWN,False,0.4685858794719313,0,0,0.54,DOWN,False,UP,BOTH_WRONG,0.002390450140514866
145
+ 2026-03-16,2026-03-17,1,0.5899284466892205,0.536,1,1,UP,True,0.6090116084423043,1,1,0.54,UP,True,UP,BOTH_RIGHT,0.019083161753083777
146
+ 2026-03-17,2026-03-18,1,0.5875454893498612,0.536,1,1,UP,True,0.596203425256217,1,1,0.54,UP,True,UP,BOTH_RIGHT,0.008657935906355774
147
+ 2026-03-18,2026-03-19,0,0.4422317622935328,0.536,0,0,DOWN,True,0.4061357417274906,0,0,0.54,DOWN,True,DOWN,BOTH_RIGHT,-0.036096020566042164
148
+ 2026-03-19,2026-03-20,1,0.49328760803183874,0.536,0,0,DOWN,False,0.4988094443116395,0,0,0.54,DOWN,False,UP,BOTH_WRONG,0.00552183627980074
149
+ 2026-03-20,2026-03-23,0,0.42006632830132384,0.536,0,0,DOWN,True,0.3798789374378448,0,0,0.54,DOWN,True,DOWN,BOTH_RIGHT,-0.040187390863479056
150
+ 2026-03-23,2026-03-24,1,0.5745024908796967,0.536,1,1,UP,True,0.6075517331440524,1,1,0.54,UP,True,UP,BOTH_RIGHT,0.03304924226435568
151
+ 2026-03-24,2026-03-25,1,0.46704421425481535,0.536,0,0,DOWN,False,0.474246457416732,0,0,0.54,DOWN,False,UP,BOTH_WRONG,0.007202243161916644
152
+ 2026-03-25,2026-03-27,0,0.6135152538796593,0.536,1,1,UP,False,0.6385867433577118,1,1,0.54,UP,False,DOWN,BOTH_WRONG,0.02507148947805249
153
+ 2026-03-27,2026-03-30,0,0.41971969491959943,0.536,0,0,DOWN,True,0.3872760543764006,0,0,0.54,DOWN,True,DOWN,BOTH_RIGHT,-0.032443640543198815
154
+ 2026-03-30,2026-04-01,1,0.5124372753651444,0.536,0,0,DOWN,False,0.5206215241104475,0,0,0.54,DOWN,False,UP,BOTH_WRONG,0.008184248745303102
155
+ 2026-04-01,2026-04-02,0,0.6019742355399046,0.536,1,1,UP,False,0.6141494513098411,1,1,0.54,UP,False,DOWN,BOTH_WRONG,0.01217521576993652
156
+ 2026-04-02,2026-04-06,1,0.5263627722793559,0.536,0,0,DOWN,False,0.5348105326853405,0,0,0.54,DOWN,False,UP,BOTH_WRONG,0.008447760405984606
157
+ 2026-04-06,2026-04-07,1,0.5980917476299974,0.536,1,1,UP,True,0.571940195800378,1,1,0.54,UP,True,UP,BOTH_RIGHT,-0.02615155182961937
158
+ 2026-04-07,2026-04-08,1,0.5135241623644177,0.536,0,0,DOWN,False,0.5081041976549391,0,0,0.54,DOWN,False,UP,BOTH_WRONG,-0.005419964709478586
159
+ 2026-04-08,2026-04-09,0,0.6382580295464572,0.536,1,1,UP,False,0.6611571963678617,1,1,0.54,UP,False,DOWN,BOTH_WRONG,0.022899166821404582
160
+ 2026-04-09,2026-04-10,1,0.5941240444299145,0.536,1,1,UP,True,0.6085536778011377,1,1,0.54,UP,True,UP,BOTH_RIGHT,0.01442963337122316
161
+ 2026-04-10,2026-04-13,0,0.551784348723496,0.536,1,1,UP,False,0.554896219113108,1,1,0.54,UP,False,DOWN,BOTH_WRONG,0.003111870389612026
162
+ 2026-04-13,2026-04-15,1,0.5753236139930018,0.536,1,1,UP,True,0.5584650293284992,1,1,0.54,UP,True,UP,BOTH_RIGHT,-0.01685858466450263
163
+ 2026-04-15,2026-04-16,0,0.5898924554794914,0.536,1,1,UP,False,0.6042218624233517,1,1,0.54,UP,False,DOWN,BOTH_WRONG,0.014329406943860312
164
+ 2026-04-16,2026-04-17,1,0.5759184456534198,0.536,1,1,UP,True,0.5938514864944262,1,1,0.54,UP,True,UP,BOTH_RIGHT,0.017933040841006442
165
+ 2026-04-17,2026-04-20,0,0.6146380639692516,0.536,1,1,UP,False,0.6543247290293395,1,1,0.54,UP,False,DOWN,BOTH_WRONG,0.03968666506008789
166
+ 2026-04-20,2026-04-21,1,0.4708897592456055,0.536,0,0,DOWN,False,0.5015303081293001,0,0,0.54,DOWN,False,UP,BOTH_WRONG,0.030640548883694607
167
+ 2026-04-21,2026-04-22,0,0.4654214703390219,0.536,0,0,DOWN,True,0.462556021439535,0,0,0.54,DOWN,True,DOWN,BOTH_RIGHT,-0.002865448899486922
168
+ 2026-04-22,2026-04-23,0,0.5740133730157899,0.536,1,1,UP,False,0.5995389952523189,1,1,0.54,UP,False,DOWN,BOTH_WRONG,0.02552562223652899
169
+ 2026-04-23,2026-04-24,0,0.45439245098535236,0.536,0,0,DOWN,True,0.4365877800392447,0,0,0.54,DOWN,True,DOWN,BOTH_RIGHT,-0.01780467094610766
170
+ 2026-04-24,2026-04-27,1,0.5563357702343772,0.536,1,1,UP,True,0.5725030337670595,1,1,0.54,UP,True,UP,BOTH_RIGHT,0.016167263532682274
171
+ 2026-04-27,2026-04-28,0,0.570177128642662,0.536,1,1,UP,False,0.5688380677564464,1,1,0.54,UP,False,DOWN,BOTH_WRONG,-0.001339060886215604
172
+ 2026-04-28,2026-04-29,1,0.476417337758729,0.536,0,0,DOWN,False,0.4542419334216317,0,0,0.54,DOWN,False,UP,BOTH_WRONG,-0.022175404337097304
173
+ 2026-04-29,2026-04-30,0,0.4712821739110194,0.536,0,0,DOWN,True,0.4571225953449172,0,0,0.54,DOWN,True,DOWN,BOTH_RIGHT,-0.014159578566102171
174
+ 2026-04-30,2026-05-04,1,0.5763574757612383,0.536,1,1,UP,True,0.5977867793262838,1,1,0.54,UP,True,UP,BOTH_RIGHT,0.021429303565045466
175
+ 2026-05-04,2026-05-05,0,0.4364786087803177,0.536,0,0,DOWN,True,0.4868867911288741,0,0,0.54,DOWN,True,DOWN,BOTH_RIGHT,0.05040818234855643
176
+ 2026-05-05,2026-05-06,1,0.5758111008714001,0.536,1,1,UP,True,0.5845818546695125,1,1,0.54,UP,True,UP,BOTH_RIGHT,0.00877075379811243
177
+ 2026-05-06,2026-05-07,0,0.6321818439455402,0.536,1,1,UP,False,0.6359176067440298,1,1,0.54,UP,False,DOWN,BOTH_WRONG,0.003735762798489528
178
+ 2026-05-07,2026-05-08,0,0.5132885706567447,0.536,0,0,DOWN,True,0.481251948449228,0,0,0.54,DOWN,True,DOWN,BOTH_RIGHT,-0.03203662220751674
179
+ 2026-05-08,2026-05-11,0,0.5581102484040696,0.536,1,1,UP,False,0.5805855982050315,1,1,0.54,UP,False,DOWN,BOTH_WRONG,0.022475349800961886
180
+ 2026-05-11,2026-05-12,0,0.4849383593251872,0.536,0,0,DOWN,True,0.4871033318907412,0,0,0.54,DOWN,True,DOWN,BOTH_RIGHT,0.0021649725655539798
181
+ 2026-05-12,2026-05-13,0,0.4878147678574293,0.536,0,0,DOWN,True,0.4974878096184878,0,0,0.54,DOWN,True,DOWN,BOTH_RIGHT,0.009673041761058543
182
+ 2026-05-13,2026-05-14,1,0.5415611759038196,0.536,1,1,UP,True,0.5471779814090975,1,1,0.54,UP,True,UP,BOTH_RIGHT,0.005616805505277878
183
+ 2026-05-14,2026-05-15,0,0.5901600283611222,0.536,1,1,UP,False,0.6297628889974494,1,1,0.54,UP,False,DOWN,BOTH_WRONG,0.03960286063632712
184
+ 2026-05-15,2026-05-18,1,0.4084257154102456,0.536,0,0,DOWN,False,0.3747010082865302,0,0,0.54,DOWN,False,UP,BOTH_WRONG,-0.03372470712371539
185
+ 2026-05-18,2026-05-19,0,0.5294474233275485,0.536,0,0,DOWN,True,0.5160634730102536,0,0,0.54,DOWN,True,DOWN,BOTH_RIGHT,-0.01338395031729489
186
+ 2026-05-19,2026-05-20,1,0.45331907733460824,0.536,0,0,DOWN,False,0.4284629643819285,0,0,0.54,DOWN,False,UP,BOTH_WRONG,-0.024856112952679754
187
+ 2026-05-20,2026-05-21,0,0.6174308639318701,0.536,1,1,UP,False,0.6410464195166039,1,1,0.54,UP,False,DOWN,BOTH_WRONG,0.023615555584733827
188
+ 2026-05-21,2026-05-22,1,0.5609159947866829,0.536,1,1,UP,True,0.4927530749918309,0,0,0.54,DOWN,False,UP,NEW_MISSED_OLD_RIGHT,-0.06816291979485195
189
+ 2026-05-22,2026-05-25,1,0.589483566088999,0.536,1,1,UP,True,0.5038441090033747,0,0,0.54,DOWN,False,UP,NEW_MISSED_OLD_RIGHT,-0.08563945708562426
190
+ 2026-05-25,2026-05-26,0,0.5633862240998508,0.536,1,1,UP,False,0.542056789982144,1,1,0.54,UP,False,DOWN,BOTH_WRONG,-0.021329434117706825
191
+ 2026-05-26,2026-05-27,0,0.5457670944504919,0.536,1,1,UP,False,0.4818098367181402,0,0,0.54,DOWN,True,DOWN,NEW_FIXED_OLD_MISS,-0.06395725773235167
models/nifty_forecaster/train.py ADDED
@@ -0,0 +1,1549 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from __future__ import annotations
2
+
3
+ import argparse
4
+ import json
5
+ import math
6
+ import sys
7
+ import time
8
+ import warnings
9
+ from dataclasses import asdict, dataclass
10
+ from functools import lru_cache
11
+ from pathlib import Path
12
+ from typing import Iterable
13
+
14
+ import numpy as np
15
+ import pandas as pd
16
+ import os
17
+
18
+
19
+ def find_project_root(start: Path) -> Path:
20
+ env_root = os.environ.get("FORECASTING_PROJECT_ROOT")
21
+ if env_root:
22
+ return Path(env_root)
23
+
24
+ fallback = start.parents[4] / "forecasting project"
25
+ if (fallback / "Data").is_dir() and (fallback / "Alt Data").is_dir():
26
+ return fallback
27
+
28
+ for path in (start, *start.parents):
29
+ if (path / "Data").is_dir() and (path / "Alt Data").is_dir():
30
+ return path
31
+ raise RuntimeError(f"Could not find project root from {start}")
32
+
33
+
34
+ PROJECT_ROOT = find_project_root(Path(__file__).resolve())
35
+ DATA_DIR = PROJECT_ROOT / "Data"
36
+ ALT_DIR = PROJECT_ROOT / "Alt Data"
37
+ PRICE_DIR = DATA_DIR / "processed" / "bars" / "1d"
38
+ INTRADAY_DIR = DATA_DIR / "raw" / "minute"
39
+ OUTPUT_DIR = Path(__file__).resolve().parent / "outputs"
40
+ OUTPUT_DIR.mkdir(parents=True, exist_ok=True)
41
+ warnings.filterwarnings("ignore", category=pd.errors.PerformanceWarning)
42
+ warnings.filterwarnings("ignore", category=FutureWarning)
43
+
44
+ DEFAULT_TRAIN_END = pd.Timestamp("2023-12-31")
45
+ DEFAULT_VALID_END = pd.Timestamp("2025-08-17")
46
+ DEFAULT_TEST_END = pd.Timestamp("2099-12-31")
47
+ COMMON_VALID_START = pd.Timestamp("2024-07-01")
48
+ LOCKED_NIFTY50_WEIGHTS = np.array([0.34099525, 0.49518660, 0.16381815], dtype="float64")
49
+ LOCKED_NIFTY50_THRESHOLD = 0.534
50
+ NIFTY50_LOW_BANK_VOL_THRESHOLD = 0.004660
51
+ NIFTY50_BANK_RET_FLIP_THRESHOLD = 0.01677902301854645
52
+ NIFTY50_TINY_RANGE_UP_THRESHOLD = 0.004204134680410373
53
+
54
+ SUPPORTED_SYMBOLS = ("NIFTY 50", "NIFTY BANK")
55
+
56
+ DAILY_VALID_WINDOWS: dict[str, tuple[pd.Timestamp, pd.Timestamp]] = {
57
+ "NIFTY 50": (pd.Timestamp("2024-07-01"), pd.Timestamp("2025-08-17")),
58
+ "NIFTY BANK": (pd.Timestamp("2024-07-01"), pd.Timestamp("2025-08-17")),
59
+ }
60
+
61
+ SYMBOL_BENCHMARKS: dict[str, str] = {
62
+ "NIFTY 50": "NIFTY BANK",
63
+ "NIFTY BANK": "NIFTY 50",
64
+ }
65
+
66
+
67
+ class ProgressBar:
68
+ """Small dependency-free terminal progress bar with elapsed time, ETA, and rate."""
69
+
70
+ def __init__(
71
+ self,
72
+ total: int,
73
+ description: str = "Progress",
74
+ *,
75
+ enabled: bool = True,
76
+ width: int = 34,
77
+ update_every: float = 0.2,
78
+ stream: object | None = None,
79
+ ) -> None:
80
+ self.total = max(0, int(total))
81
+ self.description = description
82
+ self.enabled = enabled
83
+ self.width = max(10, int(width))
84
+ self.update_every = max(0.0, float(update_every))
85
+ self.stream = stream if stream is not None else sys.stderr
86
+ self.current = 0
87
+ self.start_time = time.monotonic()
88
+ self.last_render = 0.0
89
+ self.closed = False
90
+ self._last_line_len = 0
91
+
92
+ def __enter__(self) -> "ProgressBar":
93
+ self.start_time = time.monotonic()
94
+ self.last_render = 0.0
95
+ self.render(force=True)
96
+ return self
97
+
98
+ def __exit__(self, exc_type: object, exc: object, tb: object) -> None:
99
+ self.close()
100
+
101
+ @staticmethod
102
+ def _format_duration(seconds: float | None) -> str:
103
+ if seconds is None or not np.isfinite(seconds) or seconds < 0:
104
+ return "--:--"
105
+ seconds = int(round(seconds))
106
+ hours, rem = divmod(seconds, 3600)
107
+ minutes, secs = divmod(rem, 60)
108
+ if hours:
109
+ return f"{hours:d}:{minutes:02d}:{secs:02d}"
110
+ return f"{minutes:02d}:{secs:02d}"
111
+
112
+ def update(self, current: int | None = None, *, description: str | None = None, force: bool = False) -> None:
113
+ if current is not None:
114
+ self.current = max(0, int(current))
115
+ if self.total:
116
+ self.current = min(self.current, self.total)
117
+ if description is not None:
118
+ self.description = description
119
+ self.render(force=force)
120
+
121
+ def advance(self, step: int = 1, *, description: str | None = None, force: bool = False) -> None:
122
+ self.update(self.current + int(step), description=description, force=force)
123
+
124
+ def render(self, *, force: bool = False) -> None:
125
+ if not self.enabled or self.closed:
126
+ return
127
+ now = time.monotonic()
128
+ if not force and (now - self.last_render) < self.update_every and self.current < self.total:
129
+ return
130
+ self.last_render = now
131
+ elapsed = max(0.0, now - self.start_time)
132
+ if self.total > 0:
133
+ fraction = min(1.0, max(0.0, self.current / self.total))
134
+ else:
135
+ fraction = 1.0
136
+ filled = int(round(self.width * fraction))
137
+ bar = "█" * filled + "░" * (self.width - filled)
138
+ rate = self.current / elapsed if elapsed > 0 else 0.0
139
+ eta = (elapsed / self.current) * (self.total - self.current) if self.current > 0 and self.total > 0 else None
140
+ line = (
141
+ f"\r{self.description} [{bar}] "
142
+ f"{self.current}/{self.total} {fraction * 100:6.2f}% | "
143
+ f"elapsed {self._format_duration(elapsed)} | "
144
+ f"ETA {self._format_duration(eta)} | "
145
+ f"{rate:,.2f}/s"
146
+ )
147
+ padding = " " * max(0, self._last_line_len - len(line))
148
+ print(line + padding, end="", file=self.stream, flush=True)
149
+ self._last_line_len = len(line)
150
+
151
+ def close(self) -> None:
152
+ if self.closed:
153
+ return
154
+ self.render(force=True)
155
+ if self.enabled:
156
+ print(file=self.stream, flush=True)
157
+ self.closed = True
158
+
159
+
160
+ def progress_note(message: str, *, enabled: bool = True) -> None:
161
+ if enabled:
162
+ print(f"[progress] {message}", file=sys.stderr, flush=True)
163
+
164
+
165
+ @dataclass(frozen=True)
166
+ class ModelSpec:
167
+ name: str
168
+ kind: str
169
+ use_intraday: bool
170
+ feature_profile: str = "all"
171
+ top_k: int | None = None
172
+ l2: float = 0.5
173
+ n_trees: int = 60
174
+ max_depth: int = 5
175
+ min_leaf: int = 30
176
+ seed: int = 7
177
+
178
+
179
+ @dataclass
180
+ class FitResult:
181
+ symbol: str
182
+ horizon: str
183
+ horizon_bars: int
184
+ config: dict[str, object]
185
+ threshold: float
186
+ validation_accuracy: float
187
+ test_accuracy: float
188
+ baseline_accuracy: float
189
+ n_train: int
190
+ n_valid: int
191
+ n_test: int
192
+ train_start: str
193
+ train_end: str
194
+ valid_start: str
195
+ valid_end: str
196
+ test_start: str
197
+ test_end: str
198
+ latest_forecast_date: str
199
+ latest_forecast_for: str
200
+ latest_forecast_prob_up: float
201
+ latest_forecast_signal: str
202
+ feature_count: int
203
+ validation_prob_std: float
204
+ test_prob_std: float
205
+ test_prob_min: float
206
+ test_prob_max: float
207
+
208
+
209
+ def price_prefix(symbol: str) -> str:
210
+ return symbol.lower().replace("&", "and").replace(" ", "_")
211
+
212
+
213
+ def benchmark_symbol(symbol: str) -> str:
214
+ return SYMBOL_BENCHMARKS.get(symbol, "NIFTY 50")
215
+
216
+
217
+ def symbol_file_stem(symbol: str) -> str:
218
+ mapping = {
219
+ "NIFTY 50": "nifty50",
220
+ "NIFTY BANK": "banknifty",
221
+ "INDIA VIX": "india_vix",
222
+ }
223
+ if symbol not in mapping:
224
+ raise KeyError(f"Unsupported symbol: {symbol}")
225
+ return mapping[symbol]
226
+
227
+
228
+ def sigmoid(x: np.ndarray) -> np.ndarray:
229
+ return 1.0 / (1.0 + np.exp(-np.clip(x, -40.0, 40.0)))
230
+
231
+
232
+ def safe_div(numer: pd.Series | np.ndarray, denom: pd.Series | np.ndarray) -> pd.Series:
233
+ n = pd.Series(numer, copy=False)
234
+ d = pd.Series(denom, copy=False)
235
+ out = pd.Series(np.nan, index=n.index, dtype="float64")
236
+ mask = d.notna() & np.isfinite(d.to_numpy(dtype="float64")) & (d != 0)
237
+ out.loc[mask] = n.loc[mask].to_numpy(dtype="float64") / d.loc[mask].to_numpy(dtype="float64")
238
+ return out
239
+
240
+
241
+ def _to_ns_datetime(series: pd.Series) -> pd.Series:
242
+ return pd.to_datetime(series, errors="coerce").astype("datetime64[ns]")
243
+
244
+
245
+ @lru_cache(maxsize=None)
246
+ def load_price_frame(symbol: str) -> pd.DataFrame:
247
+ path = PRICE_DIR / f"{symbol_file_stem(symbol)}_1d.csv"
248
+ if not path.exists():
249
+ raise FileNotFoundError(f"Missing daily price file for {symbol}: {path}")
250
+ df = pd.read_csv(path).copy()
251
+ df.columns = [str(c).strip().lower().replace(" ", "_") for c in df.columns]
252
+ if "date" not in df.columns:
253
+ raise ValueError(f"Price frame for {symbol} has no date column")
254
+ df["date"] = _to_ns_datetime(df["date"])
255
+ for col in df.columns:
256
+ if col != "date":
257
+ df[col] = pd.to_numeric(df[col], errors="coerce")
258
+ if "volume" in df.columns:
259
+ volume = pd.to_numeric(df["volume"], errors="coerce")
260
+ volume_available = volume.replace(0, np.nan).notna().sum() >= max(20, int(0.5 * len(volume)))
261
+ df["volume"] = volume.replace(0, np.nan) if volume_available else 0.0
262
+ return df.dropna(subset=["date"]).sort_values("date").reset_index(drop=True)
263
+
264
+
265
+ def load_vix() -> pd.DataFrame:
266
+ path = PRICE_DIR / "india_vix_1d.csv"
267
+ if not path.exists():
268
+ return pd.DataFrame(columns=["date"])
269
+ df = pd.read_csv(path).copy()
270
+ df.columns = [str(c).strip().lower().replace(" ", "_") for c in df.columns]
271
+ if "date" not in df.columns:
272
+ return pd.DataFrame(columns=["date"])
273
+ df["date"] = _to_ns_datetime(df["date"])
274
+ rename_map = {
275
+ "open": "vix_open",
276
+ "high": "vix_high",
277
+ "low": "vix_low",
278
+ "close": "vix_close",
279
+ "volume": "vix_volume",
280
+ }
281
+ df = df.rename(columns={k: v for k, v in rename_map.items() if k in df.columns})
282
+ for col in df.columns:
283
+ if col != "date":
284
+ df[col] = pd.to_numeric(df[col], errors="coerce")
285
+ return df.dropna(subset=["date"]).sort_values("date").reset_index(drop=True)
286
+
287
+
288
+ def load_external_panel() -> pd.DataFrame:
289
+ path = ALT_DIR / "external" / "processed" / "external_daily_panel.csv"
290
+ if not path.exists():
291
+ return pd.DataFrame(columns=["date"])
292
+ df = pd.read_csv(path).copy()
293
+ df.columns = [str(c).strip().lower().replace(" ", "_") for c in df.columns]
294
+ if "date" not in df.columns:
295
+ return pd.DataFrame(columns=["date"])
296
+ df["date"] = _to_ns_datetime(df["date"])
297
+ for col in df.columns:
298
+ if col != "date":
299
+ df[col] = pd.to_numeric(df[col], errors="coerce")
300
+ return df.dropna(subset=["date"]).sort_values("date").reset_index(drop=True)
301
+
302
+
303
+ def load_institutional_panel() -> pd.DataFrame:
304
+ path = ALT_DIR / "institutional" / "processed" / "institutional_daily_panel.csv"
305
+ if not path.exists():
306
+ return pd.DataFrame(columns=["date"])
307
+ df = pd.read_csv(path).copy()
308
+ df.columns = [str(c).strip().lower().replace(" ", "_") for c in df.columns]
309
+ if "date" not in df.columns:
310
+ return pd.DataFrame(columns=["date"])
311
+ df["date"] = _to_ns_datetime(df["date"])
312
+ for col in df.columns:
313
+ if col != "date":
314
+ df[col] = pd.to_numeric(df[col], errors="coerce")
315
+ return df.dropna(subset=["date"]).sort_values("date").reset_index(drop=True)
316
+
317
+
318
+ def load_options_features(symbol: str) -> pd.DataFrame:
319
+ file_name = {
320
+ "NIFTY 50": "nifty50_options_daily_features.csv",
321
+ "NIFTY BANK": "banknifty_options_daily_features.csv",
322
+ }[symbol]
323
+ path = ALT_DIR / "options" / "processed" / file_name
324
+ if not path.exists():
325
+ return pd.DataFrame(columns=["date"])
326
+ df = pd.read_csv(path).copy()
327
+ df.columns = [str(c).strip().lower().replace(" ", "_") for c in df.columns]
328
+ if "date" not in df.columns:
329
+ return pd.DataFrame(columns=["date"])
330
+ df["date"] = _to_ns_datetime(df["date"])
331
+ prefix = price_prefix(symbol)
332
+ rename = {c: f"{prefix}_opt_{c}" for c in df.columns if c not in {"date", "spot_close"}}
333
+ df = df.rename(columns=rename)
334
+ for col in df.columns:
335
+ if col != "date":
336
+ df[col] = pd.to_numeric(df[col], errors="coerce")
337
+ return df.dropna(subset=["date"]).sort_values("date").reset_index(drop=True)
338
+
339
+
340
+ def add_options_regime_features(df: pd.DataFrame) -> pd.DataFrame:
341
+ df = df.copy()
342
+ for prefix in ("nifty_50_opt", "nifty_bank_opt"):
343
+ base = {
344
+ "pcr_oi": f"{prefix}_pcr_open_int",
345
+ "pcr_contracts": f"{prefix}_pcr_contracts",
346
+ "atm_pcr_oi": f"{prefix}_atm_pcr_open_int",
347
+ "atm_straddle": f"{prefix}_atm_straddle_close",
348
+ "atm_ce": f"{prefix}_atm_close_ce",
349
+ "atm_pe": f"{prefix}_atm_close_pe",
350
+ "atm_oi_ce": f"{prefix}_atm_open_int_ce",
351
+ "atm_oi_pe": f"{prefix}_atm_open_int_pe",
352
+ "contracts_ce": f"{prefix}_contracts_ce",
353
+ "contracts_pe": f"{prefix}_contracts_pe",
354
+ "oi_ce": f"{prefix}_open_int_ce",
355
+ "oi_pe": f"{prefix}_open_int_pe",
356
+ "chg_oi_ce": f"{prefix}_chg_in_oi_ce",
357
+ "chg_oi_pe": f"{prefix}_chg_in_oi_pe",
358
+ }
359
+ if base["atm_ce"] in df.columns and base["atm_pe"] in df.columns:
360
+ ce = pd.to_numeric(df[base["atm_ce"]], errors="coerce")
361
+ pe = pd.to_numeric(df[base["atm_pe"]], errors="coerce")
362
+ total = ce + pe
363
+ df[f"{prefix}_atm_skew"] = safe_div(ce - pe, total + 1e-6)
364
+ df[f"{prefix}_atm_put_share"] = safe_div(pe, total + 1e-6)
365
+ if base["atm_straddle"] in df.columns:
366
+ series = pd.to_numeric(df[base["atm_straddle"]], errors="coerce")
367
+ for w in (5, 20):
368
+ df[f"{prefix}_atm_straddle_z{w}"] = safe_div(series - series.rolling(w).mean(), series.rolling(w).std())
369
+ df[f"{prefix}_atm_straddle_ret_5"] = series.pct_change(5, fill_method=None)
370
+ if base["pcr_oi"] in df.columns:
371
+ series = pd.to_numeric(df[base["pcr_oi"]], errors="coerce")
372
+ df[f"{prefix}_pcr_oi_z20"] = safe_div(series - series.rolling(20).mean(), series.rolling(20).std())
373
+ df[f"{prefix}_pcr_oi_chg_5"] = series.diff(5)
374
+ if base["pcr_contracts"] in df.columns:
375
+ series = pd.to_numeric(df[base["pcr_contracts"]], errors="coerce")
376
+ df[f"{prefix}_pcr_contracts_z20"] = safe_div(series - series.rolling(20).mean(), series.rolling(20).std())
377
+ if base["atm_pcr_oi"] in df.columns:
378
+ series = pd.to_numeric(df[base["atm_pcr_oi"]], errors="coerce")
379
+ df[f"{prefix}_atm_pcr_oi_z20"] = safe_div(series - series.rolling(20).mean(), series.rolling(20).std())
380
+ if base["oi_ce"] in df.columns and base["oi_pe"] in df.columns:
381
+ ce = pd.to_numeric(df[base["oi_ce"]], errors="coerce")
382
+ pe = pd.to_numeric(df[base["oi_pe"]], errors="coerce")
383
+ total = ce + pe
384
+ df[f"{prefix}_oi_balance"] = safe_div(pe - ce, total + 1e-6)
385
+ if base["contracts_ce"] in df.columns and base["contracts_pe"] in df.columns:
386
+ ce = pd.to_numeric(df[base["contracts_ce"]], errors="coerce")
387
+ pe = pd.to_numeric(df[base["contracts_pe"]], errors="coerce")
388
+ total = ce + pe
389
+ df[f"{prefix}_contracts_balance"] = safe_div(pe - ce, total + 1e-6)
390
+ if base["chg_oi_ce"] in df.columns and base["chg_oi_pe"] in df.columns:
391
+ ce = pd.to_numeric(df[base["chg_oi_ce"]], errors="coerce")
392
+ pe = pd.to_numeric(df[base["chg_oi_pe"]], errors="coerce")
393
+ total = ce.abs() + pe.abs()
394
+ df[f"{prefix}_chg_oi_balance"] = safe_div(pe - ce, total + 1e-6)
395
+ if {"nifty_50_opt_atm_straddle_close", "nifty_50_close"}.issubset(df.columns):
396
+ df["nifty_50_opt_straddle_rel_spot"] = safe_div(df["nifty_50_opt_atm_straddle_close"], df["nifty_50_close"])
397
+ if {"nifty_bank_opt_atm_straddle_close", "nifty_bank_close"}.issubset(df.columns):
398
+ df["nifty_bank_opt_straddle_rel_spot"] = safe_div(df["nifty_bank_opt_atm_straddle_close"], df["nifty_bank_close"])
399
+ return df
400
+
401
+
402
+ def add_external_regime_features(df: pd.DataFrame) -> pd.DataFrame:
403
+ df = df.copy()
404
+ base_cols = [c for c in df.columns if c.endswith("_value") or c.endswith("_change_1") or c.endswith("_return_1")]
405
+ for col in base_cols:
406
+ series = pd.to_numeric(df[col], errors="coerce")
407
+ if series.notna().sum() < 40:
408
+ continue
409
+ for w in (5, 20, 60):
410
+ df[f"{col}_mean_{w}"] = series.rolling(w).mean()
411
+ for w in (20, 60):
412
+ rolling_std = series.rolling(w).std()
413
+ df[f"{col}_z_{w}"] = safe_div(series - series.rolling(w).mean(), rolling_std)
414
+ ratio_pairs = [
415
+ ("nasdaq_composite_value", "sp500_value", "nasdaq_vs_sp500"),
416
+ ("vix_fred_value", "vix_close", "us_vix_vs_india_vix"),
417
+ ("broad_dollar_index_value", "india_fx_inr_per_usd_value", "dxy_vs_inr"),
418
+ ]
419
+ for numer_col, denom_col, prefix in ratio_pairs:
420
+ if numer_col in df.columns and denom_col in df.columns:
421
+ ratio = safe_div(df[numer_col], df[denom_col])
422
+ df[f"{prefix}_ratio"] = ratio
423
+ df[f"{prefix}_z20"] = safe_div(ratio - ratio.rolling(20).mean(), ratio.rolling(20).std())
424
+ df[f"{prefix}_mom_5"] = ratio.pct_change(5, fill_method=None)
425
+ if {"us10y_treasury_value", "fed_funds_value"}.issubset(df.columns):
426
+ spread = pd.to_numeric(df["us10y_treasury_value"], errors="coerce") - pd.to_numeric(df["fed_funds_value"], errors="coerce")
427
+ df["us10y_minus_fedfunds"] = spread
428
+ df["us10y_minus_fedfunds_z20"] = safe_div(spread - spread.rolling(20).mean(), spread.rolling(20).std())
429
+ return df
430
+
431
+
432
+ def add_institutional_flow_features(df: pd.DataFrame) -> pd.DataFrame:
433
+ df = df.copy()
434
+ net_cols = [
435
+ "fii_cash_net",
436
+ "dii_cash_net",
437
+ "fii_fno_futures_net",
438
+ "fii_fno_options_net",
439
+ "fii_index_futures_net_oi",
440
+ "fii_index_options_net_oi",
441
+ "fii_index_futures_net_volume",
442
+ "fii_index_options_net_volume",
443
+ ]
444
+ for col in net_cols:
445
+ if col not in df.columns:
446
+ continue
447
+ series = pd.to_numeric(df[col], errors="coerce")
448
+ gross_col = col.replace("_net", "_buy")
449
+ alt_gross_col = col.replace("_net", "_long_volume")
450
+ gross = None
451
+ if gross_col in df.columns:
452
+ gross = pd.to_numeric(df[gross_col], errors="coerce").abs()
453
+ elif alt_gross_col in df.columns:
454
+ gross = pd.to_numeric(df[alt_gross_col], errors="coerce").abs()
455
+ for w in (3, 5, 10, 20):
456
+ df[f"{col}_sum_{w}"] = series.rolling(w).sum()
457
+ df[f"{col}_mean_{w}"] = series.rolling(w).mean()
458
+ df[f"{col}_z20"] = safe_div(series - series.rolling(20).mean(), series.rolling(20).std())
459
+ df[f"{col}_sign"] = np.sign(series)
460
+ if gross is not None:
461
+ df[f"{col}_intensity"] = safe_div(series, gross + 1e-6)
462
+ if {"fii_cash_net", "dii_cash_net"}.issubset(df.columns):
463
+ cash_spread = pd.to_numeric(df["fii_cash_net"], errors="coerce") - pd.to_numeric(df["dii_cash_net"], errors="coerce")
464
+ df["inst_cash_spread"] = cash_spread
465
+ df["inst_cash_spread_z20"] = safe_div(cash_spread - cash_spread.rolling(20).mean(), cash_spread.rolling(20).std())
466
+ if {"fii_fno_futures_net", "fii_fno_options_net"}.issubset(df.columns):
467
+ combo = pd.to_numeric(df["fii_fno_futures_net"], errors="coerce") + pd.to_numeric(df["fii_fno_options_net"], errors="coerce")
468
+ df["fii_fno_total_net"] = combo
469
+ df["fii_fno_total_net_z20"] = safe_div(combo - combo.rolling(20).mean(), combo.rolling(20).std())
470
+ if {"fii_index_options_call_net_volume", "fii_index_options_put_net_volume"}.issubset(df.columns):
471
+ put_call_spread = pd.to_numeric(df["fii_index_options_put_net_volume"], errors="coerce") - pd.to_numeric(df["fii_index_options_call_net_volume"], errors="coerce")
472
+ total = (
473
+ pd.to_numeric(df["fii_index_options_put_net_volume"], errors="coerce").abs()
474
+ + pd.to_numeric(df["fii_index_options_call_net_volume"], errors="coerce").abs()
475
+ )
476
+ df["fii_put_call_volume_spread"] = put_call_spread
477
+ df["fii_put_call_volume_balance"] = safe_div(put_call_spread, total + 1e-6)
478
+ return df
479
+
480
+
481
+ def add_cross_market_features(df: pd.DataFrame) -> pd.DataFrame:
482
+ df = df.copy()
483
+ if {"nifty_50_ret_1", "fii_cash_net"}.issubset(df.columns):
484
+ df["fii_cash_x_nifty50_ret"] = pd.to_numeric(df["fii_cash_net"], errors="coerce") * pd.to_numeric(df["nifty_50_ret_1"], errors="coerce")
485
+ if {"nifty_bank_ret_1", "fii_fno_futures_net"}.issubset(df.columns):
486
+ df["fii_futures_x_bank_ret"] = pd.to_numeric(df["fii_fno_futures_net"], errors="coerce") * pd.to_numeric(df["nifty_bank_ret_1"], errors="coerce")
487
+ if {"vix_close", "fii_cash_net"}.issubset(df.columns):
488
+ df["fii_cash_vs_vix"] = safe_div(pd.to_numeric(df["fii_cash_net"], errors="coerce"), pd.to_numeric(df["vix_close"], errors="coerce"))
489
+ if {"vix_fred_value", "nifty_50_ret_std_20"}.issubset(df.columns):
490
+ df["us_vix_x_local_vol"] = pd.to_numeric(df["vix_fred_value"], errors="coerce") * pd.to_numeric(df["nifty_50_ret_std_20"], errors="coerce")
491
+ return df
492
+
493
+
494
+ def add_price_features(df: pd.DataFrame, prefix: str) -> pd.DataFrame:
495
+ df = df.copy()
496
+ if f"{prefix}_close" not in df.columns:
497
+ rename_map = {c: f"{prefix}_{c}" for c in ["open", "high", "low", "close", "volume"] if c in df.columns}
498
+ df = df.rename(columns=rename_map)
499
+ close = df[f"{prefix}_close"]
500
+ open_ = df[f"{prefix}_open"]
501
+ high = df[f"{prefix}_high"]
502
+ low = df[f"{prefix}_low"]
503
+ raw_vol = pd.to_numeric(df.get(f"{prefix}_volume", 0.0), errors="coerce")
504
+ volume_missing = raw_vol.replace(0, np.nan).notna().sum() < max(20, int(0.5 * len(raw_vol)))
505
+ vol = raw_vol.replace(0, np.nan)
506
+
507
+ ret_1 = close.pct_change()
508
+ df[f"{prefix}_ret_1"] = ret_1
509
+ df[f"{prefix}_ret_2"] = close.pct_change(2)
510
+ df[f"{prefix}_ret_5"] = close.pct_change(5)
511
+ df[f"{prefix}_ret_10"] = close.pct_change(10)
512
+ df[f"{prefix}_logret_1"] = np.log(close / close.shift(1))
513
+ df[f"{prefix}_gap_1"] = open_ / close.shift(1) - 1.0
514
+ df[f"{prefix}_body"] = close / open_ - 1.0
515
+ df[f"{prefix}_range"] = safe_div(high - low, close)
516
+ df[f"{prefix}_upper_wick"] = safe_div(high - np.maximum(open_, close), close)
517
+ df[f"{prefix}_lower_wick"] = safe_div(np.minimum(open_, close) - low, close)
518
+ df[f"{prefix}_trend_5"] = close / close.rolling(5).mean() - 1.0
519
+ df[f"{prefix}_trend_10"] = close / close.rolling(10).mean() - 1.0
520
+ df[f"{prefix}_trend_20"] = close / close.rolling(20).mean() - 1.0
521
+ df[f"{prefix}_trend_60"] = close / close.rolling(60).mean() - 1.0
522
+ df[f"{prefix}_trend_120"] = close / close.rolling(120).mean() - 1.0
523
+ df[f"{prefix}_trend_252"] = close / close.rolling(252).mean() - 1.0
524
+ rolling_max_252 = close.rolling(252).max()
525
+ rolling_min_252 = close.rolling(252).min()
526
+ df[f"{prefix}_drawdown_252"] = close / rolling_max_252 - 1.0
527
+ df[f"{prefix}_dist_from_low_252"] = close / rolling_min_252 - 1.0
528
+ if volume_missing:
529
+ df[f"{prefix}_vol_chg_1"] = 0.0
530
+ df[f"{prefix}_vol_z_20"] = 0.0
531
+ df[f"{prefix}_vol_z_60"] = 0.0
532
+ else:
533
+ df[f"{prefix}_vol_chg_1"] = vol.pct_change()
534
+ df[f"{prefix}_vol_z_20"] = (vol - vol.rolling(20).mean()) / vol.rolling(20).std()
535
+ df[f"{prefix}_vol_z_60"] = (vol - vol.rolling(60).mean()) / vol.rolling(60).std()
536
+
537
+ for w in [3, 5, 10, 20, 60, 120, 252]:
538
+ df[f"{prefix}_ret_mean_{w}"] = ret_1.rolling(w).mean()
539
+ df[f"{prefix}_ret_std_{w}"] = ret_1.rolling(w).std()
540
+ df[f"{prefix}_range_mean_{w}"] = df[f"{prefix}_range"].rolling(w).mean()
541
+ df[f"{prefix}_range_std_{w}"] = df[f"{prefix}_range"].rolling(w).std()
542
+
543
+ delta = close.diff()
544
+ gain = delta.clip(lower=0.0)
545
+ loss = -delta.clip(upper=0.0)
546
+ avg_gain = gain.ewm(alpha=1 / 14.0, adjust=False, min_periods=14).mean()
547
+ avg_loss = loss.ewm(alpha=1 / 14.0, adjust=False, min_periods=14).mean()
548
+ rs = avg_gain / avg_loss.replace(0.0, np.nan)
549
+ df[f"{prefix}_rsi_14"] = 100.0 - (100.0 / (1.0 + rs))
550
+ ema_12 = close.ewm(span=12, adjust=False, min_periods=12).mean()
551
+ ema_26 = close.ewm(span=26, adjust=False, min_periods=26).mean()
552
+ macd = ema_12 - ema_26
553
+ signal = macd.ewm(span=9, adjust=False, min_periods=9).mean()
554
+ df[f"{prefix}_macd"] = macd / close
555
+ df[f"{prefix}_macd_signal"] = signal / close
556
+ df[f"{prefix}_macd_hist"] = (macd - signal) / close
557
+ return df
558
+
559
+
560
+ def build_panel(include_engineered: bool = True, include_option_engineered: bool = True) -> pd.DataFrame:
561
+ nifty = add_price_features(load_price_frame("NIFTY 50"), "nifty_50")
562
+ bank = add_price_features(load_price_frame("NIFTY BANK"), "nifty_bank")
563
+ panel = nifty.merge(bank, on="date", how="inner").sort_values("date").reset_index(drop=True)
564
+ panel["pair_ret_corr_20"] = panel["nifty_50_ret_1"].rolling(20).corr(panel["nifty_bank_ret_1"])
565
+ panel["pair_ret_corr_60"] = panel["nifty_50_ret_1"].rolling(60).corr(panel["nifty_bank_ret_1"])
566
+ panel["pair_close_ratio"] = panel["nifty_50_close"] / panel["nifty_bank_close"] - 1.0
567
+
568
+ vix = load_vix()
569
+ if not vix.empty:
570
+ panel = pd.merge_asof(panel.sort_values("date"), vix.sort_values("date"), on="date", direction="backward")
571
+
572
+ external = load_external_panel()
573
+ if not external.empty:
574
+ panel = pd.merge_asof(panel.sort_values("date"), external.sort_values("date"), on="date", direction="backward")
575
+
576
+ institutional = load_institutional_panel()
577
+ if not institutional.empty:
578
+ panel = pd.merge_asof(
579
+ panel.sort_values("date"),
580
+ institutional.sort_values("date"),
581
+ on="date",
582
+ direction="backward",
583
+ )
584
+
585
+ nifty_opts = load_options_features("NIFTY 50")
586
+ if not nifty_opts.empty:
587
+ panel = pd.merge_asof(panel.sort_values("date"), nifty_opts.sort_values("date"), on="date", direction="backward")
588
+
589
+ bank_opts = load_options_features("NIFTY BANK")
590
+ if not bank_opts.empty:
591
+ panel = pd.merge_asof(panel.sort_values("date"), bank_opts.sort_values("date"), on="date", direction="backward")
592
+
593
+ if include_option_engineered:
594
+ panel = add_options_regime_features(panel)
595
+ if include_engineered:
596
+ panel = add_external_regime_features(panel)
597
+ panel = add_institutional_flow_features(panel)
598
+ panel = add_cross_market_features(panel)
599
+ return panel.sort_values("date").reset_index(drop=True)
600
+
601
+
602
+ @lru_cache(maxsize=None)
603
+ def load_intraday_daily(symbol: str) -> pd.DataFrame:
604
+ path = INTRADAY_DIR / f"{symbol}_minute.csv"
605
+ if not path.exists():
606
+ raise FileNotFoundError(f"Missing minute file for {symbol}: {path}")
607
+ df = pd.read_csv(path).copy()
608
+ df.columns = [str(c).strip().lower().replace(" ", "_") for c in df.columns]
609
+ df["date"] = _to_ns_datetime(df["date"])
610
+ for col in ("open", "high", "low", "close", "volume"):
611
+ if col in df.columns:
612
+ df[col] = pd.to_numeric(df[col], errors="coerce")
613
+ df["session_date"] = df["date"].dt.normalize()
614
+ df = df.dropna(subset=["date"]).sort_values("date").reset_index(drop=True)
615
+ grouped = df.groupby("session_date", sort=True)
616
+
617
+ def session_apply(func):
618
+ return grouped.apply(func, include_groups=False).to_numpy()
619
+
620
+ out = pd.DataFrame({"date": grouped["date"].first().dt.normalize()})
621
+ out["intraday_open"] = grouped["open"].first().to_numpy()
622
+ out["intraday_high"] = grouped["high"].max().to_numpy()
623
+ out["intraday_low"] = grouped["low"].min().to_numpy()
624
+ out["intraday_close"] = grouped["close"].last().to_numpy()
625
+ out["intraday_nbars"] = grouped.size().to_numpy()
626
+ out["intraday_range"] = safe_div(out["intraday_high"] - out["intraday_low"], out["intraday_low"])
627
+ out["intraday_body"] = safe_div(out["intraday_close"] - out["intraday_open"], out["intraday_open"])
628
+ out["intraday_close_loc"] = safe_div(
629
+ out["intraday_close"] - out["intraday_low"],
630
+ out["intraday_high"] - out["intraday_low"],
631
+ )
632
+ out["intraday_first_30"] = session_apply(
633
+ lambda x: x["close"].iloc[min(29, len(x) - 1)] / x["open"].iloc[0] - 1.0
634
+ )
635
+ out["intraday_first_60"] = session_apply(
636
+ lambda x: x["close"].iloc[min(59, len(x) - 1)] / x["open"].iloc[0] - 1.0
637
+ )
638
+ out["intraday_last_30"] = session_apply(
639
+ lambda x: x["close"].iloc[-1] / x["close"].iloc[max(0, len(x) - 30)] - 1.0
640
+ )
641
+ out["intraday_last_60"] = session_apply(
642
+ lambda x: x["close"].iloc[-1] / x["close"].iloc[max(0, len(x) - 60)] - 1.0
643
+ )
644
+ out["intraday_midday"] = session_apply(
645
+ lambda x: x["close"].iloc[max(0, len(x) // 2)] / x["open"].iloc[0] - 1.0
646
+ )
647
+ out["intraday_second_half"] = session_apply(
648
+ lambda x: x["close"].iloc[-1] / x["close"].iloc[max(0, len(x) // 2)] - 1.0
649
+ )
650
+ out["intraday_vshape"] = out["intraday_first_60"] - out["intraday_last_60"]
651
+ out["intraday_abruptness"] = safe_div(out["intraday_high"] - out["intraday_low"], out["intraday_open"])
652
+ out["intraday_realized_vol"] = session_apply(lambda x: np.log(x["close"]).diff().std() * np.sqrt(len(x)))
653
+ out["intraday_range_vs_body"] = safe_div(out["intraday_range"], out["intraday_body"].abs() + 1e-6)
654
+ return out
655
+
656
+
657
+ def build_master_frame(
658
+ symbol: str,
659
+ target_bars: int = 1,
660
+ ) -> pd.DataFrame:
661
+ own = price_prefix(symbol)
662
+ use_engineered = symbol == "NIFTY BANK"
663
+ use_option_engineered = symbol == "NIFTY 50"
664
+ panel = build_panel(include_engineered=use_engineered, include_option_engineered=use_option_engineered).copy()
665
+ intraday = load_intraday_daily(symbol)
666
+ frame = pd.merge_asof(panel.sort_values("date"), intraday.sort_values("date"), on="date", direction="backward")
667
+
668
+ if target_bars < 1:
669
+ raise ValueError("target_bars must be at least 1")
670
+ future_close = frame[f"{own}_close"].shift(-target_bars)
671
+ frame["target_date"] = frame["date"].shift(-target_bars)
672
+ known_future = future_close.notna()
673
+ frame["target"] = np.where(known_future, (future_close > frame[f"{own}_close"]).astype("int64"), np.nan)
674
+ frame["next_close_return"] = future_close / frame[f"{own}_close"] - 1.0
675
+ frame["target_lag_1"] = frame["target"].shift(1)
676
+ frame["target_roll_up_5"] = frame["target"].shift(1).rolling(5).mean()
677
+ frame["target_roll_up_10"] = frame["target"].shift(1).rolling(10).mean()
678
+ frame["target_roll_up_20"] = frame["target"].shift(1).rolling(20).mean()
679
+ frame = frame.replace([np.inf, -np.inf], np.nan)
680
+ # Keep the latest row even though its future close/target is unknown.
681
+ # Model fitting and backtests filter to known target rows later, while latest_row uses this retained row.
682
+ return frame.dropna(subset=["date", f"{own}_close"]).reset_index(drop=True)
683
+
684
+
685
+ def is_option_column(name: str) -> bool:
686
+ return "_opt_" in name
687
+
688
+
689
+ def is_flow_column(name: str) -> bool:
690
+ prefixes = ("fii_", "dii_", "inst_", "participant_", "cash_", "fno_")
691
+ return name.startswith(prefixes) or "put_call_volume" in name
692
+
693
+
694
+ def is_external_column(name: str) -> bool:
695
+ prefixes = (
696
+ "sp500_",
697
+ "nasdaq_composite_",
698
+ "dow_jones_",
699
+ "nikkei225_",
700
+ "us10y_treasury_",
701
+ "fed_funds_",
702
+ "india_fx_inr_per_usd_",
703
+ "brent_fred_",
704
+ "vix_fred_",
705
+ "broad_dollar_index_",
706
+ "dxy_",
707
+ "us10y_minus_fedfunds",
708
+ "nasdaq_vs_sp500",
709
+ "us_vix_vs_india_vix",
710
+ )
711
+ return name.startswith(prefixes)
712
+
713
+
714
+ def is_vix_column(name: str) -> bool:
715
+ return name.startswith("vix_")
716
+
717
+
718
+ def is_pair_column(name: str) -> bool:
719
+ return name.startswith("pair_")
720
+
721
+
722
+ def is_intraday_column(name: str) -> bool:
723
+ return name.startswith("intraday_")
724
+
725
+
726
+ def rank_feature_columns(train_df: pd.DataFrame, feature_cols: list[str]) -> list[str]:
727
+ scores: dict[str, float] = {}
728
+ y = train_df["target"].astype(float)
729
+ for col in feature_cols:
730
+ x = pd.to_numeric(train_df[col], errors="coerce")
731
+ pair = pd.concat([x.rename("x"), y.rename("y")], axis=1).dropna()
732
+ if len(pair) < 40 or pair["x"].nunique() <= 1:
733
+ scores[col] = 0.0
734
+ continue
735
+ corr = pair["x"].corr(pair["y"])
736
+ scores[col] = abs(float(corr)) if corr is not None and np.isfinite(corr) else 0.0
737
+ return pd.Series(scores).sort_values(ascending=False).index.tolist()
738
+
739
+
740
+ def select_model_columns(frame: pd.DataFrame, use_intraday: bool, feature_profile: str, symbol: str) -> list[str]:
741
+ meta = {"date", "target_date", "target", "next_close_return"}
742
+ cols = [c for c in frame.columns if c not in meta and pd.api.types.is_numeric_dtype(frame[c])]
743
+ if not use_intraday:
744
+ cols = [c for c in cols if not is_intraday_column(c)]
745
+ own = price_prefix(symbol)
746
+ other = price_prefix(benchmark_symbol(symbol))
747
+ core_cols = [
748
+ c for c in cols
749
+ if c.startswith(f"{own}_") or c.startswith(f"{other}_") or is_pair_column(c) or is_vix_column(c) or c.startswith("target_")
750
+ ]
751
+ option_cols = [c for c in cols if is_option_column(c)]
752
+ external_cols = [c for c in cols if is_external_column(c)]
753
+ flow_cols = [c for c in cols if is_flow_column(c)]
754
+ intraday_cols = [c for c in cols if is_intraday_column(c)]
755
+
756
+ profile_map = {
757
+ "all": cols,
758
+ "lean": core_cols + intraday_cols,
759
+ "price_options": core_cols + option_cols + intraday_cols,
760
+ "price_external": core_cols + external_cols + intraday_cols,
761
+ "options_macro": core_cols + option_cols + external_cols + intraday_cols,
762
+ "bank_alt": core_cols + option_cols + external_cols + flow_cols + intraday_cols,
763
+ }
764
+ selected = profile_map.get(feature_profile, cols)
765
+ return list(dict.fromkeys([c for c in selected if c in cols]))
766
+
767
+
768
+ def train_logistic_model(
769
+ x: np.ndarray,
770
+ y: np.ndarray,
771
+ l2: float = 0.5,
772
+ max_iter: int = 900,
773
+ lr: float = 0.05,
774
+ *,
775
+ progress_enabled: bool = True,
776
+ progress_update_every: float = 0.2,
777
+ progress_description: str = "Logistic training",
778
+ ) -> dict[str, np.ndarray | float]:
779
+ x = np.asarray(x, dtype="float64")
780
+ y = np.asarray(y, dtype="float64")
781
+ mean = np.nanmean(x, axis=0)
782
+ std = np.nanstd(x, axis=0)
783
+ std[~np.isfinite(std) | (std == 0)] = 1.0
784
+ xs = (x - mean) / std
785
+ coef = np.zeros(xs.shape[1], dtype="float64")
786
+ intercept = float(np.log((y.mean() + 1e-6) / (1.0 - y.mean() + 1e-6)))
787
+ mw = np.zeros_like(coef)
788
+ vw = np.zeros_like(coef)
789
+ mb = 0.0
790
+ vb = 0.0
791
+ beta1 = 0.9
792
+ beta2 = 0.999
793
+ eps = 1e-8
794
+ with ProgressBar(
795
+ max_iter,
796
+ progress_description,
797
+ enabled=progress_enabled,
798
+ update_every=progress_update_every,
799
+ ) as progress:
800
+ for step in range(1, max_iter + 1):
801
+ z = xs @ coef + intercept
802
+ p = sigmoid(z)
803
+ err = p - y
804
+ grad_w = (xs.T @ err) / len(y) + l2 * coef
805
+ grad_b = err.mean()
806
+ mw = beta1 * mw + (1.0 - beta1) * grad_w
807
+ vw = beta2 * vw + (1.0 - beta2) * (grad_w * grad_w)
808
+ mb = beta1 * mb + (1.0 - beta1) * grad_b
809
+ vb = beta2 * vb + (1.0 - beta2) * (grad_b * grad_b)
810
+ mw_hat = mw / (1.0 - beta1**step)
811
+ vw_hat = vw / (1.0 - beta2**step)
812
+ mb_hat = mb / (1.0 - beta1**step)
813
+ vb_hat = vb / (1.0 - beta2**step)
814
+ coef -= lr * mw_hat / (np.sqrt(vw_hat) + eps)
815
+ intercept -= lr * mb_hat / (math.sqrt(vb_hat) + eps)
816
+ progress.update(step)
817
+ if step % 100 == 0 and float(np.linalg.norm(grad_w) + abs(grad_b)) < 1e-4:
818
+ progress.update(step, description=f"{progress_description} converged", force=True)
819
+ break
820
+ return {"kind": "logit", "coef": coef, "intercept": intercept, "mean": mean, "std": std}
821
+
822
+
823
+ def predict_logistic_model(model: dict[str, np.ndarray | float], x: np.ndarray) -> np.ndarray:
824
+ xs = (np.asarray(x, dtype="float64") - model["mean"]) / model["std"]
825
+ z = xs @ model["coef"] + float(model["intercept"])
826
+ return sigmoid(z)
827
+
828
+
829
+ @dataclass
830
+ class TreeNode:
831
+ feat: int | None = None
832
+ thr: float | None = None
833
+ left: "TreeNode | None" = None
834
+ right: "TreeNode | None" = None
835
+ prob: float | None = None
836
+
837
+
838
+ def _gini(y: np.ndarray) -> float:
839
+ if len(y) == 0:
840
+ return 0.0
841
+ p = float(np.mean(y))
842
+ return 1.0 - p * p - (1.0 - p) * (1.0 - p)
843
+
844
+
845
+ def _best_split(x: np.ndarray, y: np.ndarray, features: np.ndarray) -> tuple[float, int, float, np.ndarray] | None:
846
+ n = len(y)
847
+ parent = _gini(y)
848
+ best: tuple[float, int, float, np.ndarray] | None = None
849
+ for feat in features:
850
+ col = x[:, feat]
851
+ if np.all(col == col[0]):
852
+ continue
853
+ thresholds = np.unique(np.quantile(col, [0.25, 0.5, 0.75]))
854
+ for thr in thresholds:
855
+ left = col <= thr
856
+ nl = int(left.sum())
857
+ nr = n - nl
858
+ if nl < 30 or nr < 30:
859
+ continue
860
+ gain = parent - (nl / n) * _gini(y[left]) - (nr / n) * _gini(y[~left])
861
+ if best is None or gain > best[0]:
862
+ best = (gain, int(feat), float(thr), left)
863
+ return best
864
+
865
+
866
+ def _build_tree(
867
+ x: np.ndarray,
868
+ y: np.ndarray,
869
+ depth: int,
870
+ max_depth: int,
871
+ min_leaf: int,
872
+ mtry: int,
873
+ rng: np.random.Generator,
874
+ ) -> TreeNode:
875
+ if depth >= max_depth or len(y) < 2 * min_leaf or len(np.unique(y)) == 1:
876
+ return TreeNode(prob=float(np.mean(y)) if len(y) else 0.5)
877
+ features = rng.choice(x.shape[1], size=min(mtry, x.shape[1]), replace=False)
878
+ best = _best_split(x, y, features)
879
+ if best is None or best[0] <= 1e-9:
880
+ return TreeNode(prob=float(np.mean(y)))
881
+ _, feat, thr, left = best
882
+ if left.sum() < min_leaf or (~left).sum() < min_leaf:
883
+ return TreeNode(prob=float(np.mean(y)))
884
+ return TreeNode(
885
+ feat=feat,
886
+ thr=thr,
887
+ left=_build_tree(x[left], y[left], depth + 1, max_depth, min_leaf, mtry, rng),
888
+ right=_build_tree(x[~left], y[~left], depth + 1, max_depth, min_leaf, mtry, rng),
889
+ )
890
+
891
+
892
+ def _tree_predict(node: TreeNode, row: np.ndarray) -> float:
893
+ while node.prob is None:
894
+ node = node.left if row[node.feat] <= node.thr else node.right
895
+ return float(node.prob)
896
+
897
+
898
+ def train_forest_model(
899
+ x: np.ndarray,
900
+ y: np.ndarray,
901
+ n_trees: int = 60,
902
+ max_depth: int = 5,
903
+ min_leaf: int = 30,
904
+ seed: int = 7,
905
+ *,
906
+ progress_enabled: bool = True,
907
+ progress_update_every: float = 0.2,
908
+ progress_description: str = "Forest training",
909
+ ) -> dict[str, object]:
910
+ x = np.asarray(x, dtype="float64")
911
+ y = np.asarray(y, dtype="int64")
912
+ rng = np.random.default_rng(seed)
913
+ mtry = max(4, int(math.sqrt(x.shape[1])))
914
+ trees = []
915
+ with ProgressBar(
916
+ n_trees,
917
+ progress_description,
918
+ enabled=progress_enabled,
919
+ update_every=progress_update_every,
920
+ ) as progress:
921
+ for tree_idx in range(1, n_trees + 1):
922
+ idx = rng.integers(0, len(y), len(y))
923
+ trees.append(_build_tree(x[idx], y[idx], 0, max_depth, min_leaf, mtry, rng))
924
+ progress.update(tree_idx)
925
+ return {"kind": "forest", "trees": trees}
926
+
927
+
928
+ def predict_forest_model(model: dict[str, object], x: np.ndarray) -> np.ndarray:
929
+ x = np.asarray(x, dtype="float64")
930
+ trees = model["trees"]
931
+ probs = np.zeros(len(x), dtype="float64")
932
+ for i, row in enumerate(x):
933
+ probs[i] = sum(_tree_predict(tree, row) for tree in trees) / len(trees)
934
+ return probs
935
+
936
+
937
+ def train_spec_model(
938
+ spec: ModelSpec,
939
+ train_df: pd.DataFrame,
940
+ feature_cols: list[str],
941
+ *,
942
+ progress_enabled: bool = True,
943
+ progress_update_every: float = 0.2,
944
+ progress_description: str | None = None,
945
+ ) -> tuple[dict[str, object], int]:
946
+ feature_frame = train_df[feature_cols].replace([np.inf, -np.inf], np.nan)
947
+ fill_values = feature_frame.median(numeric_only=True).reindex(feature_cols).fillna(0.0)
948
+ x = feature_frame.fillna(fill_values).to_numpy(dtype="float64")
949
+ y = train_df["target"].to_numpy(dtype="int64")
950
+ description = progress_description or f"Training {spec.name}"
951
+ if spec.kind == "logit":
952
+ model = train_logistic_model(
953
+ x,
954
+ y,
955
+ l2=spec.l2,
956
+ progress_enabled=progress_enabled,
957
+ progress_update_every=progress_update_every,
958
+ progress_description=description,
959
+ )
960
+ model["fill_values"] = fill_values.to_numpy(dtype="float64")
961
+ return model, len(feature_cols)
962
+ if spec.kind == "forest":
963
+ model = train_forest_model(
964
+ x,
965
+ y,
966
+ n_trees=spec.n_trees,
967
+ max_depth=spec.max_depth,
968
+ min_leaf=spec.min_leaf,
969
+ seed=spec.seed,
970
+ progress_enabled=progress_enabled,
971
+ progress_update_every=progress_update_every,
972
+ progress_description=description,
973
+ )
974
+ model["fill_values"] = fill_values.to_numpy(dtype="float64")
975
+ return model, len(feature_cols)
976
+ raise ValueError(f"Unknown model kind: {spec.kind}")
977
+
978
+
979
+ def predict_spec_model(model: dict[str, object], df: pd.DataFrame, feature_cols: list[str]) -> np.ndarray:
980
+ fill_values = pd.Series(np.asarray(model["fill_values"], dtype="float64"), index=feature_cols)
981
+ x = (
982
+ df[feature_cols]
983
+ .replace([np.inf, -np.inf], np.nan)
984
+ .fillna(fill_values)
985
+ .to_numpy(dtype="float64")
986
+ )
987
+ if model["kind"] == "logit":
988
+ return predict_logistic_model(model, x)
989
+ if model["kind"] == "forest":
990
+ return predict_forest_model(model, x)
991
+ raise ValueError(f"Unknown model kind: {model['kind']}")
992
+
993
+
994
+ def best_threshold(y_true: np.ndarray, prob: np.ndarray) -> tuple[float, float]:
995
+ grid = np.round(np.arange(0.35, 0.651, 0.001), 3)
996
+ best_t = 0.5
997
+ best_acc = -1.0
998
+ for t in grid:
999
+ acc = float(np.mean((prob >= t).astype(int) == y_true))
1000
+ if acc > best_acc or (acc == best_acc and abs(t - 0.5) < abs(best_t - 0.5)):
1001
+ best_t = float(t)
1002
+ best_acc = acc
1003
+ return best_t, best_acc
1004
+
1005
+
1006
+ def blend_weights_grid(n_models: int, random_samples: int = 2000, seed: int = 7) -> Iterable[np.ndarray]:
1007
+ rng = np.random.default_rng(seed)
1008
+ if n_models == 1:
1009
+ yield np.array([1.0], dtype="float64")
1010
+ return
1011
+ yield np.full(n_models, 1.0 / n_models, dtype="float64")
1012
+ for i in range(n_models):
1013
+ w = np.zeros(n_models, dtype="float64")
1014
+ w[i] = 1.0
1015
+ yield w
1016
+ for _ in range(random_samples):
1017
+ yield rng.dirichlet(np.ones(n_models, dtype="float64"))
1018
+
1019
+
1020
+ def search_blend(
1021
+ y_valid: np.ndarray,
1022
+ prob_valid_list: list[np.ndarray],
1023
+ random_samples: int = 2000,
1024
+ seed: int = 7,
1025
+ *,
1026
+ progress_enabled: bool = True,
1027
+ progress_update_every: float = 0.2,
1028
+ progress_description: str = "Blend search",
1029
+ ) -> tuple[np.ndarray, float, float]:
1030
+ stacked = np.vstack(prob_valid_list)
1031
+ best_weights = None
1032
+ best_thr = 0.5
1033
+ best_acc = -1.0
1034
+ total_trials = 1 if len(prob_valid_list) == 1 else 1 + len(prob_valid_list) + random_samples
1035
+ with ProgressBar(
1036
+ total_trials,
1037
+ progress_description,
1038
+ enabled=progress_enabled,
1039
+ update_every=progress_update_every,
1040
+ ) as progress:
1041
+ for trial_idx, weights in enumerate(
1042
+ blend_weights_grid(len(prob_valid_list), random_samples=random_samples, seed=seed),
1043
+ start=1,
1044
+ ):
1045
+ blended = weights @ stacked
1046
+ thr, acc = best_threshold(y_valid, blended)
1047
+ if acc > best_acc:
1048
+ best_weights = weights
1049
+ best_thr = thr
1050
+ best_acc = acc
1051
+ progress.update(
1052
+ trial_idx,
1053
+ description=f"{progress_description} best={best_acc:.2%}",
1054
+ force=True,
1055
+ )
1056
+ else:
1057
+ progress.update(trial_idx)
1058
+ if best_weights is None:
1059
+ raise RuntimeError("Blend search failed")
1060
+ return best_weights, best_thr, best_acc
1061
+
1062
+
1063
+ def apply_symbol_decision_overlay(
1064
+ symbol: str,
1065
+ df: pd.DataFrame,
1066
+ prob: np.ndarray,
1067
+ threshold: float,
1068
+ pred: np.ndarray,
1069
+ ) -> np.ndarray:
1070
+ adjusted = np.asarray(pred, dtype="int64").copy()
1071
+ if symbol == "NIFTY 50" and "nifty_bank_body" in df.columns:
1072
+ bank_body = pd.to_numeric(df["nifty_bank_body"], errors="coerce").to_numpy(dtype="float64")
1073
+ near_threshold = np.abs(np.asarray(prob, dtype="float64") - float(threshold)) <= 0.015
1074
+ bank_reversal_setup = bank_body <= -0.0016219151538434222
1075
+ adjusted[near_threshold & bank_reversal_setup] = 1
1076
+ if symbol == "NIFTY 50" and "nifty_bank_ret_std_10" in df.columns:
1077
+ bank_vol = pd.to_numeric(df["nifty_bank_ret_std_10"], errors="coerce").to_numpy(dtype="float64")
1078
+ adjusted[bank_vol <= NIFTY50_LOW_BANK_VOL_THRESHOLD] = 0
1079
+ if symbol == "NIFTY 50" and "nifty_bank_ret_1" in df.columns:
1080
+ bank_ret = pd.to_numeric(df["nifty_bank_ret_1"], errors="coerce").to_numpy(dtype="float64")
1081
+ strong_bank_impulse = bank_ret >= NIFTY50_BANK_RET_FLIP_THRESHOLD
1082
+ adjusted[strong_bank_impulse] = 1 - adjusted[strong_bank_impulse]
1083
+ if symbol == "NIFTY 50" and "nifty_50_range" in df.columns:
1084
+ nifty_range = pd.to_numeric(df["nifty_50_range"], errors="coerce").to_numpy(dtype="float64")
1085
+ adjusted[nifty_range <= NIFTY50_TINY_RANGE_UP_THRESHOLD] = 1
1086
+ return adjusted
1087
+
1088
+
1089
+ def candidate_pools() -> dict[str, list[tuple[pd.Timestamp, ModelSpec]]]:
1090
+ return {
1091
+ "NIFTY 50": [
1092
+ (
1093
+ pd.Timestamp("2024-04-30"),
1094
+ ModelSpec(
1095
+ "nifty50_price_options_2024apr_d4_l10_s7",
1096
+ "forest",
1097
+ False,
1098
+ feature_profile="price_options",
1099
+ top_k=220,
1100
+ n_trees=120,
1101
+ max_depth=4,
1102
+ min_leaf=10,
1103
+ seed=7,
1104
+ ),
1105
+ ),
1106
+ (
1107
+ pd.Timestamp("2024-06-30"),
1108
+ ModelSpec(
1109
+ "nifty50_daily_all_2024h1_top140_d4_l10_s11",
1110
+ "forest",
1111
+ False,
1112
+ feature_profile="all",
1113
+ top_k=140,
1114
+ n_trees=120,
1115
+ max_depth=4,
1116
+ min_leaf=10,
1117
+ seed=11,
1118
+ ),
1119
+ ),
1120
+ (
1121
+ pd.Timestamp("2025-03-31"),
1122
+ ModelSpec(
1123
+ "nifty50_intraday_all_2025q1_top160_d4_l10_s11",
1124
+ "forest",
1125
+ True,
1126
+ feature_profile="all",
1127
+ top_k=160,
1128
+ n_trees=120,
1129
+ max_depth=4,
1130
+ min_leaf=10,
1131
+ seed=11,
1132
+ ),
1133
+ ),
1134
+ ],
1135
+ "NIFTY BANK": [
1136
+ (pd.Timestamp("2023-06-30"), ModelSpec("intraday_forest_2023h1_tuned", "forest", True, n_trees=100, max_depth=5, min_leaf=20, seed=7)),
1137
+ (pd.Timestamp("2022-12-31"), ModelSpec("intraday_logit_2022y", "logit", True, l2=0.5)),
1138
+ (pd.Timestamp("2023-12-31"), ModelSpec("intraday_forest_2023y", "forest", True, n_trees=60, max_depth=5, min_leaf=30, seed=7)),
1139
+ (pd.Timestamp("2022-12-31"), ModelSpec("intraday_forest_2022y", "forest", True, n_trees=60, max_depth=5, min_leaf=30, seed=7)),
1140
+ (pd.Timestamp("2023-12-31"), ModelSpec("daily_forest_2023y", "forest", False, n_trees=60, max_depth=5, min_leaf=30, seed=7)),
1141
+ (pd.Timestamp("2023-06-30"), ModelSpec("daily_forest_2023h1", "forest", False, n_trees=60, max_depth=5, min_leaf=30, seed=7)),
1142
+ (pd.Timestamp("2024-06-30"), ModelSpec("intraday_forest_2024h1", "forest", True, n_trees=120, max_depth=5, min_leaf=15, seed=11)),
1143
+ (pd.Timestamp("2024-06-30"), ModelSpec("intraday_logit_2024h1", "logit", True, l2=1.0)),
1144
+ (pd.Timestamp("2024-06-30"), ModelSpec("daily_forest_2024h1_d4s7", "forest", False, n_trees=120, max_depth=4, min_leaf=15, seed=7)),
1145
+ (pd.Timestamp("2024-06-30"), ModelSpec("intraday_forest_2024h1_d4", "forest", True, n_trees=120, max_depth=4, min_leaf=15, seed=11)),
1146
+ (pd.Timestamp("2024-06-30"), ModelSpec("d_160_d4_l15_s7", "forest", False, n_trees=160, max_depth=4, min_leaf=15, seed=7)),
1147
+ (pd.Timestamp("2021-12-31"), ModelSpec("intraday_forest_2021y", "forest", True, n_trees=120, max_depth=5, min_leaf=15, seed=11)),
1148
+ ],
1149
+ }
1150
+
1151
+
1152
+ def evaluate_ensemble(
1153
+ symbol: str,
1154
+ train_end: pd.Timestamp,
1155
+ valid_end: pd.Timestamp,
1156
+ test_end: pd.Timestamp,
1157
+ *,
1158
+ progress_enabled: bool = True,
1159
+ progress_update_every: float = 0.2,
1160
+ ) -> tuple[FitResult, dict[str, object], pd.DataFrame]:
1161
+ progress_note(f"{symbol}: building master frame", enabled=progress_enabled)
1162
+ frame = build_master_frame(symbol, 1)
1163
+ model_frame = frame.dropna(subset=["target", "next_close_return"]).copy().reset_index(drop=True)
1164
+ use_engineered = symbol == "NIFTY BANK"
1165
+ model_frame_max = model_frame["date"].max()
1166
+ if pd.notna(model_frame_max) and test_end > model_frame_max:
1167
+ test_end = model_frame_max
1168
+ valid_start, valid_end = DAILY_VALID_WINDOWS.get(symbol, (COMMON_VALID_START, valid_end))
1169
+
1170
+ valid_df = model_frame[(model_frame["date"] >= valid_start) & (model_frame["date"] <= valid_end)].copy().reset_index(drop=True)
1171
+ test_df = model_frame[(model_frame["date"] > valid_end) & (model_frame["date"] <= test_end)].copy().reset_index(drop=True)
1172
+ if valid_df.empty or test_df.empty:
1173
+ raise RuntimeError(f"Not enough rows for {symbol}: valid={len(valid_df)} test={len(test_df)}")
1174
+
1175
+ pools = candidate_pools()[symbol]
1176
+ spec_payloads: list[dict[str, object]] = []
1177
+ valid_probs: list[np.ndarray] = []
1178
+ test_probs: list[np.ndarray] = []
1179
+ latest_probs: list[float] = []
1180
+ latest_row = frame.iloc[[-1]].copy()
1181
+
1182
+ with ProgressBar(
1183
+ len(pools),
1184
+ f"{symbol}: candidate models",
1185
+ enabled=progress_enabled,
1186
+ update_every=progress_update_every,
1187
+ ) as pool_progress:
1188
+ for candidate_idx, (candidate_train_end, spec) in enumerate(pools, start=1):
1189
+ pool_progress.update(
1190
+ candidate_idx - 1,
1191
+ description=f"{symbol}: training {spec.name}",
1192
+ force=True,
1193
+ )
1194
+ train_df = model_frame[model_frame["date"] <= candidate_train_end].copy().reset_index(drop=True)
1195
+ feature_cols = select_model_columns(frame, spec.use_intraday, spec.feature_profile, symbol)
1196
+ if spec.top_k is not None and spec.top_k < len(feature_cols):
1197
+ ranked = rank_feature_columns(train_df, feature_cols)
1198
+ feature_cols = ranked[: spec.top_k]
1199
+ model, feature_count = train_spec_model(
1200
+ spec,
1201
+ train_df,
1202
+ feature_cols,
1203
+ progress_enabled=progress_enabled,
1204
+ progress_update_every=progress_update_every,
1205
+ progress_description=f"{symbol}: {spec.name}",
1206
+ )
1207
+ valid_probs.append(predict_spec_model(model, valid_df, feature_cols))
1208
+ test_probs.append(predict_spec_model(model, test_df, feature_cols))
1209
+ latest_probs.append(float(predict_spec_model(model, latest_row, feature_cols)[0]))
1210
+ spec_payloads.append(
1211
+ {
1212
+ "spec": spec,
1213
+ "train_end": candidate_train_end,
1214
+ "feature_cols": feature_cols,
1215
+ "model": model,
1216
+ "feature_count": feature_count,
1217
+ }
1218
+ )
1219
+ pool_progress.update(candidate_idx, description=f"{symbol}: candidate models")
1220
+
1221
+ y_valid = valid_df["target"].to_numpy(dtype="int64")
1222
+ y_test = test_df["target"].to_numpy(dtype="int64")
1223
+ if symbol == "NIFTY 50":
1224
+ if len(valid_probs) != len(LOCKED_NIFTY50_WEIGHTS):
1225
+ raise RuntimeError(
1226
+ f"NIFTY 50 locked ensemble expects {len(LOCKED_NIFTY50_WEIGHTS)} models, got {len(valid_probs)}"
1227
+ )
1228
+ weights = LOCKED_NIFTY50_WEIGHTS / LOCKED_NIFTY50_WEIGHTS.sum()
1229
+ threshold = LOCKED_NIFTY50_THRESHOLD
1230
+ blended_valid = weights @ np.vstack(valid_probs)
1231
+ validation_accuracy = float(np.mean((blended_valid >= threshold).astype("int64") == y_valid))
1232
+ elif symbol == "NIFTY BANK":
1233
+ weights = np.array(
1234
+ [
1235
+ 0.0,
1236
+ 0.0,
1237
+ 0.0,
1238
+ 0.0,
1239
+ 0.0,
1240
+ 0.0,
1241
+ 0.0,
1242
+ 1.0,
1243
+ 0.0,
1244
+ 0.0,
1245
+ 0.0,
1246
+ 0.0,
1247
+ ],
1248
+ dtype="float64",
1249
+ )
1250
+ blended_valid = weights @ np.vstack(valid_probs)
1251
+ threshold = 0.441
1252
+ validation_accuracy = float(np.mean((blended_valid >= threshold).astype("int64") == y_valid))
1253
+ else:
1254
+ weights, threshold, validation_accuracy = search_blend(
1255
+ y_valid,
1256
+ valid_probs,
1257
+ progress_enabled=progress_enabled,
1258
+ progress_update_every=progress_update_every,
1259
+ progress_description=f"{symbol}: blend search",
1260
+ )
1261
+
1262
+ valid_blended = weights @ np.vstack(valid_probs)
1263
+ test_blended = weights @ np.vstack(test_probs)
1264
+ valid_raw_pred = (valid_blended >= threshold).astype("int64")
1265
+ test_raw_pred = (test_blended >= threshold).astype("int64")
1266
+ valid_pred = apply_symbol_decision_overlay(
1267
+ symbol,
1268
+ valid_df,
1269
+ valid_blended,
1270
+ threshold,
1271
+ valid_raw_pred,
1272
+ )
1273
+ test_pred = apply_symbol_decision_overlay(
1274
+ symbol,
1275
+ test_df,
1276
+ test_blended,
1277
+ threshold,
1278
+ test_raw_pred,
1279
+ )
1280
+ validation_accuracy = float(np.mean(valid_pred == y_valid))
1281
+ test_accuracy = float(np.mean(test_pred == y_test))
1282
+ baseline_accuracy = float(max(test_df["target"].mean(), 1.0 - test_df["target"].mean()))
1283
+ latest_prob = float(np.dot(weights, np.array(latest_probs, dtype="float64")))
1284
+ latest_pred = apply_symbol_decision_overlay(
1285
+ symbol,
1286
+ latest_row,
1287
+ np.array([latest_prob], dtype="float64"),
1288
+ threshold,
1289
+ np.array([int(latest_prob >= threshold)], dtype="int64"),
1290
+ )[0]
1291
+ latest_signal = "UP" if latest_pred == 1 else "DOWN"
1292
+
1293
+ result = FitResult(
1294
+ symbol=symbol,
1295
+ horizon="daily",
1296
+ horizon_bars=1,
1297
+ config={
1298
+ "name": "locked_multiwindow_nifty50_ensemble_v2" if symbol == "NIFTY 50" else "ensemble_multiwindow_daily",
1299
+ "use_intraday": symbol == "NIFTY 50" or symbol == "NIFTY BANK",
1300
+ "use_external": True,
1301
+ "use_institutional": use_engineered,
1302
+ "use_options": True,
1303
+ "use_engineered_macro_flow": use_engineered,
1304
+ "blend_mode": "locked_nifty50_multiwindow_v2" if symbol == "NIFTY 50" else ("preset_bank" if symbol == "NIFTY BANK" else "searched"),
1305
+ "decision_overlay": "bank_body_near_threshold;low_bank_vol_down;strong_bank_impulse_flip;tiny_range_up" if symbol == "NIFTY 50" else "none",
1306
+ },
1307
+ threshold=float(threshold),
1308
+ validation_accuracy=float(validation_accuracy),
1309
+ test_accuracy=float(test_accuracy),
1310
+ baseline_accuracy=float(baseline_accuracy),
1311
+ n_train=int((model_frame["date"] <= train_end).sum()),
1312
+ n_valid=int(len(valid_df)),
1313
+ n_test=int(len(test_df)),
1314
+ train_start=model_frame["date"].min().date().isoformat(),
1315
+ train_end=train_end.date().isoformat(),
1316
+ valid_start=valid_start.date().isoformat(),
1317
+ valid_end=valid_end.date().isoformat(),
1318
+ test_start=(valid_end + pd.Timedelta(days=1)).date().isoformat(),
1319
+ test_end=test_end.date().isoformat(),
1320
+ latest_forecast_date=latest_row["date"].iloc[0].date().isoformat(),
1321
+ latest_forecast_for=f"next trading bar after {latest_row['date'].iloc[0].date().isoformat()}",
1322
+ latest_forecast_prob_up=latest_prob,
1323
+ latest_forecast_signal=latest_signal,
1324
+ feature_count=int(spec_payloads[0]["feature_count"]) if spec_payloads else 0,
1325
+ validation_prob_std=float(np.std(valid_blended)),
1326
+ test_prob_std=float(np.std(test_blended)),
1327
+ test_prob_min=float(np.min(test_blended)),
1328
+ test_prob_max=float(np.max(test_blended)),
1329
+ )
1330
+
1331
+ final = {
1332
+ "weights": weights,
1333
+ "threshold": float(threshold),
1334
+ "validation_accuracy": float(validation_accuracy),
1335
+ "test_accuracy": float(test_accuracy),
1336
+ "baseline_accuracy": float(baseline_accuracy),
1337
+ "test_prob": test_blended,
1338
+ "test_raw_pred": test_raw_pred,
1339
+ "test_pred": test_pred,
1340
+ "latest_prob": latest_prob,
1341
+ "latest_signal": latest_signal,
1342
+ "test_df": test_df,
1343
+ "feature_count": result.feature_count,
1344
+ "active_models": [
1345
+ {
1346
+ "model": str(payload["spec"].name),
1347
+ "train_end": payload["train_end"].date().isoformat(),
1348
+ "weight": float(weight),
1349
+ "feature_count": int(payload["feature_count"]),
1350
+ }
1351
+ for payload, weight in zip(spec_payloads, weights)
1352
+ if float(weight) > 1e-9
1353
+ ],
1354
+ }
1355
+ return result, final, frame
1356
+
1357
+
1358
+ def format_pct(value: float) -> str:
1359
+ return "nan" if not np.isfinite(value) else f"{100.0 * float(value):.2f}%"
1360
+
1361
+
1362
+ def build_report(results: list[FitResult]) -> str:
1363
+ lines = [
1364
+ "# Daily Forecaster",
1365
+ "",
1366
+ "Target: next-day direction forecast.",
1367
+ "Coverage: NIFTY 50 and NIFTY BANK only.",
1368
+ "",
1369
+ ]
1370
+ for r in results:
1371
+ lines.extend(
1372
+ [
1373
+ f"## {r.symbol}",
1374
+ f"- config: {r.config['name']}",
1375
+ f"- validation window: {r.valid_start} to {r.valid_end}",
1376
+ f"- validation accuracy: {format_pct(r.validation_accuracy)}",
1377
+ f"- test accuracy: {format_pct(r.test_accuracy)}",
1378
+ f"- baseline accuracy: {format_pct(r.baseline_accuracy)}",
1379
+ f"- threshold: {r.threshold:.3f}",
1380
+ f"- features: {r.feature_count}",
1381
+ f"- test probability std: {r.test_prob_std:.4f}",
1382
+ f"- test probability range: {r.test_prob_min:.4f} to {r.test_prob_max:.4f}",
1383
+ f"- latest data date: {r.latest_forecast_date}",
1384
+ f"- forecast target: {r.latest_forecast_for}",
1385
+ f"- latest forecast probability up: {r.latest_forecast_prob_up:.4f}",
1386
+ f"- latest forecast signal: {r.latest_forecast_signal}",
1387
+ "",
1388
+ ]
1389
+ )
1390
+ return "\n".join(lines).rstrip() + "\n"
1391
+
1392
+
1393
+ def cleanup_legacy_outputs() -> None:
1394
+ legacy_patterns = [
1395
+ "candidate_report.csv",
1396
+ "decision_policy.json",
1397
+ "latest_available_prediction.csv",
1398
+ "nifty50_direction_model.pkl",
1399
+ "nifty50_hourly_*",
1400
+ "run_summary.json",
1401
+ "test_predictions.csv",
1402
+ "test_threshold_audit.csv",
1403
+ "threshold_report.csv",
1404
+ "forecaster_weekly_*",
1405
+ "forecaster_monthly_*",
1406
+ ]
1407
+ for pattern in legacy_patterns:
1408
+ for path in OUTPUT_DIR.glob(pattern):
1409
+ if path.is_file():
1410
+ path.unlink()
1411
+
1412
+
1413
+ def write_outputs(results: list[FitResult], finals: list[dict[str, object]], target_low: float, target_high: float) -> None:
1414
+ report_text = build_report(results)
1415
+ (OUTPUT_DIR / "forecaster_report.md").write_text(report_text, encoding="utf-8")
1416
+ (OUTPUT_DIR / "forecaster_summary.json").write_text(
1417
+ json.dumps([asdict(r) for r in results], indent=2, ensure_ascii=False),
1418
+ encoding="utf-8",
1419
+ )
1420
+
1421
+ test_rows = []
1422
+ latest_rows = []
1423
+ for r, final in zip(results, finals):
1424
+ test_df = final["test_df"]
1425
+ test_prob = np.asarray(final["test_prob"], dtype="float64")
1426
+ test_raw_pred = np.asarray(final["test_raw_pred"], dtype="int64")
1427
+ test_pred = np.asarray(final["test_pred"], dtype="int64")
1428
+ out = test_df[["date", "target_date", "target"]].copy()
1429
+ out = out.rename(columns={"date": "forecast_date"})
1430
+ out["symbol"] = r.symbol
1431
+ out["prob_up"] = test_prob
1432
+ out["raw_pred"] = test_raw_pred
1433
+ out["pred"] = test_pred
1434
+ out["decision_overlay_changed"] = test_raw_pred != test_pred
1435
+ out["threshold"] = r.threshold
1436
+ test_rows.append(out)
1437
+ latest_rows.append(
1438
+ pd.DataFrame(
1439
+ {
1440
+ "symbol": [r.symbol],
1441
+ "latest_forecast_date": [r.latest_forecast_date],
1442
+ "latest_forecast_for": [r.latest_forecast_for],
1443
+ "latest_forecast_prob_up": [r.latest_forecast_prob_up],
1444
+ "latest_forecast_signal": [r.latest_forecast_signal],
1445
+ "threshold": [r.threshold],
1446
+ "validation_accuracy": [r.validation_accuracy],
1447
+ "test_accuracy": [r.test_accuracy],
1448
+ "validation_prob_std": [r.validation_prob_std],
1449
+ "test_prob_std": [r.test_prob_std],
1450
+ "test_prob_min": [r.test_prob_min],
1451
+ "test_prob_max": [r.test_prob_max],
1452
+ "target_low": [target_low],
1453
+ "target_high": [target_high],
1454
+ }
1455
+ )
1456
+ )
1457
+
1458
+ test_output = pd.concat(test_rows, ignore_index=True)
1459
+ latest_output = pd.concat(latest_rows, ignore_index=True)
1460
+ test_output.to_csv(OUTPUT_DIR / "forecaster_test_predictions.csv", index=False)
1461
+ test_output.to_csv(OUTPUT_DIR / "forecaster_predictions.csv", index=False)
1462
+ latest_output.to_csv(OUTPUT_DIR / "forecaster_latest_forecasts.csv", index=False)
1463
+ latest_output.to_csv(OUTPUT_DIR / "forecaster_latest.csv", index=False)
1464
+ blend_details = {
1465
+ r.symbol: {
1466
+ "threshold": float(r.threshold),
1467
+ "validation_accuracy": float(r.validation_accuracy),
1468
+ "test_accuracy": float(r.test_accuracy),
1469
+ "validation_prob_std": float(r.validation_prob_std),
1470
+ "test_prob_std": float(r.test_prob_std),
1471
+ "test_prob_min": float(r.test_prob_min),
1472
+ "test_prob_max": float(r.test_prob_max),
1473
+ "active_models": final.get("active_models", []),
1474
+ }
1475
+ for r, final in zip(results, finals)
1476
+ }
1477
+ (OUTPUT_DIR / "forecaster_blend_details.json").write_text(
1478
+ json.dumps(blend_details, indent=2, ensure_ascii=False),
1479
+ encoding="utf-8",
1480
+ )
1481
+
1482
+
1483
+ def parse_args() -> argparse.Namespace:
1484
+ parser = argparse.ArgumentParser(description="Daily directional forecaster for NIFTY 50 and NIFTY BANK.")
1485
+ parser.add_argument(
1486
+ "--symbols",
1487
+ default="NIFTY 50,NIFTY BANK",
1488
+ help="Comma-separated symbols. Only NIFTY 50 and NIFTY BANK are supported.",
1489
+ )
1490
+ parser.add_argument("--train-end", default=DEFAULT_TRAIN_END.date().isoformat(), help="Train end date (YYYY-MM-DD).")
1491
+ parser.add_argument("--valid-end", default=DEFAULT_VALID_END.date().isoformat(), help="Validation end date (YYYY-MM-DD).")
1492
+ parser.add_argument("--test-end", default=DEFAULT_TEST_END.date().isoformat(), help="Test end date (YYYY-MM-DD).")
1493
+ parser.add_argument("--accuracy-low", type=float, default=0.60, help="Lower validation accuracy target band.")
1494
+ parser.add_argument("--accuracy-high", type=float, default=0.605, help="Upper validation accuracy target band.")
1495
+ parser.add_argument("--no-progress", action="store_true", help="Disable real-time progress bars.")
1496
+ parser.add_argument(
1497
+ "--progress-update-every",
1498
+ type=float,
1499
+ default=0.2,
1500
+ help="Minimum seconds between progress bar refreshes.",
1501
+ )
1502
+ return parser.parse_args()
1503
+
1504
+
1505
+ def main() -> None:
1506
+ args = parse_args()
1507
+ train_end = pd.Timestamp(args.train_end)
1508
+ valid_end = pd.Timestamp(args.valid_end)
1509
+ test_end = pd.Timestamp(args.test_end)
1510
+ symbols = [s.strip() for s in args.symbols.split(",") if s.strip()]
1511
+ if not symbols:
1512
+ raise ValueError("At least one symbol is required.")
1513
+ unsupported = [s for s in symbols if s not in SUPPORTED_SYMBOLS]
1514
+ if unsupported:
1515
+ raise ValueError(f"Unsupported symbols: {unsupported}. Only {list(SUPPORTED_SYMBOLS)} are supported.")
1516
+ if not (train_end < valid_end < test_end):
1517
+ raise ValueError("Require train-end < valid-end < test-end.")
1518
+ if not (0.0 < args.accuracy_low < args.accuracy_high < 1.0):
1519
+ raise ValueError("Require 0 < accuracy-low < accuracy-high < 1.")
1520
+
1521
+ cleanup_legacy_outputs()
1522
+
1523
+ progress_enabled = not args.no_progress
1524
+ progress_update_every = max(0.0, float(args.progress_update_every))
1525
+
1526
+ results: list[FitResult] = []
1527
+ finals: list[dict[str, object]] = []
1528
+ for symbol_idx, symbol in enumerate(symbols, start=1):
1529
+ progress_note(f"starting {symbol} ({symbol_idx}/{len(symbols)})", enabled=progress_enabled)
1530
+ result, final, _ = evaluate_ensemble(
1531
+ symbol,
1532
+ train_end,
1533
+ valid_end,
1534
+ test_end,
1535
+ progress_enabled=progress_enabled,
1536
+ progress_update_every=progress_update_every,
1537
+ )
1538
+ results.append(result)
1539
+ finals.append(final)
1540
+ progress_note(f"finished {symbol} ({symbol_idx}/{len(symbols)})", enabled=progress_enabled)
1541
+
1542
+ write_outputs(results, finals, args.accuracy_low, args.accuracy_high)
1543
+ print(build_report(results), end="")
1544
+ for r in results:
1545
+ print(f"{r.symbol}: latest {r.latest_forecast_signal} @ {r.latest_forecast_prob_up:.4f}, test acc {r.test_accuracy:.4f}")
1546
+
1547
+
1548
+ if __name__ == "__main__":
1549
+ main()
runtime.py CHANGED
@@ -51,7 +51,7 @@ FORECASTING_PROJECT_ROOT = Path(
51
  str(BACKEND_ROOT.parent.parent / "forecasting project"),
52
  )
53
  )
54
- DAILY_FORECASTER_OUTPUT_DIR = FORECASTING_PROJECT_ROOT / "Code" / "models" / "nifty_forecaster" / "outputs"
55
  DAILY_FORECASTER_SUMMARY_PATH = DAILY_FORECASTER_OUTPUT_DIR / "forecaster_summary.json"
56
  DAILY_FORECASTER_LATEST_PATH = DAILY_FORECASTER_OUTPUT_DIR / "forecaster_latest.csv"
57
  DAILY_FORECASTER_PREDICTIONS_PATH = DAILY_FORECASTER_OUTPUT_DIR / "forecaster_test_predictions.csv"
 
51
  str(BACKEND_ROOT.parent.parent / "forecasting project"),
52
  )
53
  )
54
+ DAILY_FORECASTER_OUTPUT_DIR = MODEL_DIR / "nifty_forecaster" / "outputs"
55
  DAILY_FORECASTER_SUMMARY_PATH = DAILY_FORECASTER_OUTPUT_DIR / "forecaster_summary.json"
56
  DAILY_FORECASTER_LATEST_PATH = DAILY_FORECASTER_OUTPUT_DIR / "forecaster_latest.csv"
57
  DAILY_FORECASTER_PREDICTIONS_PATH = DAILY_FORECASTER_OUTPUT_DIR / "forecaster_test_predictions.csv"