Guest User

Untitled

a guest
Jul 6th, 2025
574
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.89 KB | None | 0 0
  1. def simulate_pair(self, pair: int = None):
  2. """Simulate using the original (vectorized) method for a given pair index or all pairs if None."""
  3. if pair is None:
  4. results = []
  5. highest_pnl = None
  6. highest_idx = None
  7. for i, (s1, s2, alpha, beta) in enumerate(self.pairs):
  8. df = self.simulate_pair(i)
  9. trades_df = self._extract_trades_from_df(df)
  10. # --- Use per-bar PnL for summary ---
  11. total_pnl = df["pnl"].sum()
  12. sharpe = df["pnl"].mean() / df["pnl"].std() * np.sqrt(252) if df["pnl"].std() > 0 else 0
  13. self.pair_results[i] = {
  14. "spread": df["spread"],
  15. "df_trades": trades_df,
  16. "s1": s1,
  17. "s2": s2,
  18. "alpha": alpha,
  19. "beta": beta,
  20. "pnl": total_pnl,
  21. "df": df,
  22. }
  23. results.append({"pair": f"{s1}-{s2}", "pnl": total_pnl, "sharpe": sharpe})
  24. if (highest_pnl is None) or (total_pnl > highest_pnl):
  25. highest_pnl = total_pnl
  26. highest_idx = i
  27. self.highest_pnl_data = self.pair_results[i]
  28. self.highest_pnl_pair_idx = i
  29. self.highest_pnl = highest_pnl
  30. self.last_mode = "regular"
  31.  
  32. # Print summary table
  33. rpt = pd.DataFrame(results).sort_values("pnl", ascending=False).reset_index(drop=True)
  34. print("\n=== Backtest Results ===")
  35. print(rpt.to_string(index=False, float_format="%.2f"))
  36. return
  37.  
  38. # --- Vectorized logic for a single pair ---
  39. s1, s2, alpha, beta = self.pairs[pair]
  40. px1 = self.prices[s1]
  41. px2 = self.prices[s2]
  42. window = deque(maxlen=60)
  43. prev_spread = None
  44. prev_sig = 0
  45. results = []
  46. for t, (p1, p2) in enumerate(zip(px1, px2)):
  47. spread = p1 - (alpha + beta * p2)
  48. window.append(spread)
  49. if len(window) < window.maxlen:
  50. results.append((px1.index[t], spread, 0, 0.0))
  51. prev_spread = spread
  52. continue
  53. mu, std = np.mean(window), np.std(window, ddof=0)
  54. z = (spread - mu) / std
  55. sig = prev_sig
  56. if z > self.entry_z:
  57. sig = -1
  58. elif z < -self.entry_z:
  59. sig = +1
  60. elif prev_sig != 0 and abs(z) <= self.exit_z:
  61. sig = 0
  62. pnl = prev_sig * (spread - prev_spread) * self.trade_size
  63. results.append((px1.index[t], spread, sig, pnl))
  64. prev_spread = spread
  65. prev_sig = sig
  66. df = pd.DataFrame(results, columns=["time","spread","signal","pnl"]).set_index("time")
  67. return df
Advertisement
Add Comment
Please, Sign In to add comment