Bivar Capital — Quantitative Research

Germany MomentumParameter sensitivity analysis

One-at-a-time sweeps across momentum lookback, market cap filter, regime window, portfolio size, liquidity, fundamental filter and costs, plus calendar-year returns and rolling 3-year performance, behind the Germany XETRA momentum strategy. 2000–2026, 319 months. This run is the live configuration: German-domiciled companies only, top 10 equal weight, DAX vs MA200, 40bps round-trip, no liquidity filter. All numbers from an independent harness that reproduces the adversarial audit's Section C.2 to the decimal. Data caveat from the delisting forensics: recorded deaths in the XETRA dataset are thin before 2015, so pre-2015 results carry survivorship risk.

I. Baseline (live config)

12M lookback · skip 0 · mcap top 70% (P30) · N=10 equal weight · DAX vs MA200 · 40bps · no fundamental filter · no liquidity filter — CAGR +19.14%, Sharpe 0.716, Sortino 1.34, MaxDD -39.1%.

Every sweep below moves one dimension and holds the rest at that baseline.

II. Momentum Lookback × Skip

LookbackSkipSharpeSortinoCAGRMaxDD
3Mskip 00.4911.17+18.11%-48.0%
3Mskip 10.5891.27+18.62%-52.3%
6Mskip 00.6041.40+19.47%-31.5%
6Mskip 10.5141.07+16.09%-38.2%
9Mskip 00.6041.28+18.91%-39.4%
9Mskip 10.6011.12+16.31%-37.0%
12Mskip 00.7161.34+19.14%-39.1%
12Mskip 10.7221.34+18.76%-32.3%

12M with no skip is the peak and the neighbourhood holds up; short lookbacks degrade materially.

III. Market Cap Filter

UniverseSharpeSortinoCAGRMaxDD
no filter0.5591.09+17.05%-46.6%
top 90% (P10)0.4930.95+15.18%-44.1%
top 70% (P30)0.7161.34+19.14%-39.1%
top 50% (P50)0.7161.32+18.12%-31.1%
top 30% (P70)0.5991.04+14.66%-26.2%

IV. Regime Filter Window

WindowSharpeSortinoCAGRMaxDD
MA500.4330.74+12.53%-53.7%
MA750.5110.90+14.45%-48.2%
MA1000.6381.15+17.40%-51.5%
MA1250.6841.28+18.38%-40.2%
MA1500.7011.36+18.67%-42.8%
MA2000.7161.34+19.14%-39.1%
MA2500.6171.09+17.26%-41.7%
MA3000.5330.91+15.47%-52.6%
MA200 ±2% hysteresis0.7201.34+19.27%-32.5%

Sharpe rises monotonically from MA50 to MA200 and falls away on both sides — a plateau, not an isolated peak. A ±2% hysteresis band around MA200 trades a little CAGR for a materially shallower drawdown.

V. Portfolio Size (N)

NSharpeSortinoCAGRMaxDD
50.2740.45+10.82%-59.8%
70.5661.03+17.71%-46.4%
100.7161.34+19.14%-39.1%
150.7941.46+18.03%-33.1%
200.8991.73+19.00%-27.8%
250.9191.76+18.22%-24.4%
301.0191.98+18.66%-25.0%

N=20 is the better configuration on this evidence — Sharpe 0.899 against 0.716 and MaxDD −27.8% against −39.1%, for essentially the same CAGR — and the adversarial audit reached the same verdict. We run N=10 anyway, for practicality: twenty positions is a lot of book to turn over every month, and the ten that N=20 adds are largely the ones that cannot be filled. On 2026-09-20, four of ranks 11–20 traded under €42k a day, Nuernberger at €1,201 against €1.43B of market cap. The cost of that choice is stated plainly above: eleven points of drawdown.

VI. Liquidity Floor (diagnostic)

ADV floorSharpeSortinoCAGRMaxDD
none0.7161.34+19.14%-39.1%
€25,000/day0.6821.25+18.12%-31.5%
€50,000/day0.7491.40+19.44%-35.3%
€100,000/day0.6631.24+17.60%-29.9%
€250,000/day0.5670.97+14.46%-35.6%
€500,000/day0.5961.03+14.79%-32.4%
€1,000,000/day0.5090.83+12.76%-30.8%

The live signal computes a 60-day average euro volume for every name and prints it beside the rank, but does not filter on it: whether a name is buyable depends on position size and on how the order is worked, which is decided at execution. The sweep is kept as a diagnostic. Note it is not monotone at N=10 — with ten names drawn from roughly 270, moving the floor swaps one or two holdings and the result moves with them.

VII. Fundamental Filter

FilterSharpeSortinoCAGRMaxDD
None (live config)0.7161.34+19.14%-39.1%
NetIncome(TTM)>00.8591.59+18.04%-29.9%
EBIT(TTM)>00.8951.71+18.33%-28.1%
GrossProfit(TTM)>00.7761.41+16.70%-28.1%
ROE(TTM)>00.8381.55+17.52%-28.7%

Every profitability screen lifts Sharpe and cuts the drawdown at a small cost in CAGR. None is applied live; the live config is the unfiltered row.

VIII. Transaction Costs

Round-trip costSharpeSortinoCAGRMaxDD
0bps RT0.7941.51+20.89%-36.5%
40bps RT0.7161.34+19.14%-39.1%
100bps RT0.6021.10+16.56%-42.9%
200bps RT0.4160.73+12.38%-48.7%

Each 10bps of round-trip cost is worth roughly 0.6pp of CAGR at this turnover. The 40bps assumption is a measurement, not a guess: real IBKR spreads across the German universe had a median of 35bps.

IX. Calendar-Year Returns vs DAX

YearStrategyDAXExcess
2000+21.1%-7.5%+28.6pp
2001-2.0%-19.8%+17.8pp
2002-0.1%-43.9%+43.8pp
2003+58.3%+37.1%+21.2pp
2004+33.3%+7.3%+26.0pp
2005+45.7%+27.1%+18.6pp
2006+42.3%+22.0%+20.3pp
2007-1.3%+22.3%-23.6pp
2008-18.2%-40.4%+22.2pp
2009+34.3%+23.8%+10.5pp
2010+37.0%+16.1%+20.9pp
2011-16.8%-14.7%-2.1pp
2012+36.8%+29.1%+7.7pp
2013+68.0%+25.5%+42.5pp
2014+2.3%+2.7%-0.4pp
2015+46.9%+9.6%+37.3pp
2016+2.1%+6.9%-4.8pp
2017+69.7%+12.5%+57.2pp
2018+8.2%-18.3%+26.5pp
2019+47.1%+25.5%+21.6pp
2020+18.7%+3.5%+15.2pp
2021+12.6%+15.8%-3.2pp
2022-7.9%-12.3%+4.4pp
2023-16.2%+20.3%-36.5pp
2024+37.8%+18.8%+19.0pp
2025+48.4%+23.0%+25.4pp
2026-18.4%+4.7%-23.1pp

20 of 27 years beat the DAX.

X. Rolling 3-Year Performance

Mean +21.2%, range -10.5% to +62.1%, negative in 8.1% of all 3-year windows.

XI. Limitations

  1. Pre-2015 is survivors-only (zero delistings in the dataset before 2015; externally verified complete from 2018).
  2. All sweeps are in-sample over the same 2000–2026 history; the plateaus, not the peaks, are the evidence.
  3. One-at-a-time sweeps miss interactions.
  4. N=10 is the practical choice, not the optimal one — see Section V.
  5. Sub-EUR-2M capacity; median position ADV ~€0.4M/day.