AQAI QuantAI research lab for systematic strategies

Automated analysis

This analysis was drafted by our research engine and has not been checked by a human editor. It may contain errors. It separates the paper’s own results from our tests, and any figures called ours come from our own backtest.

Our automated analysisOur backtest

Two wealth goals can reverse the trading bands

Gang and Kim prove the control exists; the policy jumps come from narrow numerical slices.

2026-10-02 · 6 min read · Portfolio Optimization · US stock or ETF and cash

Reviewing: Portfolio Choice under General Utility with Transaction Costs and Search Frictions · Tae Ung Gang and Donghan Kim · Read it on arxiv

Our backtest of this idea

Our automated quick test, not the paper's

SPY and Cash: Finite-Horizon Non-Concave Utility Control

Backtest period 2020-01-01 to 2024-07-01 · hypothetical, net of modelled costs

Why these figures are not the paper's (2)

The paper reports no results of its own

This is a theoretical paper — derivations and proofs, with no measurement on market data. The backtest below is a strategy we built from its idea, not a test of anything the authors claimed.

Our own audit found this run does not follow the paper faithfully (8)

  • Eq 2.2 log price: dL_t = [µ(t,e^{L_t}) − σ²(t,e^{L_t})/2]dt + σ(t,e^{L_t})dB_t.: Use its daily lognormal transition with pre-decision rolling coefficients frozen for a backward calculation; historical adjusted SPY bars, not simulated prices, determine marks and fills. (invalidates: The paper's continuous-time verification theorem)
  • Section 4 unnormalized HJB, its generator LV, and terminal boundary V(T,l,x,y) = U(x+[1−ϵ̄(e^l)]ye^l).: Use the stated terminal boundary and intervention economics in a daily backward Bellman recursion; retain the continuous HJB in rule_params as a labeled reference, not the equation claimed to be solved. (invalidates: The paper's continuous-time verification theorem)
  • Section 4 normalization: U_p(w) = 1+w^p+w^(−p); v(t,l,x,y) = V(t,l,x,y)/U_p(x+ye^l); ν(t,l,x,y) = e^(αt)v(t,l,x,y). U_p is the positive normalizer, not terminal utility U.: Retain the exact U_p and normalization identities but set alpha=0 solely as a discrete-solver reporting gauge. (invalidates: The paper's normalized fixed-point argument)
  • Eqs 4.2–4.3: μ̃ = µ−σ²/2+σ²ye^l U_p′/U_p; γ = σ²[ye^l U_p′+(ye^l)²U_p′′]/[2U_p]+[µ−σ²/2]ye^l U_p′/U_p.: Retain exact coefficients as labeled continuous-time references; propagate the discrete transition instead. (invalidates: The paper's normalized HJB solution; the paper's continuous-time verification theorem)

4 further finding(s) are described in the note.

These are our findings about our own implementation, not criticisms of the paper. Read the figures below as a description of what we ran.

Jan 2020Total 0.0%Jul 2024
Sharpe
0.52
Total Return
0.0%
Max Drawdown
-0.0%
CAGR
0.0%
Volatility
0.0%
Beta vs SPY
0.00
Trades
9

A trader pursuing two wealth targets can end up selling at a low stock weight and buying at a high one. Gang and Kim show such a policy in their numerical examples, while proving that the underlying control problem has a solution classical in time and log-price when trades arrive at random times. The existence result carries more weight than the striking picture of reversed trading bands.

A stock, cash and a random clock

The market has one stock and cash that pays zero interest. Each buy or sale incurs a proportional cost, and trading is confined to the jump times of a Cox process, a Poisson-type clock whose intensity may vary with time and price. Borrowing and shorting are barred. The objective is expected utility of terminal wealth after liquidation costs. For some p > 0, the authors require U(e^r) divided by 1 + e^{pr} + e^{-pr} to be bounded and Hölder continuous in r. Concavity, monotonicity and differentiability are unnecessary. Their example w + ½sin(w) has asymptotic elasticity 3/2, outside the standard Kramkov and Schachermayer framework.

Cash and share holdings stay fixed between arrivals while log-price diffuses. In the Hamilton-Jacobi-Bellman (HJB) equation, the trading decision appears as intensity multiplied by the difference between the best post-trade value and the current value. This zeroth-order term leaves a semi-linear equation that is uniformly parabolic in log-price, with holdings treated as parameters. As the authors put it, "The main message of this paper is that search frictions remove this obstruction," referring to the gradient-constrained free-boundary problem created by continuous trading with costs. A Feynman-Kac fixed-point map contracts by a factor of 1/2 when the normalising constant α is large; interior Schauder estimates supply regularity. A verification theorem then identifies the value function and obtains an optimal Markov feedback rule through a Borel measurable selector. The solution is classical in time and log-price, and continuous in positions. The authors say verification needs no more than that.

The paper gives no returns, Sharpe ratios or backtests. Its computations show policy shapes for three smoothed aspiration utilities, each combining a CRRA term with normal-CDF steps. The inputs are μ = 0.06, σ = 0.35, λ = 20 and T = 1; equal buy and sell costs are 0.05 or 0.02. An implicit-explicit finite-difference scheme uses 2000 spatial and 4000 time subintervals. Every performance figure below belongs to our own backtest.

Selling left of buying

The clearest reversal comes from U3 = -1/w + 6Φ((w-1.6)/0.02) + 12Φ((w-2.1)/0.05). With cost at 0.05 and pre-trade wealth w = 1.655, the authors evaluate the policy at t = 0. As the pre-trade stock weight π increases, the chosen action changes from a sale to a purchase. Near π ≈ 0.18, the post-trade weight jumps directly from 0 to 1. A full sale there would leave w(1 - ϵπ) ≈ 1.64, two step widths above the first aspiration level of 1.6. The authors interpret the sale as protecting the 1.6 goal instead of gambling for the 2.1 goal. The second step's height is 12, twice the first step's 6.

The other slices show milder departures from the usual bands. At w = 1.96, U1 alternates two no-trade intervals with two selling intervals and never buys. At w = 0.915, U2 alternates two buying intervals with two no-trade intervals and never sells. U1 at w = 1.51 gives the familiar buy, no-trade, sell sequence. Where wealth lies relative to the steps matters.

What does the jump cost?

The authors prove that a discontinuity in the chosen post-trade weight requires at least two global maximisers with different weights at that state. They also observe that, with search frictions, a state can lie deep inside a trading region at every arrival. Such switches can therefore recur.

For a trader, the same proof limits what the jump establishes. The competing trades have equal value at the switch by construction, and the normalised value is continuous. By continuity, we infer that a small error in locating the boundary near π ≈ 0.18 costs little value even though the positions differ across the full 0-to-1 range. Its location depends on a wealth margin of about 0.04 above a step of width 0.02. To matter in practice, the reversal needs drift and volatility estimates that rank two nearly tied trades correctly, along with a goal as sharp as a 0.02-wide step.

The goal must also tolerate smoothing. A genuine jump violates the Hölder condition. On letting the step width approach zero, the authors explicitly say "we do not claim any convergence of the value functions or policies in this limit".

Costs and the trading clock

For a daily stock-or-ETF interpretation, these are heavy frictions. If T = 1 denotes one year, intensity 20 gives a daily opportunity probability of 1 - exp(-20/252), about 7.6%, or roughly one chance every 12.6 sessions. U1 and U3 pay 5% each way; U2 pays 2%. The figures cover only those two cost levels, leaving open whether the reversals persist at the much smaller costs of a liquid ETF. Costs are proportional, with no fixed charge or price impact, so capacity lies outside the model. The numerical examples also have constant coefficients and a single risky asset.

How far do the plots reach?

The PDE result guarantees one bounded continuous solution, classical in the diffusive variables, and an optimal feedback rule. The policy plots make a narrower claim. Their one-dimensional slices, the authors write, "do not by themselves establish disconnectedness of the corresponding regions in the full state space." If the maximiser is non-unique, the plotted weight is whichever maximiser the numerical procedure returns. They add: "Distinguishing such switches from discretization effects requires numerical refinement and comparison of the competing objective values." We did not find a grid-refinement study beyond the 2000 by 4000 resolution, or a certainty-equivalent comparison with a concave or concavified benchmark.

Our SPY run stayed near cash

We ran our own version with SPY and cash on daily bars from 2020-01-01 to 2024-07-01. The paper offers no performance figures for comparison. Starting with 1.655 units of cash, the run made no initial trade. It used U3 for terminal utility and estimated drift and volatility from trailing daily returns. Values came from a daily lognormal backward recursion; arrivals simulated at 20 per year used a fixed seed. At each arrival, the run searched the full z ∈ [0, 1] range for its preferred trade. This discrete recursion differs from the authors' continuous-time solution and is outside their verification theorem.

The result barely moved.

Over 2020-01-01 to 2024-07-01, our run recorded a Sharpe of 0.52, a Sortino of 0.62 and a Calmar of 0.30. The book sat almost entirely in cash, so those ratios mostly measure noise around cash rather than an edge. Drawdown rounds to -0.00%. These figures describe one automated pass, rather than a verdict on the authors' work.

The starting state accounts for much of the outcome. We began at π = 0 with wealth 1.655, already above the 1.6 step. Cash pays zero, so holding it secures the first goal. The paper's U3 figure likewise shows no trade at the π = 0 endpoint for that wealth. Our estimates of SPY drift and volatility, however, differ from its 0.06 and 0.35.

The authors have done the hard part well; the existence proof stands on its own. I would take the reversed bands to a desk if the U3 switch survived a finer grid and a cost sweep toward ETF levels, with a certainty-equivalent gain attached.

Our backtest stops at 2024-07-01, and everything after that date is deliberately left untouched so the same strategy can be checked out of sample later.

How our backtest worked

The steps the code we ran actually executed, from its strategy card. Ours, not the paper's — it is one automated implementation of the idea, not the authors' own.

Start with 1.655 units in cash; prohibit an initialization trade.
At each eligible SPY close, estimate annual drift and volatility from the latest 252 completed adjusted close-to-close returns.
Using the fixed terminal date and those frozen estimates, solve a daily lognormal backward recursion with terminal utility U3(after-sale-cost wealth).
On a seeded simulated opportunity day, compare holding with the global cost-adjusted intervention maximum over feasible z in [0, 1], including both endpoints and the no-trade point; retain numerically indistinguishable maxima.
The specification submits the selected share-delta direction for the next available adjusted open, subject to available cash or shares; otherwise hold. Do not use that open to form the preceding signal.
Run the CRRA-2 clipped-target, ±0.10-band comparator on the same opportunity sequence. At the final adjusted close, assess both policies using after-liquidation wealth and U3.