Skip to content

View original

AhDualListingDislocationHarvest

Hypotheses

A-H Dual-Listing Dislocation Harvest: Buy the Cheaper Listing of the SAME Company Across HKEQ and CNEQ (10 verified A/H twin pairs, daily bars, z-score of log(A/H) vs its own 120-session norm, single-leg long, 3-parameter)

Hypotheses

A CROSS-VENUE, CROSS-MARKET RELATIVE-VALUE strategy on 10 Chinese companies that are simultaneously listed as an A-share on the mainland (CNEQ, closes 07:00 UTC) and an H-share in Hong Kong (HKEQ, closes 08:00 UTC). The two lines are claims on IDENTICAL corporate cash flows, but capital controls and Stock-Connect quotas keep the two investor bases segmented, so the price ratio drifts far from its own norm and then re-converges. Because BOTH venues are CASH accounts (no shorting, no leverage), the strategy does NOT run a two-leg spread: it holds exactly ONE leg — the listing that is currently cheap relative to its twin — and uses the other leg purely as a SIGNAL SOURCE. One fee-paying leg, one round trip, no borrow. Universe (primary first, then extras; each HK ticker is paired with its mainland twin): 2318.HKEQ/601318.CNEQ (Ping An), 1398/601398 (ICBC), 2628/601628 (China Life), 6030/600030 (CITIC Securities), 3968/600036 (China Merchants Bank), 0857/601857 (PetroChina), 0386/600028 (Sinopec), 1088/601088 (China Shenhua), 2601/601601 (China Pacific Insurance), 0998/601998 (CITIC Bank). All 20 instruments were VERIFIED present in the catalog with 1-DAY bars from 2018-01-02 to 2026 (~2,100 sessions each, ~8.7 years). This is the first hypothesis ever proposed on HKEQ (0 of 3,068 experiments) and the second on CNEQ (1 of 3,068) — the two emptiest usable venues in the entire data estate, both with working session calendars (XHKG, XSHG) and real statutory cost models in venue_configs.py.

Hypotheses

Iteration 2 addresses the single issue named in the feedback: the optimizer selected a non-trading corner of the search space (entry_z pinned at 3.9964 on its 4.0 upper bound, giving 21 entries in 8.7 years and zero inside any 377-day validation window, hence OOS Sharpe literally 0.0 and a 3-trade holdout). The signal logic, pairs universe, position_frac, alignment and every other parameter are untouched — the base config already produced 507 trades, 15/20 legs profitable, avg_trade_return_pct 1.258% (~4x the HKEQ round trip), DD 10.3%, 8/9 positive years. The only edits are the three _param_bounds narrowings requested, mirrored exactly in the code's clamps so the optimizer never tests a value the code silently rewrites: entry_z [0.5,4.0] -> [1.0,2.5], lookback_days [40,300] -> [120,260] (removes the only sensitivity cliff: 0.245 at 96 / 0.271 at 108 vs 0.644-0.721 at 120-144), exit_z [0.0,1.2] -> [0.15,0.75] (drops the degenerate exit_z=0.0). No other change.

Implementation

A/H dual-listing dislocation harvest across 10 verified twin pairs (H-share on HKEQ, A-share on CNEQ). For each pair it tracks r = log(H/A) against that pair's own trailing 120-session norm; when r sits entry_z sigma below the norm the H line is the cheap claim on identical cash flows and the H leg is bought, entry_z above and the A leg is bought. Exactly ONE long leg per pair (both venues are CASH, long-only, no leverage) — the twin is a pure signal source, so there is one fee-paying round trip per dislocation. Exits when the ratio reconverges inside exit_z, on a 90-session time stop, or on a 20% leg stop; a 1-session minimum hold respects CNEQ T+1. Point-in-time discipline: the ratio series is stamped at each 08:00 UTC HK close using the 07:00 UTC CN close already known at that instant.

Backtest Review

The prior iterate feedback was fixed at the right layer: _param_bounds now caps entry_z at 2.5 (was 4.0) and floors lookback_days at 120, so the optimizer can no longer pin entry_z on a non-trading bound. At the default entry_z=1.5 the universe produces 507 closed trades over 2022 sessions — every IS/OOS/holdout window will now contain trades.

Backtest Review

Large, well-spread sample: 507 trades across all 20 legs (288 CNEQ / 219 HKEQ), metrics_reliable=true, median hold 20 days, 8.7 years of daily bars; 15 profitable names vs 5 losers, largest leg only 18% of gross.

Backtest Review

Trades match the hypothesis: 507/507 LONG (both venues are CASH), one leg per pair, zero same-day round trips (min hold 1.0 day) so CNEQ T+1 is respected.

Backtest Review

Per-trade edge far above the HKEQ floor: 1.25% vs 0.30%; PF 1.47, win rate 62%, DD 10.3%, impact only 7.3% of gross, capacity $18.7M, profitable in 8 of 9 calendar years with no single-year concentration.

Backtest Review

VERIFIED engine gap: commissions were not charged. total_commission=0.0 and all 507 trade records show commission 0.0, while venue_configs sets HKEQ 0.11%/side and CNEQ 0.05%/side. Cause located in code — BacktestRunner._apply_fees() returns early for any NT Equity instrument (written for commission-free USEQ), and HKEQ/CNEQ instruments are Equity too. Estimated uncharged cost on actual notionals ≈ $10.6k vs $80.4k gross PnL (~13%, ~0.17%/trade). Net per-trade edge ≈ 1.08% — still ~3.6× the floor, so not disqualifying, but every headline number is optimistic by that amount.

Backtest Review

Sharpe 0.883 with a wide CI (0.24–1.55) and PSR 0.86 — deflation over ~225 trials will be a real hurdle at ANALYZING.

Backtest Review

Sortino 0.47 « Sharpe 0.88, skew −0.41, kurtosis 7.0, 13 consecutive losers, 617-day max DD duration — the usual convergence-trade shape (gaps widen before they close).

Backtest Review

alpha/beta/IR are null, and 4.2% CAGR is modest; the optimization must show dislocation capture rather than long-China-financials beta.

Analysis

The 3-phase run did not test this premise out-of-sample — it tested a non-trading corner of the search space. entry_z was pinned to 3.9964, ON its upper bound of 4.0; at |z|~4 over a 123-session norm the 10-pair universe fires 21 times in 8.7 years and ZERO times inside each 377-day validation window, which is exactly why all three OOS Sharpes are literally 0.0 and holdout has 3 trades. Meanwhile the base config is broad and healthy (507 trades, 15/20 legs profitable, max leg share 18.2%, both venues positive, 8/9 years positive, avg_trade_return_pct 1.258% ≈ 4x the HKEQ round trip, DD 10.3% vs a 22% cap, Sharpe CI lower bound > 0). The fix is to the SEARCH SPACE, not the logic. Make exactly three _param_bounds edits: (1) entry_z [0.5,4.0] -> [1.0,2.5]; (2) lookback_days [40,300] -> [120,260], removing the only cliff (0.245 at 96 / 0.271 at 108 vs 0.644–0.721 at 120–144); (3) exit_z [0.0,1.2] -> [0.15,0.75], dropping the degenerate exit_z=0.0. Change nothing else — not the signal logic, the pairs universe, position_frac, or the point-in-time CN-close-before-HK-close alignment. This is attempt 2 of 2 and it is the last: it must produce a selection that TRADES IN EVERY VALIDATION WINDOW. If it does and OOS Sharpe is still ≤ 0.5, or PBO stays > 0.5 with trades present, that is a genuine out-of-sample measurement and the correct outcome is abandon, not another bounds tweak. Full write-up in workspace/discussions/48542967-d379-478d-bc74-478614bfbc04/iteration_1_feedback.md.

Analysis

Benjamini-Hochberg at q=0.10 over 288 programme candidates keeps 4. A candidate that does not survive here is not distinguishable from the programme's own noise, however good its individual statistics look.
Strategy report

Backtest and paper results are hypothetical. Trading involves risk of loss.