Skip to content

Analyse capped-waterfall end-of-run undeployed cash - #35

Open
miohtama wants to merge 1 commit into
masterfrom
capped-waterfall-redemption-delay-analysis
Open

Analyse capped-waterfall end-of-run undeployed cash#35
miohtama wants to merge 1 commit into
masterfrom
capped-waterfall-redemption-delay-analysis

Conversation

@miohtama

@miohtama miohtama commented Jul 1, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Re-runs the capped-waterfall cross-chain vault backtest (scratchpad/xchain2/08-backtest-capped-waterfall.ipynb) against the fixed trade-executor CCTP planner (#1549). The backtest now completes end-to-end (386/386 CCTP bridge trades succeed, +6.9% total return).
  • Investigates why the strategy leaves a growing amount of undeployed cash towards the end of the run (idle reserve rises to ~24% of equity vs the ~10% design target).
  • Adds a notebook-static-server verification step (status-code + notebook-title check) to .claude/docs/notebook-server.md.
  • Commits the portfolio asset allocation chart used in the analysis.

See the PR comment below for the redemption-delay pinning breakdown, example vaults/trades, and the allocation chart.

Re-run the capped-waterfall cross-chain backtest against the fixed
trade-executor CCTP planner. Add a notebook-server verification step
(status + title check) to the docs and capture the portfolio asset
allocation chart used to diagnose end-of-run idle cash.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@miohtama

miohtama commented Jul 1, 2026

Copy link
Copy Markdown
Contributor Author

Redemption-delay pinning → undeployed cash

The end-of-run idle cash (reserve climbs to 24.0% of equity by the last cycle, vs the ~10% target from allocation_pct = 0.90) is driven in large part by async vault redemption delays. When the strategy wants to rotate out of a lagging vault, the redemption only requests the withdrawal; the cash lands several cycles later. During that window the capital is neither in a productive position nor available to redeploy, so it accumulates as idle USDC.

Mechanism (trade-executor alpha model)

Two related effects, both keyed off async ERC-7540 / Ostium vault settlement:

  1. carry_forward_non_redeemable_positions() — each cycle, positions in vaults that report can_redeem=False (redemption-delay window) or that have an in-flight settlement are pinned at their marked value and carried forward. That value is subtracted from the deployable target:
    deployable = 0.90·equity − locked_non_redeemable − cash_buffer.
    So the strategy cannot rotate out of a laggard while its redemption is delayed.
  2. _cap_buys_by_async_sell_proceeds() — an async vault sell's proceeds are not available same-cycle, so this cycle's buys are scaled down to synchronous cash only. The withheld capital stays in reserve until the redemption settles.

Evidence from the run

  • 157 of 344 cycles carried at least one pinned (non-redeemable) vault position, across 10 distinct vaults.
  • Pinning-flag rows: settlement_pending ×273 (async deposit/redeem in-flight), cannot_redeem ×29 (redemption-delay veto), max_adjust_too_small+settlement_pending ×6.
  • Final-cycle balance sheet: equity $106,903, idle reserve $25,664 (24.0%), invested $84,698 (79.2%), of which only $602 is physically pending settlement at that instant — the rest of the idle cash is the cumulative churn withheld across settlement windows. Only 15 of 20 position slots are used.

Example vaults exhibiting the behaviour

Vault Chain Cycles pinned Mean pinned USD Max pinned USD Total missed redemption USD
DeTrade Core USDC Base 75 10,401 11,367 0
Moon Digital AM USDC Ethereum 69 10,135 11,360 0
Ostium Liquidity Pool Vault Arbitrum 39 9,352 11,343 4,903
Hub Capital USDC vault Ethereum 32 10,435 11,366 0
Plutus Hedge Token Arbitrum 28 8,911 8,932 249,497
USDn2 Arbitrum 25 9,772 12,130 0
Syntropia USDC Core Ethereum 18 10,326 11,385 0
Syntropia Boosted Ethereum 12 8,634 11,377 0

Plutus Hedge Token is the clearest case: the strategy tried to redeem a cumulative $249,497 from it over 28 cycles but was repeatedly blocked by the redemption delay.

Example trades exhibiting the behaviour

Async settlement trades still in-flight (unsettled executed_at) at run end — capital tied up mid-redemption/deposit:

Trade Vault Chain Action Value USD Async in-flight
#2098 DeTrade Core USDC Base sell (redeem) 2,120
#2097 Moon Digital AM USDC Ethereum sell (redeem) 1,100
#2094 Ostium Liquidity Pool Vault Arbitrum buy (deposit) 602

Repeated partial sells over consecutive cycles show the strategy chipping away at positions it cannot fully redeem in one go, e.g. Moon Digital AM USDC: #2029 (2026-02-24, $4,967) → #2097 (still in-flight at run end); Hub Capital USDC vault: #2032 (2026-02-25, $351) → #2046 (2026-02-27, $492).

Allocation chart — vaults and undeployed cash

Portfolio asset weights over the run. The grey USDC band is undeployed cash; note how it widens towards the right-hand (late) side of the run as more of the book gets tied up in delayed async-vault redemptions.

Portfolio asset weights by token — vaults and undeployed USDC cash


Note: redemption-delay pinning is additive to a second constraint — the per-position vault-capacity caps (per_position_cap_of_pool_pct = 0.20, max_concentration_pct = 0.12) limit how much can be placed into the shallow top-CAGR vaults (~$18k "discarded because of lit liquidity" at the final cycle). Both push idle cash above the 10% design floor late in the run.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant