combining-data-sourceslisted
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