Skip to main content

Standard financial calculations

Project description

finance calcs

Standard financial calculations

Build Status codecov License PyPI

Overview

finance-calcs provides financial calculations as composable Polars expressions. It is designed for lazy execution, namespace-style ergonomics, and direct interoperability with the rest of the finance-* stack.

The public API follows a few rules:

  • every expression metric accepts and returns pl.Expr
  • metrics are exposed once, with optional window= and period= controls rather than separate rolling, monthly, and annual variants
  • functions are also available through the .fcalcs namespace on both pl.Expr and pl.Series
  • examples use synthetic but realistic fixtures from finance-datagen

Implemented coverage

Topic Functions
Returns and periods period_bucket, simple_returns, log_returns, cum_returns, cum_returns_final, returns, aggregate_returns, annualized_return, annualized_volatility
Risk and drawdown volatility, sharpe, sortino, calmar, downside_deviation, downside_risk, drawdown_series, underwater_series, max_drawdown, value_at_risk, conditional_value_at_risk, parametric_var
Technical indicators Moving averages, Bollinger/Donchian channels, momentum oscillators, range volatility, and volume indicators
Alpha and quantiles Forward returns, conditional/horizon IC, IC decay, IC summaries, quantile assignment, signal normalization, quantile returns, turnover, and long/short spreads
Factor and benchmark metrics Alpha, beta, up/down capture, batting average, tracking error, and information ratio
Distribution and tail risk Higher moments, Sharpe significance helpers, tail ratio, ulcer index, omega ratio, GPD VaR, and GPD CVaR
Portfolio and post-trade Exposure, concentration, active share, transaction costs/volume/attribution, slippage, turnover, round trips, MAE/MFE, and trade-quality metrics

See the Examples page for workflows with generated data and the API page for a complete grouped reference for every public function.

Quick start

Generate a deterministic daily equity path with finance-datagen, then compute return and risk metrics as Polars expressions.

import polars as pl
from finance_datagen import generate_prices

import finance_calcs as fc

prices = generate_prices(symbol="ACME", seed=7)

out = prices.with_columns(
    pl.col("price").fcalcs.simple_returns().alias("ret"),
).select(
    fc.returns(pl.col("ret")).alias("total_return"),
    pl.col("ret").fcalcs.annualized_return().alias("ann_return"),
    pl.col("ret").fcalcs.volatility().alias("ann_vol"),
    pl.col("ret").fcalcs.sharpe().alias("sharpe"),
    pl.col("ret").fcalcs.max_drawdown().alias("max_drawdown"),
)

Use finance-datagen.ohlc_from_close when calculations need OHLCV bars:

from finance_datagen import ohlc_from_close

bars = ohlc_from_close(prices["price"], symbol="ACME", seed=7)

features = bars.with_columns(
    pl.col("close").fcalcs.sma(20).alias("sma_20"),
    pl.col("close").fcalcs.rsi(14).alias("rsi_14"),
    fc.atr(pl.col("high"), pl.col("low"), pl.col("close")).alias("atr_14"),
    fc.obv(pl.col("close"), pl.col("volume")).alias("obv"),
)

Period and frequency slices

Use period= for calendar-style slices and keep window= for rolling row-count windows. A period can be a finance_enums.Frequency, any alias accepted by finance_enums.to_frequency(), any Polars dt.truncate() duration string, or a precomputed bucket expression.

import polars as pl
from finance_enums import Frequency

monthly = prices.with_columns(
    pl.col("price").fcalcs.simple_returns().alias("ret"),
).with_columns(
    fc.period_bucket(pl.col("timestamp"), Frequency.Month).alias("month"),
    pl.col("ret").fcalcs.returns(period="month", date=pl.col("timestamp")).alias("month_return"),
    pl.col("ret").fcalcs.sharpe(period="1q", date=pl.col("timestamp")).alias("quarter_sharpe"),
)

For fiscal periods, strategy regimes, or exchange-calendar grids built upstream, pass the bucket expression directly:

bucketed = prices.with_columns(
    pl.col("price").fcalcs.simple_returns().alias("ret"),
    pl.col("timestamp").dt.year().alias("fiscal_year"),
).with_columns(
    fc.returns(pl.col("ret"), period=pl.col("fiscal_year")).alias("fiscal_return"),
)

Stack integration

finance-calcs is intended to pair with:

  • finance-datagen for synthetic fixtures and test inputs
  • finance-dates for calendar-aware date handling upstream
  • finance-enums for shared enum-backed trading semantics upstream

That keeps calculations focused on typed expressions instead of schema cleanup, string parsing, or calendar repair.

Project details


Download files

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

Source Distribution

finance_calcs-0.2.0.tar.gz (45.7 kB view details)

Uploaded Source

Built Distributions

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

finance_calcs-0.2.0-cp310-abi3-win_amd64.whl (144.6 kB view details)

Uploaded CPython 3.10+Windows x86-64

finance_calcs-0.2.0-cp310-abi3-manylinux_2_28_x86_64.whl (261.5 kB view details)

Uploaded CPython 3.10+manylinux: glibc 2.28+ x86-64

finance_calcs-0.2.0-cp310-abi3-macosx_11_0_arm64.whl (238.7 kB view details)

Uploaded CPython 3.10+macOS 11.0+ ARM64

File details

Details for the file finance_calcs-0.2.0.tar.gz.

File metadata

  • Download URL: finance_calcs-0.2.0.tar.gz
  • Upload date:
  • Size: 45.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.13

File hashes

Hashes for finance_calcs-0.2.0.tar.gz
Algorithm Hash digest
SHA256 455e060950a6d558462f3606a267b8126034e64c24e064c5aba1c3307cfa18d2
MD5 3fcdaec69c87174fe3f33965e31cffd6
BLAKE2b-256 1653e9696d8464a99261d9f8e3e6fbf308ba6ac4b96c8c86a88a66ba9bdef4fa

See more details on using hashes here.

File details

Details for the file finance_calcs-0.2.0-cp310-abi3-win_amd64.whl.

File metadata

File hashes

Hashes for finance_calcs-0.2.0-cp310-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 a5ef5a157d2c9dc53ca2fcc2d1bbadb6734552f8b0c691fb6004a54b0f553c45
MD5 96919ff32835c648a2a26a4def846ae3
BLAKE2b-256 816fa2d62c7fbaded7c0d2c146cb9a00fe56e051967dd009702d3192e180d8f9

See more details on using hashes here.

File details

Details for the file finance_calcs-0.2.0-cp310-abi3-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for finance_calcs-0.2.0-cp310-abi3-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 568f30b8b5be453203d14524b0f3fb734426fdce4449c0e71bdfe7d278ba57da
MD5 c5ecb66c219910d652148c4928920d96
BLAKE2b-256 dffa601a54c0c30258125b0cbe693c0e407149e287159954adde37b57f45a910

See more details on using hashes here.

File details

Details for the file finance_calcs-0.2.0-cp310-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for finance_calcs-0.2.0-cp310-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 d2b581e258caa54de9e3de305a6f0374ac55a972d9a7c02ddfe73eaaecd8a9f2
MD5 b8692f6c796c6ebdd9415766f673c863
BLAKE2b-256 8c180bfcee97f1eb22b58065ccc49c68fc12d10e64907f6b678bc9e9b8e32e3f

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page