The TSLA agent grows $10,000 to $26,364.87 over 27,019 trades. Its average profit is $0.61 per trade, before every cost except a regulatory fee of two hundredths of a cent a share. Keep that figure in view.

The state ViperQ gives the agent

Moustafa, Neagu and Kalita translate a familiar piece of proprietary-trading lore into machine-readable features. Their system is called ViperQ. In Steidlmayer's Market Profile and Dalton's Auction Market Theory, intraday prices alternate between balance and imbalance. Balance means two-way, mean-reverting trade within an accepted value region. During imbalance, one side of the book clears and price races toward a new region. Practitioners have traded this framework for three decades. Based on a literature search across the usual indexes, the authors claim nobody has previously used it as the state input for a reinforcement learning agent.

The implementation uses a 20-dimensional Z-normalised vector over 1-second bars, constructed from Databento tick data. Block A contains nine microstructure dimensions. Four locate the current price: z_price_vwap, z_price_vpoc, dist_to_wall and in_lvn_zone. The dist_to_wall feature gives the normalised position within a 300-second high-low range. The in_lvn_zone flag activates when volume is below half its mean.

Three more dimensions read the tape. The cvd_slope feature is a 60-second first difference of cumulative volume delta. The cvd_divergence flag activates when the 300-second price-CVD correlation falls below -0.5. Tape_velocity divides trade count by its 60-second rolling mean. Trade_size_z and a signed imbalance_ratio complete the block. Block B records the agent's unrealised PnL and time in trade. Block C supplies nine lagged log returns, giving the policy a nine-second memory without recurrence.

Each asset gets one PPO agent. Both agents receive the same state vector, though their reward configurations differ. Actions are discrete, flat or long, and shorting is unavailable. The reward, named Sniper, scales realised PnL by 0.01 and applies a synthetic training fee of $0.50 a share. That fee is roughly 2,500 times the actual regulatory charge. Unrealised gains receive +0.001 per unit, while unrealised losses incur -0.05 - 0.005|U|. The asymmetry draws on Tversky and Kahneman's loss-aversion coefficient of about 2.25. An unrealised loss of $200 triggers an exit and a -50 penalty. During training, drawdown beyond -2% costs -2.0 a step.

The data spans January 2020 to February 2026. It is divided 80/20 in chronological order, with the final twelve months held out. Starting from $10,000 with zero leverage, TSLA returns +163.6% with a -27.5% max drawdown. NVDA produces +116.5% and a -47.8% max drawdown.

Can sixty-one cents survive a real venue?

The meaning of 27,019 is unclear. The paper reports "Total trades 27,019" without specifying whether each trade is a completed round trip or an individual fill. Under the fill interpretation, gross profit per trade rises to about $1.21 and the daily count falls to about 54.

Per-share results would show whether the edge can survive execution costs, yet the paper gives too little information to calculate them. Equation (3) sets position size to floor(B_t x r_a / (2 x ATR_t)), subject to a cap of available cash divided by price. With r_a limited to 1.0% of equity and starting equity of $10,000, the volatility-adjusted term almost certainly controls the position. The cash clamp prevents leverage and will rarely become active. Since the paper reports no ATR values, the number of shares remains unknown. The $0.61 is therefore spread across an unknown, probably small position.

Fills occur at the next 1-second bar's open. The simulation crosses no spread and models neither queue position nor impact.

Evaluation charges only $0.0002 a share while recording 27,019 trades in twelve months. In my view, costless execution carries the headline result. Another inconsistency appears between training and evaluation: the $0.50 synthetic fee applies during training, then disappears when the agent is scored. The policy optimises under one cost structure and is evaluated under another. The paper describes the consequences of this mismatch only qualitatively.

Turnover creates another problem. Across roughly 250 sessions, 27,019 trades works out to about 108 a day. Both agents have a 300-second minimum hold, described in Table 3 as a training constraint. Fitting 108 non-overlapping 300-second holds into a session would require 32,400 seconds, compared with 23,400 in a regular session. The hold therefore appears inactive during evaluation. Section 6.3 says its removal drives the TSLA policy into scalping, so the distinction matters. Treat 27,019 as a fill count and the arithmetic becomes roughly 54 entries per day, requiring 16,200 seconds of holding. That fits comfortably within the session and resolves the apparent contradiction.

The reported test-set size is still more difficult to square. TSLA's test partition contains 33.4M one-second bars over twelve months. Using the authors' annualisation constant of 252 x 23,400 gives 5.9M regular-hours seconds per year. Even a complete calendar year, including every night and weekend, contains 31.5M.

The missing returns-only comparison

The authors plainly state three limitations: two volatile US single names evaluated on one split; no formal one-factor ablation of the reward components; and an NVDA drawdown far beyond the -5% to -15% range typical of daily rebalancing systems. They also defend the absent sweep. In a comparable setting, the paper quotes Lin and Beling as saying they "did not perform an exhaustive grid search on the hyperparameter space, but rather [drew] random samples from the hyperparameter space due to limited computing resources." Readers can decide how much weight that explanation deserves.

Three development results are reported candidly. The $0.50 synthetic fee materially changes the policy. Without it, the agent falls into sub-tick churn that loses money when real fees return. Removing the 300-second minimum hold turns the TSLA policy into rapid scalping. And the continuous -2.0/step drawdown shock makes the NVDA agent risk-averse; without that shock, the authors say both agents settle on the same high-frequency behaviour. Each finding concerns either the reward or the holding constraint. None tests the feature set.

We did not find a comparison between the 20-dimensional auction state and a returns-only vector, an OHLCV vector, an order-flow-imbalance vector in the sense of Cont, Kukanov and Stoikov, or the same state after shuffling Block A. This review infers that reward engineering drives the results, supported by those three documented findings. From the evidence presented, reward shaping explains +163.6% at least as well as auction theory.

The paper treats cross-reward generalisation as evidence that the state has useful structure because it supports two profitable policies. Yet the configurations in Table 2 differ by one component, a +0.10 per step trend bonus. The accompanying text says the TSLA agent receives "the default trend bonus". Table 2 records no TSLA trend bonus.

The theory also slips away from the calculations in Table 1. VPOC is approximated with a one-hour rolling VWAP, which the paper describes as standard practitioner usage. Trailing-hour volume-weighted average price is an average, whereas a point of control is the mode of a volume histogram. The resulting dimension contains no distributional information. The abstract names Value Area position as a state component. Its nearest counterpart in Table 1 is dist_to_wall, the normalised location within a 300-second high-low range. That measures range position. The standard Market Profile value area is the 70% volume band, and Table 1 computes nothing equivalent. The low-volume-node flag is the sole construct that reads as genuinely profile-based.

Sharpe is deliberately omitted. On its own terms, the explanation is reasonable: annualisation at 1-second resolution magnifies microstructure noise and yields figures that cannot be compared with the daily-horizon Sharpes in the paper's comparison table. The authors could still have aggregated PnL by day and reported a t-stat, hit rate or seed variation. We also did not find buy-and-hold results for TSLA and NVDA over the same twelve months. A long-only agent trading two names during that period badly needs those comparisons. We previously made a related point about a PPO liquidity provider whose mean PnL was statistically indistinguishable from a simple rebalancing baseline, even though a tail-risk measure separated them clearly: the statistic you choose decides the verdict.

One path through two names

We could not reproduce this test. The state requires aggressor-side classification for CVD, trade counts for tape velocity and signed volume for the imbalance ratio. Our finest equity data consists of 1-minute OHLCV, without prints, quotes or aggressor flags. Resampling those minute bars would amount to testing a different strategy under the same name.

The feature list is the part worth carrying forward. It provides nine named microstructure dimensions with explicit windows: 3600s for VWAP, 300s for the profile features and 60s for CVD and velocity. A human trader can inspect every dimension against market intuition, an advantage over an end-to-end LOB encoder. The result is a reasonable structured input for a policy-gradient agent.

I still cannot accept that this feature family caused the +163.6%. One experiment would change my view: run the same PPO, reward and split after replacing Block A with nine lagged returns. If the auction features carry the policy, that version should fall apart.