suspiciously high OOS sharpe on an RL pairs strategy, tried to kill it and couldn't. roast my setup.
been building an RL agent that trades a cointegrated pair. walk forward, 14 out of sample folds, average OOS sharpe came out to 3.45. that's high enough that my default assumption is i broke something, so before i get excited i want people who've done this to tell me what i'm missing.
setup:
- PPO agent, three actions: long the spread, short the spread, flat
- trained on the in-sample window of each fold, scored only on the held-out window right after it
- 14 folds, non-overlapping, roughly 8 years of daily data
- entry and exit are the agent's call, not a fixed z-score band
- costs modeled at 5 bps per side including slippage
- fixed position sizing
- around 40 trades per fold, so it isn't one lucky trade carrying the whole thing
stuff i've already checked: features only use data up to time t, no future info in the state, folds don't overlap so nothing leaks across them, and costs aren't zero. still holds up.
what i keep coming back to:
- maybe 3.45 is just what a clean cointegrated pair gives you right until the relationship breaks, and it dies the moment the spread decoheres
- maybe i'm overfitting the pair selection itself across folds
- maybe the reward is quietly leaking something i haven't spotted
code's on my profile if you want to tear it apart. genuinely trying to find the flaw, not flex a number. where would you look first?