Files
NexQuant/scripts/kronos_model_eval.py
TPTBusiness cbe1c52e00 refactor: rename project from Predix to NexQuant
Rename all source files, scripts, tests, documentation, and configuration
from Predix/predix to NexQuant/nexquant across the entire codebase.
2026-05-09 17:48:22 +02:00

78 lines
2.7 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env python
"""
Option B: Evaluate Kronos-mini as a model alongside LightGBM.
Computes IC (Information Coefficient) and hit rate for Kronos predictions
vs actual realized returns. Results are printed for comparison with LightGBM.
Usage:
conda activate nexquant
python scripts/kronos_model_eval.py
python scripts/kronos_model_eval.py --pred 30 --context 512 --device cuda
"""
import argparse
import json
from pathlib import Path
from dotenv import load_dotenv
load_dotenv(Path(__file__).parent.parent / ".env")
import torch
DATA_PATH = Path("git_ignore_folder/factor_implementation_source_data/intraday_pv.h5")
OUTPUT_DIR = Path("results/kronos")
def main():
parser = argparse.ArgumentParser(description="Evaluate Kronos as model (alongside LightGBM)")
parser.add_argument("--context", type=int, default=512, help="Context window in bars")
parser.add_argument("--pred", type=int, default=30, help="Prediction horizon in bars")
parser.add_argument("--stride", type=int, default=None, help="Stride between evaluations (default: pred)")
parser.add_argument("--device", type=str, default="cuda" if torch.cuda.is_available() else "cpu")
args = parser.parse_args()
stride = args.stride or args.pred
print(f"Kronos Model Evaluator (alongside LightGBM)")
print(f" Context: {args.context} bars | Pred: {args.pred} bars | Device: {args.device}")
print()
if not DATA_PATH.exists():
print(f"ERROR: Data not found at {DATA_PATH}")
raise SystemExit(1)
from rdagent.components.coder.kronos_adapter import evaluate_kronos_model
print("Running evaluation (this may take several minutes)...")
metrics = evaluate_kronos_model(
hdf5_path=DATA_PATH,
context_bars=args.context,
pred_bars=args.pred,
stride_bars=stride,
device=args.device,
)
print("\n" + "=" * 50)
print("Kronos-mini Model Evaluation Results")
print("=" * 50)
print(f" Predictions: {metrics['n_predictions']}")
print(f" IC (mean): {metrics['IC_mean']:.4f}")
print(f" IC (std): {metrics['IC_std']:.4f}")
print(f" IC IR: {metrics['IC_IR']:.4f} (>0.5 = good)")
print(f" Hit Rate: {metrics['hit_rate']:.2%} (>50% = directionally useful)")
print("=" * 50)
print()
print("Reference: LightGBM baseline IC typically 0.010.05 on 1-min EUR/USD")
OUTPUT_DIR.mkdir(parents=True, exist_ok=True)
out = OUTPUT_DIR / f"kronos_eval_ctx{args.context}_pred{args.pred}.json"
with open(out, "w") as f:
json.dump({**metrics, "context_bars": args.context, "pred_bars": args.pred}, f, indent=2)
print(f"\nResults saved to: {out}")
if __name__ == "__main__":
main()