ETFs#
Learn more: Example notebooks
Environment#
Setting up your environment takes three steps:
Import the relevant internal and external libraries
Configure the environment parameters
Initialise the environment
import sigtech.framework as sig
from sigtech.framework.instruments.equities import ExchangeTradedFund
import pandas as pd
import seaborn as sns
sns.set(rc={'figure.figsize': (18, 6)})
sig.config.init();
Learn more: Setting up the environment
ETF instrument#
We can list available ETFs in a similar way to indices, by calling get_names
on the relevant class. In this case, it is done on the ExchangeTradedFund
class:
Input:
etf_names = ExchangeTradedFund.get_names()
etf_names[:5]
Output:
['AGG UP EQUITY',
'BIL UP EQUITY',
'BND UP EQUITY',
'BNDX UP EQUITY',
'DBC UP EQUITY']
You can retrieve an individual ETF through the common object API:
Input:
agg = sig.obj.get('AGG UP EQUITY')
agg
Output:
AGG UP EQUITY <class 'sigtech.framework.instruments.equities.ExchangeTradedFund'>[139953121183952]
Another way to list instruments is by retrieving an instrument’s group directly:
Input:
agg.group().query_instrument_names()[:5]
Output:
['AGG UP EQUITY',
'BIL UP EQUITY',
'BND UP EQUITY',
'BNDX UP EQUITY',
'DBC UP EQUITY']
It is also possible to access an instrument’s exchange as an object in its own right:
Input:
exchange = sig.obj.get(agg.exchange().name)
exchange
Output:
NYSEARC(T) EXCHANGE GROUP <class 'sigtech.framework.instruments.base.Exchange'>[139953149826448]
From an exchange you can access market holiday calendar names, for example:
Input:
exchange.holidays
Output:
'NYSEARC(T) CALENDAR'
Calendars are objects that you can fetch and interrogate:
Input:
calendar = sig.obj.get(exchange.holidays)
calendar
Output:
NYSEARC(T) CALENDAR <class 'sigtech.framework.infra.cal.calendar.Calendar'>[139953149818576]
Input:
calendar.holidays[:5]
Output:
[datetime.date(1973, 1, 1),
datetime.date(1973, 1, 25),
datetime.date(1973, 1, 25),
datetime.date(1973, 2, 19),
datetime.date(1973, 4, 20)]
To query the time series data from an ETF instrument, use the following API:
Python:
agg.history()
Output:
2003-09-29 102.17
2003-09-30 102.70
2003-10-01 102.65
2003-10-02 102.49
2003-10-03 101.75
...
2021-02-23 115.51
2021-02-24 115.47
2021-02-25 114.41
2021-02-26 115.34
2021-03-01 115.09
Name: (LastPrice, EOD, AGG UP EQUITY), Length: 4385, dtype: float64
Other time series related to the specific instrument are available as well:
Input:
agg.history_fields
Output:
['OPEN', 'HIGH', 'LOW', 'LastPrice', 'Volume']
By passing in one of the different history_fields
values as a parameter in the .history()
, different times series can be queried:
df_agg = pd.concat({
'High': agg.history('HIGH').loc['2020':],
'Low': agg.history('LOW').loc['2020':]
}, axis=1)
df_agg.plot(title='AGG UP Equity High / Low');
volume_agg = agg.history('Volume').loc['2021':]
volume_agg.index = [x.date() for x in volume_agg.index]
volume_agg.plot(title='AGG UP EQUITY Volume', kind='bar');
Apart from the time series data, a specific instrument also holds static data:
Input:
agg.data_dict()
Output:
{'instrument_id': None,
'data_source_all': [],
'available_data_points': ['EOD'],
'default_data_point': 'EOD',
'price_factor': 1.0,
'use_price_factor': True,
'intraday_times': [],
'intraday_tz_str': 'UTC',
'currency': 'USD',
'db_ticker': None,
'db_sector': None,
'exchange_code': None,
'activity_fields': ['Volume'],
'group_name': None,
'description': None,
'db_history_end_date': datetime.date(9999, 12, 31),
'market_impact': 0.02,
'issuer': 'NYSEARC(T)',
'liquid_date': Timestamp('1677-09-21 00:12:43.145225'),
'delist_date': datetime.date(9999, 12, 31),
'eq_identifier': 'AGG UP',
'company_name': 'iShares Core U.S. Aggregate Bond ETF',
'country': 'US',
'currency_multiplier': 1,
'isin': 'US4642872265',
'cusip': '464287226',
'us_ric': 'AGG.P',
'primary_bbg_ticker': 'AGG UP Equity',
'composite_bbg_ticker': 'AGG US Equity',
'bbg_unique_id': 'EQ0000000000737315',
'primary_us_bbg_ticker': 'AGG UP Equity',
'composite_us_bbg_ticker': 'AGG US Equity',
'sec_code': '',
'region_code': '1',
'corporate_actions_override': None,
'sec_master_id': None,
'fungible_id': None,
'company_id': None,
'underlying_index_ticker': 'LBUSTRUU Index',
'total_expenses': 0.05,
'prime_history_field': 'LastPrice'}
To compare several ETFs, the following example shows that the platform is highly compatible with, and makes use of, the Python Pandas library:
ptf_etfs = ['SPY UP EQUITY', 'QQQ UP EQUITY', 'VEA UP EQUITY',
'AGG UP EQUITY', 'VWO UP EQUITY']
etf_histories = pd.concat({
x: sig.obj.get(x).history() for x in ptf_etfs
}, axis=1).dropna()
etf_histories.columns = [x.split('_')[0] for x in etf_histories.columns]
etf_histories.tail()
(etf_histories / etf_histories.iloc[0]).plot(title='ETF Performance');