"""Random forest on synthetic data. No alpha claim; chronological split with purged labels."""
from pathlib import Path
import json
import numpy as np
import pandas as pd
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, precision_score, recall_score, roc_auc_score

def prepare():
    df=pd.read_csv(Path(__file__).resolve().parent/"ohlcv-synthetic.csv")
    df["t"]=np.arange(len(df))
    df["r1"]=df.close.pct_change(fill_method=None)
    df["momentum3"]=df.close.pct_change(3,fill_method=None)
    df["vol5"]=df.r1.rolling(5,min_periods=5).std()
    df["label_end"]=df.t+5
    future=df.close.shift(-5)/df.close-1
    df["y"]=np.where(future.notna(),(future>0).astype(float),np.nan)
    df=df.dropna(subset=["r1","momentum3","vol5","y"])
    split=168
    train=df[df.label_end<split].copy();test=df[df.t>=split].copy()
    assert train.label_end.max()<test.t.min()
    return train,test,["r1","momentum3","vol5"]

if __name__=="__main__":
    train,test,cols=prepare()
    model=RandomForestClassifier(n_estimators=40,max_depth=3,min_samples_leaf=8,random_state=20261016,n_jobs=1)
    model.fit(train[cols],train.y)
    predicted=model.predict(test[cols]); prob=model.predict_proba(test[cols])[:,list(model.classes_).index(1.)]
    baseline=int(train.y.mean()>=0.5)
    metrics={"data_kind":"synthetic, not trading profit","train_n":len(train),"test_n":len(test),
             "last_train_label_end":int(train.label_end.max()),"first_test_t":int(test.t.min()),
             "accuracy":accuracy_score(test.y,predicted),"precision":precision_score(test.y,predicted,zero_division=0),
             "recall":recall_score(test.y,predicted,zero_division=0),
             "auc":roc_auc_score(test.y,prob) if test.y.nunique()==2 else None,
             "majority_baseline_accuracy":accuracy_score(test.y,np.full(len(test),baseline)),
             "limitations":["synthetic data","single asset","no transaction cost P&L","no production model"]}
    out=Path("ml-results");out.mkdir(exist_ok=True)
    (out/"metrics.json").write_text(json.dumps(metrics,indent=2),encoding="utf-8")
    print(json.dumps(metrics))
