chore: backtest engine fee model, metrics, and strategy fixes

- main.py: add IBKR-style tiered fee schedule (fee_base + fee_per_share),
  PIT universe support, and open-to-close execution improvements
- metrics.py: add raw_summary helper for JSON-safe metric export
- Misc strategy fixes: deprecation warnings, NaN handling

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-21 20:57:56 +08:00
parent 1f50253d13
commit 149a00c458
7 changed files with 154 additions and 74 deletions

View File

@@ -52,6 +52,21 @@ def win_rate(returns: pd.Series) -> float:
return (active > 0).sum() / len(active)
def raw_summary(equity: pd.Series) -> dict:
"""Return numeric metrics suitable for JSON serialization."""
returns = equity.pct_change().dropna()
return {
"totalReturn": float(total_return(equity)),
"annualizedReturn": float(annualized_return(equity)),
"annualizedVolatility": float(annualized_volatility(returns)),
"sharpeRatio": float(sharpe_ratio(returns)),
"sortinoRatio": float(sortino_ratio(returns)),
"maxDrawdown": float(max_drawdown(equity)),
"calmarRatio": float(calmar_ratio(equity)),
"winRate": float(win_rate(returns)),
}
def summary(equity: pd.Series, name: str = "Strategy") -> dict:
returns = equity.pct_change().dropna()
metrics = {