Small-Cap-Engagement und Kapazität eines US-Aktien-Signals
Zusammenfassung
Dieses Experiment untersucht, wie stark ein ausgewähltes monatliches US-Long-Short-Aktiensignal von Small-Cap-Aktien abhängt. Ein verzögerter Filter nach Marktkapitalisierung entfernt das kleinste Quartil aus den Validierungsprognosen; anschließend werden dieselben Portfolioaufbau- und Kostenannahmen ohne erneutes Modelltraining angewendet. Das gefilterte Anlageuniversum enthält weniger Vermögenswerte, während der Portfolio-Umschlag nahe am Ergebnis des vollständigen Universums bleibt.
Die ausgewiesene Sharpe Ratio fällt von 4.27 auf 2.24, der Informationskoeffizient sinkt von 0.074 auf 0.048 und der maximale Drawdown vertieft sich von etwa 15% auf 52%. Das Dokument wertet dies als Beleg dafür, dass sowohl Signalqualität als auch Diversifikation schwächer werden, wenn kleinere Unternehmen ausgeschlossen werden. Dies verstärkt Bedenken, dass Kostenannahmen für ein breites Universum die Umsetzungskosten unterschätzen könnten. Es handelt sich um Validierungsergebnisse eines Filters auf Signalebene; sie zeigen nicht, wie ein auf das eingeschränkte Universum neu trainiertes Modell abschneiden würde. Die kürzere Vermögenswertliste schränkt außerdem die Aussagekraft von Schlussfolgerungen zur umsetzbaren Kapazität ein.
Kernaussagen
- Der Ausschluss des kleinsten Quartils nach Marktkapitalisierung verringert die ausgewiesene Validierungs-Sharpe-Ratio und den Informationskoeffizienten deutlich.
- Das Experiment filtert bestehende Prognosen und trainiert das Modell nicht erneut auf dem eingeschränkten Universum.
- Der maximale Drawdown verschlechtert sich nach dem Filter, was mit einer geringeren querschnittlichen Diversifikation vereinbar ist.
- Ein ähnlicher Portfolio-Umschlag vor und nach der Filterung deutet darauf hin, dass der Portfolioaufbau insgesamt vergleichbar bleibt.
- Ein neu trainiertes Modell wäre erforderlich, um festzustellen, ob es bei Aktien mit höherer Marktkapitalisierung stärkere Signale finden könnte.
Schlagwörter
Volltext
# run_us_firm_characteristics_20260504T225521.json
```json
{
"model": "deepseek/deepseek-v4-pro",
"case_study": "us_firm_characteristics",
"sandbox": "/tmp/us_firms_operator_sandbox_20260504T225504",
"iterations": 27,
"total_in_tokens": 1870480,
"total_out_tokens": 11571,
"final_summary": "## \u00a720.9 Next Step Executed: Top-3-Quartile Market-Cap Filter\n\n### What I Did\nFiltered the validation predictions from the rank-1 model (gbm/leaves_63_binary, `fwd_class_1m`, prediction_hash=`eeadf802c9ab`) to **exclude the bottom quartile by lagged market equity (LME)** at each monthly rebalance date, then re-ran the **identical backtest spec** (`cross_sectional_percentile`, percentile=95, top_k=20, long-short, era-dependent costs at 7.5+5 bps/leg) that produced the chapter's baseline Sharpe of 4.27.\n\nThis was a **signal-level filter only** \u2014 no retraining. The LME data came from `features/financial.parquet` column `LME`.\n\n### Results\n\n| Metric | Baseline (full universe) | Top-3-Quartile Mcap | Delta |\n|--------|--------------------------|---------------------|-------|\n| **Sharpe** | 4.27 [3.51, 5.15] | **2.24 [1.55, 3.07]** | **\u22122.03 (\u221248%)** |\n| **Max Drawdown** | \u22120.149 | **\u22120.521** | \u22120.372 |\n| **Turnover** | 1.77 | 1.80 | +0.03 |\n| **IC mean (HAC)** | 0.074 [0.058, 0.091] | **0.048 [0.032, 0.064]** | \u22120.026 (\u221235%) |\n| **IC t(HAC)** | 8.73 | 5.77 | \u22122.95 |\n| **IC IR** | 1.02 | 0.63 | \u22120.39 |\n| **Assets/period** | 2,291 | 1,718 | \u221225% |\n| **IC % positive** | 88% | 73% | \u221215pp |\n\n### Interpretation\n\n1. **Sharpe does NOT survive intact.** Removing bottom-quartile small-cap stocks cuts the strategy Sharpe roughly in half (4.27 \u2192 2.24). This confirms the chapter's binding-constraint claim: the long and short legs both cluster in small-cap names, and universe-mean cost assumptions materially understate the friction floor.\n\n2. **Sharpe does survive in absolute terms.** The filtered Sharpe of 2.24 [1.55, 3.07] is still strongly positive and statistically distinguishable from zero. The strategy has genuine alpha even after a realistic capacity filter.\n\n3. **IC drop explains the Sharpe drop.** The upstream IC fell from 0.074 to 0.048 \u2014 consistent with the Fundamental Law: smaller universe = fewer independent bets = lower IR. The IC remains credible (t=5.77, CI excludes zero), but the erosion is material.\n\n4. **Max drawdown deepens dramatically** (\u221215% \u2192 \u221252%), consistent with fewer stocks providing less diversification within each leg.\n\n5. **Turnover is unchanged** (1.77 \u2192 1.80), as expected for a signal-level filter that doesn't change the portfolio construction logic.\n\n### Skills Used\n- `run-backtest` (ml4t-backtest): event-driven backtest with era-dependent costs\n- `information-coefficient` (ml4t-diagnostic): HAC-adjusted IC, IC_IR\n- `deflated-sharpe` (ml4t-diagnostic): PSR p-value via bootstrap\n- `registry-system`: content-addressed experiment tracking\n\n### Honest Recommendation\nThe rank-1 Sharpe of 4.27 is **partially a small-cap artifact**. Under realistic capacity constraints (top-3-quartile mcap only), the Sharpe lands at ~2.2 \u2014 still viable, but the chapter's \"friction floor\" analysis (\u00a720.1 binding constraint) is validated. A follow-up experiment should retrain on the filtered universe (not just signal-filter) to see if the model learns to find alpha in larger-cap names.\n",
"trace": [
{
"turn": 1,
"type": "tool_call",
"name": "read_file",
"args": {
"path": "/tmp/us_firms_operator_sandbox_20260504T225504/us_firm_characteristics/README.md"
},
"result": {
"path": "/tmp/us_firms_operator_sandbox_20260504T225504/us_firm_characteristics/README.md",
"size_bytes": 7843,
"truncated": false,
"content": "# Case Study: US Firm Characteristics\n\nThis case study uses anonymized monthly firm characteristics from NASDAQ Data Link to test the canonical factor investing question: can ML improve on traditional long-short decile sorts when point-in-time accounting lags, survivorship bias, and era-dependent transaction costs are treated as binding constraints. With 57 firm-level characteristics spanning valuation, profitability, momentum, and risk across roughly 2,500 stocks (1996\u20132016), this is the most feature-rich fundamental dataset in the book and the natural home for latent factor models.\n\nThe case study runs at monthly cadence with a 6-month accounting lag enforced for point-in-time compliance, equal-weight long-short decile portfolios, dollar-neutral construction, and an era-dependent cost grid (pre-decimalization spreads 15\u201330 bps; post-2001 spreads 5\u201315 bps). Ten CV folds with 10-year training windows and 1-year validation provide the deepest cross-validation in the book; the calendar 2016 holdout supplies 12 monthly out-of-sample observations.\n\nThe teaching arc threads four claims that must be evaluated jointly: regression-vs-classification labels move IC by an order of magnitude on the same features, GBM and the supervised autoencoder both produce credible standalone signals while linear and IPCA do not, holdout decay over 12 periods is consistent with material erosion under wide CIs rather than a precise estimate, and the long-short legs cluster in small-cap, wide-spread, high-idio-vol names so the universe-mean cost grid understates the friction the strategy actually faces.\n\n## At a Glance\n\n| Property | Value |\n|----------|-------|\n| Asset Class | US equities (fundamental characteristics, long-short) |\n| Frequency | Monthly |\n| Universe | ~2,500 stocks (price > $5, ADV > $1M) |\n| History | 1996\u20132016 |\n| Primary Label | fwd_ret_1m |\n| CV Folds | 10 (10Y train, 1Y val) |\n| Cost Model | Material (5\u201320 bps per leg, era-dependent) |\n\n## Pipeline\n\n| Stage | Notebook | Chapter | Description |\n|-------|----------|---------|-------------|\n| Setup | [`01_setup`](01_setup.ipynb) | Ch6 | Monthly decision cadence, 6-month accounting lag, long-short decile protocol |\n| Labels | [`02_labels`](02_labels.ipynb) | Ch7 | 1-month forward returns with winsorized regression and median-split classification variants |\n| Features | [`03_financial_features`](03_financial_features.ipynb) | Ch8 | 57 firm characteristics across value, quality, momentum, risk, and investment families |\n| Evaluation | [`04_evaluation`](04_evaluation.ipynb) | Ch7\u20139 | HAC-adjusted feature IC with FDR control across the characteristic panel |\n| Linear | [`05_linear`](05_linear.ipynb) | Ch11 | Ridge, LASSO, ElasticNet, and logistic baselines on the characteristic matrix |\n| GBM | [`06_gbm`](06_gbm.ipynb) | Ch12 | LightGBM testing non-linear value-quality-momentum interactions |\n| Tabular DL | [`07_tabular_dl`](07_tabular_dl.ipynb) | Ch12 | TabM rank-1 adapter MLP ensemble on the flat characteristic matrix |\n| Latent Factors | [`08_latent_factors`](08_latent_factors.ipynb) | Ch14 | IPCA, CAE, SDF, and SAE factor extraction on the characteristic panel |\n| Causal DML | [`09_causal_dml`](09_causal_dml.ipynb) | Ch15 | Does 12-month momentum cause future returns under FF5 confounder controls? |\n| Model Analysis | [`10_model_analysis`](10_model_analysis.ipynb) | n/a | Cross-family IC comparison, conformal coverage, fold-stability diagnostics |\n| Backtest | [`11_backtest`](11_backtest.ipynb) | Ch16 | Long-short decile strategy simulation across the prediction-signal sweep |\n| Portfolio | [`12_portfolio_management`](12_portfolio_management.ipynb) | Ch17 | Allocator and concentration sweep on the deep cross-section |\n| Costs | [`13_costs`](13_costs.ipynb) | Ch18 | Era-dependent cost grid spanning pre- and post-decimalization |\n| Risk | [`14_risk_management`](14_risk_management.ipynb) | Ch19 | Position-level and portfolio-level risk overlays on the monthly cadence |\n| Strategy Analysis | [`15_strategy_analysis`](15_strategy_analysis.ipynb) | Ch20 | End-to-end strategy assessment with uncertainty-aware metrics |\n\n## Key Results\n\nA high-Sharpe validation result whose holdout decay carries wide CIs by construction (12 monthly observations) and whose deployable edge is bounded by the small-cap concentration of the selected legs.\n\n**Signal direction**: The configuration with the highest validation Sharpe (gbm/leaves_63_binary on the classification variant `fwd_class_1m`) carries upstream IC +0.084 [+0.063, +0.104] (HAC t\u22488.1) on the underlying classification scores. On the regression label `fwd_ret_1m`, gbm/leaves_15_mae and the supervised autoencoder (sae) both clear HAC credibility (IC \u2248+0.080 and \u2248+0.062 with CIs that exclude zero), while linear, IPCA, and CAE straddle zero or sit on the negative side. Across families the evidence favors classification labels and supervised non-linear extractors over linear regression on raw returns.\n\n**Strategy-stage performance with CIs**: Validation Sharpe 4.27 [3.51, 5.15] (PSR p\u22480). Selection-adjusted DSR is 0.71 (p\u22480) across 60 backtests in the validation sweep, with the configuration sitting well above the expected-max Sharpe of 0.52: selection-adjusted edge is statistically distinguishable from zero on the positive side. PBO and reality-check are not registered for this lineage; DSR alone carries the per-CS selection-adjustment burden.\n\n**Holdout closure**: The retrain pairs against the validation lineage by training_hash. Within-lineage val\u2192ho Sharpe diff \u22124.03 [\u22129.82, +0.13] (p=0.0875): the upper bound just crosses zero on a 12-period truncated draw, classifying as straddles_zero, but the asymmetry and prob_challenger_wins=0.027 are consistent with material decay rather than a wide null. The strategy versus equal-weight holdout-window benchmark Sharpe diff is +0.95 [\u22123.10, +6.32] (p=0.63), statistically indistinguishable from random allocation in the holdout window (the 2016 EW Sharpe of 1.41 is unusually high).\n\n**Friction floor**: Across the protocol per-leg range (5\u201320 bps) the lineage Sharpe stays strongly positive. The extended grid (0\u2013500 bps one-way \u00d7 10\u2013100% turnover) quantifies the binding constraint: both the long and short legs cluster at small-cap (LME negative), wide-spread, and high-idio-vol names, so universe-mean spreads understate execution costs. At micro-cap-realistic spreads (200+ bps one-way) the gross profile collapses materially. This is a capacity-binding constraint and an input to Ch20's cost-survival aggregation, not a kill condition on the validation result.\n\n## Running\n\n```bash\n# From repo root\nuv run python case_studies/us_firm_characteristics/01_setup.py\nuv run python case_studies/us_firm_characteristics/02_labels.py\nuv run python case_studies/us_firm_characteristics/03_financial_features.py\nuv run python case_studies/us_firm_characteristics/04_evaluation.py\nuv run python case_studies/us_firm_characteristics/05_linear.py\nuv run python case_studies/us_firm_characteristics/06_gbm.py\nuv run python case_studies/us_firm_characteristics/07_tabular_dl.py\nuv run python case_studies/us_firm_characteristics/08_latent_factors.py\nuv run python case_studies/us_firm_characteristics/09_causal_dml.py\nuv run python case_studies/us_firm_characteristics/10_model_analysis.py\nuv run python case_studies/us_firm_characteristics/11_backtest.py\nuv run python case_studies/us_firm_characteristics/12_portfolio_management.py\nuv run python case_studies/us_firm_characteristics/13_costs.py\nuv run python case_studies/us_firm_characteristics/14_risk_management.py\nuv run python case_studies/us_firm_characteristics/15_strategy_analysis.py\n```\n\n## Run Log\n\nModel training runs, predictions, and backtest results are tracked in a content-addressed registry under `run_log/registry.db`.\n"
}
},
{
"turn": 1,
"type": "tool_call",
"name": "list_skills",
"args": {
"category": "backtest"
},
"result": {
"category": "backtest",
"n_skills": 5,
"skills": [
{
"name": "ml4t-cost-model",
"category": "backtest",
"path": "~/ml4t/skills/backtest/cost-model/SKILL.md",
"description": "Commission, slippage, and market-impact cost models for realistic strategy simulation. Use when backtesting to ensure P&L accounts for transaction costs.",
"library": "ml4t-backtest"
},
{
"name": "ml4t-rl-execution",
"category": "backtest",
"path": "~/ml4t/skills/backtest/rl-execution/SKILL.md",
"description": "Reinforcement learning for trade execution and hedging. Use when optimizing execution algorithms or dynamic hedging policies.",
"library": "ml4t-backtest"
},
{
"name": "ml4t-run-backtest",
"category": "backtest",
"path": "~/ml4t/skills/backtest/run-backtest/SKILL.md",
"description": "Event-driven backtesting with realistic order execution, position tracking, and performance measurement. Use when simulating a trading strategy on historical data.",
"library": "ml4t-backtest"
},
{
"name": "ml4t-sensitivity-analysis",
"category": "backtest",
"path": "~/ml4t/skills/backtest/sensitivity-analysis/SKILL.md",
"description": "Test strategy robustness to parameter variation and detect overfitting cliffs. Use when validating that performance is stable across parameter perturbations.",
"library": "ml4t-backtest"
},
{
"name": "ml4t-tearsheet",
"category": "backtest",
"path": "~/ml4t/skills/backtest/tearsheet/SKILL.md",
"description": "Generate comprehensive performance reports from backtest returns. Use when summarizing backtest results for review or comparison.",
"library": "ml4t-backtest"
}
]
}
},
{
"turn": 1,
"type": "tool_call",
"name": "list_skills",
"args": {
"category": "infrastructure"
},
"result": {
"category": "infrastructure",
"n_skills": 4,
"skills": [
{
"name": "ml4t-canonical-schema",
"category": "infrastructure",
"path": "~/ml4t/skills/infrastructure/canonical-schema/SKILL.md",
"description": "Standardized data schema across all financial datasets. Use when defining or enforcing column names, types, and index conventions.",
"library": "ml4t-data"
},
{
"name": "ml4t-case-study-pipeline",
"category": "infrastructure",
"path": "~/ml4t/skills/infrastructure/case-study-pipeline/SKILL.md",
"description": "Filesystem and artifact-contract pattern for reproducible case studies. Use when organizing a research project for reproducibility and collaboration.",
"library": ""
},
{
"name": "ml4t-polars-patterns",
"category": "infrastructure",
"path": "~/ml4t/skills/infrastructure/polars-patterns/SKILL.md",
"description": "Polars-first data processing patterns for financial data. Use when writing efficient grouped, windowed, or lazy-evaluated data transformations.",
"library": ""
},
{
"name": "ml4t-registry-system",
"category": "infrastructure",
"path": "~/ml4t/skills/infrastructure/registry-system/SKILL.md",
"description": "Content-addressed experiment tracking for ML trading models. Use when versioning models, features, or experiment artifacts for reproducibility.",
"library": ""
}
]
}
},
{
"turn": 2,
"type": "tool_call",
"name": "list_skills",
"args": {
"category": "concepts"
},
"result": {
"category": "concepts",
"n_skills": 10,
"skills": [
{
"name": "ml4t-backtest-overfitting",
"category": "concepts",
"path": "~/ml4t/skills/concepts/backtest-overfitting/SKILL.md",
"description": "Detect and prevent overfitting to historical data via multiple testing corrections and pre-registration. Use when evaluating strategy variants to ensure performance is not a data-mining artifact.",
"library": "ml4t-diagnostic"
},
{
"name": "ml4t-causal-identification",
"category": "concepts",
"path": "~/ml4t/skills/concepts/causal-identification/SKILL.md",
"description": "Validate causal claims using DAG adjustment sets, bad-control detection, and refutation tests. Use when distinguishing genuine factor effects from confounded associations.",
"library": ""
},
{
"name": "ml4t-data-leakage",
"category": "concepts",
"path": "~/ml4t/skills/concepts/data-leakage/SKILL.md",
"description": "Prevent train-test contamination, target leakage, and temporal leakage. Use when splitting data, fitting preprocessors, or engineering features for time-series ML.",
"library": "ml4t-diagnostic"
},
{
"name": "ml4t-information-coefficient",
"category": "concepts",
"path": "~/ml4t/skills/concepts/information-coefficient/SKILL.md",
"description": "Measure predictive signal quality with IC, Rank IC, and IC_IR. Use when evaluating whether a feature has predictive power for returns.",
"library": "ml4t-diagnostic"
},
{
"name": "ml4t-lookahead-bias",
"category": "concepts",
"path": "~/ml4t/skills/concepts/lookahead-bias/SKILL.md",
"description": "Detect future information leaking into features, labels, or evaluation. Use when any pipeline step might expose data not yet available at prediction time.",
"library": "ml4t-diagnostic"
},
{
"name": "ml4t-non-stationarity",
"category": "concepts",
"path": "~/ml4t/skills/concepts/non-stationarity/SKILL.md",
"description": "Handle changing statistical properties in financial time series. Use when features or model performance degrade over time.",
"library": "ml4t-diagnostic"
},
{
"name": "ml4t-point-in-time",
"category": "concepts",
"path": "~/ml4t/skills/concepts/point-in-time/SKILL.md",
"description": "Ensure data reflects what was known at each decision point, not revised or restated values. Use when joining fundamental, macro, or alternative data to price series.",
"library": "ml4t-data"
},
{
"name": "ml4t-regime-awareness",
"category": "concepts",
"path": "~/ml4t/skills/concepts/regime-awareness/SKILL.md",
"description": "Market regimes as conditioning features for risk scaling, not timing signals. Use when incorporating regime detection into strategy logic.",
"library": "ml4t-engineer"
},
{
"name": "ml4t-survivorship-bias",
"category": "concepts",
"path": "~/ml4t/skills/concepts/survivorship-bias/SKILL.md",
"description": "Account for delisted and removed securities in historical analysis. Use when constructing universes or computing cross-sectional features to avoid survivor-only inflation.",
"library": "ml4t-data"
},
{
"name": "ml4t-transaction-costs",
"category": "concepts",
"path": "~/ml4t/skills/concepts/transaction-costs/SKILL.md",
"description": "Estimate whether a strategy can survive spread, slippage, and market impact before full simulation. Use when screening strategy feasibility early.",
"library": ""
}
]
}
},
{
"turn": 2,
"type": "tool_call",
"name": "list_skills",
"args": {
"category": "validation"
},
"result": {
"category": "validation",
"n_skills": 8,
"skills": [
{
"name": "ml4t-cpcv",
"category": "validation",
"path": "~/ml4t/skills/validation/cpcv/SKILL.md",
"description": "Combinatorial Purged CV generates a distribution of backtest paths instead of a single estimate. Use when quantifying strategy robustness and overfitting probability.",
"library": "ml4t-diagnostic"
},
{
"name": "ml4t-deflated-sharpe",
"category": "validation",
"path": "~/ml4t/skills/validation/deflated-sharpe/SKILL.md",
"description": "Adjust the Sharpe ratio for multiple testing bias when selecting from many trials. Use when reporting strategy performance after parameter or model search.",
"library": "ml4t-diagnostic"
},
{
"name": "ml4t-drift-detection",
"category": "validation",
"path": "~/ml4t/skills/validation/drift-detection/SKILL.md",
"description": "Detect when model inputs or predictions shift from the training distribution using PSI and statistical tests. Use when monitoring deployed models or diagnosing performance degradation.",
"library": "ml4t-diagnostic"
},
{
"name": "ml4t-evaluate-factor",
"category": "validation",
"path": "~/ml4t/skills/validation/evaluate-factor/SKILL.md",
"description": "Evaluate alpha factor quality with IC analysis, quantile spreads, turnover, and decay. Use when deciding whether a signal has enough predictive power to trade.",
"library": "ml4t-diagnostic"
},
{
"name": "ml4t-purging-embargo",
"category": "validation",
"path": "~/ml4t/skills/validation/purging-embargo/SKILL.md",
"description": "Remove training samples whose labels overlap the test period and add an embargo buffer. Use when performing time-series CV to prevent leakage between folds.",
"library": "ml4t-diagnostic"
},
{
"name": "ml4t-shap-analysis",
"category": "validation",
"path": "~/ml4t/skills/validation/shap-analysis/SKILL.md",
"description": "Explain model predictions with SHAP values instead of biased built-in feature importance. Use when interpreting which features drive model decisions.",
"library": "ml4t-diagnostic"
},
{
"name": "ml4t-stationarity-tests",
"category": "validation",
"path": "~/ml4t/skills/validation/stationarity-tests/SKILL.md",
"description": "Test whether time-series features are stationary using ADF and KPSS tests. Use when selecting or transforming features to verify stationarity assumptions for predictive models.",
"library": "ml4t-diagnostic"
},
{
"name": "ml4t-walk-forward-cv",
"category": "validation",
"path": "~/ml4t/skills/validation/walk-forward-cv/SKILL.md",
"description": "Rolling or expanding window CV that preserves temporal order. Use when evaluating ML models on time-series data where standard k-fold causes temporal leakage.",
"library": "ml4t-diagnostic"
}
]
}
},
{
"turn": 2,
"type": "tool_call",
"name": "query_registry",
"args": {
"sql": "SELECT * FROM backtest_runs ORDER BY backtest_timestamp DESC LIMIT 5"
},
"result": {
"error": "OperationalError: no such column: backtest_timestamp"
}
},
{
"turn": 3,
"type": "tool_call",
"name": "query_registry",
"args": {
"sql": "SELECT * FROM backtest_runs LIMIT 5"
},
"result": {
"columns": [
"backtest_hash",
"prediction_hash",
"spec_json",
"stage",
"created_at",
"git_commit",
"started_at",
"elapsed_s"
],
"rows": [
{
"backtest_hash": "07c72c1097f7",
"prediction_hash": "404fd35d733a",
"spec_json": "{\"_runtime_backtest_config\":\"BacktestConfig(allow_short_selling=True, allow_leverage=False, initial_margin=0.5, long_maintenance_margin=0.25, short_maintenance_margin=0.3, fixed_margin_schedule=None, short_cash_policy=<ShortCashPolicy.CREDIT: 'credit'>, execution_price=<ExecutionPrice.OPEN: 'open'>, mark_price=<ExecutionPrice.PRICE: 'price'>, execution_mode=<ExecutionMode.NEXT_BAR: 'next_bar'>, stop_fill_mode=<StopFillMode.STOP_PRICE: 'stop_price'>, stop_level_basis=<StopLevelBasis.FILL_PRICE: 'fill_price'>, trail_hwm_source=<WaterMarkSource.CLOSE: 'close'>, initial_hwm_source=<InitialHwmSource.FILL_PRICE: 'fill_price'>, trail_stop_timing=<TrailStopTiming.LAGGED: 'lagged'>, share_type=<ShareType.FRACTIONAL: 'fractional'>, commission_type=<CommissionType.PERCENTAGE: 'percentage'>, commission_rate=0.00075, commission_per_share=0.0, commission_per_trade=0.0, commission_minimum=0.0, slippage_type=<SlippageType.PERCENTAGE: 'percentage'>, slippage_rate=0.0005, slippage_fixed=0.0, stop_slippage_rate=0.0, initial_cash=1000000.0, cash_buffer_pct=0.0, settlement_delay=0, settlement_reduces_buying_power=True, reject_on_insufficient_cash=True, skip_cash_validation=False, partial_fills_allowed=False, fill_ordering=<FillOrdering.EXIT_FIRST: 'exit_first'>, entry_order_priority=<EntryOrderPriority.SUBMISSION: 'submission'>, next_bar_submission_precheck=False, next_bar_simple_cash_check=False, buying_power_reservation=False, next_bar_queue_shadow_validation=False, immediate_fill=False, rebalance_mode=<RebalanceMode.INCREMENTAL: 'incremental'>, rebalance_headroom_pct=1.0, missing_price_policy=<MissingPricePolicy.SKIP: 'skip'>, late_asset_policy=<LateAssetPolicy.ALLOW: 'allow'>, late_asset_min_bars=1, calendar='NYSE', timezone='UTC', data_frequency=<DataFrequency.DAILY: 'daily'>, enforce_sessions=False, preset_name=None)\",\"backtest_config\":{\"account\":{\"allow_leverage\":false,\"allow_short_selling\":true,\"fixed_margin_schedule\":null,\"initial_margin\":0.5,\"long_maintenance_margin\":0.25,\"short_cash_policy\":\"credit\",\"short_maintenance_margin\":0.3},\"calendar\":{\"calendar\":\"NYSE\",\"data_frequency\":\"daily\",\"enforce_sessions\":false,\"timezone\":\"UTC\"},\"cash\":{\"buffer_pct\":0.0,\"initial\":1000000.0},\"commission\":{\"minimum\":0.0,\"model\":\"percentage\",\"per_share\":0.0,\"per_trade\":0.0,\"rate\":0.00075},\"execution\":{\"execution_mode\":\"next_bar\",\"execution_price\":\"open\",\"mark_price\":\"price\"},\"feed\":{\"ask_col\":null,\"ask_size_col\":null,\"bar_type\":null,\"bid_col\":null,\"bid_size_col\":null,\"calendar\":\"NYSE\",\"close_col\":\"close\",\"data_frequency\":\"daily\",\"entity_col\":\"symbol\",\"high_col\":\"high\",\"low_col\":\"low\",\"mid_col\":null,\"open_col\":\"open\",\"price_col\":\"close\",\"session_start_time\":null,\"timestamp_col\":\"timestamp\",\"timestamp_semantics\":null,\"timezone\":\"UTC\",\"volume_col\":\"volume\"},\"metadata\":{\"cadence\":\"monthly_month_end\",\"case_study\":\"us_firm_characteristics\",\"chapter\":\"ch16\",\"fill_timing\":\"NEXT_BAR_OPEN\",\"prediction_hash\":\"404fd35d733a\",\"preset_path\":\"~/ml4t/code/case_studies/us_firm_characteristics/config/backtest/base.yaml\",\"signal_direction\":\"long_only\"},\"orders\":{\"buying_power_reservation\":false,\"entry_order_priority\":\"submission\",\"fill_ordering\":\"exit_first\",\"immediate_fill\":false,\"late_asset_min_bars\":1,\"late_asset_policy\":\"allow\",\"missing_price_policy\":\"skip\",\"next_bar_queue_shadow_validation\":false,\"next_bar_simple_cash_check\":false,\"next_bar_submission_precheck\":false,\"partial_fills_allowed\":false,\"rebalance_headroom_pct\":1.0,\"rebalance_mode\":\"incremental\",\"reject_on_insufficient_cash\":true,\"skip_cash_validation\":false},\"position_sizing\":{\"share_type\":\"fractional\"},\"settlement\":{\"delay\":0,\"reduces_buying_power\":true},\"slippage\":{\"fixed\":0.0,\"model\":\"percentage\",\"rate\":0.0005,\"stop_rate\":0.0},\"stops\":{\"initial_hwm_source\":\"fill_price\",\"stop_fill_mode\":\"stop_price\",\"stop_level_basis\":\"fill_price\",\"trail_hwm_source\":\"close\",\"trail_stop_timing\":\"lagged\"}},\"chapter\":\"ch16\",\"preset_id\":\"us_firm_characteristics:base\",\"strategy\":{\"rebalance\":{\"cadence\":\"monthly_month_end\",\"mode\":\"vectorized\"},\"signal\":{\"long_short\":true,\"method\":\"equal_weight_top_k\",\"top_k\":5}},\"version\":2}",
"stage": "signal",
"created_at": "2026-04-14T06:43:10.907320+00:00",
"git_commit": "c7fe075",
"started_at": "2026-04-14T06:43:09.601555+00:00",
"elapsed_s": 1.3009738270193338
},
{
"backtest_hash": "8d6107a8065e",
"prediction_hash": "404fd35d733a",
"spec_json": "{\"_runtime_backtest_config\":\"BacktestConfig(allow_short_selling=True, allow_leverage=False, initial_margin=0.5, long_maintenance_margin=0.25, short_maintenance_margin=0.3, fixed_margin_schedule=None, short_cash_policy=<ShortCashPolicy.CREDIT: 'credit'>, execution_price=<ExecutionPrice.OPEN: 'open'>, mark_price=<ExecutionPrice.PRICE: 'price'>, execution_mode=<ExecutionMode.NEXT_BAR: 'next_bar'>, stop_fill_mode=<StopFillMode.STOP_PRICE: 'stop_price'>, stop_level_basis=<StopLevelBasis.FILL_PRICE: 'fill_price'>, trail_hwm_source=<WaterMarkSource.CLOSE: 'close'>, initial_hwm_source=<InitialHwmSource.FILL_PRICE: 'fill_price'>, trail_stop_timing=<TrailStopTiming.LAGGED: 'lagged'>, share_type=<ShareType.FRACTIONAL: 'fractional'>, commission_type=<CommissionType.PERCENTAGE: 'percentage'>, commission_rate=0.00075, commission_per_share=0.0, commission_per_trade=0.0, commission_minimum=0.0, slippage_type=<SlippageType.PERCENTAGE: 'percentage'>, slippage_rate=0.0005, slippage_fixed=0.0, stop_slippage_rate=0.0, initial_cash=1000000.0, cash_buffer_pct=0.0, settlement_delay=0, settlement_reduces_buying_power=True, reject_on_insufficient_cash=True, skip_cash_validation=False, partial_fills_allowed=False, fill_ordering=<FillOrdering.EXIT_FIRST: 'exit_first'>, entry_order_priority=<EntryOrderPriority.SUBMISSION: 'submission'>, next_bar_submission_precheck=False, next_bar_simple_cash_check=False, buying_power_reservation=False, next_bar_queue_shadow_validation=False, immediate_fill=False, rebalance_mode=<RebalanceMode.INCREMENTAL: 'incremental'>, rebalance_headroom_pct=1.0, missing_price_policy=<MissingPricePolicy.SKIP: 'skip'>, late_asset_policy=<LateAssetPolicy.ALLOW: 'allow'>, late_asset_min_bars=1, calendar='NYSE', timezone='UTC', data_frequency=<DataFrequency.DAILY: 'daily'>, enforce_sessions=False, preset_name=None)\",\"backtest_config\":{\"account\":{\"allow_leverage\":false,\"allow_short_selling\":true,\"fixed_margin_schedule\":null,\"initial_margin\":0.5,\"long_maintenance_margin\":0.25,\"short_cash_policy\":\"credit\",\"short_maintenance_margin\":0.3},\"calendar\":{\"calendar\":\"NYSE\",\"data_frequency\":\"daily\",\"enforce_sessions\":false,\"timezone\":\"UTC\"},\"cash\":{\"buffer_pct\":0.0,\"initial\":1000000.0},\"commission\":{\"minimum\":0.0,\"model\":\"percentage\",\"per_share\":0.0,\"per_trade\":0.0,\"rate\":0.00075},\"execution\":{\"execution_mode\":\"next_bar\",\"execution_price\":\"open\",\"mark_price\":\"price\"},\"feed\":{\"ask_col\":null,\"ask_size_col\":null,\"bar_type\":null,\"bid_col\":null,\"bid_size_col\":null,\"calendar\":\"NYSE\",\"close_col\":\"close\",\"data_frequency\":\"daily\",\"entity_col\":\"symbol\",\"high_col\":\"high\",\"low_col\":\"low\",\"mid_col\":null,\"open_col\":\"open\",\"price_col\":\"close\",\"session_start_time\":null,\"timestamp_col\":\"timestamp\",\"timestamp_semantics\":null,\"timezone\":\"UTC\",\"volume_col\":\"volume\"},\"metadata\":{\"cadence\":\"monthly_month_end\",\"case_study\":\"us_firm_characteristics\",\"chapter\":\"ch16\",\"fill_timing\":\"NEXT_BAR_OPEN\",\"prediction_hash\":\"404fd35d733a\",\"preset_path\":\"~/ml4t/code/case_studies/us_firm_characteristics/config/backtest/base.yaml\",\"signal_direction\":\"long_only\"},\"orders\":{\"buying_power_reservation\":false,\"entry_order_priority\":\"submission\",\"fill_ordering\":\"exit_first\",\"immediate_fill\":false,\"late_asset_min_bars\":1,\"late_asset_policy\":\"allow\",\"missing_price_policy\":\"skip\",\"next_bar_queue_shadow_validation\":false,\"next_bar_simple_cash_check\":false,\"next_bar_submission_precheck\":false,\"partial_fills_allowed\":false,\"rebalance_headroom_pct\":1.0,\"rebalance_mode\":\"incremental\",\"reject_on_insufficient_cash\":true,\"skip_cash_validation\":false},\"position_sizing\":{\"share_type\":\"fractional\"},\"settlement\":{\"delay\":0,\"reduces_buying_power\":true},\"slippage\":{\"fixed\":0.0,\"model\":\"percentage\",\"rate\":0.0005,\"stop_rate\":0.0},\"stops\":{\"initial_hwm_source\":\"fill_price\",\"stop_fill_mode\":\"stop_price\",\"stop_level_basis\":\"fill_price\",\"trail_hwm_source\":\"close\",\"trail_stop_timing\":\"lagged\"}},\"chapter\":\"ch16\",\"preset_id\":\"us_firm_characteristics:base\",\"strategy\":{\"rebalance\":{\"cadence\":\"monthly_month_end\",\"mode\":\"vectorized\"},\"signal\":{\"long_short\":true,\"method\":\"equal_weight_top_k\",\"top_k\":10}},\"version\":2}",
"stage": "signal",
"created_at": "2026-04-14T06:43:11.037162+00:00",
"git_commit": "c7fe075",
"started_at": "2026-04-14T06:43:10.973841+00:00",
"elapsed_s": 0.05769746704027057
},
{
"backtest_hash": "47be0310f6a8",
"prediction_hash": "404fd35d733a",
"spec_json": "{\"_runtime_backtest_config\":\"BacktestConfig(allow_short_selling=True, allow_leverage=False, initial_margin=0.5, long_maintenance_margin=0.25, short_maintenance_margin=0.3, fixed_margin_schedule=None, short_cash_policy=<ShortCashPolicy.CREDIT: 'credit'>, execution_price=<ExecutionPrice.OPEN: 'open'>, mark_price=<ExecutionPrice.PRICE: 'price'>, execution_mode=<ExecutionMode.NEXT_BAR: 'next_bar'>, stop_fill_mode=<StopFillMode.STOP_PRICE: 'stop_price'>, stop_level_basis=<StopLevelBasis.FILL_PRICE: 'fill_price'>, trail_hwm_source=<WaterMarkSource.CLOSE: 'close'>, initial_hwm_source=<InitialHwmSource.FILL_PRICE: 'fill_price'>, trail_stop_timing=<TrailStopTiming.LAGGED: 'lagged'>, share_type=<ShareType.FRACTIONAL: 'fractional'>, commission_type=<CommissionType.PERCENTAGE: 'percentage'>, commission_rate=0.00075, commission_per_share=0.0, commission_per_trade=0.0, commission_minimum=0.0, slippage_type=<SlippageType.PERCENTAGE: 'percentage'>, slippage_rate=0.0005, slippage_fixed=0.0, stop_slippage_rate=0.0, initial_cash=1000000.0, cash_buffer_pct=0.0, settlement_delay=0, settlement_reduces_buying_power=True, reject_on_insufficient_cash=True, skip_cash_validation=False, partial_fills_allowed=False, fill_ordering=<FillOrdering.EXIT_FIRST: 'exit_first'>, entry_order_priority=<EntryOrderPriority.SUBMISSION: 'submission'>, next_bar_submission_precheck=False, next_bar_simple_cash_check=False, buying_power_reservation=False, next_bar_queue_shadow_validation=False, immediate_fill=False, rebalance_mode=<RebalanceMode.INCREMENTAL: 'incremental'>, rebalance_headroom_pct=1.0, missing_price_policy=<MissingPricePolicy.SKIP: 'skip'>, late_asset_policy=<LateAssetPolicy.ALLOW: 'allow'>, late_asset_min_bars=1, calendar='NYSE', timezone='UTC', data_frequency=<DataFrequency.DAILY: 'daily'>, enforce_sessions=False, preset_name=None)\",\"backtest_config\":{\"account\":{\"allow_leverage\":false,\"allow_short_selling\":true,\"fixed_margin_schedule\":null,\"initial_margin\":0.5,\"long_maintenance_margin\":0.25,\"short_cash_policy\":\"credit\",\"short_maintenance_margin\":0.3},\"calendar\":{\"calendar\":\"NYSE\",\"data_frequency\":\"daily\",\"enforce_sessions\":false,\"timezone\":\"UTC\"},\"cash\":{\"buffer_pct\":0.0,\"initial\":1000000.0},\"commission\":{\"minimum\":0.0,\"model\":\"percentage\",\"per_share\":0.0,\"per_trade\":0.0,\"rate\":0.00075},\"execution\":{\"execution_mode\":\"next_bar\",\"execution_price\":\"open\",\"mark_price\":\"price\"},\"feed\":{\"ask_col\":null,\"ask_size_col\":null,\"bar_type\":null,\"bid_col\":null,\"bid_size_col\":null,\"calendar\":\"NYSE\",\"close_col\":\"close\",\"data_frequency\":\"daily\",\"entity_col\":\"symbol\",\"high_col\":\"high\",\"low_col\":\"low\",\"mid_col\":null,\"open_col\":\"open\",\"price_col\":\"close\",\"session_start_time\":null,\"timestamp_col\":\"timestamp\",\"timestamp_semantics\":null,\"timezone\":\"UTC\",\"volume_col\":\"volume\"},\"metadata\":{\"cadence\":\"monthly_month_end\",\"case_study\":\"us_firm_characteristics\",\"chapter\":\"ch16\",\"fill_timing\":\"NEXT_BAR_OPEN\",\"prediction_hash\":\"404fd35d733a\",\"preset_path\":\"~/ml4t/code/case_studies/us_firm_characteristics/config/backtest/base.yaml\",\"signal_direction\":\"long_only\"},\"orders\":{\"buying_power_reservation\":false,\"entry_order_priority\":\"submission\",\"fill_ordering\":\"exit_first\",\"immediate_fill\":false,\"late_asset_min_bars\":1,\"late_asset_policy\":\"allow\",\"missing_price_policy\":\"skip\",\"next_bar_queue_shadow_validation\":false,\"next_bar_simple_cash_check\":false,\"next_bar_submission_precheck\":false,\"partial_fills_allowed\":false,\"rebalance_headroom_pct\":1.0,\"rebalance_mode\":\"incremental\",\"reject_on_insufficient_cash\":true,\"skip_cash_validation\":false},\"position_sizing\":{\"share_type\":\"fractional\"},\"settlement\":{\"delay\":0,\"reduces_buying_power\":true},\"slippage\":{\"fixed\":0.0,\"model\":\"percentage\",\"rate\":0.0005,\"stop_rate\":0.0},\"stops\":{\"initial_hwm_source\":\"fill_price\",\"stop_fill_mode\":\"stop_price\",\"stop_level_basis\":\"fill_price\",\"trail_hwm_source\":\"close\",\"trail_stop_timing\":\"lagged\"}},\"chapter\":\"ch16\",\"preset_id\":\"us_firm_characteristics:base\",\"strategy\":{\"rebalance\":{\"cadence\":\"monthly_month_end\",\"mode\":\"vectorized\"},\"signal\":{\"long_short\":true,\"method\":\"equal_weight_top_k\",\"top_k\":20}},\"version\":2}",
"stage": "signal",
"created_at": "2026-04-14T06:43:11.189873+00:00",
"git_commit": "c7fe075",
"started_at": "2026-04-14T06:43:11.124034+00:00",
"elapsed_s": 0.061797570902854204
},
{
"backtest_hash": "4b374e98bab3",
"prediction_hash": "404fd35d733a",
"spec_json": "{\"_runtime_backtest_config\":\"BacktestConfig(allow_short_selling=True, allow_leverage=False, initial_margin=0.5, long_maintenance_margin=0.25, short_maintenance_margin=0.3, fixed_margin_schedule=None, short_cash_policy=<ShortCashPolicy.CREDIT: 'credit'>, execution_price=<ExecutionPrice.OPEN: 'open'>, mark_price=<ExecutionPrice.PRICE: 'price'>, execution_mode=<ExecutionMode.NEXT_BAR: 'next_bar'>, stop_fill_mode=<StopFillMode.STOP_PRICE: 'stop_price'>, stop_level_basis=<StopLevelBasis.FILL_PRICE: 'fill_price'>, trail_hwm_source=<WaterMarkSource.CLOSE: 'close'>, initial_hwm_source=<InitialHwmSource.FILL_PRICE: 'fill_price'>, trail_stop_timing=<TrailStopTiming.LAGGED: 'lagged'>, share_type=<ShareType.FRACTIONAL: 'fractional'>, commission_type=<CommissionType.PERCENTAGE: 'percentage'>, commission_rate=0.00075, commission_per_share=0.0, commission_per_trade=0.0, commission_minimum=0.0, slippage_type=<SlippageType.PERCENTAGE: 'percentage'>, slippage_rate=0.0005, slippage_fixed=0.0, stop_slippage_rate=0.0, initial_cash=1000000.0, cash_buffer_pct=0.0, settlement_delay=0, settlement_reduces_buying_power=True, reject_on_insufficient_cash=True, skip_cash_validation=False, partial_fills_allowed=False, fill_ordering=<FillOrdering.EXIT_FIRST: 'exit_first'>, entry_order_priority=<EntryOrderPriority.SUBMISSION: 'submission'>, next_bar_submission_precheck=False, next_bar_simple_cash_check=False, buying_power_reservation=False, next_bar_queue_shadow_validation=False, immediate_fill=False, rebalance_mode=<RebalanceMode.INCREMENTAL: 'incremental'>, rebalance_headroom_pct=1.0, missing_price_policy=<MissingPricePolicy.SKIP: 'skip'>, late_asset_policy=<LateAssetPolicy.ALLOW: 'allow'>, late_asset_min_bars=1, calendar='NYSE', timezone='UTC', data_frequency=<DataFrequency.DAILY: 'daily'>, enforce_sessions=False, preset_name=None)\",\"backtest_config\":{\"account\":{\"allow_leverage\":false,\"allow_short_selling\":true,\"fixed_margin_schedule\":null,\"initial_margin\":0.5,\"long_maintenance_margin\":0.25,\"short_cash_policy\":\"credit\",\"short_maintenance_margin\":0.3},\"calendar\":{\"calendar\":\"NYSE\",\"data_frequency\":\"daily\",\"enforce_sessions\":false,\"timezone\":\"UTC\"},\"cash\":{\"buffer_pct\":0.0,\"initial\":1000000.0},\"commission\":{\"minimum\":0.0,\"model\":\"percentage\",\"per_share\":0.0,\"per_trade\":0.0,\"rate\":0.00075},\"execution\":{\"execution_mode\":\"next_bar\",\"execution_price\":\"open\",\"mark_price\":\"price\"},\"feed\":{\"ask_col\":null,\"ask_size_col\":null,\"bar_type\":null,\"bid_col\":null,\"bid_size_col\":null,\"calendar\":\"NYSE\",\"close_col\":\"close\",\"data_frequency\":\"daily\",\"entity_col\":\"symbol\",\"high_col\":\"high\",\"low_col\":\"low\",\"mid_col\":null,\"open_col\":\"open\",\"price_col\":\"close\",\"session_start_time\":null,\"timestamp_col\":\"timestamp\",\"timestamp_semantics\":null,\"timezone\":\"UTC\",\"volume_col\":\"volume\"},\"metadata\":{\"cadence\":\"monthly_month_end\",\"case_study\":\"us_firm_characteristics\",\"chapter\":\"ch16\",\"fill_timing\":\"NEXT_BAR_OPEN\",\"prediction_hash\":\"404fd35d733a\",\"preset_path\":\"~/ml4t/code/case_studies/us_firm_characteristics/config/backtest/base.yaml\",\"signal_direction\":\"long_only\"},\"orders\":{\"buying_power_reservation\":false,\"entry_order_priority\":\"submission\",\"fill_ordering\":\"exit_first\",\"immediate_fill\":false,\"late_asset_min_bars\":1,\"late_asset_policy\":\"allow\",\"missing_price_policy\":\"skip\",\"next_bar_queue_shadow_validation\":false,\"next_bar_simple_cash_check\":false,\"next_bar_submission_precheck\":false,\"partial_fills_allowed\":false,\"rebalance_headroom_pct\":1.0,\"rebalance_mode\":\"incremental\",\"reject_on_insufficient_cash\":true,\"skip_cash_validation\":false},\"position_sizing\":{\"share_type\":\"fractional\"},\"settlement\":{\"delay\":0,\"reduces_buying_power\":true},\"slippage\":{\"fixed\":0.0,\"model\":\"percentage\",\"rate\":0.0005,\"stop_rate\":0.0},\"stops\":{\"initial_hwm_source\":\"fill_price\",\"stop_fill_mode\":\"stop_price\",\"stop_level_basis\":\"fill_price\",\"trail_hwm_source\":\"close\",\"trail_stop_timing\":\"lagged\"}},\"chapter\":\"ch16\",\"preset_id\":\"us_firm_characteristics:base\",\"strategy\":{\"rebalance\":{\"cadence\":\"monthly_month_end\",\"mode\":\"vectorized\"},\"signal\":{\"long_short\":true,\"method\":\"score_weighted_top_k\",\"top_k\":10}},\"version\":2}",
"stage": "signal",
"created_at": "2026-04-14T06:43:11.304535+00:00",
"git_commit": "c7fe075",
"started_at": "2026-04-14T06:43:11.248613+00:00",
"elapsed_s": 0.052894855849444866
},
{
"backtest_hash": "af997ec87be5",
"prediction_hash": "404fd35d733a",
"spec_json": "{\"_runtime_backtest_config\":\"BacktestConfig(allow_short_selling=True, allow_leverage=False, initial_margin=0.5, long_maintenance_margin=0.25, short_maintenance_margin=0.3, fixed_margin_schedule=None, short_cash_policy=<ShortCashPolicy.CREDIT: 'credit'>, execution_price=<ExecutionPrice.OPEN: 'open'>, mark_price=<ExecutionPrice.PRICE: 'price'>, execution_mode=<ExecutionMode.NEXT_BAR: 'next_bar'>, stop_fill_mode=<StopFillMode.STOP_PRICE: 'stop_price'>, stop_level_basis=<StopLevelBasis.FILL_PRICE: 'fill_price'>, trail_hwm_source=<WaterMarkSource.CLOSE: 'close'>, initial_hwm_source=<InitialHwmSource.FILL_PRICE: 'fill_price'>, trail_stop_timing=<TrailStopTiming.LAGGED: 'lagged'>, share_type=<ShareType.FRACTIONAL: 'fractional'>, commission_type=<CommissionType.PERCENTAGE: 'percentage'>, commission_rate=0.00075, commission_per_share=0.0, commission_per_trade=0.0, commission_minimum=0.0, slippage_type=<SlippageType.PERCENTAGE: 'percentage'>, slippage_rate=0.0005, slippage_fixed=0.0, stop_slippage_rate=0.0, initial_cash=1000000.0, cash_buffer_pct=0.0, settlement_delay=0, settlement_reduces_buying_power=True, reject_on_insufficient_cash=True, skip_cash_validation=False, partial_fills_allowed=False, fill_ordering=<FillOrdering.EXIT_FIRST: 'exit_first'>, entry_order_priority=<EntryOrderPriority.SUBMISSION: 'submission'>, next_bar_submission_precheck=False, next_bar_simple_cash_check=False, buying_power_reservation=False, next_bar_queue_shadow_validation=False, immediate_fill=False, rebalance_mode=<RebalanceMode.INCREMENTAL: 'incremental'>, rebalance_headroom_pct=1.0, missing_price_policy=<MissingPricePolicy.SKIP: 'skip'>, late_asset_policy=<LateAssetPolicy.ALLOW: 'allow'>, late_asset_min_bars=1, calendar='NYSE', timezone='UTC', data_frequency=<DataFrequency.DAILY: 'daily'>, enforce_sessions=False, preset_name=None)\",\"backtest_config\":{\"account\":{\"allow_leverage\":false,\"allow_short_selling\":true,\"fixed_margin_schedule\":null,\"initial_margin\":0.5,\"long_maintenance_margin\":0.25,\"short_cash_policy\":\"credit\",\"short_maintenance_margin\":0.3},\"calendar\":{\"calendar\":\"NYSE\",\"data_frequency\":\"daily\",\"enforce_sessions\":false,\"timezone\":\"UTC\"},\"cash\":{\"buffer_pct\":0.0,\"initial\":1000000.0},\"commission\":{\"minimum\":0.0,\"model\":\"percentage\",\"per_share\":0.0,\"per_trade\":0.0,\"rate\":0.00075},\"execution\":{\"execution_mode\":\"next_bar\",\"execution_price\":\"open\",\"mark_price\":\"price\"},\"feed\":{\"ask_col\":null,\"ask_size_col\":null,\"bar_type\":null,\"bid_col\":null,\"bid_size_col\":null,\"calendar\":\"NYSE\",\"close_col\":\"close\",\"data_frequency\":\"daily\",\"entity_col\":\"symbol\",\"high_col\":\"high\",\"low_col\":\"low\",\"mid_col\":null,\"open_col\":\"open\",\"price_col\":\"close\",\"session_start_time\":null,\"timestamp_col\":\"timestamp\",\"timestamp_semantics\":null,\"timezone\":\"UTC\",\"volume_col\":\"volume\"},\"metadata\":{\"cadence\":\"monthly_month_end\",\"case_study\":\"us_firm_characteristics\",\"chapter\":\"ch16\",\"fill_timing\":\"NEXT_BAR_OPEN\",\"prediction_hash\":\"404fd35d733a\",\"preset_path\":\"~/ml4t/code/case_studies/us_firm_characteristics/config/backtest/base.yaml\",\"signal_direction\":\"long_only\"},\"orders\":{\"buying_power_reservation\":false,\"entry_order_priority\":\"submission\",\"fill_ordering\":\"exit_first\",\"immediate_fill\":false,\"late_asset_min_bars\":1,\"late_asset_policy\":\"allow\",\"missing_price_policy\":\"skip\",\"next_bar_queue_shadow_validation\":false,\"next_bar_simple_cash_check\":false,\"next_bar_submission_precheck\":false,\"partial_fills_allowed\":false,\"rebalance_headroom_pct\":1.0,\"rebalance_mode\":\"incremental\",\"reject_on_insufficient_cash\":true,\"skip_cash_validation\":false},\"position_sizing\":{\"share_type\":\"fractional\"},\"settlement\":{\"delay\":0,\"reduces_buying_power\":true},\"slippage\":{\"fixed\":0.0,\"model\":\"percentage\",\"rate\":0.0005,\"stop_rate\":0.0},\"stops\":{\"initial_hwm_source\":\"fill_price\",\"stop_fill_mode\":\"stop_price\",\"stop_level_basis\":\"fill_price\",\"trail_hwm_source\":\"close\",\"trail_stop_timing\":\"lagged\"}},\"chapter\":\"ch16\",\"preset_id\":\"us_firm_characteristics:base\",\"strategy\":{\"rebalance\":{\"cadence\":\"monthly_month_end\",\"mode\":\"vectorized\"},\"signal\":{\"long_short\":true,\"method\":\"score_weighted_top_k\",\"top_k\":20}},\"version\":2}",
"stage": "signal",
"created_at": "2026-04-14T06:43:11.399714+00:00",
"git_commit": "c7fe075",
"started_at": "2026-04-14T06:43:11.359453+00:00",
"elapsed_s": 0.037328646052628756
}
],
"n_rows_returned": 5,
"truncated_at_200": false
}
},
{
"turn": 3,
"type": "tool_call",
"name": "query_registry",
"args": {
"sql": "SELECT * FROM prediction_metrics LIMIT 5"
},
"result": {
"columns": [
"prediction_hash",
"computed_at",
"ic_mean",
"ic_std",
"ic_t",
"n_folds",
"pct_positive",
"task_type",
"accuracy",
"balanced_accuracy",
"auc_roc",
"auc_pr",
"log_loss",
"brier_score",
"ic_mean_daily",
"ic_std_daily",
"ic_n_days",
"ic_pct_positive",
"ic_se_naive",
"ic_naive_lo",
"ic_naive_hi",
"ic_se_hac",
"ic_ci_lo",
"ic_ci_hi",
"ic_t_hac",
"ic_p_hac",
"ic_hac_lag",
"ic_boot_lo",
"ic_boot_hi",
"ic_boot_block",
"auc_mean_daily",
"auc_std_daily",
"auc_n_days",
"auc_pct_above_null",
"auc_se_naive",
"auc_naive_lo",
"auc_naive_hi",
"auc_se_hac",
"auc_ci_lo",
"auc_ci_hi",
"auc_t_hac",
"auc_p_hac",
"auc_hac_lag",
"auc_boot_lo",
"auc_boot_hi",
"auc_boot_block"
],
"rows": [
{
"prediction_hash": "cfbe300b50da",
"computed_at": "2026-05-02T18:28:27.112361+00:00",
"ic_mean": 0.04550413096030084,
"ic_std": null,
"ic_t": null,
"n_folds": null,
"pct_positive": null,
"task_type": "regression",
"accuracy": null,
"balanced_accuracy": null,
"auc_roc": 0.5244948427460264,
"auc_pr": 0.5115529774090797,
"log_loss": null,
"brier_score": null,
"ic_mean_daily": 0.04550413096030086,
"ic_std_daily": 0.04279784510439062,
"ic_n_days": 12.0,
"ic_pct_positive": 0.75,
"ic_se_naive": 0.012354673695877918,
"ic_naive_lo": 0.018311677497899047,
"ic_naive_hi": 0.07269658442270269,
"ic_se_hac": 0.005620775678155099,
"ic_ci_lo": 0.033132887104477475,
"ic_ci_hi": 0.05787537481612425,
"ic_t_hac": 8.095703078340362,
"ic_p_hac": 5.832792262294717e-06,
"ic_hac_lag": 6.0,
"ic_boot_lo": 0.036551490554474125,
"ic_boot_hi": 0.053929513883916515,
"ic_boot_block": 21.0,
"auc_mean_daily": null,
"auc_std_daily": null,
"auc_n_days": null,
"auc_pct_above_null": null,
"auc_se_naive": null,
"auc_naive_lo": null,
"auc_naive_hi": null,
"auc_se_hac": null,
"auc_ci_lo": null,
"auc_ci_hi": null,
"auc_t_hac": null,
"auc_p_hac": null,
"auc_hac_lag": null,
"auc_boot_lo": null,
"auc_boot_hi": null,
"auc_boot_block": null
},
{
"prediction_hash": "de199d9adcc6",
"computed_at": "2026-05-02T18:52:48.384892+00:00",
"ic_mean": 0.08207902066435471,
"ic_std": 0.03634328529767654,
"ic_t": 7.141804910850517,
"n_folds": 10.0,
"pct_positive": 1.0,
"task_type": "classification",
"accuracy": 0.5299578096517236,
"balanced_accuracy": 0.5299767370403591,
"auc_roc": 0.5414936656332483,
"auc_pr": 0.5280849117981219,
"log_loss": 0.6901022139740317,
"brier_score": 0.24848500444147317,
"ic_mean_daily": 0.08207902066435474,
"ic_std_daily": 0.08309210866353278,
"ic_n_days": 110.0,
"ic_pct_positive": 0.8636363636363636,
"ic_se_naive": 0.007922521707220808,
"ic_naive_lo": 0.06637684020391152,
"ic_naive_hi": 0.09778120112479796,
"ic_se_hac": 0.010223021805283497,
"ic_ci_lo": 0.06181732379941568,
"ic_ci_hi": 0.1023407175292938,
"ic_t_hac": 8.028841396184285,
"ic_p_hac": 1.241229341530925e-12,
"ic_hac_lag": 20.0,
"ic_boot_lo": 0.06485496247206425,
"ic_boot_hi": 0.10112210738441825,
"ic_boot_block": 21.0,
"auc_mean_daily": 0.5414514435897456,
"auc_std_daily": 0.04190484978393115,
"auc_n_days": 110.0,
"auc_pct_above_null": 0.8545454545454545,
"auc_se_naive": 0.00399547065769346,
"auc_naive_lo": 0.5335325506400012,
"auc_naive_hi": 0.5493703365394901,
"auc_se_hac": 0.005064999018159313,
"auc_ci_lo": 0.5314127802002067,
"auc_ci_hi": 0.5514901069792846,
"auc_t_hac": 8.183899629818601,
"auc_p_hac": 5.60218538225854e-13,
"auc_hac_lag": 20.0,
"auc_boot_lo": 0.5327982193901875,
"auc_boot_hi": 0.5511716925993435,
"auc_boot_block": 21.0
},
{
"prediction_hash": "8081258af8c0",
"computed_at": "2026-05-02T18:52:48.559357+00:00",
"ic_mean": 0.08182063694639109,
"ic_std": 0.03963747590324104,
"ic_t": 6.52765007004807,
"n_folds": 10.0,
"pct_positive": 1.0,
"task_type": "classification",
"accuracy": 0.5305756857695864,
"balanced_accuracy": 0.5305974275063284,
"auc_roc": 0.5421883654681847,
"auc_pr": 0.5284616948355834,
"log_loss": 0.6899536725011718,
"brier_score": 0.2484111443499411,
"ic_mean_daily": 0.08182063694639109,
"ic_std_daily": 0.0923089394312961,
"ic_n_days": 110.0,
"ic_pct_positive": 0.8363636363636363,
"ic_se_naive": 0.008801312040067814,
"ic_naive_lo": 0.0643767226159504,
"ic_naive_hi": 0.09926455127683179,
"ic_se_hac": 0.011201737878059627,
"ic_ci_lo": 0.05961915664352718,
"ic_ci_hi": 0.104022117249255,
"ic_t_hac": 7.304280624763568,
"ic_p_hac": 4.8523185469662167e-11,
"ic_hac_lag": 20.0,
"ic_boot_lo": 0.06278439556210297,
"ic_boot_hi": 0.10252523824875458,
"ic_boot_block": 21.0,
"auc_mean_daily": 0.5420637572067547,
"auc_std_daily": 0.04652948372883957,
"auc_n_days": 110.0,
"auc_pct_above_null": 0.8181818181818182,
"auc_se_naive": 0.004436412203236003,
"auc_naive_lo": 0.5332709324488707,
"auc_naive_hi": 0.5508565819646387,
"auc_se_hac": 0.00543261343719075,
"auc_ci_lo": 0.5312964939899371,
"auc_ci_hi": 0.5528310204235724,
"auc_t_hac": 7.742821699551358,
"auc_p_hac": 5.334621633323877e-12,
"auc_hac_lag": 20.0,
"auc_boot_lo": 0.5327930140996576,
"auc_boot_hi": 0.5526053075966701,
"auc_boot_block": 21.0
},
{
"prediction_hash": "b92c06df7e53",
"computed_at": "2026-05-02T18:52:48.729671+00:00",
"ic_mean": 0.08391671954130364,
"ic_std": 0.03553227186778164,
"ic_t": 7.468364772945978,
"n_folds": 10.0,
"pct_positive": 1.0,
"task_type": "classification",
"accuracy": 0.5309261096529225,
"balanced_accuracy": 0.5309439509991783,
"auc_roc": 0.5426745475158804,
"auc_pr": 0.5289234134178767,
"log_loss": 0.6899304558460861,
"brier_score": 0.24840003253007098,
"ic_mean_daily": 0.08391671954130363,
"ic_std_daily": 0.08368630045488794,
"ic_n_days": 110.0,
"ic_pct_positive": 0.8727272727272727,
"ic_se_naive": 0.007979175671610205,
"ic_naive_lo": 0.06810225276527594,
"ic_naive_hi": 0.09973118631733131,
"ic_se_hac": 0.009912962869006248,
"ic_ci_lo": 0.06426954940796836,
"ic_ci_hi": 0.10356388967463889,
"ic_t_hac": 8.46535194877776,
"ic_p_hac": 1.312283615106935e-13,
"ic_hac_lag": 20.0,
"ic_boot_lo": 0.06763810245127276,
"ic_boot_hi": 0.10194484226606843,
"ic_boot_block": 21.0,
"auc_mean_daily": 0.5426094308457518,
"auc_std_daily": 0.04218623802206686,
"auc_n_days": 110.0,
"auc_pct_above_null": 0.8818181818181818,
"auc_se_naive": 0.004022299973505073,
"auc_naive_lo": 0.5346373630642968,
"auc_naive_hi": 0.5505814986272067,
"auc_se_hac": 0.004866847199538889,
"auc_ci_lo": 0.5329634979187506,
"auc_ci_hi": 0.5522553637727529,
"auc_t_hac": 8.755037727461186,
"auc_p_hac": 2.90878432451791e-14,
"auc_hac_lag": 20.0,
"auc_boot_lo": 0.5345392427559121,
"auc_boot_hi": 0.5517516242048353,
"auc_boot_block": 21.0
},
{
"prediction_hash": "d93bed836c1e",
"computed_at": "2026-05-02T18:52:48.950176+00:00",
"ic_mean": 0.08389784982168305,
"ic_std": 0.03888924341753004,
"ic_t": 6.822151137753361,
"n_folds": 10.0,
"pct_positive": 1.0,
"task_type": "classification",
"accuracy": 0.5308065099445839,
"balanced_accuracy": 0.5308270272459227,
"auc_roc": 0.5431113104052135,
"auc_pr": 0.5291238960127836,
"log_loss": 0.6898772200383483,
"brier_score": 0.24837250684108877,
"ic_mean_daily": 0.08389784982168305,
"ic_std_daily": 0.08967703846838823,
"ic_n_days": 110.0,
"ic_pct_positive": 0.8363636363636363,
"ic_se_naive": 0.008550370129394603,
"ic_naive_lo": 0.06695129420000903,
"ic_naive_hi": 0.10084440544335707,
"ic_se_hac": 0.010869383547812509,
"ic_ci_lo": 0.06235508499644207,
"ic_ci_hi": 0.10544061464692403,
"ic_t_hac": 7.718731191390123,
"ic_p_hac": 6.02806693450475e-12,
"ic_hac_lag": 20.0,
"ic_boot_lo": 0.06491903634304047,
"ic_boot_hi": 0.1043486029224617,
"ic_boot_block": 21.0,
"auc_mean_daily": 0.5429968794459019,
"auc_std_daily": 0.04479605680454285,
"auc_n_days": 110.0,
"auc_pct_above_null": 0.8363636363636363,
"auc_se_naive": 0.004271136430885206,
"auc_naive_lo": 0.5345316258956583,
"auc_naive_hi": 0.5514621329961455,
"auc_se_hac": 0.005243921611878686,
"auc_ci_lo": 0.5326035972924318,
"auc_ci_hi": 0.553390161599372,
"auc_t_hac": 8.199374938882405,
"auc_p_hac": 5.173639294753229e-13,
"auc_hac_lag": 20.0,
"auc_boot_lo": 0.5338867479187032,
"auc_boot_hi": 0.5531544666576655,
"auc_boot_block": 21.0
}
],
"n_rows_returned": 5,
"truncated_at_200": false
}
},
{
"turn": 3,
"type": "tool_call",
"name": "query_registry",
Vollständig mit Quellenangabe unter der Lizenz der Quelle angezeigt. Lizenz: MIT
Diese Zusammenfassung wurde vom Research-Agenten von Stratmill anhand des Originals verfasst; sie ist keine Kopie der Quelle.