ASX Trading Platform — Review (2026-06-22)
What it is
Buy-and-hold ASX dividend portfolio automation (200K target). Signal engine with IBKR integration. Control surface at trading.paralla.org. Research-heavy, design-complete, implementation-stalled.
Current state (Phases 1–8 roadmap)
- Phase 1 ✅ DONE — ASX universe extraction, fee drag sensitivity, dividend reinvestment study (+485pp DRIP edge over BH), quarterly rebalancing optimal for $2K portfolio
- Phase 3 ✅ DONE —
fee_gate.pywith 24 tests (IBKR AU flat $13.40 round-trip, cost vs expected gain gating, frequency tiers by capital bracket) - Phase 4 ✅ DONE — Risk framework spec + implementation: position_sizer.py (T1/T2/T3 tiers), drawdown_protection.py (no stop-losses, cooling periods at 15%/25%/40% DD), concentration_guard.py (HHI, sector limits), stress_test.py (historical scenarios + Monte Carlo)
- Phase 2 ❌ BLOCKED —
ibkr-credsblocker. Paper-trading validation stalled. Cannot proceed to live/paper IBKR connection without credentials. - Signal Engine V2 📋 DESIGN ONLY — Architecture doc (
signal-engine-v2-design.md) complete: FactorEngine (dividend yield screen + BH), FeeGate integration, DividendLayer for DRIP compounding, MockData pipeline spec. No code written. - Monte Carlo ✅ DONE — Run at 10K, 15yr horizon. Results: median final 17,843. P(rich) = 0.0% in both cases. Worst DD across all paths: 92.7%.
Gaps / Risks
- No end-to-end execution path exists. All modules are isolated scripts/tests.
runner.pyimportssignal_enginebut signal engine code doesn’t exist yet (only design). - Phase 8 plan is vague. Original scope mentioned Phases 1–8 but only 1, 3, 4, and partial 5 have deliverables. Phase 2 is dead without creds. Phase 6+ are undocumented.
- Paper-trading is theoretical.
SimulatedOrderBookin runner.py is standalone; the real IBKR bridge (IBKRExecutionBridge) is untested since ibkr-creds blocked. - No control surface UI.
trading.paralla.orghas no frontend built yet. Phase 3 was backend-only by design, but no subsequent phase planned for UI. - Monte Carlo results are sobering. 0% probability of reaching $200K target at any starting capital in 15yr horizon with BH+DRIP strategy. This is a fundamental question for the project: does the return target need changing, or is there a different strategy? The project doesn’t address this.
- Data quality gap. yfinance covers only ~69% of ASX small-caps. No paid data source procured.
- Dependencies not managed in pyproject.toml. Packages (pandas, yfinance, ib_insync) installed via ad-hoc pip calls. Pod restart wipes them. There’s a fix_deps.py script but it’s reactive, not declarative.
Recommended approach
- Resolve the blocker first. Get IBKR paper-trading credentials sorted before writing more code. Otherwise Phase 2 stays dead and downstream phases are untestable.
- Build signal engine V2 code from the design doc. The architecture is solid — just needs implementation. This is ~5-8 hours of focused work.
- Wire runner.py to actually execute a cycle. End-to-end test: data fetch → factor screen → fee gate → risk gate → simulated fill → P&L report. Do this in sim-only mode (no IBKR needed).
- Confront the return target. The MC results show BH+DRIP from 200K in 15 years without leverage or higher-risk factors. Decide: accept lower target, add momentum/growth factor, or accept longer horizon.
- Define Phases 6–8 explicitly. Don’t leave the roadmap dangling.
Phased plan (recommended)
| Phase | Work | Owner | Est. | Depends on |
|---|---|---|---|---|
| P1-2 | Resolve ibkr-creds blocker | apollo/mercury | 0.5d | pvs action |
| P3 | Implement signal_engine.py from design | apollo | 1d | None |
| P4 | Build mock_data.py (mock pipeline) | apollo | 0.5d | P3 |
| P5 | Wire runner.py end-to-end (sim mode) + smoke test | apollo | 1d | P3, P4 |
| P6 | Address return target: revise strategy or accept longer horizon | metis (design) | 0.5d | MC results |
| P7 | Declarative deps in pyproject.toml, CI lint | mercury | 0.25d | None |
| P8 | Phase 6–8 spec (UI/automation/live go) — design doc only for now | metis | 0.5d | All above |