Caching service#

This page demonstrates SigTech’s Strategy Service. The class allows you to:

  • Persist built strategies between sessions, reducing computational resources.

  • Share built strategies between users within an organisation.

The Strategy Service is a multi-level cache. It consists of an in-memory layer and an AWS S3 cloud storage layer. It employs a write-through caching policy, which pickles and writes objects to memory and storage simultaneously.

Environment#

This section imports the relevant internal and external libraries, and sets up the platform environment.

When using the Strategy Service, pay close attention to their env_date.

Learn more: Setting up the environment

import datetime as dtm
import sigtech.framework as sig
from sigtech.framework.default_strategy_objects.single_stock_strategies import get_single_stock_strategy

if not sig.config.is_initialised():
    env = sig.init(env_date='2022-01-30')

# To set up a custom default start date
sig.env()[sig.config.DEFAULT_RS_START_DATE] = dtm.date(2009, 1, 2)

Create & persist built strategy objects#

Create, build and persist a set of reinvestment strategies within the strategy service. The cached strategy objects will then be retrieved in a separate session.

The strategy service can be instantiated through the environment method:

STRATEGY_SERVICE = env.strategy_service()

Time the creation of the four reinvestment strategies with the %%time magic method:

Input:

%%time

tickers = ['AAPL', 'MSFT', 'NFLX', 'CSCO']

rs = [get_single_stock_strategy(exchange_ticker=t) for t in tickers]

rs

Output:

[AAPL REINV STRATEGY <class 'sigtech.framework.strategies.reinvestment_strategy.ReinvestmentStrategy'>[139936205997264],
 MSFT REINV STRATEGY <class 'sigtech.framework.strategies.reinvestment_strategy.ReinvestmentStrategy'>[139936205805520],
 NFLX REINV STRATEGY <class 'sigtech.framework.strategies.reinvestment_strategy.ReinvestmentStrategy'>[139936482567888],
 CSCO REINV STRATEGY <class 'sigtech.framework.strategies.reinvestment_strategy.ReinvestmentStrategy'>[139936205522128]]

CPU times: user 11.9 s, sys: 11.9 s, total 13.9 s
Wall time: 13.9s

The four reinvestment strategies are now cached in the strategy service.

Note: the cached strategy objects must be built or the service will throw an error when attempting to retrieve the strategies.

Note: the cached strategies have been built up to and cached under the environment’s env_date.

A key string is generated and outputted for each cached strategy using the following format:

Strategy Name | Environment Date || Environment Hash

Input:

STRATEGY_SERVICE.cache_strategy(rs)

Output:

['AAPL REINV STRATEGY|2022-01-30T00:00:00+00:00||41160d054edf7f0960015019d902b27e',
 'MSFT REINV STRATEGY|2022-01-30T00:00:00+00:00||41160d054edf7f0960015019d902b27e',
 'NFLX REINV STRATEGY|2022-01-30T00:00:00+00:00||41160d054edf7f0960015019d902b27e',
 'CSCO REINV STRATEGY|2022-01-30T00:00:00+00:00||41160d054edf7f0960015019d902b27e']

Retrieve cached strategies in a separate session#

The environment is recreated. The env_date must be consistent with the cached strategies you want to access:

sig.de_init()

env = sig.init(env_date='2022-01-30')

STRATEGY_SERVICE = env.strategy_service()

All cached strategy objects matching a key prefix can be queried. Users have access to all strategies that have been cached within their organisation across all users.

Input:

appl_keys = STRATEGY_SERVICE.get_keys_by_prefix('AAPL')
appl_keys

Output:

['AAPL REINV STRATEGY|2022-01-31T00:00:00+00:00||41160d054edf7f0960015019d902b27e',
 'AAPL REINV STRATEGY|2022-01-30T00:00:00+00:00||41160d054edf7f0960015019d902b27e',
 'AAPL REINV STRATEGY|2021-11-30T00:00:00+00:00||07f24d6b1ef83e37aeb5dc5443ff48aa',
 'AAPL REINV STRATEGY|2022-01-20T00:00:00+00:00||07f24d6b1ef83e37aeb5dc5443ff48aa']

Individual strategy objects can now be retrieved by key or name:

STRATEGY_SERVICE.get_strategy_by_name(f'AAPL REINV STRATEGY')
STRATEGY_SERVICE.get_strategy_by_key(appl_keys[0])

Retrieving the four reinvestment strategies is much faster than building them from scratch. Ensure the env_date matches the env_date of the cached strategies being accessed:

Input:

%%time

rs = [STRATEGY_SERVICE.get_strategy_by_name(f'{t} REINV STRATEGY') for t in tickers]

rs

Output:

[AAPL REINV STRATEGY <class 'sigtech.framework.strategies.reinvestment_strategy.ReinvestmentStrategy'>[139936205997264],
 MSFT REINV STRATEGY <class 'sigtech.framework.strategies.reinvestment_strategy.ReinvestmentStrategy'>[139936205805520],
 NFLX REINV STRATEGY <class 'sigtech.framework.strategies.reinvestment_strategy.ReinvestmentStrategy'>[139936482567888],
 CSCO REINV STRATEGY <class 'sigtech.framework.strategies.reinvestment_strategy.ReinvestmentStrategy'>[139936205522128]]

CPU times: user 43.7 ms, sys: 0 ns, total: 43.7 ms
Wall time: 141 ms

Remove strategies from the cache#

Cached objects can be removed from the service by key or name:

STRATEGY_SERVICE.remove_strategy_by_name(f'AAPL REINV STRATEGY')
STRATEGY_SERVICE.remove_strategy_by_key(appl_keys[0])

Strategy cache decorator#

The strategy_service_cache decorator can be used to wrap a function returning a built strategy object.

  • The decorator attempts to retrieve a strategy from the strategy service.

  • If found, the strategy object is returned.

  • If not found, the wrapped function is called and the returned strategy object is cached using the Strategy Service.

from sigtech.framework.services.strategy_service.service import strategy_service_cache

@strategy_service_cache('AAPL REINV STRATEGY')
def get_appl_rs():
    return get_single_stock_strategy(exchange_ticker='AAPL')

get_appl_rs().build()

Caching Objects#

The Objects Service is analogous to the Strategy Service, and can be used to cache and persist objects.

The following example builds and caches an equity universe from the equity_universe_filter:

1. Initiate object_service#

OBJECT_SERVICE = env.object_service()

2. Create & cache universe series#

Input:

%%time

universe = sig.EquityUniverseFilter('DAX INDEX', use_add_order=True)

universe = universe.apply_filter(dtm.date(2022, 1, 4))

Output:

2022-01-04    [1225253.SINGLE_STOCK.TRADABLE, 1324073.SINGLE...
dtype: object

CPU times: user 43.7 ms, sys: 0 ns, total: 43.7 ms
Wall time: 141 ms

The object is cached using the Object Service’s put method:

OBJECT_SERVICE.put('DAX 20220104', universe)

3. Restart session & load pre-built universe#

sig.de_init()

env = sig.init(env_date='2022-01-30')

OBJECT_SERVICE = env.object_service()

All cached objects can be queried by prefix:

Input:

OBJECT_SERVICE.keys('')

Output:

['DAX 20220104',
 'SPX UNIVERSE 2008']

The prebuilt universe is retrieved with the get method:

Input:

%%time
universe = OBJECT_SERVICE.get('DAX 20220104')

Output:

CPU times: user 6.71 ms, sys: 640 µs, total: 7.35 ms
Wall time: 52.1 ms

Objects can equally be removed from the cache:

OBJECT_SERVICE.delete('DAX 20220104')

Like the Strategy Service, the object_service_cache decorator can wrap a function and return a built object:

from sigtech.framework.services.strategy_service.service import object_service_cache

@object_service_cache('DAX 20220104')
def get_universe():
    return universe

get_universe()

In this example, the object is saved with the {name}_{env.asofdate} key.

Output:

%%time

tickers = ['AAPL', 'MSFT', 'NFLX', 'CSCO']

rs = [get_single_stock_strategy(exchange_ticker=t) for t in tickers]

rs

Output:

[AAPL REINV STRATEGY <class 'sigtech.framework.strategies.reinvestment_strategy.ReinvestmentStrategy'>[139936205997264],
 MSFT REINV STRATEGY <class 'sigtech.framework.strategies.reinvestment_strategy.ReinvestmentStrategy'>[139936205805520],
 NFLX REINV STRATEGY <class 'sigtech.framework.strategies.reinvestment_strategy.ReinvestmentStrategy'>[139936482567888],
 CSCO REINV STRATEGY <class 'sigtech.framework.strategies.reinvestment_strategy.ReinvestmentStrategy'>[139936205522128]]

CPU times: user 11.9 s, sys: 11.9 s, total 13.9 s
Wall time: 13.9s