← ClaudeAtlas

combining-data-sourceslisted

Combine information of DIFFERENT kinds into one research view whose every number can be traced back to what was knowable when. TRIGGER - joining prices to fundamentals, earnings or a macro series; building a signal from a filing plus a price; merging two vendors into one series; "which vendor do I trust"; combine_first / fillna / bfill across sources; assembling a company dossier, profile or research view from several places; a field that must carry its provenance; "when did this number become knowable"; period_end vs filed vs available; a ticker that changed company mid-sample; filling a ResultCard's data block. SKIP for the mechanics of ONE as-of join (safe_asof, in market-data-engineering); for reconciling two price series from two vendors (reconcile_sources, in market-data-sourcing); for auditing a finished backtest (research-integrity-guards); and for resolving a ticker to a permanent id (security-master-and-symbology).
howard-lynn-ye/fin-skills · ★ 1 · Data & Documents · score 77
Install: claude install-skill howard-lynn-ye/fin-skills
# Combining data sources Fetching is solved. Finding is solved. **Combining is where the number stops being true**, because each kind of data arrives on its own clock, in its own convention, under its own identifier — and a join erases all three. Everything below is **measured** by the two scripts in this skill; nothing here is asserted. ## 1. The findings | # | Finding | Measured | |---|---|---| | 1 | 🚨 **A signal joined on `period_end` instead of `available_at` scores 3.37 Sharpe against 1.62.** Same panel, same signal, one clock apart — **+1.76 of pure look-ahead, 2.1x** | `scripts/availability_clock.py` | | 2 | 🚨 **Taking the EARLIEST input clock is the error that looks fine.** The joined row has a price in it, an EPS in it, and no NaN anywhere. Nothing about its shape says half of it was published 53 days later | `scripts/availability_clock.py` | | 3 | 🚨 **Stamping the join date instead fails SILENTLY** — 0 of 1512 sessions carry the fact, so the backtest runs, holds nothing, and reports a flat line rather than an error | `scripts/availability_clock.py` | | 4 | 🚨 **`combine_first` resolves by NULLITY, not by precedence.** On 2,316 overlapping sessions the two vendors disagree by >10 bps on **171 (7.4%)**, and `b.combine_first(a)` takes the non-authoritative number on **every one of them**, keeping **0 records** | `scripts/source_merge.py` | | 5 | 🚨 **The corrupted series passes every check you actually run**: lag-1 autocorrelation **−0.055 vs +0.012**, annualised