Coverage for src/jquantstats/__init__.py: 100%
13 statements
« prev ^ index » next coverage.py v7.16.1, created at 2026-09-23 04:11 +0000
« prev ^ index » next coverage.py v7.16.1, created at 2026-09-23 04:11 +0000
1"""jQuantStats: Portfolio analytics for quants.
3Two entry points
4----------------
5**Entry point 1 — prices + positions (recommended for active portfolios):**
7Use `Portfolio` when you have price series and
8position sizes. Portfolio compiles the NAV curve from raw inputs and exposes
9the full analytics suite via ``.stats``, ``.plots``, and ``.report``.
11 >>> import polars as pl
12 >>> from jquantstats import Portfolio
13 >>> prices = pl.DataFrame(
14 ... {"date": ["2023-01-01", "2023-01-02", "2023-01-03"], "A": [100.0, 101.0, 99.0]}
15 ... ).with_columns(pl.col("date").str.to_date())
16 >>> positions = pl.DataFrame(
17 ... {"date": ["2023-01-01", "2023-01-02", "2023-01-03"], "A": [1000.0, 1000.0, 1000.0]}
18 ... ).with_columns(pl.col("date").str.to_date())
19 >>> pf = Portfolio.from_cash_position(prices=prices, cash_position=positions, aum=1_000_000)
20 >>> pf.assets
21 ['A']
22 >>> sorted(pf.stats.sharpe())
23 ['returns']
24 >>> type(pf.plots.snapshot()).__name__
25 'Figure'
27**Entry point 2 — returns series (for arbitrary return streams):**
29Use `Data` when you already have a returns series
30(e.g. downloaded from a data vendor) and want benchmark comparison or
31factor analytics.
33 >>> from jquantstats import Data
34 >>> returns = pl.DataFrame(
35 ... {"date": ["2023-01-01", "2023-01-02", "2023-01-03"], "Asset1": [0.01, -0.02, 0.03]}
36 ... ).with_columns(pl.col("date").str.to_date())
37 >>> benchmark = pl.DataFrame(
38 ... {"date": ["2023-01-01", "2023-01-02", "2023-01-03"], "Market": [0.005, -0.01, 0.02]}
39 ... ).with_columns(pl.col("date").str.to_date())
40 >>> data = Data.from_returns(returns=returns, benchmark=benchmark)
41 >>> data.benchmark.columns
42 ['Market']
43 >>> type(data.plots.snapshot(title="Performance")).__name__
44 'Figure'
46The two APIs are layered: ``portfolio.data`` returns a `Data`
47object so you can always drop into the returns-series API from a Portfolio.
49 >>> type(pf.data).__name__
50 'Data'
52**Choosing a rendering backend:**
54Charts render with Plotly by default. Install ``jquantstats[mpl]`` and select
55matplotlib for static figures instead — appreciably cheaper when a script builds
56many charts at once. See `set_plot_backend`, `plot_backend` and
57`get_plot_backend`.
59 >>> from jquantstats import get_plot_backend
60 >>> get_plot_backend()
61 'plotly'
63For more information, visit the `jQuantStats Documentation <https://jebel-quant.github.io/jquantstats/book>`_.
64"""
66import importlib.metadata
68from ._cost_model import CostModel as CostModel
69from ._plots._backend import get_plot_backend as get_plot_backend
70from ._plots._backend import plot_backend as plot_backend
71from ._plots._backend import set_plot_backend as set_plot_backend
72from ._types import NativeFrame as NativeFrame
73from ._types import NativeFrameOrScalar as NativeFrameOrScalar
74from .data import Data as Data
75from .data import interpolate as interpolate
76from .portfolio import Portfolio as Portfolio
77from .result import Result as Result
79__version__ = importlib.metadata.version("jquantstats")
81__all__ = [
82 "CostModel",
83 "Data",
84 "NativeFrame",
85 "NativeFrameOrScalar",
86 "Portfolio",
87 "Result",
88 "get_plot_backend",
89 "interpolate",
90 "plot_backend",
91 "set_plot_backend",
92]