V8 - Balance Sheet Strength & Dilution Filter Research

Page ID: 33cd5568-29bd-81c4-8110-d88e8198aba2
Created: 2026-04-08T15:53:00.000Z
Last Edited: 2026-04-08T15:53:00.000Z
URL: https://www.notion.so/V8-Balance-Sheet-Strength-Dilution-Filter-Research-33cd556829bd81c48110d88e8198aba2

Properties

  • Phase: None
  • Status: None
  • Key Finding:
  • Date: None
  • Name: V8 - Balance Sheet Strength & Dilution Filter Research

Content

Grid Search V8 — Balance Sheet Strength & Dilution Filter Research

Run date: 2026-04-09
Data range: 2016-01-01 to 2025-06-30
OOS split: 2024-01-01
Runtime: 61s

Objective

Test whether additional balance-sheet/dilution filters improve universe quality beyond the existing cash/mcap filter. Five candidate metrics evaluated:

#MetricFormulaRationale
1net_cash_to_mcap(cash + STI - debt) / mcapExisting core filter; benchmark
2cash_to_debt(cash + STI) / debtBalance sheet strength
3debt_to_mcaptotal_debt / mcapLeverage relative to valuation
4shares_growth_1yshares_now / shares_1y_ago - 11-year dilution
5issuance_to_mcapsum(issuance_of_stock, 4Q) / mcapStock issuance burden

Methodology

  • Base universe: ATH drawdown ≤ -90%, MCap ≥ $7M, Phase 2+, IPO ≥ 2Y, SEC filing history. No cash/mcap filter — that’s what we’re testing.
  • Fixed entry: bottom_bounce 20%, cooldown 90d.
  • Fixed exit: TP=100%, SL=-50%, max_days=365.
  • Each candidate filter applied on top of the base universe at various thresholds. Trade-level metrics compared.

Stage 1: Metric Coverage & Distribution

1,293 symbol-date observations sampled (19 dates, every 6 months).

MetricCoverageP10P25P50P75P90
net_cash_to_mcap100%-0.0190.0290.2130.6311.372
cash_to_debt88%0.712.126.5238.8145
debt_to_mcap100%0.0000.0020.0230.1500.455
shares_growth_1y100%-0.480.010.160.635.92
issuance_to_mcap100%0.0000.0030.0760.3490.758

Key observations:

  • All metrics have excellent coverage (88-100%). No sparsity concerns.
  • Median biotech in our base universe has 16% share dilution/year and ~21% net cash relative to mcap.
  • cash_to_debt is highly skewed (many biotechs have minimal debt), reducing its discriminative power.

Stage 2: Filter Sweep Results

34 filter configs tested. Baseline: 787 trades, Mean=+10.3%, Win=39.1%, Sharpe=0.126.

Top 15 by Sharpe

#MetricDirectionThresholdUnivTradesMean RetWin%SharpeIS MeanOOS Mean
1net_cash_to_mcaptop 5%54.055+56.0%67.3%0.649+55.5%+57.0%
2net_cash_to_mcaptop 10%107.6107+49.5%58.9%0.513+49.6%+49.3%
3net_cash_to_mcaptop 15%1511.0156+38.5%53.2%0.416+41.4%+31.1%
4net_cash_to_mcaptop 20%2014.6193+34.5%51.8%0.386+36.0%+30.3%
5net_cash_to_mcapabove0.521.2292+33.2%51.0%0.379+35.8%+28.9%
6net_cash_to_mcaptop 30%3021.6276+28.3%48.6%0.328+29.9%+24.5%
7net_cash_to_mcapabove0.330.4386+27.1%48.2%0.315+29.3%+23.4%
8net_cash_to_mcapabove0.236.1427+25.7%47.5%0.301+27.7%+22.0%
9net_cash_to_mcaptop 50%5035.8422+23.5%46.4%0.279+22.8%+25.1%
10net_cash_to_mcapabove0.144.0493+23.0%46.2%0.273+23.3%+22.4%
11shares_growth_1ybelow0.2041.9483+14.6%42.2%0.181+12.9%+18.2%
12shares_growth_1ybelow0.1033.9387+13.6%41.9%0.170+11.8%+17.1%
13issuance_to_mcapbelow0.09.9106+13.5%43.4%0.169+18.1%+1.8%
14shares_growth_1ybelow0.5054.2605+13.1%41.0%0.161+12.9%+13.6%
15shares_growth_1ybottom 75%7553.2600+12.9%41.0%0.159+11.5%+16.2%

Metric Rankings (best single-metric Sharpe)

  1. net_cash_to_mcap — Sharpe 0.649 (top 5%), dominates all other metrics by a wide margin
  2. shares_growth_1y — Sharpe 0.181 (≤20% growth), modest but consistent IS/OOS
  3. issuance_to_mcap — Sharpe 0.169 (≤0%), but poor OOS (+1.8% vs +18.1% IS)
  4. cash_to_debt — Sharpe 0.133 (≥2.0), minimal improvement over baseline
  5. debt_to_mcap — Sharpe 0.031 (≤0.05), worse than baseline — low-debt stocks underperform

Underperforming filters

  • cash_to_debt: Nearly all thresholds produce Sharpe 0.10-0.13, barely different from baseline 0.126. The metric is too skewed (median 6.5x) to be discriminative.
  • debt_to_mcap: All thresholds below baseline Sharpe. Requiring low debt actually hurts returns — possibly because some leveraged biotechs with debt (from convertible notes near catalysts) are profitable trades.
  • issuance_to_mcap below 0.05/0.1: These ranges produce negative or near-zero mean returns, worse than baseline. The below 0.0 threshold (net buyback) is small but has IS/OOS divergence.

Stage 2B: Two-Filter Combinations

10 combinations of best-per-metric configs tested.

ComboUnivTradesMean RetSharpe
net_cash_to_mcap + debt_to_mcap3.852+52.0%0.598
net_cash_to_mcap + cash_to_debt3.243+48.3%0.560
net_cash_to_mcap + shares_growth_1y2.738+44.8%0.540
shares_growth_1y + issuance_to_mcap7.886+15.7%0.195
cash_to_debt + shares_growth_1y26.5309+14.8%0.186
debt_to_mcap + shares_growth_1y40.2451+11.8%0.147
debt_to_mcap + issuance_to_mcap9.5102+11.1%0.139
cash_to_debt + issuance_to_mcap6.274+10.9%0.134
cash_to_debt + debt_to_mcap47.6520+10.0%0.123

No combination beats the best single net_cash_to_mcap filter. Adding a second filter to net_cash_to_mcap reduces universe size and trade count without meaningfully improving Sharpe.

Stage 3: Portfolio Simulation

Top 5 configs with portfolio-level deduplication (10% per position, max 10 concurrent, 90d cooldown).

#ConfigUnivRaw TradesPort TradesTotal ReturnMax DDIS ReturnOOS Return
1BASELINE71.4787162-37.8%-86.3%+48.8%-35.3%
2top 5% cash/mcap4.05550+1,015%-14.2%+436%+109%
3top 10% cash/mcap7.610792+2,164%-27.6%+1,076%+114%
4top 15% cash/mcap11.0156108+982%-44.6%+686%+36%
5top 20% cash/mcap14.6193120+1,183%-38.1%+690%+62%

Best portfolio: top 10% cash/mcap — 2.26M, 92 trades, -27.6% max DD, strong OOS (+114%).

Key Findings

  1. net_cash_to_mcap is the dominant filter — it outperforms every other candidate by 2-5x on Sharpe. The top 5-15% percentile range is the sweet spot. This confirms and strengthens the v5 finding.

  2. shares_growth_1y is the only other useful metric — filtering for ≤10-20% annual dilution provides modest improvement (Sharpe 0.17-0.18 vs 0.126 baseline). Importantly, IS/OOS consistency is good (+12.9% IS / +18.2% OOS at ≤20%), suggesting this captures a real effect: heavily diluted biotechs underperform.

  3. cash_to_debt and debt_to_mcap are not useful — the debt-based metrics add no alpha. debt_to_mcap actually hurts performance, possibly because convertible-note-funded biotechs near catalysts are good trades.

  4. issuance_to_mcap is unreliable — the only threshold that beats baseline (≤0, net buyback) has severe IS/OOS divergence (18.1% vs 1.8%), and the universe is too small (9.9 avg).

  5. Combinations don’t help — pairing net_cash_to_mcap with any other filter just reduces trade count without improving risk-adjusted returns.

Recommendations

  1. Keep net_cash_to_mcap top 10-15% as the primary filter (confirms v5). The top 10% provides the best portfolio result with good OOS stability.

  2. Consider adding shares_growth_1y ≤ 20% as a soft secondary filter — it improves mean return modestly (+14.6% vs +10.3%) with good OOS consistency. However, when combined with net_cash_to_mcap, the marginal benefit disappears (combo Sharpe 0.540 < solo 0.649), so it’s only useful if replacing the cash/mcap filter, not supplementing it.

  3. Do not add debt-based filters (cash_to_debt, debt_to_mcap). They reduce the universe without improving returns.

  4. Do not add issuance_to_mcap. Poor IS/OOS stability and small universe.

  5. Next step: Test shares_growth_1y as a filter for the entry signal rather than universe — e.g., skip signals on stocks that diluted >50% in the past year. This would be a signal-level filter rather than universe-level, potentially more targeted.

Output Files

FileDescription
run_grid_search_v8.pyRunner script
run_meta.jsonRun metadata
stage1_metric_distributions.csvRaw metric values for all sampled symbol-dates
stage1_coverage_stats.jsonCoverage and percentile stats per metric
stage2_filter_sweep.csvAll 34 single-filter configs with metrics
stage2b_combo_results.csvTwo-filter combination results
stage3_portfolio_results.csvPortfolio simulation for top 5
filter_impact_sharpe.pngSharpe by metric and threshold
universe_vs_sharpe.pngUniverse size vs Sharpe scatter
is_vs_oos.pngIn-sample vs out-of-sample returns