Two related improvements to the optimization-report parser:
1. Generic column typing — drop the hardcoded 'InpUseNewsFilter'
branch in parse_passes. Now the SpreadsheetML first body row's
<Data ss:Type='String'> marks a column as string (boolean Inp*
rendered as 'true'/'false' stays str); everything else is numeric
(Int64 when whole-numbered, float64 otherwise). No Inp* name is
referenced, so the parser handles any EA's parameter naming.
2. Generic param detection — _param_cols now returns every column
AFTER 'Trades' by position, not by Inp* prefix. Real exports don't
always use the Inp prefix; per user, 'Trades 以后的列数至少有一列,
但数量不定, 它们都是加入优化的输入参数'.
3. New 'outliers' subcommand — per-pass z-score scan over the 8
performance metrics (Result, Profit, Expected Payoff, Profit
Factor, Recovery Factor, Sharpe Ratio, Custom, Equity DD %).
Splits passes into two disjoint sets sorted by Result desc:
- Set A: at least one metric with |z|>=σ in the favourable
direction (higher-is-better metrics: z>=+σ; Equity DD %
uses z<=-σ because low DD is good).
- Set B: no performance-metric outlier.
Both sets EXCLUDE passes whose Trades count is itself a low-side
outlier (z<=-σ) — too few trades to trust. Excluded list shown
separately. Default σ=2, top 10 outliers / top 5 normal;
--sigma / --top-outliers / --top-normal / --json flags.
Output prints a per-metric mean/std/±σ reference table, then
each record split into Metrics group + Params group with the
outlier σ values annotated. Style mirrors the windows subcommand
in parse_tester_report.py.
Verified on jobs/246753 (432 passes, OneShotGold XAUUSD H4): 44 Set A
passes, 382 Set B, 6 excluded low-Trades passes, all 13 ad-hoc
verification assertions pass.