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.
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
| Metric | Weight | Check |
|---|---|---|
| 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.csvMissing-split variant.
- /app/data/dividends.csv
Outputs
What the verifier reads from /app/output
- /app/output/inferred_actions.jsonJSONInferred splits with evidence.
- /app/output/close_adj.csvCSV wideAdjusted panel.
- /app/output/non_split_events.jsonJSONExamined 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