|
17 | 17 | ``` |
18 | 18 | """ |
19 | 19 |
|
20 | | -import pandas as pd |
21 | | -from quanttradeai.utils.metrics import sharpe_ratio, max_drawdown |
22 | | -from quanttradeai.trading.risk import apply_stop_loss_take_profit |
23 | | -from quanttradeai.trading.portfolio import PortfolioManager |
| 20 | +import pandas as pd |
| 21 | +from quanttradeai.utils.metrics import sharpe_ratio, max_drawdown |
| 22 | +from quanttradeai.trading.risk import apply_stop_loss_take_profit |
| 23 | +from quanttradeai.trading.portfolio import PortfolioManager |
| 24 | +from quanttradeai.trading.drawdown_guard import DrawdownGuard |
24 | 25 |
|
25 | 26 |
|
26 | 27 | def _simulate_single( |
@@ -190,13 +191,14 @@ def _simulate_single( |
190 | 191 |
|
191 | 192 | def simulate_trades( |
192 | 193 | df: pd.DataFrame | dict[str, pd.DataFrame], |
193 | | - stop_loss_pct: float | None = None, |
194 | | - take_profit_pct: float | None = None, |
195 | | - transaction_cost: float = 0.0, |
196 | | - slippage: float = 0.0, |
197 | | - execution: dict | None = None, |
198 | | - portfolio: PortfolioManager | None = None, |
199 | | -) -> pd.DataFrame | dict[str, pd.DataFrame]: |
| 194 | + stop_loss_pct: float | None = None, |
| 195 | + take_profit_pct: float | None = None, |
| 196 | + transaction_cost: float = 0.0, |
| 197 | + slippage: float = 0.0, |
| 198 | + execution: dict | None = None, |
| 199 | + portfolio: PortfolioManager | None = None, |
| 200 | + drawdown_guard: DrawdownGuard | None = None, |
| 201 | +) -> pd.DataFrame | dict[str, pd.DataFrame]: |
200 | 202 | """Simulate trades using label signals. |
201 | 203 |
|
202 | 204 | Parameters |
@@ -270,14 +272,23 @@ def simulate_trades( |
270 | 272 | results["portfolio"] = pd.DataFrame( |
271 | 273 | {"strategy_return": combined, "equity_curve": portfolio_curve} |
272 | 274 | ) |
273 | | - return results |
274 | | - else: |
275 | | - return _simulate_single( |
276 | | - df, |
277 | | - stop_loss_pct=stop_loss_pct, |
278 | | - take_profit_pct=take_profit_pct, |
279 | | - execution=exec_cfg, |
280 | | - ) |
| 275 | + if drawdown_guard is not None: |
| 276 | + curve = results["portfolio"]["equity_curve"] |
| 277 | + for t, v in zip(curve.index, curve): |
| 278 | + drawdown_guard.update_portfolio_value(float(v), t) |
| 279 | + return results |
| 280 | + else: |
| 281 | + res = _simulate_single( |
| 282 | + df, |
| 283 | + stop_loss_pct=stop_loss_pct, |
| 284 | + take_profit_pct=take_profit_pct, |
| 285 | + execution=exec_cfg, |
| 286 | + ) |
| 287 | + if drawdown_guard is not None: |
| 288 | + curve = res["equity_curve"] |
| 289 | + for t, v in zip(curve.index, curve): |
| 290 | + drawdown_guard.update_portfolio_value(float(v), t) |
| 291 | + return res |
281 | 292 |
|
282 | 293 |
|
283 | 294 | def compute_metrics(data: pd.DataFrame, risk_free_rate: float = 0.0) -> dict: |
|
0 commit comments