The Rise and Fall of an Obscure On-Chain LP Strategy: Clouds Break, the Moon Appears, and Flowers Cast Shadows

The Rise and Fall of an Obscure On-Chain LP Strategy: Clouds Break, the Moon Appears, and Flowers Cast Shadows

This is the full story of a Solana on-chain strategy, from the investment thesis to Kalman-filter-based hedge modeling, convex optimization for the optimal portfolio, and aggressive leverage through looping loans, ending with half the profit given back after the bull market tide receded.

Investment Thesis

First, some background. In the cryptocurrency market, there are many decentralized exchanges (DEXs), which run on blockchains and execute automatically through smart contracts, without a centralized operator like a traditional exchange. Perpetual futures are derivative contracts with no expiry date, allowing traders to go long or short an asset with leverage, one of the highest-volume product categories in crypto. Liquidity providers (LPs) are the capital behind these exchanges, roughly analogous to market makers in traditional finance.

JLP, short for Jupiter Liquidity Provider, is a liquidity-staking product launched by Jupiter, the largest spot exchange on Solana, that allows investors to act as market makers for Jupiter’s perpetual futures market. In practice, investors acquire shares of the market-making capital pool either through subscriptions or secondary-market trading, then serve as the sole counterparty to traders on Jupiter’s perpetual venue and provide liquidity. The pool receives 75% of all fee revenue as compensation while also bearing adverse-selection risk. Because exchanges are one of the few business models in crypto that have actually been proven to work, and because this structure lets outside investors participate with zero operating barrier, the project was relatively rare.

In traditional finance, market makers earn the spread by posting both bid and ask quotes. In decentralized perpetual markets, that mechanism is greatly simplified: LPs do not quote prices themselves, but passively absorb every trader’s flow as the counterparty. That means the LP payoff looks like selling insurance: most of the time it steadily collects premiums, namely fees, but occasionally it must pay out when extreme events make traders profitable.

In Jupiter’s perpetual market, in order to overcome on-chain latency, the system does not use a CLOB (Central Limit Order Book) model. Trades are not matched peer to peer. Instead, they are executed directly against the exchange at oracle-fed prices plus fees, 6 bps both to open and to close. During the holding period, traders also pay high hourly interest as the cost of capital usage. In fact, the market only supports three major assets, BTC, ETH, and SOL, and the pool itself only contains BTC, ETH, SOL, and USDC, a dollar-pegged stablecoin mainly used to support shorts. The rules are highly favorable to LPs. The LP’s P&L comes from:

  • Revenue items
    • Opening and closing fees
    • Position interest
    • Liquidation penalties, which are very substantial
    • Subscription and redemption fees on pool shares
    • Lending income on idle capital in the pool
    • Staking income on idle SOL in the pool
  • The opposite side of traders’ P&L, which is usually negative
  • P&L on the base asset inventory

The main risks were:

  • Smart-contract exploits
  • The Jupiter team acting maliciously and disappearing with the funds
  • A decline in Jupiter’s contract trading volume

When I invested in JLP, from late 2024 to Q4 2025, the market was still in a bull run. I believed on-chain derivatives volume could remain elevated for quite a while, even though the venue was extremely unfriendly to traders, and that even a downturn would not happen abruptly, leaving enough time to exit. I also did not think the Jupiter team would abandon the rest of its business just to steal this pool, including Solana’s largest spot-routing aggregator by trading volume. The pool size was on the order of more than one billion dollars, with no subscription or redemption limits, so capacity and liquidity were both excellent.

Hedging

The biggest factor driving fluctuations in JLP NAV was obviously the volatility of the underlying assets. Even in a bull market, drawdowns of around 40% can still happen, and most of the pool is composed of risky assets. The strategy needed a hedge.

The elegant part was that a share of the JLP liquidity pool exists as a liquid-staking token, the JLP token. That token could then be deposited into Drift, one of the largest exchanges on Solana at the time, and used inside a unified account, similar to a portfolio-margin account at a traditional broker where P&L is netted across all assets and positions, as collateral at a 70%-80% haircut to short the three major coins. That dramatically smoothed NAV volatility and pushed the Sharpe ratio extremely high. It could even boost returns, because in bull markets the funding rate is usually positive, meaning longs periodically pay shorts to anchor perpetual prices to spot, so when the market is active the annualized carry can become very large.

Kalman-Filter Hedging Model

To perform delta hedging, the first question is simple: how much BTC, ETH, and SOL exposure does one unit of JLP actually contain?

Although Jupiter publishes target pool weights, for example BTC 11%, ETH 11%, SOL 44%, and USDC 34%, the actual weights vary over time, and the platform does not disclose the detailed split between long and short positions. One key design detail is that the JLP pool does not rebalance actively. Instead, it creates arbitrage incentives by adjusting subscription and redemption price slippage. When an asset deviates from its target weight, subscribing with that asset becomes cheaper while redeeming with it becomes more expensive, encouraging external arbitrageurs to push the pool back toward target weights. That means the real pool composition is always changing under the combined impact of trader positioning, arbitrage behavior, and price moves. Hedging directly with static target weights would leave large tracking error.

My approach was to model JLP price changes as a linear combination of price changes in the underlying assets, and then use a Kalman filter, an online Bayesian estimation method widely used in aerospace and signal processing, to estimate the time-varying coefficients online. The advantage is that you do not need to know the exact rebalancing mechanism of the pool. No matter why the weights change, the Kalman filter can adaptively track them.

I chose daily data with Kalman smoothing rather than higher-frequency on-chain data for real-time alignment for several reasons. The most important prior is that these exposures themselves change slowly. The asset mix of the pool will not shift violently within a single day, so daily frequency is enough to capture the trend, and the Random Walk state-transition assumption fits this property naturally. Second, daily price data is easy to obtain over long histories, which helps with backtesting and parameter estimation. Third, even though in theory one could read the pool state directly from the chain in real time and hedge more precisely, the trading frictions from high-frequency rebalancing, fees and slippage, would eat most of the profit. Taking all of this together, regressing on daily prices of the major coins and the JLP token, combined with Kalman smoothing to estimate time-varying exposure, was the most pragmatic and robust choice.

Specifically, the model assumes:

$$\Delta P_{\text{JLP}, t} = \alpha_t + \beta_{\text{SOL}, t} \cdot \Delta P_{\text{SOL}, t} + \beta_{\text{BTC}, t} \cdot \Delta P_{\text{BTC}, t} + \beta_{\text{ETH}, t} \cdot \Delta P_{\text{ETH}, t} + \epsilon_t$$

Here, \(\alpha_t\) represents the pure return increment of JLP at each time step, income such as fees and interest that is unrelated to price. The \(\beta_{i,t}\) terms are JLP’s price sensitivities to each asset \(i\), which are exactly the hedge ratios we need. \(\epsilon_t\) is the observation noise.

State-Space Form

Treat

$$ \mathbf{x}_t = [\alpha_t, \beta_{\text{SOL},t}, \beta_{\text{BTC},t}, \beta_{\text{ETH},t}]^{\top} $$

as the hidden state vector. Then the Kalman filter takes the standard form:

State transition equation (Random Walk model):

$$\mathbf{x}_t = \mathbf{x}_{t-1} + \mathbf{w}_t, \quad \mathbf{w}_t \sim \mathcal{N}(\mathbf{0}, \mathbf{Q})$$

Observation equation:

$$y_t = \mathbf{H}_t \mathbf{x}_t + v_t, \quad v_t \sim \mathcal{N}(0, R)$$

The observation matrix \(\mathbf{H}_t\) changes at each point in time:

$$\mathbf{H}_t = [1, \Delta P_{\text{SOL},t}, \Delta P_{\text{BTC},t}, \Delta P_{\text{ETH},t}]$$

This setup means the hedge coefficients are assumed to follow a slowly drifting random walk, with the speed of drift controlled by the transition covariance matrix \(\mathbf{Q}\). The larger the diagonal elements of \(\mathbf{Q}\), the more “sensitive” the filter becomes and the faster it tracks coefficient changes.

Estimating Hyperparameters with EM

The hyperparameters \(\mathbf{Q}\), \(R\), and the initial-state covariance \(\mathbf{P}_0\) cannot be guessed casually, otherwise the filter will either overfit or become too sluggish. I estimated them jointly with the EM (Expectation-Maximization) algorithm:

1
2
3
4
5
6
7
8
9
10
kf = KalmanFilter(
transition_matrices=np.eye(n_dim_state),
observation_matrices=observation_matrices,
initial_state_mean=initial_state_mean,
initial_state_covariance=initial_state_covariance,
transition_covariance=transition_covariance,
observation_covariance=observation_covariance,
)
em_vars = ['observation_covariance', 'transition_covariance', 'initial_state_covariance']
kf = kf.em(observations, n_iter=100, em_vars=em_vars)

The EM procedure converged after 100 iterations. I then used kf.smooth() to perform RTS smoothing and obtain the optimal state estimate on the full sample. This was an offline analysis; in live trading only kf.filter() would be used for online estimation.

Filtering Results

The figure below shows how the four state variables evolved over time:

Evolution of hedge coefficients estimated by the Kalman filter

Several observations stand out:

  • \(\alpha\) (intercept) remains positive throughout, reflecting JLP’s stable fee income. This is the source of the strategy’s “pure return.”
  • \(\beta_{\text{SOL}}\) is the largest of the three coefficients, consistent with SOL being the largest component in the pool, but it is far from constant and deviates significantly from its mean when SOL surges or crashes.
  • \(\beta_{\text{BTC}}\) and \(\beta_{\text{ETH}}\) are smaller and more stable, but they also display the same slow drift caused by internal pool rebalancing.

The next chart is more intuitive: it decomposes the JLP price into contributions from each underlying asset.

JLP price composition breakdown

The stacked area chart shows clearly that JLP is driven mainly by SOL, the blue area, while BTC and ETH contribute much less. The dashed line represents the cumulative return from \(\alpha\), pure market-making income, and it forms a steady upward curve.

Finally, here is the comparison between the JLP price and the annualized return, APR, implied by \(\alpha\):

JLP price and APR implied by alpha

This figure reveals an interesting pattern: APR is much higher when the market is active and JLP is rising, and it falls during quiet periods when prices decline. The intuition is straightforward. In a bull market, retail traders go wild and fee income naturally surges. In dull markets, the opposite happens.

In the end, though, I did not implement dynamic hedging. Instead, I pinned the hedge statically near the center of the exposure range and only rebalanced every few months. The reason was that the data showed an extremely significant negative correlation between each asset’s risk exposure, the \(\beta\) coefficients, and its own price. Retail traders always chase trends: when prices rise, they go long, consuming the pool’s long inventory and reducing LP beta exposure; when prices fall, they close positions or even flip short, freeing inventory and pushing beta back up. In backtests, static hedging actually generated an additional layer of mean-reversion profit, at least before the bear market fully arrived.

Even with delta hedging, gamma risk remained the Achilles’ heel of the strategy, and that is inherent to LP strategies. It cannot be eliminated. When the underlying assets move sharply in one direction, the hedge coefficients themselves change violently, but my hedge is based only on the previous period’s coefficients. That tracking error is exactly the gamma loss, and it planted the seed of the later drawdown.

Looking back, not modeling gamma explicitly was a regret. If I could do it over again, I would consider buying a wide strangle, out-of-the-money calls plus out-of-the-money puts, to hedge part of that gamma risk. The essence of the strategy is that it earns theta, time decay expressed here as fee income, while being short gamma. In theory, spending part of that theta on options to buy gamma could smooth the return curve further. I did think about it at the time, but it felt annoying and expensive, so I skipped it. That was just luck bias at work.

Aggressive Leverage

If the story ended there, it would only have been a decent strategy, contributing roughly 18% per year under normal conditions, or perhaps 30%-40% if liquidations were especially profitable, which was merely acceptable in a bull market. At the time, I believed the failure risk of the hedge model was low. The main risks were tail events, stablecoin failure, Jupiter failure, or Drift failure. After taking on multiple tail risks, I felt that a bull market should justify a higher return, and those tail risks were effectively fixed and unrelated to my leverage ratio.

Position Sizing Under the Kelly Criterion

The Kelly Criterion gives the optimal position size that maximizes long-run capital growth under a given payoff profile. This strategy had an unusual payoff structure: gains were continuous, steady daily fee income, while losses were discrete tail events, for example a platform blowing up and the principal going to zero. Let the annualized return be \(r\), let the annual probability of a tail event be \(p_{\text{tail}}\), and assume the full principal is lost in such an event. Then the log-growth rate for allocation fraction \(f\) is:

$$G(f) = (1 - p_{\text{tail}}) \cdot \ln(1 + f \cdot r) + p_{\text{tail}} \cdot \ln(1 - f)$$

Taking the derivative with respect to \(f\) and setting it to zero gives:

$$\frac{(1 - p_{\text{tail}}) \cdot r}{1 + f \cdot r} = \frac{p_{\text{tail}}}{1 - f}$$

If I estimated \(p_{\text{tail}} \approx 0.02\), the probability that one of the platforms blows up within a year, and \(r = 0.3\), the expected annualized return after hedging, then the solution is \(f^* \approx 0.91\). In other words, the Kelly criterion suggests allocating more than 90% of available capital under this payoff. Since Kelly is extremely sensitive to parameter-estimation error, live trading usually uses half-Kelly, about 45%. Even then, because the return was high enough and the tail probability low enough, half-Kelly still implied an aggressive position.

That analysis gave me confidence. If the tail risk is fixed, then levering up to increase \(r\) is equivalent to increasing return without changing \(p_{\text{tail}}\), and the Kelly-optimal allocation rises accordingly. In other words: with fixed tail risk, higher leverage should theoretically justify committing a larger fraction of capital.

Looping Loans for Leverage

So I decided to lever up. I used Drift’s unified-margin mechanism again. At the time, most participants preferred to hold coins rather than borrow them to short, so I used JLP as collateral to borrow major coins, swapped them into more JLP, deposited again, and repeated the loop before finally opening the futures hedge. With the help of a solver, around ten operations were enough to push the leverage ratio to the target of below 3x. That more than doubled the return of the strategy.

Optimal Portfolio Configuration

After adding leverage, the problem I faced was: in an eight-dimensional decision space, JLP spot, SOL/BTC/ETH borrowing, USDC cash, and SOL/BTC/ETH perpetual futures, how do you find the optimal portfolio configuration? This cannot be solved with a back-of-the-envelope calculation. It must simultaneously satisfy delta-neutral constraints, margin constraints, leverage limits, and volatility control.

I formulated the problem as a convex optimization. The decision variable is the quantity vector of eight assets, \(\mathbf{w} \in \mathbb{R}^8\), split into positive and negative parts, \(\mathbf{w} = \mathbf{w}^+ - \mathbf{w}^-\) with \(\mathbf{w}^+, \mathbf{w}^- \geq 0\), to model long and short positions separately.

Objective function (maximize expected return):

$$\max \sum_i r_i^{\text{long}} \cdot p_i \cdot w_i^+ - \sum_i c_i^{\text{borrow}} \cdot p_i \cdot w_i^-$$

Here, \(r_i^{\text{long}}\) is the annualized long return, such as JLP market-making income or futures funding carry, while \(c_i^{\text{borrow}}\) is the borrowing cost.

Delta-neutral constraints, using the Kalman-filter estimate \(\hat{\boldsymbol{\beta}}\):

$$\text{expo}_{\text{SOL}} = (w_0 \cdot \hat{\beta}_{\text{SOL}} + w_1 + w_5) \cdot P_{\text{SOL}} \approx 0$$

$$\text{expo}_{\text{BTC}} = (w_0 \cdot \hat{\beta}_{\text{BTC}} + w_2 + w_6) \cdot P_{\text{BTC}} \approx 0$$

$$\text{expo}_{\text{ETH}} = (w_0 \cdot \hat{\beta}_{\text{ETH}} + w_3 + w_7) \cdot P_{\text{ETH}} \approx 0$$

Margin constraint:

$$\sum_i \rho_i \cdot p_i \cdot w_i^+ \geq \sum_i m_i \cdot p_i \cdot w_i^- + \sum_j m_j \cdot p_j \cdot w_j^+$$

Here, \(\rho_i\) is the collateral haircut, JLP 80% and USDC 100%, and \(m_i\) is the margin ratio, 120% for borrowing and 5% for futures.

Volatility control: the variance of futures positions cannot exceed the limit:

$$\mathbf{v}_{\text{perp}}^{\top} \boldsymbol{\Sigma} \, \mathbf{v}_{\text{perp}} \leq \left(\frac{V \cdot 8\%}{\sqrt{365}}\right)^2$$

Here, \(\boldsymbol{\Sigma}\) is the covariance matrix of SOL/BTC/ETH returns.

1
2
3
4
5
6
7
8
# Hedge relationship constraints
solana_expo = (w[0] * hedge_coeff[0] + w[1] + w[5]) * prices[1]
btc_expo = (w[0] * hedge_coeff[1] + w[2] + w[6]) * prices[2]
eth_expo = (w[0] * hedge_coeff[2] + w[3] + w[7]) * prices[3]

# Volatility constraint
contract_pnl_penalty = cp.quad_form(value_perps, cov_matrix)
constraints.append(contract_pnl_penalty <= (portfolio_value * (0.08 / 365**0.5)) ** 2)

The optimizer’s key insight was this: by mixing spot borrowing with long and short futures to adjust exposure, you can exploit the spread between borrowing rates and funding rates. In a bull market, borrowing BTC and ETH was cheap, because few people wanted to borrow them, while short futures could collect positive funding. The optimizer automatically searched for the best ratio between the two.

Live Portfolio

The final optimizer output looked roughly like this:

  • JLP spot +200000
  • BTC spot -0.2
  • ETH spot -10.0
  • SOL spot -2000.0
  • BTC futures -1.0
  • ETH futures -10.0
  • SOL futures +500.0

By construction, this portfolio was approximately delta-neutral. Notice that the SOL futures position was long rather than short. That is because borrowing SOL was cheaper than paying the funding cost to short SOL futures, so the optimizer chose to borrow more SOL spot and then use a portion of long futures to offset the resulting excess short exposure. This kind of counterintuitive allocation is exactly where the optimizer adds value. A human trader would struggle to find the global optimum in such a high-dimensional space.

In live trading, this hedge turned out to be extremely resilient. Account health barely fell. Later I even borrowed large amounts of stablecoins and BTC to participate in other arbitrage opportunities, leaving only a razor-thin cushion in Drift. On one hand, that increased liquidation risk and required the hedge model to hold up. On the other hand, it actually reduced tail risk from Drift itself, because there was less capital left there to lose if Drift blew up.

Epilogue

Clouds break, the moon appears, and flowers cast shifting shadows. Behind heavy curtains the lamps are hidden; the wind stays restless, the night has only just grown still, and by tomorrow fallen blossoms will cover the path.

After several consecutive sharp selloffs in Q4 2025, trading volume on Jupiter’s contract market collapsed, and JLP returns fell with it. \(\alpha\) dropped rapidly from more than 40% annualized at the peak to single digits. Market makers earn the fee equivalent of a tax on trader overconfidence; when the traders leave, the tax base dries up. In early November, I concluded that the risk-reward was no longer attractive, by then SOL had already fallen by about half from its high, and I exited the strategy completely. By the time I got out, cumulative profit had already drawn down by roughly 50% from the peak.

Still, I think some of that was unavoidable. The strategy was designed from the start to absorb price trends directly, and in the first few rounds of crashes and rebounds that design actually helped NAV rise rather than fall. In the end, though, it simply could not withstand the departure of retail traders. Once I chose to bear gamma, exiting with a drawdown was almost baked in.

What is really worth reflecting on is why I did not leave earlier. By that point, the core trading logic had already collapsed. There were no longer large numbers of retail traders generating fee income. Yet I delayed. There were two reasons. One was plain wishful thinking: the strategy had survived several earlier crashes and recovered, so I believed this time would be the same. I fixated on the fact that the hedge book had not changed, the long and short position numbers still looked the same, while half-consciously ignoring the fact that the underlying logic had changed qualitatively. The second reason was subtler: I liked to imagine that I could keep the strategy running through a crisis, which is just a form of hero complex.

In April 2026, Drift blew up. Whether it was North Korean hackers or insiders stealing from the platform, this hedge structure became impossible to implement from that point on. Even if the exchange were to resume operations, it would be hard to restore confidence. Beyond the familiar lesson not to overbet on risky projects, the broader takeaway for me is that, given a fixed amount of tail risk, one should try to earn as high a return as possible while the opportunity still exists.

The Rise and Fall of an Obscure On-Chain LP Strategy: Clouds Break, the Moon Appears, and Flowers Cast Shadows

https://en.heth.ink/JLP/

Author

YK

Posted on

2026-04-07

Updated on

2026-04-08

Licensed under