Files
ibkr-quant/config.toml
Gahow Wang 8238651af6 Let the strategy own the whole account; drop the unmanaged list
Every position is the strategy's: names it does not select, including ones
outside the index such as AAOI, are sold at the next rebalance, and sizing
uses the full NAV less the cash buffer. A position that is not a USD stock
cannot be traded as a SMART/USD order, so rebalance refuses to run while
one exists.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 05:28:49 -07: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