Quick Start¶
The call forms in every block below are executed by matching tests in
tests/docs/test_examples.py (with equivalent inputs). Each block defines its
own inputs; later blocks do not inherit earlier variables.
AnalysisContext (Recommended)¶
import pandas as pd
import numpy as np
import fincore
dates = pd.bdate_range('2020-01-01', periods=252)
returns = pd.Series(np.random.default_rng(0).normal(0.001, 0.02, 252), index=dates)
benchmark = pd.Series(np.random.default_rng(1).normal(0.0005, 0.015, 252), index=dates)
ctx = fincore.analyze(returns, factor_returns=benchmark)
print(f"Sharpe Ratio: {ctx.sharpe_ratio:.4f}")
print(f"Max Drawdown: {ctx.max_drawdown:.4f}")
print(f"Annual Return: {ctx.annual_return:.4f}")
# Export
ctx.to_json(path="report.json")
ctx.to_html(path="report.html")
Flat API (Function Style)¶
The flat API is bound to enhanced fincore.metrics semantics.
import pandas as pd
import fincore
returns = pd.Series([0.01, -0.005, 0.002, 0.004])
sr = fincore.sharpe_ratio(returns)
md = fincore.max_drawdown(returns)
ar = fincore.annual_return(returns)
print(sr, md, ar)
Strict Compatibility Module¶
For empyrical 0.6.0-shaped calls, import the strict surface explicitly.
import pandas as pd
from fincore import empyrical
returns = pd.Series([0.01, -0.005, 0.002, 0.004])
print(empyrical.sharpe_ratio(returns))
print(empyrical.max_drawdown(returns))
Classic API (Empyrical Class)¶
import pandas as pd
from fincore import Empyrical
returns = pd.Series([0.01, -0.005, 0.002, 0.004])
benchmark = pd.Series([0.003, 0.002, -0.001, 0.005])
sharpe = Empyrical.sharpe_ratio(returns, risk_free=0.02/252)
alpha, beta = Empyrical.alpha_beta(returns, benchmark)
print(sharpe, alpha, beta)
Instance API (State-Bound)¶
import pandas as pd
from fincore import Empyrical
returns = pd.Series([0.01, -0.005, 0.002, 0.004])
emp = Empyrical(returns=returns)
print(emp.sharpe_ratio())
print(emp.max_drawdown())
RollingEngine¶
import numpy as np
import pandas as pd
from fincore.core.engine import RollingEngine
rng = np.random.default_rng(7)
index = pd.date_range("2024-01-02", periods=60, freq="B")
returns = pd.Series(rng.normal(0.001, 0.02, 60), index=index)
benchmark = pd.Series(rng.normal(0.0005, 0.015, 60), index=index)
engine = RollingEngine(returns, factor_returns=benchmark, window=30)
results = engine.compute(['sharpe', 'volatility', 'max_drawdown', 'beta'])
print(results.keys())