Files
ibkr-quant/config.toml
Gahow Wang d945624601 Switch to overnight_recovery_top10, rebalanced every 10 sessions
Under quant-trading's PIT research engine (S&P 500 members 2006-2026,
10 bp), overnight_recovery_top10 filled at the next close beat the
daily UpCap+MomGap by 10.5%/yr (paired Newey-West t 2.44) at 3x instead
of 29x yearly turnover. UpCap+MomGap was a CN champion there, and its
daily variant was never picked for the US book.

- strategy: overnight-return momentum (12m skip 1m) + distance from the
  126-day low, ported from strategies/robust_momentum.py; top 10 equal
  weight, a held name stays while ranked within 30. Scores and picks
  match RobustMomentumStrategy on the IB bars (25 rebalances, 0 diffs).
- rebalance: every 10 sessions from strategy.anchor (2026-09-29), on
  completed sessions through yesterday's close, MOC at today's close;
  other sessions do nothing and weights drift.
- backtest trades only on rebalance sessions, like the live loop.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-29 18:06:14 +08:00

31 lines
1.5 KiB
TOML

[ib]
host = "127.0.0.1"
port = 4002 # IB Gateway: paper 4002 / live 4001; TWS: paper 7497 / live 7496
client_id = 17
health_client_id = 18 # `ibkr-quant gateway` probe; differs so it never collides with a running job
account = "" # empty = the single account managed by this login
market_data_type = 3 # 1 = live (needs subscription), 3 = delayed (free, for testing)
allow_live = false # refuse to connect to non-paper accounts unless true
[data]
universe = "data/universe.csv"
bars = "data/bars/daily.csv"
bars_duration = "2 Y" # the strategy needs > 252 sessions
# overnight_recovery_top10, ported from quant-trading strategies/robust_momentum.py:
# overnight-return momentum (12m, skip 1m) + distance from the 126-day low, signal on
# sessions through yesterday's close, equal-weight top_n filled at today's close.
[strategy]
top_n = 10
rebalance_every = 10 # sessions; nothing trades in between and weights drift
buffer = 2.0 # keep a held name while ranked within top_n * (1 + buffer)
anchor = 2026-09-29 # first rebalance session; then every rebalance_every sessions
[execution]
order_type = "MOC" # MOC (submit 09:30-15:45 ET) | LMT
limit_offset_bps = 20 # LMT only: price = snapshot * (1 ± offset)
cash_buffer = 0.02 # fraction of NAV kept in cash
resize_band = 0.10 # leave a held name alone while within 10% of its target value
min_trade_value = 50.0 # skip trades below max(min_trade_value, min_trade_fraction * NAV);
min_trade_fraction = 0.001 # full exits always trade