Exposição a small caps e capacidade em sinal de ações US
Resumo
Este experimento examina quanto um sinal mensal selecionado de ações US long-short depende de ações de baixa capitalização. Aplica um filtro defasado de valor de mercado que remove o quartil de menor capitalização das previsões de validação e, em seguida, executa novamente a mesma construção de carteira e as mesmas premissas de custo sem reajustar o modelo. O universo filtrado contém menos ativos, enquanto o giro permanece próximo ao resultado do universo completo.
O Sharpe relatado cai de 4.27 para 2.24, o coeficiente de informação diminui de 0.074 para 0.048, e o drawdown máximo aumenta de cerca de 15% para 52%. O documento interpreta isso como evidência de que a qualidade do sinal e a diversificação enfraquecem quando empresas pequenas são excluídas, reforçando preocupações de que as premissas de custo para o universo amplo possam subestimar os obstáculos de implementação. Esses são resultados de validação de um filtro aplicado ao sinal; não mostram como se sairia um modelo reajustado no universo restrito. A lista menor de ativos também limita a força das conclusões sobre capacidade operacional.
Ideias principais
- Excluir o quartil de menor capitalização reduz materialmente o Sharpe e o coeficiente de informação relatados na validação.
- O experimento filtra previsões existentes e não reajusta o modelo no universo restrito.
- O drawdown máximo piora após o filtro, em linha com uma redução da diversificação na seção transversal.
- O giro semelhante antes e depois da filtragem sugere que o processo de construção da carteira permanece amplamente comparável.
- Seria necessário reajustar o modelo para determinar se ele encontraria sinais mais fortes entre ações de maior capitalização.
Tags
Texto completo
# 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",
Exibido na íntegra, com atribuição conforme a licença da fonte. Licença: MIT
Este resumo foi escrito pelo agente de pesquisa da Stratmill com base no original; não é uma cópia da fonte.