Eurostat

Surveys

Introduction

The Business and Consumer Surveys dataset by Eurostat tracks the monthly confidence surveys of households and of businesses in industry, construction, retail, and services. The data covers up to 35 European economies, starts in January 1980, and is delivered on a monthly frequency. This dataset is created by processing the European Commission surveys that Eurostat publishes. The series are not seasonally adjusted, so they differ from the figures quoted in the press.

For more information about the Surveys dataset, including CLI commands and pricing, see the dataset listing.

About the Provider

Eurostat is the statistical office of the European Union, founded in 1953 and based in Luxembourg. It collects data from the national statistics offices and publishes statistics that can be compared across European countries.

Getting Started

The following snippet demonstrates how to request data from the Business and Consumer Surveys dataset:

self.consumer = self.add_data(EurostatConsumerSurvey, Eurostat.Economies.GERMANY, Resolution.DAILY).symbol
self.industry = self.add_data(EurostatIndustrySurvey, Eurostat.Economies.EURO_AREA, Resolution.DAILY).symbol
_consumer = AddData<EurostatConsumerSurvey>(Eurostat.Economies.Germany, Resolution.Daily).Symbol;
_industry = AddData<EurostatIndustrySurvey>(Eurostat.Economies.EuroArea, Resolution.Daily).Symbol;

Data Summary

The following table describes the dataset properties:

PropertyValue
Start DateJanuary 1980
Asset Coverage35 European economies
Data DensitySparse
ResolutionDaily*
TimezoneBrussels

* Monthly data we fetch daily.

Requesting Data

To add Business and Consumer Surveys data to your algorithm, call the AddDataadd_data method. Save a reference to the dataset Symbol so you can access the data later in your algorithm.

class EurostatSurveysDataAlgorithm(QCAlgorithm):
    def initialize(self) -> None:
        self.set_start_date(2018, 1, 1)
        self.set_end_date(2021, 3, 31)
        self.set_cash(100000)

        self.equity = self.add_equity("SPY", Resolution.DAILY).symbol

        self.consumer = self.add_data(EurostatConsumerSurvey, Eurostat.Economies.GERMANY, Resolution.DAILY).symbol
        self.industry = self.add_data(EurostatIndustrySurvey, Eurostat.Economies.GERMANY, Resolution.DAILY).symbol
        self.services = self.add_data(EurostatServicesSurvey, Eurostat.Economies.GERMANY, Resolution.DAILY).symbol
public class EurostatSurveysDataAlgorithm : QCAlgorithm
{
    private Symbol _equity, _consumer, _industry, _services;

    public override void Initialize()
    {
        SetStartDate(2018, 1, 1);
        SetEndDate(2021, 3, 31);
        SetCash(100000);

        _equity = AddEquity("SPY", Resolution.Daily).Symbol;

        _consumer = AddData<EurostatConsumerSurvey>(Eurostat.Economies.Germany, Resolution.Daily).Symbol;
        _industry = AddData<EurostatIndustrySurvey>(Eurostat.Economies.Germany, Resolution.Daily).Symbol;
        _services = AddData<EurostatServicesSurvey>(Eurostat.Economies.Germany, Resolution.Daily).Symbol;
    }
}

Accessing Data

To get the current Business and Consumer Surveys data, index the current Slice with the dataset Symbol. Slice objects deliver unique events to your algorithm as they happen, but the Slice may not contain data for your dataset at every time step. To avoid issues, check if the Slice contains the data you want before you index it.

def on_data(self, slice: Slice) -> None:
    if slice.contains_key(self.consumer):
        data_point = slice[self.consumer]
        self.log(f"{self.consumer} consumer confidence at {slice.time}: {data_point.consumer_confidence}")
public override void OnData(Slice slice)
{
    if (slice.ContainsKey(_consumer))
    {
        var dataPoint = slice[_consumer];
        Log($"{_consumer} consumer confidence at {slice.Time}: {dataPoint.ConsumerConfidence}");
    }
}

To iterate through all of the dataset objects in the current Slice, call the Getget method.

def on_data(self, slice: Slice) -> None:
    for dataset_symbol, data_point in slice.get(EurostatIndustrySurvey).items():
        self.log(f"{dataset_symbol} industrial confidence at {slice.time}: {data_point.industrial_confidence}")
public override void OnData(Slice slice)
{
    foreach (var kvp in slice.Get<EurostatIndustrySurvey>())
    {
        var datasetSymbol = kvp.Key;
        var dataPoint = kvp.Value;
        Log($"{datasetSymbol} industrial confidence at {slice.Time}: {dataPoint.IndustrialConfidence}");
    }
}

Historical Data

To get historical Business and Consumer Surveys data, call the Historyhistory method with the dataset Symbol. If there is no data in the period you request, the history result is empty.

# DataFrame
history_df = self.history(self.consumer, timedelta(days=1825), Resolution.DAILY)

# Dataset objects
history_bars = self.history[EurostatConsumerSurvey](self.consumer, timedelta(days=1825), Resolution.DAILY)
var history = History<EurostatConsumerSurvey>(_consumer, TimeSpan.FromDays(1825), Resolution.Daily);

For more information about historical data, see History Requests.

Remove Subscriptions

To remove your subscription to Business and Consumer Surveys data, call the RemoveSecurityremove_security method.

self.remove_security(self.consumer)
RemoveSecurity(_consumer);

Supported Economies

The following table shows the accessor code you need to add each economy to your algorithm:

EconomyGeo codeConstant
Aggregates
Euro areaEA21Eurostat.Economies.EuroAreaEurostat.Economies.EURO_AREA
Euro area (20 countries)EA20Eurostat.Economies.EuroArea20Eurostat.Economies.EURO_AREA_20
European UnionEU27_2020Eurostat.Economies.EuropeanUnionEurostat.Economies.EUROPEAN_UNION
Countries
AlbaniaALEurostat.Economies.AlbaniaEurostat.Economies.ALBANIA
AustriaATEurostat.Economies.AustriaEurostat.Economies.AUSTRIA
BelgiumBEEurostat.Economies.BelgiumEurostat.Economies.BELGIUM
BulgariaBGEurostat.Economies.BulgariaEurostat.Economies.BULGARIA
CroatiaHREurostat.Economies.CroatiaEurostat.Economies.CROATIA
CyprusCYEurostat.Economies.CyprusEurostat.Economies.CYPRUS
CzechiaCZEurostat.Economies.CzechiaEurostat.Economies.CZECHIA
DenmarkDKEurostat.Economies.DenmarkEurostat.Economies.DENMARK
EstoniaEEEurostat.Economies.EstoniaEurostat.Economies.ESTONIA
FinlandFIEurostat.Economies.FinlandEurostat.Economies.FINLAND
FranceFREurostat.Economies.FranceEurostat.Economies.FRANCE
GermanyDEEurostat.Economies.GermanyEurostat.Economies.GERMANY
GreeceELEurostat.Economies.GreeceEurostat.Economies.GREECE
HungaryHUEurostat.Economies.HungaryEurostat.Economies.HUNGARY
IrelandIEEurostat.Economies.IrelandEurostat.Economies.IRELAND
ItalyITEurostat.Economies.ItalyEurostat.Economies.ITALY
LatviaLVEurostat.Economies.LatviaEurostat.Economies.LATVIA
LithuaniaLTEurostat.Economies.LithuaniaEurostat.Economies.LITHUANIA
LuxembourgLUEurostat.Economies.LuxembourgEurostat.Economies.LUXEMBOURG
MaltaMTEurostat.Economies.MaltaEurostat.Economies.MALTA
MontenegroMEEurostat.Economies.MontenegroEurostat.Economies.MONTENEGRO
NetherlandsNLEurostat.Economies.NetherlandsEurostat.Economies.NETHERLANDS
North MacedoniaMKEurostat.Economies.NorthMacedoniaEurostat.Economies.NORTH_MACEDONIA
PolandPLEurostat.Economies.PolandEurostat.Economies.POLAND
PortugalPTEurostat.Economies.PortugalEurostat.Economies.PORTUGAL
RomaniaROEurostat.Economies.RomaniaEurostat.Economies.ROMANIA
SerbiaRSEurostat.Economies.SerbiaEurostat.Economies.SERBIA
SlovakiaSKEurostat.Economies.SlovakiaEurostat.Economies.SLOVAKIA
SloveniaSIEurostat.Economies.SloveniaEurostat.Economies.SLOVENIA
SpainESEurostat.Economies.SpainEurostat.Economies.SPAIN
SwedenSEEurostat.Economies.SwedenEurostat.Economies.SWEDEN
TurkiyeTREurostat.Economies.TurkiyeEurostat.Economies.TURKIYE

Example Applications

The Business and Consumer Surveys dataset enables you to read business and consumer sentiment across Europe. Examples include the following strategies:

  • Timing European equity or euro exposure on the direction of consumer confidence
  • Reading price expectations across sectors as an early inflation signal
  • Comparing business confidence across economies to rotate country exposure

Classic Algorithm Example

The following example algorithm buys SPY when German consumer confidence rises. Otherwise, it liquidates the position.

from AlgorithmImports import *

class EurostatSurveysExampleAlgorithm(QCAlgorithm):

    def initialize(self):
        self.set_start_date(2018, 1, 1)
        self.set_end_date(2021, 3, 31)
        self.set_cash(100000)

        self.equity = self.add_equity("SPY", Resolution.DAILY).symbol

        self.consumer = self.add_data(EurostatConsumerSurvey, Eurostat.Economies.GERMANY, Resolution.DAILY).symbol
        self.industry = self.add_data(EurostatIndustrySurvey, Eurostat.Economies.GERMANY, Resolution.DAILY).symbol

        self.previous_confidence = None

    def on_data(self, slice):
        industry = slice.get(EurostatIndustrySurvey)
        if self.industry in industry:
            data_point = industry[self.industry]
            self.debug(f"Industrial confidence: {data_point.industrial_confidence}, selling price expectations: {data_point.selling_price_expectation}")

        consumer = slice.get(EurostatConsumerSurvey)
        if self.consumer not in consumer:
            return

        confidence = consumer[self.consumer].consumer_confidence
        if confidence is None:
            return

        # Buy SPY when consumer confidence rises. Otherwise, liquidate.
        if self.previous_confidence is not None:
            if confidence > self.previous_confidence:
                self.set_holdings(self.equity, 1)
            else:
                self.liquidate(self.equity)

        self.previous_confidence = confidence
public class EurostatSurveysExampleAlgorithm : QCAlgorithm
{
    private Symbol _equity, _consumer, _industry;
    private decimal? _previousConfidence;

    public override void Initialize()
    {
        SetStartDate(2018, 1, 1);
        SetEndDate(2021, 3, 31);
        SetCash(100000);

        _equity = AddEquity("SPY", Resolution.Daily).Symbol;

        _consumer = AddData<EurostatConsumerSurvey>(Eurostat.Economies.Germany, Resolution.Daily).Symbol;
        _industry = AddData<EurostatIndustrySurvey>(Eurostat.Economies.Germany, Resolution.Daily).Symbol;
    }

    public override void OnData(Slice slice)
    {
        var industry = slice.Get<EurostatIndustrySurvey>();
        if (industry.ContainsKey(_industry))
        {
            var dataPoint = industry[_industry];
            Debug($"Industrial confidence: {dataPoint.IndustrialConfidence}, selling price expectations: {dataPoint.SellingPriceExpectation}");
        }

        var consumer = slice.Get<EurostatConsumerSurvey>();
        if (!consumer.ContainsKey(_consumer))
        {
            return;
        }

        var confidence = consumer[_consumer].ConsumerConfidence;
        if (!confidence.HasValue)
        {
            return;
        }

        // Buy SPY when consumer confidence rises. Otherwise, liquidate.
        if (_previousConfidence.HasValue)
        {
            if (confidence > _previousConfidence)
            {
                SetHoldings(_equity, 1);
            }
            else
            {
                Liquidate(_equity);
            }
        }

        _previousConfidence = confidence;
    }
}

Framework Algorithm Example

The following example algorithm emits up insights for SPY when German consumer and industrial confidence both rise. Otherwise, it emits flat insights.

from AlgorithmImports import *

class EurostatSurveysFrameworkAlgorithm(QCAlgorithm):

    def initialize(self):
        self.set_start_date(2018, 1, 1)
        self.set_end_date(2021, 3, 31)
        self.set_cash(100000)

        self.universe_settings.resolution = Resolution.DAILY

        symbols = [Symbol.create("SPY", SecurityType.EQUITY, Market.USA)]
        self.set_universe_selection(ManualUniverseSelectionModel(symbols))

        self.add_alpha(EurostatConfidenceAlphaModel(self))

        self.set_portfolio_construction(EqualWeightingPortfolioConstructionModel())
        self.set_execution(ImmediateExecutionModel())


class EurostatConfidenceAlphaModel(AlphaModel):
    """Emits insights from the direction of European confidence, read across households and industry."""

    def __init__(self, algorithm):
        self._consumer = algorithm.add_data(EurostatConsumerSurvey, Eurostat.Economies.GERMANY, Resolution.DAILY).symbol
        self._industry = algorithm.add_data(EurostatIndustrySurvey, Eurostat.Economies.GERMANY, Resolution.DAILY).symbol

        history = algorithm.history(EurostatConsumerSurvey, self._consumer, timedelta(days=1825), Resolution.DAILY)
        algorithm.debug(f"Got {len(history)} historical consumer survey rows")

        self._previous_consumer = None
        self._previous_industry = None
        self._symbols = []

    def update(self, algorithm, data):
        insights = []

        consumer = data.get(EurostatConsumerSurvey)
        if self._consumer not in consumer:
            return insights

        confidence = consumer[self._consumer].consumer_confidence
        if confidence is None:
            return insights

        # Read the latest industrial confidence from the security cache.
        industry_point = algorithm.securities[self._industry].cache.get_data(EurostatIndustrySurvey)
        industrial = industry_point.industrial_confidence if industry_point else None

        if self._previous_consumer is not None:
            improving = confidence > self._previous_consumer
            if improving and industrial is not None and self._previous_industry is not None:
                improving = industrial > self._previous_industry

            direction = InsightDirection.UP if improving else InsightDirection.FLAT
            insights = [Insight.price(symbol, timedelta(days=30), direction) for symbol in self._symbols]

        self._previous_consumer = confidence
        if industrial is not None:
            self._previous_industry = industrial

        return insights

    def on_securities_changed(self, algorithm, changes):
        for security in changes.added_securities:
            self._symbols.append(security.symbol)

        for security in changes.removed_securities:
            if security.symbol in self._symbols:
                self._symbols.remove(security.symbol)
public class EurostatSurveysFrameworkAlgorithm : QCAlgorithm
{
    public override void Initialize()
    {
        SetStartDate(2018, 1, 1);
        SetEndDate(2021, 3, 31);
        SetCash(100000);

        UniverseSettings.Resolution = Resolution.Daily;

        var symbols = new[] { QuantConnect.Symbol.Create("SPY", SecurityType.Equity, Market.USA) };
        SetUniverseSelection(new ManualUniverseSelectionModel(symbols));

        AddAlpha(new EurostatConfidenceAlphaModel(this));

        SetPortfolioConstruction(new EqualWeightingPortfolioConstructionModel());
        SetExecution(new ImmediateExecutionModel());
    }
}

public class EurostatConfidenceAlphaModel : AlphaModel
{
    private readonly Symbol _consumer;
    private readonly Symbol _industry;
    private readonly List<Symbol> _symbols = new();

    private decimal? _previousConsumer;
    private decimal? _previousIndustry;

    public EurostatConfidenceAlphaModel(QCAlgorithm algorithm)
    {
        _consumer = algorithm.AddData<EurostatConsumerSurvey>(Eurostat.Economies.Germany, Resolution.Daily).Symbol;
        _industry = algorithm.AddData<EurostatIndustrySurvey>(Eurostat.Economies.Germany, Resolution.Daily).Symbol;

        var history = algorithm.History<EurostatConsumerSurvey>(_consumer, TimeSpan.FromDays(1825), Resolution.Daily);
        algorithm.Debug($"Got {history.Count()} historical consumer survey rows");
    }

    public override IEnumerable<Insight> Update(QCAlgorithm algorithm, Slice data)
    {
        var insights = new List<Insight>();

        var consumer = data.Get<EurostatConsumerSurvey>();
        if (!consumer.ContainsKey(_consumer))
        {
            return insights;
        }

        var confidence = consumer[_consumer].ConsumerConfidence;
        if (!confidence.HasValue)
        {
            return insights;
        }

        // Read the latest industrial confidence from the security cache.
        var industryPoint = algorithm.Securities[_industry].Cache.GetData<EurostatIndustrySurvey>();
        var industrial = industryPoint?.IndustrialConfidence;

        if (_previousConsumer.HasValue)
        {
            var improving = confidence > _previousConsumer;
            if (improving && industrial.HasValue && _previousIndustry.HasValue)
            {
                improving = industrial > _previousIndustry;
            }

            var direction = improving ? InsightDirection.Up : InsightDirection.Flat;
            insights = _symbols.Select(symbol => Insight.Price(symbol, TimeSpan.FromDays(30), direction)).ToList();
        }

        _previousConsumer = confidence;
        if (industrial.HasValue)
        {
            _previousIndustry = industrial;
        }

        return insights;
    }

    public override void OnSecuritiesChanged(QCAlgorithm algorithm, SecurityChanges changes)
    {
        foreach (var security in changes.AddedSecurities)
        {
            _symbols.Add(security.Symbol);
        }

        foreach (var security in changes.RemovedSecurities)
        {
            _symbols.Remove(security.Symbol);
        }
    }
}

Data Point Attributes

The Business and Consumer Surveys dataset provides EurostatConsumerSurvey, EurostatIndustrySurvey, EurostatConstructionSurvey, EurostatRetailSurvey and EurostatServicesSurvey objects.

EurostatConsumerSurvey

EurostatConsumerSurvey objects have the following attributes:

EurostatIndustrySurvey

EurostatIndustrySurvey objects have the following attributes:

EurostatConstructionSurvey

EurostatConstructionSurvey objects have the following attributes:

EurostatRetailSurvey

EurostatRetailSurvey objects have the following attributes:

EurostatServicesSurvey

EurostatServicesSurvey objects have the following attributes:

You can also see our Videos. You can also get in touch with us via Discord.

Did you find this page helpful?

Contribute to the documentation: