Financial functions for Python providing performance analysis, risk metrics, portfolio optimization, and data retrieval for quantitative finance
npx @tessl/cli install tessl/pypi-ffn@1.1.0FFN is a comprehensive financial functions library for Python designed for quantitative finance professionals. It builds upon established data science libraries (Pandas, NumPy, SciPy) to offer utilities for performance measurement, evaluation, graphing, and common data transformations in financial analysis.
pip install ffnimport ffnCommon usage patterns:
# Import specific functions
from ffn import get, PerformanceStats, calc_perf_stats
# Data retrieval
import ffn.data as data
# Utils for formatting
from ffn.utils import fmtp, fmtnimport ffn
# Download price data
prices = ffn.get('AAPL,MSFT,GOOGL', start='2020-01-01', end='2023-01-01')
# Calculate returns
returns = prices.to_returns().dropna()
# Performance analysis
perf = ffn.calc_perf_stats(prices['AAPL'])
print(perf.display())
# Portfolio optimization - equal risk contribution weights
weights = ffn.calc_erc_weights(returns)
print(weights)
# Risk metrics
sharpe = ffn.calc_sharpe(returns['AAPL'])
max_dd = ffn.calc_max_drawdown(prices['AAPL'])
print(f"AAPL Sharpe Ratio: {sharpe:.2f}")
print(f"AAPL Max Drawdown: {max_dd:.2%}")FFN extends pandas objects automatically on import, enabling method chaining for functional composition:
# Method chaining example
result = (prices
.to_returns()
.dropna()
.calc_sharpe()
)Key components:
Comprehensive performance evaluation with detailed statistics, risk metrics, and visualization capabilities for single assets or portfolios.
class PerformanceStats:
def __init__(self, prices, rf=0.0, annualization_factor=None): ...
def display(self): ...
def plot(self, freq='D', figsize=None, title=None, logy=False, **kwargs): ...
class GroupStats:
def __init__(self, *prices): ...
def display(self): ...
def plot(self, freq='D', figsize=None, title=None, logy=False, **kwargs): ...
def calc_perf_stats(prices, risk_free_rate=0.0, annualization_factor=252): ...
def calc_stats(prices): ...Convert between prices and returns using various methods, including simple returns, log returns, and price indexing with rebasing capabilities.
def to_returns(prices): ...
def to_log_returns(prices): ...
def to_price_index(returns, start=100): ...
def rebase(prices, value=100): ...Calculate comprehensive risk measures including drawdowns, volatility-based ratios, and downside risk metrics for portfolio evaluation.
def calc_max_drawdown(prices): ...
def to_drawdown_series(prices): ...
def calc_sharpe(returns, rf=0.0, nperiods=None, annualize=True): ...
def calc_sortino_ratio(returns, rf=0.0, nperiods=None, annualize=True): ...
def calc_calmar_ratio(prices): ...
def to_ulcer_index(prices): ...Modern portfolio theory implementations including mean-variance optimization, risk parity approaches, and weight constraint utilities.
def calc_mean_var_weights(returns, weight_bounds=(0.0, 1.0), rf=0.0, covar_method="ledoit-wolf", options=None): ...
def calc_erc_weights(returns, initial_weights=None, risk_weights=None, covar_method="ledoit-wolf", risk_parity_method="ccd", maximum_iterations=100, tolerance=1e-8): ...
def calc_inv_vol_weights(returns): ...
def limit_weights(weights, limit=0.1): ...Financial data downloading with Yahoo Finance integration, CSV support, and flexible data provider architecture.
def get(tickers, provider=None, common_dates=True, forward_fill=False, clean_tickers=True, column_names=None, ticker_field_sep=":", mrefresh=False, existing=None, **kwargs): ...
def yf(ticker, field, start=None, end=None, mrefresh=False): ...
def csv(ticker, path="data.csv", field="", mrefresh=False, **kwargs): ...Advanced statistical tools including clustering algorithms, bootstrap resampling, and momentum calculations for quantitative research.
def calc_clusters(returns, n=None, plot=False): ...
def calc_ftca(returns, threshold=0.5): ...
def calc_prob_mom(returns, other_returns): ...
def resample_returns(returns, func, seed=0, num_trials=100): ...Data processing utilities including frequency conversion, merging, winsorization, and date calculations for financial time series.
def merge(*series): ...
def to_monthly(series, method="ffill", how="end"): ...
def winsorize(x, axis=0, limits=0.01): ...
def year_frac(start, end): ...
def calc_mtd(daily_prices, monthly_prices): ...
def calc_ytd(daily_prices, yearly_prices): ...
def infer_freq(data): ...
def infer_nperiods(data, annualization_factor=None): ...FFN automatically extends pandas Series and DataFrame objects with all financial analysis methods, enabling seamless method chaining and functional composition.
def extend_pandas(): ...
# All FFN functions become available as pandas methods:
Series.to_returns(): ...
Series.calc_sharpe(rf=0.0, nperiods=None, annualize=True): ...
Series.calc_perf_stats(rf=0.0, annualization_factor=252): ...
DataFrame.calc_erc_weights(): ...
DataFrame.plot_corr_heatmap(): ...
# ... and 35+ additional methods# Core constant
TRADING_DAYS_PER_YEAR: int = 252
# Main classes (see Performance Analysis section for details)
class PerformanceStats: ...
class GroupStats: ...