Files

43 lines
1.1 KiB
Python
Raw Permalink Normal View History

from __future__ import annotations
from itertools import product
import pandas as pd
from .engine import EngineConfig, run_factor_engine, summary_metrics
def optimize_grid(
df: pd.DataFrame,
factor_expression: str,
freqs: list[str],
long_qs: list[float],
short_qs: list[float],
long_short_options: list[bool],
) -> pd.DataFrame:
rows = []
for freq, lq, sq, ls in product(freqs, long_qs, short_qs, long_short_options):
cfg = EngineConfig(
factor_expression=factor_expression,
rebalance_frequency=freq,
long_quantile=lq,
short_quantile=sq,
long_short=ls,
)
curve, _ = run_factor_engine(df, cfg)
m = summary_metrics(curve)
rows.append(
{
"rebalance_frequency": freq,
"long_quantile": lq,
"short_quantile": sq,
"long_short": ls,
**m,
}
)
out = pd.DataFrame(rows)
if out.empty:
return out
return out.sort_values(["sharpe", "cagr"], ascending=[False, False]).reset_index(drop=True)