npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@pond-ts/financial

v0.70.0

Published

Financial-market domain library on pond-ts: trading calendars, session-aligned OHLCV bars, and 60+ oracle-verified technical studies (SMA, EMA, RSI, MACD, Bollinger, ATR, VWAP, …)

Downloads

2,272

Readme

@pond-ts/financial

npm CI docs

Technical studies and a trading calendar on pond-ts.

Twenty oracle-verified studies (moving averages, bands, RSI, MACD, ATR, stochastics, Donchian, OBV, VWAP, …) that append columns to a bar TimeSeries, plus a TradingCalendar that knows when the market is open so rolling windows, bucketing and chart axes stop at the close. Pure computation: browser + Node, no data fetching, no rendering, no React (the chart side lives in @pond-ts/charts).

npm install @pond-ts/financial pond-ts

pond-ts is a peer dependency; the pond packages release together, so keep their ranges in step.

Quick start

A study takes a series and options and returns the series with more columns on it. Import the fluent entry once and chain them:

import '@pond-ts/financial/fluent';

const study = bars // a TimeSeries with open/high/low/close/volume columns
  .bollinger({ period: 20 })
  .ema({ period: 10 })
  .rsi({ period: 14 })
  .macd({ fastPeriod: 12, slowPeriod: 26, signalPeriod: 9 })
  .vwap({ period: 20 });
// + bbUpper/bbMiddle/bbLower, ema, rsi, macdLine/macdSignal/macdHist, vwap

Every study is also a plain function, for code that would rather not augment TimeSeries:

import { bollinger, ema } from '@pond-ts/financial';

const same = ema(bollinger(bars, { period: 20 }), { period: 10 });

Each study reads a column (default 'close', or the named high / low / close / volume inputs for the multi-input ones) so it runs over any numeric column, including another study's output. Periods are bar counts. Warm-up rows are undefined and the row count is preserved, so the result lines up on the source's time axis.

A trading calendar turns "5-minute bars" into session-aligned bars — no weekend or holiday buckets, no bar spanning the close:

import { TradingCalendar } from '@pond-ts/financial';

const cal = TradingCalendar.fromRules(
  { timeZone: 'America/New_York', open: '09:30', close: '16:00' },
  { from: '2026-01-05', to: '2026-02-13' },
);

const fiveMin = ticks.aggregate(cal.barSequence('5m'), {
  close: { from: 'price', using: 'last' },
});
cal.isOpen(instant); // inside a session and not inside a break

What's in the box

  • Studies — verified bar-for-bar against a pandas oracle before they ship, the named indicators against TA-Lib as well:
    • averages and bands: sma, ema, bollinger, envelope, donchian, vwap
    • oscillators: rsi, macd, stochastic, williamsR, momentum, percentChange, zScore, obv
    • volatility and range: atr, historicalVolatility, rollingStdev, rollingMin, rollingMax, rollingPercentile
  • @pond-ts/financial/fluent — mounts every study as a TimeSeries method (opt-in by import; ESM only).
  • TradingCalendarfromRules (hours, weekmask, holidays, breaks, earlyCloses, resolved DST-correctly in the exchange's time zone) or fromSessions (an explicit list); sessions(), sessionOn(), isTradingDay(), isOpen(), sessionSequence() / barSequence() for bucketing, and tagSessions() to key a partitionBy so stateful ops never bridge a close.
  • Discontinuity providersweekendSkip(), segmentDiscontinuity(), identityDiscontinuity() and calendar.discontinuities(): the d3fc-style five-method surface a trading-time axis consumes. @pond-ts/charts reads it structurally, so there is no package coupling.
  • @pond-ts/financial/parallel — Node-only: .withWorkers() runs the rolling studies across worker threads for large partitioned series.

Bar-for-bar vendor parity is a non-goal: where a study deliberately departs from TA-Lib (a flat window is undefined, not 0; a gap in a running sum propagates rather than being skipped) the docstring says so and a test pins it.

Documentation

Guides, live examples and the full API live at https://pond-ts.org — the package page and the financial charts hub. Source and issues: github.com/pond-ts/pond.

License

MIT