pyfinance
pyfinance is a Python package for investment management and analysis of security returns. It complements existing quantitative-finance packages such as pandas-datareader with a focused, batteries-included statistical toolkit.
Status
- Latest release: 2.0.2
- Python: 3.10, 3.11, 3.12, 3.13, 3.14
- License: MIT
Installation
uv add pyfinance
Or with pip:
pip install pyfinance
Modules
| Module | Description |
|---|---|
pyfinance.returns |
Statistical analysis of financial time series via the CAPM framework. TSeries / TFrame are Pandas subclasses that add performance statistics: annualized return/vol, Sharpe, Sortino, drawdown, capture ratios, alpha/beta, Information Ratio, and so on. |
pyfinance.ols |
Ordinary least-squares regression. OLS, RollingOLS (NumPy-backed), and PandasRollingOLS (Pandas-indexed wrapper). |
pyfinance.options |
Vectorized Black-Scholes-Merton valuation, Greeks, and implied volatility via BSM. Option strategies (Straddle, BullSpread, Butterfly, Condor, variants). |
pyfinance.general |
General-purpose computations: active share, amortization schedules, best-fit distribution, PCA on returns, portfolio simulation, tracking-error optimization, VIF. |
pyfinance.datasets |
A small set of dataset loaders: load_13f (SEC EDGAR), load_industries (Ken French), load_rates (FRED H.15), load_rf (3-month T-bill total-return series). |
pyfinance.utils |
Frequency conversion, rolling-window construction, one-hot encoding, random ticker/weights generation, availability reporting. |
Quick tutorial
TSeries — performance statistics
import numpy as np
import pandas as pd
from pyfinance import TSeries
rng = np.random.default_rng(444)
s = rng.standard_normal(400) / 100 + 0.0008
idx = pd.date_range(start="2016-01-01", periods=len(s))
ts = TSeries(s, index=idx)
ts.anlzd_ret() # annualized geometric return
ts.anlzd_stdev("D") # annualized stdev of returns
ts.max_drawdown() # worst peak-to-trough decline
ts.sharpe_ratio() # Sharpe, annualized
BSM — Black-Scholes-Merton options pricing
from pyfinance.options import BSM
op = BSM(S0=100, K=100, T=1, r=0.04, sigma=0.20)
op.value() # European call value
op.delta() # Greeks
op.implied_vol(10) # implied vol at a target price
# Vectorized across arrays of strikes.
import numpy as np
ops = BSM(S0=100, K=np.arange(100, 110), T=1, r=0.04, sigma=0.20)
ops.value()
OLS — regression
from pyfinance.ols import OLS
# y: 1-d array; x: 2-d array of explanatory variables.
model = OLS(y=y, x=x)
model.beta, model.alpha
model.rsq_adj, model.fstat, model.std_err
datasets.load_13f — SEC EDGAR 13F parser
SEC EDGAR requires a descriptive User-Agent
(policy). Supply one:
from pyfinance import datasets
url = (
"https://www.sec.gov/Archives/edgar/data/1040273/"
"000108514617001787/form13fInfoTable.xml"
)
df = datasets.load_13f(url, user_agent="Jane Doe (jane@example.com)")
Development
This repo is managed with uv:
git clone https://github.com/bsolomon1124/pyfinance
cd pyfinance
uv sync # install pinned runtime + dev deps
uv run pytest # run tests
uv run ruff check # lint
uv run ruff format # format
uv build # build sdist + wheel
Type checking uses ty:
uv run ty check
CI runs these across Python 3.10–3.14 on every push; see
.github/workflows/ci.yml.
Changelog
See CHANGELOG.md. Notably, pyfinance 2.0 dropped
load_factors, load_shiller, and load_retaildata because their
upstream sources had drifted past reasonable repair. See the 2.0
release notes for details and migration guidance.
License
MIT — see LICENSE.txt.
Metadata
Release files for pyfinance 2.0.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| pyfinance-2.0.2.tar.gz | 78.7 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| pyfinance-2.0.2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 130.7 kB
Release files / pyfinance-2.0.2.tar.gz
| Download URL | pyfinance-2.0.2.tar.gz |
|---|---|
| Size | 78.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
9406bd910e938058d3f3345e386fa0accdfcd93b7ac093b2f2178ff7daaa4995
|
|
BLAKE2b-256 checksum How to use checksums |
834fccfcadab2d37536bf1178ad8bc8f53d9f97c377b2b475f82fb2dd3c37539
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.13
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Apr 19, 2026.
Transparency logRelease files / pyfinance-2.0.2-py3-none-any.whl
| Download URL | pyfinance-2.0.2-py3-none-any.whl |
|---|---|
| Size | 52.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
dfae0b7295fa27da805ef9aa0d026f852c75b80a6a5ed76872b795a966983877
|
|
BLAKE2b-256 checksum How to use checksums |
db7ac3dbfc4646906e0331d99f835642a2098b088022b14ddc15de902ea1ef83
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.13
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Apr 19, 2026.
Transparency log