Get up and running with MeridianAlgo in minutes. Every snippet here matches the live API.
pip install meridianalgo
# Verify installation
python -c "import meridianalgo; print(meridianalgo.__version__)"Requires Python 3.10 or newer. For machine learning, optimization, or volatility extras, install the matching group. See installation.md for the full list.
pip install "meridianalgo[ml]"The fastest way in is the set of convenience metrics that take a return series and hand back a number.
import meridianalgo as ma
sharpe = ma.calculate_sharpe_ratio(returns)
sortino = ma.calculate_sortino_ratio(returns)
calmar = ma.calculate_calmar_ratio(returns)
max_dd = ma.calculate_max_drawdown(returns)
cvar_95 = ma.calculate_expected_shortfall(returns)
# One call summary of around 28 metrics plus a formatted text report
stats = ma.summary_stats(returns)
print(ma.tearsheet(returns))More than forty indicators ship as plain functions on numpy and pandas. They need no extras and run in the base install.
import meridianalgo as ma
rsi = ma.RSI(prices, period=14)
macd = ma.MACD(prices)
upper, mid, lower = ma.BollingerBands(prices, period=20)
atr = ma.ATR(high, low, close, period=14)Each optimizer takes expected returns as a pandas Series and a covariance matrix as a pandas DataFrame. Annualize both before you pass them in.
from meridianalgo import MeanVariance, HierarchicalRiskParity, RiskParity, BlackLitterman
expected_returns = returns.mean() * 252
covariance = returns.cov() * 252
max_sharpe = MeanVariance().optimize(expected_returns, covariance, objective="max_sharpe")
min_vol = MeanVariance().optimize(expected_returns, covariance, objective="min_volatility")
hrp = HierarchicalRiskParity().optimize(expected_returns, covariance, returns_data=returns)
rp = RiskParity().optimize(expected_returns, covariance)
bl = BlackLitterman().optimize(expected_returns, covariance)
print(max_sharpe.weights.sort_values(ascending=False))
print(f"Max sharpe ratio {max_sharpe.sharpe_ratio:.4f}")Each call returns an OptimizationResult with weights, expected_return, volatility, sharpe_ratio, and a success flag.
from meridianalgo import RiskAnalyzer
risk = RiskAnalyzer(portfolio_returns)
var_95 = risk.value_at_risk(confidence=0.95, method="historical")
var_99 = risk.value_at_risk(confidence=0.99, method="cornish_fisher")
cvar_95 = risk.conditional_var(confidence=0.95)
print(f"Historical VaR 95 percent {var_95:.2%}")
print(f"Cornish Fisher VaR 99 percent {var_99:.2%}")
print(f"CVaR 95 percent {cvar_95:.2%}")from meridianalgo import KellyCriterion
kc = KellyCriterion(fraction=0.5) # half kelly
f = kc.single_asset(win_prob=0.55, win_loss_ratio=1.0)
weights = kc.optimize(returns)
g = kc.growth_rate(expected_return=0.12, volatility=0.18)
print(f"Kelly fraction {f:.2%}")from meridianalgo import PerformanceAnalyzer
analyzer = PerformanceAnalyzer(portfolio_returns, benchmark=spy_returns, risk_free_rate=0.05)
metrics = analyzer.calculate_all_metrics()The machine learning models need the ml extra. With it installed you get LSTM and GRU predictors, walk forward cross validation, and feature engineering.
from meridianalgo.ml import FeatureEngineer, WalkForwardValidator
from sklearn.ensemble import RandomForestClassifier
features = FeatureEngineer().create_features(
prices, features=["returns", "rsi", "macd", "volume_ratio", "volatility", "momentum"],
)
labels = (returns.shift(-1) > 0).astype(int)
results = WalkForwardValidator().validate(
features, labels,
model=RandomForestClassifier(n_estimators=200, random_state=42),
train_window=252, test_window=21,
)
print(f"Average accuracy {results['accuracy'].mean():.2%}")- API reference for the complete module and function reference
- Technical indicators for the full indicator catalog
- Portfolio management for optimization in depth
- Performance benchmarks for speed and accuracy metrics
- Issues at GitHub Issues
- Discussions at GitHub Discussions