Quant500 Academy

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

The five problems they nearly always bring

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.

The rest of Quant500

What you are learning, applied to the index every day:

The model portfolio, weekly in your inbox

Every Saturday, its week in one minute: how it went, the best and the worst, and which insiders bought with their own money. Plus, the day the model is rebuilt, which stocks come in and which go out. A simulation, not advice. At most one email a week, no ads, no account; one-click unsubscribe. Made by one person: Pol Gracia.

A model portfolio with simulated results, not a personalized recommendation. Your email is used for this only: privacy.

Behind the Academy and the rest of Quant500 there is one person: Pol Gracia Serrahima.