|
4 | 4 | from quant_platform_kit.common.models import OrderIntent |
5 | 5 |
|
6 | 6 |
|
| 7 | +def _weight_allocation(targets, *, risk_symbols=(), income_symbols=(), safe_haven_symbols=()): |
| 8 | + ordered_symbols = tuple(targets.keys()) |
| 9 | + return { |
| 10 | + "target_mode": "weight", |
| 11 | + "strategy_symbols": ordered_symbols, |
| 12 | + "risk_symbols": tuple(risk_symbols), |
| 13 | + "income_symbols": tuple(income_symbols), |
| 14 | + "safe_haven_symbols": tuple(safe_haven_symbols), |
| 15 | + "targets": dict(targets), |
| 16 | + } |
| 17 | + |
| 18 | + |
| 19 | +def _signal_metadata( |
| 20 | + targets, |
| 21 | + *, |
| 22 | + risk_symbols=(), |
| 23 | + income_symbols=(), |
| 24 | + safe_haven_symbols=(), |
| 25 | + **extra, |
| 26 | +): |
| 27 | + payload = dict(extra) |
| 28 | + payload["allocation"] = _weight_allocation( |
| 29 | + targets, |
| 30 | + risk_symbols=risk_symbols, |
| 31 | + income_symbols=income_symbols, |
| 32 | + safe_haven_symbols=safe_haven_symbols, |
| 33 | + ) |
| 34 | + return payload |
| 35 | + |
| 36 | + |
7 | 37 | def translate(key, **kwargs): |
8 | 38 | templates = { |
9 | 39 | "submitted": "submitted {order_id}", |
@@ -66,14 +96,17 @@ def fake_fetch_quote_snapshots(_ib, symbols): |
66 | 96 | translator=translate, |
67 | 97 | strategy_symbols=["VOO", "BIL"], |
68 | 98 | strategy_profile="tech_pullback_cash_buffer", |
69 | | - signal_metadata={ |
70 | | - "regime": "risk_on", |
71 | | - "breadth_ratio": 0.6, |
72 | | - "target_stock_weight": 0.8, |
73 | | - "realized_stock_weight": 0.8, |
74 | | - "trade_date": "2026-04-01", |
75 | | - "snapshot_as_of": "2026-03-31", |
76 | | - }, |
| 99 | + signal_metadata=_signal_metadata( |
| 100 | + {"VOO": 1.0}, |
| 101 | + risk_symbols=("VOO",), |
| 102 | + safe_haven_symbols=("BIL",), |
| 103 | + regime="risk_on", |
| 104 | + breadth_ratio=0.6, |
| 105 | + target_stock_weight=0.8, |
| 106 | + realized_stock_weight=0.8, |
| 107 | + trade_date="2026-04-01", |
| 108 | + snapshot_as_of="2026-03-31", |
| 109 | + ), |
77 | 110 | dry_run_only=False, |
78 | 111 | cash_reserve_ratio=0.03, |
79 | 112 | rebalance_threshold_ratio=0.02, |
@@ -113,7 +146,7 @@ def accountValues(self): |
113 | 146 | translator=translate, |
114 | 147 | strategy_symbols=["VOO"], |
115 | 148 | strategy_profile="tech_pullback_cash_buffer", |
116 | | - signal_metadata={}, |
| 149 | + signal_metadata=_signal_metadata({"VOO": 1.0}, risk_symbols=("VOO",)), |
117 | 150 | dry_run_only=False, |
118 | 151 | cash_reserve_ratio=0.03, |
119 | 152 | rebalance_threshold_ratio=0.02, |
@@ -150,14 +183,17 @@ def fake_fetch_quote_snapshots(_ib, symbols): |
150 | 183 | account_group="default", |
151 | 184 | service_name="ibkr-paper", |
152 | 185 | account_ids=("DU123",), |
153 | | - signal_metadata={ |
154 | | - "regime": "risk_on", |
155 | | - "breadth_ratio": 0.6, |
156 | | - "target_stock_weight": 0.8, |
157 | | - "realized_stock_weight": 0.8, |
158 | | - "trade_date": "2026-04-01", |
159 | | - "snapshot_as_of": "2026-03-31", |
160 | | - }, |
| 186 | + signal_metadata=_signal_metadata( |
| 187 | + {"VOO": 0.8, "BOXX": 0.2}, |
| 188 | + risk_symbols=("VOO",), |
| 189 | + safe_haven_symbols=("BOXX",), |
| 190 | + regime="risk_on", |
| 191 | + breadth_ratio=0.6, |
| 192 | + target_stock_weight=0.8, |
| 193 | + realized_stock_weight=0.8, |
| 194 | + trade_date="2026-04-01", |
| 195 | + snapshot_as_of="2026-03-31", |
| 196 | + ), |
161 | 197 | cash_reserve_ratio=0.0, |
162 | 198 | rebalance_threshold_ratio=0.02, |
163 | 199 | limit_buy_premium=1.005, |
@@ -225,7 +261,7 @@ def accountValues(self): |
225 | 261 | account_group="default", |
226 | 262 | service_name="ibkr-paper", |
227 | 263 | account_ids=("DU123",), |
228 | | - signal_metadata={"trade_date": "2026-04-01"}, |
| 264 | + signal_metadata=_signal_metadata({"VOO": 1.0}, risk_symbols=("VOO",), trade_date="2026-04-01"), |
229 | 265 | dry_run_only=False, |
230 | 266 | cash_reserve_ratio=0.0, |
231 | 267 | rebalance_threshold_ratio=0.02, |
@@ -266,16 +302,19 @@ def fake_fetch_quote_snapshots(_ib, symbols): |
266 | 302 | account_group="default", |
267 | 303 | service_name="ibkr-paper", |
268 | 304 | account_ids=("DU123",), |
269 | | - signal_metadata={ |
270 | | - "regime": "risk_on", |
271 | | - "breadth_ratio": 0.6, |
272 | | - "target_stock_weight": 0.8, |
273 | | - "realized_stock_weight": 0.8, |
274 | | - "safe_haven_weight": 0.2, |
275 | | - "safe_haven_symbol": "BOXX", |
276 | | - "trade_date": "2026-04-01", |
277 | | - "snapshot_as_of": "2026-03-31", |
278 | | - }, |
| 305 | + signal_metadata=_signal_metadata( |
| 306 | + {"VOO": 0.8, "BOXX": 0.2}, |
| 307 | + risk_symbols=("VOO",), |
| 308 | + safe_haven_symbols=("BOXX",), |
| 309 | + regime="risk_on", |
| 310 | + breadth_ratio=0.6, |
| 311 | + target_stock_weight=0.8, |
| 312 | + realized_stock_weight=0.8, |
| 313 | + safe_haven_weight=0.2, |
| 314 | + safe_haven_symbol="BOXX", |
| 315 | + trade_date="2026-04-01", |
| 316 | + snapshot_as_of="2026-03-31", |
| 317 | + ), |
279 | 318 | dry_run_only=True, |
280 | 319 | cash_reserve_ratio=0.0, |
281 | 320 | rebalance_threshold_ratio=0.02, |
@@ -315,7 +354,12 @@ def accountValues(self): |
315 | 354 | translator=translate, |
316 | 355 | strategy_symbols=["VOO"], |
317 | 356 | strategy_profile="tech_pullback_cash_buffer", |
318 | | - signal_metadata={"trade_date": "2026-04-01", "snapshot_as_of": "2026-03-31"}, |
| 357 | + signal_metadata=_signal_metadata( |
| 358 | + {"VOO": 1.0}, |
| 359 | + risk_symbols=("VOO",), |
| 360 | + trade_date="2026-04-01", |
| 361 | + snapshot_as_of="2026-03-31", |
| 362 | + ), |
319 | 363 | dry_run_only=True, |
320 | 364 | cash_reserve_ratio=0.0, |
321 | 365 | rebalance_threshold_ratio=0.02, |
@@ -352,7 +396,12 @@ def accountValues(self): |
352 | 396 | translator=translate, |
353 | 397 | strategy_symbols=["VOO"], |
354 | 398 | strategy_profile="tech_pullback_cash_buffer", |
355 | | - signal_metadata={"trade_date": "2026-04-01", "snapshot_as_of": "2026-03-31"}, |
| 399 | + signal_metadata=_signal_metadata( |
| 400 | + {"VOO": 1.0}, |
| 401 | + risk_symbols=("VOO",), |
| 402 | + trade_date="2026-04-01", |
| 403 | + snapshot_as_of="2026-03-31", |
| 404 | + ), |
356 | 405 | dry_run_only=True, |
357 | 406 | cash_reserve_ratio=0.0, |
358 | 407 | rebalance_threshold_ratio=0.02, |
@@ -389,11 +438,14 @@ def accountValues(self): |
389 | 438 | translator=translate, |
390 | 439 | strategy_symbols=["VOO", "BOXX"], |
391 | 440 | strategy_profile="tech_pullback_cash_buffer", |
392 | | - signal_metadata={ |
393 | | - "trade_date": "2026-04-01", |
394 | | - "snapshot_as_of": "2026-03-31", |
395 | | - "dry_run_price_fallbacks": {"VOO": 100.0, "BOXX": 100.0}, |
396 | | - }, |
| 441 | + signal_metadata=_signal_metadata( |
| 442 | + {"VOO": 0.6, "BOXX": 0.4}, |
| 443 | + risk_symbols=("VOO",), |
| 444 | + safe_haven_symbols=("BOXX",), |
| 445 | + trade_date="2026-04-01", |
| 446 | + snapshot_as_of="2026-03-31", |
| 447 | + dry_run_price_fallbacks={"VOO": 100.0, "BOXX": 100.0}, |
| 448 | + ), |
397 | 449 | dry_run_only=True, |
398 | 450 | cash_reserve_ratio=0.0, |
399 | 451 | rebalance_threshold_ratio=0.02, |
|
0 commit comments