From 2c0ca53bd67268062bac51acf4374147e08168f1 Mon Sep 17 00:00:00 2001 From: Yuxuan Yan Date: Thu, 11 Jun 2026 21:46:41 +0800 Subject: [PATCH] Document cost bps as one-way per-trade, not round-trip The simulator charges (cost_bps + slippage_bps) on each fill, so a full round trip is charged twice. Correct the cost-model doc, the reversal_5d report, and the report generator to state the rate is one-way per-trade (~20 bps round trip for 5+5), rather than mislabeling it round-trip. Co-Authored-By: Claude Opus 4.7 --- docs/portfolio_trading_cost_model.md | 7 +++++++ docs/reversal_5d_all_universe_pipeline_report.md | 5 +++-- scripts/generate_reversal_5d_report.py | 5 +++-- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/docs/portfolio_trading_cost_model.md b/docs/portfolio_trading_cost_model.md index 51dbca2..f5b0150 100644 --- a/docs/portfolio_trading_cost_model.md +++ b/docs/portfolio_trading_cost_model.md @@ -41,6 +41,13 @@ execution_price_i = open_price_i rates are added linearly. The CLI options `--cost-bps` and `--slippage-bps` both default to `0.0`. +Both rates are **one-way, per-trade**: the combined `(cost_bps + slippage_bps)` +is charged on the traded notional of *each* fill, buy and sell alike. A full +round trip (enter then exit a position) is therefore charged twice — e.g. +`5 + 5` bps becomes ~20 bps over a complete round trip, not 10. Quote any +round-trip figure by doubling, or convert a round-trip budget to a per-trade +rate by halving before passing it in. + Example: ```text diff --git a/docs/reversal_5d_all_universe_pipeline_report.md b/docs/reversal_5d_all_universe_pipeline_report.md index bcf7aa1..10b54f1 100644 --- a/docs/reversal_5d_all_universe_pipeline_report.md +++ b/docs/reversal_5d_all_universe_pipeline_report.md @@ -30,8 +30,9 @@ costless research cumulative return at Sharpe 54.31% daily hit rate. The binding constraint is **cost, not signal**: at ~148×/year -turnover, a 10 bps round-trip (5 bps commission + 5 bps slippage) erases the -edge — every variant is negative after costs. A tradable 5-day reversal needs +turnover, a 10 bps one-way per-trade cost (5 bps commission + 5 bps slippage, +charged on each leg — so ~20 bps per round trip) erases the edge — every variant +is negative after costs. A tradable 5-day reversal needs turnover control, not a different signal. ## Headline Metrics diff --git a/scripts/generate_reversal_5d_report.py b/scripts/generate_reversal_5d_report.py index a21f28c..619ceae 100644 --- a/scripts/generate_reversal_5d_report.py +++ b/scripts/generate_reversal_5d_report.py @@ -630,8 +630,9 @@ costless research cumulative return at Sharpe {_pct(results['rank_liquid']['alpha_metrics']['hit_rate']) if rliq else 'n/a'} daily hit rate. The binding constraint is **cost, not signal**: at ~{results['rank_liquid']['alpha_metrics']['turnover_annual']:.0f}×/year -turnover, a 10 bps round-trip (5 bps commission + 5 bps slippage) erases the -edge — every variant is negative after costs. A tradable 5-day reversal needs +turnover, a 10 bps one-way per-trade cost (5 bps commission + 5 bps slippage, +charged on each leg — so ~20 bps per round trip) erases the edge — every variant +is negative after costs. A tradable 5-day reversal needs turnover control, not a different signal. ## Headline Metrics