markowitz.data.risk_free¶
markowitz.data.risk_free
¶
Risk-free rate utilities backed by FRED.
The wrapper exposes a tidy risk_free_rate Series indexed by tz-naive
midnight timestamps at the requested frequency, and a
de_annualize helper for converting annualized yields into the
per-period rates used in Sharpe ratio computations.
annualize_rate(per_period: pd.Series, frequency: str) -> pd.Series
¶
Inverse of :func:de_annualize. Provided for round-trip testing.
constant_rate(value: float, index: pd.DatetimeIndex) -> pd.Series
¶
Construct a constant-rate series — useful for tests and quick demos.
Source code in src/markowitz/data/risk_free.py
de_annualize(annual_pct: pd.Series, frequency: str) -> pd.Series
¶
Convert an annual rate (already in decimal, e.g. 0.05) to per-period.
Uses geometric de-annualization::
r_period = (1 + r_annual) ** (1 / periods_per_year) - 1
so a round-trip via the matching annualizer is exact.
Source code in src/markowitz/data/risk_free.py
risk_free_rate(start: DateLike, end: DateLike, *, series_id: str = 'DGS1MO', frequency: str = 'daily', api_key: str | None = None) -> pd.Series
¶
Fetch a FRED risk-free series and return it at frequency.
The FRED yield series are quoted in annualized percent (e.g. 5.32
means 5.32% per year). This function converts to decimal,
forward-fills any missing days inside the window, and resamples /
de-annualizes to the requested frequency.