Skip to main content

arctic-incr-cache

ArcticDB-backed time series cache with incremental updates.

First call fetches the full window from your data source and stores it in ArcticDB. Subsequent calls only fetch the gap between the cached tail and the requested end — then merge and upsert. Incomplete (still-updating) bars are automatically excluded from storage so they never overwrite finalised data.

Install

pip install arctic-incr-cache
# or
uv add arctic-incr-cache

Quick start

import datetime
import arcticdb as adb
from zoneinfo import ZoneInfo
from arctic_incr_cache import IncrCache

arctic = adb.Arctic("lmdb://data/arcticdb")
lib = arctic.get_library("ohlcv-1d", create_if_missing=True)

cache = IncrCache(
    lib,
    fetch=lambda symbol, end, count: your_api.get_daily_bars(symbol, end=end, count=count),
    get_tz=lambda symbol: ZoneInfo("America/New_York"),
)

df = cache.get("AAPL", end=datetime.date(2024, 6, 1), count=60)
  • First call — fetches 60 bars from your API, stores in ArcticDB, returns.
  • Second call (same or later end) — serves from ArcticDB; fetches only the gap if the cache is stale.

Intraday data

Set bar_minutes to the bar width and provide get_tz to return the market timezone:

from zoneinfo import ZoneInfo

intraday = IncrCache(
    lib,
    fetch=lambda symbol, end, count: your_api.get_minute_bars(symbol, end=end, count=count),
    bar_minutes=1,
    default_count=390 * 5,
    get_tz=lambda symbol: ZoneInfo("America/New_York"),
)

Concurrency

By default writes run in a daemon thread. Pass spawn and lock_class for gevent or other async runtimes:

import gevent
import gevent.lock

cache = IncrCache(
    lib,
    fetch=my_fetch,
    spawn=gevent.spawn,
    lock_class=gevent.lock.BoundedSemaphore,
)

Timezone handling

When get_tz returns a timezone for a symbol:

  • fetch return — must be tz-aware. Timestamps are converted to the configured market timezone internally.
  • Storage — data is stored in ArcticDB as tz-aware in the configured timezone.
  • Returnget() returns a tz-aware DataFrame in the configured timezone.
  • end parameterdate becomes end-of-day in market timezone; naive datetime is interpreted as local timezone, then converted; tz-aware is converted directly.

Interval convention

end is a bar timestamp (a point), not a range boundary.

  • Filter — closed: index <= end. fetch() must follow the same rule (start <= ts <= end); a strict < silently drops bar@end.
  • Freshness:
    • Daily — closed: last.date() >= end.date().
    • Intraday — right-open: last >= end - bar_width. An intraday bar at t covers [t, t+bar_width), so bar@end doesn't exist at session boundaries (e.g. 16:00 close, 20:00 POST end).

A still-updating bar (now daily; within bar_width intraday) counts as one bar older for freshness — mirroring its exclusion from storage.

Index convention

fetch() must return a DataFrame with a DatetimeIndex as the index — this is the time axis for all cache operations (querying, merging, freshness checks). ArcticDB's date_range queries operate on the index, so no column name configuration is needed. If your data source returns time as a regular column, call df.set_index("date") (or similar) inside your fetch function.

Constructor parameters

Parameter Required Description
library yes ArcticDB library instance
fetch(symbol, end, count) yes Fetch raw data from upstream; must return tz-aware timestamps
get_tz(symbol) yes Market timezone (tzinfo) for each symbol
bar_minutes no Bar width in minutes (default 1440 = daily)
default_count no Bars returned when count is omitted (default 252)
spawn no Fire-and-forget callable for async writes (default: daemon thread)
lock_class no Lock constructor (default: threading.Lock)

License

MIT

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

arctic_incr_cache-0.1.21.tar.gz (69.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

arctic_incr_cache-0.1.21-py3-none-any.whl (9.2 kB view details)

Uploaded Python 3

File details

Details for the file arctic_incr_cache-0.1.21.tar.gz.

File metadata

  • Download URL: arctic_incr_cache-0.1.21.tar.gz
  • Upload date:
  • Size: 69.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.6

File hashes

Hashes for arctic_incr_cache-0.1.21.tar.gz
Algorithm Hash digest
SHA256 3fca308f80c9908438fc3610e0bea37cd83909a495deb8a55581e3b376e82ee5
MD5 b97746769ecd5db8a8e40b53fd90747f
BLAKE2b-256 6576a33e64b4887684ec3fccdbcd1189c59a14f58ee55d86f52d471b3a84d9ca

See more details on using hashes here.

File details

Details for the file arctic_incr_cache-0.1.21-py3-none-any.whl.

File metadata

File hashes

Hashes for arctic_incr_cache-0.1.21-py3-none-any.whl
Algorithm Hash digest
SHA256 64d709e930dd5f3ccfa52b555f082c7f1543d58913123d9080c593adea2b1b1a
MD5 dc147fb00fea28d02704f1d3bda56c27
BLAKE2b-256 e6444b3aef50c71173f9009137f1f48d56daf516f3502b7fdd0345a60b8c26df

See more details on using hashes here.

Release history Release notifications | RSS feed

0.1.29

2 files

0.1.28

2 files

0.1.26

2 files

0.1.25

2 files

0.1.24

2 files

0.1.23

2 files

This release

0.1.21 This release

2 files

0.1.20

2 files

0.1.19

2 files

0.1.16

2 files

0.1.15

2 files

0.1.14

2 files

0.1.13

2 files

0.1.12

2 files

0.1.11

2 files

0.1.10

2 files

0.1.9

2 files

0.1.8

2 files

0.1.7

2 files

0.1.6

2 files

0.1.5

2 files

0.1.4

2 files

0.1.3

2 files

0.1.2

2 files

0.1.1

2 files

0.1.0

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page