Companies, entities and tags
A signal is normally evaluated for one or more entities. These entities are typically dynamic and
given as input to the signal evaluation as a list of companies, entities or tags. However, in some
cases you may want a signal evaluated for a fixed set of entities, ignoring the evaluation entities.
The company()
, entity()
and tag()
functions can be used for exactly this.
- company(company_id, signal, errors_as_warnings=False)
Evaluate a signal for the given company or companies.
- Parameters:
company_id (str|List[str]) – One or more company identifiers. Each company identifier can be given as a Bloomberg ticker, ISIN, FactSet identifier, Exabel resource name or company name. It is recommended to use one of the specific identifiers instead of company name, as company name matching fails if multiple companies match the given name.
signal (Signal) – Signal to evaluate.
errors_as_warnings (bool) – Whether to convert errors for the underlying companies to warnings.
- entity(entity_id, signal, errors_as_warnings=False)
Evaluate a signal for the given entity or entities.
- Parameters:
entity_id (str|List[str]) – One or more entity identifiers. Each entity identifier must be specified as an Exabel resource name.
signal (Signal) – Signal to evaluate.
errors_as_warnings (bool) – Whether to convert errors for the underlying entities to warnings.
- tag(tag_id, signal, errors_as_warnings=False)
Evaluate a signal for all entities in the given tag or screen. If a screen is specified, the screen is resolved for the current date.
- Parameters:
tag_id (str) – Tag or screen resource name.
signal (Signal) – Signal to evaluate.
errors_as_warnings (bool) – Whether to convert errors for the underlying entities to warnings.
Exabel resource names for companies, entities and tags may be found in the user interface wherever a company / entity / tag has been selected, for example in Plotter, by clicking on the company / entity / tag, and copying its “Exabel name”. Alternatively, they are also retrievable from the API - use the Data API to list and search for companies and entities, and the Analytics API to list tags.
Entity set operations
company()
, entity()
and tag()
allows specifying a single company, entity or tag
(company()
and entity()
also supports multiple identifiers as a union). In addition, the
functions union()
, intersection()
and subtract()
can be used to create new sets of
entities combining companies, entities and tags. Each of these functions return an EntitySet
such that they can be nested. The input arguments to these functions are either an EntitySet
or
a company, entity or tag identifier. Supported identifiers are:
Tag: resource name.
Entity: resource name.
Company: Bloomberg ticker, ISIN, FactSet identifier, Exabel resource name, or company name.
For companies it is recommended to use one of the specific identifiers instead of company name, as company name matching fails if multiple companies match the given name.
To retrieve a signal for an EntitySet
use entity_set.retrieve(signal)
.
- union(set_1, set_2, ..., set_n)
Return an
EntitySet
which is the union of the given sets.- Parameters:
set_x (str|EntitySet) – An identifier for a tag, entity or company, or another
EntitySet
.
- intersection(set_1, set_2, ..., set_n)
Return an
EntitySet
which is the intersection of the given sets.- Parameters:
set_x (str|EntitySet) – An identifier for a tag, entity or company, or another
EntitySet
.
- subtract(set_1, set_2)
Return an
EntitySet
which contains all the entities inset_1
that are not part ofset_2
.- Parameters:
set_1 (str|EntitySet) – An identifier for a tag, entity or company, or another
EntitySet
.set_2 (str|EntitySet) – An identifier for a tag, entity or company, or another
EntitySet
.
Examples:
A signal that returns close price for Apple, Inc:
company('AAPL US', close_price)
A signal that returns the sum of close prices for Microsoft Corp. and Apple, Inc:
company(['MSFT US', 'AAPL US'], close_price).sum()
A signal that returns my_signal
for a given brand:
entity("entityTypes/ns.brand/entities/ns.brand1", my_signal)
A signal that returns close prices for all companies on the Oslo Stock Exchange, as separate time series:
tag("tags/exchange:xosl", close_price)
A signal that returns the sum of close prices for all companies in the given screen:
tag("screens/123", close_price).sum()
A signal that returns close prices for all companies on the London stock exchange within the
Footwear Retail
RBICS level 4 sector:
intersection('tags/exchange:xlon', 'tags/rbics:20251025').retrieve(close_price)
A signal that returns close prices for all companies on the London stock exchange within the
Footwear Retail
RBICS level 4 sector, except Dr. Martens Plc
:
subtract(intersection('tags/exchange:xlon', 'tags/rbics:20251025'), 'DOCS LN').retrieve(close_price)
Screen signal
The ‘screen’ signal indicates when entities are part of a given screen or not. The signal value is 1 when the entity is part of the screen, and 0, NaN or some other chosen value when it’s not.
This signal can be used to create an alpha signal from a screen.
Another use case is to only include signal values when the entity is part of the screen. This is achieved by setting NaN when the entity isn’t part of the screen, and then multiplying the original signal by this signal. This can be used when doing cross-sectional normalizing of a signal, to ensure that the signal is only normalized over the entities in the screen.
- screen(tag, screen_frequency='M', fill_value=0.0)
Evaluates the screen with the given frequency. One time series is produced for each evaluation entity (typically company). In each time series, there is a value for each date that the screen was evaluated for. The value is 1.0 if the company is part of the screen, and 0.0 if not (or some other specified
fill_value
).- Parameters:
tag – The tag ID of the screen.
screen_frequency – The frequency with which to evaluate the screen.
fill_value – The value to use when entities are not part of the screen, or
None
.
Examples:
An alpha signal that is 1 when a company is part of the screen, and 0 if not, evaluated at month end:
screen("screens/123")
An alpha signal that is 1 when a company is part of the screen, and -1 if not, evaluated weekly on Wednesdays:
screen("screens/123", "W-WED", -1)
Apply cross-sectional normalization of a signal across each sector, but only across the companies that are part of the screen:
(mySignal * screen("screens/123", "MS", None).upsample()).sector_neutral(level=2)