2. Alternative data: what it promises and what it delivers
Level 6: From data to decision
Alternative data is the name given to any information that does not come out of the classic financial channels: prices, audited accounts, analyst estimates or official statistics. The commercial promise is always the same, and it sounds good: seeing reality before it reaches the quarterly report. This module separates that promise from what gets delivered in practice.
What gets sold under that label
- Card transactions, aggregated and anonymized by merchant, which approximate a chain's sales before it publishes them.
- Web traffic and app usage: visits, downloads, active users, session time.
- Satellite imagery: cars in car parks, construction in progress, or the level of floating-roof crude oil tanks, estimated from the shadow the lid casts.
- Text: news, earnings call transcripts, regulatory filings, product reviews, published job postings.
- Aggregated geolocation from mobile devices, plus customs data or ship tracking.
The five problems they nearly always bring
- Short history. Most of these panels start in the second half of the last decade. Five or six years of quarterly data is twenty or twenty-four observations per company, and companies in the same sector are highly correlated with each other: the number of genuinely independent observations is a small fraction of the rows you see.
- Methodology changes. The vendor widens the panel, switches issuing bank, reweights or corrects its image recognition algorithm. The series before and after the change is not measuring the same thing, and they hardly ever tell you with the clarity required.
- Biased coverage. A card panel covers the customers of a few particular institutions, with their age, income and geography bias. An app panel sees the phone and not the physical shop. Extrapolating from the part to the whole is an assumption, not a data point.
- Reconstructed history. Many vendors compute the past with today's algorithm and deliver it as though it had been available back then. It is the look-ahead bias of the previous module, served up by a third party.
- Cost and capacity. These products sell for tens or hundreds of thousands a year, and once the vendor has placed the subscription with dozens of funds, the edge gets shared out. The literature on published anomalies, with the work of McLean and Pontiff as the usual reference, finds that a signal's return falls by roughly half after it becomes known.
The reconstructed-history trap
Every row must carry two dates: when what it measures happened and when it became available to you. If the vendor only delivers the first, the right response is to ask for the second; if they say they do not have it, you now know what you have bought.
alt = pd.read_parquet("panel_tarjetas.parquet")
# columns: fecha_observacion, fecha_disponible, simbolo, gasto
alt["retraso_dias"] = (alt["fecha_disponible"] - alt["fecha_observacion"]).dt.days
print(alt.groupby(alt["fecha_observacion"].dt.year)["retraso_dias"].median())
# If the early years come out with a lag of 0 and from a certain date onwards a
# stable lag of, say, 3 days appears, the old history is reconstructed:
# it is not what could be seen then, it is what the vendor knows today.The only question that matters: what does it add to what you already have
That a series predicts a chain's sales means nothing on its own. The question is whether it predicts something not already predicted by the analyst consensus, seasonality, the previous quarter and the sector's growth.
import statsmodels.api as sm
y = panel["sorpresa_ventas"] # actual figure minus consensus
cols_base = ["ventas_trim_anterior", "crecimiento_sector", "revisiones_consenso"]
base = sm.OLS(y, sm.add_constant(panel[cols_base]), missing="drop").fit()
con_alt = sm.OLS(y, sm.add_constant(panel[cols_base + ["gasto_tarjetas"]]),
missing="drop").fit()
print("R2 ajustado base:", round(base.rsquared_adj, 4))
print("R2 ajustado con el dato:", round(con_alt.rsquared_adj, 4))
print("t del dato alternativo:", round(con_alt.tvalues["gasto_tarjetas"], 2))
print("trimestres distintos:", panel["fin_periodo"].nunique())That last line is the most important of the lot. Campbell Harvey and his co-authors, having reviewed hundreds of published factors, argue that with so much accumulated searching the significance bar should sit close to 3 rather than at the usual 2. With twenty effective quarters behind it, a statistic of 2.4 is not a discovery: it is noise with good presentation.
When they have genuinely added something
Being skeptical is not being a denier. There are cases documented with rigor: counting vehicles in the car parks of retail chains has been linked in academic work to subsequent earnings surprises; tracking crude oil tank levels adds frequency and coverage where official statistics are weekly and partial; and text analysis of earnings calls, with the Loughran and McDonald dictionaries as the standard, systematically extracts something a human cannot read at scale. The common pattern is clear: they work when the conventional data is slow, scarce or non-existent, not when they are competing with thirty analysts covering the same stock.
There is a second, equally useful pattern: the cases that hold up tend to measure a physical quantity, not an opinion. Cars, barrels, containers and visits get counted; sentiment gets interpreted, and every vendor interprets it their own way and recalibrates it when it suits them. Faced with two similar products, always pick the one you can describe with a counting verb.
A worked case: the back-of-the-envelope calculation
A vendor asks for, say, $120,000 a year. You manage 3 million: the cost is 4% of assets, and the signal added 2% gross in the historical test. You come out losing twice what you gain, and that is before discounting the decay that follows once they sell it to another twenty clients. With 200 million under management the same subscription costs 0.06%, and the decision changes completely. Alternative data is neither good nor bad in the abstract: it is a function of your size, your horizon and how much you already knew without it.