Quickstart

See Installation for prerequisites and install instructions.


Financial metrics

Compute performance metrics on a return series:

import numpy as np
import fynance as fy

returns = np.random.randn(252) * 0.01   # daily returns, one year

print(fy.sharpe(returns))               # annualised Sharpe ratio
print(fy.calmar(returns))               # Calmar ratio
print(fy.mdd(returns))                  # maximum drawdown
print(fy.annual_return(returns))        # annualised return
print(fy.annual_volatility(returns))    # annualised volatility

All metrics also have rolling variants (roll_sharpe, roll_mdd, …) that return a time series rather than a scalar:

roll_sr = fy.roll_sharpe(returns, w=63)  # 63-day rolling Sharpe
roll_dd = fy.roll_drawdown(returns)       # rolling drawdown curve

See Features (fynance.features) for the full list of metrics, indicators, and momentums.


Technical indicators and momentums

prices = np.cumprod(1 + returns)

sma   = fy.sma(prices, w=20)         # 20-day simple moving average
ema   = fy.ema(prices, w=20)         # exponential moving average
rsi   = fy.rsi(prices, w=14)         # RSI oscillator
upper, mid, lower = fy.bollinger_band(prices, w=20, n=2)

Portfolio allocation

Build risk-parity and minimum-variance portfolios from a covariance matrix:

from fynance.algorithms import ERC, HRP, MVP

cov = np.cov(np.random.randn(5, 252))   # 5-asset covariance

w_erc = ERC(cov)()    # Equal Risk Contribution
w_hrp = HRP(cov)()    # Hierarchical Risk Parity
w_mvp = MVP(cov)()    # Minimum Variance Portfolio

print(w_erc.round(4))

See Financial algorithms (fynance.algorithms) for all allocation methods and the rolling wrapper.


Walk-forward neural network

Train and evaluate a multi-layer perceptron over a rolling walk-forward window:

from fynance.models.rolling import RollMultiLayerPerceptron

X = np.random.randn(500, 10).astype(np.float32)   # features
y = np.random.randn(500, 1).astype(np.float32)    # targets

model = RollMultiLayerPerceptron(
    X, y,
    layers=[64, 32],
    activation='ReLU',
)
# 252-day train window, 21-day test, 21-day roll step
model(n=252, s=21, r=21)

for result in model:
    print(result.perf_train, result.perf_test)

See Financial models (fynance.models) for LSTM, GRU, MultiHeadAttention, and custom loss functions.


Custom loss functions (PyTorch)

Replace MSE with a financial loss to optimise Sharpe or directional accuracy directly during training:

from fynance.models.loss import SharpeLoss, SortinoLoss, DirectionalAccuracyLoss

criterion = SharpeLoss(period=252)   # maximise annualised Sharpe

# Drop-in replacement for torch.nn.MSELoss inside any training loop:
loss = criterion(y_pred, y_true)
loss.backward()

See Financial models (fynance.models) for the full loss API and base class BaseLoss.