Skip to content

Quickstart

Option Pricing in 5 Lines

from qufin.options.european import EuropeanOption

opt = EuropeanOption(s0=100, k=105, sigma=0.2, r=0.05, T=1.0)
print(f"Price: ${opt.bs_price():.2f}")
print(f"Delta: {opt.bs_delta():.4f}")
print(f"Vega:  {opt.bs_vega():.4f}")

Portfolio Optimization

Classical (Mean-Variance)

import numpy as np
from qufin.portfolio.classical.mean_variance import mean_variance, Objective

# 5-asset example
mu = np.array([0.10, 0.08, 0.12, 0.06, 0.15])
cov = np.diag([0.04, 0.03, 0.05, 0.02, 0.06])

result = mean_variance(mu, cov, objective=Objective.MAX_SHARPE)
print(f"Weights: {result.weights}")
print(f"Sharpe:  {result.sharpe_ratio:.2f}")

Quantum (QAOA)

from qufin.portfolio.qubo import PortfolioQUBO
from qufin.portfolio.optimizers.qaoa import QAOAPortfolio, QAOAConfig
from qufin.backends.qiskit_backend import QiskitAerBackend

# Build QUBO problem
qubo = PortfolioQUBO(mu=mu, cov=cov, gamma=1.0, cardinality=3, budget_penalty=1e4)

# Configure QAOA with XY mixer (preserves cardinality)
config = QAOAConfig(p=2, mixer="xy_ring", cardinality=3, shots=4096)
backend = QiskitAerBackend(seed=42)

solver = QAOAPortfolio(qubo, config, backend)
result = solver.run()
print(f"Selected assets: {result.best_bitstring}")
print(f"Weights: {result.weights}")

Risk Analysis

from qufin.risk.classical_var import historical_var, portfolio_var

# Portfolio VaR
returns = np.random.default_rng(42).normal(0.0003, 0.015, (252, 5))
weights = np.array([0.2, 0.2, 0.2, 0.2, 0.2])

var_result = portfolio_var(returns, weights, confidence=0.95)
print(f"95% VaR: {var_result.var:.4f}")
print(f"Expected Shortfall: {var_result.expected_shortfall:.4f}")

Backtesting

from qufin.backtesting import BacktestEngine

# Walk-forward backtest
engine = BacktestEngine(returns, train_window=126, test_window=21)

def equal_weight(mu, cov):
    return np.ones(len(mu)) / len(mu)

result = engine.run(equal_weight, strategy_name="Equal Weight")
print(f"Sharpe Ratio: {result.summary.sharpe_ratio:.2f}")
print(f"Max Drawdown: {result.summary.max_drawdown:.2%}")

Monte Carlo Pricing

from qufin.options.classical.monte_carlo import european_mc

result = european_mc(s=100, k=105, r=0.05, sigma=0.2, T=1.0, n_paths=1_000_000)
print(f"MC Price: ${result.price:.4f}")
print(f"Std Error: {result.std_error:.6f}")

Stress Testing

from qufin.risk.stress import stress_test_suite

results = stress_test_suite(
    portfolio_value=10_000_000,
    weights=[0.6, 0.2, 0.1, 0.1],  # equity, rates, vol, spreads
)
for scenario, res in results.items():
    print(f"{scenario}: {res['pct_loss']:.2%} loss")