Portfolio Agent EvalsHarbor task suite · ETF analyze → backtest → rebalance

Detect an undocumented split without misclassifying a genuine crash

Detect a split missing from the corporate-actions file and adjust for it, while leaving a genuine one-day crash untouched.

T3hardAnalyzemulti-metricready
Edit
readystatic
Agent budget
40 min
Verifier budget
5 min
Tier target
25–50% pass expected

instruction.md

What the agent sees (CONVENTIONS.md is appended automatically)

Find the undocumented split

The panel in /app/data/prices/ is clean except that one or more splits are missing from /app/data/corporate_actions.csv. Separately, at least one ETF has a genuine large one-day loss (30% or worse) that is NOT a split.

Produce:

  • /app/output/inferred_actions.json — a list of {ticker, date, ratio, evidence: {price_ratio, volume_ratio, dividend_adjacent}} for each inferred split.
  • /app/output/close_adj.csv — adjusted closes using the union of documented and inferred actions (conventions of the canonical-panel task).
  • /app/output/non_split_events.json — {ticker, date, return} for each large move you examined and decided was real.

Classify a move as a split only if the close ratio is within 2% of a ratio in {2, 3, 4, 1/2, 1/3, 1/4} AND the volume ratio is consistent with it (within 25% of the inverse price ratio). Everything else is a real move.

Verification

reward.json metrics · weights sum to 1.00

MetricWeightCheck
inferred_exact
0.4
Set of (ticker, date, ratio) equals the planted missing splits.
crash_preserved
0.3
The crash day's adjusted return equals the raw return within 1e-6 (not 'fixed').
panel_match
0.3
close_adj matches the oracle to rel 1e-8.

Harbor scaffold

Generated from this record — task.toml, Dockerfile, verifier, oracle stub

schema_version = "1.4"

[task]
name = "portfolio-agent-evals/pf-data-hidden-split"
version = "1.0.0"
description = "Detect a split missing from the corporate-actions file and adjust for it, while leaving a genuine one-day crash untouched."
keywords = ["etf", "portfolio", "analyze", "data-forensics", "anomaly-detection", "corporate-actions", "evidence-based-reasoning"]

[metadata]
author_name = "portfolio-agent-evals"
difficulty = "hard"
category = "quant-finance"
tags = ["data-forensics", "tier-3", "analyze", "multi-metric"]
theme = "Data Forensics & Canonicalization"
tier = 3
reward_type = "multi-metric"

[agent]
timeout_sec = 2400.0

[verifier]
timeout_sec = 300.0

[environment]
# Offline by design: all data is synthetic and generated at build time.
network_mode = "none"
cpus = 2
memory_mb = 4096
storage_mb = 10240
build_timeout_sec = 900.0

Traps

Each must carry signal: a trap-blind solution must lose credit

  • The crash ETF's volume also spikes, so volume alone does not discriminate; its price ratio is 0.62, not near a split ratio.
  • A documented split coincides with a dividend ex-date — both adjustments apply.
  • The inferred split is 3:1, not the more common 2:1.
  • Adjustment must also scale volume when computing the volume-ratio evidence.

Inputs

Fixtures mounted in the environment

  • /app/data/prices/
    Variant with one raw 3:1 split and a -38% day in a different ticker.
  • /app/data/corporate_actions.csv
    Missing-split variant.
  • /app/data/dividends.csv

Outputs

What the verifier reads from /app/output

  • /app/output/inferred_actions.json
    JSON
    Inferred splits with evidence.
  • /app/output/close_adj.csv
    CSV wide
    Adjusted panel.
  • /app/output/non_split_events.json
    JSON
    Examined large moves classified as real.

Anti-gaming

Split ticker, date and ratio, and crash ticker/date are seed-sampled.

Oracle notes

solution/solve.sh must score 1.0 on five seeds

Oracle scans log-return outliers, tests ratio proximity and volume consistency, then applies the canonical adjuster.

Reviews (0)

Design review before a task is marked ready

    Reviews are read-only in static export.
    Tier 3 · Expert25–50% pass expected. Created 2026-01-01, updated 2026-01-01.